X-Git-Url: https://git.cryptolib.org/?a=blobdiff_plain;f=hfal-basic.c;h=82c040bca00425931d525583e695a20308921017;hb=42251bae9cc25d0cce904fb46dd40bb051878da4;hp=3bd41e5cba92c0b18323434cbd7de9dd5d0fc6e8;hpb=32e8c149a5d05724c3cf32a9ec9b795ac9e87be3;p=avr-crypto-lib.git diff --git a/hfal-basic.c b/hfal-basic.c index 3bd41e5..82c040b 100644 --- a/hfal-basic.c +++ b/hfal-basic.c @@ -24,26 +24,28 @@ uint8_t hfal_hash_init(const hfdesc_t* hash_descriptor, hfgen_ctx_t* ctx){ hf_init_fpt f; + uint16_t tmp; ctx->desc_ptr = (hfdesc_t*)hash_descriptor; - if(!(ctx->ctx=malloc(pgm_read_word(&(hash_descriptor->ctxsize_B))))) + tmp = pgm_read_word(&(hash_descriptor->ctxsize_B)); + if(!(ctx->ctx=malloc(tmp))) return 3; f= (hf_init_fpt)pgm_read_word(&(hash_descriptor->init)); f(ctx->ctx); return 0; } - + void hfal_hash_nextBlock(hfgen_ctx_t* ctx, const void* block){ hf_nextBlock_fpt f; hfdesc_t* x=(ctx->desc_ptr); f =(hf_nextBlock_fpt)pgm_read_word(&(x->nextBlock)); f(ctx->ctx, block); } - -void hfal_hash_lastBlock(hfgen_ctx_t* ctx, const void* block, uint16_t size){ + +void hfal_hash_lastBlock(hfgen_ctx_t* ctx, const void* block, uint16_t length_b){ hf_lastBlock_fpt f; hfdesc_t* x=ctx->desc_ptr; f =(hf_lastBlock_fpt)pgm_read_word(&(x->lastBlock)); - f(ctx->ctx, block, size); + f(ctx->ctx, block, length_b); } void hfal_hash_ctx2hash(void* dest, hfgen_ctx_t* ctx){ @@ -64,20 +66,38 @@ void hfal_hash_free(hfgen_ctx_t* ctx){ void hfal_hash_mem(const hfdesc_t* hash_descriptor, void* dest, const void* msg, uint32_t length_b){ void_fpt f; - uint16_t bs,bsb; - uint8_t ctx[pgm_read_word(&(hash_descriptor->ctxsize_B))]; - f=(void_fpt)pgm_read_word(&(hash_descriptor->init)); - ((hf_init_fpt)f)(ctx); - bs=pgm_read_word(&(hash_descriptor->blocksize_b)); - bsb=bs/8; - f=(void_fpt)pgm_read_word(&(hash_descriptor->nextBlock)); - while(length_b>=bs){ - ((hf_nextBlock_fpt)f)(ctx, msg); - length_b -= bs; - msg = (uint8_t*)msg + bsb; + f = (void_fpt)pgm_read_word(&(hash_descriptor->mem)); + if(f){ + ((hf_mem_fpt)f)(dest, msg, length_b); + }else{ + + uint16_t bs,bsb; + uint8_t ctx[pgm_read_word(&(hash_descriptor->ctxsize_B))]; + f=(void_fpt)pgm_read_word(&(hash_descriptor->init)); + ((hf_init_fpt)f)(ctx); + bs=pgm_read_word(&(hash_descriptor->blocksize_b)); + bsb=bs/8; + f=(void_fpt)pgm_read_word(&(hash_descriptor->nextBlock)); + while(length_b>=bs){ + ((hf_nextBlock_fpt)f)(ctx, msg); + length_b -= bs; + msg = (uint8_t*)msg + bsb; + } + f=(void_fpt)pgm_read_word(&(hash_descriptor->lastBlock)); + ((hf_lastBlock_fpt)f)(ctx, msg, length_b); + f=(void_fpt)pgm_read_word(&(hash_descriptor->ctx2hash)); + ((hf_ctx2hash_fpt)f)(dest, ctx); } - f=(void_fpt)pgm_read_word(&(hash_descriptor->lastBlock)); - ((hf_lastBlock_fpt)f)(ctx, msg, length_b); - f=(void_fpt)pgm_read_word(&(hash_descriptor->ctx2hash)); - ((hf_ctx2hash_fpt)f)(dest, ctx); -} +} + +uint16_t hfal_hash_getBlocksize(const hfdesc_t* hash_descriptor){ + uint16_t ret; + ret = pgm_read_word(&(hash_descriptor->blocksize_b)); + return ret; +} + +uint16_t hfal_hash_getHashsize(const hfdesc_t* hash_descriptor){ + uint16_t ret; + ret = pgm_read_word(&(hash_descriptor->hashsize_b)); + return ret; +}