/*	$OpenBSD: rijndael.c,v 1.6 2000/12/09 18:51:34 markus Exp $ */

/* contrib/pgcrypto/rijndael.c */

/* This is an independent implementation of the encryption algorithm:	*/
/*																		*/
/*		   RIJNDAEL by Joan Daemen and Vincent Rijmen
 */
/*																		*/
/* which is a candidate algorithm in the Advanced Encryption Standard	*/
/* programme of the US National Institute of Standards and Technology.	*/
/*																		*/
/* Copyright in this implementation is held by Dr B R Gladman but I
 */
/* hereby give permission for its free direct or derivative use subject */
/* to acknowledgment of its origin and compliance with any conditions	*/
/* that the originators of the algorithm place on its exploitation.
 */
/*																		*/
/* Dr Brian Gladman (gladman@seven77.demon.co.uk) 14th January 1999
 */

/* Timing data for Rijndael (rijndael.c)

Algorithm: rijndael (rijndael.c)

128 bit key:
Key Setup:	  305/1389 cycles (encrypt/decrypt)
Encrypt:	   374 cycles =    68.4 mbits/sec
Decrypt:	   352 cycles =    72.7 mbits/sec
Mean:		   363 cycles =    70.5 mbits/sec

192 bit key:
Key Setup:	  277/1595 cycles (encrypt/decrypt)
Encrypt:	   439 cycles =    58.3 mbits/sec
Decrypt:	   425 cycles =    60.2 mbits/sec
Mean:		   432 cycles =    59.3 mbits/sec

256 bit key:
Key Setup:	  374/1960 cycles (encrypt/decrypt)
Encrypt:	   502 cycles =    51.0 mbits/sec
Decrypt:	   498 cycles =    51.4 mbits/sec
Mean:		   500 cycles =    51.2 mbits/sec

*/

#include <random/rijndael.h>

#include "rijndael.tbl"

/* 3. Basic macros for speeding up generic operations */

/* Circular rotate of 32 bit values
 */

#define rotr(x, n) (((x) >> ((int)(n))) | ((x) << (32 - (int)(n))))
#define rotl(x, n) (((x) << ((int)(n))) | ((x) >> (32 - (int)(n))))

/* Invert byte order in a 32 bit variable
 */

#define bswap(x) ((rotl((x), 8) & 0x00ff00ff) | (rotr((x), 8) & 0xff00ff00))

/* Extract byte from a 32 bit quantity (little endian notation)		*/

#define byte(x, n) ((uint8_t)((x) >> (8 * (n))))

#define io_swap(x) (x)

#define ff_mult(a, b)                                                          \
	((a) && (b) ? pow_tab[(log_tab[a] + log_tab[b]) % 255] : 0)

#define f_rn(bo, bi, n, k)                                                     \
	(bo)[n] = ft_tab[0][byte((bi)[n], 0)] ^                                \
	          ft_tab[1][byte((bi)[((n) + 1) & 3], 1)] ^                    \
	          ft_tab[2][byte((bi)[((n) + 2) & 3], 2)] ^                    \
	          ft_tab[3][byte((bi)[((n) + 3) & 3], 3)] ^ *((k) + (n))

#define i_rn(bo, bi, n, k)                                                     \
	(bo)[n] = it_tab[0][byte((bi)[n], 0)] ^                                \
	          it_tab[1][byte((bi)[((n) + 3) & 3], 1)] ^                    \
	          it_tab[2][byte((bi)[((n) + 2) & 3], 2)] ^                    \
	          it_tab[3][byte((bi)[((n) + 1) & 3], 3)] ^ *((k) + (n))

#define ls_box(x)                                                              \
	(fl_tab[0][byte(x, 0)] ^ fl_tab[1][byte(x, 1)] ^                       \
	 fl_tab[2][byte(x, 2)] ^ fl_tab[3][byte(x, 3)])

#define f_rl(bo, bi, n, k)                                                     \
	(bo)[n] = fl_tab[0][byte((bi)[n], 0)] ^                                \
	          fl_tab[1][byte((bi)[((n) + 1) & 3], 1)] ^                    \
	          fl_tab[2][byte((bi)[((n) + 2) & 3], 2)] ^                    \
	          fl_tab[3][byte((bi)[((n) + 3) & 3], 3)] ^ *((k) + (n))

#define i_rl(bo, bi, n, k)                                                     \
	(bo)[n] = il_tab[0][byte((bi)[n], 0)] ^                                \
	          il_tab[1][byte((bi)[((n) + 3) & 3], 1)] ^                    \
	          il_tab[2][byte((bi)[((n) + 2) & 3], 2)] ^                    \
	          il_tab[3][byte((bi)[((n) + 1) & 3], 3)] ^ *((k) + (n))

#define star_x(x) (((x)&0x7f7f7f7f) << 1) ^ ((((x)&0x80808080) >> 7) * 0x1b)

#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)

/* initialise the key schedule from the user supplied key	*/

#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)

#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)

#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)

rijndaelCtx *rijndael_set_key(rijndaelCtx *ctx, const uint32_t *in_key,
                              const uint32_t key_len, int encrypt)
{
	uint32_t i, t, u, v, w;
	uint32_t *e_key = ctx->e_key;
	uint32_t *d_key = ctx->d_key;

	ctx->decrypt = !encrypt;

	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;
}

/* encrypt a block of text	*/

#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)

#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)

void rijndael_encrypt(rijndaelCtx *ctx, const uint32_t *in_blk,
                      uint32_t *out_blk)
{
	uint32_t k_len = ctx->k_len;
	uint32_t *e_key = ctx->e_key;
	uint32_t 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]);
}

/* decrypt a block of text	*/

#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)

#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)

void rijndael_decrypt(rijndaelCtx *ctx, const uint32_t *in_blk,
                      uint32_t *out_blk)
{
	uint32_t b0[4], b1[4], *kp;
	uint32_t k_len = ctx->k_len;
	uint32_t *e_key = ctx->e_key;
	uint32_t *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]);
}

/*
 * conventional interface
 *
 * ATM it hopes all data is 4-byte aligned - which
 * should be true for PX.  -marko
 */

void aes_set_key(rijndaelCtx *ctx, const uint8_t *key, unsigned keybits,
                 int enc)
{
	uint32_t *k;

	k = (uint32_t *)key;
	rijndael_set_key(ctx, k, keybits, enc);
}

void aes_ecb_encrypt(rijndaelCtx *ctx, uint8_t *data, unsigned len)
{
	unsigned bs = 16;
	uint32_t *d;

	while (len >= bs) {
		d = (uint32_t *)data;
		rijndael_encrypt(ctx, d, d);

		len -= bs;
		data += bs;
	}
}

void aes_ecb_decrypt(rijndaelCtx *ctx, uint8_t *data, unsigned len)
{
	unsigned bs = 16;
	uint32_t *d;

	while (len >= bs) {
		d = (uint32_t *)data;
		rijndael_decrypt(ctx, d, d);

		len -= bs;
		data += bs;
	}
}

void aes_cbc_encrypt(rijndaelCtx *ctx, uint8_t *iva, uint8_t *data,
                     unsigned len)
{
	uint32_t *iv = (uint32_t *)iva;
	uint32_t *d = (uint32_t *)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_cbc_decrypt(rijndaelCtx *ctx, uint8_t *iva, uint8_t *data,
                     unsigned len)
{
	uint32_t *d = (uint32_t *)data;
	unsigned bs = 16;
	uint32_t 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;
	}
}
