sha256 and xtea got each a own testsuit

This commit is contained in:
bg 2008-04-06 05:58:07 +00:00
parent 8537c7a064
commit 222f3914d6
9 changed files with 510 additions and 14 deletions

View File

@ -25,13 +25,13 @@ void arcfour_genctx_dummy(uint8_t* key, uint16_t keysize, void* ctx){
void testrun_arcfour(void){
void testrun_nessie_arcfour(void){
nessie_stream_ctx.outsize_b = 8; /* actually unused */
nessie_stream_ctx.keysize_b = 128; /* this is theone we have refrence vectors for */
nessie_stream_ctx.name = cipher_name;
nessie_stream_ctx.ctx_size_B = sizeof(arcfour_ctx_t);
nessie_stream_ctx.cipher_genctx = arcfour_genctx_dummy;
nessie_stream_ctx.cipher_enc = arcfour_gen;
nessie_stream_ctx.cipher_genctx = (nessie_stream_genctx_fpt)arcfour_genctx_dummy;
nessie_stream_ctx.cipher_enc = (nessie_stream_genenc_fpt)arcfour_gen;
nessie_stream_run();
}
@ -54,8 +54,8 @@ int main (void){
restart:
while(1){
if (!getnextwordn(str,20)) {DEBUG_S("DBG: W1\r\n"); goto error;}
if (strcmp(str, "test")) {DEBUG_S("DBG: 1b\r\n"); goto error;}
testrun_arcfour();
if (strcmp(str, "nessie")) {DEBUG_S("DBG: 1b\r\n"); goto error;}
testrun_nessie_arcfour();
goto restart;
continue;
error:

View File

@ -23,7 +23,7 @@ void serpent_genctx_dummy(uint8_t* key, uint16_t keysize, void* ctx){
serpent_genctx(key, keysize&0xff, ctx);
}
void testrun_serpent(void){
void testrun_nessie_serpent(void){
nessie_ctx.blocksize_B = 16;
nessie_ctx.keysize = 128;
nessie_ctx.name = cipher_name;
@ -60,14 +60,13 @@ int main (void){
restart:
while(1){
if (!getnextwordn(str,20)) {DEBUG_S("DBG: W1\r\n"); goto error;}
if (strcmp(str, "test")) {DEBUG_S("DBG: 1b\r\n"); goto error;}
testrun_serpent();
if (strcmp(str, "nessie")) {DEBUG_S("DBG: 1b\r\n"); goto error;}
testrun_nessie_serpent();
goto restart;
continue;
error:
uart_putstr("ERROR\r\n");
}
}

70
main-sha256-test.c Normal file
View File

@ -0,0 +1,70 @@
/*
* SHA-256 test-suit
*
*/
#include "config.h"
#include "serial-tools.h"
#include "uart.h"
#include "debug.h"
#include "sha256.h"
#include "nessie_hash_test.h"
#include <stdint.h>
#include <string.h>
char* algo_name = "SHA-256";
/*****************************************************************************
* additional validation-functions *
*****************************************************************************/
void sha256_next_dummy(void* buffer, void* ctx){
sha256_nextBlock(ctx, buffer);
}
void sha256_last_dummy(void* buffer, uint16_t size_b, void* ctx){
sha256_lastBlock(ctx, buffer, size_b);
}
void testrun_nessie_sha256(void){
nessie_hash_ctx.hashsize_b = 256;
nessie_hash_ctx.blocksize_B = 512/8;
nessie_hash_ctx.ctx_size_B = sizeof(sha256_ctx_t);
nessie_hash_ctx.name = algo_name;
nessie_hash_ctx.hash_init = (nessie_hash_init_fpt)sha256_init;
nessie_hash_ctx.hash_next = (nessie_hash_next_fpt)sha256_next_dummy;
nessie_hash_ctx.hash_last = (nessie_hash_last_fpt)sha256_last_dummy;
nessie_hash_ctx.hash_conv = (nessie_hash_conv_fpt)sha256_ctx2hash;
nessie_hash_run();
}
/*****************************************************************************
* main *
*****************************************************************************/
int main (void){
char str[20];
DEBUG_INIT();
uart_putstr("\r\n");
uart_putstr_P(PSTR("\r\n\r\nCrypto-VS ("));
uart_putstr(algo_name);
uart_putstr_P(PSTR(")\r\nloaded and running\r\n"));
restart:
while(1){
if (!getnextwordn(str,20)) {DEBUG_S("DBG: W1\r\n"); goto error;}
if (strcmp(str, "nessie")) {DEBUG_S("DBG: 1b\r\n"); goto error;}
testrun_nessie_sha256();
goto restart;
continue;
error:
uart_putstr("ERROR\r\n");
}
}

68
main-xtea-test.c Normal file
View File

@ -0,0 +1,68 @@
/*
* XTEA test-suit
*
*/
#include "config.h"
#include "serial-tools.h"
#include "uart.h"
#include "debug.h"
#include "xtea.h"
#include "nessie_bc_test.h"
#include <stdint.h>
#include <string.h>
char* cipher_name = "XTEA";
void xtea_genctx_dummy(uint8_t* key, uint16_t keysize, void* ctx){
memcpy(ctx, key, (keysize+7)/8);
}
void xtea_enc_dummy(uint8_t* buffer, void* ctx){
xtea_enc((uint32_t*)buffer, (uint32_t*)buffer, ctx);
}
void xtea_dec_dummy(uint8_t* buffer, void* ctx){
xtea_dec((uint32_t*)buffer, (uint32_t*)buffer, ctx);
}
void testrun_xtea(void){
nessie_ctx.blocksize_B = 8;
nessie_ctx.keysize = 128;
nessie_ctx.name = cipher_name;
nessie_ctx.ctx_size_B = 128/8;
nessie_ctx.cipher_enc = (nessie_enc_fpt)xtea_enc_dummy;
nessie_ctx.cipher_dec = (nessie_dec_fpt)xtea_dec_dummy;
nessie_ctx.cipher_genctx = (nessie_gen_fpt)xtea_genctx_dummy;
nessie_run();
}
/*****************************************************************************
* main *
*****************************************************************************/
int main (void){
char str[20];
DEBUG_INIT();
uart_putstr("\r\n");
uart_putstr_P(PSTR("\r\n\r\nCrypto-VS ("));
uart_putstr(cipher_name);
uart_putstr_P(PSTR(")\r\nloaded and running\r\n"));
restart:
while(1){
if (!getnextwordn(str,20)) {DEBUG_S("DBG: W1\r\n"); goto error;}
if (strcmp(str, "nessie")) {DEBUG_S("DBG: 1b\r\n"); goto error;}
testrun_xtea();
goto restart;
continue;
error:
uart_putstr("ERROR\r\n");
}
}

2
md5.c
View File

@ -120,7 +120,7 @@ void md5_lastBlock(md5_ctx_t *state, void* block, uint16_t length){
while (length >= 512){
md5_nextBlock(state, block);
length -= 512;
block += 512/8;
block = ((uint8_t*)block) + 512/8;
}
memset(b, 0, 64);
memcpy(b, block, length/8);

331
nessie_hash_test.c Normal file
View File

@ -0,0 +1,331 @@
/**
*
* author: Daniel Otte
* email: daniel.otte@rub.de
* license: GPLv3
*
* a suit for running the nessie-tests for hashes
*
* */
#include <stdint.h>
#include <string.h>
#include "nessie_hash_test.h"
#include "uart.h"
nessie_hash_ctx_t nessie_hash_ctx;
static void printblock(uint8_t* block, uint16_t blocksize_bit){
char tab [] = {'0', '1', '2', '3',
'4', '5', '6', '7',
'8', '9', 'A', 'B',
'C', 'D', 'E', 'F'};
uint16_t i;
for(i=0; i<(blocksize_bit+7)/8; ++i){
uart_putc(tab[(block[i])>>4]);
uart_putc(tab[(block[i])&0xf]);
}
}
#define SPACES 31
#define BYTESPERLINE 16
static void printitem(char* name, uint8_t* buffer, uint16_t size_B){
uint8_t name_len;
uint8_t i;
name_len=strlen(name);
if(name_len>SPACES-1){
uart_putstr_P(PSTR("\r\n!!! formatting error !!!\r\n"));
return;
}
uart_putstr_P(PSTR("\r\n"));
for(i=0; i<SPACES-name_len-1; ++i){
uart_putc(' ');
}
uart_putstr(name);
uart_putc('=');
/* now the data printing begins */
if(size_B<=BYTESPERLINE){
/* one line seems sufficient */
printblock(buffer, size_B*8);
} else {
/* we need more lines */
printblock(buffer, BYTESPERLINE*8); /* first line */
int16_t toprint = size_B - BYTESPERLINE;
buffer += BYTESPERLINE;
while(toprint > 0){
uart_putstr_P(PSTR("\r\n"));
for(i=0; i<SPACES; ++i){
uart_putc(' ');
}
printblock(buffer, ((toprint>BYTESPERLINE)?BYTESPERLINE:toprint)*8);
buffer += BYTESPERLINE;
toprint -= BYTESPERLINE;
}
}
}
static void print_set_vector(uint8_t set, uint16_t vector){
uart_putstr_P(PSTR("\r\n\r\nSet "));
uart_putc('0'+set%10);
uart_putstr_P(PSTR(", vector#"));
uart_putc((vector<100)?' ':'0'+vector/100);
uart_putc((vector<10 )?' ':'0'+(vector/10)%10);
uart_putc('0'+vector%10);
uart_putc(':');
}
/* example:
Test vectors -- set 3
=====================
*/
static void print_setheader(uint8_t set){
uart_putstr_P(PSTR("\r\n\r\nTest vectors -- set "));
uart_putc('0'+set%10);
uart_putstr_P(PSTR("\r\n====================="));
}
/* example:
********************************************************************************
*Project NESSIE - New European Schemes for Signature, Integrity, and Encryption*
********************************************************************************
Primitive Name: Serpent
=======================
Key size: 256 bits
Block size: 128 bits
*/
static void print_header(void){
uint16_t i;
uart_putstr_P(PSTR("\r\n\r\n"
"********************************************************************************\r\n"
"* micro-cryt - crypto primitives for microcontrolles by Daniel Otte *\r\n"
"********************************************************************************\r\n"
"\r\n"));
uart_putstr_P(PSTR("Primitive Name: "));
uart_putstr(nessie_hash_ctx.name);
uart_putstr_P(PSTR("\r\n"));
for(i=0; i<16+strlen(nessie_hash_ctx.name); ++i){
uart_putc('=');
}
uart_putstr_P(PSTR("\r\nHash size: "));
if(nessie_hash_ctx.hashsize_b >100){
uart_putc('0'+nessie_hash_ctx.hashsize_b/100);
}
if(nessie_hash_ctx.hashsize_b>10){
uart_putc('0'+(nessie_hash_ctx.hashsize_b/10)%10);
}
uart_putc('0'+nessie_hash_ctx.hashsize_b%10);
uart_putstr_P(PSTR(" bits\r\n"));
}
static void print_footer(void){
uart_putstr_P(PSTR("\r\n\r\n\r\n\r\nEnd of test vectors"));
}
static
void ascii_hash(char* data, char* desc){
uint8_t ctx[nessie_hash_ctx.ctx_size_B];
uint8_t hash[(nessie_hash_ctx.hashsize_b+7)/8];
uint16_t sl;
uart_putstr_P(PSTR("\r\n message="));
uart_putstr(desc);
nessie_hash_ctx.hash_init(ctx);
sl = strlen(data);
while(sl>=nessie_hash_ctx.blocksize_B){
nessie_hash_ctx.hash_next(data, ctx);
data += nessie_hash_ctx.blocksize_B;
sl -= nessie_hash_ctx.blocksize_B;
}
nessie_hash_ctx.hash_last(data, sl*8, ctx);
nessie_hash_ctx.hash_conv(hash, ctx);
printitem("hash", hash, (nessie_hash_ctx.hashsize_b+7)/8);
}
// message=1 million times "a"
static
void amillion_hash(void){
uint8_t ctx[nessie_hash_ctx.ctx_size_B];
uint8_t hash[(nessie_hash_ctx.hashsize_b+7)/8];
uint8_t block[nessie_hash_ctx.blocksize_B];
uint32_t n=1000000LL;
uart_putstr_P(PSTR("\r\n message="));
uart_putstr_P(PSTR("1 million times \"a\""));
memset(block, 'a', nessie_hash_ctx.blocksize_B);
nessie_hash_ctx.hash_init(ctx);
while(n>=nessie_hash_ctx.blocksize_B){
nessie_hash_ctx.hash_next(block, ctx);
n -= nessie_hash_ctx.blocksize_B;
}
nessie_hash_ctx.hash_last(block, n*8, ctx);
nessie_hash_ctx.hash_conv(hash, ctx);
printitem("hash", hash, (nessie_hash_ctx.hashsize_b+7)/8);
}
static
void zero_hash(uint16_t n){
uint8_t ctx[nessie_hash_ctx.ctx_size_B];
uint8_t hash[(nessie_hash_ctx.hashsize_b+7)/8];
uint8_t block[nessie_hash_ctx.blocksize_B];
uart_putstr_P(PSTR("\r\n message="));
if(n>=10000)
uart_putc('0'+n/10000);
if(n>=1000)
uart_putc('0'+(n/1000)%10);
if(n>=100)
uart_putc('0'+(n/100)%10);
if(n>=10)
uart_putc('0'+(n/10)%10);
uart_putc('0'+n%10);
uart_putstr_P(PSTR(" zero bits"));
memset(block, 0, nessie_hash_ctx.blocksize_B);
nessie_hash_ctx.hash_init(ctx);
while(n>=nessie_hash_ctx.blocksize_B*8){
nessie_hash_ctx.hash_next(block, ctx);
n -= nessie_hash_ctx.blocksize_B*8;
}
nessie_hash_ctx.hash_last(block, n, ctx);
nessie_hash_ctx.hash_conv(hash, ctx);
printitem("hash", hash, (nessie_hash_ctx.hashsize_b+7)/8);
}
static
void one_in512_hash(uint16_t pos){
uint8_t ctx[nessie_hash_ctx.ctx_size_B];
uint8_t hash[(nessie_hash_ctx.hashsize_b+7)/8];
uint8_t block[nessie_hash_ctx.blocksize_B];
uint16_t n=512;
char* tab[8]={"80", "40", "20", "10",
"08", "04", "02", "01" };
pos&=511;
uart_putstr_P(PSTR("\r\n message="));
uart_putstr_P(PSTR("512-bit string: "));
if((pos/8) >=10){
uart_putc('0'+(pos/8/10)%10);
} else {
uart_putc(' ');
}
uart_putc('0'+(pos/8)%10);
uart_putstr_P(PSTR("*00,"));
uart_putstr(tab[pos&7]);
uart_putc(',');
if(63-(pos/8) >=10){
uart_putc('0'+((63-pos/8)/10)%10);
} else {
uart_putc(' ');
}
uart_putc('0'+(63-pos/8)%10);
uart_putstr_P(PSTR("*00"));
/* now the real stuff */
block[pos>>3] = 0x80>>(pos&0x7);
nessie_hash_ctx.hash_init(ctx);
while(n>=nessie_hash_ctx.blocksize_B*8){
nessie_hash_ctx.hash_next(block, ctx);
n -= nessie_hash_ctx.blocksize_B*8;
}
nessie_hash_ctx.hash_last(block, n, ctx);
nessie_hash_ctx.hash_conv(hash, ctx);
printitem("hash", hash, (nessie_hash_ctx.hashsize_b+7)/8);
}
static
void tv4_hash(void){
uint8_t ctx[nessie_hash_ctx.ctx_size_B];
uint8_t hash[(nessie_hash_ctx.hashsize_b+7)/8];
uint8_t block[256/8];
uint16_t n=256;
uint32_t i;
uart_putstr_P(PSTR("\r\n message="));
uart_putstr(PSTR("256 zero bits"));
memset(block, 0, 256/8);
nessie_hash_ctx.hash_init(ctx);
while(n>=nessie_hash_ctx.blocksize_B*8){
nessie_hash_ctx.hash_next(block, ctx);
n -= nessie_hash_ctx.blocksize_B*8;
}
nessie_hash_ctx.hash_last(block, n*8, ctx);
nessie_hash_ctx.hash_conv(hash, ctx);
printitem("hash", hash, (nessie_hash_ctx.hashsize_b+7)/8);
for(i=1; i<100000L; ++i){ /* this assumes BLOCKSIZE >= HASHSIZE */
nessie_hash_ctx.hash_init(ctx);
nessie_hash_ctx.hash_last(block, nessie_hash_ctx.hashsize_b, ctx);
nessie_hash_ctx.hash_conv(hash, ctx);
}
printitem("iterated 100000 times", hash, (nessie_hash_ctx.hashsize_b+7)/8);
}
/*
"" (empty string)
message="a"
message="abc"
message="message digest"
message="abcdefghijklmnopqrstuvwxyz"
message="abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"
message="A...Za...z0...9"
message=8 times "1234567890"
*/
void nessie_hash_run(void){
uint16_t i;
uint8_t set;
print_header();
/* test set 1 */
char* challange[8][2]= {
{"", "\"\" (empty string)"},
{"a", "\"a\""},
{"abc", "\"abc\""},
{"message digest", "\"message digest\""},
{"abcdefghijklmnopqrstuvwxyz","\"abcdefghijklmnopqrstuvwxyz\""},
{"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
"\"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq\""},
{"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz"
"0123456789" , "\"A...Za...z0...9\""},
{"1234567890" "1234567890" "1234567890" "1234567890"
"1234567890" "1234567890" "1234567890" "1234567890",
"8 times \"1234567890\""}
};
set=1;
print_setheader(set);
for(i=0; i<8; ++i){
print_set_vector(set, i);
ascii_hash(challange[i][0], challange[i][1]);
}
print_set_vector(set, i);
amillion_hash();
/* test set 2 */
set=2;
print_setheader(set);
for(i=0; i<1024; ++i){
print_set_vector(set, i);
zero_hash(i);
}
/* test set 3 */
set=3;
print_setheader(set);
for(i=0; i<512; ++i){
print_set_vector(set, i);
one_in512_hash(i);
}
/* test set 4 */
set=4;
print_setheader(set);
print_set_vector(set, 0);
tv4_hash();
print_footer();
}

28
nessie_hash_test.h Normal file
View File

@ -0,0 +1,28 @@
#ifndef NESSIE_HASH_TEST_H_
#define NESSIE_HASH_TEST_H_
#include <stdint.h>
typedef void (*nessie_hash_init_fpt)(void* ctx);
typedef void (*nessie_hash_next_fpt)(void* buffer, void* ctx);
typedef void (*nessie_hash_last_fpt)(void* buffer, uint16_t size_b, void* ctx);
typedef void (*nessie_hash_conv_fpt)(void* buffer, void* ctx);
typedef struct nessie_hash_ctx_st{
uint16_t hashsize_b;
uint16_t blocksize_B;
uint16_t ctx_size_B;
char* name;
nessie_hash_init_fpt hash_init;
nessie_hash_next_fpt hash_next;
nessie_hash_last_fpt hash_last;
nessie_hash_conv_fpt hash_conv;
} nessie_hash_ctx_t;
extern nessie_hash_ctx_t nessie_hash_ctx;
void nessie_hash_run(void);
#endif /*NESSIE_HASH_TEST_H_*/

View File

@ -5,8 +5,8 @@ ALGO_NAME := SHA256
HASHES += $(ALGO_NAME)
$(ALGO_NAME)_OBJ := sha256-asm.o
$(ALGO_NAME)_TEST_BIN := main.o debug.o uart.o serial-tools.o sha256-asm.o \
xtea-asm.o arcfour-asm.o prng.o cast5.o
$(ALGO_NAME)_TEST_BIN := main-sha256-test.o debug.o uart.o serial-tools.o \
sha256-asm.o nessie_hash_test.o
$(ALGO_NAME)_NESSIE_TEST := "nessie"
$(ALGO_NAME)_PEROFRMANCE_TEST := "performance"

View File

@ -5,8 +5,8 @@ ALGO_NAME := XTEA
BLOCK_CIPHERS += $(ALGO_NAME)
$(ALGO_NAME)_OBJ := xtea-asm.o
$(ALGO_NAME)_TEST_BIN := main.o debug.o uart.o serial-tools.o sha256-asm.o \
xtea-asm.o arcfour-asm.o prng.o cast5.o
$(ALGO_NAME)_TEST_BIN := main-xtea-test.o debug.o uart.o serial-tools.o \
xtea-asm.o nessie_bc_test.o
$(ALGO_NAME)_NESSIE_TEST := "nessie"
$(ALGO_NAME)_PEROFRMANCE_TEST := "performance"