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/>.
23 * \license GPLv3 or later
31 #include "hashfunction_descriptor.h"
32 #include "hfal-basic.h"
34 #include "string-extras.h"
45 #include "uart_lowlevel.h"
46 //# include "config.h"
47 //# include <util/delay.h>
50 hfdesc_t* shavs_algo=NULL;
51 hfdesc_t** shavs_algolist=NULL;
53 void shavs_listalgos(void){
58 cli_putstr("\r\nthe following algorithms are available:\r\n");
59 while(option<='z' && (t=shavs_algolist[i])){
61 cli_putc((t==shavs_algo)?'*':' ');
70 void shavs_setalgo(char* param){
71 param = strstrip(param);
72 if(param[1]=='\0'){ /* single letter specified */
73 uint8_t i,option = param[0]-'a';
76 cli_putstr("\r\nERROR: shavs_algolist not set!");
79 for(i=0; i<=option; ++i){
80 if((shavs_algolist[i])==NULL){
81 cli_putstr("\r\nERROR: invalid selection!");
85 shavs_algo=(hfdesc_t*)(shavs_algolist[option]);
86 } else { /* name specified */
89 while((t=shavs_algolist[i]) && strcasecmp(param, t->name)){
95 cli_putstr("\r\nERROR: could not find \"");
104 uint16_t buffersize_B;
111 static shavs_ctx_t shavs_ctx;
114 uint8_t buffer_add(char c){
116 if(shavs_ctx.buffer_idx==shavs_ctx.buffersize_B){
117 hfal_hash_nextBlock(&(shavs_ctx.ctx), shavs_ctx.buffer);
119 shavs_ctx.buffer_idx=0;
122 memset(shavs_ctx.buffer, 0, shavs_ctx.buffersize_B);
124 if(c>='0' && c<='9'){
127 c &= (uint8_t)~('a' ^ 'A');
128 if(c>='A' && c<='F'){
134 t=shavs_ctx.buffer[shavs_ctx.buffer_idx];
135 if(shavs_ctx.in_byte){
137 shavs_ctx.buffer[shavs_ctx.buffer_idx]=t;
138 shavs_ctx.buffer_idx++;
139 shavs_ctx.in_byte = 0;
142 shavs_ctx.buffer[shavs_ctx.buffer_idx]=t;
143 shavs_ctx.in_byte = 1;
149 uint32_t my_strtoul(const char* str){
151 while(*str && (*str<'0' || *str>'9')){
157 while(*str && (*str>='0' && *str<='9')){
165 int32_t getLength(void){
170 memset(lenstr, 0, 21);
171 cli_getsn(lenstr, 20);
172 len2 = strstrip(lenstr);
173 if(!strncasecmp(len2, "LEN", 3)){
174 while(*len2 && *len2!='=')
179 }while(*len2 && !isdigit((uint8_t)*len2));
180 len = my_strtoul(len2);
181 //len=(uint32_t)strtoul(len2, NULL, 10);
185 if(!strncasecmp(len2, "EXIT", 4)){
192 void shavs_test1(void){ /* KAT tests */
194 int32_t expect_input=0;
197 cli_putstr("\r\nERROR: select algorithm first!");
201 uint8_t diggest[shavs_algo->hashsize_b/8];
202 shavs_ctx.buffersize_B=shavs_algo->blocksize_b/8;
203 uint8_t buffer[shavs_ctx.buffersize_B+5];
204 shavs_ctx.buffer = buffer;
205 cli_putstr("\r\nbuffer_size = 0x");
206 cli_hexdump_rev(&(shavs_ctx.buffersize_B), 2);
207 cli_putstr(" bytes");
209 shavs_ctx.blocks = 0;
210 memset(buffer, 0, shavs_ctx.buffersize_B);
211 length = getLength();
212 if((int32_t)length<0){
214 cli_putstr("\r\n(x) Len == ");
215 cli_hexdump_rev(&length, 4);
222 cli_putstr("\r\nLen == ");
223 cli_hexdump_rev(&length, 4);
229 expect_input=((length+7)>>2)&(~1L);
232 cli_putstr("\r\nexpected_input == ");
233 cli_hexdump_rev(&expect_input, 4);
235 cli_putstr("\r\nexpected_input == 0 !!!");
237 shavs_ctx.buffer_idx = 0;
238 shavs_ctx.in_byte = 0;
239 shavs_ctx.blocks = 0;
242 cli_putstr("\r\n HFAL init");
243 cli_putstr("\r\n (2) expected_input == ");
244 cli_hexdump_rev(&expect_input, 4);
246 ret = hfal_hash_init(shavs_algo, &(shavs_ctx.ctx));
248 cli_putstr("\r\n HFAL init returned with: ");
249 cli_hexdump(&ret, 1);
253 cli_putstr("\r\n (3) expected_input == ");
254 cli_hexdump_rev(&expect_input, 4);
257 while((c=cli_getc_cecho())!='M' && c!='m'){
258 if(!isblank((uint8_t)c)){
259 cli_putstr("\r\nERROR: wrong input (1) [0x");
261 cli_putstr("]!\r\n");
262 hfal_hash_free(&(shavs_ctx.ctx));
266 if((c=cli_getc_cecho())!='s' && c!='S'){
267 cli_putstr("\r\nERROR: wrong input (2)!\r\n");
268 hfal_hash_free(&(shavs_ctx.ctx));
271 if((c=cli_getc_cecho())!='g' && c!='G'){
272 cli_putstr("\r\nERROR: wrong input (3)!\r\n");
273 hfal_hash_free(&(shavs_ctx.ctx));
276 while((c=cli_getc_cecho())!='='){
277 if(!isblank((uint8_t)c)){
278 cli_putstr("\r\nERROR: wrong input (4)!\r\n");
279 hfal_hash_free(&(shavs_ctx.ctx));
284 cli_putstr("\r\nparsing started");
286 shavs_ctx.buffer_idx = 0;
287 shavs_ctx.in_byte = 0;
288 shavs_ctx.blocks = 0;
289 while(expect_input>0){
292 cli_putstr("\r\n\t(");
293 cli_hexdump_rev(&expect_input, 4);
296 if(buffer_add(c)==0){
299 if(!isblank((uint16_t)c)){
300 cli_putstr("\r\nERROR: wrong input (5) (");
302 cli_putstr(")!\r\n");
303 hfal_hash_free(&(shavs_ctx.ctx));
309 cli_putstr("\r\nBuffer-A:");
310 cli_hexdump_block(buffer, shavs_ctx.buffersize_B, 5, 8);
312 cli_putstr("\r\n starting finalisation");
313 cli_putstr("\r\n\tblocks == ");
314 cli_hexdump_rev(&(shavs_ctx.blocks),4);
315 cli_putstr("\r\n\tbuffer_idx == ");
316 cli_hexdump_rev(&(shavs_ctx.buffer_idx),2);
317 cli_putstr("\r\n\tin_byte == ");
318 cli_hexdump_rev(&(shavs_ctx.in_byte),1);
320 cli_putstr("\r\n starting last block");
321 cli_putstr("\r\n\tlength == ");
322 cli_hexdump_rev(&length,4);
323 cli_putstr("\r\n\tbuffersize_B == ");
324 cli_hexdump_rev(&(shavs_ctx.buffersize_B),2);
325 uint16_t temp=length-(shavs_ctx.blocks)*((shavs_ctx.buffersize_B)*8);
326 cli_putstr("\r\n\t (temp) == ");
327 cli_hexdump_rev(&temp,2);
328 temp=length-(shavs_ctx.blocks)*((shavs_ctx.buffersize_B)*8);
330 uint16_t temp=length-(shavs_ctx.blocks)*((shavs_ctx.buffersize_B)*8);
332 /* cli_putstr("\r\n\t (temp) == ");
333 cli_hexdump_rev(&temp,2); */
334 hfal_hash_lastBlock( &(shavs_ctx.ctx), buffer, /* be aware of freaking compilers!!! */
335 // length-(shavs_ctx.blocks)*((shavs_ctx.buffersize_B)*8));
338 cli_putstr("\r\n starting ctx2hash");
340 hfal_hash_ctx2hash(diggest, &(shavs_ctx.ctx));
342 cli_putstr("\r\n starting hash free");
344 hfal_hash_free(&(shavs_ctx.ctx));
345 cli_putstr("\r\n MD = ");
346 cli_hexdump(diggest, shavs_algo->hashsize_b/8);
351 void shavs_test2(void){ /* Monte Carlo tests for SHA-1 & SHA-2 */
352 uint16_t expected_input;
358 cli_putstr("\r\nERROR: select algorithm first!");
361 uint8_t ml=shavs_algo->hashsize_b/8;
364 while((c=cli_getc_cecho())!='S' && c!='s'){
365 if(!isblank((uint8_t)c)){
366 cli_putstr("\r\nERROR: wrong input (1) [0x");
368 cli_putstr("]!\r\n");
372 if((c=cli_getc_cecho())!='e' && c!='E'){
373 cli_putstr("\r\nERROR: wrong input (2)!\r\n");
376 if((c=cli_getc_cecho())!='e' && c!='E'){
377 cli_putstr("\r\nERROR: wrong input (3)!\r\n");
380 if((c=cli_getc_cecho())!='d' && c!='D'){
381 cli_putstr("\r\nERROR: wrong input (4)!\r\n");
384 while((c=cli_getc_cecho())!='='){
385 if(!isblank((uint8_t)c)){
386 cli_putstr("\r\nERROR: wrong input (5)!\r\n");
390 expected_input = ml*2;
391 memset(m+2*ml, 0, ml);
395 if(c>='0' && c<='9'){
399 if(c>='a' && c<='f'){
414 }while(expected_input);
415 /* so we have the seed */
416 cli_putstr("\r\nstarting processing");
418 for(count=0; count<100; ++count){
419 memcpy(m, m+ml*2, ml);
420 memcpy(m+ml, m+ml*2, ml);
421 for(j=0; j<1000; ++j){
422 hfal_hash_mem(shavs_algo, m+ml*3, m, ml*3*8);
423 memmove(m, m+ml, 3*ml);
425 cli_putstr("\r\n\r\nCOUNT = ");
427 cli_putc(count/10+'0');
429 cli_putc(count%10+'0');
430 cli_putstr("\r\nMD = ");
431 cli_hexdump(m+ml*2, ml);
436 void shavs_test3(void){ /* Monte Carlo tests for SHA-3 */
437 uint16_t expected_input;
443 cli_putstr("\r\nERROR: select algorithm first!");
446 uint8_t ml=shavs_algo->hashsize_b/8;
449 while((c=cli_getc_cecho())!='S' && c!='s'){
450 if(!isblank((uint8_t)c)){
451 cli_putstr("\r\nERROR: wrong input (1) [0x");
453 cli_putstr("]!\r\n");
457 if((c=cli_getc_cecho())!='e' && c!='E'){
458 cli_putstr("\r\nERROR: wrong input (2)!\r\n");
461 if((c=cli_getc_cecho())!='e' && c!='E'){
462 cli_putstr("\r\nERROR: wrong input (3)!\r\n");
465 if((c=cli_getc_cecho())!='d' && c!='D'){
466 cli_putstr("\r\nERROR: wrong input (4)!\r\n");
469 while((c=cli_getc_cecho())!='='){
470 if(!isblank((uint8_t)c)){
471 cli_putstr("\r\nERROR: wrong input (5)!\r\n");
475 expected_input = 1024/4;
476 memset(m+ml, 0, 1024/8);
480 if(c>='0' && c<='9'){
484 if(c>='a' && c<='f'){
499 }while(expected_input);
500 /* so we have the seed */
501 cli_putstr("\r\nstarting processing");
503 for(count=0; count<100; ++count){
504 for(j=0; j<1000; ++j){
505 hfal_hash_mem(shavs_algo, m, m+ml, 1024);
506 memmove(m+ml, m, 1024/8);
508 cli_putstr("\r\n\r\nj = ");
510 cli_putc(count/10+'0');
512 cli_putc(count%10+'0');
513 cli_putstr("\r\nMD = ");
514 cli_hexdump(m+ml, ml);