fixing bugs reported by Christian Dernehl
This commit is contained in:
parent
4b6bad354f
commit
3d940f2a7b
13
sha1/sha1.c
13
sha1/sha1.c
|
@ -93,6 +93,7 @@ typedef const uint32_t (*pf_t)(uint32_t x, uint32_t y, uint32_t z);
|
||||||
|
|
||||||
static
|
static
|
||||||
void load_endian32_changed(uint8_t* dest, uint8_t* src, uint16_t words){
|
void load_endian32_changed(uint8_t* dest, uint8_t* src, uint16_t words){
|
||||||
|
#if defined LITTLE_ENDIAN
|
||||||
while(words--){
|
while(words--){
|
||||||
*dest++ = src[3];
|
*dest++ = src[3];
|
||||||
*dest++ = src[2];
|
*dest++ = src[2];
|
||||||
|
@ -100,6 +101,9 @@ void load_endian32_changed(uint8_t* dest, uint8_t* src, uint16_t words){
|
||||||
*dest++ = src[0];
|
*dest++ = src[0];
|
||||||
src += 4;
|
src += 4;
|
||||||
}
|
}
|
||||||
|
#elif defined BIG_ENDIAN
|
||||||
|
memcpy(dest, src, words * sizeof(uint32_t));
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -113,9 +117,9 @@ void sha1_nextBlock (sha1_ctx_t *state, const void* block){
|
||||||
0x6ed9eba1,
|
0x6ed9eba1,
|
||||||
0x8f1bbcdc,
|
0x8f1bbcdc,
|
||||||
0xca62c1d6};
|
0xca62c1d6};
|
||||||
|
|
||||||
/* load the w array (changing the endian and so) */
|
/* load the w array (changing the endian and so) */
|
||||||
load_endian32_changed((uint8_t*)w, (uint8_t*)block, 16);
|
load_endian32_changed((uint8_t*)w, (uint8_t*)block, 16);
|
||||||
|
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
uint8_t dbgi;
|
uint8_t dbgi;
|
||||||
for(dbgi=0; dbgi<16; ++dbgi){
|
for(dbgi=0; dbgi<16; ++dbgi){
|
||||||
|
@ -186,7 +190,7 @@ void sha1_lastBlock(sha1_ctx_t *state, const void* block, uint16_t length){
|
||||||
lb[56+i] = ((uint8_t*)&(state->length))[7-i];
|
lb[56+i] = ((uint8_t*)&(state->length))[7-i];
|
||||||
}
|
}
|
||||||
#elif defined BIG_ENDIAN
|
#elif defined BIG_ENDIAN
|
||||||
*((uint64_t)&(lb[56])) = state->length;
|
*((uint64_t*)&(lb[56])) = state->length;
|
||||||
#endif
|
#endif
|
||||||
sha1_nextBlock(state, lb);
|
sha1_nextBlock(state, lb);
|
||||||
}
|
}
|
||||||
|
@ -196,9 +200,10 @@ void sha1_lastBlock(sha1_ctx_t *state, const void* block, uint16_t length){
|
||||||
void sha1_ctx2hash (void *dest, sha1_ctx_t *state){
|
void sha1_ctx2hash (void *dest, sha1_ctx_t *state){
|
||||||
#if defined LITTLE_ENDIAN
|
#if defined LITTLE_ENDIAN
|
||||||
load_endian32_changed((uint8_t*)dest, (uint8_t*)state->h, 5);
|
load_endian32_changed((uint8_t*)dest, (uint8_t*)state->h, 5);
|
||||||
#elif BIG_ENDIAN
|
#elif defined BIG_ENDIAN
|
||||||
if (dest != state->h)
|
if (dest != state->h) {
|
||||||
memcpy(dest, state->h, SHA1_HASH_BITS/8);
|
memcpy(dest, state->h, SHA1_HASH_BITS/8);
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
# error unsupported endian type!
|
# error unsupported endian type!
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue