3 This file is part of the Crypto-avr-lib/microcrypt-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);
97 void testrun_testkey_aes128(void){
98 uint8_t key[16] = { 0x2b, 0x7e, 0x15, 0x16,
99 0x28, 0xae, 0xd2, 0xa6,
100 0xab, 0xf7, 0x15, 0x88,
101 0x09, 0xcf, 0x4f, 0x3c};
104 aes128_init(key, &ctx);
105 uart_putstr_P(PSTR("\r\n\r\n keyschedule test (FIPS 197):\r\n key: "));
106 uart_hexdump(key, 16);
108 uart_putstr_P(PSTR("\r\n index: "));
111 uart_putstr_P(PSTR(" roundkey "));
112 uart_hexdump(ctx.key[i].ks, 16);
116 void testrun_testkey_aes192(void){
117 uint8_t key[24] = { 0x8e, 0x73, 0xb0, 0xf7,
118 0xda, 0x0e, 0x64, 0x52,
119 0xc8, 0x10, 0xf3, 0x2b,
120 0x80, 0x90, 0x79, 0xe5,
121 0x62, 0xf8, 0xea, 0xd2,
122 0x52, 0x2c, 0x6b, 0x7b};
125 memset(&ctx, 0, sizeof(aes192_ctx_t));
126 aes192_init(key, &ctx);
127 uart_putstr_P(PSTR("\r\n\r\n keyschedule test (FIPS 197):\r\n key: "));
128 uart_hexdump(key, 24);
130 uart_putstr_P(PSTR("\r\n index: "));
133 uart_putstr_P(PSTR(" roundkey "));
134 uart_hexdump(ctx.key[i].ks, 16);
139 void testrun_testkey_aes256(void){
140 uint8_t key[32] = { 0x60, 0x3d, 0xeb, 0x10,
141 0x15, 0xca, 0x71, 0xbe,
142 0x2b, 0x73, 0xae, 0xf0,
143 0x85, 0x7d, 0x77, 0x81,
144 0x1f, 0x35, 0x2c, 0x07,
145 0x3b, 0x61, 0x08, 0xd7,
146 0x2d, 0x98, 0x10, 0xa3,
147 0x09, 0x14, 0xdf, 0xf4};
150 memset(&ctx, 0, sizeof(aes256_ctx_t));
151 aes256_init(key, &ctx);
152 uart_putstr_P(PSTR("\r\n\r\n keyschedule test (FIPS 197):\r\n key: "));
153 uart_hexdump(key, 32);
155 uart_putstr_P(PSTR("\r\n index: "));
158 uart_putstr_P(PSTR(" roundkey "));
159 uart_hexdump(ctx.key[i].ks, 16);
163 void testrun_testkey_aes(void){
164 testrun_testkey_aes128();
165 testrun_testkey_aes192();
166 testrun_testkey_aes256();
168 /*****************************************************************************/
170 void testrun_performance_aes128(void){
173 uint8_t key[32], data[16];
183 aes128_init(key, &ctx);
185 uart_putstr_P(PSTR("\r\n\tctx-gen time: "));
186 ultoa((unsigned long)t, str, 10);
191 aes128_enc(data, &ctx);
193 uart_putstr_P(PSTR("\r\n\tencrypt time: "));
194 ultoa((unsigned long)t, str, 10);
199 aes128_dec(data, &ctx);
201 uart_putstr_P(PSTR("\r\n\tdecrypt time: "));
202 ultoa((unsigned long)t, str, 10);
205 uart_putstr_P(PSTR("\r\n"));
209 void testrun_performance_aes192(void){
212 uint8_t key[32], data[16];
222 aes192_init(key, &ctx);
224 uart_putstr_P(PSTR("\r\n\tctx-gen time: "));
225 ultoa((unsigned long)t, str, 10);
230 aes192_enc(data, &ctx);
232 uart_putstr_P(PSTR("\r\n\tencrypt time: "));
233 ultoa((unsigned long)t, str, 10);
238 aes192_dec(data, &ctx);
240 uart_putstr_P(PSTR("\r\n\tdecrypt time: "));
241 ultoa((unsigned long)t, str, 10);
244 uart_putstr_P(PSTR("\r\n"));
248 void testrun_performance_aes256(void){
251 uint8_t key[32], data[16];
261 aes256_init(key, &ctx);
263 uart_putstr_P(PSTR("\r\n\tctx-gen time: "));
264 ultoa((unsigned long)t, str, 10);
269 aes256_enc(data, &ctx);
271 uart_putstr_P(PSTR("\r\n\tencrypt time: "));
272 ultoa((unsigned long)t, str, 10);
277 aes256_dec(data, &ctx);
279 uart_putstr_P(PSTR("\r\n\tdecrypt time: "));
280 ultoa((unsigned long)t, str, 10);
283 uart_putstr_P(PSTR("\r\n"));
286 void testrun_performance_aes(void){
287 uart_putstr_P(PSTR("\r\n -=AES Performance Test=-\r\n"));
288 uart_putstr_P(PSTR("\r\n AES-128\r\n"));
289 testrun_performance_aes128();
290 uart_putstr_P(PSTR("\r\n AES-192\r\n"));
291 testrun_performance_aes192();
292 uart_putstr_P(PSTR("\r\n AES-256\r\n"));
293 testrun_performance_aes256();
295 /*****************************************************************************
297 *****************************************************************************/
304 uart_putstr_P(PSTR("\r\n\r\nCrypto-VS ("));
305 uart_putstr(cipher_name);
306 uart_putstr_P(PSTR(")\r\nloaded and running\r\n"));
308 PGM_P u = PSTR("nessie\0test\0testkey\0performance\0");
309 void_fpt v[] = {testrun_nessie_aes,
312 testrun_performance_aes};
315 if (!getnextwordn(str,20)){DEBUG_S("DBG: W1\r\n"); goto error;}
316 if(execcommand_d0_P(str, u, v)<0){
317 uart_putstr_P(PSTR("\r\nunknown command\r\n"));
321 uart_putstr("ERROR\r\n");