📄 aes++.c
字号:
#elif defined(FOUR_LR_TABLES)
il_tab[0][i] = w;
il_tab[1][i] = upr(w,1);
il_tab[2][i] = upr(w,2);
il_tab[3][i] = upr(w,3);
#endif
w = bytes2word(FFmul0e(b), FFmul09(b), FFmul0d(b), FFmul0b(b));
#if defined(ONE_TABLE)
it_tab[i] = w;
#elif defined(FOUR_TABLES)
it_tab[0][i] = w;
it_tab[1][i] = upr(w,1);
it_tab[2][i] = upr(w,2);
it_tab[3][i] = upr(w,3);
#endif
#if defined(ONE_IM_TABLE)
im_tab[b] = w;
#elif defined(FOUR_IM_TABLES)
im_tab[0][b] = w;
im_tab[1][b] = upr(w,1);
im_tab[2][b] = upr(w,2);
im_tab[3][b] = upr(w,3);
#endif
}
}
#endif
#define no_table(x,box,vf,rf,c) bytes2word( \
box[bval(vf(x,0,c),rf(0,c))], \
box[bval(vf(x,1,c),rf(1,c))], \
box[bval(vf(x,2,c),rf(2,c))], \
box[bval(vf(x,3,c),rf(3,c))])
#define one_table(x,op,tab,vf,rf,c) \
( tab[bval(vf(x,0,c),rf(0,c))] \
^ op(tab[bval(vf(x,1,c),rf(1,c))],1) \
^ op(tab[bval(vf(x,2,c),rf(2,c))],2) \
^ op(tab[bval(vf(x,3,c),rf(3,c))],3))
#define four_tables(x,tab,vf,rf,c) \
( tab[0][bval(vf(x,0,c),rf(0,c))] \
^ tab[1][bval(vf(x,1,c),rf(1,c))] \
^ tab[2][bval(vf(x,2,c),rf(2,c))] \
^ tab[3][bval(vf(x,3,c),rf(3,c))])
#define vf1(x,r,c) (x)
#define rf1(r,c) (r)
#define rf2(r,c) ((r-c)&3)
#if defined(FOUR_LR_TABLES)
#define ls_box(x,c) four_tables(x,fl_tab,vf1,rf2,c)
#elif defined(ONE_LR_TABLE)
#define ls_box(x,c) one_table(x,upr,fl_tab,vf1,rf2,c)
#else
#define ls_box(x,c) no_table(x,s_box,vf1,rf2,c)
#endif
#if defined(FOUR_IM_TABLES)
#define inv_mcol(x) four_tables(x,im_tab,vf1,rf1,0)
#elif defined(ONE_IM_TABLE)
#define inv_mcol(x) one_table(x,upr,im_tab,vf1,rf1,0)
#else
#define inv_mcol(x) \
(f9 = (x),f2 = FFmulX(f9), f4 = FFmulX(f2), f8 = FFmulX(f4), f9 ^= f8, \
f2 ^= f4 ^ f8 ^ upr(f2 ^ f9,3) ^ upr(f4 ^ f9,2) ^ upr(f9,1))
#endif
/*
Subroutine to set the block size (if variable) in bytes, legal
values being 16, 20, 24, 28 and 32.
*/
#if defined(BLOCK_SIZE)
#define nc (Ncol)
#else
#define nc (cx->Ncol)
cf_dec c_name(set_blk)(const word n_bytes, c_name(aes) *cx)
{
#if !defined(FIXED_TABLES)
if(!(cx->mode & 0x08)) { gen_tabs(); cx->mode = 0x08; }
#endif
if((n_bytes & 3) || n_bytes < 16 || n_bytes > 32)
{
return (n_bytes ? cx->mode &= ~0x07, aes_bad : (aes_ret)(nc << 2));
}
cx->mode = cx->mode & ~0x07 | 0x0c;
nc = n_bytes >> 2;
return aes_good;
}
#endif
/*
Initialise the key schedule from the user supplied key. The key
length is now specified in bytes - 16, 20, 24, 28 or 32 as
appropriate. This corresponds to bit lengths of 128, 160, 192,
224 and 256 bits, and to Nk values of 4, 5, 6, 7 & 8 respectively.
*/
#define mx(t,f) (*t++ = inv_mcol(*f),f++)
#define cp(t,f) *t++ = *f++
#if BLOCK_SIZE == 16
#define cpy(d,s) cp(d,s); cp(d,s); cp(d,s); cp(d,s)
#define mix(d,s) mx(d,s); mx(d,s); mx(d,s); mx(d,s)
#elif BLOCK_SIZE == 20
#define cpy(d,s) cp(d,s); cp(d,s); cp(d,s); cp(d,s); \
cp(d,s)
#define mix(d,s) mx(d,s); mx(d,s); mx(d,s); mx(d,s); \
mx(d,s)
#elif BLOCK_SIZE == 24
#define cpy(d,s) cp(d,s); cp(d,s); cp(d,s); cp(d,s); \
cp(d,s); cp(d,s)
#define mix(d,s) mx(d,s); mx(d,s); mx(d,s); mx(d,s); \
mx(d,s); mx(d,s)
#elif BLOCK_SIZE == 28
#define cpy(d,s) cp(d,s); cp(d,s); cp(d,s); cp(d,s); \
cp(d,s); cp(d,s); cp(d,s)
#define mix(d,s) mx(d,s); mx(d,s); mx(d,s); mx(d,s); \
mx(d,s); mx(d,s); mx(d,s)
#elif BLOCK_SIZE == 32
#define cpy(d,s) cp(d,s); cp(d,s); cp(d,s); cp(d,s); \
cp(d,s); cp(d,s); cp(d,s); cp(d,s)
#define mix(d,s) mx(d,s); mx(d,s); mx(d,s); mx(d,s); \
mx(d,s); mx(d,s); mx(d,s); mx(d,s)
#else
#define cpy(d,s) \
switch(nc) \
{ case 8: cp(d,s); \
case 7: cp(d,s); \
case 6: cp(d,s); \
case 5: cp(d,s); \
case 4: cp(d,s); cp(d,s); \
cp(d,s); cp(d,s); \
}
#define mix(d,s) \
switch(nc) \
{ case 8: mx(d,s); \
case 7: mx(d,s); \
case 6: mx(d,s); \
case 5: mx(d,s); \
case 4: mx(d,s); mx(d,s); \
mx(d,s); mx(d,s); \
}
#endif
cf_dec c_name(set_key)(const byte in_key[], const word n_bytes, const enum aes_key f, c_name(aes) *cx)
{ word *kf, *kt, rci;
#if !defined(FIXED_TABLES)
if(!(cx->mode & 0x08)) { gen_tabs(); cx->mode = 0x08; }
#endif
#if !defined(BLOCK_SIZE)
if(!(cx->mode & 0x04)) c_name(set_blk)(16, cx);
#endif
if((n_bytes & 3) || n_bytes < 16 || n_bytes > 32 || !(f & 1) && !(f & 2))
{
return (n_bytes ? cx->mode &= ~0x03, aes_bad : (aes_ret)(cx->Nkey << 2));
}
cx->mode = cx->mode & ~0x03 | (byte)f & 0x03;
cx->Nkey = n_bytes >> 2;
cx->Nrnd = Nr(cx->Nkey, nc);
cx->e_key[0] = word_in(in_key );
cx->e_key[1] = word_in(in_key + 4);
cx->e_key[2] = word_in(in_key + 8);
cx->e_key[3] = word_in(in_key + 12);
kf = cx->e_key;
kt = kf + nc * (cx->Nrnd + 1) - cx->Nkey;
rci = 0;
switch(cx->Nkey)
{
case 4: do
{ kf[4] = kf[0] ^ ls_box(kf[3],3) ^ rcon_tab[rci++];
kf[5] = kf[1] ^ kf[4];
kf[6] = kf[2] ^ kf[5];
kf[7] = kf[3] ^ kf[6];
kf += 4;
}
while(kf < kt);
break;
case 5: cx->e_key[4] = word_in(in_key + 16);
do
{ kf[5] = kf[0] ^ ls_box(kf[4],3) ^ rcon_tab[rci++];
kf[6] = kf[1] ^ kf[5];
kf[7] = kf[2] ^ kf[6];
kf[8] = kf[3] ^ kf[7];
kf[9] = kf[4] ^ kf[8];
kf += 5;
}
while(kf < kt);
break;
case 6: cx->e_key[4] = word_in(in_key + 16);
cx->e_key[5] = word_in(in_key + 20);
do
{ kf[ 6] = kf[0] ^ ls_box(kf[5],3) ^ rcon_tab[rci++];
kf[ 7] = kf[1] ^ kf[ 6];
kf[ 8] = kf[2] ^ kf[ 7];
kf[ 9] = kf[3] ^ kf[ 8];
kf[10] = kf[4] ^ kf[ 9];
kf[11] = kf[5] ^ kf[10];
kf += 6;
}
while(kf < kt);
break;
case 7: cx->e_key[4] = word_in(in_key + 16);
cx->e_key[5] = word_in(in_key + 20);
cx->e_key[6] = word_in(in_key + 24);
do
{ kf[ 7] = kf[0] ^ ls_box(kf[6],3) ^ rcon_tab[rci++];
kf[ 8] = kf[1] ^ kf[ 7];
kf[ 9] = kf[2] ^ kf[ 8];
kf[10] = kf[3] ^ kf[ 9];
kf[11] = kf[4] ^ ls_box(kf[10],0);
kf[12] = kf[5] ^ kf[11];
kf[13] = kf[6] ^ kf[12];
kf += 7;
}
while (kf < kt);
break;
case 8: cx->e_key[4] = word_in(in_key + 16);
cx->e_key[5] = word_in(in_key + 20);
cx->e_key[6] = word_in(in_key + 24);
cx->e_key[7] = word_in(in_key + 28);
do
{ kf[ 8] = kf[0] ^ ls_box(kf[7],3) ^ rcon_tab[rci++];
kf[ 9] = kf[1] ^ kf[ 8];
kf[10] = kf[2] ^ kf[ 9];
kf[11] = kf[3] ^ kf[10];
kf[12] = kf[4] ^ ls_box(kf[11],0);
kf[13] = kf[5] ^ kf[12];
kf[14] = kf[6] ^ kf[13];
kf[15] = kf[7] ^ kf[14];
kf += 8;
}
while (kf < kt);
break;
}
if((cx->mode & 3) != enc)
{ word i;
kt = cx->d_key + nc * cx->Nrnd;
kf = cx->e_key;
cpy(kt, kf); kt -= 2 * nc;
for(i = 1; i < cx->Nrnd; ++i)
{
#if defined(ONE_TABLE) || defined(FOUR_TABLES)
#if !defined(ONE_IM_TABLE) && !defined(FOUR_IM_TABLES)
word f2, f4, f8, f9;
#endif
mix(kt, kf);
#else
cpy(kt, kf);
#endif
kt -= 2 * nc;
}
cpy(kt, kf);
}
return aes_good;
}
/*
y = output word, x = input word, r = row, c = column for r = 0,
1, 2 and 3 = column accessed for row r
*/
#if defined(ARRAYS)
#define s(x,c) x[c]
#else
#define s(x,c) x##c
#endif
/*
I am grateful to Frank Yellin for the following constructions
which, given the column (c) of the output state variable, give
the input state variables which are needed for each row (r) of
the state.
For the fixed block size options, compilers should reduce these
two expressions to fixed variable references. But for variable
block size code conditional clauses will sometimes be returned.
*/
#define unused 77 /* Sunset Strip */
#define fwd_var(x,r,c) \
( r==0 ? \
( c==0 ? s(x,0) \
: c==1 ? s(x,1) \
: c==2 ? s(x,2) \
: c==3 ? s(x,3) \
: c==4 ? s(x,4) \
: c==5 ? s(x,5) \
: c==6 ? s(x,6) \
: s(x,7)) \
: r==1 ? \
( c==0 ? s(x,1) \
: c==1 ? s(x,2) \
: c==2 ? s(x,3) \
: c==3 ? nc==4 ? s(x,0) : s(x,4) \
: c==4 ? nc==5 ? s(x,0) : s(x,5) \
: c==5 ? nc==6 ? s(x,0) : s(x,6) \
: c==6 ? nc==7 ? s(x,0) : s(x,7) \
: s(x,0)) \
: r==2 ? \
( c==0 ? nc==8 ? s(x,3) : s(x,2) \
: c==1 ? nc==8 ? s(x,4) : s(x,3) \
: c==2 ? nc==8 ? s(x,5) : nc==4 ? s(x,0) : s(x,4) \
: c==3 ? nc==8 ? s(x,6) : nc==5 ? s(x,0) : nc==4 ? s(x,1) : s(x,5) \
: c==4 ? nc==8 ? s(x,7) : nc==7 ? s(x,6) : nc==6 ? s(x,0) : s(x,1) \
: c==5 ? nc==6 ? s(x,1) : s(x,0) \
: c==6 ? s(x,1) \
: s(x,2)) \
: \
( c==0 ? nc>6 ? s(x,4) : s(x,3) \
: c==1 ? nc>6 ? s(x,5) : nc==4 ? s(x,0) : s(x,4) \
: c==2 ? nc>6 ? s(x,6) : nc==6 ? s(x,5) : nc==5 ? s(x,0) : s(x,1) \
: c==3 ? nc==8 ? s(x,7) : nc==5 ? s(x,1) : nc==4 ? s(x,2) : s(x,0) \
: c==4 ? nc==8 ? s(x,0) : nc==5 ? s(x,2) : s(x,1) \
: c==5 ? nc==8 ? s(x,1) : s(x,2) \
: c==6 ? nc==8 ? s(x,2) : s(x,3) \
: s(x,3)))
#define inv_var(x,r,c) \
( r==0 ? \
( c==0 ? s(x,0) \
: c==1 ? s(x,1) \
: c==2 ? s(x,2) \
: c==3 ? s(x,3) \
: c==4 ? s(x,4) \
: c==5 ? s(x,5) \
: c==6 ? s(x,6) \
: s(x,7)) \
: r==1 ? \
( c==0 ? nc==8 ? s(x,7) : nc==7 ? s(x,6) : nc==6 ? s(x,5) : nc==5 ? s(x,4) : s(x,3) \
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -