📄 aestab.c
字号:
const uint32_t im_tab[256] = { mm_data(v0) };#endif#ifdef IM4_SETconst uint32_t im_tab[4][256] = { { mm_data(v0) }, { mm_data(v1) }, { mm_data(v2) }, { mm_data(v3) } };#endif#else /* dynamic table generation */uint8_t tab_init = 0;#define constuint32_t rcon_tab[RC_LENGTH];#ifdef SBX_SETuint8_t s_box[256];#endif#ifdef ISB_SETuint8_t inv_s_box[256];#endif#ifdef FT1_SETuint32_t ft_tab[256];#endif#ifdef FT4_SETuint32_t ft_tab[4][256];#endif#ifdef FL1_SETuint32_t fl_tab[256];#endif#ifdef FL4_SETuint32_t fl_tab[4][256];#endif#ifdef IT1_SETuint32_t it_tab[256];#endif#ifdef IT4_SETuint32_t it_tab[4][256];#endif#ifdef IL1_SETuint32_t il_tab[256];#endif#ifdef IL4_SETuint32_t il_tab[4][256];#endif#ifdef LS1_SETuint32_t ls_tab[256];#endif#ifdef LS4_SETuint32_t ls_tab[4][256];#endif#ifdef IM1_SETuint32_t im_tab[256];#endif#ifdef IM4_SETuint32_t im_tab[4][256];#endif#if !defined(FF_TABLES)/* Generate the tables for the dynamic table option It will generally be sensible to use tables to compute finite field multiplies and inverses but where memory is scarse this code might sometimes be better. But it only has effect during initialisation so its pretty unimportant in overall terms.*//* return 2 ^ (n - 1) where n is the bit number of the highest bit set in x with x in the range 1 < x < 0x00000200. This form is used so that locals within fi can be bytes rather than words*/static uint8_t hibit(const uint32_t x){ uint8_t r = (uint8_t)((x >> 1) | (x >> 2)); r |= (r >> 2); r |= (r >> 4); return (r + 1) >> 1;}/* return the inverse of the finite field element x */static uint8_t fi(const uint8_t x){ uint8_t p1 = x, p2 = BPOLY, n1 = hibit(x), n2 = 0x80, v1 = 1, v2 = 0; if(x < 2) return x; for(;;) { if(!n1) return v1; while(n2 >= n1) { n2 /= n1; p2 ^= p1 * n2; v2 ^= v1 * n2; n2 = hibit(p2); } if(!n2) return v2; while(n1 >= n2) { n1 /= n2; p1 ^= p2 * n1; v1 ^= v2 * n1; n1 = hibit(p1); } }}#else/* define the finite field multiplies required for Rijndael */#define f2(x) ((x) ? pow[log[x] + 0x19] : 0)#define f3(x) ((x) ? pow[log[x] + 0x01] : 0)#define f9(x) ((x) ? pow[log[x] + 0xc7] : 0)#define fb(x) ((x) ? pow[log[x] + 0x68] : 0)#define fd(x) ((x) ? pow[log[x] + 0xee] : 0)#define fe(x) ((x) ? pow[log[x] + 0xdf] : 0)#define fi(x) ((x) ? pow[255 - log[x]]: 0)#endif/* The forward and inverse affine transformations used in the S-box */#define fwd_affine(x) \ (w = (uint32_t)x, w ^= (w<<1)^(w<<2)^(w<<3)^(w<<4), 0x63^(uint8_t)(w^(w>>8)))#define inv_affine(x) \ (w = (uint32_t)x, w = (w<<1)^(w<<3)^(w<<6), 0x05^(uint8_t)(w^(w>>8)))void gen_tabs(void){ uint32_t i, w;#if defined(FF_TABLES) uint8_t pow[512], log[256]; /* log and power tables for GF(2^8) finite field with WPOLY as modular polynomial - the simplest primitive root is 0x03, used here to generate the tables */ i = 0; w = 1; do { pow[i] = (uint8_t)w; pow[i + 255] = (uint8_t)w; log[w] = (uint8_t)i++; w ^= (w << 1) ^ (w & 0x80 ? WPOLY : 0); } while (w != 1);#endif for(i = 0, w = 1; i < RC_LENGTH; ++i) { rcon_tab[i] = bytes2word(w, 0, 0, 0); w = f2(w); } for(i = 0; i < 256; ++i) { uint8_t b; b = fwd_affine(fi((uint8_t)i)); w = bytes2word(f2(b), b, b, f3(b));#ifdef SBX_SET s_box[i] = b;#endif#ifdef FT1_SET /* tables for a normal encryption round */ ft_tab[i] = w;#endif#ifdef FT4_SET ft_tab[0][i] = w; ft_tab[1][i] = upr(w,1); ft_tab[2][i] = upr(w,2); ft_tab[3][i] = upr(w,3);#endif w = bytes2word(b, 0, 0, 0);#ifdef FL1_SET /* tables for last encryption round (may also */ fl_tab[i] = w; /* be used in the key schedule) */#endif#ifdef FL4_SET fl_tab[0][i] = w; fl_tab[1][i] = upr(w,1); fl_tab[2][i] = upr(w,2); fl_tab[3][i] = upr(w,3);#endif#ifdef LS1_SET /* table for key schedule if fl_tab above is */ ls_tab[i] = w; /* not of the required form */#endif#ifdef LS4_SET ls_tab[0][i] = w; ls_tab[1][i] = upr(w,1); ls_tab[2][i] = upr(w,2); ls_tab[3][i] = upr(w,3);#endif b = fi(inv_affine((uint8_t)i)); w = bytes2word(fe(b), f9(b), fd(b), fb(b));#ifdef IM1_SET /* tables for the inverse mix column operation */ im_tab[b] = w;#endif#ifdef IM4_SET 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#ifdef ISB_SET inv_s_box[i] = b;#endif#ifdef IT1_SET /* tables for a normal decryption round */ it_tab[i] = w;#endif#ifdef IT4_SET 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 w = bytes2word(b, 0, 0, 0);#ifdef IL1_SET /* tables for last decryption round */ il_tab[i] = w;#endif#ifdef IL4_SET 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 } tab_init = 1;}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -