1 /* main-bigint-test.c */
3 This file is part of the AVR-Crypto-Lib.
4 Copyright (C) 2008, 2009, 2010 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/>.
29 #include "uart_lowlevel.h"
34 #include "noekeon_prng.h"
36 #include "bigint_io.h"
38 #include "performance_test.h"
44 char* algo_name = "BigInt";
46 void uart0_putc(char byte){
47 uart_putc(UART_0, byte);
50 char uart0_getc(void){
51 return uart_getc(UART_0);
54 /*****************************************************************************
55 * additional validation-functions *
56 *****************************************************************************/
57 void test_echo_bigint(void){
59 cli_putstr("\r\necho test\r\n");
61 cli_putstr("\r\nenter hex number:");
62 if(bigint_read_hex_echo(&a)){
63 cli_putstr("\r\n end echo test");
66 cli_putstr("\r\necho: ");
73 void test_add_bigint(void){
75 cli_putstr("\r\nadd test\r\n");
77 cli_putstr("\r\nenter a:");
78 if(bigint_read_hex_echo(&a)){
79 cli_putstr("\r\n end add test");
82 cli_putstr("\r\nenter b:");
83 if(bigint_read_hex_echo(&b)){
85 cli_putstr("\r\n end add test");
94 c_b = malloc(((a.length_B>b.length_B)?a.length_B:b.length_B)*sizeof(bigint_word_t)+8);
96 cli_putstr("\n\rERROR: Out of memory!");
102 bigint_add_s(&c, &a, &b);
103 bigint_print_hex(&c);
111 void test_add_scale_bigint(void){
114 cli_putstr("\r\nadd-scale test\r\n");
116 cli_putstr("\r\nenter a:");
117 if(bigint_read_hex_echo(&a)){
118 cli_putstr("\r\n end add test");
121 cli_putstr("\r\nenter b:");
122 if(bigint_read_hex_echo(&b)){
123 cli_putstr("\r\n end add test");
126 cli_putstr("\r\nenter scale:");
129 cli_getsn_cecho(str, 7);
133 if(bigint_read_hex_echo(&scale)){
135 cli_putstr("\r\n end add test");
140 bigint_print_hex(&a);
142 bigint_print_hex(&b);
144 cli_hexdump_rev(&scale, 2);
147 c_b = malloc(((a.length_B>(b.length_B+scale))?a.length_B:(b.length_B+scale))*sizeof(bigint_word_t)+8);
149 cli_putstr("\n\rERROR: Out of memory!");
156 bigint_add_scale_u(&c, &b, scale);
157 bigint_print_hex(&c);
165 void test_mul_bigint(void){
167 cli_putstr("\r\nmul test\r\n");
169 cli_putstr("\r\nenter a:");
170 if(bigint_read_hex_echo(&a)){
171 cli_putstr("\r\n end mul test");
174 cli_putstr("\r\nenter b:");
175 if(bigint_read_hex_echo(&b)){
177 cli_putstr("\r\n end mul test");
181 bigint_print_hex(&a);
183 bigint_print_hex(&b);
186 c_b = malloc((((a.length_B>b.length_B)?a.length_B:b.length_B)+1)*2*sizeof(bigint_word_t));
188 cli_putstr("\n\rERROR: Out of memory!");
194 bigint_mul_s(&c, &a, &b);
195 bigint_print_hex(&c);
203 void test_square_bigint(void){
205 cli_putstr("\r\nsquare test\r\n");
207 cli_putstr("\r\nenter a:");
208 if(bigint_read_hex_echo(&a)){
209 cli_putstr("\r\n end square test");
213 bigint_print_hex(&a);
214 cli_putstr("**2 = ");
216 c_b = malloc(a.length_B*2*sizeof(bigint_word_t));
218 cli_putstr("\n\rERROR: Out of memory!");
223 bigint_square(&c, &a);
224 bigint_print_hex(&c);
231 void test_reduce_bigint(void){
233 cli_putstr("\r\nreduce test\r\n");
235 cli_putstr("\r\nenter a:");
236 if(bigint_read_hex_echo(&a)){
237 cli_putstr("\r\n end reduce test");
240 cli_putstr("\r\nenter b:");
241 if(bigint_read_hex_echo(&b)){
243 cli_putstr("\r\n end reduce test");
247 bigint_print_hex(&a);
249 bigint_print_hex(&b);
251 bigint_reduce(&a, &b);
252 bigint_print_hex(&a);
259 void test_expmod_bigint(void){
262 cli_putstr("\r\nreduce test\r\n");
264 cli_putstr("\r\nenter a:");
265 if(bigint_read_hex_echo(&a)){
266 cli_putstr("\r\n end expmod test");
269 cli_putstr("\r\nenter b:");
270 if(bigint_read_hex_echo(&b)){
272 cli_putstr("\r\n end expmod test");
275 cli_putstr("\r\nenter c:");
276 if(bigint_read_hex_echo(&c)){
279 cli_putstr("\r\n end expmod test");
282 d_b = malloc(c.length_B*sizeof(bigint_word_t));
284 cli_putstr("\n\rERROR: Out of memory!");
292 bigint_print_hex(&a);
294 bigint_print_hex(&b);
296 bigint_print_hex(&c);
298 bigint_expmod_u(&d, &a, &b, &c);
299 bigint_print_hex(&d);
309 void test_gcdext_bigint(void){
310 bigint_t a, b, c, d, e;
311 cli_putstr("\r\ngcdext test\r\n");
313 cli_putstr("\r\nenter a:");
314 if(bigint_read_hex_echo(&a)){
315 cli_putstr("\r\n end gcdext test");
318 cli_putstr("\r\nenter b:");
319 if(bigint_read_hex_echo(&b)){
321 cli_putstr("\r\n end gcdext test");
324 c.wordv = malloc(((a.length_B<b.length_B)?a.length_B:b.length_B)*sizeof(bigint_word_t));
325 d.wordv = malloc((1+(a.length_B>b.length_B)?a.length_B:b.length_B)*sizeof(bigint_word_t));
326 e.wordv = malloc((1+(a.length_B>b.length_B)?a.length_B:b.length_B)*sizeof(bigint_word_t));
328 cli_putstr("\r\n gcdext( ");
329 bigint_print_hex(&a);
331 bigint_print_hex(&b);
333 bigint_gcdext(&c, &d, &e, &a, &b);
335 bigint_print_hex(&d);
336 cli_putstr("; b = ");
337 bigint_print_hex(&e);
338 cli_putstr("; gcd = ");
339 bigint_print_hex(&c);
350 void test_simple(void){
352 bigint_word_t a_b[1], b_b[1], c_b[2];
360 bigint_add_u(&c, &a, &b);
361 cli_putstr("\r\n 1+2=");
362 bigint_print_hex(&c);
365 void test_mul_simple(void){
367 uint8_t a_b[5] = {0x79, 0x36, 0x9e, 0x72, 0xec};
368 uint8_t b_b[5] = {0x4a, 0x47, 0x0d, 0xec, 0xfd};
377 bigint_mul_s(&c, &a, &b);
378 cli_putstr("\r\n test: ");
379 bigint_print_hex(&c);
383 // -3d1d 6db7 8251 f371 * -7a18 3791 d18b b7c5 = 1d25ce4fdf93390f8d6c709f4d711cf5
384 // -20538248dece6d29068d * 400b1411b874f81394c6 = -81646b193d95136a6fedb73cee6d30c39fb950e
385 // -BC8B 7D53 4921 853D * 0DDA 6044 00CE DDE6 = -a33eb0c5847db8837589c22db395dce
386 void test_mul_simple(void){
389 // uint8_t a_b[10] = {0x8d, 0x06, 0x29, 0x6d, 0xce, 0xde, 0x48, 0x82, 0x53, 0x20};
390 // uint8_t b_b[10] = {0xc6, 0x94, 0x13, 0xf8, 0x74, 0xb8, 0x11, 0x14, 0x0b, 0x40};
391 uint8_t a_b[8] = {0x3d, 0x85, 0x21, 0x49, 0x53, 0x7d, 0x8b, 0xbc};
392 uint8_t b_b[8] = {0xe6, 0xdd, 0xce, 0x00, 0x44, 0x60, 0xda, 0x0d};
395 a.wordv=(bigint_word_t*)a_b;
396 b.wordv=(bigint_word_t*)b_b;
397 c.wordv=(bigint_word_t*)c_b;
398 a.length_B = 8/sizeof(bigint_word_t);
399 b.length_B = 8/sizeof(bigint_word_t);
403 bigint_mul_s(&c, &a, &b);
404 cli_putstr("\r\n test: ");
405 bigint_print_hex(&a);
407 bigint_print_hex(&b);
409 bigint_print_hex(&c);
412 // f4 b86a 2220 0774 437d 70e6 **2 = e9f00f29ca1c876a7a682bd1e04f6925caffd6660ea4
414 uint8_t square_test_data[] PROGMEM = {
415 0xA0, 0x3C, 0x23, 0x9F, 0x7A, 0xFC, 0x60, 0xEB, 0x96, 0xC2, 0xA8, 0xAC, 0xC3, 0xC9, 0x9E, 0xEC,
416 0x4A, 0xF0, 0x1C, 0xB2, 0x36, 0x68, 0xD6, 0x4D, 0x3E, 0x4F, 0x8E, 0x55, 0xEA, 0x52, 0x46, 0x68,
417 0x6E, 0x18, 0x88, 0x37, 0x03, 0x70, 0xBD, 0x01, 0x60, 0xE2, 0xD6, 0x12, 0xA0, 0x0E, 0xD2, 0x72,
418 0x0D, 0x9D, 0x9F, 0x03, 0xC5, 0x81, 0xCA, 0x6E, 0x88, 0x1E, 0xF5, 0xD8, 0x14, 0x15, 0x30, 0xEB,
419 0x28, 0x7C, 0x80, 0x07, 0x34, 0x05, 0x5D, 0xAA, 0xDC, 0xA8, 0xAA, 0x88, 0xC5, 0xE5, 0xC9, 0xFE,
420 0x9C, 0xA1, 0xCE, 0xC2, 0x09, 0x0D, 0xC4, 0xC8, 0xD3, 0xE7, 0x3A, 0xF3, 0xEF, 0xDF, 0xAE, 0x07,
421 0xEC, 0xC7, 0x83, 0x50, 0x9F, 0x6D, 0xB9, 0x28, 0x77, 0xC0, 0xFE, 0x69, 0xB2, 0x2E, 0x55, 0x90,
422 0x50, 0xED, 0xE0, 0xA1, 0x4D, 0x3D, 0x38, 0xC9, 0x0E, 0xCD, 0x04, 0x3B, 0x64, 0x3F, 0x56, 0xC5,
423 0xC3, 0x9E, 0x89, 0x81, 0x44, 0x60, 0xBA, 0x8E, 0x88, 0xA4, 0xA3, 0x42, 0x7B, 0x06, 0x93, 0x1C,
424 0x6B, 0x04, 0x29, 0xF9, 0xDD, 0xFF, 0xB0, 0x48, 0x2F, 0x6D, 0xD1, 0x0F, 0x7D, 0xA6, 0x26, 0xD8,
425 0xEF, 0x5E, 0x04, 0x18, 0xD1, 0x61, 0x46, 0x37, 0x87, 0xE2, 0x97, 0xDF, 0x10, 0xB4, 0x9A, 0x39,
426 0xB1, 0xD0, 0xCA, 0x91, 0x48, 0x1E, 0x5D, 0xA1, 0x38, 0x89, 0x02, 0xC1, 0x49, 0x86, 0xB7, 0xAE,
427 0x69, 0x20, 0xFA, 0x0E, 0x39, 0xDA, 0xA5, 0xEF, 0x7F, 0xB2, 0x81, 0xB8, 0xC0, 0x3A, 0xF8, 0xDB,
428 0xBC, 0x45, 0xF6, 0xDA, 0xCD, 0xBE, 0x27, 0xBE, 0xF6, 0x20, 0x79, 0xF3, 0xC3, 0xC8, 0xFF, 0x85,
429 0x43, 0x9F, 0xB1, 0x9B, 0x72, 0x88, 0xDD, 0xA4, 0x0D, 0xFC, 0xC6, 0xB5, 0x74, 0x67, 0x29, 0xF5
433 void test_square_simple(void){
436 uint8_t a_b[12] = {0xe6, 0x70, 0x7d, 0x43, 0x74, 0x07, 0x20, 0x22, 0x6a, 0xb8, 0xf4, 0x00};
438 a.wordv=(bigint_word_t*)a_b;
439 c.wordv=(bigint_word_t*)c_b;
440 a.length_B = 12/sizeof(bigint_word_t);
443 bigint_square(&c, &a);
444 cli_putstr("\r\n test: ");
445 bigint_print_hex(&a);
446 cli_putstr("**2 = ");
447 bigint_print_hex(&c);
450 // [fail (c)]: A862 % 2752 = 0D1A ; should a862 % 2752 = b1a
451 void test_reduce_simple(void){
454 uint8_t a_b[4] = {0x62, 0xA8, 0x00, 0x00};
455 uint8_t b_b[4] = {0x52, 0x27, 0x00, 0x00};
457 a.wordv=(bigint_word_t*)a_b;
461 b.wordv=(bigint_word_t*)b_b;
465 c.wordv = (bigint_word_t*)c_b;
467 bigint_reduce(&c, &b);
468 cli_putstr("\r\n test: ");
469 bigint_print_hex(&a);
471 bigint_print_hex(&b);
473 bigint_print_hex(&c);
476 /* gcdext( B5DDAD, 6CBBC2) */
477 /* gcdext( CD319349, 9EFD76CC) */
478 /* gcdext( 1609000771, 6FAC577D72) */
480 void test_gcdext_simple(void){
481 bigint_t a, b, c, d, e;
483 uint8_t a_b[8] = {0x71, 0x07, 0x00, 0x09, 0x16, 0x00, 0x00, 0x00};
484 uint8_t b_b[8] = {0x72, 0x7D, 0x57, 0xAC, 0X6F, 0x00, 0x00, 0x00};
485 uint8_t c_b[16], d_b[16], e_b[16];
486 a.wordv=(bigint_word_t*)a_b;
490 b.wordv=(bigint_word_t*)b_b;
494 c.wordv = (bigint_word_t*)c_b;
495 d.wordv = (bigint_word_t*)d_b;
496 e.wordv = (bigint_word_t*)e_b;
497 bigint_gcdext(&c, &d, &e, &a, &b);
498 cli_putstr("\r\n test: gcd( ");
499 bigint_print_hex(&a);
501 bigint_print_hex(&b);
502 cli_putstr(") => a = ");
503 bigint_print_hex(&d);
504 cli_putstr("; b = ");
505 bigint_print_hex(&e);
506 cli_putstr("; gcd = ");
507 bigint_print_hex(&c);
510 void testrun_performance_bigint(void){
513 /*****************************************************************************
515 *****************************************************************************/
517 const char echo_test_str[] = "echo-test";
518 const char add_test_str[] = "add-test";
519 const char add_scale_test_str[] = "add-scale-test";
520 const char mul_test_str[] = "mul-test";
521 const char square_test_str[] = "square-test";
522 const char reduce_test_str[] = "reduce-test";
523 const char expmod_test_str[] = "expmod-test";
524 const char gcdext_test_str[] = "gcdext-test";
525 const char quick_test_str[] = "quick-test";
526 const char performance_str[] = "performance";
527 const char echo_str[] = "echo";
529 const cmdlist_entry_t cmdlist[] = {
530 { add_test_str, NULL, test_add_bigint },
531 { add_scale_test_str, NULL, test_add_scale_bigint },
532 { mul_test_str, NULL, test_mul_bigint },
533 { square_test_str, NULL, test_square_bigint },
534 { reduce_test_str, NULL, test_reduce_bigint },
535 { expmod_test_str, NULL, test_expmod_bigint },
536 { gcdext_test_str, NULL, test_gcdext_bigint },
537 { quick_test_str, NULL, test_gcdext_simple },
538 { echo_test_str, NULL, test_echo_bigint },
539 { performance_str, NULL, testrun_performance_bigint },
540 { echo_str, (void*)1, (void_fpt)echo_ctrl },
545 sysclk_set_freq(SYS_FREQ);
546 sysclk_mosc_verify_enable();
547 uart_init(UART_0, 115200, 8, UART_PARATY_NONE, UART_STOPBITS_ONE);
548 gptm_set_timer_32periodic(TIMER0);
554 cli_putstr("\r\n\r\nARM-Crypto-Lib VS (");
555 cli_putstr(algo_name);
557 cli_putstr(__DATE__);
559 cli_putstr(__TIME__);
560 cli_putstr(")\r\nloaded and running\r\n");
561 cmd_interface(cmdlist);