diff options
author | Riccardo Spagni <ric@spagni.net> | 2018-09-21 20:45:23 +0200 |
---|---|---|
committer | Riccardo Spagni <ric@spagni.net> | 2018-09-21 20:45:23 +0200 |
commit | aa1d321e5f207a69161ffb919453dfe7311b9e61 (patch) | |
tree | 8d97884061d33dd65dc1cf69fc019ef9354742cf | |
parent | Merge pull request #4394 (diff) | |
parent | Fixed Keccak implementation on big-endian platforms (diff) | |
download | monero-aa1d321e5f207a69161ffb919453dfe7311b9e61.tar.xz |
Merge pull request #4395
9bf0105e Fixed Keccak implementation on big-endian platforms (Alexandro Sanchez)
-rw-r--r-- | src/crypto/keccak.c | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/src/crypto/keccak.c b/src/crypto/keccak.c index 8fcd2138e..b5946036e 100644 --- a/src/crypto/keccak.c +++ b/src/crypto/keccak.c @@ -5,6 +5,7 @@ #include <stdio.h> #include <stdlib.h> #include <unistd.h> +#include "common/int-util.h" #include "hash-ops.h" #include "keccak.h" @@ -105,7 +106,7 @@ void keccak(const uint8_t *in, size_t inlen, uint8_t *md, int mdlen) for ( ; inlen >= rsiz; inlen -= rsiz, in += rsiz) { for (i = 0; i < rsizw; i++) - st[i] ^= ((uint64_t *) in)[i]; + st[i] ^= swap64le(((uint64_t *) in)[i]); keccakf(st, KECCAK_ROUNDS); } @@ -121,11 +122,15 @@ void keccak(const uint8_t *in, size_t inlen, uint8_t *md, int mdlen) temp[rsiz - 1] |= 0x80; for (i = 0; i < rsizw; i++) - st[i] ^= ((uint64_t *) temp)[i]; + st[i] ^= swap64le(((uint64_t *) temp)[i]); keccakf(st, KECCAK_ROUNDS); - memcpy(md, st, mdlen); + if (((size_t)mdlen % sizeof(uint64_t)) != 0) + { + local_abort("Bad keccak use"); + } + memcpy_swap64le(md, st, mdlen/sizeof(uint64_t)); } void keccak1600(const uint8_t *in, size_t inlen, uint8_t *md) |