3 This file is part of the ARM-Crypto-Lib.
4 Copyright (C) 2006-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 "uart_lowlevel.h"
35 #include "nessie_hash_test.h"
36 #include "performance_test.h"
37 #include "hfal-nessie.h"
38 #include "hfal-performance.h"
39 #include "hfal-test.h"
42 #include "hfal_sha1.h"
44 void uart0_putc(char byte){
45 uart_putc(UART_0, byte);
48 char uart0_getc(void){
49 return uart_getc(UART_0);
52 const char* algo_name = "SHA-1";
54 const hfdesc_t* algolist[] = {
55 (hfdesc_t*)&sha1_desc,
58 /*****************************************************************************
59 * additional validation-functions *
60 *****************************************************************************/
62 void testrun_nessie_sha1(void){
63 nessie_hash_ctx.hashsize_b = 160;
64 nessie_hash_ctx.blocksize_B = 512/8;
65 nessie_hash_ctx.ctx_size_B = sizeof(sha1_ctx_t);
66 nessie_hash_ctx.name = algo_name;
67 nessie_hash_ctx.hash_init = (nessie_hash_init_fpt)sha1_init;
68 nessie_hash_ctx.hash_next = (nessie_hash_next_fpt)sha1_nextBlock;
69 nessie_hash_ctx.hash_last = (nessie_hash_last_fpt)sha1_lastBlock;
70 nessie_hash_ctx.hash_conv = (nessie_hash_conv_fpt)sha1_ctx2hash;
75 /*****************************************************************************
77 *****************************************************************************/
79 void sha1_ctx_dump(sha1_ctx_t *s){
81 cli_putstr("\r\n==== sha1_ctx_dump ====");
83 cli_putstr("\r\na["); cli_hexdump(&i, 1); cli_putstr("]: ");
84 cli_hexdump(&(s->h[i]), 4);
86 cli_putstr("\r\nlength"); cli_hexdump(&i, 8);
89 void testrun_sha1(void){
92 cli_putstr("\r\nsha1(\"abc\") = \r\n\t");
93 cli_hexdump(hash, SHA1_HASH_BITS/8);
95 sha1(hash,"\0\0\0\0\0\0\0\0", 8*8);
96 cli_putstr("\r\nsha1(8 x 0x00) = \r\n\t");
97 cli_hexdump(hash, SHA1_HASH_BITS/8);
100 Msg = 46fe5ed326c8fe376fcc92dc9e2714e2240d3253b105ad
101 fbb256ff7a19bc40975c604ad7c0071c4fd78a7cb64786
102 e1bece548fa4833c04065fe593f6fb10
103 MD = f220a7457f4588d639dc21407c942e9843f8e26b
105 sha1( hash,"\x46\xfe\x5e\xd3\x26\xc8\xfe\x37"
106 "\x6f\xcc\x92\xdc\x9e\x27\x14\xe2"
107 "\x24\x0d\x32\x53\xb1\x05\xad\xfb"
108 "\xb2\x56\xff\x7a\x19\xbc\x40\x97"
109 "\x5c\x60\x4a\xd7\xc0\x07\x1c\x4f"
110 "\xd7\x8a\x7c\xb6\x47\x86\xe1\xbe"
111 "\xce\x54\x8f\xa4\x83\x3c\x04\x06"
112 "\x5f\xe5\x93\xf6\xfb\x10", 496);
113 cli_putstr("\r\nsha1(tv_496) = \r\n\t");
114 cli_hexdump(hash, SHA1_HASH_BITS/8);
116 sha1(hash, "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",448);
117 // cli_putstr_P(PSTR("\r\nsha1(\"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq\") = \r\n\t"));
118 cli_hexdump(hash,SHA1_HASH_BITS/8);
119 cli_putstr("\r\nsha1(1,000,000 * 'a') = \r\n\t");
121 uint8_t block[SHA1_BLOCK_BITS/8];
124 memset(block,'a',SHA1_BLOCK_BITS/8);
126 for(i=0;i<15625; ++i){ /* (1000000/(SHA1_BLOCK_BITS/8)) */
127 sha1_nextBlock(&s, block);
129 sha1_lastBlock(&s,block,0);
130 sha1_ctx2hash(&hash, &s);
132 cli_hexdump(hash,SHA1_HASH_BITS/8);
137 void testrun_sha1_2(void){
141 cli_putstr("\r\nsha1(NULL) = \r\n\t");
142 cli_hexdump(hash,SHA1_HASH_BYTES);
144 memset(hash, 0, SHA1_HASH_BYTES);
147 sha1_lastBlock(&ctx, "", 0);
148 sha1_ctx2hash(&hash, &ctx);
149 cli_putstr("\r\nsha1(NULL) = \r\n\t");
150 cli_hexdump(hash, SHA1_HASH_BYTES);
154 Msg = a38b899cae4edb191d88d861c842b6e32b9b67db66bdbdde8911d2b30fafa765a8190b963c28bf162c46d7b5dbde63556d114f43ceab88c7f65560f96c0c34c0
155 MD = 722246b014af03ef3ba31364fc732a4ab8f38587
158 void testrun_sha1_506(void){
160 0xa3, 0x8b, 0x89, 0x9c, 0xae, 0x4e, 0xdb, 0x19,
161 0x1d, 0x88, 0xd8, 0x61, 0xc8, 0x42, 0xb6, 0xe3,
162 0x2b, 0x9b, 0x67, 0xdb, 0x66, 0xbd, 0xbd, 0xde,
163 0x89, 0x11, 0xd2, 0xb3, 0x0f, 0xaf, 0xa7, 0x65,
164 0xa8, 0x19, 0x0b, 0x96, 0x3c, 0x28, 0xbf, 0x16,
165 0x2c, 0x46, 0xd7, 0xb5, 0xdb, 0xde, 0x63, 0x55,
166 0x6d, 0x11, 0x4f, 0x43, 0xce, 0xab, 0x88, 0xc7,
167 0xf6, 0x55, 0x60, 0xf9, 0x6c, 0x0c, 0x34, 0xc0 };
169 0x72, 0x22, 0x46, 0xb0, 0x14, 0xaf, 0x03, 0xef,
170 0x3b, 0xa3, 0x13, 0x64, 0xfc, 0x73, 0x2a, 0x4a,
171 0xb8, 0xf3, 0x85, 0x87 };
173 sha1(hash, data, 506);
174 cli_putstr("\r\nsha1(<tv506>) = \r\n\t");
175 cli_hexdump(hash, SHA1_HASH_BYTES);
176 cli_putstr("\r\nshould = \r\n\t");
177 cli_hexdump(ref, SHA1_HASH_BYTES);
178 if(memcmp(ref, hash, SHA1_HASH_BYTES)==0){
179 cli_putstr("\r\n[ok]");
181 cli_putstr("\r\n[fail]");
185 void testrun_performance_sha1(void){
186 hfal_performance_multiple(algolist);
190 /*****************************************************************************
192 *****************************************************************************/
194 const char nessie_str[] = "nessie";
195 const char test_str[] = "test";
196 const char test2_str[] = "test2";
197 const char test506_str[] = "test506";
198 const char performance_str[] = "performance";
199 const char echo_str[] = "echo";
200 const char shavs_list_str[] = "shavs_list";
201 const char shavs_set_str[] = "shavs_set";
202 const char shavs_test1_str[] = "shavs_test1";
203 const char shavs_test2_str[] = "shavs_test2";
204 const char dump_str[] = "dump";
207 const cmdlist_entry_t cmdlist[] = {
208 { nessie_str, NULL, testrun_nessie_sha1},
209 { test_str, NULL, testrun_sha1},
210 { test2_str, NULL, testrun_sha1_2},
211 { test506_str, NULL, testrun_sha1_506},
212 { performance_str, NULL, testrun_performance_sha1},
213 { echo_str, (void*)1, (void_fpt)echo_ctrl},
214 { shavs_list_str, NULL, shavs_listalgos},
215 { shavs_set_str, (void*)1, (void_fpt)shavs_setalgo},
216 { shavs_test1_str, NULL, shavs_test1},
217 { shavs_test2_str, NULL, shavs_test2},
218 { dump_str, (void*)1, (void_fpt)dump},
223 sysclk_set_freq(SYS_FREQ);
224 sysclk_mosc_verify_enable();
225 uart_init(UART_0, 115200, 8, UART_PARATY_NONE, UART_STOPBITS_ONE);
226 gptm_set_timer_32periodic(TIMER0);
231 shavs_algolist=(hfdesc_t**)algolist;
232 shavs_algo=(hfdesc_t*)&sha1_desc;
235 cli_putstr("\r\n\r\nARM-Crypto-Lib VS (");
236 cli_putstr(algo_name);
238 cli_putstr(__DATE__);
240 cli_putstr(__TIME__);
241 cli_putstr(")\r\nloaded and running\r\n");
242 cmd_interface(cmdlist);