3 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/>.
31 #include "nessie_bc_test.h"
33 #include "performance_test.h"
36 #include "bcal_aes128.h"
37 #include "bcal_aes192.h"
38 #include "bcal_aes256.h"
40 #include "bcal-cfb_byte.h"
41 #include "bcal-cfb_bit.h"
44 #include "bcal-cmac.h"
51 #include <avr/pgmspace.h>
53 char* algo_name = "AES";
55 const bcdesc_t* algolist[] PROGMEM = {
56 (bcdesc_t*)&aes128_desc,
57 (bcdesc_t*)&aes192_desc,
58 (bcdesc_t*)&aes256_desc,
62 /*****************************************************************************
63 * additional validation-functions *
64 *****************************************************************************/
66 void testrun_nessie_aes(void){
67 nessie_bc_ctx.blocksize_B = 16;
68 nessie_bc_ctx.keysize_b = 128;
69 nessie_bc_ctx.name = algo_name;
70 nessie_bc_ctx.ctx_size_B = sizeof(aes128_ctx_t);
71 nessie_bc_ctx.cipher_enc = (nessie_bc_enc_fpt)aes128_enc;
72 nessie_bc_ctx.cipher_dec = (nessie_bc_dec_fpt)aes128_dec;
73 nessie_bc_ctx.cipher_genctx = (nessie_bc_gen_fpt)aes_init;
76 nessie_bc_ctx.keysize_b = 192;
77 nessie_bc_ctx.ctx_size_B = sizeof(aes192_ctx_t);
78 nessie_bc_ctx.cipher_enc = (nessie_bc_enc_fpt)aes192_enc;
79 nessie_bc_ctx.cipher_dec = (nessie_bc_dec_fpt)aes192_dec;
82 nessie_bc_ctx.keysize_b = 256;
83 nessie_bc_ctx.ctx_size_B = sizeof(aes256_ctx_t);
84 nessie_bc_ctx.cipher_enc = (nessie_bc_enc_fpt)aes256_enc;
85 nessie_bc_ctx.cipher_dec = (nessie_bc_dec_fpt)aes256_dec;
89 void testrun_test_aes(void){
90 uint8_t key[16] = { 0x2b, 0x7e, 0x15, 0x16,
91 0x28, 0xae, 0xd2, 0xa6,
92 0xab, 0xf7, 0x15, 0x88,
93 0x09, 0xcf, 0x4f, 0x3c };
94 uint8_t data[16] = { 0x32, 0x43, 0xf6, 0xa8,
95 0x88, 0x5a, 0x30, 0x8d,
96 0x31, 0x31, 0x98, 0xa2,
97 0xe0, 0x37, 0x07, 0x34 };
99 aes128_init(key, &ctx);
100 cli_putstr_P(PSTR("\r\n\r\n cipher test (FIPS 197):\r\n key: "));
101 cli_hexdump(key, 16);
102 cli_putstr_P(PSTR("\r\n plaintext: "));
103 cli_hexdump(data, 16);
104 aes128_enc(data, &ctx);
105 cli_putstr_P(PSTR("\r\n ciphertext: "));
106 cli_hexdump(data, 16);
107 aes128_dec(data, &ctx);
108 cli_putstr_P(PSTR("\r\n plaintext: "));
109 cli_hexdump(data, 16);
110 cli_putstr(PSTR("\r\n testing bcal:"));
111 bcgen_ctx_t bcal_ctx;
113 r = bcal_cipher_init(&aes128_desc, key, 128, &bcal_ctx);
114 cli_putstr_P(PSTR("\r\n init = 0x"));
117 bcal_cipher_enc(data, &bcal_ctx);
118 cli_putstr_P(PSTR("\r\n ciphertext: "));
119 cli_hexdump(data, 16);
120 bcal_cipher_dec(data, &bcal_ctx);
121 cli_putstr_P(PSTR("\r\n plaintext: "));
122 cli_hexdump(data, 16);
123 bcal_cipher_free(&bcal_ctx);
126 void testrun_testkey_aes128(void){
127 uint8_t key[16] = { 0x2b, 0x7e, 0x15, 0x16,
128 0x28, 0xae, 0xd2, 0xa6,
129 0xab, 0xf7, 0x15, 0x88,
130 0x09, 0xcf, 0x4f, 0x3c};
133 aes128_init(key, &ctx);
134 cli_putstr_P(PSTR("\r\n\r\n keyschedule test (FIPS 197):\r\n key: "));
135 cli_hexdump(key, 16);
137 cli_putstr_P(PSTR("\r\n index: "));
140 cli_putstr_P(PSTR(" roundkey "));
141 cli_hexdump(ctx.key[i].ks, 16);
145 void testrun_testkey_aes192(void){
146 uint8_t key[24] = { 0x8e, 0x73, 0xb0, 0xf7,
147 0xda, 0x0e, 0x64, 0x52,
148 0xc8, 0x10, 0xf3, 0x2b,
149 0x80, 0x90, 0x79, 0xe5,
150 0x62, 0xf8, 0xea, 0xd2,
151 0x52, 0x2c, 0x6b, 0x7b};
154 memset(&ctx, 0, sizeof(aes192_ctx_t));
155 aes192_init(key, &ctx);
156 cli_putstr_P(PSTR("\r\n\r\n keyschedule test (FIPS 197):\r\n key: "));
157 cli_hexdump(key, 24);
159 cli_putstr_P(PSTR("\r\n index: "));
162 cli_putstr_P(PSTR(" roundkey "));
163 cli_hexdump(ctx.key[i].ks, 16);
168 void testrun_testkey_aes256(void){
169 uint8_t key[32] = { 0x60, 0x3d, 0xeb, 0x10,
170 0x15, 0xca, 0x71, 0xbe,
171 0x2b, 0x73, 0xae, 0xf0,
172 0x85, 0x7d, 0x77, 0x81,
173 0x1f, 0x35, 0x2c, 0x07,
174 0x3b, 0x61, 0x08, 0xd7,
175 0x2d, 0x98, 0x10, 0xa3,
176 0x09, 0x14, 0xdf, 0xf4};
179 memset(&ctx, 0, sizeof(aes256_ctx_t));
180 aes256_init(key, &ctx);
181 cli_putstr_P(PSTR("\r\n\r\n keyschedule test (FIPS 197):\r\n key: "));
182 cli_hexdump(key, 32);
184 cli_putstr_P(PSTR("\r\n index: "));
187 cli_putstr_P(PSTR(" roundkey "));
188 cli_hexdump(ctx.key[i].ks, 16);
192 void testrun_testkey_aes(void){
193 testrun_testkey_aes128();
194 testrun_testkey_aes192();
195 testrun_testkey_aes256();
198 uint8_t modes_key[] PROGMEM = {
199 0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6,
200 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c,
201 0x1f, 0x35, 0x2c, 0x07, 0x3b, 0x61, 0x08, 0xd7,
202 0x2d, 0x98, 0x10, 0xa3, 0x09, 0x14, 0xdf, 0xf4
204 uint8_t modes_iv[] PROGMEM = {
205 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
206 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
209 uint8_t modes_ctriv[] PROGMEM = {
210 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
211 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
214 uint8_t modes_plain[] PROGMEM = {
215 0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96,
216 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a,
218 0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c,
219 0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51,
221 0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11,
222 0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef,
224 0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17,
225 0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10
229 void testrun_aes128_cbc(void){
237 memcpy_P(key, modes_key, 16);
238 memcpy_P(iv, modes_iv, 16);
239 memcpy_P(plain, modes_plain, 64);
241 cli_putstr_P(PSTR("\r\n** AES128-CBC-TEST **"));
242 r = bcal_cbc_init(&aes128_desc, key, 128, &ctx);
243 cli_putstr_P(PSTR("\r\n init = 0x"));
245 cli_putstr_P(PSTR("\r\n key: "));
246 cli_hexdump(key, 128/8);
247 cli_putstr_P(PSTR("\r\n IV: "));
248 cli_hexdump(iv, 128/8);
249 cli_putstr_P(PSTR("\r\n plaintext:"));
250 cli_hexdump_block(plain, 4*128/8, 4, 16);
253 bcal_cbc_encMsg(iv, plain, 4, &ctx);
254 cli_putstr_P(PSTR("\r\n ciphertext: "));
255 cli_hexdump_block(plain, 4*128/8, 4, 16);
256 bcal_cbc_decMsg(iv, plain, 4, &ctx);
257 cli_putstr_P(PSTR("\r\n plaintext: "));
258 cli_hexdump_block(plain, 4*128/8, 4, 16);
262 void testrun_aes128_cfb8(void){
267 bcal_cfb_B_ctx_t ctx;
270 memcpy_P(key, modes_key, 16);
271 memcpy_P(iv, modes_iv, 16);
272 memcpy_P(plain, modes_plain, 64);
274 cli_putstr_P(PSTR("\r\n** AES128-CFB8-TEST **"));
275 r = bcal_cfb_B_init(&aes128_desc, key, 128, 8, &ctx);
276 cli_putstr_P(PSTR("\r\n init = 0x"));
278 cli_putstr_P(PSTR("\r\n key: "));
279 cli_hexdump(key, 128/8);
280 cli_putstr_P(PSTR("\r\n IV: "));
281 cli_hexdump(iv, 128/8);
282 cli_putstr_P(PSTR("\r\n plaintext:"));
283 cli_hexdump_block(plain, 4*128/8, 4, 16);
286 bcal_cfb_B_encMsg(iv, plain, 64, &ctx);
287 cli_putstr_P(PSTR("\r\n ciphertext: "));
288 cli_hexdump_block(plain, 64, 4, 16);
290 bcal_cfb_B_decMsg(iv, plain, 64, &ctx);
291 cli_putstr_P(PSTR("\r\n plaintext: "));
292 cli_hexdump_block(plain, 64, 4, 16);
294 bcal_cfb_B_free(&ctx);
298 void testrun_aes128_cfb1(void){
303 bcal_cfb_b_ctx_t ctx;
306 memcpy_P(key, modes_key, 16);
307 memcpy_P(iv, modes_iv, 16);
308 memcpy_P(plain, modes_plain, 64);
310 cli_putstr_P(PSTR("\r\n** AES128-CFB1-TEST **"));
311 r = bcal_cfb_b_init(&aes128_desc, key, 128, 1, &ctx);
312 cli_putstr_P(PSTR("\r\n init = 0x"));
314 cli_putstr_P(PSTR("\r\n key: "));
315 cli_hexdump(key, 128/8);
316 cli_putstr_P(PSTR("\r\n IV: "));
317 cli_hexdump(iv, 128/8);
318 cli_putstr_P(PSTR("\r\n plaintext:"));
319 cli_hexdump_block(plain, 2, 4, 16);
322 uint8_t i, bit_offset, byte_offset;
323 bcal_cfb_b_loadIV(iv, &ctx);
327 cli_putstr_P(PSTR("\r\n plain bit: "));
328 cli_putc((plain[byte_offset]&(1<<(7-bit_offset)))?'1':'0');
329 bcal_cfb_b_encNext(plain+byte_offset, bit_offset, &ctx);
330 cli_putstr_P(PSTR("\r\n cipher bit: "));
331 cli_putc((plain[byte_offset]&(1<<(7-bit_offset)))?'1':'0');
333 cli_putstr_P(PSTR("\r\n ciphertext: "));
334 cli_hexdump_block(plain, 2, 4, 16);
336 bcal_cfb_b_loadIV(iv, &ctx);
340 cli_putstr_P(PSTR("\r\n plain bit: "));
341 cli_putc((plain[byte_offset]&(1<<(7-bit_offset)))?'1':'0');
342 bcal_cfb_b_decNext(plain+byte_offset, bit_offset, &ctx);
343 cli_putstr_P(PSTR("\r\n cipher bit: "));
344 cli_putc((plain[byte_offset]&(1<<(7-bit_offset)))?'1':'0');
346 cli_putstr_P(PSTR("\r\n plaintext: "));
347 cli_hexdump_block(plain, 2, 4, 16);
350 bcal_cfb_b_encMsg(iv, plain, 0, 64*8, &ctx);
351 cli_putstr_P(PSTR("\r\n ciphertext: "));
352 cli_hexdump_block(plain, 64, 4, 16);
354 bcal_cfb_b_decMsg(iv, plain, 0, 64*8, &ctx);
355 cli_putstr_P(PSTR("\r\n plaintext: "));
356 cli_hexdump_block(plain, 64, 4, 16);
358 bcal_cfb_b_free(&ctx);
361 void testrun_aes128_ofb(void){
369 memcpy_P(key, modes_key, 16);
370 memcpy_P(iv, modes_iv, 16);
371 memcpy_P(plain, modes_plain, 64);
373 cli_putstr_P(PSTR("\r\n** AES128-OFB-TEST **"));
374 r = bcal_ofb_init(&aes128_desc, key, 128, &ctx);
375 cli_putstr_P(PSTR("\r\n init = 0x"));
377 cli_putstr_P(PSTR("\r\n key: "));
378 cli_hexdump(key, 128/8);
379 cli_putstr_P(PSTR("\r\n IV: "));
380 cli_hexdump(iv, 128/8);
381 cli_putstr_P(PSTR("\r\n plaintext:"));
382 cli_hexdump_block(plain, 4*128/8, 4, 16);
385 bcal_ofb_encMsg(iv, plain, 4*128, &ctx);
386 cli_putstr_P(PSTR("\r\n ciphertext: "));
387 cli_hexdump_block(plain, 4*128/8, 4, 16);
388 bcal_ofb_decMsg(iv, plain, 4*128, &ctx);
389 cli_putstr_P(PSTR("\r\n plaintext: "));
390 cli_hexdump_block(plain, 4*128/8, 4, 16);
394 void testrun_aes128_ctr(void){
402 memcpy_P(key, modes_key, 16);
403 memcpy_P(iv, modes_ctriv, 16);
404 memcpy_P(plain, modes_plain, 64);
406 cli_putstr_P(PSTR("\r\n** AES128-CTR-TEST **"));
407 r = bcal_ctr_init(&aes128_desc, key, 128, NULL, &ctx);
408 cli_putstr_P(PSTR("\r\n init = 0x"));
410 cli_putstr_P(PSTR("\r\n key: "));
411 cli_hexdump(key, 128/8);
412 cli_putstr_P(PSTR("\r\n IV: "));
413 cli_hexdump(iv, 128/8);
414 cli_putstr_P(PSTR("\r\n plaintext:"));
415 cli_hexdump_block(plain, 4*128/8, 4, 16);
418 bcal_ctr_encMsg(iv, plain, 4*128, &ctx);
419 cli_putstr_P(PSTR("\r\n ciphertext: "));
420 cli_hexdump_block(plain, 4*128/8, 4, 16);
421 bcal_ctr_decMsg(iv, plain, 4*128, &ctx);
422 cli_putstr_P(PSTR("\r\n plaintext: "));
423 cli_hexdump_block(plain, 4*128/8, 4, 16);
427 void testrun_aes128_cmac(void){
431 uint16_t length[] = { 0, 128, 320, 512 };
435 memcpy_P(key, modes_key, 16);
436 memcpy_P(plain, modes_plain, 64);
438 cli_putstr_P(PSTR("\r\n** AES128-CMAC-TEST **"));
440 cli_putstr_P(PSTR("\r\n key: "));
441 cli_hexdump(key, 128/8);
443 r = bcal_cmac_init(&aes128_desc, key, 128, &ctx);
444 cli_putstr_P(PSTR("\r\n init = 0x"));
446 cli_putstr_P(PSTR("\r\n message: "));
447 cli_hexdump_block(plain, length[i]/8, 4, 16);
450 bcal_cmac(tag, 128, plain, length[i], &ctx);
451 cli_putstr_P(PSTR("\r\n tag: "));
452 cli_hexdump_block(tag, 128/8, 4, 16);
453 bcal_cmac_free(&ctx);
460 Key = 3250974e306b4b678f914b514d1e90f6
461 Msg = cf132fd4ebc25fd3866f1a95a6193a1a9cdf
463 void testrun_aes128_cmac72(void){
465 0x32, 0x50, 0x97, 0x4e, 0x30, 0x6b, 0x4b, 0x67,
466 0x8f, 0x91, 0x4b, 0x51, 0x4d, 0x1e, 0x90, 0xf6
469 uint8_t plain[18] = {
470 0xcf, 0x13, 0x2f, 0xd4, 0xeb, 0xc2, 0x5f, 0xd3,
471 0x86, 0x6f, 0x1a, 0x95, 0xa6, 0x19, 0x3a, 0x1a,
478 cli_putstr_P(PSTR("\r\n** AES128-CMAC-72-TEST **"));
480 cli_putstr_P(PSTR("\r\n key: "));
481 cli_hexdump(key, 128/8);
482 r = bcal_cmac_init(&aes128_desc, key, 128, &ctx);
483 cli_putstr_P(PSTR("\r\n init = 0x"));
485 cli_putstr_P(PSTR("\r\n message: "));
486 cli_hexdump_block(plain, 18, 4, 16);
489 bcal_cmac(tag, 16, plain, 18*8, &ctx);
490 cli_putstr_P(PSTR("\r\n tag: "));
491 cli_hexdump_block(tag, 2, 4, 16);
492 bcal_cmac_free(&ctx);
499 Key = 2b2aaa666be161ed16648e862ac9bd1e317f71bc69e268b5
502 void testrun_aes192_cmac0(void){
504 0x2b, 0x2a, 0xaa, 0x66, 0x6b, 0xe1, 0x61, 0xed,
505 0x16, 0x64, 0x8e, 0x86, 0x2a, 0xc9, 0xbd, 0x1e,
506 0x31, 0x7f, 0x71, 0xbc, 0x69, 0xe2, 0x68, 0xb5
516 cli_putstr_P(PSTR("\r\n** AES192-CMAC-0-TEST **"));
518 cli_putstr_P(PSTR("\r\n key: "));
519 cli_hexdump(key, 192/8);
520 r = bcal_cmac_init(&aes192_desc, key, 192, &ctx);
521 cli_putstr_P(PSTR("\r\n init = 0x"));
525 bcal_cmac(tag, 16, plain, 0*8, &ctx);
526 cli_putstr_P(PSTR("\r\n tag: "));
527 cli_hexdump_block(tag, 2, 4, 16);
528 bcal_cmac_free(&ctx);
532 KEY: 233952DEE4D5ED5F9B9C6D6FF80FF478
533 NONCE: 62EC67F9C3A4A407FCB2A8C49031A8B3
534 HEADER: 6BFB914FD07EAE6B
535 CIPHER: E037830E8389F27B025A2D6527E79D01
538 void testrun_aes128_eax(void){
540 0x23, 0x39, 0x52, 0xDE, 0xE4, 0xD5, 0xED, 0x5F,
541 0x9B, 0x9C, 0x6D, 0x6F, 0xF8, 0x0F, 0xF4, 0x78
543 uint8_t nonce[16] = {
544 0x62, 0xEC, 0x67, 0xF9, 0xC3, 0xA4, 0xA4, 0x07,
545 0xFC, 0xB2, 0xA8, 0xC4, 0x90, 0x31, 0xA8, 0xB3
547 uint8_t header[8] = {
548 0x6B, 0xFB, 0x91, 0x4F, 0xD0, 0x7E, 0xAE, 0x6B
556 cli_putstr_P(PSTR("\r\n** AES128-EAX-TEST **"));
558 cli_putstr_P(PSTR("\r\n key: "));
559 cli_hexdump(key, 16);
560 cli_putstr_P(PSTR("\r\n nonce: "));
561 cli_hexdump(nonce, 16);
562 cli_putstr_P(PSTR("\r\n header: "));
563 cli_hexdump(header, 8);
564 r = bcal_eax_init(&aes128_desc, key, 128, &ctx);
565 cli_putstr_P(PSTR("\r\n init = 0x"));
569 bcal_eax_loadNonce(nonce, 16*8, &ctx);
570 bcal_eax_addLastHeader(header, 8*8, &ctx);
571 bcal_eax_encLastBlock(NULL, 0, &ctx);
572 bcal_eax_ctx2tag(tag, 128, &ctx);
573 cli_putstr_P(PSTR("\r\n tag: "));
574 cli_hexdump_block(tag, 16, 4, 16);
580 KEY: 91945D3F4DCBEE0BF45EF52255F095A4
581 NONCE: BECAF043B0A23D843194BA972C66DEBD
582 HEADER: FA3BFD4806EB53FA
585 void testrun_aes128_eax2(void){
587 0x91, 0x94, 0x5D, 0x3F, 0x4D, 0xCB, 0xEE, 0x0B,
588 0xF4, 0x5E, 0xF5, 0x22, 0x55, 0xF0, 0x95, 0xA4,
590 uint8_t msg[2] = { 0xF7, 0xFB };
591 uint8_t nonce[16] = {
592 0xBE, 0xCA, 0xF0, 0x43, 0xB0, 0xA2, 0x3D, 0x84,
593 0x31, 0x94, 0xBA, 0x97, 0x2C, 0x66, 0xDE, 0xBD,
595 uint8_t header[8] = {
596 0xFA, 0x3B, 0xFD, 0x48, 0x06, 0xEB, 0x53, 0xFA
604 cli_putstr_P(PSTR("\r\n** AES128-EAX2-TEST **"));
606 cli_putstr_P(PSTR("\r\n key: "));
607 cli_hexdump(key, 16);
608 cli_putstr_P(PSTR("\r\n msg: "));
610 cli_putstr_P(PSTR("\r\n nonce: "));
611 cli_hexdump(nonce, 16);
612 cli_putstr_P(PSTR("\r\n header: "));
613 cli_hexdump(header, 8);
614 r = bcal_eax_init(&aes128_desc, key, 128, &ctx);
615 cli_putstr_P(PSTR("\r\n init = 0x"));
619 bcal_eax_loadNonce(nonce, 16*8, &ctx);
620 bcal_eax_addLastHeader(header, 8*8, &ctx);
621 bcal_eax_encLastBlock(msg, 2*8, &ctx);
622 bcal_eax_ctx2tag(tag, 128, &ctx);
623 cli_putstr_P(PSTR("\r\n cipher: "));
624 cli_hexdump_block(msg, 2, 4, 16);
625 cli_putstr_P(PSTR("\r\n tag: "));
626 cli_hexdump_block(tag, 16, 4, 16);
631 KEY: 01F74AD64077F2E704C0F60ADA3DD523
632 NONCE: 70C3DB4F0D26368400A10ED05D2BFF5E
633 HEADER: 234A3463C1264AC6
636 void testrun_aes128_eax3(void){
638 0x01, 0xF7, 0x4A, 0xD6, 0x40, 0x77, 0xF2, 0xE7,
639 0x04, 0xC0, 0xF6, 0x0A, 0xDA, 0x3D, 0xD5, 0x23
642 0x1A, 0x47, 0xCB, 0x49, 0x33
644 uint8_t nonce[16] = {
645 0x70, 0xC3, 0xDB, 0x4F, 0x0D, 0x26, 0x36, 0x84,
646 0x00, 0xA1, 0x0E, 0xD0, 0x5D, 0x2B, 0xFF, 0x5E
648 uint8_t header[8] = {
649 0x23, 0x4A, 0x34, 0x63, 0xC1, 0x26, 0x4A, 0xC6
657 cli_putstr_P(PSTR("\r\n** AES128-EAX3-TEST **"));
659 cli_putstr_P(PSTR("\r\n key: "));
660 cli_hexdump(key, 16);
661 cli_putstr_P(PSTR("\r\n msg: "));
663 cli_putstr_P(PSTR("\r\n nonce: "));
664 cli_hexdump(nonce, 16);
665 cli_putstr_P(PSTR("\r\n header: "));
666 cli_hexdump(header, 8);
667 r = bcal_eax_init(&aes128_desc, key, 128, &ctx);
668 cli_putstr_P(PSTR("\r\n init = 0x"));
672 bcal_eax_loadNonce(nonce, 16*8, &ctx);
673 bcal_eax_addLastHeader(header, 8*8, &ctx);
674 bcal_eax_encLastBlock(msg, 5*8, &ctx);
675 bcal_eax_ctx2tag(tag, 128, &ctx);
676 cli_putstr_P(PSTR("\r\n cipher: "));
677 cli_hexdump_block(msg, 5, 4, 16);
678 cli_putstr_P(PSTR("\r\n tag: "));
679 cli_hexdump_block(tag, 16, 4, 16);
683 /*****************************************************************************/
685 void testrun_performance_aes128(void){
688 uint8_t key[32], data[16];
698 aes128_init(key, &ctx);
700 cli_putstr_P(PSTR("\r\n\tctx-gen time: "));
701 ultoa((unsigned long)t, str, 10);
706 aes128_enc(data, &ctx);
708 cli_putstr_P(PSTR("\r\n\tencrypt time: "));
709 ultoa((unsigned long)t, str, 10);
714 aes128_dec(data, &ctx);
716 cli_putstr_P(PSTR("\r\n\tdecrypt time: "));
717 ultoa((unsigned long)t, str, 10);
720 cli_putstr_P(PSTR("\r\n"));
724 void testrun_performance_aes192(void){
727 uint8_t key[32], data[16];
737 aes192_init(key, &ctx);
739 cli_putstr_P(PSTR("\r\n\tctx-gen time: "));
740 ultoa((unsigned long)t, str, 10);
745 aes192_enc(data, &ctx);
747 cli_putstr_P(PSTR("\r\n\tencrypt time: "));
748 ultoa((unsigned long)t, str, 10);
753 aes192_dec(data, &ctx);
755 cli_putstr_P(PSTR("\r\n\tdecrypt time: "));
756 ultoa((unsigned long)t, str, 10);
759 cli_putstr_P(PSTR("\r\n"));
763 void testrun_performance_aes256(void){
766 uint8_t key[32], data[16];
776 aes256_init(key, &ctx);
778 cli_putstr_P(PSTR("\r\n\tctx-gen time: "));
779 ultoa((unsigned long)t, str, 10);
784 aes256_enc(data, &ctx);
786 cli_putstr_P(PSTR("\r\n\tencrypt time: "));
787 ultoa((unsigned long)t, str, 10);
792 aes256_dec(data, &ctx);
794 cli_putstr_P(PSTR("\r\n\tdecrypt time: "));
795 ultoa((unsigned long)t, str, 10);
798 cli_putstr_P(PSTR("\r\n"));
801 void testrun_performance_aes(void){
802 cli_putstr_P(PSTR("\r\n -=AES Performance Test=-\r\n"));
803 cli_putstr_P(PSTR("\r\n AES-128\r\n"));
804 testrun_performance_aes128();
805 cli_putstr_P(PSTR("\r\n AES-192\r\n"));
806 testrun_performance_aes192();
807 cli_putstr_P(PSTR("\r\n AES-256\r\n"));
808 testrun_performance_aes256();
810 /*****************************************************************************
812 *****************************************************************************/
814 const char nessie_str[] PROGMEM = "nessie";
815 const char test_str[] PROGMEM = "test";
816 const char testkey_str[] PROGMEM = "testkey";
817 const char testcbc_str[] PROGMEM = "testcbc";
818 const char testcfb8_str[] PROGMEM = "testcfb8";
819 const char testcfb1_str[] PROGMEM = "testcfb1";
820 const char testofb_str[] PROGMEM = "testofb";
821 const char testctr_str[] PROGMEM = "testctr";
822 const char testcmac_str[] PROGMEM = "testcmac";
823 const char testcmac72_str[] PROGMEM = "testcmac72";
824 const char testcmac0_str[] PROGMEM = "testcmac0";
825 const char testeax_str[] PROGMEM = "testeax";
826 const char testeax2_str[] PROGMEM = "testeax2";
827 const char testeax3_str[] PROGMEM = "testeax3";
828 const char cmacvs_list_str[] PROGMEM = "cmacvs_list";
829 const char cmacvs_set_str[] PROGMEM = "cmacvs_set";
830 const char cmacvs_test1_str[] PROGMEM = "cmacvs_test1";
831 const char cmacvs_test2_str[] PROGMEM = "cmacvs_test2";
832 const char performance_str[] PROGMEM = "performance";
833 const char dump_str[] PROGMEM = "dump";
834 const char echo_str[] PROGMEM = "echo";
836 cmdlist_entry_t cmdlist[] PROGMEM = {
837 { nessie_str, NULL, testrun_nessie_aes },
838 { test_str, NULL, testrun_test_aes },
839 { testkey_str, NULL, testrun_testkey_aes },
840 { testcbc_str, NULL, testrun_aes128_cbc },
841 { testcfb8_str, NULL, testrun_aes128_cfb8 },
842 { testcfb1_str, NULL, testrun_aes128_cfb1 },
843 { testofb_str, NULL, testrun_aes128_ofb },
844 { testctr_str, NULL, testrun_aes128_ctr },
845 { testcmac_str, NULL, testrun_aes128_cmac },
846 { testcmac72_str, NULL, testrun_aes128_cmac72 },
847 { testcmac0_str, NULL, testrun_aes192_cmac0 },
848 { testeax_str, NULL, testrun_aes128_eax },
849 { testeax2_str, NULL, testrun_aes128_eax2 },
850 { testeax3_str, NULL, testrun_aes128_eax3 },
851 { cmacvs_list_str, NULL, cmacvs_listalgos },
852 { cmacvs_set_str, (void*)1, (void_fpt)cmacvs_setalgo },
853 { cmacvs_test1_str, NULL, cmacvs_test1 },
854 { cmacvs_test2_str, NULL, cmacvs_test2 },
855 { performance_str, NULL, testrun_performance_aes },
856 { dump_str, (void*)1, (void_fpt)dump },
857 { echo_str, (void*)1, (void_fpt)echo_ctrl },
865 cli_rx = (cli_rx_fpt)uart0_getc;
866 cli_tx = (cli_tx_fpt)uart0_putc;
867 cmacvs_algolist=(bcdesc_t**)algolist;
868 cmacvs_algo=(bcdesc_t*)&aes128_desc;
870 cli_putstr_P(PSTR("\r\n\r\nCrypto-VS ("));
871 cli_putstr(algo_name);
872 cli_putstr_P(PSTR(")\r\nloaded and running\r\n"));
873 cmd_interface(cmdlist);