--- /dev/null
+/* 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);
+ }
+}
+