From 2d431f6b24f78f78ae0cf4de51a1b5a8bc63968d Mon Sep 17 00:00:00 2001 From: asterix Date: Fri, 2 Feb 2007 13:10:01 +0000 Subject: [PATCH] Fix some bugs in md2_pad and md2_update fuction. git-svn-id: https://src.develer.com/svnoss/bertos/trunk@753 38d2e660-2303-0410-9eaa-f027e97ec537 --- algos/md2.c | 141 ++++++++++++++++++++++++++++------------------------ 1 file changed, 75 insertions(+), 66 deletions(-) diff --git a/algos/md2.c b/algos/md2.c index ade05582..9b8ae63e 100755 --- a/algos/md2.c +++ b/algos/md2.c @@ -13,6 +13,9 @@ /*#* *#* $Log$ + *#* Revision 1.9 2007/02/02 13:10:01 asterix + *#* Fix some bugs in md2_pad and md2_update fuction. + *#* *#* Revision 1.8 2007/02/01 14:45:56 asterix *#* Rewrite md2_update function and fix some bug. *#* @@ -34,13 +37,15 @@ #include //memset(), memcpy(); #include +#include //ASSERT() +#include //MIN() + /* * Official array of 256 byte pemutation contructed from digits of pi, defined * in the RFC 1319. */ -static uint8_t md2_perm[256] = -{ +static uint8_t md2_perm[256] = { 41, 46, 67, 201, 162, 216, 124, 1, 61, 54, 84, 161, 236, 240, 6, 19, 98, 167, 5, 243, 192, 199, 115, 140, 152, 147, 43, 217, 188, 76, 130, 202, 30, 155, 87, 60, 253, 212, 224, 22, 103, 66, 111, 24, @@ -60,30 +65,31 @@ static uint8_t md2_perm[256] = 166, 119, 114, 248, 235, 117, 75, 10, 49, 68, 80, 180, 143, 237, 31, 26, 219, 153, 141, 51, 159, 17, 131, 20 }; + /** - * Pad function. Fill input array with unsigned char until - * lenght of block is equal to CONFIG_MD2_BLOCK_LEN. - * + * Pad function. Put len_pad unsigned char in + * input block. */ static void md2_pad(void *_block, size_t len_pad) { uint8_t *block; - + block = (uint8_t *)_block; - if (len_pad <= CONFIG_MD2_BLOCK_LEN) - { - for(int i = (CONFIG_MD2_BLOCK_LEN - len_pad); icounter = 0; - memset(context->state, 0, sizeof(context->state)); - memset(context->checksum, 0, sizeof(context->checksum)); + + memset(context, 0, sizeof(Md2Context)); } + /** * Update block. */ void md2_update(Md2Context *context, void *_block_in, size_t block_len) -{ - +{ + uint8_t *block_in; - size_t len = CONFIG_MD2_BLOCK_LEN; - size_t i = 0; - + + /* + * Choose a number of block that fill input context buffer. + */ + size_t missing_len = MIN(block_len, CONFIG_MD2_BLOCK_LEN - context->counter); + block_in = (uint8_t *)_block_in; - - + while(block_len > 0) { - len -= context->counter; //Free space of buffer. + /* + * Copy in the buffer input block. + */ + memcpy(&context->buffer[context->counter], block_in, missing_len); + + /* + * Update a context counter, input block length and remaning + * context buffer block lenght. + */ + context->counter += missing_len; + block_len -= missing_len; + block_in += missing_len; - if (block_len > len) + /* + * If buffer is full, compute it. + */ + if (context->counter >= CONFIG_MD2_BLOCK_LEN) { - /* - * Fill or copy into buffer a input block length CONFIG_MD2_BLOCK_LEN and compute it. - */ - memcpy(&context->buffer[context->counter], &block_in[i],len); - md2_compute(context->state,context->checksum, context->buffer); + md2_compute(context->state, context->checksum, context->buffer); context->counter = 0; - block_len -= len; } - else - { - /* - * Copy into buffer remaning input block. - */ - memcpy(&context->buffer[context->counter], &block_in[i], block_len); - context->counter += len; - break; - - - } - i = len; - len = CONFIG_MD2_BLOCK_LEN; } - + } /** * Ends MD2 message digest operation, writing the message digest and cleaning context. */ void md2_end(Md2Context *context, void *msg_digest) { + uint8_t buf[CONFIG_MD2_BLOCK_LEN]; + /* * Pad remaning context buffer. */ - md2_pad(context->buffer, CONFIG_MD2_BLOCK_LEN - context->counter); + md2_pad(buf, CONFIG_MD2_BLOCK_LEN - context->counter); /* * Update context and checksum. */ - md2_update(context, context->buffer, CONFIG_MD2_BLOCK_LEN); - - md2_update(context, context->checksum, CONFIG_MD2_BLOCK_LEN); + md2_update(context, buf, CONFIG_MD2_BLOCK_LEN - context->counter); + + memcpy(buf, context->checksum, CONFIG_MD2_BLOCK_LEN); + + md2_update(context, buf, CONFIG_MD2_BLOCK_LEN); /* * Copy first CONFIG_MD2_BLOCK_LEN byte of context's state @@ -213,10 +222,10 @@ void md2_end(Md2Context *context, void *msg_digest) * MD2 algorithm. */ memcpy(msg_digest, context->state, CONFIG_MD2_BLOCK_LEN); - + /* * Clean the context. */ memset(context, 0, sizeof(context)); - + } -- 2.25.1