#include <stdlib.h>
#include <stdint.h>
#include <string.h>
+#include <avr/pgmspace.h>
#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))
+ const void* key, uint16_t keysize_b, bcgen_ctx_t* ctx){
+ if(!is_valid_keysize_P((PGM_VOID_P)pgm_read_word(&(cipher_descriptor->valid_keysize_desc)),
+ keysize_b)){
return 1;
-
+ }
uint8_t flags;
bc_init_fpt init_fpt;
ctx->desc_ptr = (bcdesc_t*)cipher_descriptor;
- ctx->keysize = keysize;
+ ctx->keysize = keysize_b;
flags = pgm_read_byte(cipher_descriptor->flags);
- init_fpt.initvoid = (void_fpt)(pgm_read_word(cipher_descriptor->init.initvoid));
+ init_fpt.initvoid = (void_fpt)(pgm_read_word(&(cipher_descriptor->init.initvoid)));
if(init_fpt.initvoid == NULL){
- if(!(ctx->ctx = malloc(keysize/8)))
+ if(!(ctx->ctx = malloc((keysize_b+7)/8)))
return 2;
- memcpy(ctx->ctx, key, keysize/8);
+ memcpy(ctx->ctx, key, (keysize_b+7)/8);
return 0;
}
- if(!(ctx->ctx = malloc(pgm_read_word(cipher_descriptor->ctxsize_B))))
+ 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);
+ init_fpt.init1((void*)key, (ctx->ctx));
}else{
- init_fpt.init2((void*)key, keysize, ctx->ctx);
+ init_fpt.init2((void*)key, keysize_b, (ctx->ctx));
}
return 0;
}
if(!ctx)
return;
bc_free_fpt free_fpt;
- free_fpt = (bc_free_fpt)(pgm_read_word(ctx->desc_ptr->free));
+ free_fpt = (bc_free_fpt)(pgm_read_word(&(ctx->desc_ptr->free)));
if(free_fpt)
- free_fpt(ctx->ctx);
+ free_fpt((ctx->ctx));
free(ctx->ctx);
}
void bcal_cipher_enc(void* block, const bcgen_ctx_t* ctx){
bc_enc_fpt enc_fpt;
- enc_fpt.encvoid = (void_fpt)pgm_read_word(ctx->desc_ptr->enc.encvoid);
+ 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;
}
- enc_fpt.enc1(block, ctx->ctx);
+ enc_fpt.enc1(block, (ctx->ctx));
}
void bcal_cipher_dec(void* block, const bcgen_ctx_t* ctx){
bc_dec_fpt dec_fpt;
- dec_fpt.decvoid = (void_fpt)pgm_read_word(ctx->desc_ptr->dec.decvoid);
+ 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;
}
- dec_fpt.dec1(block, ctx->ctx);
+ dec_fpt.dec1(block, (ctx->ctx));
}
+uint16_t bcal_cipher_getBlocksize_b(const bcdesc_t* desc){
+ return pgm_read_word(&(desc->blocksize_b));
+}
+
+PGM_VOID_P bcal_cipher_getKeysizeDesc(const bcdesc_t* desc){
+ return (PGM_VOID_P)pgm_read_word(&(desc->valid_keysize_desc));
+}