X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;ds=sidebyside;f=algos%2Fmd2.c;h=338005c40c05937ad91716d771979f37d9285d46;hb=4fbc2e2a3aa83de683dd440f9036ced5d5879071;hp=176efe6994ca4cb735458c3ae542b06f9bdf79c0;hpb=21be41a167d96c49859e6ef19d9c3163037b0309;p=bertos.git diff --git a/algos/md2.c b/algos/md2.c index 176efe69..338005c4 100755 --- a/algos/md2.c +++ b/algos/md2.c @@ -13,6 +13,21 @@ /*#* *#* $Log$ + *#* Revision 1.10 2007/02/02 15:37:45 asterix + *#* Change md2_end prototype. Remove a unneeded memcpy in md2_end. Add comments. + *#* + *#* 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. + *#* + *#* Revision 1.7 2007/01/31 18:04:15 asterix + *#* Write md2_end function + *#* + *#* Revision 1.4 2007/01/31 13:51:57 asterix + *#* Write md2_compute function. + *#* *#* Revision 1.2 2007/01/30 17:31:44 asterix *#* Add function prototypes. *#* @@ -21,8 +36,17 @@ *#* *#*/ +#include "md2.h" + +#include //memset(), memcpy(); +#include +#include //ASSERT() +#include //MIN() + + /* - * Array of 256 byte pemutation contructed from digits of pi. + * Official array of 256 byte pemutation contructed from digits of pi, defined + * in the RFC 1319. */ static uint8_t md2_perm[256] = { 41, 46, 67, 201, 162, 216, 124, 1, 61, 54, 84, 161, 236, 240, 6, @@ -45,30 +69,163 @@ static uint8_t md2_perm[256] = { 31, 26, 219, 153, 141, 51, 159, 17, 131, 20 }; -static void md2_pad(void *block) +/** + * 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; + + ASSERT(len_pad <= CONFIG_MD2_BLOCK_LEN); + + /* + * Fill input block with len_pad char. + */ + memset(block, len_pad, len_pad); } -static void md2_compute(void *state, void *checksum, void *block) +static void md2_compute(void *_state, void *_checksum, void *_block) { + int i = 0; + uint16_t t = 0; + uint8_t compute_array[COMPUTE_ARRAY_LEN]; + uint8_t *state; + uint8_t *checksum; + uint8_t *block; + + state = (uint8_t *)_state; + checksum = (uint8_t *)_checksum; + block = (uint8_t *)_block; + + /* + * Copy state and checksum context in compute array. + */ + memcpy(compute_array, state, CONFIG_MD2_BLOCK_LEN); + memcpy(compute_array + CONFIG_MD2_BLOCK_LEN, block, CONFIG_MD2_BLOCK_LEN); + + /* + * Fill compute array with state XOR block + */ + for(i = 0; i < CONFIG_MD2_BLOCK_LEN; i++) + compute_array[i + (CONFIG_MD2_BLOCK_LEN * 2)] = state[i] ^ block[i]; + /* + * Encryt block. + */ + for(i = 0; i < NUM_COMPUTE_ROUNDS; i++) + { + for(int j = 0; j < COMPUTE_ARRAY_LEN; j++) + { + compute_array[j] ^= md2_perm [t]; + t = compute_array[j]; + } + + t = (t + i) & 0xff; //modulo 256. + } + /* + * Update checksum. + */ + t = checksum[CONFIG_MD2_BLOCK_LEN - 1]; + + for(i = 0; i < CONFIG_MD2_BLOCK_LEN; i++) + { + checksum[i] ^= md2_perm [block[i] ^ t]; + t = checksum[i]; + } + + /* + * Update state and clean compute array. + */ + memcpy(state, compute_array, CONFIG_MD2_BLOCK_LEN); + memset(compute_array, 0, sizeof(compute_array)); } +/** + * Algorithm initialization. + * + * \param empty context. + */ void md2_init(Md2Context *context) { - context->counter=0; - memset(context->state, 0, sizeof(context->state)); - memset(context->checksum, 0, sizeof(context->checksum)); + + memset(context, 0, sizeof(Md2Context)); } -void md2_update(Md2Context *context, void *block_in, size_t block_len) +/** + * Update block. + */ +void md2_update(Md2Context *context, void *_block_in, size_t block_len) { -} + uint8_t *block_in; + + /* + * 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) + { + /* + * 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 buffer is full, compute it. + */ + if (context->counter >= CONFIG_MD2_BLOCK_LEN) + { + md2_compute(context->state, context->checksum, context->buffer); + context->counter = 0; + } + } -void md2_end(Md2Context *context, void *msg_digest) + +} +/** + * Ends an MD2 message digest operation. + * This fuction take an context and return a pointer + * to context state. + * + * \param context in input. + * \return a pointer to context state (message digest). + */ +uint8_t *md2_end(Md2Context *context) { + uint8_t buf[CONFIG_MD2_BLOCK_LEN]; + + /* + * Fill remaning empty context buffer. + */ + md2_pad(buf, CONFIG_MD2_BLOCK_LEN - context->counter); + + /* + * Update context buffer and compute it. + */ + md2_update(context, buf, CONFIG_MD2_BLOCK_LEN - context->counter); + + /* + * Add context checksum to message input. + */ + md2_update(context, context->checksum, CONFIG_MD2_BLOCK_LEN); + + + return context->state; //return a pointer to message digest. }