/** * * author: Daniel Otte * email: daniel.otte@rub.de * license: GPLv3 * * a suit for running the nessie-tests for blockciphers * * */ #include #include #include "nessie_bc_test.h" #include "uart.h" nessie_bc_ctx_t nessie_bc_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; iBYTESPERLINE)?BYTESPERLINE:toprint)*8); buffer += BYTESPERLINE; toprint -= BYTESPERLINE; } } } void nessie_bc_enc(uint8_t* key, uint8_t* pt){ uint8_t ctx[nessie_bc_ctx.ctx_size_B]; uint8_t buffer[nessie_bc_ctx.blocksize_B]; uint16_t i; /* single test */ printitem("key", key, (nessie_bc_ctx.keysize_b+7)/8); nessie_bc_ctx.cipher_genctx(key, nessie_bc_ctx.keysize_b, ctx); memcpy(buffer, pt, nessie_bc_ctx.blocksize_B); printitem("plain", buffer, nessie_bc_ctx.blocksize_B); nessie_bc_ctx.cipher_enc(buffer, ctx); printitem("cipher", buffer, nessie_bc_ctx.blocksize_B); nessie_bc_ctx.cipher_dec(buffer, ctx); printitem("decrypted", buffer, nessie_bc_ctx.blocksize_B); /* 100 times test */ memcpy(buffer, pt, nessie_bc_ctx.blocksize_B); for(i=0; i<100; ++i){ nessie_bc_ctx.cipher_enc(buffer, ctx); } printitem("Iterated 100 times", buffer, nessie_bc_ctx.blocksize_B); #ifndef NESSIE_NO1KTEST /* 1000 times test, we use the 100 precedig steps to fasten things a bit */ for(; i<1000; ++i){ nessie_bc_ctx.cipher_enc(buffer, ctx); } printitem("Iterated 1000 times", buffer, nessie_bc_ctx.blocksize_B); #endif } void nessie_bc_dec(uint8_t* key, uint8_t* ct){ uint8_t ctx[nessie_bc_ctx.ctx_size_B]; uint8_t buffer[nessie_bc_ctx.blocksize_B]; /* single test */ printitem("key", key, (nessie_bc_ctx.keysize_b+7)/8); nessie_bc_ctx.cipher_genctx(key, nessie_bc_ctx.keysize_b, ctx); memcpy(buffer, ct, nessie_bc_ctx.blocksize_B); printitem("cipher", buffer, nessie_bc_ctx.blocksize_B); nessie_bc_ctx.cipher_dec(buffer, ctx); printitem("plain", buffer, nessie_bc_ctx.blocksize_B); nessie_bc_ctx.cipher_enc(buffer, ctx); printitem("encrypted", buffer, nessie_bc_ctx.blocksize_B); } 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_bc_ctx.name); uart_putstr_P(PSTR("\r\n")); for(i=0; i<16+strlen(nessie_bc_ctx.name); ++i){ uart_putc('='); } uart_putstr_P(PSTR("\r\nKey size: ")); if(nessie_bc_ctx.keysize_b>100){ uart_putc('0'+nessie_bc_ctx.keysize_b/100); } if(nessie_bc_ctx.keysize_b>10){ uart_putc('0'+(nessie_bc_ctx.keysize_b/10)%10); } uart_putc('0'+nessie_bc_ctx.keysize_b%10); uart_putstr_P(PSTR(" bits\r\nBlock size: ")); if(nessie_bc_ctx.blocksize_B*8>100){ uart_putc('0'+(nessie_bc_ctx.blocksize_B*8)/100); } if(nessie_bc_ctx.blocksize_B*8>10){ uart_putc('0'+((nessie_bc_ctx.blocksize_B*8)/10)%10); } uart_putc('0'+(nessie_bc_ctx.blocksize_B*8)%10); uart_putstr_P(PSTR(" bits")); } static void print_footer(void){ uart_putstr_P(PSTR("\r\n\r\n\r\n\r\nEnd of test vectors\r\n\r\n")); } void nessie_bc_run(void){ uint16_t i; uint8_t set; uint8_t key[(nessie_bc_ctx.keysize_b+7)/8]; uint8_t buffer[nessie_bc_ctx.blocksize_B]; print_header(); /* test set 1 */ set=1; print_setheader(set); for(i=0; i>(i%8); memset(buffer, 0, nessie_bc_ctx.blocksize_B); nessie_bc_enc(key, buffer); } /* test set 2 */ set=2; print_setheader(set); for(i=0; i>(i%8); nessie_bc_enc(key, buffer); } /* test set 3 */ set=3; print_setheader(set); for(i=0; i<256; ++i){ print_set_vector(set, i); memset(key, i, (nessie_bc_ctx.keysize_b+7)/8); memset(buffer, i, nessie_bc_ctx.blocksize_B); nessie_bc_enc(key, buffer); } /* test set 4 */ set=4; print_setheader(set); /* 4 - 0*/ print_set_vector(set, 0); for(i=0; i<(nessie_bc_ctx.keysize_b+7)/8; ++i){ key[i]=i; } for(i=0; i>(i%8); memset(buffer, 0, nessie_bc_ctx.blocksize_B); nessie_bc_dec(key, buffer); } /* test set 6 */ set=6; print_setheader(set); for(i=0; i>(i%8); nessie_bc_dec(key, buffer); } /* test set 7 */ set=7; print_setheader(set); for(i=0; i<256; ++i){ print_set_vector(set, i); memset(key, i, (nessie_bc_ctx.keysize_b+7)/8); memset(buffer, i, nessie_bc_ctx.blocksize_B); nessie_bc_dec(key, buffer); } /* test set 8 */ set=8; print_setheader(set); /* 8 - 0*/ print_set_vector(set, 0); for(i=0; i<(nessie_bc_ctx.keysize_b+7)/8; ++i){ key[i]=i; } for(i=0; i