From fba6d1b2b73edb1c5dda6d1a87890d74d8b1e0c0 Mon Sep 17 00:00:00 2001 From: Mattias Andrée Date: Sat, 10 Aug 2013 05:20:31 +0200 Subject: misc MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Mattias Andrée --- .gitignore | 6 ++- Makefile | 12 +++-- c/sha3sum.c | 2 +- java-c-jni/SHA3.c | 140 ++++++++++++++++++++++++++++++++++++++++++++++-------- java-c-jni/SHA3.h | 37 --------------- 5 files changed, 132 insertions(+), 65 deletions(-) delete mode 100644 java-c-jni/SHA3.h diff --git a/.gitignore b/.gitignore index d784ced..40593bc 100644 --- a/.gitignore +++ b/.gitignore @@ -3,13 +3,15 @@ bin/ *~ \#*\#* .\#* -*.swp +*.sw[op] *.bak __pycache__/ *.class *.jar -*.pyc +*.py[co] *.o *.out *.so *.gch +java-c-jni/*.h + diff --git a/Makefile b/Makefile index d205115..b15303d 100644 --- a/Makefile +++ b/Makefile @@ -56,12 +56,15 @@ bin/c/%: c/%.c java-c-jni: bin/java-c-jni/SHA3.$(LIB_EXT) $(JNI_CLASSES) -bin/java-c-jni/%.so: java-c-jni/%.c - mkdir -p "bin/java-c-jni" - gcc $(C_FLAGS) $(JNI_C_FLAGS) "java-c-jni/$*.c" -o "bin/java-c-jni/$*.$(LIB_EXT)" bin/java-c-jni/%.class: java-c-jni/%.java - mkdir -p "bin/java-c-jni" + mkdir -p "bin/java-c-jni" $(JAVAC) $(JNI_JAVA_FLAGS) "java-c-jni/$*.java" +java-c-jni/%.h: bin/java-c-jni/%.class + javah -classpath bin/java-c-jni -jni -d java-c-jni \ + $$(echo "$<" | sed -e 's:^bin/java-c-jni/::' -e 's:.class$$::' | sed -e 's:/:.:g') +bin/java-c-jni/%.so: java-c-jni/%.h java-c-jni/%.c + mkdir -p "bin/java-c-jni" + gcc $(C_FLAGS) $(JNI_C_FLAGS) "java-c-jni/$*.c" -o "bin/java-c-jni/$*.$(LIB_EXT)" @@ -69,5 +72,6 @@ bin/java-c-jni/%.class: java-c-jni/%.java clean: -rm {*/,}*.{t2d,aux,cp,cps,fn,ky,log,pg,pgs,toc,tp,vr,vrs,op,ops} 2>/dev/null -rm {*/,}*.{bak,info,pdf,ps,dvi,gz,class,jar,pyc,o,so,out} 2>/dev/null + -rm java-c-jni/*.h 2>/dev/null -rm -r bin 2>/dev/null diff --git a/c/sha3sum.c b/c/sha3sum.c index b575c2e..fb62b93 100644 --- a/c/sha3sum.c +++ b/c/sha3sum.c @@ -622,7 +622,7 @@ int main(int argc, char** argv) if (j > 2) fastSqueeze(j - 2); if (j > 1) - bs = squeeze(1); + bs = squeeze(); dispose(); if (filename == null) diff --git a/java-c-jni/SHA3.c b/java-c-jni/SHA3.c index f9dd01d..57feaee 100644 --- a/java-c-jni/SHA3.c +++ b/java-c-jni/SHA3.c @@ -34,8 +34,6 @@ #define false 0 -#define min(X, Y) ((X) < (Y) ? (X) : (Y)) - /** * Round contants @@ -121,6 +119,18 @@ static long mptr = 0; static long mlen = 0; + +/** + * Gets the smallest, in value, of the arguments + * + * @param X The first candidate + * @param Y The second candidate + * @return The lowest candidate + */ +#define min(X, Y) ((X) < (Y) ? (X) : (Y)) + + + /** * Copy an array segment into an array in start to end order * @@ -549,9 +559,10 @@ void update(byte* msg, jint msglen) { long rr = r >> 3; long ww = w >> 3; - long i, len, nnn; + long i, len; byte* message; byte* _msg; + long nnn; if (mptr + msglen > mlen) { @@ -606,18 +617,21 @@ void update(byte* msg, jint msglen) /** * Absorb the last part of the message and squeeze the Keccak sponge * - * @param msg The rest of the message, may be {@code null} - * @param msglen The length of the partial message + * @param msg The rest of the message, may be {@code null} + * @param msglen The length of the partial message + * @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 withReturn is {@code false} */ -byte* digest(byte* msg, jint msglen) +byte* digest(byte* msg, jint msglen, boolean withReturn) { byte* message; byte* rc; byte* _msg; - long rr = r >> 3, len, nnn; + long rr = r >> 3, len; long nn = (n + 7) >> 3, olen; long ww = w >> 3, ni; long i, j = 0, ptr = 0, _; + long nnn; if ((msg == null) || (msglen == 0)) message = pad10star1(M, mptr, r, &len); @@ -636,8 +650,8 @@ byte* digest(byte* msg, jint msglen) free(M); M = null; rc = (byte*)malloc((n + 7) >> 3); - nnn = len; _msg = message; + nnn = len; /* Absorbing phase */ if (ww == 8) @@ -673,17 +687,98 @@ byte* digest(byte* msg, jint msglen) /* Squeezing phase */ olen = n; - ni = min(25, rr); + if (withReturn) + { + ni = min(25, rr); + while (olen > 0) + { + i = 0; + while ((i < ni) && (j < nn)) + { + llong v = S[(i % 5) * 5 + i / 5]; + for (_ = 0; _ < ww; _++) + { + if (j < nn) + rc[ptr++] = (byte)v; + v >>= 8; + j += 1; + } + i += 1; + } + olen -= r; + if (olen > 0) + keccakF(S); + } + if ((n & 7)) + rc[n >> 3] &= (1 << (n & 7)) - 1; + + return rc; + } + while ((olen -= r) > 0) + keccakF(S); + return null; +} + + +/** + * Force some rounds of Keccak-f + * + * @param times The number of rounds + */ +void simpleSqueeze(long times) +{ + long i; + for (i = 0; i < times; i++) + keccakF(S); +} + + +/** + * Squeeze as much as is needed to get a digest a number of times + * + * @param times The number of digests + */ +void fastSqueeze(long times) +{ + long i, olen; + for (i = 0; i < times; i++) + { + keccakF(S); /* Last squeeze did not do a ending squeeze */ + olen = n; + while ((olen -= r) > 0) + keccakF(S); + } +} + + +/** + * Squeeze out another digest + * + * @return The hash sum + */ +byte* squeeze() +{ + long nn, ww, olen, i, j, ptr, ni; + byte* rc; + + keccakF(S); /* Last squeeze did not do a ending squeeze */ + + ww = w >> 3; + rc = (byte*)malloc(nn = (n + 7) >> 3); + olen = n; + j = ptr = 0; + ni = (25 < r >> 3) ? 25 : (r >> 3); + while (olen > 0) { i = 0; while ((i < ni) && (j < nn)) { - llong v = S[(i % 5) * 5 + i / 5]; + long _, v = S[(i % 5) * 5 + i / 5]; for (_ = 0; _ < ww; _++) { if (j < nn) - rc[ptr++] = (byte)v; + *(rc + ptr++) = (byte)v; v >>= 8; j += 1; } @@ -693,8 +788,8 @@ byte* digest(byte* msg, jint msglen) if (olen > 0) keccakF(S); } - if ((n & 7)) - rc[n >> 3] &= (1 << (n & 7)) - 1; + if (n & 7) + rc[nn - 1] &= (1 << (n & 7)) - 1; return rc; } @@ -713,23 +808,26 @@ JNIEXPORT void JNICALL Java_SHA3_initialise(JNIEnv* env, jclass class, jint bitr JNIEXPORT void JNICALL Java_SHA3_update(JNIEnv* env, jclass class, jbyteArray msg, jint msglen) { (void) class; - if ((msg != 0) && (msglen != 0)) + if ((msg != null) && (msglen != 0)) update((byte*)((*env)->GetByteArrayElements(env, msg, 0)), msglen); } -JNIEXPORT jbyteArray JNICALL Java_SHA3_digest(JNIEnv* env, jclass class, jbyteArray msg, jint msglen) + JNIEXPORT jbyteArray JNICALL Java_SHA3_digest(JNIEnv* env, jclass class, jbyteArray msg, jint msglen, jboolean withReturn) { jbyte* rcn; - jbyteArray rcj; + jbyteArray rcj = null; (void) class; - if ((msg != 0) && (msglen != 0)) - rcn = (jbyte*)digest((byte*)((*env)->GetByteArrayElements(env, msg, 0)), msglen); + if ((msg != null) && (msglen != 0)) + rcn = (jbyte*)digest((byte*)((*env)->GetByteArrayElements(env, msg, 0)), msglen, withReturn); else - rcn = (jbyte*)digest(0, 0); - rcj = (*env)->NewByteArray(env, (n + 7) >> 3); - (*env)->SetByteArrayRegion(env, rcj, 0, (n + 7) >> 3, rcn); + rcn = (jbyte*)digest(null, 0, withReturn); + if (withReturn) + { + rcj = (*env)->NewByteArray(env, (n + 7) >> 3); + (*env)->SetByteArrayRegion(env, rcj, 0, (n + 7) >> 3, rcn); + } return rcj; } diff --git a/java-c-jni/SHA3.h b/java-c-jni/SHA3.h deleted file mode 100644 index 027cf41..0000000 --- a/java-c-jni/SHA3.h +++ /dev/null @@ -1,37 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class SHA3 */ - -#ifndef _Included_SHA3 -#define _Included_SHA3 -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: SHA3 - * Method: initialise - * Signature: (III)V - */ -JNIEXPORT void JNICALL Java_SHA3_initialise - (JNIEnv *, jclass, jint, jint, jint); - -/* - * Class: SHA3 - * Method: update - * Signature: ([BI)V - */ -JNIEXPORT void JNICALL Java_SHA3_update - (JNIEnv *, jclass, jbyteArray, jint); - -/* - * Class: SHA3 - * Method: digest - * Signature: ([BI)[B - */ -JNIEXPORT jbyteArray JNICALL Java_SHA3_digest - (JNIEnv *, jclass, jbyteArray, jint); - -#ifdef __cplusplus -} -#endif -#endif -- cgit v1.2.3-70-g09d2