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/>.
30 #include "noekeon_prng.h"
32 #include "bigint_io.h"
35 #include "performance_test.h"
41 char* algo_name = "BigInt";
43 /*****************************************************************************
44 * additional validation-functions *
45 *****************************************************************************/
46 void test_echo_bigint(void){
48 cli_putstr_P(PSTR("\r\necho test\r\n"));
50 cli_putstr_P(PSTR("\r\nenter hex number:"));
51 if(bigint_read_hex_echo(&a)){
52 cli_putstr_P(PSTR("\r\n end echo test"));
55 cli_putstr_P(PSTR("\r\necho: "));
57 cli_putstr_P(PSTR("\r\n"));
62 void test_add_bigint(void){
64 cli_putstr_P(PSTR("\r\nadd test\r\n"));
66 cli_putstr_P(PSTR("\r\nenter a:"));
67 if(bigint_read_hex_echo(&a)){
68 cli_putstr_P(PSTR("\r\n end add test"));
71 cli_putstr_P(PSTR("\r\nenter b:"));
72 if(bigint_read_hex_echo(&b)){
74 cli_putstr_P(PSTR("\r\n end add test"));
77 cli_putstr_P(PSTR("\r\n "));
79 cli_putstr_P(PSTR(" + "));
81 cli_putstr_P(PSTR(" = "));
83 c_b = malloc(((a.length_B>b.length_B)?a.length_B:b.length_B)+2);
85 cli_putstr_P(PSTR("\n\rERROR: Out of memory!"));
91 bigint_add_s(&c, &a, &b);
93 cli_putstr_P(PSTR("\r\n"));
100 void test_mul_bigint(void){
102 cli_putstr_P(PSTR("\r\nmul test\r\n"));
104 cli_putstr_P(PSTR("\r\nenter a:"));
105 if(bigint_read_hex_echo(&a)){
106 cli_putstr_P(PSTR("\r\n end mul test"));
109 cli_putstr_P(PSTR("\r\nenter b:"));
110 if(bigint_read_hex_echo(&b)){
112 cli_putstr_P(PSTR("\r\n end mul test"));
115 cli_putstr_P(PSTR("\r\n "));
116 bigint_print_hex(&a);
117 cli_putstr_P(PSTR(" * "));
118 bigint_print_hex(&b);
119 cli_putstr_P(PSTR(" = "));
121 c_b = malloc((((a.length_B>b.length_B)?a.length_B:b.length_B)+1)*2);
123 cli_putstr_P(PSTR("\n\rERROR: Out of memory!"));
129 bigint_mul_s(&c, &a, &b);
130 bigint_print_hex(&c);
131 cli_putstr_P(PSTR("\r\n"));
138 void test_square_bigint(void){
140 cli_putstr_P(PSTR("\r\nsquare test\r\n"));
142 cli_putstr_P(PSTR("\r\nenter a:"));
143 if(bigint_read_hex_echo(&a)){
144 cli_putstr_P(PSTR("\r\n end square test"));
147 cli_putstr_P(PSTR("\r\n "));
148 bigint_print_hex(&a);
149 cli_putstr_P(PSTR("**2 = "));
151 c_b = malloc(a.length_B*2);
153 cli_putstr_P(PSTR("\n\rERROR: Out of memory!"));
158 bigint_square(&c, &a);
159 bigint_print_hex(&c);
160 cli_putstr_P(PSTR("\r\n"));
166 void test_reduce_bigint(void){
168 cli_putstr_P(PSTR("\r\nreduce test\r\n"));
170 cli_putstr_P(PSTR("\r\nenter a:"));
171 if(bigint_read_hex_echo(&a)){
172 cli_putstr_P(PSTR("\r\n end reduce test"));
175 cli_putstr_P(PSTR("\r\nenter b:"));
176 if(bigint_read_hex_echo(&b)){
178 cli_putstr_P(PSTR("\r\n end reduce test"));
181 cli_putstr_P(PSTR("\r\n "));
182 bigint_print_hex(&a);
183 cli_putstr_P(PSTR(" % "));
184 bigint_print_hex(&b);
185 cli_putstr_P(PSTR(" = "));
186 bigint_reduce(&a, &b);
187 bigint_print_hex(&a);
188 cli_putstr_P(PSTR("\r\n"));
194 void test_expmod_bigint(void){
197 cli_putstr_P(PSTR("\r\nreduce test\r\n"));
199 cli_putstr_P(PSTR("\r\nenter a:"));
200 if(bigint_read_hex_echo(&a)){
201 cli_putstr_P(PSTR("\r\n end expmod test"));
204 cli_putstr_P(PSTR("\r\nenter b:"));
205 if(bigint_read_hex_echo(&b)){
207 cli_putstr_P(PSTR("\r\n end expmod test"));
210 cli_putstr_P(PSTR("\r\nenter c:"));
211 if(bigint_read_hex_echo(&c)){
214 cli_putstr_P(PSTR("\r\n end expmod test"));
217 d_b = malloc(c.length_B);
219 cli_putstr_P(PSTR("\n\rERROR: Out of memory!"));
226 cli_putstr_P(PSTR("\r\n "));
227 bigint_print_hex(&a);
228 cli_putstr_P(PSTR("**"));
229 bigint_print_hex(&b);
230 cli_putstr_P(PSTR(" % "));
231 bigint_print_hex(&c);
232 cli_putstr_P(PSTR(" = "));
233 bigint_expmod_u(&d, &a, &b, &c);
234 bigint_print_hex(&d);
235 cli_putstr_P(PSTR("\r\n"));
244 void test_gcdext_bigint(void){
245 bigint_t a, b, c, d, e;
246 cli_putstr_P(PSTR("\r\ngcdext test\r\n"));
248 cli_putstr_P(PSTR("\r\nenter a:"));
249 if(bigint_read_hex_echo(&a)){
250 cli_putstr_P(PSTR("\r\n end gcdext test"));
253 cli_putstr_P(PSTR("\r\nenter b:"));
254 if(bigint_read_hex_echo(&b)){
256 cli_putstr_P(PSTR("\r\n end gcdext test"));
259 c.wordv = malloc((a.length_B<b.length_B)?a.length_B:b.length_B);
260 d.wordv = malloc(1+(a.length_B>b.length_B)?a.length_B:b.length_B);
261 e.wordv = malloc(1+(a.length_B>b.length_B)?a.length_B:b.length_B);
263 cli_putstr_P(PSTR("\r\n gcdext( "));
264 bigint_print_hex(&a);
265 cli_putstr_P(PSTR(", "));
266 bigint_print_hex(&b);
267 cli_putstr_P(PSTR(") => "));
268 bigint_gcdext(&c, &d, &e, &a, &b);
269 cli_putstr_P(PSTR("a = "));
270 bigint_print_hex(&d);
271 cli_putstr_P(PSTR("; b = "));
272 bigint_print_hex(&e);
273 cli_putstr_P(PSTR("; gcd = "));
274 bigint_print_hex(&c);
276 cli_putstr_P(PSTR("\r\n"));
285 void test_simple(void){
287 uint8_t a_b[1], b_b[1], c_b[2];
295 bigint_add_u(&c, &a, &b);
296 cli_putstr_P(PSTR("\r\n 1+2="));
297 bigint_print_hex(&c);
300 void test_mul_simple(void){
302 uint8_t a_b[5] = {0x79, 0x36, 0x9e, 0x72, 0xec};
303 uint8_t b_b[5] = {0x4a, 0x47, 0x0d, 0xec, 0xfd};
312 bigint_mul_s(&c, &a, &b);
313 cli_putstr_P(PSTR("\r\n test: "));
314 bigint_print_hex(&c);
318 // -3d1d 6db7 8251 f371 * -7a18 3791 d18b b7c5 = 1d25ce4fdf93390f8d6c709f4d711cf5
319 // -20538248dece6d29068d * 400b1411b874f81394c6 = -81646b193d95136a6fedb73cee6d30c39fb950e
320 // -BC8B 7D53 4921 853D * 0DDA 6044 00CE DDE6 = -a33eb0c5847db8837589c22db395dce
321 void test_mul_simple(void){
324 // uint8_t a_b[10] = {0x8d, 0x06, 0x29, 0x6d, 0xce, 0xde, 0x48, 0x82, 0x53, 0x20};
325 // uint8_t b_b[10] = {0xc6, 0x94, 0x13, 0xf8, 0x74, 0xb8, 0x11, 0x14, 0x0b, 0x40};
326 uint8_t a_b[8] = {0x3d, 0x85, 0x21, 0x49, 0x53, 0x7d, 0x8b, 0xbc};
327 uint8_t b_b[8] = {0xe6, 0xdd, 0xce, 0x00, 0x44, 0x60, 0xda, 0x0d};
338 bigint_mul_s(&c, &a, &b);
339 cli_putstr_P(PSTR("\r\n test: "));
340 bigint_print_hex(&a);
341 cli_putstr_P(PSTR(" * "));
342 bigint_print_hex(&b);
343 cli_putstr_P(PSTR(" = "));
344 bigint_print_hex(&c);
347 // f4 b86a 2220 0774 437d 70e6 **2 = e9f00f29ca1c876a7a682bd1e04f6925caffd6660ea4
349 uint8_t square_test_data[] PROGMEM = {
350 0xA0, 0x3C, 0x23, 0x9F, 0x7A, 0xFC, 0x60, 0xEB, 0x96, 0xC2, 0xA8, 0xAC, 0xC3, 0xC9, 0x9E, 0xEC,
351 0x4A, 0xF0, 0x1C, 0xB2, 0x36, 0x68, 0xD6, 0x4D, 0x3E, 0x4F, 0x8E, 0x55, 0xEA, 0x52, 0x46, 0x68,
352 0x6E, 0x18, 0x88, 0x37, 0x03, 0x70, 0xBD, 0x01, 0x60, 0xE2, 0xD6, 0x12, 0xA0, 0x0E, 0xD2, 0x72,
353 0x0D, 0x9D, 0x9F, 0x03, 0xC5, 0x81, 0xCA, 0x6E, 0x88, 0x1E, 0xF5, 0xD8, 0x14, 0x15, 0x30, 0xEB,
354 0x28, 0x7C, 0x80, 0x07, 0x34, 0x05, 0x5D, 0xAA, 0xDC, 0xA8, 0xAA, 0x88, 0xC5, 0xE5, 0xC9, 0xFE,
355 0x9C, 0xA1, 0xCE, 0xC2, 0x09, 0x0D, 0xC4, 0xC8, 0xD3, 0xE7, 0x3A, 0xF3, 0xEF, 0xDF, 0xAE, 0x07,
356 0xEC, 0xC7, 0x83, 0x50, 0x9F, 0x6D, 0xB9, 0x28, 0x77, 0xC0, 0xFE, 0x69, 0xB2, 0x2E, 0x55, 0x90,
357 0x50, 0xED, 0xE0, 0xA1, 0x4D, 0x3D, 0x38, 0xC9, 0x0E, 0xCD, 0x04, 0x3B, 0x64, 0x3F, 0x56, 0xC5,
358 0xC3, 0x9E, 0x89, 0x81, 0x44, 0x60, 0xBA, 0x8E, 0x88, 0xA4, 0xA3, 0x42, 0x7B, 0x06, 0x93, 0x1C,
359 0x6B, 0x04, 0x29, 0xF9, 0xDD, 0xFF, 0xB0, 0x48, 0x2F, 0x6D, 0xD1, 0x0F, 0x7D, 0xA6, 0x26, 0xD8,
360 0xEF, 0x5E, 0x04, 0x18, 0xD1, 0x61, 0x46, 0x37, 0x87, 0xE2, 0x97, 0xDF, 0x10, 0xB4, 0x9A, 0x39,
361 0xB1, 0xD0, 0xCA, 0x91, 0x48, 0x1E, 0x5D, 0xA1, 0x38, 0x89, 0x02, 0xC1, 0x49, 0x86, 0xB7, 0xAE,
362 0x69, 0x20, 0xFA, 0x0E, 0x39, 0xDA, 0xA5, 0xEF, 0x7F, 0xB2, 0x81, 0xB8, 0xC0, 0x3A, 0xF8, 0xDB,
363 0xBC, 0x45, 0xF6, 0xDA, 0xCD, 0xBE, 0x27, 0xBE, 0xF6, 0x20, 0x79, 0xF3, 0xC3, 0xC8, 0xFF, 0x85,
364 0x43, 0x9F, 0xB1, 0x9B, 0x72, 0x88, 0xDD, 0xA4, 0x0D, 0xFC, 0xC6, 0xB5, 0x74, 0x67, 0x29, 0xF5
368 void test_square_simple(void){
371 uint8_t a_b[11] = {0xe6, 0x70, 0x7d, 0x43, 0x74, 0x07, 0x20, 0x22, 0x6a, 0xb8, 0xf4};
378 bigint_square(&c, &a);
379 cli_putstr_P(PSTR("\r\n test: "));
380 bigint_print_hex(&a);
381 cli_putstr_P(PSTR("**2 = "));
382 bigint_print_hex(&c);
385 // [fail (c)]: A862 % 2752 = 0D1A ; should a862 % 2752 = b1a
386 void test_reduce_simple(void){
389 uint8_t a_b[2] = {0x62, 0xA8};
390 uint8_t b_b[2] = {0x52, 0x27};
402 bigint_reduce(&c, &b);
403 cli_putstr_P(PSTR("\r\n test: "));
404 bigint_print_hex(&a);
405 cli_putstr_P(PSTR(" % "));
406 bigint_print_hex(&b);
407 cli_putstr_P(PSTR(" = "));
408 bigint_print_hex(&c);
411 /* gcdext( B5DDAD, 6CBBC2) */
412 /* gcdext( CD319349, 9EFD76CC) */
413 /* gcdext( 1609000771, 6FAC577D72) */
415 void test_gcdext_simple(void){
416 bigint_t a, b, c, d, e;
418 uint8_t a_b[5] = {0x71, 0x07, 0x00, 0x09, 0x16};
419 uint8_t b_b[5] = {0x72, 0x7D, 0x57, 0xAC, 0X6F};
420 uint8_t c_b[6], d_b[6], e_b[6];
432 bigint_gcdext(&c, &d, &e, &a, &b);
433 cli_putstr_P(PSTR("\r\n test: gcd( "));
434 bigint_print_hex(&a);
435 cli_putstr_P(PSTR(", "));
436 bigint_print_hex(&b);
437 cli_putstr_P(PSTR(") => a = "));
438 bigint_print_hex(&d);
439 cli_putstr_P(PSTR("; b = "));
440 bigint_print_hex(&e);
441 cli_putstr_P(PSTR("; gcd = "));
442 bigint_print_hex(&c);
445 void testrun_performance_bigint(void){
448 /*****************************************************************************
450 *****************************************************************************/
452 const char echo_test_str[] PROGMEM = "echo-test";
453 const char add_test_str[] PROGMEM = "add-test";
454 const char mul_test_str[] PROGMEM = "mul-test";
455 const char square_test_str[] PROGMEM = "square-test";
456 const char reduce_test_str[] PROGMEM = "reduce-test";
457 const char expmod_test_str[] PROGMEM = "expmod-test";
458 const char gcdext_test_str[] PROGMEM = "gcdext-test";
459 const char quick_test_str[] PROGMEM = "quick-test";
460 const char performance_str[] PROGMEM = "performance";
461 const char echo_str[] PROGMEM = "echo";
463 cmdlist_entry_t cmdlist[] PROGMEM = {
464 { add_test_str, NULL, test_add_bigint },
465 { mul_test_str, NULL, test_mul_bigint },
466 { square_test_str, NULL, test_square_bigint },
467 { reduce_test_str, NULL, test_reduce_bigint },
468 { expmod_test_str, NULL, test_expmod_bigint },
469 { gcdext_test_str, NULL, test_gcdext_bigint },
470 { quick_test_str, NULL, test_gcdext_simple },
471 { echo_test_str, NULL, test_echo_bigint },
472 { performance_str, NULL, testrun_performance_bigint },
473 { echo_str, (void*)1, (void_fpt)echo_ctrl },
480 cli_rx = (cli_rx_fpt)uart0_getc;
481 cli_tx = (cli_tx_fpt)uart0_putc;
483 cli_putstr_P(PSTR("\r\n\r\nCrypto-VS ("));
484 cli_putstr(algo_name);
485 cli_putstr_P(PSTR(")\r\nloaded and running\r\n"));
486 cmd_interface(cmdlist);