From: bg Date: Thu, 8 Jan 2009 12:15:12 +0000 (+0000) Subject: first lines of a blockcipher abstraction layer X-Git-Url: https://git.cryptolib.org/?p=avr-crypto-lib.git;a=commitdiff_plain;h=017345097a7e5e05d7751816d2c8e29af3bacadc first lines of a blockcipher abstraction layer --- diff --git a/bcal-basic.c b/bcal-basic.c new file mode 100644 index 0000000..bb97b9f --- /dev/null +++ b/bcal-basic.c @@ -0,0 +1,98 @@ +/* bcal-basic.c */ +/* + This file is part of the Crypto-avr-lib/microcrypt-lib. + Copyright (C) 2009 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 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 . +*/ + +#include +#include +#include +#include "blockcipher_descriptor.h" +#include "keysize_descriptor.h" + + +uint8_t bcal_cipher_init(const bcdesc_t* cipher_descriptor, + const void* key, uint16_t keysize, bcgen_ctx_t* ctx){ + if(!is_valid_keysize_P((PGM_VOID_P)(pgm_read_word(cipher_descriptor->valid_keysize_desc)), + keysize)) + return 1; + + uint8_t flags; + bc_init_fpt init_fpt; + ctx->desc_ptr = (bcdesc_t*)cipher_descriptor; + ctx->keysize = keysize; + flags = pgm_read_byte(cipher_descriptor->flags); + init_fpt.initvoid = (void_fpt)(pgm_read_word(cipher_descriptor->init.initvoid)); + if(init_fpt.initvoid == NULL){ + if(!(ctx->ctx = malloc(keysize/8))) + return 2; + memcpy(ctx->ctx, key, keysize/8); + return 0; + } + if(!(ctx->ctx = malloc(pgm_read_word(cipher_descriptor->ctxsize_B)))) + return 3; + if((flags&BC_INIT_TYPE)==BC_INIT_TYPE_1){ + init_fpt.init1((void*)key, ctx->ctx); + }else{ + init_fpt.init2((void*)key, keysize, ctx->ctx); + } + return 0; +} + +void bcal_cipher_free(bcgen_ctx_t* ctx){ + if(!ctx) + return; + bc_free_fpt free_fpt; + free_fpt = (bc_free_fpt)(pgm_read_word(ctx->desc_ptr->free)); + if(free_fpt) + free_fpt(ctx->ctx); + free(ctx->ctx); +} + +void bcal_cipher_enc(void* block, const bcgen_ctx_t* ctx){ + uint8_t flags; + bc_enc_fpt enc_fpt; + flags = pgm_read_byte(ctx->desc_ptr->flags); + enc_fpt.encvoid = (void_fpt)pgm_read_word(ctx->desc_ptr->enc.encvoid); + if(!enc_fpt.encvoid){ + /* very bad error, no enciphering function specified */ + return; + } + if((flags&BC_ENC_TYPE)==BC_ENC_TYPE_1){ + enc_fpt.enc1(block, ctx->ctx); + }else{ + enc_fpt.enc2(block, block, ctx->ctx); + } +} + +void bcal_cipher_dec(void* block, const bcgen_ctx_t* ctx){ + uint8_t flags; + bc_dec_fpt dec_fpt; + flags = pgm_read_byte(ctx->desc_ptr->flags); + dec_fpt.decvoid = (void_fpt)pgm_read_word(ctx->desc_ptr->dec.decvoid); + if(!dec_fpt.decvoid){ + /* very bad error, no deciphering function specified */ + return; + } + if((flags&BC_DEC_TYPE)==BC_DEC_TYPE_1){ + dec_fpt.dec1(block, ctx->ctx); + }else{ + dec_fpt.dec2(block, block, ctx->ctx); + } +} + + + diff --git a/bcal-basic.h b/bcal-basic.h new file mode 100644 index 0000000..507f60f --- /dev/null +++ b/bcal-basic.h @@ -0,0 +1,25 @@ +/* bcal-basic.h */ +/* + This file is part of the Crypto-avr-lib/microcrypt-lib. + Copyright (C) 2009 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 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 . +*/ + +#include +#include +#include "blockciper_descriptor.h" +#include "keysize_descriptor.h" + + diff --git a/bcal_noekeon.c b/bcal_noekeon.c new file mode 100644 index 0000000..b1a3485 --- /dev/null +++ b/bcal_noekeon.c @@ -0,0 +1,41 @@ +/* bcal_noekeon.c */ + +#include +#include +#include "blockcipher_descriptor.h" +#include "noekeon.h" +#include "keysize_descriptor.h" + +const char noekeon_direct_str[] PROGMEM = "Noekeon-Direct"; +const char noekeon_indirect_str[] PROGMEM = "Noekeon-Indirect"; + +const uint8_t noekeon_keysize_desc[] PROGMEM = { KS_TYPE_LIST, 1, 128, + KS_TYPE_TERMINATOR }; + +const bcdesc_t noekeon_direct_desc PROGMEM = { + BCDESC_TYPE_BLOCKCIPHER, + BC_ENC_TYPE_1, + noekeon_direct_str, + 16, + 128, + (void_fpt)NULL, + (void_fpt)noekeon_enc, + (void_fpt)noekeon_dec, + (void_fpt)NULL, + noekeon_keysize_desc +}; + +const bcdesc_t noekeon_indirect_desc PROGMEM = { + BCDESC_TYPE_BLOCKCIPHER, + BC_INIT_TYPE_1 | BC_ENC_TYPE_1, + noekeon_indirect_str, + 16, + 128, + (void_fpt)noekeon_init, + (void_fpt)noekeon_enc, + (void_fpt)noekeon_dec, + (void_fpt)NULL, + noekeon_keysize_desc +}; + + diff --git a/bcal_noekeon.h b/bcal_noekeon.h new file mode 100644 index 0000000..c74b1af --- /dev/null +++ b/bcal_noekeon.h @@ -0,0 +1,10 @@ +/* bcal_noekeon.h */ + +#include +#include "blopckcipher_descriptor.h" +#include "noekeon.h" +#include "keysize_descriptor.h" + +extern const bcdesc_t noekeon_direct_desc; +extern const bcdesc_t noekeon_indirect_desc; + diff --git a/blockcipher_descriptor.h b/blockcipher_descriptor.h new file mode 100644 index 0000000..4dc3c55 --- /dev/null +++ b/blockcipher_descriptor.h @@ -0,0 +1,69 @@ +/* blockcipher_descriptor.h */ + +#ifndef BLOCKCIPHER_DESCRIPTOR_H_ +#define BLOCKCIPHER_DESCRIPTOR_H_ +#include +#include + +typedef void(*void_fpt)(void); +typedef void(*bc_init1_fpt)(void*, void*); +typedef void(*bc_init2_fpt)(void*, uint16_t,void*); +typedef void(*bc_enc1_fpt)(void*, void*); +typedef void(*bc_enc2_fpt)(void*, void*, void*); +typedef void(*bc_dec1_fpt)(void*, void*); +typedef void(*bc_dec2_fpt)(void*, void*, void*); +typedef void(*bc_free_fpt)(void*); + +typedef union{ + void_fpt initvoid; + bc_init1_fpt init1; + bc_init2_fpt init2; +} bc_init_fpt; + +typedef union{ + void_fpt encvoid; + bc_enc1_fpt enc1; + bc_enc2_fpt enc2; +} bc_enc_fpt; + +typedef union{ + void_fpt decvoid; + bc_dec1_fpt dec1; + bc_dec2_fpt dec2; +} bc_dec_fpt; + +#define BC_INIT_TYPE 0x01 +#define BC_INIT_TYPE_1 0x00 +#define BC_INIT_TYPE_2 0x01 + +#define BC_ENC_TYPE 0x02 +#define BC_ENC_TYPE_1 0x00 +#define BC_ENC_TYPE_2 0x02 +# +#define BC_DEC_TYPE 0x04 +#define BC_DEC_TYPE_1 0x00 +#define BC_DEC_TYPE_2 0x04 + +#define BCDESC_TYPE_BLOCKCIPHER 0x01 + +typedef struct { + uint8_t type; /* 1==blockcipher */ + uint8_t flags; + PGM_P name; + uint16_t ctxsize_B; + uint16_t blocksize_b; + bc_init_fpt init; + bc_enc_fpt enc; + bc_dec_fpt dec; + bc_free_fpt free; + PGM_VOID_P valid_keysize_desc; +} bcdesc_t; /* blockcipher descriptor type */ + +typedef struct{ + bcdesc_t* desc_ptr; + uint16_t keysize; + void* ctx; +} bcgen_ctx_t; + +#endif /* BLOCKCIPHER_DESCRIPTOR_H_ */ + diff --git a/keysize_descriptor.c b/keysize_descriptor.c new file mode 100644 index 0000000..5b148f6 --- /dev/null +++ b/keysize_descriptor.c @@ -0,0 +1,75 @@ +/* keysize_descriptor.c */ +/* + This file is part of the Crypto-avr-lib/microcrypt-lib. + Copyright (C) 2009 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 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 . +*/ +/** + * \file keysize_descriptor.c + * \author Daniel Otte + * \email daniel.otte@rub.de + * \date 2009-01-07 + * \license GPLv3 or later + */ + +#include +#include +#include "keysize_descriptor.h" + +uint8_t is_valid_keysize_P(PGM_VOID_P ks_desc, uint16_t keysize){ + uint8_t type; + type = pgm_read_byte(ks_desc++); + if(type==KS_TYPE_TERMINATOR) + return 0; + if(type==KS_TYPE_LIST){ + uint8_t items; + uint16_t item; + items = pgm_read_byte(ks_desc++); + while(items--){ + item = pgm_read_word(ks_desc); + ks_desc+=2; + if(item==keysize) + return 1; + } + ks_desc -= 2; + } + if(type==KS_TYPE_RANGE){ + uint16_t max, min; + min = pgm_read_word(ks_desc); + ks_desc+=2; + max = pgm_read_word(ks_desc); + if(min<=keysize && keysize<=max) + return 1; + } + if(type==KS_TYPE_ARG_RANGE){ + uint16_t max, min, dist, offset; + min = pgm_read_word(ks_desc); + ks_desc+=2; + max = pgm_read_word(ks_desc); + ks_desc+=2; + dist = pgm_read_word(ks_desc); + ks_desc+=2; + offset = pgm_read_word(ks_desc); + if(min<=keysize && keysize<=max && (keysize%dist==offset)) + return 1; + } + if(type>KS_TYPE_ARG_RANGE){ + /* bad error, you may insert a big warning message here */ + return 0; + } + return is_valid_keysize(ks_desc+1, keysize) /* search the next record */ +} + + diff --git a/keysize_descriptor.h b/keysize_descriptor.h new file mode 100644 index 0000000..39a563e --- /dev/null +++ b/keysize_descriptor.h @@ -0,0 +1,58 @@ +/* keysize_descriptor.h */ +/* + This file is part of the Crypto-avr-lib/microcrypt-lib. + Copyright (C) 2009 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 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 . +*/ +/** + * \file keysize_descriptor.h + * \author Daniel Otte + * \email daniel.otte@rub.de + * \date 2009-01-07 + * \license GPLv3 or later + */ + +#ifndef KEYSIZE_DESCRIPTOR_H_ +#define KEYSIZE_DESCRIPTOR_H_ + +#include +#include + +#define KS_TYPE_TERMINATOR 0x00 +#define KS_TYPE_LIST 0x01 +#define KS_TYPE_RANGE 0x02 +#define KS_TYPE_ARG_RANGE 0x03 + + +typedef struct{ /* keysize is valid if listed in items */ + uint8_t n_items; /* number of items (value 0 is reserved) */ + uint16_t items[]; /* list of valid lengths */ +}keysize_desc_list_t; + +typedef struct{ /* keysize is valid if min<=keysize<=max */ + uint16_t min; + uint16_t max; +}keysize_desc_range_t; + +typedef struct{ /* keysize is valid if min<=keysize<=max and if keysize mod distance == offset */ + uint16_t min; + uint16_t max; + uint16_t distance; + uint16_t offset; +}keysize_desc_arg_range_t; + +uint8_t is_valid_keysize_P(PGM_VOID_P ks_desc, uint16_t keysize); + +#endif /* KEYSIZE_DESCRIPTOR_H_ */