Blame nss/lib/freebl/rijndael_tables.c

Packit 40b132
/* This Source Code Form is subject to the terms of the Mozilla Public
Packit 40b132
 * License, v. 2.0. If a copy of the MPL was not distributed with this
Packit 40b132
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
Packit 40b132
Packit 40b132
#include "stdio.h"
Packit 40b132
#include "prtypes.h"
Packit 40b132
#include "blapi.h"
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * what follows is code thrown together to generate the myriad of tables
Packit 40b132
 * used by Rijndael, the AES cipher.
Packit 40b132
 */
Packit 40b132
Packit 40b132
Packit 40b132
#define WORD_LE(b0, b1, b2, b3) \
Packit 40b132
    (((b3) << 24) | ((b2) << 16) | ((b1) << 8) | b0)
Packit 40b132
Packit 40b132
#define WORD_BE(b0, b1, b2, b3) \
Packit 40b132
    (((b0) << 24) | ((b1) << 16) | ((b2) << 8) | b3)
Packit 40b132
Packit 40b132
static const PRUint8 __S[256] = 
Packit 40b132
{
Packit 40b132
 99, 124, 119, 123, 242, 107, 111, 197,  48,   1, 103,  43, 254, 215, 171, 118, 
Packit 40b132
202, 130, 201, 125, 250,  89,  71, 240, 173, 212, 162, 175, 156, 164, 114, 192, 
Packit 40b132
183, 253, 147,  38,  54,  63, 247, 204,  52, 165, 229, 241, 113, 216,  49,  21, 
Packit 40b132
  4, 199,  35, 195,  24, 150,   5, 154,   7,  18, 128, 226, 235,  39, 178, 117, 
Packit 40b132
  9, 131,  44,  26,  27, 110,  90, 160,  82,  59, 214, 179,  41, 227,  47, 132, 
Packit 40b132
 83, 209,   0, 237,  32, 252, 177,  91, 106, 203, 190,  57,  74,  76,  88, 207, 
Packit 40b132
208, 239, 170, 251,  67,  77,  51, 133,  69, 249,   2, 127,  80,  60, 159, 168, 
Packit 40b132
 81, 163,  64, 143, 146, 157,  56, 245, 188, 182, 218,  33,  16, 255, 243, 210, 
Packit 40b132
205,  12,  19, 236,  95, 151,  68,  23, 196, 167, 126,  61, 100,  93,  25, 115, 
Packit 40b132
 96, 129,  79, 220,  34,  42, 144, 136,  70, 238, 184,  20, 222,  94,  11, 219, 
Packit 40b132
224,  50,  58,  10,  73,   6,  36,  92, 194, 211, 172,  98, 145, 149, 228, 121, 
Packit 40b132
231, 200,  55, 109, 141, 213,  78, 169, 108,  86, 244, 234, 101, 122, 174,   8, 
Packit 40b132
186, 120,  37,  46,  28, 166, 180, 198, 232, 221, 116,  31,  75, 189, 139, 138, 
Packit 40b132
112,  62, 181, 102,  72,   3, 246,  14,  97,  53,  87, 185, 134, 193,  29, 158, 
Packit 40b132
225, 248, 152,  17, 105, 217, 142, 148, 155,  30, 135, 233, 206,  85,  40, 223, 
Packit 40b132
140, 161, 137,  13, 191, 230,  66, 104,  65, 153,  45,  15, 176,  84, 187,  22, 
Packit 40b132
};
Packit 40b132
Packit 40b132
static const PRUint8 __SInv[256] = 
Packit 40b132
{
Packit 40b132
 82,   9, 106, 213,  48,  54, 165,  56, 191,  64, 163, 158, 129, 243, 215, 251, 
Packit 40b132
124, 227,  57, 130, 155,  47, 255, 135,  52, 142,  67,  68, 196, 222, 233, 203, 
Packit 40b132
 84, 123, 148,  50, 166, 194,  35,  61, 238,  76, 149,  11,  66, 250, 195,  78, 
Packit 40b132
  8,  46, 161, 102,  40, 217,  36, 178, 118,  91, 162,  73, 109, 139, 209,  37, 
Packit 40b132
114, 248, 246, 100, 134, 104, 152,  22, 212, 164,  92, 204,  93, 101, 182, 146, 
Packit 40b132
108, 112,  72,  80, 253, 237, 185, 218,  94,  21,  70,  87, 167, 141, 157, 132, 
Packit 40b132
144, 216, 171,   0, 140, 188, 211,  10, 247, 228,  88,   5, 184, 179,  69,   6, 
Packit 40b132
208,  44,  30, 143, 202,  63,  15,   2, 193, 175, 189,   3,   1,  19, 138, 107, 
Packit 40b132
 58, 145,  17,  65,  79, 103, 220, 234, 151, 242, 207, 206, 240, 180, 230, 115, 
Packit 40b132
150, 172, 116,  34, 231, 173,  53, 133, 226, 249,  55, 232,  28, 117, 223, 110, 
Packit 40b132
 71, 241,  26, 113,  29,  41, 197, 137, 111, 183,  98,  14, 170,  24, 190,  27, 
Packit 40b132
252,  86,  62,  75, 198, 210, 121,  32, 154, 219, 192, 254, 120, 205,  90, 244, 
Packit 40b132
 31, 221, 168,  51, 136,   7, 199,  49, 177,  18,  16,  89,  39, 128, 236,  95, 
Packit 40b132
 96,  81, 127, 169,  25, 181,  74,  13,  45, 229, 122, 159, 147, 201, 156, 239, 
Packit 40b132
160, 224,  59,  77, 174,  42, 245, 176, 200, 235, 187,  60, 131,  83, 153,  97, 
Packit 40b132
 23,  43,   4, 126, 186, 119, 214,  38, 225, 105,  20,  99,  85,  33,  12, 125
Packit 40b132
};
Packit 40b132
Packit 40b132
/* GF_MULTIPLY
Packit 40b132
 *
Packit 40b132
 * multiply two bytes represented in GF(2**8), mod (x**4 + 1)
Packit 40b132
 */
Packit 40b132
PRUint8 gf_multiply(PRUint8 a, PRUint8 b)
Packit 40b132
{
Packit 40b132
    PRUint8 res = 0;
Packit 40b132
    while (b > 0) {
Packit 40b132
	res = (b & 0x01) ? res ^ a : res;
Packit 40b132
	a = (a & 0x80) ? ((a << 1) ^ 0x1b) : (a << 1);
Packit 40b132
	b >>= 1;
Packit 40b132
    }
Packit 40b132
    return res;
Packit 40b132
}
Packit 40b132
Packit 40b132
void
Packit 40b132
make_T_Table(char *table, const PRUint8 Sx[256], FILE *file,
Packit 40b132
             unsigned char m0, unsigned char m1, 
Packit 40b132
             unsigned char m2, unsigned char m3)
Packit 40b132
{
Packit 40b132
    PRUint32 Ti;
Packit 40b132
    int i;
Packit 40b132
    fprintf(file, "#ifdef IS_LITTLE_ENDIAN\n");
Packit 40b132
    fprintf(file, "static const PRUint32 _T%s[256] = \n{\n", table);
Packit 40b132
    for (i=0; i<256; i++) {
Packit 40b132
	Ti = WORD_LE( gf_multiply(Sx[i], m0),
Packit 40b132
	              gf_multiply(Sx[i], m1),
Packit 40b132
	              gf_multiply(Sx[i], m2),
Packit 40b132
	              gf_multiply(Sx[i], m3) );
Packit 40b132
	if (Ti == 0)
Packit 40b132
	    fprintf(file, "0x00000000%c%c", (i==255)?' ':',',
Packit 40b132
	                                    (i%6==5)?'\n':' ');
Packit 40b132
	else
Packit 40b132
	    fprintf(file, "%#.8x%c%c", Ti, (i==255)?' ':',',
Packit 40b132
	                                   (i%6==5)?'\n':' ');
Packit 40b132
    }
Packit 40b132
    fprintf(file, "\n};\n");
Packit 40b132
    fprintf(file, "#else\n");
Packit 40b132
    fprintf(file, "static const PRUint32 _T%s[256] = \n{\n", table);
Packit 40b132
    for (i=0; i<256; i++) {
Packit 40b132
	Ti = WORD_BE( gf_multiply(Sx[i], m0),
Packit 40b132
	              gf_multiply(Sx[i], m1),
Packit 40b132
	              gf_multiply(Sx[i], m2),
Packit 40b132
	              gf_multiply(Sx[i], m3) );
Packit 40b132
	if (Ti == 0)
Packit 40b132
	    fprintf(file, "0x00000000%c%c", (i==255)?' ':',',
Packit 40b132
	                                    (i%6==5)?'\n':' ');
Packit 40b132
	else
Packit 40b132
	    fprintf(file, "%#.8x%c%c", Ti, (i==255)?' ':',',
Packit 40b132
	                                   (i%6==5)?'\n':' ');
Packit 40b132
    }
Packit 40b132
    fprintf(file, "\n};\n");
Packit 40b132
    fprintf(file, "#endif\n\n");
Packit 40b132
}
Packit 40b132
Packit 40b132
void make_InvMixCol_Table(int num, FILE *file, PRUint8 m0, PRUint8 m1, PRUint8 m2, PRUint8 m3)
Packit 40b132
{
Packit 40b132
    PRUint16 i;
Packit 40b132
    PRUint8 b0, b1, b2, b3;
Packit 40b132
    fprintf(file, "#ifdef IS_LITTLE_ENDIAN\n");
Packit 40b132
    fprintf(file, "static const PRUint32 _IMXC%d[256] = \n{\n", num);
Packit 40b132
    for (i=0; i<256; i++) {
Packit 40b132
	b0 = gf_multiply(i, m0);
Packit 40b132
	b1 = gf_multiply(i, m1);
Packit 40b132
	b2 = gf_multiply(i, m2);
Packit 40b132
	b3 = gf_multiply(i, m3);
Packit 40b132
	fprintf(file, "0x%.2x%.2x%.2x%.2x%c%c", b3, b2, b1, b0, (i==255)?' ':',', (i%6==5)?'\n':' ');
Packit 40b132
    }
Packit 40b132
    fprintf(file, "\n};\n");
Packit 40b132
    fprintf(file, "#else\n");
Packit 40b132
    fprintf(file, "static const PRUint32 _IMXC%d[256] = \n{\n", num);
Packit 40b132
    for (i=0; i<256; i++) {
Packit 40b132
	b0 = gf_multiply(i, m0);
Packit 40b132
	b1 = gf_multiply(i, m1);
Packit 40b132
	b2 = gf_multiply(i, m2);
Packit 40b132
	b3 = gf_multiply(i, m3);
Packit 40b132
	fprintf(file, "0x%.2x%.2x%.2x%.2x%c%c", b0, b1, b2, b3, (i==255)?' ':',', (i%6==5)?'\n':' ');
Packit 40b132
    }
Packit 40b132
    fprintf(file, "\n};\n");
Packit 40b132
    fprintf(file, "#endif\n\n");
Packit 40b132
}
Packit 40b132
Packit 40b132
int main()
Packit 40b132
{
Packit 40b132
    int i, j;
Packit 40b132
    PRUint8 cur, last;
Packit 40b132
    PRUint32 tmp;
Packit 40b132
    FILE *optfile;
Packit 40b132
    optfile = fopen("rijndael32.tab", "w");
Packit 40b132
    /* output S, if there are no T tables */
Packit 40b132
    fprintf(optfile, "#ifndef RIJNDAEL_INCLUDE_TABLES\n");
Packit 40b132
    fprintf(optfile, "static const PRUint8 _S[256] = \n{\n");
Packit 40b132
    for (i=0; i<256; i++) {
Packit 40b132
	fprintf(optfile, "%3d%c%c", __S[i],(i==255)?' ':',', 
Packit 40b132
	                            (i%16==15)?'\n':' ');
Packit 40b132
    }
Packit 40b132
    fprintf(optfile, "};\n#endif /* not RIJNDAEL_INCLUDE_TABLES */\n\n");
Packit 40b132
    /* output S**-1 */
Packit 40b132
    fprintf(optfile, "static const PRUint8 _SInv[256] = \n{\n");
Packit 40b132
    for (i=0; i<256; i++) {
Packit 40b132
	fprintf(optfile, "%3d%c%c", __SInv[i],(i==255)?' ':',', 
Packit 40b132
	                            (i%16==15)?'\n':' ');
Packit 40b132
    }
Packit 40b132
    fprintf(optfile, "};\n\n");
Packit 40b132
    fprintf(optfile, "#ifdef RIJNDAEL_INCLUDE_TABLES\n");
Packit 40b132
    /* The 32-bit word tables for optimized implementation */
Packit 40b132
    /* T0 = [ S[a] * 02, S[a], S[a], S[a] * 03 ] */
Packit 40b132
    make_T_Table("0", __S, optfile, 0x02, 0x01, 0x01, 0x03);
Packit 40b132
    /* T1 = [ S[a] * 03, S[a] * 02, S[a], S[a] ] */
Packit 40b132
    make_T_Table("1", __S, optfile, 0x03, 0x02, 0x01, 0x01);
Packit 40b132
    /* T2 = [ S[a], S[a] * 03, S[a] * 02, S[a] ] */
Packit 40b132
    make_T_Table("2", __S, optfile, 0x01, 0x03, 0x02, 0x01);
Packit 40b132
    /* T3 = [ S[a], S[a], S[a] * 03, S[a] * 02 ] */
Packit 40b132
    make_T_Table("3", __S, optfile, 0x01, 0x01, 0x03, 0x02);
Packit 40b132
    /* TInv0 = [ Si[a] * 0E, Si[a] * 09, Si[a] * 0D, Si[a] * 0B ] */
Packit 40b132
    make_T_Table("Inv0", __SInv, optfile, 0x0e, 0x09, 0x0d, 0x0b);
Packit 40b132
    /* TInv1 = [ Si[a] * 0B, Si[a] * 0E, Si[a] * 09, Si[a] * 0D ] */
Packit 40b132
    make_T_Table("Inv1", __SInv, optfile, 0x0b, 0x0e, 0x09, 0x0d);
Packit 40b132
    /* TInv2 = [ Si[a] * 0D, Si[a] * 0B, Si[a] * 0E, Si[a] * 09 ] */
Packit 40b132
    make_T_Table("Inv2", __SInv, optfile, 0x0d, 0x0b, 0x0e, 0x09);
Packit 40b132
    /* TInv3 = [ Si[a] * 09, Si[a] * 0D, Si[a] * 0B, Si[a] * 0E ] */
Packit 40b132
    make_T_Table("Inv3", __SInv, optfile, 0x09, 0x0d, 0x0b, 0x0e);
Packit 40b132
    /* byte multiply tables for inverse key expansion (mimics InvMixColumn) */
Packit 40b132
    make_InvMixCol_Table(0, optfile, 0x0e, 0x09, 0x0d, 0x0b);
Packit 40b132
    make_InvMixCol_Table(1, optfile, 0x0b, 0x0E, 0x09, 0x0d);
Packit 40b132
    make_InvMixCol_Table(2, optfile, 0x0d, 0x0b, 0x0e, 0x09);
Packit 40b132
    make_InvMixCol_Table(3, optfile, 0x09, 0x0d, 0x0b, 0x0e);
Packit 40b132
    fprintf(optfile, "#endif /* RIJNDAEL_INCLUDE_TABLES */\n\n");
Packit 40b132
    /* round constants for key expansion */
Packit 40b132
    fprintf(optfile, "#ifdef IS_LITTLE_ENDIAN\n");
Packit 40b132
    fprintf(optfile, "static const PRUint32 Rcon[30] = {\n");
Packit 40b132
    cur = 0x01;
Packit 40b132
    for (i=0; i<30; i++) {
Packit 40b132
	fprintf(optfile, "%#.8x%c%c", WORD_LE(cur, 0, 0, 0), 
Packit 40b132
	                                (i==29)?' ':',', (i%6==5)?'\n':' ');
Packit 40b132
	last = cur;
Packit 40b132
	cur = gf_multiply(last, 0x02);
Packit 40b132
    }
Packit 40b132
    fprintf(optfile, "};\n");
Packit 40b132
    fprintf(optfile, "#else\n");
Packit 40b132
    fprintf(optfile, "static const PRUint32 Rcon[30] = {\n");
Packit 40b132
    cur = 0x01;
Packit 40b132
    for (i=0; i<30; i++) {
Packit 40b132
	fprintf(optfile, "%#.8x%c%c", WORD_BE(cur, 0, 0, 0), 
Packit 40b132
	                                (i==29)?' ':',', (i%6==5)?'\n':' ');
Packit 40b132
	last = cur;
Packit 40b132
	cur = gf_multiply(last, 0x02);
Packit 40b132
    }
Packit 40b132
    fprintf(optfile, "};\n");
Packit 40b132
    fprintf(optfile, "#endif\n\n");
Packit 40b132
    fclose(optfile);
Packit 40b132
    return 0;
Packit 40b132
}