From 0f0fa69c8d5fec8c7507e27ba8f618018db1ee78 Mon Sep 17 00:00:00 2001 From: tomsmeding Date: Thu, 13 Oct 2016 18:51:38 +0200 Subject: Comment gf28.{cpp,h} --- aes.cpp | 2 +- gf28.cpp | 143 +++++++++++++++++---------------------------------------------- gf28.h | 37 ++++------------- 3 files changed, 47 insertions(+), 135 deletions(-) diff --git a/aes.cpp b/aes.cpp index f36a69f..6d9163d 100644 --- a/aes.cpp +++ b/aes.cpp @@ -31,7 +31,7 @@ namespace AES{ } for(int i=0;i<256;i++){ - uint8_t inv=(uint8_t)GF28(i).inverse(); + uint8_t inv=GF28::inverse(i); uint8_t res=0; for(int j=0;j<8;j++){ uint8_t bit=((inv>>j)&1)^ diff --git a/gf28.cpp b/gf28.cpp index 9513818..fbf7daa 100644 --- a/gf28.cpp +++ b/gf28.cpp @@ -3,117 +3,52 @@ using namespace std; -int GF28::reduce(int v,int m){ - assert(m); - while(true){ - int sh=__builtin_clz(m)-__builtin_clz(v); - if(sh<0)break; - v^=m<>=1; - } - return res; -} - -GF28::GF28() - :value(0){} - -GF28::GF28(int v) - :value(reduce(v,modulus)){} - -GF28::operator uint8_t() const { - return value; -} - -GF28& GF28::operator+=(GF28 o){ - value^=o.value; - return *this; -} - -GF28& GF28::operator-=(GF28 o){ - value^=o.value; - return *this; -} +namespace GF28 { -GF28& GF28::operator<<=(int n){ - assert(n>=0); - value<<=n; - if(value&0x100)value^=modulus; - return *this; -} - -GF28 GF28::operator+(GF28 o) const { - return GF28(value^o.value); -} + const int modulus=0x11b; -GF28 GF28::operator-(GF28 o) const { - return GF28(value^o.value); -} - -GF28 GF28::operator*(GF28 o) const { - if(value==0||o.value==0)return GF28(0); - GF28 res; - GF28 addend(*this); - while(o.value){ - if(o.value&1)res+=addend; - addend<<=1; - o.value>>=1; + uint8_t reduce(int v,int m){ + assert(v&&m); + while(true){ + int sh=__builtin_clz(m)-__builtin_clz(v); + if(sh<0)break; + v^=m<>=1; } + return res; } - assert(r==1); - return GF28(y); -} -ostream& operator<<(ostream &os,GF28 p){ - if(os.flags()&ios_base::hex){ - return os<>=1,i--){ - if(p.value&m){ - if(!first)os<<'+'; - first=false; - if(i==0)os<<'1'; - else os<<"x^"< //The GF(2^8) field used in AES +//Elements are represented by unsigned 8-bit ints, as is their nature. +//Since addition in GF(2^8) is more simply written as just '^', only +//multiplication and taking inverses is necessary to implement separately. -class GF28{ - int value; +namespace GF28 { - static int reduce(int v,int m); + uint8_t multiply(uint8_t x,uint8_t y); + uint8_t inverse(uint8_t value); -public: - static const int modulus=0x11b; - - static uint8_t multiply(uint8_t x,uint8_t y); //for when the class is overkill - - GF28(); - explicit GF28(int v); - - explicit operator uint8_t() const; - - GF28& operator+=(GF28 o); - GF28& operator-=(GF28 o); - GF28& operator<<=(int n); //multiplication by x^n - - GF28 operator+(GF28 o) const; - GF28 operator-(GF28 o) const; - GF28 operator*(GF28 o) const; - GF28 operator<<(int n) const; //multiplication by x^n - - bool operator==(GF28 o) const; - - GF28 inverse() const; - - friend std::ostream& operator<<(std::ostream&,GF28); -}; - -std::ostream& operator<<(std::ostream &os,GF28 p); +} -- cgit v1.2.3-70-g09d2