1386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/*
2386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * aes_tables.c
3386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *
4386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * generate tables for the AES cipher
5386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *
6386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * David A. McGrew
7386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * Cisco Systems, Inc.
8386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */
9386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/*
10386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *
11386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * Copyright(c) 2001-2006 Cisco Systems, Inc.
12386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * All rights reserved.
13386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *
14386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * Redistribution and use in source and binary forms, with or without
15386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * modification, are permitted provided that the following conditions
16386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * are met:
17386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *
18386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *   Redistributions of source code must retain the above copyright
19386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *   notice, this list of conditions and the following disclaimer.
20386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *
21386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *   Redistributions in binary form must reproduce the above
22386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *   copyright notice, this list of conditions and the following
23386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *   disclaimer in the documentation and/or other materials provided
24386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *   with the distribution.
25386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *
26386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *   Neither the name of the Cisco Systems, Inc. nor the names of its
27386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *   contributors may be used to endorse or promote products derived
28386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *   from this software without specific prior written permission.
29386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *
30386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
31386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
32386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
33386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
34386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
35386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
36386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
37386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
40386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
41386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * OF THE POSSIBILITY OF SUCH DAMAGE.
42386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *
43386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */
44386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
45386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#include <stdio.h>
46386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#include "gf2_8.h"
47386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#include "crypto_math.h"
48386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
49386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
50386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariunsigned char aes_sbox[256];
51386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
52386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariunsigned char aes_inv_sbox[256];
53386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
54386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariuint32_t T0[256], T1[256], T2[256], T3[256], T4[256];
55386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
56386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
57386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define AES_INVERSE_TEST 0  /* set to 1 to test forward/backwards aes */
58386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
59386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/* functions for precomputing AES values */
60386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
61386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/*
62386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * A[] is the 8 x 8 binary matrix (represented as an array of columns,
63386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * where each column is an octet) which defines the affine
64386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * transformation used in the AES substitution table (Section
65386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * 4.2.1 of the spec).
66386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */
67386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
68386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariuint8_t A[8] = { 31, 62, 124, 248, 241, 227, 199, 143 };
69386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
70386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/*
71386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * b is the 8 bit vector (represented as an octet) used in the affine
72386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * transform described above.
73386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */
74386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
75386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariuint8_t b = 99;
76386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
77386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
78386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid
79386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariaes_init_sbox(void) {
80386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  unsigned int i;
81386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  uint8_t x;
82386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
83386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  for (i=0; i < 256; i++) {
84386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    x = gf2_8_compute_inverse((gf2_8)i);
85386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    x = A_times_x_plus_b(A, x, b);
86386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    aes_sbox[i] = x;
87386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    aes_inv_sbox[x] = i;
88386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  }
89386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
90386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
91386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid
92386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariaes_compute_tables(void) {
93386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  int i;
94386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  uint32_t x1, x2, x3;
95386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  v32_t tmp;
96386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
97386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  /* initialize substitution table */
98386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  aes_init_sbox();
99386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
100386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  /* combine sbox with linear operations to form 8-bit to 32-bit tables */
101386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  for (i=0; i < 256; i++) {
102386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    x1 = aes_sbox[i];
103386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    x2 = gf2_8_shift(x1);
104386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    x3 = x2 ^ x1;
105386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
106386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    tmp.v8[0] = x2;
107386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    tmp.v8[1] = x1;
108386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    tmp.v8[2] = x1;
109386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    tmp.v8[3] = x3;
110386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    T0[i] = tmp.value;
111386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
112386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    tmp.v8[0] = x3;
113386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    tmp.v8[1] = x2;
114386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    tmp.v8[2] = x1;
115386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    tmp.v8[3] = x1;
116386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    T1[i] = tmp.value;
117386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
118386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    tmp.v8[0] = x1;
119386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    tmp.v8[1] = x3;
120386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    tmp.v8[2] = x2;
121386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    tmp.v8[3] = x1;
122386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    T2[i] = tmp.value;
123386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
124386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    tmp.v8[0] = x1;
125386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    tmp.v8[1] = x1;
126386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    tmp.v8[2] = x3;
127386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    tmp.v8[3] = x2;
128386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    T3[i] = tmp.value;
129386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
130386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  }
131386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
132386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
133386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
134386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/*
135386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * the tables U0, U1, U2, U3 implement the aes operations invSubBytes,
136386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * invMixColumns, and invShiftRows
137386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */
138386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
139386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariuint32_t U0[256], U1[256], U2[256], U3[256], U4[256];
140386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
141386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariextern uint8_t aes_inv_sbox[256];
142386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
143386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid
144386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariaes_compute_inv_tables(void) {
145386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  int i;
146386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  uint8_t x, xe, x9, xd, xb;
147386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  v32_t tmp;
148386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
149386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  /* combine sbox with linear operations to form 8-bit to 32-bit tables */
150386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  for (i=0; i < 256; i++) {
151386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari     x = aes_inv_sbox[i];
152386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
153386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari     xe = gf2_8_multiply(0x0e, x);
154386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari     x9 = gf2_8_multiply(0x09, x);
155386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari     xd = gf2_8_multiply(0x0d, x);
156386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari     xb = gf2_8_multiply(0x0b, x);
157386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
158386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari     tmp.v8[0] = xe;
159386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari     tmp.v8[1] = x9;
160386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari     tmp.v8[2] = xd;
161386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari     tmp.v8[3] = xb;
162386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari     U0[i] = tmp.value;
163386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
164386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari     tmp.v8[0] = xb;
165386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari     tmp.v8[1] = xe;
166386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari     tmp.v8[2] = x9;
167386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari     tmp.v8[3] = xd;
168386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari     U1[i] = tmp.value;
169386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
170386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari     tmp.v8[0] = xd;
171386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari     tmp.v8[1] = xb;
172386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari     tmp.v8[2] = xe;
173386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari     tmp.v8[3] = x9;
174386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari     U2[i] = tmp.value;
175386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
176386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari     tmp.v8[0] = x9;
177386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari     tmp.v8[1] = xd;
178386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari     tmp.v8[2] = xb;
179386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari     tmp.v8[3] = xe;
180386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari     U3[i] = tmp.value;
181386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
182386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari     tmp.v8[0] = tmp.v8[1] = tmp.v8[2] = tmp.v8[3] = x;
183386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari     U4[i] = tmp.value;
184386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari   }
185386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
186386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
187386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
188386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/*
189386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * aes_test_inverse() returns err_status_ok if aes
190386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * encryption and decryption are true inverses of each other, and
191386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * returns err_status_algo_fail otherwise
192386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */
193386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
194386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#include "err.h"
195386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
196386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarierr_status_t
197386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariaes_test_inverse(void);
198386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
199386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define TABLES_32BIT 1
200386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
201386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#ifndef HIDE_AES_TABLES_MAIN
202386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
203386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariint
204386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarimain(void) {
205386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  int i;
206386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
207386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  aes_init_sbox();
208386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  aes_compute_inv_tables();
209386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
210386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#if TABLES_32BIT
211386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  printf("uint32_t U0 = {");
212386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  for (i=0; i < 256; i++) {
213386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    if ((i % 4) == 0)
214386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      printf("\n");
215386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    printf("0x%0x, ", U0[i]);
216386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  }
217386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  printf("\n}\n");
218386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
219386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("uint32_t U1 = {");
220386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  for (i=0; i < 256; i++) {
221386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    if ((i % 4) == 0)
222386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      printf("\n");
223386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    printf("0x%x, ", U1[i]);
224386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  }
225386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  printf("\n}\n");
226386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
227386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("uint32_t U2 = {");
228386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  for (i=0; i < 256; i++) {
229386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    if ((i % 4) == 0)
230386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      printf("\n");
231386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    printf("0x%x, ", U2[i]);
232386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  }
233386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  printf("\n}\n");
234386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
235386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("uint32_t U3 = {");
236386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  for (i=0; i < 256; i++) {
237386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    if ((i % 4) == 0)
238386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      printf("\n");
239386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    printf("0x%x, ", U3[i]);
240386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  }
241386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  printf("\n}\n");
242386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
243386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("uint32_t U4 = {");
244386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari for (i=0; i < 256; i++) {
245386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    if ((i % 4) == 0)
246386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      printf("\n");
247386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    printf("0x%x, ", U4[i]);
248386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  }
249386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  printf("\n}\n");
250386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
251386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#else
252386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
253386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  printf("uint32_t U0 = {");
254386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  for (i=0; i < 256; i++) {
255386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    if ((i % 4) == 0)
256386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      printf("\n");
257386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    printf("0x%lx, ", U0[i]);
258386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  }
259386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  printf("\n}\n");
260386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
261386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("uint32_t U1 = {");
262386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  for (i=0; i < 256; i++) {
263386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    if ((i % 4) == 0)
264386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      printf("\n");
265386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    printf("0x%lx, ", U1[i]);
266386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  }
267386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  printf("\n}\n");
268386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
269386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("uint32_t U2 = {");
270386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  for (i=0; i < 256; i++) {
271386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    if ((i % 4) == 0)
272386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      printf("\n");
273386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    printf("0x%lx, ", U2[i]);
274386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  }
275386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  printf("\n}\n");
276386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
277386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("uint32_t U3 = {");
278386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  for (i=0; i < 256; i++) {
279386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    if ((i % 4) == 0)
280386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      printf("\n");
281386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    printf("0x%lx, ", U3[i]);
282386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  }
283386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  printf("\n}\n");
284386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
285386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("uint32_t U4 = {");
286386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari for (i=0; i < 256; i++) {
287386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    if ((i % 4) == 0)
288386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      printf("\n");
289386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    printf("0x%lx, ", U4[i]);
290386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  }
291386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  printf("\n}\n");
292386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
293386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
294386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#endif /* TABLES_32BIT */
295386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
296386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
297386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#if AES_INVERSE_TEST
298386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  /*
299386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari   * test that aes_encrypt and aes_decrypt are actually
300386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari   * inverses of each other
301386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari   */
302386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
303386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  printf("aes inverse test: ");
304386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  if (aes_test_inverse() == err_status_ok)
305386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    printf("passed\n");
306386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  else {
307386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    printf("failed\n");
308386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    exit(1);
309386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  }
310386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#endif
311386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
312386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  return 0;
313386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
314386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
315386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#endif // HIDE_AES_TABLES_MAIN
316386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
317386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#if AES_INVERSE_TEST
318386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
319386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarierr_status_t
320386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariaes_test_inverse(void) {
321386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  v128_t x, y;
322386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  aes_expanded_key_t expanded_key, decrypt_key;
323386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  uint8_t plaintext[16] = {
324386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
325386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff
326386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  };
327386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  uint8_t key[16] = {
328386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
329386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
330386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  };
331386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  v128_t k;
332386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  v128_set_to_zero(&x);
333386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
334386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  v128_copy_octet_string(&k, key);
335386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  v128_copy_octet_string(&x, plaintext);
336386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  aes_expand_encryption_key(k, expanded_key);
337386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  aes_expand_decryption_key(k, decrypt_key);
338386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  aes_encrypt(&x, expanded_key);
339386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  aes_decrypt(&x, decrypt_key);
340386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
341386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  /* compare to expected value then report */
342386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  v128_copy_octet_string(&y, plaintext);
343386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
344386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  if (v128_is_eq(&x, &y))
345386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return err_status_ok;
346386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  return err_status_algo_fail;
347386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
348386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
349386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
350386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#endif
351