3 This file is part of the This file is part of the AVR-Crypto-Lib.
4 Copyright (C) 2008 Daniel Otte (daniel.otte@rub.de)
6 This program is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, either version 3 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program. If not, see <http://www.gnu.org/licenses/>.
25 #include "serial-tools.h"
30 #include "aes128_enc.h"
31 #include "aes128_dec.h"
32 #include "aes192_enc.h"
33 #include "aes192_dec.h"
34 #include "aes256_enc.h"
35 #include "aes256_dec.h"
36 #include "aes_keyschedule.h"
38 #include "nessie_bc_test.h"
40 #include "performance_test.h"
46 char* cipher_name = "AES";
48 /*****************************************************************************
49 * additional validation-functions *
50 *****************************************************************************/
52 void testrun_nessie_aes(void){
53 nessie_bc_ctx.blocksize_B = 16;
54 nessie_bc_ctx.keysize_b = 128;
55 nessie_bc_ctx.name = cipher_name;
56 nessie_bc_ctx.ctx_size_B = sizeof(aes128_ctx_t);
57 nessie_bc_ctx.cipher_enc = (nessie_bc_enc_fpt)aes128_enc;
58 nessie_bc_ctx.cipher_dec = (nessie_bc_dec_fpt)aes128_dec;
59 nessie_bc_ctx.cipher_genctx = (nessie_bc_gen_fpt)aes_init;
62 nessie_bc_ctx.keysize_b = 192;
63 nessie_bc_ctx.ctx_size_B = sizeof(aes192_ctx_t);
64 nessie_bc_ctx.cipher_enc = (nessie_bc_enc_fpt)aes192_enc;
65 nessie_bc_ctx.cipher_dec = (nessie_bc_dec_fpt)aes192_dec;
68 nessie_bc_ctx.keysize_b = 256;
69 nessie_bc_ctx.ctx_size_B = sizeof(aes256_ctx_t);
70 nessie_bc_ctx.cipher_enc = (nessie_bc_enc_fpt)aes256_enc;
71 nessie_bc_ctx.cipher_dec = (nessie_bc_dec_fpt)aes256_dec;
75 void testrun_test_aes(void){
76 uint8_t key[16] = { 0x2b, 0x7e, 0x15, 0x16,
77 0x28, 0xae, 0xd2, 0xa6,
78 0xab, 0xf7, 0x15, 0x88,
79 0x09, 0xcf, 0x4f, 0x3c };
80 uint8_t data[16] = { 0x32, 0x43, 0xf6, 0xa8,
81 0x88, 0x5a, 0x30, 0x8d,
82 0x31, 0x31, 0x98, 0xa2,
83 0xe0, 0x37, 0x07, 0x34 };
85 aes128_init(key, &ctx);
86 uart_putstr_P(PSTR("\r\n\r\n cipher test (FIPS 197):\r\n key: "));
87 uart_hexdump(key, 16);
88 uart_putstr_P(PSTR("\r\n plaintext: "));
89 uart_hexdump(data, 16);
90 aes128_enc(data, &ctx);
91 uart_putstr_P(PSTR("\r\n ciphertext: "));
92 uart_hexdump(data, 16);
93 aes128_dec(data, &ctx);
94 uart_putstr_P(PSTR("\r\n plaintext: "));
95 uart_hexdump(data, 16);
100 void testrun_testkey_aes128(void){
101 uint8_t key[16] = { 0x2b, 0x7e, 0x15, 0x16,
102 0x28, 0xae, 0xd2, 0xa6,
103 0xab, 0xf7, 0x15, 0x88,
104 0x09, 0xcf, 0x4f, 0x3c};
107 aes128_init(key, &ctx);
108 uart_putstr_P(PSTR("\r\n\r\n keyschedule test (FIPS 197):\r\n key: "));
109 uart_hexdump(key, 16);
111 uart_putstr_P(PSTR("\r\n index: "));
114 uart_putstr_P(PSTR(" roundkey "));
115 uart_hexdump(ctx.key[i].ks, 16);
119 void testrun_testkey_aes192(void){
120 uint8_t key[24] = { 0x8e, 0x73, 0xb0, 0xf7,
121 0xda, 0x0e, 0x64, 0x52,
122 0xc8, 0x10, 0xf3, 0x2b,
123 0x80, 0x90, 0x79, 0xe5,
124 0x62, 0xf8, 0xea, 0xd2,
125 0x52, 0x2c, 0x6b, 0x7b};
128 memset(&ctx, 0, sizeof(aes192_ctx_t));
129 aes192_init(key, &ctx);
130 uart_putstr_P(PSTR("\r\n\r\n keyschedule test (FIPS 197):\r\n key: "));
131 uart_hexdump(key, 24);
133 uart_putstr_P(PSTR("\r\n index: "));
136 uart_putstr_P(PSTR(" roundkey "));
137 uart_hexdump(ctx.key[i].ks, 16);
142 void testrun_testkey_aes256(void){
143 uint8_t key[32] = { 0x60, 0x3d, 0xeb, 0x10,
144 0x15, 0xca, 0x71, 0xbe,
145 0x2b, 0x73, 0xae, 0xf0,
146 0x85, 0x7d, 0x77, 0x81,
147 0x1f, 0x35, 0x2c, 0x07,
148 0x3b, 0x61, 0x08, 0xd7,
149 0x2d, 0x98, 0x10, 0xa3,
150 0x09, 0x14, 0xdf, 0xf4};
153 memset(&ctx, 0, sizeof(aes256_ctx_t));
154 aes256_init(key, &ctx);
155 uart_putstr_P(PSTR("\r\n\r\n keyschedule test (FIPS 197):\r\n key: "));
156 uart_hexdump(key, 32);
158 uart_putstr_P(PSTR("\r\n index: "));
161 uart_putstr_P(PSTR(" roundkey "));
162 uart_hexdump(ctx.key[i].ks, 16);
166 void testrun_testkey_aes(void){
167 testrun_testkey_aes128();
168 testrun_testkey_aes192();
169 testrun_testkey_aes256();
171 /*****************************************************************************/
173 void testrun_performance_aes128(void){
176 uint8_t key[32], data[16];
186 aes128_init(key, &ctx);
188 uart_putstr_P(PSTR("\r\n\tctx-gen time: "));
189 ultoa((unsigned long)t, str, 10);
194 aes128_enc(data, &ctx);
196 uart_putstr_P(PSTR("\r\n\tencrypt time: "));
197 ultoa((unsigned long)t, str, 10);
202 aes128_dec(data, &ctx);
204 uart_putstr_P(PSTR("\r\n\tdecrypt time: "));
205 ultoa((unsigned long)t, str, 10);
208 uart_putstr_P(PSTR("\r\n"));
212 void testrun_performance_aes192(void){
215 uint8_t key[32], data[16];
225 aes192_init(key, &ctx);
227 uart_putstr_P(PSTR("\r\n\tctx-gen time: "));
228 ultoa((unsigned long)t, str, 10);
233 aes192_enc(data, &ctx);
235 uart_putstr_P(PSTR("\r\n\tencrypt time: "));
236 ultoa((unsigned long)t, str, 10);
241 aes192_dec(data, &ctx);
243 uart_putstr_P(PSTR("\r\n\tdecrypt time: "));
244 ultoa((unsigned long)t, str, 10);
247 uart_putstr_P(PSTR("\r\n"));
251 void testrun_performance_aes256(void){
254 uint8_t key[32], data[16];
264 aes256_init(key, &ctx);
266 uart_putstr_P(PSTR("\r\n\tctx-gen time: "));
267 ultoa((unsigned long)t, str, 10);
272 aes256_enc(data, &ctx);
274 uart_putstr_P(PSTR("\r\n\tencrypt time: "));
275 ultoa((unsigned long)t, str, 10);
280 aes256_dec(data, &ctx);
282 uart_putstr_P(PSTR("\r\n\tdecrypt time: "));
283 ultoa((unsigned long)t, str, 10);
286 uart_putstr_P(PSTR("\r\n"));
289 void testrun_performance_aes(void){
290 uart_putstr_P(PSTR("\r\n -=AES Performance Test=-\r\n"));
291 uart_putstr_P(PSTR("\r\n AES-128\r\n"));
292 testrun_performance_aes128();
293 uart_putstr_P(PSTR("\r\n AES-192\r\n"));
294 testrun_performance_aes192();
295 uart_putstr_P(PSTR("\r\n AES-256\r\n"));
296 testrun_performance_aes256();
298 /*****************************************************************************
300 *****************************************************************************/
307 uart_putstr_P(PSTR("\r\n\r\nCrypto-VS ("));
308 uart_putstr(cipher_name);
309 uart_putstr_P(PSTR(")\r\nloaded and running\r\n"));
311 PGM_P u = PSTR("nessie\0test\0testkey\0performance\0");
312 void_fpt v[] = {testrun_nessie_aes,
315 testrun_performance_aes};
318 if (!getnextwordn(str,20)){DEBUG_S("DBG: W1\r\n"); goto error;}
319 if(execcommand_d0_P(str, u, v)<0){
320 uart_putstr_P(PSTR("\r\nunknown command\r\n"));
324 uart_putstr("ERROR\r\n");