X-Git-Url: https://git.cryptolib.org/?p=avr-crypto-lib.git;a=blobdiff_plain;f=bcal%2Fbcal-performance.c;fp=bcal%2Fbcal-performance.c;h=3cd9df41717b6dc050b1ceb124b7f2d13c83d558;hp=c8528f4d99201036a5f08c34f68fa7da0a07c893;hb=8d1970350aa1d7cdcb59cf79f7f60e385e2816e5;hpb=a30df60ac814350db243b270034ef188c8d02d5e diff --git a/bcal/bcal-performance.c b/bcal/bcal-performance.c index c8528f4..3cd9df4 100644 --- a/bcal/bcal-performance.c +++ b/bcal/bcal-performance.c @@ -1,21 +1,21 @@ /* bcal-performance.c */ /* - This file is part of the AVR-Crypto-Lib. - Copyright (C) 2010 Daniel Otte (daniel.otte@rub.de) + This file is part of the AVR-Crypto-Lib. + Copyright (C) 2010 Daniel Otte (daniel.otte@rub.de) - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ /* * \file bcal-performance.c @@ -43,178 +43,181 @@ #define PATTERN_B 0x55 /* -static -void printvalue(unsigned long v){ - char str[20]; - int i; - ultoa(v, str, 10); - for(i = 0; i < 10 - strlen(str); ++i){ - cli_putc(' '); - } - cli_putstr(str); -} -*/ - -void bcal_performance(const bcdesc_t *bcd){ - bcdesc_t bc; - memcpy_P(&bc, bcd, sizeof(bcdesc_t)); - uint8_t ctx[bc.ctxsize_B]; - uint8_t data[(bc.blocksize_b + 7) / 8]; - uint16_t keysize = get_keysize(bc.valid_keysize_desc); - uint8_t key[(keysize + 7) / 8]; - uint64_t t; - uint8_t i; - - if(bc.type != BCDESC_TYPE_BLOCKCIPHER) - return; - calibrateTimer(); - print_overhead(); - printf_P(PSTR("\n\n === %S performance === \n" - "\ttype: blockcipher\n" - "\tkeysize (bits): %5"PRIu16"\n" - "\tctxsize (bytes): %5"PRIu16"\n" - "\tblocksize (bits): %5"PRIu16"\n"), - bc.name, keysize, bc.ctxsize_B, bc.blocksize_b); - uart0_flush(); - t = 0; - if(bc.init.init1){ - if((bc.flags & BC_INIT_TYPE) == BC_INIT_TYPE_1){ - for(i = 0; i < 32; ++i){ - startTimer(1); - START_TIMER; - (bc.init.init1)(key, &ctx); - STOP_TIMER; - t += stopTimer(); - if(i!=31 && bc.free){ - bc.free(&ctx); - } - } - } else { - for(i = 0; i < 32; ++i){ - startTimer(1); - START_TIMER; - (bc.init.init2)(key, keysize, &ctx); - STOP_TIMER; - t += stopTimer(); - if(i!=31 && bc.free){ - bc.free(&ctx); - } - } - } - t >>= 5; - printf_P(PSTR(" init (cycles): %5"PRIu16"\n"), t); - } + static + void printvalue(unsigned long v){ + char str[20]; + int i; + ultoa(v, str, 10); + for(i = 0; i < 10 - strlen(str); ++i){ + cli_putc(' '); + } + cli_putstr(str); + } + */ + +void bcal_performance(const bcdesc_t *bcd) +{ + bcdesc_t bc; + memcpy_P(&bc, bcd, sizeof(bcdesc_t)); + uint8_t ctx[bc.ctxsize_B]; + uint8_t data[(bc.blocksize_b + 7) / 8]; + uint16_t keysize = get_keysize(bc.valid_keysize_desc); + uint8_t key[(keysize + 7) / 8]; + uint64_t t; + uint8_t i; + + if (bc.type != BCDESC_TYPE_BLOCKCIPHER) + return; + calibrateTimer(); + print_overhead(); + printf_P(PSTR("\n\n === %S performance === \n" + "\ttype: blockcipher\n" + "\tkeysize (bits): %5"PRIu16"\n" + "\tctxsize (bytes): %5"PRIu16"\n" + "\tblocksize (bits): %5"PRIu16"\n"), + bc.name, keysize, bc.ctxsize_B, bc.blocksize_b); + uart0_flush(); + t = 0; + if (bc.init.init1) { + if ((bc.flags & BC_INIT_TYPE) == BC_INIT_TYPE_1) { + for (i = 0; i < 32; ++i) { + startTimer(1); + START_TIMER; + (bc.init.init1)(key, &ctx); + STOP_TIMER; + t += stopTimer(); + if (i != 31 && bc.free) { + bc.free(&ctx); + } + } + } else { + for (i = 0; i < 32; ++i) { + startTimer(1); + START_TIMER; + (bc.init.init2)(key, keysize, &ctx); + STOP_TIMER; + t += stopTimer(); + if (i != 31 && bc.free) { + bc.free(&ctx); + } + } + } + t >>= 5; + printf_P(PSTR(" init (cycles): %5"PRIu16"\n"), t); + } uart0_flush(); - t = 0; - for(i = 0; i < 32; ++i){ - startTimer(0); - START_TIMER; - bc.enc.enc1(data, &ctx); - STOP_TIMER; - t += stopTimer(); - } - t >>= 5; - printf_P(PSTR(" encrypt (cycles): %5"PRIu16"\n"), t); + t = 0; + for (i = 0; i < 32; ++i) { + startTimer(0); + START_TIMER; + bc.enc.enc1(data, &ctx); + STOP_TIMER; + t += stopTimer(); + } + t >>= 5; + printf_P(PSTR(" encrypt (cycles): %5"PRIu16"\n"), t); uart0_flush(); - t = 0; - for(i = 0; i < 32; ++i){ - startTimer(0); - START_TIMER; - bc.dec.dec1(data, &ctx); - STOP_TIMER; - t += stopTimer(); - } - t >>= 5; - printf_P(PSTR(" decrypt (cycles): %5"PRIu16"\n"), t); + t = 0; + for (i = 0; i < 32; ++i) { + startTimer(0); + START_TIMER; + bc.dec.dec1(data, &ctx); + STOP_TIMER; + t += stopTimer(); + } + t >>= 5; + printf_P(PSTR(" decrypt (cycles): %5"PRIu16"\n"), t); uart0_flush(); - if(bc.free){ - uart0_flush(); - bc.free(&ctx); - } + if (bc.free) { + uart0_flush(); + bc.free(&ctx); + } } -void bcal_stacksize(const bcdesc_t *bcd){ - bcdesc_t bc; - stack_measuring_ctx_t smctx; - memcpy_P(&bc, bcd, sizeof(bcdesc_t)); - uint8_t ctx[bc.ctxsize_B]; - uint8_t data[(bc.blocksize_b + 7) / 8]; - uint16_t keysize = get_keysize(bc.valid_keysize_desc); - uint8_t key[(keysize + 7)/8]; - uint16_t t1 = 0, t2 = 0; - - if(bc.type != BCDESC_TYPE_BLOCKCIPHER) - return; - printf_P(PSTR("\n === %S stack-usage ===\n"),bc.name); - - uart0_flush(); - - if(bc.init.init1){ - if((bc.flags & BC_INIT_TYPE) == BC_INIT_TYPE_1){ - cli(); - stack_measure_init(&smctx, PATTERN_A); - bc.init.init1(&ctx, key); - t1 = stack_measure_final(&smctx); - stack_measure_init(&smctx, PATTERN_B); - bc.init.init1(&ctx, key); - t2 = stack_measure_final(&smctx); - sei(); - } else { - cli(); - stack_measure_init(&smctx, PATTERN_A); - bc.init.init2(&ctx, keysize, key); - t1 = stack_measure_final(&smctx); - stack_measure_init(&smctx, PATTERN_B); - bc.init.init2(&ctx, keysize, key); +void bcal_stacksize(const bcdesc_t *bcd) +{ + bcdesc_t bc; + stack_measuring_ctx_t smctx; + memcpy_P(&bc, bcd, sizeof(bcdesc_t)); + uint8_t ctx[bc.ctxsize_B]; + uint8_t data[(bc.blocksize_b + 7) / 8]; + uint16_t keysize = get_keysize(bc.valid_keysize_desc); + uint8_t key[(keysize + 7) / 8]; + uint16_t t1 = 0, t2 = 0; + + if (bc.type != BCDESC_TYPE_BLOCKCIPHER) + return; + printf_P(PSTR("\n === %S stack-usage ===\n"), bc.name); + + uart0_flush(); + + if (bc.init.init1) { + if ((bc.flags & BC_INIT_TYPE) == BC_INIT_TYPE_1) { + cli(); + stack_measure_init(&smctx, PATTERN_A); + bc.init.init1(&ctx, key); + t1 = stack_measure_final(&smctx); + stack_measure_init(&smctx, PATTERN_B); + bc.init.init1(&ctx, key); + t2 = stack_measure_final(&smctx); + sei(); + } else { + cli(); + stack_measure_init(&smctx, PATTERN_A); + bc.init.init2(&ctx, keysize, key); + t1 = stack_measure_final(&smctx); + stack_measure_init(&smctx, PATTERN_B); + bc.init.init2(&ctx, keysize, key); t2 = stack_measure_final(&smctx); sei(); } - t1 = (t1 > t2) ? t1 : t2; - printf_P(PSTR(" init (bytes): %5"PRIu16"\n"), t1); - } - cli(); - stack_measure_init(&smctx, PATTERN_A); - bc.enc.enc1(data, &ctx); - t1 = stack_measure_final(&smctx); - stack_measure_init(&smctx, PATTERN_B); - bc.enc.enc1(data, &ctx); - t2 = stack_measure_final(&smctx); - sei(); - - t1 = (t1 > t2) ? t1 : t2; - printf_P(PSTR(" encBlock (bytes): %5"PRIu16"\n"), t1); - - cli(); - stack_measure_init(&smctx, PATTERN_A); - bc.dec.dec1(data, &ctx); - t1 = stack_measure_final(&smctx); - stack_measure_init(&smctx, PATTERN_B); - bc.dec.dec1(data, &ctx); - t2 = stack_measure_final(&smctx); - sei(); - - t1 = (t1 > t2) ? t1 : t2; - printf_P(PSTR(" decBlock (bytes): %5"PRIu16"\n"), t1); - - if(bc.free){ - bc.free(&ctx); - } + t1 = (t1 > t2) ? t1 : t2; + printf_P(PSTR(" init (bytes): %5"PRIu16"\n"), t1); + } + cli(); + stack_measure_init(&smctx, PATTERN_A); + bc.enc.enc1(data, &ctx); + t1 = stack_measure_final(&smctx); + stack_measure_init(&smctx, PATTERN_B); + bc.enc.enc1(data, &ctx); + t2 = stack_measure_final(&smctx); + sei(); + + t1 = (t1 > t2) ? t1 : t2; + printf_P(PSTR(" encBlock (bytes): %5"PRIu16"\n"), t1); + + cli(); + stack_measure_init(&smctx, PATTERN_A); + bc.dec.dec1(data, &ctx); + t1 = stack_measure_final(&smctx); + stack_measure_init(&smctx, PATTERN_B); + bc.dec.dec1(data, &ctx); + t2 = stack_measure_final(&smctx); + sei(); + + t1 = (t1 > t2) ? t1 : t2; + printf_P(PSTR(" decBlock (bytes): %5"PRIu16"\n"), t1); + + if (bc.free) { + bc.free(&ctx); + } } -void bcal_performance_multiple(const bcdesc_t *const *bcd_list){ - const bcdesc_t *bcd; - for(;;){ - bcd = (void*)pgm_read_word(bcd_list); - if(!bcd){ - puts_P(PSTR("\n End of performance figures\n")); - return; - } - bcal_performance(bcd); - bcal_stacksize(bcd); - bcd_list = (void*)((uint8_t*)bcd_list + 2); - } +void bcal_performance_multiple(const bcdesc_t * const *bcd_list) +{ + const bcdesc_t *bcd; + for (;;) { + bcd = (void*) pgm_read_word(bcd_list); + if (!bcd) { + puts_P(PSTR("\n End of performance figures\n")); + return; + } + bcal_performance(bcd); + bcal_stacksize(bcd); + bcd_list = (void*) ((uint8_t*) bcd_list + 2); + } }