static uint16_t read_byte(void) { uint8_t t1, t2; char c; c = cli_getc_cecho(); if (c == '-') { return 0x0500; } t1 = char2nibble(c); if (t1 == 0xff) { return 0x0100; } c = cli_getc_cecho(); t2 = char2nibble(c); if (t2 == 0xff) { return 0x0200|t1; } return (t1 << 4)|t2; }
/** * \brief reads a line or max n characters from the console * Writes characters from the console into the supplyed buffer until a '\r' * character is recieved or until n character a read (whatever happens first). * The string will always be terminated by a '\0' character, so the buffer * should have at least a size of n+1. */ uint8_t cli_getsn(char* s, uint32_t n) { char c; if(n==0) return 2; while((c=cli_getc_cecho())!='\0' && c!='\r' && n) { --n; *s++=c; } *s='\0'; return (c=='\r')?0:1; }
void shavs_test3(void){ /* Monte Carlo tests for SHA-3 */ uint16_t expected_input; uint16_t count; uint8_t v; uint8_t index=0; char c; if(!shavs_algo){ cli_putstr("\r\nERROR: select algorithm first!"); return; } uint8_t ml=shavs_algo->hashsize_b/8; uint8_t m[ml+128]; for(;;){ while((c=cli_getc_cecho())!='S' && c!='s'){ if(!isblank((uint8_t)c)){ cli_putstr("\r\nERROR: wrong input (1) [0x"); cli_hexdump(&c, 1); cli_putstr("]!\r\n"); return; } } if((c=cli_getc_cecho())!='e' && c!='E'){ cli_putstr("\r\nERROR: wrong input (2)!\r\n"); return; } if((c=cli_getc_cecho())!='e' && c!='E'){ cli_putstr("\r\nERROR: wrong input (3)!\r\n"); return; } if((c=cli_getc_cecho())!='d' && c!='D'){ cli_putstr("\r\nERROR: wrong input (4)!\r\n"); return; } while((c=cli_getc_cecho())!='='){ if(!isblank((uint8_t)c)){ cli_putstr("\r\nERROR: wrong input (5)!\r\n"); return; } } expected_input = 1024/4; memset(m+ml, 0, 1024/8); do{ v=0xff; c=cli_getc_cecho(); if(c>='0' && c<='9'){ v = c - '0'; }else{ c |= 'A'^'a'; if(c>='a' && c<='f'){ v = c - 'a' +10; } } if(v<0x10){ c=m[ml+index/2]; if(index&1){ c |= v; }else{ c |=v<<4; } m[ml+index/2]=c; index++; expected_input--; } }while(expected_input); /* so we have the seed */ cli_putstr("\r\nstarting processing"); uint16_t j; for(count=0; count<100; ++count){ for(j=0; j<1000; ++j){ hfal_hash_mem(shavs_algo, m, m+ml, 1024); memmove(m+ml, m, 1024/8); } cli_putstr("\r\n\r\nj = "); if(count>=10){ cli_putc(count/10+'0'); } cli_putc(count%10+'0'); cli_putstr("\r\nMD = "); cli_hexdump(m+ml, ml); } } }
void shavs_test1(void){ /* KAT tests */ uint32_t length=0; int32_t expect_input=0; if(!shavs_algo){ cli_putstr("\r\nERROR: select algorithm first!"); return; } char c; uint8_t diggest[shavs_algo->hashsize_b/8]; shavs_ctx.buffersize_B=shavs_algo->blocksize_b/8; uint8_t buffer[shavs_ctx.buffersize_B+5]; shavs_ctx.buffer = buffer; cli_putstr("\r\nbuffer_size = 0x"); cli_hexdump_rev(&(shavs_ctx.buffersize_B), 2); cli_putstr(" bytes"); for(;;){ shavs_ctx.blocks = 0; memset(buffer, 0, shavs_ctx.buffersize_B); length = getLength(); if((int32_t)length<0){ #if DEBUG cli_putstr("\r\n(x) Len == "); cli_hexdump_rev(&length, 4); uart_flush(0); #endif return; } #if DEBUG cli_putstr("\r\nLen == "); cli_hexdump_rev(&length, 4); uart_flush(0); #endif if(length==0){ expect_input=2; }else{ expect_input=((length + 7) >> 2) & (~1L); } #if DEBUG cli_putstr("\r\nexpected_input == "); cli_hexdump_rev(&expect_input, 4); if(expect_input==0) cli_putstr("\r\nexpected_input == 0 !!!"); #endif shavs_ctx.buffer_idx = 0; shavs_ctx.in_byte = 0; shavs_ctx.blocks = 0; uint8_t ret; #if DEBUG cli_putstr("\r\n HFAL init"); cli_putstr("\r\n (2) expected_input == "); cli_hexdump_rev(&expect_input, 4); #endif ret = hfal_hash_init(shavs_algo, &(shavs_ctx.ctx)); if(ret){ cli_putstr("\r\n HFAL init returned with: "); cli_hexdump(&ret, 1); return; } #if DEBUG cli_putstr("\r\n (3) expected_input == "); cli_hexdump_rev(&expect_input, 4); cli_putstr("\r\n"); #endif while((c=cli_getc_cecho())!='M' && c!='m'){ if(!isblank((uint8_t)c)){ cli_putstr("\r\nERROR: wrong input (1) [0x"); cli_hexdump(&c, 1); cli_putstr("]!\r\n"); hfal_hash_free(&(shavs_ctx.ctx)); return; } } if((c=cli_getc_cecho())!='s' && c!='S'){ cli_putstr("\r\nERROR: wrong input (2)!\r\n"); hfal_hash_free(&(shavs_ctx.ctx)); return; } if((c=cli_getc_cecho())!='g' && c!='G'){ cli_putstr("\r\nERROR: wrong input (3)!\r\n"); hfal_hash_free(&(shavs_ctx.ctx)); return; } while((c=cli_getc_cecho())!='='){ if(!isblank((uint8_t)c)){ cli_putstr("\r\nERROR: wrong input (4)!\r\n"); hfal_hash_free(&(shavs_ctx.ctx)); return; } } #if DEBUG cli_putstr("\r\nparsing started"); #endif shavs_ctx.buffer_idx = 0; shavs_ctx.in_byte = 0; shavs_ctx.blocks = 0; while(expect_input>0){ c=cli_getc_cecho(); #if DEBUG cli_putstr("\r\n\t("); cli_hexdump_rev(&expect_input, 4); cli_putstr(") "); #endif if(buffer_add(c)==0){ --expect_input; }else{ if(!isblank((uint16_t)c)){ cli_putstr("\r\nERROR: wrong input (5) ("); cli_putc(c); cli_putstr(")!\r\n"); hfal_hash_free(&(shavs_ctx.ctx)); return; } } } #if DEBUG cli_putstr("\r\nBuffer-A:"); cli_hexdump_block(buffer, shavs_ctx.buffersize_B, 5, 8); cli_putstr("\r\n starting finalization"); cli_putstr("\r\n\tblocks == "); cli_hexdump_rev(&(shavs_ctx.blocks),4); cli_putstr("\r\n\tbuffer_idx == "); cli_hexdump_rev(&(shavs_ctx.buffer_idx),2); cli_putstr("\r\n\tin_byte == "); cli_hexdump_rev(&(shavs_ctx.in_byte),1); cli_putstr("\r\n starting last block"); cli_putstr("\r\n\tlength == "); cli_hexdump_rev(&length,4); cli_putstr("\r\n\tbuffersize_B == "); cli_hexdump_rev(&(shavs_ctx.buffersize_B),2); uint16_t temp=length-(shavs_ctx.blocks)*((shavs_ctx.buffersize_B)*8); cli_putstr("\r\n\t (temp) == "); cli_hexdump_rev(&temp,2); #else uint16_t temp=length-(shavs_ctx.blocks)*((shavs_ctx.buffersize_B)*8); #endif hfal_hash_lastBlock( &(shavs_ctx.ctx), buffer, /* be aware of freaking compilers!!! */ temp ); #if DEBUG cli_putstr("\r\n starting ctx2hash"); #endif hfal_hash_ctx2hash(diggest, &(shavs_ctx.ctx)); #if DEBUG cli_putstr("\r\n starting hash free"); #endif hfal_hash_free(&(shavs_ctx.ctx)); cli_putstr("\r\n MD = "); cli_hexdump(diggest, shavs_algo->hashsize_b/8); } }
void shavs_test1(void){ /* KAT tests */ uint32_t length=0; int32_t expect_input=0; if(!shavs_algo){ fputs_P(PSTR("\r\nERROR: select algorithm first!"), shavs_out_file); return; } char c; uint8_t diggest[pgm_read_word(&(shavs_algo->hashsize_b))/8]; shavs_ctx.buffersize_B=pgm_read_word(&(shavs_algo->blocksize_b))/8; uint8_t buffer[shavs_ctx.buffersize_B+5]; shavs_ctx.buffer = buffer; fprintf_P(shavs_out_file, PSTR("\nbuffer_size = 0x%04"PRIx16" bytes"), shavs_ctx.buffersize_B); for(;;){ shavs_ctx.blocks = 0; memset(buffer, 0, shavs_ctx.buffersize_B); length = getLength(); if(length<0){ return; } #if DEBUG fprintf_P(shavs_out_file, PSTR("\nLen == %"PRIu32), length) #endif if(length==0){ expect_input=2; }else{ expect_input=((length + 7) >> 2) & (~1L); } #if DEBUG fprintf_P(shavs_out_file, PSTR("\r\nexpected_input == %"PRId32), expected_input); #endif shavs_ctx.buffer_idx = 0; shavs_ctx.in_byte = 0; shavs_ctx.blocks = 0; uint8_t ret; #if DEBUG fprintf_P(shavs_out_file, PSTR("\n HFAL init\n (2) expected_input == "), expected_input); #endif ret = hfal_hash_init(shavs_algo, &(shavs_ctx.ctx)); if(ret){ fprintf_P(shavs_out_file, PSTR("\r\n HFAL init returned with: %"PRIx8), ret); return; } #if DEBUG fprintf_P(shavs_out_file, PSTR("\r\n (3) expected_input == %"PRId32"\n"), expected_input) #endif while((c=cli_getc_cecho())!='M' && c!='m'){ if(!isblank(c)){ fprintf_P(shavs_out_file, PSTR("\nERROR: wrong input (1) [0x%"PRIx8"]!\n"), c); hfal_hash_free(&(shavs_ctx.ctx)); return; } } if((c=cli_getc_cecho())!='s' && c!='S'){ fputs_P(PSTR("\nERROR: wrong input (2)!\n"), shavs_out_file); hfal_hash_free(&(shavs_ctx.ctx)); return; } if((c=cli_getc_cecho())!='g' && c!='G'){ fputs_P(PSTR("\nERROR: wrong input (3)!\n"), shavs_out_file); hfal_hash_free(&(shavs_ctx.ctx)); return; } while((c=cli_getc_cecho())!='='){ if(!isblank(c)){ fputs_P(PSTR("\nERROR: wrong input (4)!\n"), shavs_out_file); hfal_hash_free(&(shavs_ctx.ctx)); return; } } #if DEBUG fputs_P(PSTR("\r\nparsing started"), shavs_out_file); #endif shavs_ctx.buffer_idx = 0; shavs_ctx.in_byte = 0; shavs_ctx.blocks = 0; while(expect_input>0){ c=cli_getc_cecho(); #if DEBUG fprintf_P(shavs_out_file, PSTR("\n\t(%"PRId32") "), expected_input); _delay_ms(500); #endif if(buffer_add(c)==0){ --expect_input; }else{ if(!isblank((uint16_t)c)){ fprintf_P(shavs_out_file, PSTR("\nERROR: wrong input (5) (%c)!\n"), c); hfal_hash_free(&(shavs_ctx.ctx)); return; } } } #if DEBUG cli_putstr_P(PSTR("\r\nBuffer-A:")); cli_hexdump_block(buffer, shavs_ctx.buffersize_B, 5, 8); cli_putstr_P(PSTR("\r\n starting finalisation")); cli_putstr_P(PSTR("\r\n\tblocks == ")); cli_hexdump_rev(&(shavs_ctx.blocks),4); cli_putstr_P(PSTR("\r\n\tbuffer_idx == ")); cli_hexdump_rev(&(shavs_ctx.buffer_idx),2); cli_putstr_P(PSTR("\r\n\tin_byte == ")); cli_hexdump_rev(&(shavs_ctx.in_byte),1); _delay_ms(500); cli_putstr_P(PSTR("\r\n starting last block")); cli_putstr_P(PSTR("\r\n\tlength == ")); cli_hexdump_rev(&length,4); cli_putstr_P(PSTR("\r\n\tbuffersize_B == ")); cli_hexdump_rev(&(shavs_ctx.buffersize_B),2); uint16_t temp=length-(shavs_ctx.blocks)*((shavs_ctx.buffersize_B)*8); cli_putstr_P(PSTR("\r\n\t (temp) == ")); cli_hexdump_rev(&temp,2); _delay_ms(500); temp=length-(shavs_ctx.blocks)*((shavs_ctx.buffersize_B)*8); #else uint16_t temp=length-(shavs_ctx.blocks)*((shavs_ctx.buffersize_B)*8); #endif hfal_hash_lastBlock( &(shavs_ctx.ctx), buffer, /* be aware of freaking compilers!!! */ temp ); #if DEBUG cli_putstr_P(PSTR("\r\n starting ctx2hash")); _delay_ms(500); #endif hfal_hash_ctx2hash(diggest, &(shavs_ctx.ctx)); #if DEBUG cli_putstr_P(PSTR("\r\n starting hash free")); #endif hfal_hash_free(&(shavs_ctx.ctx)); cli_putstr_P(PSTR("\r\n MD = ")); cli_hexdump(diggest, pgm_read_word(&(shavs_algo->hashsize_b))/8); } }