HashReturn Update(hashState *state, const BitSequence *data, DataLength databitlen) { u_int32_t *data32, *p256; u_int32_t XL32, XH32, TempEven32, TempOdd32; u_int64_t *data64, *p512; u_int64_t XL64, XH64, TempEven64, TempOdd64; int LastBytes; switch(state->hashbitlen) { case 224: case 256: if (state->unprocessed_bits > 0) { if ( state->unprocessed_bits + databitlen > BlueMidnightWish256_BLOCK_SIZE * 8) { return BAD_CONSECUTIVE_CALL_TO_UPDATE; } else { LastBytes = (int)databitlen >> 3; // LastBytes = databitlen / 8 memcpy(hashState256(state)->LastPart + (state->unprocessed_bits >> 3), data, LastBytes ); state->unprocessed_bits += (int)databitlen; databitlen = state->unprocessed_bits; data32 = (u_int32_t *)hashState256(state)->LastPart; } } else data32 = (u_int32_t *)data; p256 = hashState256(state)->DoublePipe; while (databitlen >= BlueMidnightWish256_BLOCK_SIZE * 8) { databitlen -= BlueMidnightWish256_BLOCK_SIZE * 8; // #1 Between comments #1 and #2 add algorithm specifics state->bits_processed += BlueMidnightWish256_BLOCK_SIZE * 8; Compression256(); data32 += 16; } state->unprocessed_bits = (int)databitlen; if (databitlen > 0) { LastBytes = ((~(((- (int)databitlen)>>3) & 0x01ff)) + 1) & 0x01ff; // LastBytes = Ceil(databitlen / 8) memcpy(hashState256(state)->LastPart, data32, LastBytes ); }
int bmwUpdate(bmwParam *sp, const byte *data, size_t size) { uint64_t databitlen = 8 * size; uint32_t *data32, *p256; uint32_t XL32, XH32, TempEven32, TempOdd32; uint32_t p256_00, p256_01, p256_02, p256_03, p256_04, p256_05, p256_06, p256_07; uint32_t p256_08, p256_09, p256_10, p256_11, p256_12, p256_13, p256_14, p256_15; uint32_t p256_16, p256_17, p256_18, p256_19, p256_20, p256_21, p256_22, p256_23; uint32_t p256_24, p256_25, p256_26, p256_27, p256_28, p256_29, p256_30, p256_31; uint64_t *data64, *p512; uint64_t XL64, XH64, TempEven64, TempOdd64; uint64_t p512_00, p512_01, p512_02, p512_03, p512_04, p512_05, p512_06, p512_07; uint64_t p512_08, p512_09, p512_10, p512_11, p512_12, p512_13, p512_14, p512_15; uint64_t p512_16, p512_17, p512_18, p512_19, p512_20, p512_21, p512_22, p512_23; uint64_t p512_24, p512_25, p512_26, p512_27, p512_28, p512_29, p512_30, p512_31; int ret = SUCCESS; int LastBytes; switch (sp->hashbitlen) { case 224: case 256: if (sp->unprocessed_bits > 0) { if ( sp->unprocessed_bits + databitlen > BlueMidnightWish256_BLOCK_SIZE * 8) { ret = BAD_CONSECUTIVE_CALL_TO_UPDATE; break; } LastBytes = (int)databitlen >> 3; // LastBytes = databitlen / 8 memcpy(bmw256(sp)->LastPart + (sp->unprocessed_bits >> 3), data, LastBytes ); sp->unprocessed_bits += (int)databitlen; databitlen = sp->unprocessed_bits; data32 = (uint32_t *)bmw256(sp)->LastPart; } else data32 = (uint32_t *)data; p256 = bmw256(sp)->DoublePipe; while (databitlen >= BlueMidnightWish256_BLOCK_SIZE * 8) { databitlen -= BlueMidnightWish256_BLOCK_SIZE * 8; sp->bits_processed += BlueMidnightWish256_BLOCK_SIZE * 8; Compression256(); data32 += 16; } sp->unprocessed_bits = (int)databitlen; if (databitlen > 0) { LastBytes = ((~(((- (int)databitlen)>>3) & 0x01ff)) + 1) & 0x01ff; // LastBytes = Ceil(databitlen / 8) memcpy(bmw256(sp)->LastPart, data32, LastBytes ); }