aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMattias Andrée <maandree@operamail.com>2014-08-21 19:11:27 +0200
committerMattias Andrée <maandree@operamail.com>2014-08-21 19:11:27 +0200
commitea3d1047b01a6c5f9a70f35db063e5001ed5c14b (patch)
tree02778802a7396527c20623d65cd8f083d4074003
parentscrew that, I am not doing vala (diff)
downloadsha3sum-ea3d1047b01a6c5f9a70f35db063e5001ed5c14b.tar.gz
sha3sum-ea3d1047b01a6c5f9a70f35db063e5001ed5c14b.tar.bz2
sha3sum-ea3d1047b01a6c5f9a70f35db063e5001ed5c14b.tar.xz
fix error in partial bit support for c implementations
Signed-off-by: Mattias Andrée <maandree@operamail.com>
Diffstat (limited to '')
-rw-r--r--Makefile4
-rw-r--r--c/sha3.c32
-rw-r--r--c/sha3.h16
-rw-r--r--java-c-jni/SHA3.c12
4 files changed, 36 insertions, 28 deletions
diff --git a/Makefile b/Makefile
index ab950c5..127d439 100644
--- a/Makefile
+++ b/Makefile
@@ -7,8 +7,8 @@
#
# [GNU All Permissive License]
-# NB! Do not forget to test against -O0, -O4 to -O6 is not safe
-C_OPTIMISE=-O6
+# NB! Do not forget to test against -O0, -O4 to -O6 and -Ofast is not safe
+C_OPTIMISE=-Ofast
JAVA_OPTIMISE=-O
LIB_EXT=so
diff --git a/c/sha3.c b/c/sha3.c
index ca7c964..2de3b0b 100644
--- a/c/sha3.c
+++ b/c/sha3.c
@@ -525,7 +525,7 @@ static_inline byte* sha3_pad10star1(byte* restrict_ msg, long len, long r, long
* @param capacity The capacity
* @param output The output size
*/
-extern void sha3_initialise(long bitrate, long capacity, long output)
+void sha3_initialise(long bitrate, long capacity, long output)
{
long i;
@@ -555,7 +555,7 @@ extern void sha3_initialise(long bitrate, long capacity, long output)
/**
* Dispose of the Keccak sponge
*/
-extern void sha3_dispose()
+void sha3_dispose()
{
#ifdef WITH_WIPE
long i;
@@ -586,7 +586,7 @@ extern void sha3_dispose()
* @param msg The partial message
* @param msglen The length of the partial message
*/
-extern void sha3_update(byte* restrict_ msg, long msglen)
+void sha3_update(byte* restrict_ msg, long msglen)
{
long rr = r >> 3;
long ww = w >> 3;
@@ -666,7 +666,7 @@ extern void sha3_update(byte* restrict_ msg, long msglen)
* @param withReturn Whether to return the hash instead of just do a quick squeeze phrase and return {@code null}
* @return The hash sum, or {@code null} if <tt>withReturn</tt> is {@code false}
*/
-extern byte* sha3_digest(byte* restrict_ msg, long msglen, long bits, char* restrict_ suffix, boolean withReturn)
+byte* sha3_digest(byte* restrict_ msg, long msglen, long bits, char* restrict_ suffix, boolean withReturn)
{
byte* message;
byte* _msg;
@@ -683,32 +683,36 @@ extern byte* sha3_digest(byte* restrict_ msg, long msglen, long bits, char* rest
msglen += bits >> 3;
if ((bits &= 7))
+ msg[msglen] &= (1 << bits) - 1;
+ if (suffix_len)
{
- msg[msglen] &= (1 << bits) - 1;
#ifndef WITH_WIPE
msg = (byte*)realloc(msg, msglen + ((suffix_len + bits + 7) >> 3));
#else
{
char* old_msg = msg;
msg = (byte*)malloc(msglen + ((suffix_len + bits + 7) >> 3));
- memcpy(msg, old_msg, msglen + 1);
- for (i = 0; i <= msglen; i++)
+ memcpy(msg, old_msg, msglen + !!bits);
+ for (i = 0; i < msglen + !!bits; i++)
*(old_msg + i) = 0;
free(old_msg);
}
#endif
+ if (!bits)
+ msg[msglen] = 0;
for (i = 0; i < suffix_len; i++)
{
- msg[msglen] |= (suffix[i] == '1') << bits;
+ msg[msglen] |= (suffix[i] - '0') << bits++;
if (bits == 8)
{
bits = 0;
msglen++;
+ msg[msglen] = 0;
}
}
- if (bits)
- msglen++;
}
+ if (bits)
+ msglen++;
if (mptr + msglen > mlen)
#ifndef WITH_WIPE
@@ -813,7 +817,7 @@ extern byte* sha3_digest(byte* restrict_ msg, long msglen, long bits, char* rest
*
* @param times The number of rounds
*/
-extern void sha3_simpleSqueeze(long times)
+void sha3_simpleSqueeze(long times)
{
long i;
for (i = 0; i < times; i++)
@@ -826,7 +830,7 @@ extern void sha3_simpleSqueeze(long times)
*
* @param times The number of digests
*/
-extern void sha3_fastSqueeze(long times)
+void sha3_fastSqueeze(long times)
{
long i, olen;
for (i = 0; i < times; i++)
@@ -844,7 +848,7 @@ extern void sha3_fastSqueeze(long times)
*
* @return The hash sum
*/
-extern byte* sha3_squeeze(void)
+byte* sha3_squeeze(void)
{
long nn, ww, olen, i, j, ptr, ni;
byte* rc;
@@ -888,7 +892,7 @@ extern byte* sha3_squeeze(void)
*
* @return A 25-element array with the state, changes will be applied to the sponge
*/
-extern llong* sha3_state(void)
+llong* sha3_state(void)
{
return S;
}
diff --git a/c/sha3.h b/c/sha3.h
index b8c4b06..a66d937 100644
--- a/c/sha3.h
+++ b/c/sha3.h
@@ -70,13 +70,13 @@
* @param capacity The capacity
* @param output The output size
*/
-extern void sha3_initialise(long bitrate, long capacity, long output);
+void sha3_initialise(long bitrate, long capacity, long output);
/**
* Dispose of the Keccak sponge
*/
-extern void sha3_dispose(void);
+void sha3_dispose(void);
/**
@@ -85,7 +85,7 @@ extern void sha3_dispose(void);
* @param msg The partial message
* @param msglen The length of the partial message
*/
-extern void sha3_update(byte* restrict_ msg, long msglen);
+void sha3_update(byte* restrict_ msg, long msglen);
/**
@@ -98,7 +98,7 @@ extern void sha3_update(byte* restrict_ msg, long msglen);
* @param withReturn Whether to return the hash instead of just do a quick squeeze phrase and return {@code null}
* @return The hash sum, or {@code null} if <tt>withReturn</tt> is {@code false}
*/
-extern byte* sha3_digest(byte* restrict_ msg, long msglen, long bits, char* restrict_ suffix, boolean withReturn);
+byte* sha3_digest(byte* restrict_ msg, long msglen, long bits, char* restrict_ suffix, boolean withReturn);
/**
@@ -106,7 +106,7 @@ extern byte* sha3_digest(byte* restrict_ msg, long msglen, long bits, char* rest
*
* @param times The number of rounds
*/
-extern void sha3_simpleSqueeze(long times);
+void sha3_simpleSqueeze(long times);
/**
@@ -114,7 +114,7 @@ extern void sha3_simpleSqueeze(long times);
*
* @param times The number of digests
*/
-extern void sha3_fastSqueeze(long times);
+void sha3_fastSqueeze(long times);
/**
@@ -122,7 +122,7 @@ extern void sha3_fastSqueeze(long times);
*
* @return The hash sum
*/
-extern byte* sha3_squeeze(void);
+byte* sha3_squeeze(void);
/**
@@ -130,7 +130,7 @@ extern byte* sha3_squeeze(void);
*
* @return A 25-element array with the state, changes will be applied to the sponge
*/
-extern llong* sha3_state(void);
+llong* sha3_state(void);
#endif
diff --git a/java-c-jni/SHA3.c b/java-c-jni/SHA3.c
index 1735099..9422b3c 100644
--- a/java-c-jni/SHA3.c
+++ b/java-c-jni/SHA3.c
@@ -645,21 +645,25 @@ byte* digest(byte* msg, long msglen, long bits, int* suffix, long suffix_len, bo
msglen += bits >> 3;
if ((bits &= 7))
- {
msg[msglen] &= (1 << bits) - 1;
+ if (suffix_len)
+ {
msg = (byte*)realloc(msg, msglen + ((suffix_len + bits + 7) >> 3));
+ if (!bits)
+ msg[msglen] = 0;
for (i = 0; i < suffix_len; i++)
{
- msg[msglen] |= suffix[i] << bits;
+ msg[msglen] |= suffix[i] << bits++;
if (bits == 8)
{
bits = 0;
msglen++;
+ msg[msglen] = 0;
}
}
- if (bits)
- msglen++;
}
+ if (bits)
+ msglen++;
if (mptr + msglen > mlen)
{