aboutsummaryrefslogtreecommitdiff
path: root/src/crypto/keccak.c
diff options
context:
space:
mode:
authorAlexandro Sanchez <alexandro@phi.nz>2018-09-17 16:32:55 +0200
committerAlexandro Sanchez Bach <alexandro@phi.nz>2018-09-17 18:24:20 +0200
commit9bf0105e251fdedb5bd2cc2f04d99339d640f0af (patch)
treec08aa4c0a729469b036c45ee82dd9d26f8861c16 /src/crypto/keccak.c
parentMerge pull request #4381 (diff)
downloadmonero-9bf0105e251fdedb5bd2cc2f04d99339d640f0af.tar.xz
Fixed Keccak implementation on big-endian platforms
Diffstat (limited to 'src/crypto/keccak.c')
-rw-r--r--src/crypto/keccak.c11
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)