]> git.cryptolib.org Git - avr-crypto-lib.git/blob - bcal/bcal-nessie.c
f9748a3dfc95388570415015d696c55f43e5b60b
[avr-crypto-lib.git] / bcal / bcal-nessie.c
1 /* bcal-nessie.c */
2 /*
3     This file is part of the AVR-Crypto-Lib.
4     Copyright (C) 2010 Daniel Otte (daniel.otte@rub.de)
5
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.
10
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.
15
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/>.
18 */
19
20 #include "nessie_bc_test.h"
21 #include "blockcipher_descriptor.h"
22 #include "keysize_descriptor.h"
23 #include <stdint.h>
24 #include <stdlib.h>
25 #include <string.h>
26 #include <avr/pgmspace.h>
27
28
29 void(*bcal_nessie_dummy_init_fpt)(const void *key, void *ctx)=NULL;
30
31 void bcal_nessie_dummy_init(const void *key, uint16_t keysize, void *ctx){
32         if(bcal_nessie_dummy_init_fpt){
33                 bcal_nessie_dummy_init_fpt(key, ctx);
34         }else{
35                 memcpy(ctx, key, (keysize+7)/8);
36         }
37 }
38
39 void bcal_nessie(const bcdesc_t *bcd){
40         if(pgm_read_byte(&(bcd->type))!=BCDESC_TYPE_BLOCKCIPHER)
41                 return;
42         char name[1+strlen_P((void*)pgm_read_word(&(bcd->name)))];
43         strcpy_P(name, (void*)pgm_read_word(&(bcd->name)));
44         nessie_bc_init();
45
46         nessie_bc_ctx.blocksize_B = (pgm_read_word(&(bcd->blocksize_b))+7)/8;
47         nessie_bc_ctx.name        = name;
48         nessie_bc_ctx.ctx_size_B  = pgm_read_word(&(bcd->ctxsize_B));
49         nessie_bc_ctx.cipher_enc  = (nessie_bc_enc_fpt)pgm_read_word(&(bcd->enc));
50         nessie_bc_ctx.cipher_dec  = (nessie_bc_dec_fpt)pgm_read_word(&(bcd->dec));
51         nessie_bc_ctx.cipher_free = (nessie_bc_free_fpt)pgm_read_word(&(bcd->free));
52         if((pgm_read_byte(&(bcd->flags))&BC_INIT_TYPE)==BC_INIT_TYPE_2){
53                 nessie_bc_ctx.cipher_genctx  = (nessie_bc_gen_fpt)pgm_read_word(&(bcd->init));
54         }else{
55                 bcal_nessie_dummy_init_fpt = (void(*)(const void*,void*))pgm_read_word(&(bcd->init));
56                 nessie_bc_ctx.cipher_genctx  = (nessie_bc_gen_fpt)bcal_nessie_dummy_init;
57         }
58
59         uint16_t *keysize_list=NULL;
60         uint16_t items,i;
61         items = get_keysizes((PGM_VOID_P)pgm_read_word(&(bcd->valid_keysize_desc)), &keysize_list);
62         if(items){
63                 for(i=0; i<items; ++i){
64                         nessie_bc_ctx.keysize_b   = keysize_list[i];
65                         nessie_bc_run();
66                 }
67                 free(keysize_list);
68         }
69
70 }
71
72 void bcal_nessie_multiple(const bcdesc_t *const *bcd_list){
73         const bcdesc_t *bcd;
74         for(;;){
75                 bcd = (void*)pgm_read_word(bcd_list);
76                 if(!bcd)
77                         return;
78                 bcal_nessie(bcd);
79                 bcd_list = (void*)((uint8_t*)bcd_list + 2);
80         }
81 }
82