]> git.cryptolib.org Git - arm-crypto-lib.git/blobdiff - test_src/main-salsa20-test.c
adding salsa20
[arm-crypto-lib.git] / test_src / main-salsa20-test.c
diff --git a/test_src/main-salsa20-test.c b/test_src/main-salsa20-test.c
new file mode 100644 (file)
index 0000000..1588af2
--- /dev/null
@@ -0,0 +1,280 @@
+/* main-salsa20-test.c */
+/*
+    This file is part of the ARM-Crypto-Lib.
+    Copyright (C) 2006-2011 Daniel Otte (daniel.otte@rub.de)
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+
+#include "main-test-common.h"
+
+#include "performance_test.h"
+#include "salsa20.h"
+#include "scal_salsa20.h"
+#include "scal-basic.h"
+#include "scal-nessie.h"
+
+char* algo_name = "Salsa20";
+
+/*****************************************************************************
+ *  additional validation-functions                                                                                     *
+ *****************************************************************************/
+
+void nessie_first(void){
+       salsa20_ctx_t ctx;
+       uint8_t key[16];
+
+       memset(key, 0, 16);
+       key[0] = 0x80;
+       cli_putstr("\r\n testing with key: ");
+       cli_hexdump(key, 16);
+       salsa20_init(key, 128, NULL, &ctx);
+       cli_putstr("\r\n internal state: ");
+       cli_hexdump_block(ctx.a, 64, 4, 16);
+       salsa20_gen(&ctx);
+       cli_putstr("\r\n internal state: ");
+       cli_hexdump_block(ctx.a, 64, 4, 16);
+       cli_putstr("\r\n data: ");
+       cli_hexdump_block(ctx.buffer, 64, 4, 16);
+
+
+       memset(key, 0, 16);
+       key[15] = 0x01;
+       cli_putstr("\r\n testing with key: ");
+       cli_hexdump(key, 16);
+       cli_hexdump_block(ctx.a, 64, 4, 16);
+       salsa20_init(key, 128, NULL, &ctx);
+       cli_putstr("\r\n internal state: ");
+       cli_hexdump_block(ctx.a, 64, 4, 16);
+       salsa20_gen(&ctx);
+       cli_putstr("\r\n internal state: ");
+       cli_hexdump_block(ctx.a, 64, 4, 16);
+       cli_putstr("\r\n data: ");
+       cli_hexdump_block(ctx.buffer, 64, 4, 16);
+}
+
+/*
+Salsa20(
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
+=(
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+  ).
+
+
+Salsa20(
+       211,159, 13,115, 76, 55, 82,183, 3,117,222, 37,191,187,234,136,
+       49,237,179, 48, 1,106,178,219,175,199,166, 48, 86, 16,179,207,
+       31,240, 32, 63, 15, 83, 93,161,116,147, 48,113,238, 55,204, 36,
+       79,201,235, 79, 3, 81,156, 47,203, 26,244,243, 88,118,104, 54)
+= (
+       109, 42,178,168,156,240,248,238,168,196,190,203, 26,110,170,154,
+       29, 29,150, 26,150, 30,235,249,190,163,251, 48, 69,144, 51, 57,
+       118, 40,152,157,180, 57, 27, 94,107, 42,236, 35, 27,111,114,114,
+       219,236,232,135,111,155,110, 18, 24,232, 95,158,179, 19, 48,202
+  ).
+
+Salsa20(
+       88,118,104, 54, 79,201,235, 79, 3, 81,156, 47,203, 26,244,243,
+       191,187,234,136,211,159, 13,115, 76, 55, 82,183, 3,117,222, 37,
+       86, 16,179,207, 49,237,179, 48, 1,106,178,219,175,199,166, 48,
+       238, 55,204, 36, 31,240, 32, 63, 15, 83, 93,161,116,147, 48,113)
+= (
+       179, 19, 48,202,219,236,232,135,111,155,110, 18, 24,232, 95,158,
+       26,110,170,154,109, 42,178,168,156,240,248,238,168,196,190,203,
+       69,144, 51, 57, 29, 29,150, 26,150, 30,235,249,190,163,251, 48,
+       27,111,114,114,118, 40,152,157,180, 57, 27, 94,107, 42,236, 35
+  ).
+
+Salsa20^1000000 (
+       6,124, 83,146, 38,191, 9, 50, 4,161, 47,222,122,182,223,185,
+       75, 27, 0,216, 16,122, 7, 89,162,104,101,147,213, 21, 54, 95,
+       225,253,139,176,105,132, 23,116, 76, 41,176,207,221, 34,157,108,
+       94, 94, 99, 52, 90,117, 91,220,146,190,239,143,196,176,130,186)
+=(
+       8, 18, 38,199,119, 76,215, 67,173,127,144,162,103,212,176,217,
+       192, 19,233, 33,159,197,154,160,128,243,219, 65,171,136,135,225,
+       123, 11, 68, 86,237, 82, 20,155,133,189, 9, 83,167,116,194, 78,
+       122,127,195,185,185,204,188, 90,245, 9,183,248,226, 85,245,104
+ ).
+ */
+
+uint8_t Salsa20_spectest0_in[] = {
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+
+uint8_t Salsa20_spectest0_ref[] = {
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+
+
+uint8_t Salsa20_spectest1_in[] = {
+       211,159, 13,115, 76, 55, 82,183, 3,117,222, 37,191,187,234,136,
+       49,237,179, 48, 1,106,178,219,175,199,166, 48, 86, 16,179,207,
+       31,240, 32, 63, 15, 83, 93,161,116,147, 48,113,238, 55,204, 36,
+       79,201,235, 79, 3, 81,156, 47,203, 26,244,243, 88,118,104, 54 };
+
+uint8_t Salsa20_spectest1_ref[] = {
+       109, 42,178,168,156,240,248,238,168,196,190,203, 26,110,170,154,
+       29, 29,150, 26,150, 30,235,249,190,163,251, 48, 69,144, 51, 57,
+       118, 40,152,157,180, 57, 27, 94,107, 42,236, 35, 27,111,114,114,
+       219,236,232,135,111,155,110, 18, 24,232, 95,158,179, 19, 48,202 };
+
+uint8_t Salsa20_spectest2_in[] = {
+       88,118,104, 54, 79,201,235, 79, 3, 81,156, 47,203, 26,244,243,
+       191,187,234,136,211,159, 13,115, 76, 55, 82,183, 3,117,222, 37,
+       86, 16,179,207, 49,237,179, 48, 1,106,178,219,175,199,166, 48,
+       238, 55,204, 36, 31,240, 32, 63, 15, 83, 93,161,116,147, 48,113 };
+
+uint8_t Salsa20_spectest2_ref[] = {
+       179, 19, 48,202,219,236,232,135,111,155,110, 18, 24,232, 95,158,
+       26,110,170,154,109, 42,178,168,156,240,248,238,168,196,190,203,
+       69,144, 51, 57, 29, 29,150, 26,150, 30,235,249,190,163,251, 48,
+       27,111,114,114,118, 40,152,157,180, 57, 27, 94,107, 42,236, 35 };
+
+uint8_t Salsa20_spectest3_in[] = {
+       6,124, 83,146, 38,191, 9, 50, 4,161, 47,222,122,182,223,185,
+       75, 27, 0,216, 16,122, 7, 89,162,104,101,147,213, 21, 54, 95,
+       225,253,139,176,105,132, 23,116, 76, 41,176,207,221, 34,157,108,
+       94, 94, 99, 52, 90,117, 91,220,146,190,239,143,196,176,130,186 };
+
+uint8_t Salsa20_spectest3_ref[] = {
+       8, 18, 38,199,119, 76,215, 67,173,127,144,162,103,212,176,217,
+       192, 19,233, 33,159,197,154,160,128,243,219, 65,171,136,135,225,
+       123, 11, 68, 86,237, 82, 20,155,133,189, 9, 83,167,116,194, 78,
+       122,127,195,185,185,204,188, 90,245, 9,183,248,226, 85,245,104 };
+
+
+void spec_test(void){
+       uint8_t buffer[64];
+       nessie_first();
+       cli_putstr("\r\ntesting with vectors from sepcification");
+       cli_putstr("\r\ntest 0: ");
+       memcpy(buffer, Salsa20_spectest0_in, 64);
+       salsa20_hash((uint32_t*)buffer);
+       if(memcmp(buffer, Salsa20_spectest0_ref, 64)){
+               cli_putstr(" [fail]");
+       }else{
+               cli_putstr(" [ok]");
+       }
+
+       cli_putstr("\r\ntest 1: ");
+       memcpy(buffer, Salsa20_spectest1_in, 64);
+       salsa20_hash((uint32_t*)buffer);
+       if(memcmp(buffer, Salsa20_spectest1_ref, 64)){
+               cli_putstr(" [fail]");
+       }else{
+               cli_putstr(" [ok]");
+       }
+
+       cli_putstr("\r\ntest 2: ");
+       memcpy(buffer, Salsa20_spectest2_in, 64);
+       salsa20_hash((uint32_t*)buffer);
+       if(memcmp(buffer, Salsa20_spectest2_ref, 64)){
+               cli_putstr(" [fail]");
+       }else{
+               cli_putstr(" [ok]");
+       }
+
+
+
+       uint32_t count=0;
+       cli_putstr("\r\ntest 3: ");
+       memcpy(buffer, Salsa20_spectest3_in, 64);
+       do{
+               if((count&0xFFFF)==0){
+                       cli_putc('.');
+                       if((count&0x20FFFF)==0){
+                               cli_putc('\r'); cli_putc('\n');
+                       }
+               }
+               salsa20_hash((uint32_t*)buffer);
+       }while(++count<1000000);
+       if(memcmp(buffer, Salsa20_spectest0_ref, 64)){
+               cli_putstr(" [fail]");
+       }else{
+               cli_putstr(" [ok]");
+       }
+}
+
+void testrun_nessie_salsa20(void){
+       scal_nessie_set_estream(1);
+       scal_nessie_run(&salsa20_desc);
+}
+
+void testrun_performance_salsa20(void){
+       uint64_t t;
+       char str[16];
+       uint8_t key[32];
+       salsa20_ctx_t ctx;
+
+       calibrateTimer();
+       print_overhead();
+
+       memset(key,  0, 16);
+
+       startTimer(1);
+       salsa20_init(key, 128, NULL, &ctx);
+       t = stopTimer();
+       cli_putstr("\r\n\tctx-gen time: ");
+       ultoa((unsigned long)t, str, 10);
+       cli_putstr(str);
+
+       startTimer(1);
+       salsa20_gen(&ctx);
+       t = stopTimer();
+       cli_putstr("\r\n\tencrypt time: ");
+       ultoa((unsigned long)t, str, 10);
+       cli_putstr(str);
+
+       cli_putstr("\r\n");
+}
+
+
+/*****************************************************************************
+ *  main                                                                                                                                        *
+ *****************************************************************************/
+
+const char nessie_str[] = "nessie";
+const char test_str[] = "test";
+const char performance_str[] = "performance";
+const char echo_str[] = "echo";
+
+cmdlist_entry_t cmdlist[] = {
+       { nessie_str,      NULL, testrun_nessie_salsa20 },
+       { performance_str, NULL, testrun_performance_salsa20},
+       { test_str,        NULL, spec_test},
+       { echo_str,    (void*)1, (void_fpt)echo_ctrl},
+       { NULL,            NULL, NULL}
+};
+
+int main (void){
+       main_setup();
+
+       for(;;){
+               welcome_msg(algo_name);
+               cmd_interface(cmdlist);
+       }
+}
+