#include "postgres.h"
#include <sys/param.h>
#include "px.h"
#include "rijndael.h"
#include "rijndael.tbl"
Go to the source code of this file.
Defines | |
#define | PRE_CALC_TABLES |
#define | LARGE_TABLES |
#define | rotr(x, n) (((x) >> ((int)(n))) | ((x) << (32 - (int)(n)))) |
#define | rotl(x, n) (((x) << ((int)(n))) | ((x) >> (32 - (int)(n)))) |
#define | bswap(x) ((rotl((x), 8) & 0x00ff00ff) | (rotr((x), 8) & 0xff00ff00)) |
#define | byte(x, n) ((u1byte)((x) >> (8 * (n)))) |
#define | io_swap(x) (x) |
#define | tab_gen 1 |
#define | ff_mult(a, b) ((a) && (b) ? pow_tab[(log_tab[a] + log_tab[b]) % 255] : 0) |
#define | f_rn(bo, bi, n, k) |
#define | i_rn(bo, bi, n, k) |
#define | ls_box(x) |
#define | f_rl(bo, bi, n, k) |
#define | i_rl(bo, bi, n, k) |
#define | star_x(x) (((x) & 0x7f7f7f7f) << 1) ^ ((((x) & 0x80808080) >> 7) * 0x1b) |
#define | imix_col(y, x) |
#define | loop4(i) |
#define | loop6(i) |
#define | loop8(i) |
#define | f_nround(bo, bi, k) |
#define | f_lround(bo, bi, k) |
#define | i_nround(bo, bi, k) |
#define | i_lround(bo, bi, k) |
Functions | |
static void | gen_tabs (void) |
rijndael_ctx * | rijndael_set_key (rijndael_ctx *ctx, const u4byte *in_key, const u4byte key_len, int encrypt) |
void | rijndael_encrypt (rijndael_ctx *ctx, const u4byte *in_blk, u4byte *out_blk) |
void | rijndael_decrypt (rijndael_ctx *ctx, const u4byte *in_blk, u4byte *out_blk) |
void | aes_set_key (rijndael_ctx *ctx, const uint8 *key, unsigned keybits, int enc) |
void | aes_ecb_encrypt (rijndael_ctx *ctx, uint8 *data, unsigned len) |
void | aes_ecb_decrypt (rijndael_ctx *ctx, uint8 *data, unsigned len) |
void | aes_cbc_encrypt (rijndael_ctx *ctx, uint8 *iva, uint8 *data, unsigned len) |
void | aes_cbc_decrypt (rijndael_ctx *ctx, uint8 *iva, uint8 *data, unsigned len) |
#define bswap | ( | x | ) | ((rotl((x), 8) & 0x00ff00ff) | (rotr((x), 8) & 0xff00ff00)) |
Definition at line 64 of file rijndael.c.
#define byte | ( | x, | ||
n | ||||
) | ((u1byte)((x) >> (8 * (n)))) |
Definition at line 68 of file rijndael.c.
Referenced by inetmi(), nocache_index_getattr(), and nocachegetattr().
#define f_lround | ( | bo, | ||
bi, | ||||
k | ||||
) |
do { \ f_rl(bo, bi, 0, k); \ f_rl(bo, bi, 1, k); \ f_rl(bo, bi, 2, k); \ f_rl(bo, bi, 3, k); \ } while (0)
Definition at line 378 of file rijndael.c.
Referenced by rijndael_encrypt().
#define f_nround | ( | bo, | ||
bi, | ||||
k | ||||
) |
do { \ f_rn(bo, bi, 0, k); \ f_rn(bo, bi, 1, k); \ f_rn(bo, bi, 2, k); \ f_rn(bo, bi, 3, k); \ k += 4; \ } while (0)
Definition at line 369 of file rijndael.c.
Referenced by rijndael_encrypt().
#define f_rl | ( | bo, | ||
bi, | ||||
n, | ||||
k | ||||
) |
#define f_rn | ( | bo, | ||
bi, | ||||
n, | ||||
k | ||||
) |
#define ff_mult | ( | a, | ||
b | ||||
) | ((a) && (b) ? pow_tab[(log_tab[a] + log_tab[b]) % 255] : 0) |
Definition at line 102 of file rijndael.c.
Referenced by gen_tabs().
#define i_lround | ( | bo, | ||
bi, | ||||
k | ||||
) |
do { \ i_rl(bo, bi, 0, k); \ i_rl(bo, bi, 1, k); \ i_rl(bo, bi, 2, k); \ i_rl(bo, bi, 3, k); \ } while (0)
Definition at line 442 of file rijndael.c.
Referenced by rijndael_decrypt().
#define i_nround | ( | bo, | ||
bi, | ||||
k | ||||
) |
do { \ i_rn(bo, bi, 0, k); \ i_rn(bo, bi, 1, k); \ i_rn(bo, bi, 2, k); \ i_rn(bo, bi, 3, k); \ k -= 4; \ } while (0)
Definition at line 433 of file rijndael.c.
Referenced by rijndael_decrypt().
#define i_rl | ( | bo, | ||
bi, | ||||
n, | ||||
k | ||||
) |
#define i_rn | ( | bo, | ||
bi, | ||||
n, | ||||
k | ||||
) |
#define imix_col | ( | y, | ||
x | ||||
) |
do { \ u = star_x(x); \ v = star_x(u); \ w = star_x(v); \ t = w ^ (x); \ (y) = u ^ v ^ w; \ (y) ^= rotr(u ^ t, 8) ^ \ rotr(v ^ t, 16) ^ \ rotr(t,24); \ } while (0)
Definition at line 259 of file rijndael.c.
Referenced by rijndael_set_key().
#define io_swap | ( | x | ) | (x) |
Definition at line 73 of file rijndael.c.
Referenced by rijndael_decrypt(), rijndael_encrypt(), and rijndael_set_key().
#define LARGE_TABLES |
Definition at line 51 of file rijndael.c.
#define loop4 | ( | i | ) |
do { t = ls_box(rotr(t, 8)) ^ rco_tab[i]; \ t ^= e_key[4 * i]; e_key[4 * i + 4] = t; \ t ^= e_key[4 * i + 1]; e_key[4 * i + 5] = t; \ t ^= e_key[4 * i + 2]; e_key[4 * i + 6] = t; \ t ^= e_key[4 * i + 3]; e_key[4 * i + 7] = t; \ } while (0)
Definition at line 273 of file rijndael.c.
Referenced by rijndael_set_key().
#define loop6 | ( | i | ) |
do { t = ls_box(rotr(t, 8)) ^ rco_tab[i]; \ t ^= e_key[6 * (i)]; e_key[6 * (i) + 6] = t; \ t ^= e_key[6 * (i) + 1]; e_key[6 * (i) + 7] = t; \ t ^= e_key[6 * (i) + 2]; e_key[6 * (i) + 8] = t; \ t ^= e_key[6 * (i) + 3]; e_key[6 * (i) + 9] = t; \ t ^= e_key[6 * (i) + 4]; e_key[6 * (i) + 10] = t; \ t ^= e_key[6 * (i) + 5]; e_key[6 * (i) + 11] = t; \ } while (0)
Definition at line 281 of file rijndael.c.
Referenced by rijndael_set_key().
#define loop8 | ( | i | ) |
do { t = ls_box(rotr(t, 8)) ^ rco_tab[i]; \ t ^= e_key[8 * (i)]; e_key[8 * (i) + 8] = t; \ t ^= e_key[8 * (i) + 1]; e_key[8 * (i) + 9] = t; \ t ^= e_key[8 * (i) + 2]; e_key[8 * (i) + 10] = t; \ t ^= e_key[8 * (i) + 3]; e_key[8 * (i) + 11] = t; \ t = e_key[8 * (i) + 4] ^ ls_box(t); \ e_key[8 * (i) + 12] = t; \ t ^= e_key[8 * (i) + 5]; e_key[8 * (i) + 13] = t; \ t ^= e_key[8 * (i) + 6]; e_key[8 * (i) + 14] = t; \ t ^= e_key[8 * (i) + 7]; e_key[8 * (i) + 15] = t; \ } while (0)
Definition at line 291 of file rijndael.c.
Referenced by rijndael_set_key().
#define ls_box | ( | x | ) |
#define PRE_CALC_TABLES |
Definition at line 50 of file rijndael.c.
#define rotl | ( | x, | ||
n | ||||
) | (((x) << ((int)(n))) | ((x) >> (32 - (int)(n)))) |
Definition at line 60 of file rijndael.c.
Referenced by gen_tabs().
#define rotr | ( | x, | ||
n | ||||
) | (((x) >> ((int)(n))) | ((x) << (32 - (int)(n)))) |
Definition at line 59 of file rijndael.c.
#define star_x | ( | x | ) | (((x) & 0x7f7f7f7f) << 1) ^ ((((x) & 0x80808080) >> 7) * 0x1b) |
Definition at line 257 of file rijndael.c.
#define tab_gen 1 |
Definition at line 83 of file rijndael.c.
Referenced by gen_tabs(), and rijndael_set_key().
void aes_cbc_decrypt | ( | rijndael_ctx * | ctx, | |
uint8 * | iva, | |||
uint8 * | data, | |||
unsigned | len | |||
) |
Definition at line 567 of file rijndael.c.
References buf, and rijndael_decrypt().
Referenced by AES_cbc_encrypt(), and rj_decrypt().
{ uint32 *d = (uint32 *) data; unsigned bs = 16; uint32 buf[4], iv[4]; memcpy(iv, iva, bs); while (len >= bs) { buf[0] = d[0]; buf[1] = d[1]; buf[2] = d[2]; buf[3] = d[3]; rijndael_decrypt(ctx, buf, d); d[0] ^= iv[0]; d[1] ^= iv[1]; d[2] ^= iv[2]; d[3] ^= iv[3]; iv[0] = buf[0]; iv[1] = buf[1]; iv[2] = buf[2]; iv[3] = buf[3]; d += 4; len -= bs; } }
void aes_cbc_encrypt | ( | rijndael_ctx * | ctx, | |
uint8 * | iva, | |||
uint8 * | data, | |||
unsigned | len | |||
) |
Definition at line 545 of file rijndael.c.
References rijndael_encrypt().
Referenced by AES_cbc_encrypt(), and rj_encrypt().
{ uint32 *iv = (uint32 *) iva; uint32 *d = (uint32 *) data; unsigned bs = 16; while (len >= bs) { d[0] ^= iv[0]; d[1] ^= iv[1]; d[2] ^= iv[2]; d[3] ^= iv[3]; rijndael_encrypt(ctx, d, d); iv = d; d += bs / 4; len -= bs; } }
void aes_ecb_decrypt | ( | rijndael_ctx * | ctx, | |
uint8 * | data, | |||
unsigned | len | |||
) |
Definition at line 529 of file rijndael.c.
References rijndael_decrypt().
Referenced by AES_ecb_encrypt(), and rj_decrypt().
{ unsigned bs = 16; uint32 *d; while (len >= bs) { d = (uint32 *) data; rijndael_decrypt(ctx, d, d); len -= bs; data += bs; } }
void aes_ecb_encrypt | ( | rijndael_ctx * | ctx, | |
uint8 * | data, | |||
unsigned | len | |||
) |
Definition at line 513 of file rijndael.c.
References rijndael_encrypt().
Referenced by AES_ecb_encrypt(), and rj_encrypt().
{ unsigned bs = 16; uint32 *d; while (len >= bs) { d = (uint32 *) data; rijndael_encrypt(ctx, d, d); len -= bs; data += bs; } }
void aes_set_key | ( | rijndael_ctx * | ctx, | |
const uint8 * | key, | |||
unsigned | keybits, | |||
int | enc | |||
) |
Definition at line 504 of file rijndael.c.
References rijndael_set_key().
Referenced by AES_set_decrypt_key(), AES_set_encrypt_key(), and rj_real_init().
{ uint32 *k; k = (uint32 *) key; rijndael_set_key(ctx, k, keybits, enc); }
static void gen_tabs | ( | void | ) | [static] |
Definition at line 157 of file rijndael.c.
References ff_mult, i, rotl, and tab_gen.
Referenced by rijndael_set_key().
{ #ifndef PRE_CALC_TABLES u4byte i, t; u1byte p, q; /* log and power tables for GF(2**8) finite field with */ /* 0x11b as modular polynomial - the simplest prmitive */ /* root is 0x11, used here to generate the tables */ for (i = 0, p = 1; i < 256; ++i) { pow_tab[i] = (u1byte) p; log_tab[p] = (u1byte) i; p = p ^ (p << 1) ^ (p & 0x80 ? 0x01b : 0); } log_tab[1] = 0; p = 1; for (i = 0; i < 10; ++i) { rco_tab[i] = p; p = (p << 1) ^ (p & 0x80 ? 0x1b : 0); } /* note that the affine byte transformation matrix in */ /* rijndael specification is in big endian format with */ /* bit 0 as the most significant bit. In the remainder */ /* of the specification the bits are numbered from the */ /* least significant end of a byte. */ for (i = 0; i < 256; ++i) { p = (i ? pow_tab[255 - log_tab[i]] : 0); q = p; q = (q >> 7) | (q << 1); p ^= q; q = (q >> 7) | (q << 1); p ^= q; q = (q >> 7) | (q << 1); p ^= q; q = (q >> 7) | (q << 1); p ^= q ^ 0x63; sbx_tab[i] = (u1byte) p; isb_tab[p] = (u1byte) i; } for (i = 0; i < 256; ++i) { p = sbx_tab[i]; #ifdef LARGE_TABLES t = p; fl_tab[0][i] = t; fl_tab[1][i] = rotl(t, 8); fl_tab[2][i] = rotl(t, 16); fl_tab[3][i] = rotl(t, 24); #endif t = ((u4byte) ff_mult(2, p)) | ((u4byte) p << 8) | ((u4byte) p << 16) | ((u4byte) ff_mult(3, p) << 24); ft_tab[0][i] = t; ft_tab[1][i] = rotl(t, 8); ft_tab[2][i] = rotl(t, 16); ft_tab[3][i] = rotl(t, 24); p = isb_tab[i]; #ifdef LARGE_TABLES t = p; il_tab[0][i] = t; il_tab[1][i] = rotl(t, 8); il_tab[2][i] = rotl(t, 16); il_tab[3][i] = rotl(t, 24); #endif t = ((u4byte) ff_mult(14, p)) | ((u4byte) ff_mult(9, p) << 8) | ((u4byte) ff_mult(13, p) << 16) | ((u4byte) ff_mult(11, p) << 24); it_tab[0][i] = t; it_tab[1][i] = rotl(t, 8); it_tab[2][i] = rotl(t, 16); it_tab[3][i] = rotl(t, 24); } tab_gen = 1; #endif /* !PRE_CALC_TABLES */ }
void rijndael_decrypt | ( | rijndael_ctx * | ctx, | |
const u4byte * | in_blk, | |||
u4byte * | out_blk | |||
) |
Definition at line 451 of file rijndael.c.
References _rijndael_ctx::d_key, _rijndael_ctx::e_key, i_lround, i_nround, io_swap, and _rijndael_ctx::k_len.
Referenced by aes_cbc_decrypt(), and aes_ecb_decrypt().
{ u4byte b0[4], b1[4], *kp; u4byte k_len = ctx->k_len; u4byte *e_key = ctx->e_key; u4byte *d_key = ctx->d_key; b0[0] = io_swap(in_blk[0]) ^ e_key[4 * k_len + 24]; b0[1] = io_swap(in_blk[1]) ^ e_key[4 * k_len + 25]; b0[2] = io_swap(in_blk[2]) ^ e_key[4 * k_len + 26]; b0[3] = io_swap(in_blk[3]) ^ e_key[4 * k_len + 27]; kp = d_key + 4 * (k_len + 5); if (k_len > 6) { i_nround(b1, b0, kp); i_nround(b0, b1, kp); } if (k_len > 4) { i_nround(b1, b0, kp); i_nround(b0, b1, kp); } i_nround(b1, b0, kp); i_nround(b0, b1, kp); i_nround(b1, b0, kp); i_nround(b0, b1, kp); i_nround(b1, b0, kp); i_nround(b0, b1, kp); i_nround(b1, b0, kp); i_nround(b0, b1, kp); i_nround(b1, b0, kp); i_lround(b0, b1, kp); out_blk[0] = io_swap(b0[0]); out_blk[1] = io_swap(b0[1]); out_blk[2] = io_swap(b0[2]); out_blk[3] = io_swap(b0[3]); }
void rijndael_encrypt | ( | rijndael_ctx * | ctx, | |
const u4byte * | in_blk, | |||
u4byte * | out_blk | |||
) |
Definition at line 387 of file rijndael.c.
References _rijndael_ctx::e_key, f_lround, f_nround, io_swap, and _rijndael_ctx::k_len.
Referenced by aes_cbc_encrypt(), aes_ecb_encrypt(), and ciph_encrypt().
{ u4byte k_len = ctx->k_len; u4byte *e_key = ctx->e_key; u4byte b0[4], b1[4], *kp; b0[0] = io_swap(in_blk[0]) ^ e_key[0]; b0[1] = io_swap(in_blk[1]) ^ e_key[1]; b0[2] = io_swap(in_blk[2]) ^ e_key[2]; b0[3] = io_swap(in_blk[3]) ^ e_key[3]; kp = e_key + 4; if (k_len > 6) { f_nround(b1, b0, kp); f_nround(b0, b1, kp); } if (k_len > 4) { f_nround(b1, b0, kp); f_nround(b0, b1, kp); } f_nround(b1, b0, kp); f_nround(b0, b1, kp); f_nround(b1, b0, kp); f_nround(b0, b1, kp); f_nround(b1, b0, kp); f_nround(b0, b1, kp); f_nround(b1, b0, kp); f_nround(b0, b1, kp); f_nround(b1, b0, kp); f_lround(b0, b1, kp); out_blk[0] = io_swap(b0[0]); out_blk[1] = io_swap(b0[1]); out_blk[2] = io_swap(b0[2]); out_blk[3] = io_swap(b0[3]); }
rijndael_ctx* rijndael_set_key | ( | rijndael_ctx * | ctx, | |
const u4byte * | in_key, | |||
const u4byte | key_len, | |||
int | encrypt | |||
) |
Definition at line 305 of file rijndael.c.
References _rijndael_ctx::d_key, _rijndael_ctx::decrypt, _rijndael_ctx::e_key, gen_tabs(), i, imix_col, io_swap, _rijndael_ctx::k_len, loop4, loop6, loop8, and tab_gen.
Referenced by aes_set_key(), and ciph_init().
{ u4byte i, t, u, v, w; u4byte *e_key = ctx->e_key; u4byte *d_key = ctx->d_key; ctx->decrypt = !encrypt; if (!tab_gen) gen_tabs(); ctx->k_len = (key_len + 31) / 32; e_key[0] = io_swap(in_key[0]); e_key[1] = io_swap(in_key[1]); e_key[2] = io_swap(in_key[2]); e_key[3] = io_swap(in_key[3]); switch (ctx->k_len) { case 4: t = e_key[3]; for (i = 0; i < 10; ++i) loop4(i); break; case 6: e_key[4] = io_swap(in_key[4]); t = e_key[5] = io_swap(in_key[5]); for (i = 0; i < 8; ++i) loop6(i); break; case 8: e_key[4] = io_swap(in_key[4]); e_key[5] = io_swap(in_key[5]); e_key[6] = io_swap(in_key[6]); t = e_key[7] = io_swap(in_key[7]); for (i = 0; i < 7; ++i) loop8(i); break; } if (!encrypt) { d_key[0] = e_key[0]; d_key[1] = e_key[1]; d_key[2] = e_key[2]; d_key[3] = e_key[3]; for (i = 4; i < 4 * ctx->k_len + 24; ++i) imix_col(d_key[i], e_key[i]); } return ctx; }