version 1.17, 2004/12/22 02:13:19 |
version 1.18, 2014/04/29 15:42:07 |
|
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, |
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, |
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
*/ |
#include <stdlib.h> |
|
#include <string.h> |
|
|
|
|
#include <sys/types.h> |
|
|
#include "rijndael.h" |
#include "rijndael.h" |
|
|
#define FULL_UNROLL |
#undef FULL_UNROLL |
|
|
/* |
/* |
Te0[x] = S [x].[02, 01, 01, 03]; |
Te0[x] = S [x].[02, 01, 01, 03]; |
|
|
0xb0cb7bb0U, 0x54fca854U, 0xbbd66dbbU, 0x163a2c16U, |
0xb0cb7bb0U, 0x54fca854U, 0xbbd66dbbU, 0x163a2c16U, |
}; |
}; |
static const u32 Te3[256] = { |
static const u32 Te3[256] = { |
|
|
0x6363a5c6U, 0x7c7c84f8U, 0x777799eeU, 0x7b7b8df6U, |
0x6363a5c6U, 0x7c7c84f8U, 0x777799eeU, 0x7b7b8df6U, |
0xf2f20dffU, 0x6b6bbdd6U, 0x6f6fb1deU, 0xc5c55491U, |
0xf2f20dffU, 0x6b6bbdd6U, 0x6f6fb1deU, 0xc5c55491U, |
0x30305060U, 0x01010302U, 0x6767a9ceU, 0x2b2b7d56U, |
0x30305060U, 0x01010302U, 0x6767a9ceU, 0x2b2b7d56U, |
|
|
0xf4cd65daU, 0xbed50605U, 0x621fd134U, 0xfe8ac4a6U, |
0xf4cd65daU, 0xbed50605U, 0x621fd134U, 0xfe8ac4a6U, |
0x539d342eU, 0x55a0a2f3U, 0xe132058aU, 0xeb75a4f6U, |
0x539d342eU, 0x55a0a2f3U, 0xe132058aU, 0xeb75a4f6U, |
0xec390b83U, 0xefaa4060U, 0x9f065e71U, 0x1051bd6eU, |
0xec390b83U, 0xefaa4060U, 0x9f065e71U, 0x1051bd6eU, |
|
|
0x8af93e21U, 0x063d96ddU, 0x05aedd3eU, 0xbd464de6U, |
0x8af93e21U, 0x063d96ddU, 0x05aedd3eU, 0xbd464de6U, |
0x8db59154U, 0x5d0571c4U, 0xd46f0406U, 0x15ff6050U, |
0x8db59154U, 0x5d0571c4U, 0xd46f0406U, 0x15ff6050U, |
0xfb241998U, 0xe997d6bdU, 0x43cc8940U, 0x9e7767d9U, |
0xfb241998U, 0xe997d6bdU, 0x43cc8940U, 0x9e7767d9U, |
|
|
* |
* |
* @return the number of rounds for the given cipher key size. |
* @return the number of rounds for the given cipher key size. |
*/ |
*/ |
static int rijndaelKeySetupEnc(u32 rk[/*4*(Nr + 1)*/], const u8 cipherKey[], int keyBits) { |
int |
int i = 0; |
rijndaelKeySetupEnc(u32 rk[/*4*(Nr + 1)*/], const u8 cipherKey[], int keyBits) |
|
{ |
|
int i = 0; |
u32 temp; |
u32 temp; |
|
|
rk[0] = GETU32(cipherKey ); |
rk[0] = GETU32(cipherKey ); |
|
|
rk[ 9] = rk[ 1] ^ rk[ 8]; |
rk[ 9] = rk[ 1] ^ rk[ 8]; |
rk[10] = rk[ 2] ^ rk[ 9]; |
rk[10] = rk[ 2] ^ rk[ 9]; |
rk[11] = rk[ 3] ^ rk[10]; |
rk[11] = rk[ 3] ^ rk[10]; |
if (++i == 7) { |
if (++i == 7) { |
return 14; |
return 14; |
} |
} |
temp = rk[11]; |
temp = rk[11]; |
rk[12] = rk[ 4] ^ |
rk[12] = rk[ 4] ^ |
(Te4[(temp >> 24) ] & 0xff000000) ^ |
(Te4[(temp >> 24) ] & 0xff000000) ^ |
|
|
(Te4[(temp ) & 0xff] & 0x000000ff); |
(Te4[(temp ) & 0xff] & 0x000000ff); |
rk[13] = rk[ 5] ^ rk[12]; |
rk[13] = rk[ 5] ^ rk[12]; |
rk[14] = rk[ 6] ^ rk[13]; |
rk[14] = rk[ 6] ^ rk[13]; |
rk[15] = rk[ 7] ^ rk[14]; |
rk[15] = rk[ 7] ^ rk[14]; |
rk += 8; |
rk += 8; |
} |
} |
} |
} |
return 0; |
return 0; |
} |
} |
|
|
|
#if 0 |
/** |
/** |
* Expand the cipher key into the decryption key schedule. |
* Expand the cipher key into the decryption key schedule. |
* |
* |
* @return the number of rounds for the given cipher key size. |
* @return the number of rounds for the given cipher key size. |
*/ |
*/ |
static int |
int |
rijndaelKeySetupDec(u32 rk[/*4*(Nr + 1)*/], const u8 cipherKey[], int keyBits, |
rijndaelKeySetupDec(u32 rk[/*4*(Nr + 1)*/], const u8 cipherKey[], int keyBits) |
int have_encrypt) { |
{ |
int Nr, i, j; |
int Nr, i, j; |
u32 temp; |
u32 temp; |
|
|
if (have_encrypt) { |
/* expand the cipher key: */ |
Nr = have_encrypt; |
Nr = rijndaelKeySetupEnc(rk, cipherKey, keyBits); |
} else { |
|
/* expand the cipher key: */ |
|
Nr = rijndaelKeySetupEnc(rk, cipherKey, keyBits); |
|
} |
|
/* invert the order of the round keys: */ |
/* invert the order of the round keys: */ |
for (i = 0, j = 4*Nr; i < j; i += 4, j -= 4) { |
for (i = 0, j = 4*Nr; i < j; i += 4, j -= 4) { |
temp = rk[i ]; rk[i ] = rk[j ]; rk[j ] = temp; |
temp = rk[i ]; rk[i ] = rk[j ]; rk[j ] = temp; |
|
|
} |
} |
return Nr; |
return Nr; |
} |
} |
|
#endif |
|
|
static void rijndaelEncrypt(const u32 rk[/*4*(Nr + 1)*/], int Nr, const u8 pt[16], u8 ct[16]) { |
void |
|
rijndaelEncrypt(const u32 rk[/*4*(Nr + 1)*/], int Nr, const u8 pt[16], |
|
u8 ct[16]) |
|
{ |
u32 s0, s1, s2, s3, t0, t1, t2, t3; |
u32 s0, s1, s2, s3, t0, t1, t2, t3; |
#ifndef FULL_UNROLL |
#ifndef FULL_UNROLL |
int r; |
int r; |
|
|
s3 = GETU32(pt + 12) ^ rk[3]; |
s3 = GETU32(pt + 12) ^ rk[3]; |
#ifdef FULL_UNROLL |
#ifdef FULL_UNROLL |
/* round 1: */ |
/* round 1: */ |
t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[ 4]; |
t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[ 4]; |
t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[ 5]; |
t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[ 5]; |
t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[ 6]; |
t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[ 6]; |
t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[ 7]; |
t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[ 7]; |
/* round 2: */ |
/* round 2: */ |
s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[ 8]; |
s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[ 8]; |
s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[ 9]; |
s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[ 9]; |
s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[10]; |
s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[10]; |
s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[11]; |
s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[11]; |
/* round 3: */ |
/* round 3: */ |
t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[12]; |
t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[12]; |
t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[13]; |
t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[13]; |
t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[14]; |
t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[14]; |
t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[15]; |
t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[15]; |
/* round 4: */ |
/* round 4: */ |
s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[16]; |
s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[16]; |
s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[17]; |
s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[17]; |
s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[18]; |
s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[18]; |
s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[19]; |
s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[19]; |
/* round 5: */ |
/* round 5: */ |
t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[20]; |
t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[20]; |
t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[21]; |
t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[21]; |
t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[22]; |
t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[22]; |
t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[23]; |
t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[23]; |
/* round 6: */ |
/* round 6: */ |
s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[24]; |
s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[24]; |
s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[25]; |
s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[25]; |
s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[26]; |
s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[26]; |
s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[27]; |
s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[27]; |
/* round 7: */ |
/* round 7: */ |
t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[28]; |
t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[28]; |
t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[29]; |
t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[29]; |
t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[30]; |
t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[30]; |
t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[31]; |
t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[31]; |
/* round 8: */ |
/* round 8: */ |
s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[32]; |
s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[32]; |
s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[33]; |
s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[33]; |
s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[34]; |
s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[34]; |
s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[35]; |
s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[35]; |
/* round 9: */ |
/* round 9: */ |
t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[36]; |
t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[36]; |
t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[37]; |
t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[37]; |
t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[38]; |
t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[38]; |
t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[39]; |
t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[39]; |
if (Nr > 10) { |
if (Nr > 10) { |
/* round 10: */ |
/* round 10: */ |
s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[40]; |
s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[40]; |
|
|
PUTU32(ct + 12, s3); |
PUTU32(ct + 12, s3); |
} |
} |
|
|
static void rijndaelDecrypt(const u32 rk[/*4*(Nr + 1)*/], int Nr, const u8 ct[16], u8 pt[16]) { |
#if 0 |
|
static void |
|
rijndaelDecrypt(const u32 rk[/*4*(Nr + 1)*/], int Nr, const u8 ct[16], |
|
u8 pt[16]) |
|
{ |
u32 s0, s1, s2, s3, t0, t1, t2, t3; |
u32 s0, s1, s2, s3, t0, t1, t2, t3; |
#ifndef FULL_UNROLL |
#ifndef FULL_UNROLL |
int r; |
int r; |
|
|
* apply last round and |
* apply last round and |
* map cipher state to byte array block: |
* map cipher state to byte array block: |
*/ |
*/ |
s0 = |
s0 = |
(Td4[(t0 >> 24) ] & 0xff000000) ^ |
(Td4[(t0 >> 24) ] & 0xff000000) ^ |
(Td4[(t3 >> 16) & 0xff] & 0x00ff0000) ^ |
(Td4[(t3 >> 16) & 0xff] & 0x00ff0000) ^ |
(Td4[(t2 >> 8) & 0xff] & 0x0000ff00) ^ |
(Td4[(t2 >> 8) & 0xff] & 0x0000ff00) ^ |
(Td4[(t1 ) & 0xff] & 0x000000ff) ^ |
(Td4[(t1 ) & 0xff] & 0x000000ff) ^ |
rk[0]; |
rk[0]; |
PUTU32(pt , s0); |
PUTU32(pt , s0); |
s1 = |
s1 = |
(Td4[(t1 >> 24) ] & 0xff000000) ^ |
(Td4[(t1 >> 24) ] & 0xff000000) ^ |
(Td4[(t0 >> 16) & 0xff] & 0x00ff0000) ^ |
(Td4[(t0 >> 16) & 0xff] & 0x00ff0000) ^ |
(Td4[(t3 >> 8) & 0xff] & 0x0000ff00) ^ |
(Td4[(t3 >> 8) & 0xff] & 0x0000ff00) ^ |
(Td4[(t2 ) & 0xff] & 0x000000ff) ^ |
(Td4[(t2 ) & 0xff] & 0x000000ff) ^ |
rk[1]; |
rk[1]; |
PUTU32(pt + 4, s1); |
PUTU32(pt + 4, s1); |
s2 = |
s2 = |
(Td4[(t2 >> 24) ] & 0xff000000) ^ |
(Td4[(t2 >> 24) ] & 0xff000000) ^ |
(Td4[(t1 >> 16) & 0xff] & 0x00ff0000) ^ |
(Td4[(t1 >> 16) & 0xff] & 0x00ff0000) ^ |
(Td4[(t0 >> 8) & 0xff] & 0x0000ff00) ^ |
(Td4[(t0 >> 8) & 0xff] & 0x0000ff00) ^ |
(Td4[(t3 ) & 0xff] & 0x000000ff) ^ |
(Td4[(t3 ) & 0xff] & 0x000000ff) ^ |
rk[2]; |
rk[2]; |
PUTU32(pt + 8, s2); |
PUTU32(pt + 8, s2); |
s3 = |
s3 = |
(Td4[(t3 >> 24) ] & 0xff000000) ^ |
(Td4[(t3 >> 24) ] & 0xff000000) ^ |
(Td4[(t2 >> 16) & 0xff] & 0x00ff0000) ^ |
(Td4[(t2 >> 16) & 0xff] & 0x00ff0000) ^ |
(Td4[(t1 >> 8) & 0xff] & 0x0000ff00) ^ |
(Td4[(t1 >> 8) & 0xff] & 0x0000ff00) ^ |
(Td4[(t0 ) & 0xff] & 0x000000ff) ^ |
(Td4[(t0 ) & 0xff] & 0x000000ff) ^ |
rk[3]; |
rk[3]; |
PUTU32(pt + 12, s3); |
PUTU32(pt + 12, s3); |
} |
} |
|
#endif |
void |
|
rijndael_set_key(rijndael_ctx *ctx, u_char *key, int bits, int do_encrypt) |
|
{ |
|
ctx->Nr = rijndaelKeySetupEnc(ctx->ek, key, bits); |
|
if (do_encrypt) { |
|
ctx->decrypt = 0; |
|
memset(ctx->dk, 0, sizeof(ctx->dk)); |
|
} else { |
|
ctx->decrypt = 1; |
|
memcpy(ctx->dk, ctx->ek, sizeof(ctx->dk)); |
|
rijndaelKeySetupDec(ctx->dk, key, bits, ctx->Nr); |
|
} |
|
} |
|
|
|
void |
|
rijndael_decrypt(rijndael_ctx *ctx, u_char *src, u_char *dst) |
|
{ |
|
rijndaelDecrypt(ctx->dk, ctx->Nr, src, dst); |
|
} |
|
|
|
void |
|
rijndael_encrypt(rijndael_ctx *ctx, u_char *src, u_char *dst) |
|
{ |
|
rijndaelEncrypt(ctx->ek, ctx->Nr, src, dst); |
|
} |
|