From fc78430a35be252a1cd5a29b5b66290a68cd9ca3 Mon Sep 17 00:00:00 2001 From: yincheng.zhong <634916154@qq.com> Date: 星期二, 27 八月 2024 17:21:18 +0800 Subject: [PATCH] Merge branch '安邦测距手环' of http://47.108.70.204:60062/r/ChinaUWBProject into 安邦测距手环 --- keil/include/drivers/aes.c | 628 ++++++++++++++++++++++++++++---------------------------- 1 files changed, 314 insertions(+), 314 deletions(-) diff --git a/keil/include/drivers/aes.c b/keil/include/drivers/aes.c index 258f378..306eed2 100644 --- a/keil/include/drivers/aes.c +++ b/keil/include/drivers/aes.c @@ -3,10 +3,10 @@ const unsigned char kTable[32] = { - 0x21, 0x05, 0x04, 0x19, 0x89, 0x12, 0x13, 0x00, - 0x18, 0xDE, 0xCA, 0x01, 0x30, 0x52, 0x01, 0x23, - 0x13, 0x05, 0x33, 0x19, 0x93, 0x07, 0x08, 0x00, - 0x20, 0x5B, 0xA3, 0x4A, 0x21, 0xBA, 0xF9, 0xFC + 0x21, 0x05, 0x04, 0x19, 0x89, 0x12, 0x13, 0x00, + 0x18, 0xDE, 0xCA, 0x01, 0x30, 0x52, 0x01, 0x23, + 0x13, 0x05, 0x33, 0x19, 0x93, 0x07, 0x08, 0x00, + 0x20, 0x5B, 0xA3, 0x4A, 0x21, 0xBA, 0xF9, 0xFC }; /* 21 05 04 19 89 12 13 00 18 DE CA 01 30 52 01 23 13 05 33 19 93 07 08 00 20 5B A3 4A 21 BA F9 FC @@ -24,207 +24,207 @@ void CalcPowLog(unsigned char *powTbl, unsigned char *logTbl) { - unsigned char i = 0; - unsigned char t = 1; + unsigned char i = 0; + unsigned char t = 1; - do { - // Use 0x03 as root for exponentiation and logarithms. - powTbl[i] = t; - logTbl[t] = i; - i++; + do { + // Use 0x03 as root for exponentiation and logarithms. + powTbl[i] = t; + logTbl[t] = i; + i++; - // Muliply t by 3 in GF(2^8). - t ^= (t << 1) ^ (t & 0x80 ? BPOLY : 0); - }while( t != 1 ); // Cyclic properties ensure that i < 255. + // Muliply t by 3 in GF(2^8). + t ^= (t << 1) ^ (t & 0x80 ? BPOLY : 0); + } while( t != 1 ); // Cyclic properties ensure that i < 255. - powTbl[255] = powTbl[0]; // 255 = '-0', 254 = -1, etc. + powTbl[255] = powTbl[0]; // 255 = '-0', 254 = -1, etc. } void CalcSBox( unsigned char * sBox ) { - unsigned char i, rot; - unsigned char temp; - unsigned char result; + unsigned char i, rot; + unsigned char temp; + unsigned char result; - // Fill all entries of sBox[]. - i = 0; - do { - //Inverse in GF(2^8). - if( i > 0 ) - { - temp = powTbl[ 255 - logTbl[i] ]; - } - else - { - temp = 0; - } + // Fill all entries of sBox[]. + i = 0; + do { + //Inverse in GF(2^8). + if( i > 0 ) + { + temp = powTbl[ 255 - logTbl[i] ]; + } + else + { + temp = 0; + } - // Affine transformation in GF(2). - result = temp ^ 0x63; // Start with adding a vector in GF(2). - for( rot = 4; rot > 0; rot-- ) - { - // Rotate left. - temp = (temp<<1) | (temp>>7); + // Affine transformation in GF(2). + result = temp ^ 0x63; // Start with adding a vector in GF(2). + for( rot = 4; rot > 0; rot-- ) + { + // Rotate left. + temp = (temp<<1) | (temp>>7); - // Add rotated byte in GF(2). - result ^= temp; - } + // Add rotated byte in GF(2). + result ^= temp; + } - // Put result in table. - sBox[i] = result; - } while( ++i != 0 ); + // Put result in table. + sBox[i] = result; + } while( ++i != 0 ); } void CalcSBoxInv( unsigned char * sBox, unsigned char * sBoxInv ) { - unsigned char i = 0; - unsigned char j = 0; + unsigned char i = 0; + unsigned char j = 0; - // Iterate through all elements in sBoxInv using i. - do { - // Search through sBox using j. + // Iterate through all elements in sBoxInv using i. do { - // Check if current j is the inverse of current i. - if( sBox[ j ] == i ) - { - // If so, set sBoxInc and indicate search finished. - sBoxInv[ i ] = j; - j = 255; - } - } while( ++j != 0 ); - } while( ++i != 0 ); + // Search through sBox using j. + do { + // Check if current j is the inverse of current i. + if( sBox[ j ] == i ) + { + // If so, set sBoxInc and indicate search finished. + sBoxInv[ i ] = j; + j = 255; + } + } while( ++j != 0 ); + } while( ++i != 0 ); } void CycleLeft( unsigned char * row ) { - // Cycle 4 bytes in an array left once. - unsigned char temp = row[0]; + // Cycle 4 bytes in an array left once. + unsigned char temp = row[0]; - row[0] = row[1]; - row[1] = row[2]; - row[2] = row[3]; - row[3] = temp; + row[0] = row[1]; + row[1] = row[2]; + row[2] = row[3]; + row[3] = temp; } void CalcCols(unsigned char *col) { - unsigned char i; + unsigned char i; - for(i = 4; i > 0; i--) - { - *col = (*col << 1) ^ (*col & 0x80 ? BPOLY : 0); - col++; - } + for(i = 4; i > 0; i--) + { + *col = (*col << 1) ^ (*col & 0x80 ? BPOLY : 0); + col++; + } } void InvMixColumn( unsigned char * column ) { - unsigned char r[4]; + unsigned char r[4]; - r[0] = column[1] ^ column[2] ^ column[3]; - r[1] = column[0] ^ column[2] ^ column[3]; - r[2] = column[0] ^ column[1] ^ column[3]; - r[3] = column[0] ^ column[1] ^ column[2]; + r[0] = column[1] ^ column[2] ^ column[3]; + r[1] = column[0] ^ column[2] ^ column[3]; + r[2] = column[0] ^ column[1] ^ column[3]; + r[3] = column[0] ^ column[1] ^ column[2]; - /*column[0] = (column[0] << 1) ^ (column[0] & 0x80 ? BPOLY : 0); - column[1] = (column[1] << 1) ^ (column[1] & 0x80 ? BPOLY : 0); - column[2] = (column[2] << 1) ^ (column[2] & 0x80 ? BPOLY : 0); - column[3] = (column[3] << 1) ^ (column[3] & 0x80 ? BPOLY : 0);*/ - CalcCols(column); + /*column[0] = (column[0] << 1) ^ (column[0] & 0x80 ? BPOLY : 0); + column[1] = (column[1] << 1) ^ (column[1] & 0x80 ? BPOLY : 0); + column[2] = (column[2] << 1) ^ (column[2] & 0x80 ? BPOLY : 0); + column[3] = (column[3] << 1) ^ (column[3] & 0x80 ? BPOLY : 0);*/ + CalcCols(column); - r[0] ^= column[0] ^ column[1]; - r[1] ^= column[1] ^ column[2]; - r[2] ^= column[2] ^ column[3]; - r[3] ^= column[0] ^ column[3]; + r[0] ^= column[0] ^ column[1]; + r[1] ^= column[1] ^ column[2]; + r[2] ^= column[2] ^ column[3]; + r[3] ^= column[0] ^ column[3]; - /*column[0] = (column[0] << 1) ^ (column[0] & 0x80 ? BPOLY : 0); - column[1] = (column[1] << 1) ^ (column[1] & 0x80 ? BPOLY : 0); - column[2] = (column[2] << 1) ^ (column[2] & 0x80 ? BPOLY : 0); - column[3] = (column[3] << 1) ^ (column[3] & 0x80 ? BPOLY : 0);*/ - CalcCols(column); + /*column[0] = (column[0] << 1) ^ (column[0] & 0x80 ? BPOLY : 0); + column[1] = (column[1] << 1) ^ (column[1] & 0x80 ? BPOLY : 0); + column[2] = (column[2] << 1) ^ (column[2] & 0x80 ? BPOLY : 0); + column[3] = (column[3] << 1) ^ (column[3] & 0x80 ? BPOLY : 0);*/ + CalcCols(column); - r[0] ^= column[0] ^ column[2]; - r[1] ^= column[1] ^ column[3]; - r[2] ^= column[0] ^ column[2]; - r[3] ^= column[1] ^ column[3]; + r[0] ^= column[0] ^ column[2]; + r[1] ^= column[1] ^ column[3]; + r[2] ^= column[0] ^ column[2]; + r[3] ^= column[1] ^ column[3]; - /*column[0] = (column[0] << 1) ^ (column[0] & 0x80 ? BPOLY : 0); - column[1] = (column[1] << 1) ^ (column[1] & 0x80 ? BPOLY : 0); - column[2] = (column[2] << 1) ^ (column[2] & 0x80 ? BPOLY : 0); - column[3] = (column[3] << 1) ^ (column[3] & 0x80 ? BPOLY : 0);*/ - CalcCols(column); + /*column[0] = (column[0] << 1) ^ (column[0] & 0x80 ? BPOLY : 0); + column[1] = (column[1] << 1) ^ (column[1] & 0x80 ? BPOLY : 0); + column[2] = (column[2] << 1) ^ (column[2] & 0x80 ? BPOLY : 0); + column[3] = (column[3] << 1) ^ (column[3] & 0x80 ? BPOLY : 0);*/ + CalcCols(column); - column[0] ^= column[1] ^ column[2] ^ column[3]; - r[0] ^= column[0]; - r[1] ^= column[0]; - r[2] ^= column[0]; - r[3] ^= column[0]; - - column[0] = r[0]; - column[1] = r[1]; - column[2] = r[2]; - column[3] = r[3]; + column[0] ^= column[1] ^ column[2] ^ column[3]; + r[0] ^= column[0]; + r[1] ^= column[0]; + r[2] ^= column[0]; + r[3] ^= column[0]; - //CopyBytes(column, r, 4); + column[0] = r[0]; + column[1] = r[1]; + column[2] = r[2]; + column[3] = r[3]; + + //CopyBytes(column, r, 4); } void SubBytes( unsigned char * bytes, unsigned char count ) { - do { - *bytes = sBox[ *bytes ]; // Substitute every byte in state. - bytes++; - } while( --count ); + do { + *bytes = sBox[ *bytes ]; // Substitute every byte in state. + bytes++; + } while( --count ); } void InvSubBytesAndXOR( unsigned char * bytes, unsigned char * key, unsigned char count ) { - do { - // *bytes = sBoxInv[ *bytes ] ^ *key; // Inverse substitute every byte in state and add key. - *bytes = block2[ *bytes ] ^ *key; // Use block2 directly. Increases speed. - bytes++; - key++; - } while( --count ); + do { + // *bytes = sBoxInv[ *bytes ] ^ *key; // Inverse substitute every byte in state and add key. + *bytes = block2[ *bytes ] ^ *key; // Use block2 directly. Increases speed. + bytes++; + key++; + } while( --count ); } void InvShiftRows( unsigned char * state ) { - unsigned char temp; + unsigned char temp; - // Note: State is arranged column by column. + // Note: State is arranged column by column. - // Cycle second row right one time. - temp = state[ 1 + 3*4 ]; - state[ 1 + 3*4 ] = state[ 1 + 2*4 ]; - state[ 1 + 2*4 ] = state[ 1 + 1*4 ]; - state[ 1 + 1*4 ] = state[ 1 + 0*4 ]; - state[ 1 + 0*4 ] = temp; + // Cycle second row right one time. + temp = state[ 1 + 3*4 ]; + state[ 1 + 3*4 ] = state[ 1 + 2*4 ]; + state[ 1 + 2*4 ] = state[ 1 + 1*4 ]; + state[ 1 + 1*4 ] = state[ 1 + 0*4 ]; + state[ 1 + 0*4 ] = temp; - // Cycle third row right two times. - temp = state[ 2 + 0*4 ]; - state[ 2 + 0*4 ] = state[ 2 + 2*4 ]; - state[ 2 + 2*4 ] = temp; - temp = state[ 2 + 1*4 ]; - state[ 2 + 1*4 ] = state[ 2 + 3*4 ]; - state[ 2 + 3*4 ] = temp; + // Cycle third row right two times. + temp = state[ 2 + 0*4 ]; + state[ 2 + 0*4 ] = state[ 2 + 2*4 ]; + state[ 2 + 2*4 ] = temp; + temp = state[ 2 + 1*4 ]; + state[ 2 + 1*4 ] = state[ 2 + 3*4 ]; + state[ 2 + 3*4 ] = temp; - // Cycle fourth row right three times, ie. left once. - temp = state[ 3 + 0*4 ]; - state[ 3 + 0*4 ] = state[ 3 + 1*4 ]; - state[ 3 + 1*4 ] = state[ 3 + 2*4 ]; - state[ 3 + 2*4 ] = state[ 3 + 3*4 ]; - state[ 3 + 3*4 ] = temp; + // Cycle fourth row right three times, ie. left once. + temp = state[ 3 + 0*4 ]; + state[ 3 + 0*4 ] = state[ 3 + 1*4 ]; + state[ 3 + 1*4 ] = state[ 3 + 2*4 ]; + state[ 3 + 2*4 ] = state[ 3 + 3*4 ]; + state[ 3 + 3*4 ] = temp; } @@ -241,199 +241,199 @@ void XORBytes( unsigned char * bytes1, unsigned char * bytes2, unsigned char count ) { - do { - *bytes1 ^= *bytes2; // Add in GF(2), ie. XOR. - bytes1++; - bytes2++; - } while( --count ); + do { + *bytes1 ^= *bytes2; // Add in GF(2), ie. XOR. + bytes1++; + bytes2++; + } while( --count ); } void CopyBytes( unsigned char * to, unsigned char * from, unsigned char count ) { - do { - *to = *from; - to++; - from++; - } while( --count ); + do { + *to = *from; + to++; + from++; + } while( --count ); } void KeyExpansion( unsigned char * expandedKey ) { - unsigned char temp[4]; - unsigned char i; - unsigned char Rcon[4] = { 0x01, 0x00, 0x00, 0x00 }; // Round constant. + unsigned char temp[4]; + unsigned char i; + unsigned char Rcon[4] = { 0x01, 0x00, 0x00, 0x00 }; // Round constant. - const unsigned char * key = kTable; + const unsigned char * key = kTable; - // Copy key to start of expanded key. - i = KEYLENGTH; - do { - *expandedKey = *key; - expandedKey++; - key++; - } while( --i ); + // Copy key to start of expanded key. + i = KEYLENGTH; + do { + *expandedKey = *key; + expandedKey++; + key++; + } while( --i ); - // Prepare last 4 bytes of key in temp. - /*expandedKey -= 4; - temp[0] = *(expandedKey++); - temp[1] = *(expandedKey++); - temp[2] = *(expandedKey++); - temp[3] = *(expandedKey++);*/ - CopyBytes(temp, expandedKey-4, 4); + // Prepare last 4 bytes of key in temp. + /*expandedKey -= 4; + temp[0] = *(expandedKey++); + temp[1] = *(expandedKey++); + temp[2] = *(expandedKey++); + temp[3] = *(expandedKey++);*/ + CopyBytes(temp, expandedKey-4, 4); - // Expand key. - i = KEYLENGTH; - //j = BLOCKSIZE*(ROUNDS+1) - KEYLENGTH; - while( i < BLOCKSIZE*(ROUNDS+1) ) - { - // Are we at the start of a multiple of the key size? - if( (i % KEYLENGTH) == 0 ) + // Expand key. + i = KEYLENGTH; + //j = BLOCKSIZE*(ROUNDS+1) - KEYLENGTH; + while( i < BLOCKSIZE*(ROUNDS+1) ) { - CycleLeft( temp ); // Cycle left once. - SubBytes( temp, 4 ); // Substitute each byte. - XORBytes( temp, Rcon, 4 ); // Add constant in GF(2). - *Rcon = (*Rcon << 1) ^ (*Rcon & 0x80 ? BPOLY : 0); + // Are we at the start of a multiple of the key size? + if( (i % KEYLENGTH) == 0 ) + { + CycleLeft( temp ); // Cycle left once. + SubBytes( temp, 4 ); // Substitute each byte. + XORBytes( temp, Rcon, 4 ); // Add constant in GF(2). + *Rcon = (*Rcon << 1) ^ (*Rcon & 0x80 ? BPOLY : 0); + } + + // Keysize larger than 24 bytes, ie. larger that 192 bits? +#if KEYLENGTH > 24 + // Are we right past a block size? + else if( (i % KEYLENGTH) == BLOCKSIZE ) { + SubBytes( temp, 4 ); // Substitute each byte. + } +#endif + + // Add bytes in GF(2) one KEYLENGTH away. + XORBytes( temp, expandedKey - KEYLENGTH, 4 ); + + // Copy result to current 4 bytes. + *(expandedKey++) = temp[ 0 ]; + *(expandedKey++) = temp[ 1 ]; + *(expandedKey++) = temp[ 2 ]; + *(expandedKey++) = temp[ 3 ]; + //CopyBytes(expandedKey, temp, 4); + //expandedKey += 4; + + i += 4; // Next 4 bytes. } - - // Keysize larger than 24 bytes, ie. larger that 192 bits? - #if KEYLENGTH > 24 - // Are we right past a block size? - else if( (i % KEYLENGTH) == BLOCKSIZE ) { - SubBytes( temp, 4 ); // Substitute each byte. - } - #endif - - // Add bytes in GF(2) one KEYLENGTH away. - XORBytes( temp, expandedKey - KEYLENGTH, 4 ); - - // Copy result to current 4 bytes. - *(expandedKey++) = temp[ 0 ]; - *(expandedKey++) = temp[ 1 ]; - *(expandedKey++) = temp[ 2 ]; - *(expandedKey++) = temp[ 3 ]; - //CopyBytes(expandedKey, temp, 4); - //expandedKey += 4; - - i += 4; // Next 4 bytes. - } } void InvCipher( unsigned char * block, unsigned char * expandedKey ) { - unsigned char i, j; - unsigned char round = ROUNDS-1; - expandedKey += BLOCKSIZE * ROUNDS; + unsigned char i, j; + unsigned char round = ROUNDS-1; + expandedKey += BLOCKSIZE * ROUNDS; - XORBytes( block, expandedKey, 16 ); - expandedKey -= BLOCKSIZE; + XORBytes( block, expandedKey, 16 ); + expandedKey -= BLOCKSIZE; - do { + do { + InvShiftRows( block ); + InvSubBytesAndXOR( block, expandedKey, 16 ); + expandedKey -= BLOCKSIZE; + //InvMixColumns( block ); + for(i = 4, j = 0; i > 0; i--, j+=4) + InvMixColumn( block + j ); + } while( --round ); + InvShiftRows( block ); InvSubBytesAndXOR( block, expandedKey, 16 ); - expandedKey -= BLOCKSIZE; - //InvMixColumns( block ); - for(i = 4, j = 0; i > 0; i--, j+=4) - InvMixColumn( block + j ); - } while( --round ); - - InvShiftRows( block ); - InvSubBytesAndXOR( block, expandedKey, 16 ); } void aesDecInit(void) { - powTbl = block1; - logTbl = block2; - CalcPowLog( powTbl, logTbl ); + powTbl = block1; + logTbl = block2; + CalcPowLog( powTbl, logTbl ); - sBox = tempbuf; - CalcSBox( sBox ); + sBox = tempbuf; + CalcSBox( sBox ); - expandedKey = block1; - KeyExpansion( expandedKey ); + expandedKey = block1; + KeyExpansion( expandedKey ); - sBoxInv = block2; // Must be block2. - CalcSBoxInv( sBox, sBoxInv ); + sBoxInv = block2; // Must be block2. + CalcSBoxInv( sBox, sBoxInv ); } void aesDecrypt( unsigned char * buffer, unsigned char * chainBlock ) { - aesDecInit(); - CopyBytes( tempbuf, buffer, BLOCKSIZE ); - InvCipher( buffer, expandedKey ); - XORBytes( buffer, chainBlock, BLOCKSIZE ); - CopyBytes( chainBlock, tempbuf, BLOCKSIZE ); + aesDecInit(); + CopyBytes( tempbuf, buffer, BLOCKSIZE ); + InvCipher( buffer, expandedKey ); + XORBytes( buffer, chainBlock, BLOCKSIZE ); + CopyBytes( chainBlock, tempbuf, BLOCKSIZE ); } unsigned char Multiply( unsigned char num, unsigned char factor ) { - unsigned char mask = 1; - unsigned char result = 0; + unsigned char mask = 1; + unsigned char result = 0; - while( mask != 0 ) - { - // Check bit of factor given by mask. - if( mask & factor ) + while( mask != 0 ) { - // Add current multiple of num in GF(2). - result ^= num; + // Check bit of factor given by mask. + if( mask & factor ) + { + // Add current multiple of num in GF(2). + result ^= num; + } + + // Shift mask to indicate next bit. + mask <<= 1; + + // Double num. + num = (num << 1) ^ (num & 0x80 ? BPOLY : 0); } - // Shift mask to indicate next bit. - mask <<= 1; - - // Double num. - num = (num << 1) ^ (num & 0x80 ? BPOLY : 0); - } - - return result; + return result; } unsigned char DotProduct( const unsigned char * vector1, unsigned char * vector2 ) { - unsigned char result = 0 ,i; + unsigned char result = 0 ,i; - //result ^= Multiply( *vector1++, *vector2++ ); - //result ^= Multiply( *vector1++, *vector2++ ); - //result ^= Multiply( *vector1++, *vector2++ ); - //result ^= Multiply( *vector1 , *vector2 ); + //result ^= Multiply( *vector1++, *vector2++ ); + //result ^= Multiply( *vector1++, *vector2++ ); + //result ^= Multiply( *vector1++, *vector2++ ); + //result ^= Multiply( *vector1 , *vector2 ); - for(i = 4; i > 0; i--) - result ^= Multiply( *vector1++, *vector2++ ); + for(i = 4; i > 0; i--) + result ^= Multiply( *vector1++, *vector2++ ); - return result; + return result; } void MixColumn( unsigned char * column ) { - const unsigned char row[8] = { - 0x02, 0x03, 0x01, 0x01, - 0x02, 0x03, 0x01, 0x01 - }; // Prepare first row of matrix twice, to eliminate need for cycling. + const unsigned char row[8] = { + 0x02, 0x03, 0x01, 0x01, + 0x02, 0x03, 0x01, 0x01 + }; // Prepare first row of matrix twice, to eliminate need for cycling. - unsigned char result[4]; + unsigned char result[4]; - // Take dot products of each matrix row and the column vector. - result[0] = DotProduct( row+0, column ); - result[1] = DotProduct( row+3, column ); - result[2] = DotProduct( row+2, column ); - result[3] = DotProduct( row+1, column ); + // Take dot products of each matrix row and the column vector. + result[0] = DotProduct( row+0, column ); + result[1] = DotProduct( row+3, column ); + result[2] = DotProduct( row+2, column ); + result[3] = DotProduct( row+1, column ); - // Copy temporary result to original column. - //column[0] = result[0]; - //column[1] = result[1]; - //column[2] = result[2]; - //column[3] = result[3]; - CopyBytes(column, result, 4); + // Copy temporary result to original column. + //column[0] = result[0]; + //column[1] = result[1]; + //column[2] = result[2]; + //column[3] = result[3]; + CopyBytes(column, result, 4); } /* void MixColumns( unsigned char * state ) @@ -446,75 +446,75 @@ */ void ShiftRows( unsigned char * state ) { - unsigned char temp; + unsigned char temp; - // Note: State is arranged column by column. + // Note: State is arranged column by column. - // Cycle second row left one time. - temp = state[ 1 + 0*4 ]; - state[ 1 + 0*4 ] = state[ 1 + 1*4 ]; - state[ 1 + 1*4 ] = state[ 1 + 2*4 ]; - state[ 1 + 2*4 ] = state[ 1 + 3*4 ]; - state[ 1 + 3*4 ] = temp; + // Cycle second row left one time. + temp = state[ 1 + 0*4 ]; + state[ 1 + 0*4 ] = state[ 1 + 1*4 ]; + state[ 1 + 1*4 ] = state[ 1 + 2*4 ]; + state[ 1 + 2*4 ] = state[ 1 + 3*4 ]; + state[ 1 + 3*4 ] = temp; - // Cycle third row left two times. - temp = state[ 2 + 0*4 ]; - state[ 2 + 0*4 ] = state[ 2 + 2*4 ]; - state[ 2 + 2*4 ] = temp; - temp = state[ 2 + 1*4 ]; - state[ 2 + 1*4 ] = state[ 2 + 3*4 ]; - state[ 2 + 3*4 ] = temp; + // Cycle third row left two times. + temp = state[ 2 + 0*4 ]; + state[ 2 + 0*4 ] = state[ 2 + 2*4 ]; + state[ 2 + 2*4 ] = temp; + temp = state[ 2 + 1*4 ]; + state[ 2 + 1*4 ] = state[ 2 + 3*4 ]; + state[ 2 + 3*4 ] = temp; - // Cycle fourth row left three times, ie. right once. - temp = state[ 3 + 3*4 ]; - state[ 3 + 3*4 ] = state[ 3 + 2*4 ]; - state[ 3 + 2*4 ] = state[ 3 + 1*4 ]; - state[ 3 + 1*4 ] = state[ 3 + 0*4 ]; - state[ 3 + 0*4 ] = temp; + // Cycle fourth row left three times, ie. right once. + temp = state[ 3 + 3*4 ]; + state[ 3 + 3*4 ] = state[ 3 + 2*4 ]; + state[ 3 + 2*4 ] = state[ 3 + 1*4 ]; + state[ 3 + 1*4 ] = state[ 3 + 0*4 ]; + state[ 3 + 0*4 ] = temp; } void Cipher( unsigned char * block, unsigned char * expandedKey ) { - unsigned char i, j; - unsigned char round = ROUNDS-1; + unsigned char i, j; + unsigned char round = ROUNDS-1; - XORBytes( block, expandedKey, 16 ); - expandedKey += BLOCKSIZE; - - do { - SubBytes( block, 16 ); - ShiftRows( block ); - //MixColumns( block ); - for(i = 4, j = 0; i > 0; i--, j+=4) - MixColumn( block + j ); XORBytes( block, expandedKey, 16 ); expandedKey += BLOCKSIZE; - } while( --round ); - SubBytes( block, 16 ); - ShiftRows( block ); - XORBytes( block, expandedKey, 16 ); + do { + SubBytes( block, 16 ); + ShiftRows( block ); + //MixColumns( block ); + for(i = 4, j = 0; i > 0; i--, j+=4) + MixColumn( block + j ); + XORBytes( block, expandedKey, 16 ); + expandedKey += BLOCKSIZE; + } while( --round ); + + SubBytes( block, 16 ); + ShiftRows( block ); + XORBytes( block, expandedKey, 16 ); } void aesEncInit(void) { - powTbl = block1; - logTbl = block2; - CalcPowLog( powTbl, logTbl ); + powTbl = block1; + logTbl = block2; + CalcPowLog( powTbl, logTbl ); - sBox = block2; - CalcSBox( sBox ); + sBox = block2; + CalcSBox( sBox ); - expandedKey = block1; - KeyExpansion( expandedKey ); + expandedKey = block1; + KeyExpansion( expandedKey ); } void aesEncrypt( unsigned char * buffer, unsigned char * chainBlock ) { - aesEncInit(); - XORBytes( buffer, chainBlock, BLOCKSIZE ); - Cipher( buffer, expandedKey ); - CopyBytes( chainBlock, buffer, BLOCKSIZE ); + aesEncInit(); + XORBytes( buffer, chainBlock, BLOCKSIZE ); + Cipher( buffer, expandedKey ); + CopyBytes( chainBlock, buffer, BLOCKSIZE ); } -- Gitblit v1.9.3