From 54612159be0be9c2de773f6b5a3ce7b7af3fd444 Mon Sep 17 00:00:00 2001 From: Moxie Marlinspike Date: Sat, 13 Sep 2014 10:31:34 -0700 Subject: [PATCH] Update ed25519 extract and tests --- libaxolotl/jni/Android.mk | 2 +- libaxolotl/jni/curve25519-jni.c | 5 +- .../ed25519/additions/crypto_hash_sha512.h | 6 + libaxolotl/jni/ed25519/additions/curve_sigs.c | 33 +- libaxolotl/jni/ed25519/additions/curve_sigs.h | 20 +- libaxolotl/jni/ed25519/additions/sha512.c | 14 - libaxolotl/jni/ed25519/additions/sha512.h | 10 - .../jni/ed25519/additions/sign_modified.c | 6 - libaxolotl/jni/ed25519/additions/zeroize.c | 11 +- libaxolotl/jni/ed25519/additions/zeroize.h | 8 +- libaxolotl/jni/ed25519/main/main.c | 8 +- .../nacl_includes/crypto_hash_sha512.h | 23 - libaxolotl/jni/ed25519/nacl_sha512/blocks.c | 238 ++ libaxolotl/jni/ed25519/nacl_sha512/hash.c | 71 + libaxolotl/jni/ed25519/sha512/LICENSE.txt | 20 - libaxolotl/jni/ed25519/sha512/md_helper.c | 346 --- libaxolotl/jni/ed25519/sha512/sha2big.c | 247 --- libaxolotl/jni/ed25519/sha512/sph_sha2.h | 370 --- libaxolotl/jni/ed25519/sha512/sph_types.h | 1976 ----------------- libaxolotl/libs/armeabi-v7a/libcurve25519.so | Bin 90172 -> 135228 bytes libaxolotl/libs/armeabi/libcurve25519.so | Bin 90168 -> 131128 bytes libaxolotl/libs/mips/libcurve25519.so | Bin 170400 -> 235636 bytes libaxolotl/libs/x86/libcurve25519.so | Bin 114752 -> 163904 bytes .../test/ecc/Curve25519Test.java | 72 + 24 files changed, 448 insertions(+), 3038 deletions(-) create mode 100644 libaxolotl/jni/ed25519/additions/crypto_hash_sha512.h delete mode 100644 libaxolotl/jni/ed25519/additions/sha512.c delete mode 100644 libaxolotl/jni/ed25519/additions/sha512.h delete mode 100644 libaxolotl/jni/ed25519/nacl_includes/crypto_hash_sha512.h create mode 100644 libaxolotl/jni/ed25519/nacl_sha512/blocks.c create mode 100644 libaxolotl/jni/ed25519/nacl_sha512/hash.c delete mode 100644 libaxolotl/jni/ed25519/sha512/LICENSE.txt delete mode 100644 libaxolotl/jni/ed25519/sha512/md_helper.c delete mode 100644 libaxolotl/jni/ed25519/sha512/sha2big.c delete mode 100644 libaxolotl/jni/ed25519/sha512/sph_sha2.h delete mode 100644 libaxolotl/jni/ed25519/sha512/sph_types.h diff --git a/libaxolotl/jni/Android.mk b/libaxolotl/jni/Android.mk index 0baf53adb6..fea39cf360 100644 --- a/libaxolotl/jni/Android.mk +++ b/libaxolotl/jni/Android.mk @@ -10,7 +10,7 @@ include $(BUILD_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := libcurve25519-ref10 -LOCAL_SRC_FILES := $(wildcard ed25519/*.c) $(wildcard ed25519/additions/*.c) ed25519/sha512/sha2big.c +LOCAL_SRC_FILES := $(wildcard ed25519/*.c) $(wildcard ed25519/additions/*.c) $(wildcard ed25519/nacl_sha512/*.c) LOCAL_C_INCLUDES := ed25519/nacl_includes ed25519/additions ed25519/sha512 ed25519 include $(BUILD_STATIC_LIBRARY) diff --git a/libaxolotl/jni/curve25519-jni.c b/libaxolotl/jni/curve25519-jni.c index 46838b82ce..5d058a9160 100644 --- a/libaxolotl/jni/curve25519-jni.c +++ b/libaxolotl/jni/curve25519-jni.c @@ -80,14 +80,15 @@ JNIEXPORT jbyteArray JNICALL Java_org_whispersystems_libaxolotl_ecc_Curve25519_c uint8_t* messageBytes = (uint8_t*)(*env)->GetByteArrayElements(env, message, 0); jsize messageLength = (*env)->GetArrayLength(env, message); - curve25519_sign(signatureBytes, privateKeyBytes, messageBytes, messageLength, randomBytes); + int result = curve25519_sign(signatureBytes, privateKeyBytes, messageBytes, messageLength, randomBytes); (*env)->ReleaseByteArrayElements(env, signature, signatureBytes, 0); (*env)->ReleaseByteArrayElements(env, random, randomBytes, 0); (*env)->ReleaseByteArrayElements(env, privateKey, privateKeyBytes, 0); (*env)->ReleaseByteArrayElements(env, message, messageBytes, 0); - return signature; + if (result == 0) return signature; + else (*env)->ThrowNew(env, (*env)->FindClass(env, "java/lang/AssertionError"), "Signature failed!"); } JNIEXPORT jboolean JNICALL Java_org_whispersystems_libaxolotl_ecc_Curve25519_verifySignature diff --git a/libaxolotl/jni/ed25519/additions/crypto_hash_sha512.h b/libaxolotl/jni/ed25519/additions/crypto_hash_sha512.h new file mode 100644 index 0000000000..a51a190d25 --- /dev/null +++ b/libaxolotl/jni/ed25519/additions/crypto_hash_sha512.h @@ -0,0 +1,6 @@ +#ifndef crypto_hash_sha512_H +#define crypto_hash_sha512_H + +extern int crypto_hash_sha512(unsigned char *,const unsigned char *,unsigned long long); + +#endif diff --git a/libaxolotl/jni/ed25519/additions/curve_sigs.c b/libaxolotl/jni/ed25519/additions/curve_sigs.c index 31dd7d1502..51f2052d8f 100644 --- a/libaxolotl/jni/ed25519/additions/curve_sigs.c +++ b/libaxolotl/jni/ed25519/additions/curve_sigs.c @@ -21,6 +21,8 @@ void curve25519_keygen(unsigned char* curve25519_pubkey_out, with projective coordinates: mont_x = (ed_y + ed_z) / (ed_z - ed_y) + + NOTE: ed_y=1 is converted to mont_x=0 since fe_invert is mod-exp */ ge_scalarmult_base(&ed, curve25519_privkey_in); @@ -31,16 +33,21 @@ void curve25519_keygen(unsigned char* curve25519_pubkey_out, fe_tobytes(curve25519_pubkey_out, mont_x); } -void curve25519_sign(unsigned char* signature_out, - const unsigned char* curve25519_privkey, - const unsigned char* msg, const unsigned long msg_len, - const unsigned char* random) +int curve25519_sign(unsigned char* signature_out, + const unsigned char* curve25519_privkey, + const unsigned char* msg, const unsigned long msg_len, + const unsigned char* random) { ge_p3 ed_pubkey_point; /* Ed25519 pubkey point */ unsigned char ed_pubkey[32]; /* Ed25519 encoded pubkey */ - unsigned char sigbuf[msg_len + 128]; /* working buffer */ + unsigned char sigbuf[MAX_MSG_LEN + 128]; /* working buffer */ unsigned char sign_bit = 0; + if (msg_len > MAX_MSG_LEN) { + memset(signature_out, 0, 64); + return -1; + } + /* Convert the Curve25519 privkey to an Ed25519 public key */ ge_scalarmult_base(&ed_pubkey_point, curve25519_privkey); ge_p3_tobytes(ed_pubkey, &ed_pubkey_point); @@ -52,7 +59,9 @@ void curve25519_sign(unsigned char* signature_out, memmove(signature_out, sigbuf, 64); /* Encode the sign bit into signature (in unused high bit of S) */ + signature_out[63] &= 0x7F; /* bit should be zero already, but just in case */ signature_out[63] |= sign_bit; + return 0; } int curve25519_verify(const unsigned char* signature, @@ -64,8 +73,12 @@ int curve25519_verify(const unsigned char* signature, fe ed_y; unsigned char ed_pubkey[32]; unsigned long long some_retval; - unsigned char verifybuf[msg_len + 64]; /* working buffer */ - unsigned char verifybuf2[msg_len + 64]; /* working buffer #2 */ + unsigned char verifybuf[MAX_MSG_LEN + 64]; /* working buffer */ + unsigned char verifybuf2[MAX_MSG_LEN + 64]; /* working buffer #2 */ + + if (msg_len > MAX_MSG_LEN) { + return -1; + } /* Convert the Curve25519 public key into an Ed25519 public key. In particular, convert Curve25519's "montgomery" x-coordinate into an @@ -73,6 +86,8 @@ int curve25519_verify(const unsigned char* signature, ed_y = (mont_x - 1) / (mont_x + 1) + NOTE: mont_x=-1 is converted to ed_y=0 since fe_invert is mod-exp + Then move the sign bit into the pubkey from the signature. */ fe_frombytes(mont_x, curve25519_pubkey); @@ -84,6 +99,7 @@ int curve25519_verify(const unsigned char* signature, fe_tobytes(ed_pubkey, ed_y); /* Copy the sign bit, and remove it from signature */ + ed_pubkey[31] &= 0x7F; /* bit should be zero already, but just in case */ ed_pubkey[31] |= (signature[63] & 0x80); memmove(verifybuf, signature, 64); verifybuf[63] &= 0x7F; @@ -94,6 +110,7 @@ int curve25519_verify(const unsigned char* signature, /* The below call has a strange API: */ /* verifybuf = R || S || message */ /* verifybuf2 = internal to next call gets a copy of verifybuf, S gets - replaced with pubkey for hashing, then the whole thing gets zeroized */ + replaced with pubkey for hashing, then the whole thing gets zeroized + (if bad sig), or contains a copy of msg (good sig) */ return crypto_sign_open(verifybuf2, &some_retval, verifybuf, 64 + msg_len, ed_pubkey); } diff --git a/libaxolotl/jni/ed25519/additions/curve_sigs.h b/libaxolotl/jni/ed25519/additions/curve_sigs.h index 360df11072..cc462471b6 100644 --- a/libaxolotl/jni/ed25519/additions/curve_sigs.h +++ b/libaxolotl/jni/ed25519/additions/curve_sigs.h @@ -2,34 +2,38 @@ #ifndef __CURVE_SIGS_H__ #define __CURVE_SIGS_H__ +#define MAX_MSG_LEN 256 + void curve25519_keygen(unsigned char* curve25519_pubkey_out, /* 32 bytes */ const unsigned char* curve25519_privkey_in); /* 32 bytes */ -void curve25519_sign(unsigned char* signature_out, /* 64 bytes */ +/* returns 0 on success */ +int curve25519_sign(unsigned char* signature_out, /* 64 bytes */ const unsigned char* curve25519_privkey, /* 32 bytes */ const unsigned char* msg, const unsigned long msg_len, const unsigned char* random); /* 64 bytes */ /* returns 0 on success */ int curve25519_verify(const unsigned char* signature, /* 64 bytes */ - const unsigned char* curve25519_pubkey, /* 32 bytes */ + const unsigned char* curve25519_pubkey, /* 32 bytes */ const unsigned char* msg, const unsigned long msg_len); /* helper function - modified version of crypto_sign() to use explicit private key. In particular: - sk : private key - pk : public key - m : message + sk : private key + pk : public key + msg : message prefix : 0xFE || [0xFF]*31 - q : main subgroup order + random : 64 bytes random + q : main subgroup order The prefix is chosen to distinguish the two SHA512 uses below, since prefix is an invalid encoding for R (it would encode a "field element" of 2^255 - 2). 0xFF*32 is set aside for use in ECDH protocols, which is why the first byte here ix 0xFE. - sig_nonce = (random XOR SHA512(prefix || sk || m)) % q + sig_nonce = SHA512(prefix || sk || msg || random) % q R = g^sig_nonce M = SHA512(R || pk || m) S = sig_nonce + (m * sk) @@ -40,7 +44,7 @@ int crypto_sign_modified( const unsigned char *m,unsigned long long mlen, const unsigned char *sk, /* Curve/Ed25519 private key */ const unsigned char *pk, /* Ed25519 public key */ - const unsigned char *random /* 64 bytes random to XOR into nonce */ + const unsigned char *random /* 64 bytes random to hash into nonce */ ); #endif diff --git a/libaxolotl/jni/ed25519/additions/sha512.c b/libaxolotl/jni/ed25519/additions/sha512.c deleted file mode 100644 index b3c3867fd9..0000000000 --- a/libaxolotl/jni/ed25519/additions/sha512.c +++ /dev/null @@ -1,14 +0,0 @@ -#include "sha512.h" -#include "sph_sha2.h" -#include "zeroize.h" - -int crypto_hash_sha512_ref(unsigned char *output ,const unsigned char *input, - unsigned long long len) -{ - sph_sha512_context ctx; - sph_sha512_init(&ctx); - sph_sha512(&ctx, input, len); - sph_sha512_close(&ctx, output); - zeroize((unsigned char*)&ctx, sizeof(ctx)); - return 0; -} diff --git a/libaxolotl/jni/ed25519/additions/sha512.h b/libaxolotl/jni/ed25519/additions/sha512.h deleted file mode 100644 index 51f817c888..0000000000 --- a/libaxolotl/jni/ed25519/additions/sha512.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef __SHA512_H__ -#define __SHA512_H__ - -#include "sha512.h" -#include "sph_sha2.h" - -int crypto_hash_sha512_ref(unsigned char *output ,const unsigned char *input, - unsigned long long len); - -#endif diff --git a/libaxolotl/jni/ed25519/additions/sign_modified.c b/libaxolotl/jni/ed25519/additions/sign_modified.c index 175731a16c..61332e70e7 100644 --- a/libaxolotl/jni/ed25519/additions/sign_modified.c +++ b/libaxolotl/jni/ed25519/additions/sign_modified.c @@ -43,11 +43,5 @@ int crypto_sign_modified( sc_reduce(hram); sc_muladd(sm + 32,hram,sk,nonce); /* NEW: Use privkey directly */ - /* NEW: Dummy call to hopefully erase any traces of privkey or - nonce left in the stack from prev call to this func. */ - volatile unsigned char* p = sm+64; - sc_muladd(sm+64,hram,hram,hram); - - zeroize(nonce, 64); return 0; } diff --git a/libaxolotl/jni/ed25519/additions/zeroize.c b/libaxolotl/jni/ed25519/additions/zeroize.c index a0de1ef2fe..37c1f708bc 100644 --- a/libaxolotl/jni/ed25519/additions/zeroize.c +++ b/libaxolotl/jni/ed25519/additions/zeroize.c @@ -1,10 +1,17 @@ +#include "zeroize.h" -void zeroize(unsigned char* b, unsigned long len) +void zeroize(unsigned char* b, size_t len) { - unsigned long count = 0; + size_t count = 0; unsigned long retval = 0; volatile unsigned char *p = b; for (count = 0; count < len; count++) p[count] = 0; } + +void zeroize_stack() +{ + unsigned char m[ZEROIZE_STACK_SIZE]; + zeroize(m, sizeof m); +} diff --git a/libaxolotl/jni/ed25519/additions/zeroize.h b/libaxolotl/jni/ed25519/additions/zeroize.h index f4318795f6..80fcffb768 100644 --- a/libaxolotl/jni/ed25519/additions/zeroize.h +++ b/libaxolotl/jni/ed25519/additions/zeroize.h @@ -1,6 +1,12 @@ #ifndef __ZEROIZE_H__ #define __ZEROIZE_H__ -void zeroize(unsigned char* b, unsigned long len); +#include + +#define ZEROIZE_STACK_SIZE 2048 + +void zeroize(unsigned char* b, size_t len); + +void zeroize_stack(); #endif diff --git a/libaxolotl/jni/ed25519/main/main.c b/libaxolotl/jni/ed25519/main/main.c index cd0cf2d6d9..5fbe39956d 100644 --- a/libaxolotl/jni/ed25519/main/main.c +++ b/libaxolotl/jni/ed25519/main/main.c @@ -39,7 +39,7 @@ int main(int argc, char* argv[]) }; unsigned char sha512_actual_output[64]; - crypto_hash_sha512_ref(sha512_actual_output, sha512_input, sizeof(sha512_input)); + crypto_hash_sha512(sha512_actual_output, sha512_input, sizeof(sha512_input)); if (memcmp(sha512_actual_output, sha512_correct_output, 64) != 0) printf("SHA512 bad #1\n"); else @@ -47,7 +47,7 @@ int main(int argc, char* argv[]) sha512_input[111] ^= 1; - crypto_hash_sha512_ref(sha512_actual_output, sha512_input, sizeof(sha512_input)); + crypto_hash_sha512(sha512_actual_output, sha512_input, sizeof(sha512_input)); if (memcmp(sha512_actual_output, sha512_correct_output, 64) != 0) printf("SHA512 good #2\n"); else @@ -74,9 +74,9 @@ int main(int argc, char* argv[]) printf("Random testing...\n"); for (int count = 0; count < 10000; count++) { unsigned char b[64]; - crypto_hash_sha512_ref(b, privkey, 32); + crypto_hash_sha512(b, privkey, 32); memmove(privkey, b, 32); - crypto_hash_sha512_ref(b, privkey, 32); + crypto_hash_sha512(b, privkey, 32); memmove(random, b, 64); privkey[0] &= 248; diff --git a/libaxolotl/jni/ed25519/nacl_includes/crypto_hash_sha512.h b/libaxolotl/jni/ed25519/nacl_includes/crypto_hash_sha512.h deleted file mode 100644 index b77f8620e6..0000000000 --- a/libaxolotl/jni/ed25519/nacl_includes/crypto_hash_sha512.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef crypto_hash_sha512_H -#define crypto_hash_sha512_H - -#define crypto_hash_sha512_ref_BYTES 64 -#ifdef __cplusplus -#include -extern std::string crypto_hash_sha512_ref(const std::string &); -extern "C" { -#endif -extern int crypto_hash_sha512_ref(unsigned char *,const unsigned char *,unsigned long long); -#ifdef __cplusplus -} -#endif - -#define crypto_hash_sha512 crypto_hash_sha512_ref -#define crypto_hash_sha512_BYTES crypto_hash_sha512_ref_BYTES -#define crypto_hash_sha512_IMPLEMENTATION "crypto_hash/sha512/ref" -#ifndef crypto_hash_sha512_ref_VERSION -#define crypto_hash_sha512_ref_VERSION "-" -#endif -#define crypto_hash_sha512_VERSION crypto_hash_sha512_ref_VERSION - -#endif diff --git a/libaxolotl/jni/ed25519/nacl_sha512/blocks.c b/libaxolotl/jni/ed25519/nacl_sha512/blocks.c new file mode 100644 index 0000000000..1c5f23d5cc --- /dev/null +++ b/libaxolotl/jni/ed25519/nacl_sha512/blocks.c @@ -0,0 +1,238 @@ +#include +typedef uint64_t uint64; + +static uint64 load_bigendian(const unsigned char *x) +{ + return + (uint64) (x[7]) \ + | (((uint64) (x[6])) << 8) \ + | (((uint64) (x[5])) << 16) \ + | (((uint64) (x[4])) << 24) \ + | (((uint64) (x[3])) << 32) \ + | (((uint64) (x[2])) << 40) \ + | (((uint64) (x[1])) << 48) \ + | (((uint64) (x[0])) << 56) + ; +} + +static void store_bigendian(unsigned char *x,uint64 u) +{ + x[7] = u; u >>= 8; + x[6] = u; u >>= 8; + x[5] = u; u >>= 8; + x[4] = u; u >>= 8; + x[3] = u; u >>= 8; + x[2] = u; u >>= 8; + x[1] = u; u >>= 8; + x[0] = u; +} + +#define SHR(x,c) ((x) >> (c)) +#define ROTR(x,c) (((x) >> (c)) | ((x) << (64 - (c)))) + +#define Ch(x,y,z) ((x & y) ^ (~x & z)) +#define Maj(x,y,z) ((x & y) ^ (x & z) ^ (y & z)) +#define Sigma0(x) (ROTR(x,28) ^ ROTR(x,34) ^ ROTR(x,39)) +#define Sigma1(x) (ROTR(x,14) ^ ROTR(x,18) ^ ROTR(x,41)) +#define sigma0(x) (ROTR(x, 1) ^ ROTR(x, 8) ^ SHR(x,7)) +#define sigma1(x) (ROTR(x,19) ^ ROTR(x,61) ^ SHR(x,6)) + +#define M(w0,w14,w9,w1) w0 = sigma1(w14) + w9 + sigma0(w1) + w0; + +#define EXPAND \ + M(w0 ,w14,w9 ,w1 ) \ + M(w1 ,w15,w10,w2 ) \ + M(w2 ,w0 ,w11,w3 ) \ + M(w3 ,w1 ,w12,w4 ) \ + M(w4 ,w2 ,w13,w5 ) \ + M(w5 ,w3 ,w14,w6 ) \ + M(w6 ,w4 ,w15,w7 ) \ + M(w7 ,w5 ,w0 ,w8 ) \ + M(w8 ,w6 ,w1 ,w9 ) \ + M(w9 ,w7 ,w2 ,w10) \ + M(w10,w8 ,w3 ,w11) \ + M(w11,w9 ,w4 ,w12) \ + M(w12,w10,w5 ,w13) \ + M(w13,w11,w6 ,w14) \ + M(w14,w12,w7 ,w15) \ + M(w15,w13,w8 ,w0 ) + +#define F(w,k) \ + T1 = h + Sigma1(e) + Ch(e,f,g) + k + w; \ + T2 = Sigma0(a) + Maj(a,b,c); \ + h = g; \ + g = f; \ + f = e; \ + e = d + T1; \ + d = c; \ + c = b; \ + b = a; \ + a = T1 + T2; + +int crypto_hashblocks_sha512(unsigned char *statebytes,const unsigned char *in,unsigned long long inlen) +{ + uint64 state[8]; + uint64 a; + uint64 b; + uint64 c; + uint64 d; + uint64 e; + uint64 f; + uint64 g; + uint64 h; + uint64 T1; + uint64 T2; + + a = load_bigendian(statebytes + 0); state[0] = a; + b = load_bigendian(statebytes + 8); state[1] = b; + c = load_bigendian(statebytes + 16); state[2] = c; + d = load_bigendian(statebytes + 24); state[3] = d; + e = load_bigendian(statebytes + 32); state[4] = e; + f = load_bigendian(statebytes + 40); state[5] = f; + g = load_bigendian(statebytes + 48); state[6] = g; + h = load_bigendian(statebytes + 56); state[7] = h; + + while (inlen >= 128) { + uint64 w0 = load_bigendian(in + 0); + uint64 w1 = load_bigendian(in + 8); + uint64 w2 = load_bigendian(in + 16); + uint64 w3 = load_bigendian(in + 24); + uint64 w4 = load_bigendian(in + 32); + uint64 w5 = load_bigendian(in + 40); + uint64 w6 = load_bigendian(in + 48); + uint64 w7 = load_bigendian(in + 56); + uint64 w8 = load_bigendian(in + 64); + uint64 w9 = load_bigendian(in + 72); + uint64 w10 = load_bigendian(in + 80); + uint64 w11 = load_bigendian(in + 88); + uint64 w12 = load_bigendian(in + 96); + uint64 w13 = load_bigendian(in + 104); + uint64 w14 = load_bigendian(in + 112); + uint64 w15 = load_bigendian(in + 120); + + F(w0 ,0x428a2f98d728ae22ULL) + F(w1 ,0x7137449123ef65cdULL) + F(w2 ,0xb5c0fbcfec4d3b2fULL) + F(w3 ,0xe9b5dba58189dbbcULL) + F(w4 ,0x3956c25bf348b538ULL) + F(w5 ,0x59f111f1b605d019ULL) + F(w6 ,0x923f82a4af194f9bULL) + F(w7 ,0xab1c5ed5da6d8118ULL) + F(w8 ,0xd807aa98a3030242ULL) + F(w9 ,0x12835b0145706fbeULL) + F(w10,0x243185be4ee4b28cULL) + F(w11,0x550c7dc3d5ffb4e2ULL) + F(w12,0x72be5d74f27b896fULL) + F(w13,0x80deb1fe3b1696b1ULL) + F(w14,0x9bdc06a725c71235ULL) + F(w15,0xc19bf174cf692694ULL) + + EXPAND + + F(w0 ,0xe49b69c19ef14ad2ULL) + F(w1 ,0xefbe4786384f25e3ULL) + F(w2 ,0x0fc19dc68b8cd5b5ULL) + F(w3 ,0x240ca1cc77ac9c65ULL) + F(w4 ,0x2de92c6f592b0275ULL) + F(w5 ,0x4a7484aa6ea6e483ULL) + F(w6 ,0x5cb0a9dcbd41fbd4ULL) + F(w7 ,0x76f988da831153b5ULL) + F(w8 ,0x983e5152ee66dfabULL) + F(w9 ,0xa831c66d2db43210ULL) + F(w10,0xb00327c898fb213fULL) + F(w11,0xbf597fc7beef0ee4ULL) + F(w12,0xc6e00bf33da88fc2ULL) + F(w13,0xd5a79147930aa725ULL) + F(w14,0x06ca6351e003826fULL) + F(w15,0x142929670a0e6e70ULL) + + EXPAND + + F(w0 ,0x27b70a8546d22ffcULL) + F(w1 ,0x2e1b21385c26c926ULL) + F(w2 ,0x4d2c6dfc5ac42aedULL) + F(w3 ,0x53380d139d95b3dfULL) + F(w4 ,0x650a73548baf63deULL) + F(w5 ,0x766a0abb3c77b2a8ULL) + F(w6 ,0x81c2c92e47edaee6ULL) + F(w7 ,0x92722c851482353bULL) + F(w8 ,0xa2bfe8a14cf10364ULL) + F(w9 ,0xa81a664bbc423001ULL) + F(w10,0xc24b8b70d0f89791ULL) + F(w11,0xc76c51a30654be30ULL) + F(w12,0xd192e819d6ef5218ULL) + F(w13,0xd69906245565a910ULL) + F(w14,0xf40e35855771202aULL) + F(w15,0x106aa07032bbd1b8ULL) + + EXPAND + + F(w0 ,0x19a4c116b8d2d0c8ULL) + F(w1 ,0x1e376c085141ab53ULL) + F(w2 ,0x2748774cdf8eeb99ULL) + F(w3 ,0x34b0bcb5e19b48a8ULL) + F(w4 ,0x391c0cb3c5c95a63ULL) + F(w5 ,0x4ed8aa4ae3418acbULL) + F(w6 ,0x5b9cca4f7763e373ULL) + F(w7 ,0x682e6ff3d6b2b8a3ULL) + F(w8 ,0x748f82ee5defb2fcULL) + F(w9 ,0x78a5636f43172f60ULL) + F(w10,0x84c87814a1f0ab72ULL) + F(w11,0x8cc702081a6439ecULL) + F(w12,0x90befffa23631e28ULL) + F(w13,0xa4506cebde82bde9ULL) + F(w14,0xbef9a3f7b2c67915ULL) + F(w15,0xc67178f2e372532bULL) + + EXPAND + + F(w0 ,0xca273eceea26619cULL) + F(w1 ,0xd186b8c721c0c207ULL) + F(w2 ,0xeada7dd6cde0eb1eULL) + F(w3 ,0xf57d4f7fee6ed178ULL) + F(w4 ,0x06f067aa72176fbaULL) + F(w5 ,0x0a637dc5a2c898a6ULL) + F(w6 ,0x113f9804bef90daeULL) + F(w7 ,0x1b710b35131c471bULL) + F(w8 ,0x28db77f523047d84ULL) + F(w9 ,0x32caab7b40c72493ULL) + F(w10,0x3c9ebe0a15c9bebcULL) + F(w11,0x431d67c49c100d4cULL) + F(w12,0x4cc5d4becb3e42b6ULL) + F(w13,0x597f299cfc657e2aULL) + F(w14,0x5fcb6fab3ad6faecULL) + F(w15,0x6c44198c4a475817ULL) + + a += state[0]; + b += state[1]; + c += state[2]; + d += state[3]; + e += state[4]; + f += state[5]; + g += state[6]; + h += state[7]; + + state[0] = a; + state[1] = b; + state[2] = c; + state[3] = d; + state[4] = e; + state[5] = f; + state[6] = g; + state[7] = h; + + in += 128; + inlen -= 128; + } + + store_bigendian(statebytes + 0,state[0]); + store_bigendian(statebytes + 8,state[1]); + store_bigendian(statebytes + 16,state[2]); + store_bigendian(statebytes + 24,state[3]); + store_bigendian(statebytes + 32,state[4]); + store_bigendian(statebytes + 40,state[5]); + store_bigendian(statebytes + 48,state[6]); + store_bigendian(statebytes + 56,state[7]); + + return 0; +} diff --git a/libaxolotl/jni/ed25519/nacl_sha512/hash.c b/libaxolotl/jni/ed25519/nacl_sha512/hash.c new file mode 100644 index 0000000000..8934cc18a8 --- /dev/null +++ b/libaxolotl/jni/ed25519/nacl_sha512/hash.c @@ -0,0 +1,71 @@ +/* +20080913 +D. J. Bernstein +Public domain. +*/ + +#include +typedef uint64_t uint64; + +extern int crypto_hashblocks_sha512(unsigned char *statebytes,const unsigned char *in,unsigned long long inlen); + +#define blocks crypto_hashblocks_sha512 + +static const unsigned char iv[64] = { + 0x6a,0x09,0xe6,0x67,0xf3,0xbc,0xc9,0x08, + 0xbb,0x67,0xae,0x85,0x84,0xca,0xa7,0x3b, + 0x3c,0x6e,0xf3,0x72,0xfe,0x94,0xf8,0x2b, + 0xa5,0x4f,0xf5,0x3a,0x5f,0x1d,0x36,0xf1, + 0x51,0x0e,0x52,0x7f,0xad,0xe6,0x82,0xd1, + 0x9b,0x05,0x68,0x8c,0x2b,0x3e,0x6c,0x1f, + 0x1f,0x83,0xd9,0xab,0xfb,0x41,0xbd,0x6b, + 0x5b,0xe0,0xcd,0x19,0x13,0x7e,0x21,0x79 +} ; + +int crypto_hash_sha512(unsigned char *out,const unsigned char *in,unsigned long long inlen) +{ + unsigned char h[64]; + unsigned char padded[256]; + int i; + unsigned long long bytes = inlen; + + for (i = 0;i < 64;++i) h[i] = iv[i]; + + blocks(h,in,inlen); + in += inlen; + inlen &= 127; + in -= inlen; + + for (i = 0;i < inlen;++i) padded[i] = in[i]; + padded[inlen] = 0x80; + + if (inlen < 112) { + for (i = inlen + 1;i < 119;++i) padded[i] = 0; + padded[119] = bytes >> 61; + padded[120] = bytes >> 53; + padded[121] = bytes >> 45; + padded[122] = bytes >> 37; + padded[123] = bytes >> 29; + padded[124] = bytes >> 21; + padded[125] = bytes >> 13; + padded[126] = bytes >> 5; + padded[127] = bytes << 3; + blocks(h,padded,128); + } else { + for (i = inlen + 1;i < 247;++i) padded[i] = 0; + padded[247] = bytes >> 61; + padded[248] = bytes >> 53; + padded[249] = bytes >> 45; + padded[250] = bytes >> 37; + padded[251] = bytes >> 29; + padded[252] = bytes >> 21; + padded[253] = bytes >> 13; + padded[254] = bytes >> 5; + padded[255] = bytes << 3; + blocks(h,padded,256); + } + + for (i = 0;i < 64;++i) out[i] = h[i]; + + return 0; +} diff --git a/libaxolotl/jni/ed25519/sha512/LICENSE.txt b/libaxolotl/jni/ed25519/sha512/LICENSE.txt deleted file mode 100644 index 9789d32a14..0000000000 --- a/libaxolotl/jni/ed25519/sha512/LICENSE.txt +++ /dev/null @@ -1,20 +0,0 @@ -Copyright (c) 2007-2011 Projet RNRT SAPHIR - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be included -in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/libaxolotl/jni/ed25519/sha512/md_helper.c b/libaxolotl/jni/ed25519/sha512/md_helper.c deleted file mode 100644 index 5384f03f73..0000000000 --- a/libaxolotl/jni/ed25519/sha512/md_helper.c +++ /dev/null @@ -1,346 +0,0 @@ -/* $Id: md_helper.c 216 2010-06-08 09:46:57Z tp $ */ -/* - * This file contains some functions which implement the external data - * handling and padding for Merkle-Damgard hash functions which follow - * the conventions set out by MD4 (little-endian) or SHA-1 (big-endian). - * - * API: this file is meant to be included, not compiled as a stand-alone - * file. Some macros must be defined: - * RFUN name for the round function - * HASH "short name" for the hash function - * BE32 defined for big-endian, 32-bit based (e.g. SHA-1) - * LE32 defined for little-endian, 32-bit based (e.g. MD5) - * BE64 defined for big-endian, 64-bit based (e.g. SHA-512) - * LE64 defined for little-endian, 64-bit based (no example yet) - * PW01 if defined, append 0x01 instead of 0x80 (for Tiger) - * BLEN if defined, length of a message block (in bytes) - * PLW1 if defined, length is defined on one 64-bit word only (for Tiger) - * PLW4 if defined, length is defined on four 64-bit words (for WHIRLPOOL) - * SVAL if defined, reference to the context state information - * - * BLEN is used when a message block is not 16 (32-bit or 64-bit) words: - * this is used for instance for Tiger, which works on 64-bit words but - * uses 512-bit message blocks (eight 64-bit words). PLW1 and PLW4 are - * ignored if 32-bit words are used; if 64-bit words are used and PLW1 is - * set, then only one word (64 bits) will be used to encode the input - * message length (in bits), otherwise two words will be used (as in - * SHA-384 and SHA-512). If 64-bit words are used and PLW4 is defined (but - * not PLW1), four 64-bit words will be used to encode the message length - * (in bits). Note that regardless of those settings, only 64-bit message - * lengths are supported (in bits): messages longer than 2 Exabytes will be - * improperly hashed (this is unlikely to happen soon: 2 Exabytes is about - * 2 millions Terabytes, which is huge). - * - * If CLOSE_ONLY is defined, then this file defines only the sph_XXX_close() - * function. This is used for Tiger2, which is identical to Tiger except - * when it comes to the padding (Tiger2 uses the standard 0x80 byte instead - * of the 0x01 from original Tiger). - * - * The RFUN function is invoked with two arguments, the first pointing to - * aligned data (as a "const void *"), the second being state information - * from the context structure. By default, this state information is the - * "val" field from the context, and this field is assumed to be an array - * of words ("sph_u32" or "sph_u64", depending on BE32/LE32/BE64/LE64). - * from the context structure. The "val" field can have any type, except - * for the output encoding which assumes that it is an array of "sph_u32" - * values. By defining NO_OUTPUT, this last step is deactivated; the - * includer code is then responsible for writing out the hash result. When - * NO_OUTPUT is defined, the third parameter to the "close()" function is - * ignored. - * - * ==========================(LICENSE BEGIN)============================ - * - * Copyright (c) 2007-2010 Projet RNRT SAPHIR - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY - * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * ===========================(LICENSE END)============================= - * - * @author Thomas Pornin - */ - -#ifdef _MSC_VER -#pragma warning (disable: 4146) -#endif - -#undef SPH_XCAT -#define SPH_XCAT(a, b) SPH_XCAT_(a, b) -#undef SPH_XCAT_ -#define SPH_XCAT_(a, b) a ## b - -#undef SPH_BLEN -#undef SPH_WLEN -#if defined BE64 || defined LE64 -#define SPH_BLEN 128U -#define SPH_WLEN 8U -#else -#define SPH_BLEN 64U -#define SPH_WLEN 4U -#endif - -#ifdef BLEN -#undef SPH_BLEN -#define SPH_BLEN BLEN -#endif - -#undef SPH_MAXPAD -#if defined PLW1 -#define SPH_MAXPAD (SPH_BLEN - SPH_WLEN) -#elif defined PLW4 -#define SPH_MAXPAD (SPH_BLEN - (SPH_WLEN << 2)) -#else -#define SPH_MAXPAD (SPH_BLEN - (SPH_WLEN << 1)) -#endif - -#undef SPH_VAL -#undef SPH_NO_OUTPUT -#ifdef SVAL -#define SPH_VAL SVAL -#define SPH_NO_OUTPUT 1 -#else -#define SPH_VAL sc->val -#endif - -#ifndef CLOSE_ONLY - -#ifdef SPH_UPTR -static void -SPH_XCAT(HASH, _short)(void *cc, const void *data, size_t len) -#else -void -SPH_XCAT(sph_, HASH)(void *cc, const void *data, size_t len) -#endif -{ - SPH_XCAT(sph_, SPH_XCAT(HASH, _context)) *sc; - unsigned current; - - sc = cc; -#if SPH_64 - current = (unsigned)sc->count & (SPH_BLEN - 1U); -#else - current = (unsigned)sc->count_low & (SPH_BLEN - 1U); -#endif - while (len > 0) { - unsigned clen; -#if !SPH_64 - sph_u32 clow, clow2; -#endif - - clen = SPH_BLEN - current; - if (clen > len) - clen = len; - memcpy(sc->buf + current, data, clen); - data = (const unsigned char *)data + clen; - current += clen; - len -= clen; - if (current == SPH_BLEN) { - RFUN(sc->buf, SPH_VAL); - current = 0; - } -#if SPH_64 - sc->count += clen; -#else - clow = sc->count_low; - clow2 = SPH_T32(clow + clen); - sc->count_low = clow2; - if (clow2 < clow) - sc->count_high ++; -#endif - } -} - -#ifdef SPH_UPTR -void -SPH_XCAT(sph_, HASH)(void *cc, const void *data, size_t len) -{ - SPH_XCAT(sph_, SPH_XCAT(HASH, _context)) *sc; - unsigned current; - size_t orig_len; -#if !SPH_64 - sph_u32 clow, clow2; -#endif - - if (len < (2 * SPH_BLEN)) { - SPH_XCAT(HASH, _short)(cc, data, len); - return; - } - sc = cc; -#if SPH_64 - current = (unsigned)sc->count & (SPH_BLEN - 1U); -#else - current = (unsigned)sc->count_low & (SPH_BLEN - 1U); -#endif - if (current > 0) { - unsigned t; - - t = SPH_BLEN - current; - SPH_XCAT(HASH, _short)(cc, data, t); - data = (const unsigned char *)data + t; - len -= t; - } -#if !SPH_UNALIGNED - if (((SPH_UPTR)data & (SPH_WLEN - 1U)) != 0) { - SPH_XCAT(HASH, _short)(cc, data, len); - return; - } -#endif - orig_len = len; - while (len >= SPH_BLEN) { - RFUN(data, SPH_VAL); - len -= SPH_BLEN; - data = (const unsigned char *)data + SPH_BLEN; - } - if (len > 0) - memcpy(sc->buf, data, len); -#if SPH_64 - sc->count += (sph_u64)orig_len; -#else - clow = sc->count_low; - clow2 = SPH_T32(clow + orig_len); - sc->count_low = clow2; - if (clow2 < clow) - sc->count_high ++; - /* - * This code handles the improbable situation where "size_t" is - * greater than 32 bits, and yet we do not have a 64-bit type. - */ - orig_len >>= 12; - orig_len >>= 10; - orig_len >>= 10; - sc->count_high += orig_len; -#endif -} -#endif - -#endif - -/* - * Perform padding and produce result. The context is NOT reinitialized - * by this function. - */ -static void -SPH_XCAT(HASH, _addbits_and_close)(void *cc, - unsigned ub, unsigned n, void *dst, unsigned rnum) -{ - SPH_XCAT(sph_, SPH_XCAT(HASH, _context)) *sc; - unsigned current, u; -#if !SPH_64 - sph_u32 low, high; -#endif - - sc = cc; -#if SPH_64 - current = (unsigned)sc->count & (SPH_BLEN - 1U); -#else - current = (unsigned)sc->count_low & (SPH_BLEN - 1U); -#endif -#ifdef PW01 - sc->buf[current ++] = (0x100 | (ub & 0xFF)) >> (8 - n); -#else - { - unsigned z; - - z = 0x80 >> n; - sc->buf[current ++] = ((ub & -z) | z) & 0xFF; - } -#endif - if (current > SPH_MAXPAD) { - memset(sc->buf + current, 0, SPH_BLEN - current); - RFUN(sc->buf, SPH_VAL); - memset(sc->buf, 0, SPH_MAXPAD); - } else { - memset(sc->buf + current, 0, SPH_MAXPAD - current); - } -#if defined BE64 -#if defined PLW1 - sph_enc64be_aligned(sc->buf + SPH_MAXPAD, - SPH_T64(sc->count << 3) + (sph_u64)n); -#elif defined PLW4 - memset(sc->buf + SPH_MAXPAD, 0, 2 * SPH_WLEN); - sph_enc64be_aligned(sc->buf + SPH_MAXPAD + 2 * SPH_WLEN, - sc->count >> 61); - sph_enc64be_aligned(sc->buf + SPH_MAXPAD + 3 * SPH_WLEN, - SPH_T64(sc->count << 3) + (sph_u64)n); -#else - sph_enc64be_aligned(sc->buf + SPH_MAXPAD, sc->count >> 61); - sph_enc64be_aligned(sc->buf + SPH_MAXPAD + SPH_WLEN, - SPH_T64(sc->count << 3) + (sph_u64)n); -#endif -#elif defined LE64 -#if defined PLW1 - sph_enc64le_aligned(sc->buf + SPH_MAXPAD, - SPH_T64(sc->count << 3) + (sph_u64)n); -#elif defined PLW1 - sph_enc64le_aligned(sc->buf + SPH_MAXPAD, - SPH_T64(sc->count << 3) + (sph_u64)n); - sph_enc64le_aligned(sc->buf + SPH_MAXPAD + SPH_WLEN, sc->count >> 61); - memset(sc->buf + SPH_MAXPAD + 2 * SPH_WLEN, 0, 2 * SPH_WLEN); -#else - sph_enc64le_aligned(sc->buf + SPH_MAXPAD, - SPH_T64(sc->count << 3) + (sph_u64)n); - sph_enc64le_aligned(sc->buf + SPH_MAXPAD + SPH_WLEN, sc->count >> 61); -#endif -#else -#if SPH_64 -#ifdef BE32 - sph_enc64be_aligned(sc->buf + SPH_MAXPAD, - SPH_T64(sc->count << 3) + (sph_u64)n); -#else - sph_enc64le_aligned(sc->buf + SPH_MAXPAD, - SPH_T64(sc->count << 3) + (sph_u64)n); -#endif -#else - low = sc->count_low; - high = SPH_T32((sc->count_high << 3) | (low >> 29)); - low = SPH_T32(low << 3) + (sph_u32)n; -#ifdef BE32 - sph_enc32be(sc->buf + SPH_MAXPAD, high); - sph_enc32be(sc->buf + SPH_MAXPAD + SPH_WLEN, low); -#else - sph_enc32le(sc->buf + SPH_MAXPAD, low); - sph_enc32le(sc->buf + SPH_MAXPAD + SPH_WLEN, high); -#endif -#endif -#endif - RFUN(sc->buf, SPH_VAL); -#ifdef SPH_NO_OUTPUT - (void)dst; - (void)rnum; - (void)u; -#else - for (u = 0; u < rnum; u ++) { -#if defined BE64 - sph_enc64be((unsigned char *)dst + 8 * u, sc->val[u]); -#elif defined LE64 - sph_enc64le((unsigned char *)dst + 8 * u, sc->val[u]); -#elif defined BE32 - sph_enc32be((unsigned char *)dst + 4 * u, sc->val[u]); -#else - sph_enc32le((unsigned char *)dst + 4 * u, sc->val[u]); -#endif - } -#endif -} - -static void -SPH_XCAT(HASH, _close)(void *cc, void *dst, unsigned rnum) -{ - SPH_XCAT(HASH, _addbits_and_close)(cc, 0, 0, dst, rnum); -} diff --git a/libaxolotl/jni/ed25519/sha512/sha2big.c b/libaxolotl/jni/ed25519/sha512/sha2big.c deleted file mode 100644 index a6992233a0..0000000000 --- a/libaxolotl/jni/ed25519/sha512/sha2big.c +++ /dev/null @@ -1,247 +0,0 @@ -/* $Id: sha2big.c 216 2010-06-08 09:46:57Z tp $ */ -/* - * SHA-384 / SHA-512 implementation. - * - * ==========================(LICENSE BEGIN)============================ - * - * Copyright (c) 2007-2010 Projet RNRT SAPHIR - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY - * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * ===========================(LICENSE END)============================= - * - * @author Thomas Pornin - */ - -#include -#include - -#include "sph_sha2.h" - -#if SPH_64 - -#define CH(X, Y, Z) ((((Y) ^ (Z)) & (X)) ^ (Z)) -#define MAJ(X, Y, Z) (((X) & (Y)) | (((X) | (Y)) & (Z))) - -#define ROTR64 SPH_ROTR64 - -#define BSG5_0(x) (ROTR64(x, 28) ^ ROTR64(x, 34) ^ ROTR64(x, 39)) -#define BSG5_1(x) (ROTR64(x, 14) ^ ROTR64(x, 18) ^ ROTR64(x, 41)) -#define SSG5_0(x) (ROTR64(x, 1) ^ ROTR64(x, 8) ^ SPH_T64((x) >> 7)) -#define SSG5_1(x) (ROTR64(x, 19) ^ ROTR64(x, 61) ^ SPH_T64((x) >> 6)) - -static const sph_u64 K512[80] = { - SPH_C64(0x428A2F98D728AE22), SPH_C64(0x7137449123EF65CD), - SPH_C64(0xB5C0FBCFEC4D3B2F), SPH_C64(0xE9B5DBA58189DBBC), - SPH_C64(0x3956C25BF348B538), SPH_C64(0x59F111F1B605D019), - SPH_C64(0x923F82A4AF194F9B), SPH_C64(0xAB1C5ED5DA6D8118), - SPH_C64(0xD807AA98A3030242), SPH_C64(0x12835B0145706FBE), - SPH_C64(0x243185BE4EE4B28C), SPH_C64(0x550C7DC3D5FFB4E2), - SPH_C64(0x72BE5D74F27B896F), SPH_C64(0x80DEB1FE3B1696B1), - SPH_C64(0x9BDC06A725C71235), SPH_C64(0xC19BF174CF692694), - SPH_C64(0xE49B69C19EF14AD2), SPH_C64(0xEFBE4786384F25E3), - SPH_C64(0x0FC19DC68B8CD5B5), SPH_C64(0x240CA1CC77AC9C65), - SPH_C64(0x2DE92C6F592B0275), SPH_C64(0x4A7484AA6EA6E483), - SPH_C64(0x5CB0A9DCBD41FBD4), SPH_C64(0x76F988DA831153B5), - SPH_C64(0x983E5152EE66DFAB), SPH_C64(0xA831C66D2DB43210), - SPH_C64(0xB00327C898FB213F), SPH_C64(0xBF597FC7BEEF0EE4), - SPH_C64(0xC6E00BF33DA88FC2), SPH_C64(0xD5A79147930AA725), - SPH_C64(0x06CA6351E003826F), SPH_C64(0x142929670A0E6E70), - SPH_C64(0x27B70A8546D22FFC), SPH_C64(0x2E1B21385C26C926), - SPH_C64(0x4D2C6DFC5AC42AED), SPH_C64(0x53380D139D95B3DF), - SPH_C64(0x650A73548BAF63DE), SPH_C64(0x766A0ABB3C77B2A8), - SPH_C64(0x81C2C92E47EDAEE6), SPH_C64(0x92722C851482353B), - SPH_C64(0xA2BFE8A14CF10364), SPH_C64(0xA81A664BBC423001), - SPH_C64(0xC24B8B70D0F89791), SPH_C64(0xC76C51A30654BE30), - SPH_C64(0xD192E819D6EF5218), SPH_C64(0xD69906245565A910), - SPH_C64(0xF40E35855771202A), SPH_C64(0x106AA07032BBD1B8), - SPH_C64(0x19A4C116B8D2D0C8), SPH_C64(0x1E376C085141AB53), - SPH_C64(0x2748774CDF8EEB99), SPH_C64(0x34B0BCB5E19B48A8), - SPH_C64(0x391C0CB3C5C95A63), SPH_C64(0x4ED8AA4AE3418ACB), - SPH_C64(0x5B9CCA4F7763E373), SPH_C64(0x682E6FF3D6B2B8A3), - SPH_C64(0x748F82EE5DEFB2FC), SPH_C64(0x78A5636F43172F60), - SPH_C64(0x84C87814A1F0AB72), SPH_C64(0x8CC702081A6439EC), - SPH_C64(0x90BEFFFA23631E28), SPH_C64(0xA4506CEBDE82BDE9), - SPH_C64(0xBEF9A3F7B2C67915), SPH_C64(0xC67178F2E372532B), - SPH_C64(0xCA273ECEEA26619C), SPH_C64(0xD186B8C721C0C207), - SPH_C64(0xEADA7DD6CDE0EB1E), SPH_C64(0xF57D4F7FEE6ED178), - SPH_C64(0x06F067AA72176FBA), SPH_C64(0x0A637DC5A2C898A6), - SPH_C64(0x113F9804BEF90DAE), SPH_C64(0x1B710B35131C471B), - SPH_C64(0x28DB77F523047D84), SPH_C64(0x32CAAB7B40C72493), - SPH_C64(0x3C9EBE0A15C9BEBC), SPH_C64(0x431D67C49C100D4C), - SPH_C64(0x4CC5D4BECB3E42B6), SPH_C64(0x597F299CFC657E2A), - SPH_C64(0x5FCB6FAB3AD6FAEC), SPH_C64(0x6C44198C4A475817) -}; - -static const sph_u64 H384[8] = { - SPH_C64(0xCBBB9D5DC1059ED8), SPH_C64(0x629A292A367CD507), - SPH_C64(0x9159015A3070DD17), SPH_C64(0x152FECD8F70E5939), - SPH_C64(0x67332667FFC00B31), SPH_C64(0x8EB44A8768581511), - SPH_C64(0xDB0C2E0D64F98FA7), SPH_C64(0x47B5481DBEFA4FA4) -}; - -static const sph_u64 H512[8] = { - SPH_C64(0x6A09E667F3BCC908), SPH_C64(0xBB67AE8584CAA73B), - SPH_C64(0x3C6EF372FE94F82B), SPH_C64(0xA54FF53A5F1D36F1), - SPH_C64(0x510E527FADE682D1), SPH_C64(0x9B05688C2B3E6C1F), - SPH_C64(0x1F83D9ABFB41BD6B), SPH_C64(0x5BE0CD19137E2179) -}; - -/* - * This macro defines the body for a SHA-384 / SHA-512 compression function - * implementation. The "in" parameter should evaluate, when applied to a - * numerical input parameter from 0 to 15, to an expression which yields - * the corresponding input block. The "r" parameter should evaluate to - * an array or pointer expression designating the array of 8 words which - * contains the input and output of the compression function. - * - * SHA-512 is hard for the compiler. If the loop is completely unrolled, - * then the code will be quite huge (possibly more than 100 kB), and the - * performance will be degraded due to cache misses on the code. We - * unroll only eight steps, which avoids all needless copies when - * 64-bit registers are swapped. - */ - -#define SHA3_STEP(A, B, C, D, E, F, G, H, i) do { \ - sph_u64 T1, T2; \ - T1 = SPH_T64(H + BSG5_1(E) + CH(E, F, G) + K512[i] + W[i]); \ - T2 = SPH_T64(BSG5_0(A) + MAJ(A, B, C)); \ - D = SPH_T64(D + T1); \ - H = SPH_T64(T1 + T2); \ - } while (0) - -#define SHA3_ROUND_BODY(in, r) do { \ - int i; \ - sph_u64 A, B, C, D, E, F, G, H; \ - sph_u64 W[80]; \ - \ - for (i = 0; i < 16; i ++) \ - W[i] = in(i); \ - for (i = 16; i < 80; i ++) \ - W[i] = SPH_T64(SSG5_1(W[i - 2]) + W[i - 7] \ - + SSG5_0(W[i - 15]) + W[i - 16]); \ - A = (r)[0]; \ - B = (r)[1]; \ - C = (r)[2]; \ - D = (r)[3]; \ - E = (r)[4]; \ - F = (r)[5]; \ - G = (r)[6]; \ - H = (r)[7]; \ - for (i = 0; i < 80; i += 8) { \ - SHA3_STEP(A, B, C, D, E, F, G, H, i + 0); \ - SHA3_STEP(H, A, B, C, D, E, F, G, i + 1); \ - SHA3_STEP(G, H, A, B, C, D, E, F, i + 2); \ - SHA3_STEP(F, G, H, A, B, C, D, E, i + 3); \ - SHA3_STEP(E, F, G, H, A, B, C, D, i + 4); \ - SHA3_STEP(D, E, F, G, H, A, B, C, i + 5); \ - SHA3_STEP(C, D, E, F, G, H, A, B, i + 6); \ - SHA3_STEP(B, C, D, E, F, G, H, A, i + 7); \ - } \ - (r)[0] = SPH_T64((r)[0] + A); \ - (r)[1] = SPH_T64((r)[1] + B); \ - (r)[2] = SPH_T64((r)[2] + C); \ - (r)[3] = SPH_T64((r)[3] + D); \ - (r)[4] = SPH_T64((r)[4] + E); \ - (r)[5] = SPH_T64((r)[5] + F); \ - (r)[6] = SPH_T64((r)[6] + G); \ - (r)[7] = SPH_T64((r)[7] + H); \ - } while (0) - -/* - * One round of SHA-384 / SHA-512. The data must be aligned for 64-bit access. - */ -static void -sha3_round(const unsigned char *data, sph_u64 r[8]) -{ -#define SHA3_IN(x) sph_dec64be_aligned(data + (8 * (x))) - SHA3_ROUND_BODY(SHA3_IN, r); -#undef SHA3_IN -} - -/* see sph_sha3.h */ -void -sph_sha384_init(void *cc) -{ - sph_sha384_context *sc; - - sc = cc; - memcpy(sc->val, H384, sizeof H384); - sc->count = 0; -} - -/* see sph_sha3.h */ -void -sph_sha512_init(void *cc) -{ - sph_sha512_context *sc; - - sc = cc; - memcpy(sc->val, H512, sizeof H512); - sc->count = 0; -} - -#define RFUN sha3_round -#define HASH sha384 -#define BE64 1 -#include "md_helper.c" - -/* see sph_sha3.h */ -void -sph_sha384_close(void *cc, void *dst) -{ - sha384_close(cc, dst, 6); - sph_sha384_init(cc); -} - -/* see sph_sha3.h */ -void -sph_sha384_addbits_and_close(void *cc, unsigned ub, unsigned n, void *dst) -{ - sha384_addbits_and_close(cc, ub, n, dst, 6); - sph_sha384_init(cc); -} - -/* see sph_sha3.h */ -void -sph_sha512_close(void *cc, void *dst) -{ - sha384_close(cc, dst, 8); - sph_sha512_init(cc); -} - -/* see sph_sha3.h */ -void -sph_sha512_addbits_and_close(void *cc, unsigned ub, unsigned n, void *dst) -{ - sha384_addbits_and_close(cc, ub, n, dst, 8); - sph_sha512_init(cc); -} - -/* see sph_sha3.h */ -void -sph_sha384_comp(const sph_u64 msg[16], sph_u64 val[8]) -{ -#define SHA3_IN(x) msg[x] - SHA3_ROUND_BODY(SHA3_IN, val); -#undef SHA3_IN -} - -#endif diff --git a/libaxolotl/jni/ed25519/sha512/sph_sha2.h b/libaxolotl/jni/ed25519/sha512/sph_sha2.h deleted file mode 100644 index d5bda731a9..0000000000 --- a/libaxolotl/jni/ed25519/sha512/sph_sha2.h +++ /dev/null @@ -1,370 +0,0 @@ -/* $Id: sph_sha2.h 216 2010-06-08 09:46:57Z tp $ */ -/** - * SHA-224, SHA-256, SHA-384 and SHA-512 interface. - * - * SHA-256 has been published in FIPS 180-2, now amended with a change - * notice to include SHA-224 as well (which is a simple variation on - * SHA-256). SHA-384 and SHA-512 are also defined in FIPS 180-2. FIPS - * standards can be found at: - * http://csrc.nist.gov/publications/fips/ - * - * ==========================(LICENSE BEGIN)============================ - * - * Copyright (c) 2007-2010 Projet RNRT SAPHIR - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY - * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * ===========================(LICENSE END)============================= - * - * @file sph_sha2.h - * @author Thomas Pornin - */ - -#ifndef SPH_SHA2_H__ -#define SPH_SHA2_H__ - -#include -#include "sph_types.h" - -/** - * Output size (in bits) for SHA-224. - */ -#define SPH_SIZE_sha224 224 - -/** - * Output size (in bits) for SHA-256. - */ -#define SPH_SIZE_sha256 256 - -/** - * This structure is a context for SHA-224 computations: it contains the - * intermediate values and some data from the last entered block. Once - * a SHA-224 computation has been performed, the context can be reused for - * another computation. - * - * The contents of this structure are private. A running SHA-224 computation - * can be cloned by copying the context (e.g. with a simple - * memcpy()). - */ -typedef struct { -#ifndef DOXYGEN_IGNORE - unsigned char buf[64]; /* first field, for alignment */ - sph_u32 val[8]; -#if SPH_64 - sph_u64 count; -#else - sph_u32 count_high, count_low; -#endif -#endif -} sph_sha224_context; - -/** - * This structure is a context for SHA-256 computations. It is identical - * to the SHA-224 context. However, a context is initialized for SHA-224 - * or SHA-256, but not both (the internal IV is not the - * same). - */ -typedef sph_sha224_context sph_sha256_context; - -/** - * Initialize a SHA-224 context. This process performs no memory allocation. - * - * @param cc the SHA-224 context (pointer to - * a sph_sha224_context) - */ -void sph_sha224_init(void *cc); - -/** - * Process some data bytes. It is acceptable that len is zero - * (in which case this function does nothing). - * - * @param cc the SHA-224 context - * @param data the input data - * @param len the input data length (in bytes) - */ -void sph_sha224(void *cc, const void *data, size_t len); - -/** - * Terminate the current SHA-224 computation and output the result into the - * provided buffer. The destination buffer must be wide enough to - * accomodate the result (28 bytes). The context is automatically - * reinitialized. - * - * @param cc the SHA-224 context - * @param dst the destination buffer - */ -void sph_sha224_close(void *cc, void *dst); - -/** - * Add a few additional bits (0 to 7) to the current computation, then - * terminate it and output the result in the provided buffer, which must - * be wide enough to accomodate the result (28 bytes). If bit number i - * in ub has value 2^i, then the extra bits are those - * numbered 7 downto 8-n (this is the big-endian convention at the byte - * level). The context is automatically reinitialized. - * - * @param cc the SHA-224 context - * @param ub the extra bits - * @param n the number of extra bits (0 to 7) - * @param dst the destination buffer - */ -void sph_sha224_addbits_and_close(void *cc, unsigned ub, unsigned n, void *dst); - -/** - * Apply the SHA-224 compression function on the provided data. The - * msg parameter contains the 16 32-bit input blocks, - * as numerical values (hence after the big-endian decoding). The - * val parameter contains the 8 32-bit input blocks for - * the compression function; the output is written in place in this - * array. - * - * @param msg the message block (16 values) - * @param val the function 256-bit input and output - */ -void sph_sha224_comp(const sph_u32 msg[16], sph_u32 val[8]); - -/** - * Initialize a SHA-256 context. This process performs no memory allocation. - * - * @param cc the SHA-256 context (pointer to - * a sph_sha256_context) - */ -void sph_sha256_init(void *cc); - -#ifdef DOXYGEN_IGNORE -/** - * Process some data bytes, for SHA-256. This function is identical to - * sha_224() - * - * @param cc the SHA-224 context - * @param data the input data - * @param len the input data length (in bytes) - */ -void sph_sha256(void *cc, const void *data, size_t len); -#endif - -#ifndef DOXYGEN_IGNORE -#define sph_sha256 sph_sha224 -#endif - -/** - * Terminate the current SHA-256 computation and output the result into the - * provided buffer. The destination buffer must be wide enough to - * accomodate the result (32 bytes). The context is automatically - * reinitialized. - * - * @param cc the SHA-256 context - * @param dst the destination buffer - */ -void sph_sha256_close(void *cc, void *dst); - -/** - * Add a few additional bits (0 to 7) to the current computation, then - * terminate it and output the result in the provided buffer, which must - * be wide enough to accomodate the result (32 bytes). If bit number i - * in ub has value 2^i, then the extra bits are those - * numbered 7 downto 8-n (this is the big-endian convention at the byte - * level). The context is automatically reinitialized. - * - * @param cc the SHA-256 context - * @param ub the extra bits - * @param n the number of extra bits (0 to 7) - * @param dst the destination buffer - */ -void sph_sha256_addbits_and_close(void *cc, unsigned ub, unsigned n, void *dst); - -#ifdef DOXYGEN_IGNORE -/** - * Apply the SHA-256 compression function on the provided data. This - * function is identical to sha224_comp(). - * - * @param msg the message block (16 values) - * @param val the function 256-bit input and output - */ -void sph_sha256_comp(const sph_u32 msg[16], sph_u32 val[8]); -#endif - -#ifndef DOXYGEN_IGNORE -#define sph_sha256_comp sph_sha224_comp -#endif - -#if SPH_64 - -/** - * Output size (in bits) for SHA-384. - */ -#define SPH_SIZE_sha384 384 - -/** - * Output size (in bits) for SHA-512. - */ -#define SPH_SIZE_sha512 512 - -/** - * This structure is a context for SHA-384 computations: it contains the - * intermediate values and some data from the last entered block. Once - * a SHA-384 computation has been performed, the context can be reused for - * another computation. - * - * The contents of this structure are private. A running SHA-384 computation - * can be cloned by copying the context (e.g. with a simple - * memcpy()). - */ -typedef struct { -#ifndef DOXYGEN_IGNORE - unsigned char buf[128]; /* first field, for alignment */ - sph_u64 val[8]; - sph_u64 count; -#endif -} sph_sha384_context; - -/** - * Initialize a SHA-384 context. This process performs no memory allocation. - * - * @param cc the SHA-384 context (pointer to - * a sph_sha384_context) - */ -void sph_sha384_init(void *cc); - -/** - * Process some data bytes. It is acceptable that len is zero - * (in which case this function does nothing). - * - * @param cc the SHA-384 context - * @param data the input data - * @param len the input data length (in bytes) - */ -void sph_sha384(void *cc, const void *data, size_t len); - -/** - * Terminate the current SHA-384 computation and output the result into the - * provided buffer. The destination buffer must be wide enough to - * accomodate the result (48 bytes). The context is automatically - * reinitialized. - * - * @param cc the SHA-384 context - * @param dst the destination buffer - */ -void sph_sha384_close(void *cc, void *dst); - -/** - * Add a few additional bits (0 to 7) to the current computation, then - * terminate it and output the result in the provided buffer, which must - * be wide enough to accomodate the result (48 bytes). If bit number i - * in ub has value 2^i, then the extra bits are those - * numbered 7 downto 8-n (this is the big-endian convention at the byte - * level). The context is automatically reinitialized. - * - * @param cc the SHA-384 context - * @param ub the extra bits - * @param n the number of extra bits (0 to 7) - * @param dst the destination buffer - */ -void sph_sha384_addbits_and_close(void *cc, unsigned ub, unsigned n, void *dst); - -/** - * Apply the SHA-384 compression function on the provided data. The - * msg parameter contains the 16 64-bit input blocks, - * as numerical values (hence after the big-endian decoding). The - * val parameter contains the 8 64-bit input blocks for - * the compression function; the output is written in place in this - * array. - * - * @param msg the message block (16 values) - * @param val the function 512-bit input and output - */ -void sph_sha384_comp(const sph_u64 msg[16], sph_u64 val[8]); - -/** - * This structure is a context for SHA-512 computations. It is identical - * to the SHA-384 context. However, a context is initialized for SHA-384 - * or SHA-512, but not both (the internal IV is not the - * same). - */ -typedef sph_sha384_context sph_sha512_context; - -/** - * Initialize a SHA-512 context. This process performs no memory allocation. - * - * @param cc the SHA-512 context (pointer to - * a sph_sha512_context) - */ -void sph_sha512_init(void *cc); - -#ifdef DOXYGEN_IGNORE -/** - * Process some data bytes, for SHA-512. This function is identical to - * sph_sha384(). - * - * @param cc the SHA-384 context - * @param data the input data - * @param len the input data length (in bytes) - */ -void sph_sha512(void *cc, const void *data, size_t len); -#endif - -#ifndef DOXYGEN_IGNORE -#define sph_sha512 sph_sha384 -#endif - -/** - * Terminate the current SHA-512 computation and output the result into the - * provided buffer. The destination buffer must be wide enough to - * accomodate the result (64 bytes). The context is automatically - * reinitialized. - * - * @param cc the SHA-512 context - * @param dst the destination buffer - */ -void sph_sha512_close(void *cc, void *dst); - -/** - * Add a few additional bits (0 to 7) to the current computation, then - * terminate it and output the result in the provided buffer, which must - * be wide enough to accomodate the result (64 bytes). If bit number i - * in ub has value 2^i, then the extra bits are those - * numbered 7 downto 8-n (this is the big-endian convention at the byte - * level). The context is automatically reinitialized. - * - * @param cc the SHA-512 context - * @param ub the extra bits - * @param n the number of extra bits (0 to 7) - * @param dst the destination buffer - */ -void sph_sha512_addbits_and_close(void *cc, unsigned ub, unsigned n, void *dst); - -#ifdef DOXYGEN_IGNORE -/** - * Apply the SHA-512 compression function. This function is identical to - * sph_sha384_comp(). - * - * @param msg the message block (16 values) - * @param val the function 512-bit input and output - */ -void sph_sha512_comp(const sph_u64 msg[16], sph_u64 val[8]); -#endif - -#ifndef DOXYGEN_IGNORE -#define sph_sha512_comp sph_sha384_comp -#endif - -#endif - -#endif diff --git a/libaxolotl/jni/ed25519/sha512/sph_types.h b/libaxolotl/jni/ed25519/sha512/sph_types.h deleted file mode 100644 index 7295b0b370..0000000000 --- a/libaxolotl/jni/ed25519/sha512/sph_types.h +++ /dev/null @@ -1,1976 +0,0 @@ -/* $Id: sph_types.h 260 2011-07-21 01:02:38Z tp $ */ -/** - * Basic type definitions. - * - * This header file defines the generic integer types that will be used - * for the implementation of hash functions; it also contains helper - * functions which encode and decode multi-byte integer values, using - * either little-endian or big-endian conventions. - * - * This file contains a compile-time test on the size of a byte - * (the unsigned char C type). If bytes are not octets, - * i.e. if they do not have a size of exactly 8 bits, then compilation - * is aborted. Architectures where bytes are not octets are relatively - * rare, even in the embedded devices market. We forbid non-octet bytes - * because there is no clear convention on how octet streams are encoded - * on such systems. - * - * ==========================(LICENSE BEGIN)============================ - * - * Copyright (c) 2007-2010 Projet RNRT SAPHIR - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY - * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * ===========================(LICENSE END)============================= - * - * @file sph_types.h - * @author Thomas Pornin - */ - -#ifndef SPH_TYPES_H__ -#define SPH_TYPES_H__ - -#include - -/* - * All our I/O functions are defined over octet streams. We do not know - * how to handle input data if bytes are not octets. - */ -#if CHAR_BIT != 8 -#error This code requires 8-bit bytes -#endif - -/* ============= BEGIN documentation block for Doxygen ============ */ - -#ifdef DOXYGEN_IGNORE - -/** @mainpage sphlib C code documentation - * - * @section overview Overview - * - * sphlib is a library which contains implementations of - * various cryptographic hash functions. These pages have been generated - * with doxygen and - * document the API for the C implementations. - * - * The API is described in appropriate header files, which are available - * in the "Files" section. Each hash function family has its own header, - * whose name begins with "sph_" and contains the family - * name. For instance, the API for the RIPEMD hash functions is available - * in the header file sph_ripemd.h. - * - * @section principles API structure and conventions - * - * @subsection io Input/output conventions - * - * In all generality, hash functions operate over strings of bits. - * Individual bits are rarely encountered in C programming or actual - * communication protocols; most protocols converge on the ubiquitous - * "octet" which is a group of eight bits. Data is thus expressed as a - * stream of octets. The C programming language contains the notion of a - * "byte", which is a data unit managed under the type "unsigned - * char". The C standard prescribes that a byte should hold at - * least eight bits, but possibly more. Most modern architectures, even - * in the embedded world, feature eight-bit bytes, i.e. map bytes to - * octets. - * - * Nevertheless, for some of the implemented hash functions, an extra - * API has been added, which allows the input of arbitrary sequences of - * bits: when the computation is about to be closed, 1 to 7 extra bits - * can be added. The functions for which this API is implemented include - * the SHA-2 functions and all SHA-3 candidates. - * - * sphlib defines hash function which may hash octet streams, - * i.e. streams of bits where the number of bits is a multiple of eight. - * The data input functions in the sphlib API expect data - * as anonymous pointers ("const void *") with a length - * (of type "size_t") which gives the input data chunk length - * in bytes. A byte is assumed to be an octet; the sph_types.h - * header contains a compile-time test which prevents compilation on - * architectures where this property is not met. - * - * The hash function output is also converted into bytes. All currently - * implemented hash functions have an output width which is a multiple of - * eight, and this is likely to remain true for new designs. - * - * Most hash functions internally convert input data into 32-bit of 64-bit - * words, using either little-endian or big-endian conversion. The hash - * output also often consists of such words, which are encoded into output - * bytes with a similar endianness convention. Some hash functions have - * been only loosely specified on that subject; when necessary, - * sphlib has been tested against published "reference" - * implementations in order to use the same conventions. - * - * @subsection shortname Function short name - * - * Each implemented hash function has a "short name" which is used - * internally to derive the identifiers for the functions and context - * structures which the function uses. For instance, MD5 has the short - * name "md5". Short names are listed in the next section, - * for the implemented hash functions. In subsequent sections, the - * short name will be assumed to be "XXX": replace with the - * actual hash function name to get the C identifier. - * - * Note: some functions within the same family share the same core - * elements, such as update function or context structure. Correspondingly, - * some of the defined types or functions may actually be macros which - * transparently evaluate to another type or function name. - * - * @subsection context Context structure - * - * Each implemented hash fonction has its own context structure, available - * under the type name "sph_XXX_context" for the hash function - * with short name "XXX". This structure holds all needed - * state for a running hash computation. - * - * The contents of these structures are meant to be opaque, and private - * to the implementation. However, these contents are specified in the - * header files so that application code which uses sphlib - * may access the size of those structures. - * - * The caller is responsible for allocating the context structure, - * whether by dynamic allocation (malloc() or equivalent), - * static allocation (a global permanent variable), as an automatic - * variable ("on the stack"), or by any other mean which ensures proper - * structure alignment. sphlib code performs no dynamic - * allocation by itself. - * - * The context must be initialized before use, using the - * sph_XXX_init() function. This function sets the context - * state to proper initial values for hashing. - * - * Since all state data is contained within the context structure, - * sphlib is thread-safe and reentrant: several hash - * computations may be performed in parallel, provided that they do not - * operate on the same context. Moreover, a running computation can be - * cloned by copying the context (with a simple memcpy()): - * the context and its clone are then independant and may be updated - * with new data and/or closed without interfering with each other. - * Similarly, a context structure can be moved in memory at will: - * context structures contain no pointer, in particular no pointer to - * themselves. - * - * @subsection dataio Data input - * - * Hashed data is input with the sph_XXX() fonction, which - * takes as parameters a pointer to the context, a pointer to the data - * to hash, and the number of data bytes to hash. The context is updated - * with the new data. - * - * Data can be input in one or several calls, with arbitrary input lengths. - * However, it is best, performance wise, to input data by relatively big - * chunks (say a few kilobytes), because this allows sphlib to - * optimize things and avoid internal copying. - * - * When all data has been input, the context can be closed with - * sph_XXX_close(). The hash output is computed and written - * into the provided buffer. The caller must take care to provide a - * buffer of appropriate length; e.g., when using SHA-1, the output is - * a 20-byte word, therefore the output buffer must be at least 20-byte - * long. - * - * For some hash functions, the sph_XXX_addbits_and_close() - * function can be used instead of sph_XXX_close(). This - * function can take a few extra bits to be added at - * the end of the input message. This allows hashing messages with a - * bit length which is not a multiple of 8. The extra bits are provided - * as an unsigned integer value, and a bit count. The bit count must be - * between 0 and 7, inclusive. The extra bits are provided as bits 7 to - * 0 (bits of numerical value 128, 64, 32... downto 0), in that order. - * For instance, to add three bits of value 1, 1 and 0, the unsigned - * integer will have value 192 (1*128 + 1*64 + 0*32) and the bit count - * will be 3. - * - * The SPH_SIZE_XXX macro is defined for each hash function; - * it evaluates to the function output size, expressed in bits. For instance, - * SPH_SIZE_sha1 evaluates to 160. - * - * When closed, the context is automatically reinitialized and can be - * immediately used for another computation. It is not necessary to call - * sph_XXX_init() after a close. Note that - * sph_XXX_init() can still be called to "reset" a context, - * i.e. forget previously input data, and get back to the initial state. - * - * @subsection alignment Data alignment - * - * "Alignment" is a property of data, which is said to be "properly - * aligned" when its emplacement in memory is such that the data can - * be optimally read by full words. This depends on the type of access; - * basically, some hash functions will read data by 32-bit or 64-bit - * words. sphlib does not mandate such alignment for input - * data, but using aligned data can substantially improve performance. - * - * As a rule, it is best to input data by chunks whose length (in bytes) - * is a multiple of eight, and which begins at "generally aligned" - * addresses, such as the base address returned by a call to - * malloc(). - * - * @section functions Implemented functions - * - * We give here the list of implemented functions. They are grouped by - * family; to each family corresponds a specific header file. Each - * individual function has its associated "short name". Please refer to - * the documentation for that header file to get details on the hash - * function denomination and provenance. - * - * Note: the functions marked with a '(64)' in the list below are - * available only if the C compiler provides an integer type of length - * 64 bits or more. Such a type is mandatory in the latest C standard - * (ISO 9899:1999, aka "C99") and is present in several older compilers - * as well, so chances are that such a type is available. - * - * - HAVAL family: file sph_haval.h - * - HAVAL-128/3 (128-bit, 3 passes): short name: haval128_3 - * - HAVAL-128/4 (128-bit, 4 passes): short name: haval128_4 - * - HAVAL-128/5 (128-bit, 5 passes): short name: haval128_5 - * - HAVAL-160/3 (160-bit, 3 passes): short name: haval160_3 - * - HAVAL-160/4 (160-bit, 4 passes): short name: haval160_4 - * - HAVAL-160/5 (160-bit, 5 passes): short name: haval160_5 - * - HAVAL-192/3 (192-bit, 3 passes): short name: haval192_3 - * - HAVAL-192/4 (192-bit, 4 passes): short name: haval192_4 - * - HAVAL-192/5 (192-bit, 5 passes): short name: haval192_5 - * - HAVAL-224/3 (224-bit, 3 passes): short name: haval224_3 - * - HAVAL-224/4 (224-bit, 4 passes): short name: haval224_4 - * - HAVAL-224/5 (224-bit, 5 passes): short name: haval224_5 - * - HAVAL-256/3 (256-bit, 3 passes): short name: haval256_3 - * - HAVAL-256/4 (256-bit, 4 passes): short name: haval256_4 - * - HAVAL-256/5 (256-bit, 5 passes): short name: haval256_5 - * - MD2: file sph_md2.h, short name: md2 - * - MD4: file sph_md4.h, short name: md4 - * - MD5: file sph_md5.h, short name: md5 - * - PANAMA: file sph_panama.h, short name: panama - * - RadioGatun family: file sph_radiogatun.h - * - RadioGatun[32]: short name: radiogatun32 - * - RadioGatun[64]: short name: radiogatun64 (64) - * - RIPEMD family: file sph_ripemd.h - * - RIPEMD: short name: ripemd - * - RIPEMD-128: short name: ripemd128 - * - RIPEMD-160: short name: ripemd160 - * - SHA-0: file sph_sha0.h, short name: sha0 - * - SHA-1: file sph_sha1.h, short name: sha1 - * - SHA-2 family, 32-bit hashes: file sph_sha2.h - * - SHA-224: short name: sha224 - * - SHA-256: short name: sha256 - * - SHA-384: short name: sha384 (64) - * - SHA-512: short name: sha512 (64) - * - Tiger family: file sph_tiger.h - * - Tiger: short name: tiger (64) - * - Tiger2: short name: tiger2 (64) - * - WHIRLPOOL family: file sph_whirlpool.h - * - WHIRLPOOL-0: short name: whirlpool0 (64) - * - WHIRLPOOL-1: short name: whirlpool1 (64) - * - WHIRLPOOL: short name: whirlpool (64) - * - * The fourteen second-round SHA-3 candidates are also implemented; - * when applicable, the implementations follow the "final" specifications - * as published for the third round of the SHA-3 competition (BLAKE, - * Groestl, JH, Keccak and Skein have been tweaked for third round). - * - * - BLAKE family: file sph_blake.h - * - BLAKE-224: short name: blake224 - * - BLAKE-256: short name: blake256 - * - BLAKE-384: short name: blake384 - * - BLAKE-512: short name: blake512 - * - BMW (Blue Midnight Wish) family: file sph_bmw.h - * - BMW-224: short name: bmw224 - * - BMW-256: short name: bmw256 - * - BMW-384: short name: bmw384 (64) - * - BMW-512: short name: bmw512 (64) - * - CubeHash family: file sph_cubehash.h (specified as - * CubeHash16/32 in the CubeHash specification) - * - CubeHash-224: short name: cubehash224 - * - CubeHash-256: short name: cubehash256 - * - CubeHash-384: short name: cubehash384 - * - CubeHash-512: short name: cubehash512 - * - ECHO family: file sph_echo.h - * - ECHO-224: short name: echo224 - * - ECHO-256: short name: echo256 - * - ECHO-384: short name: echo384 - * - ECHO-512: short name: echo512 - * - Fugue family: file sph_fugue.h - * - Fugue-224: short name: fugue224 - * - Fugue-256: short name: fugue256 - * - Fugue-384: short name: fugue384 - * - Fugue-512: short name: fugue512 - * - Groestl family: file sph_groestl.h - * - Groestl-224: short name: groestl224 - * - Groestl-256: short name: groestl256 - * - Groestl-384: short name: groestl384 - * - Groestl-512: short name: groestl512 - * - Hamsi family: file sph_hamsi.h - * - Hamsi-224: short name: hamsi224 - * - Hamsi-256: short name: hamsi256 - * - Hamsi-384: short name: hamsi384 - * - Hamsi-512: short name: hamsi512 - * - JH family: file sph_jh.h - * - JH-224: short name: jh224 - * - JH-256: short name: jh256 - * - JH-384: short name: jh384 - * - JH-512: short name: jh512 - * - Keccak family: file sph_keccak.h - * - Keccak-224: short name: keccak224 - * - Keccak-256: short name: keccak256 - * - Keccak-384: short name: keccak384 - * - Keccak-512: short name: keccak512 - * - Luffa family: file sph_luffa.h - * - Luffa-224: short name: luffa224 - * - Luffa-256: short name: luffa256 - * - Luffa-384: short name: luffa384 - * - Luffa-512: short name: luffa512 - * - Shabal family: file sph_shabal.h - * - Shabal-192: short name: shabal192 - * - Shabal-224: short name: shabal224 - * - Shabal-256: short name: shabal256 - * - Shabal-384: short name: shabal384 - * - Shabal-512: short name: shabal512 - * - SHAvite-3 family: file sph_shavite.h - * - SHAvite-224 (nominally "SHAvite-3 with 224-bit output"): - * short name: shabal224 - * - SHAvite-256 (nominally "SHAvite-3 with 256-bit output"): - * short name: shabal256 - * - SHAvite-384 (nominally "SHAvite-3 with 384-bit output"): - * short name: shabal384 - * - SHAvite-512 (nominally "SHAvite-3 with 512-bit output"): - * short name: shabal512 - * - SIMD family: file sph_simd.h - * - SIMD-224: short name: simd224 - * - SIMD-256: short name: simd256 - * - SIMD-384: short name: simd384 - * - SIMD-512: short name: simd512 - * - Skein family: file sph_skein.h - * - Skein-224 (nominally specified as Skein-512-224): short name: - * skein224 (64) - * - Skein-256 (nominally specified as Skein-512-256): short name: - * skein256 (64) - * - Skein-384 (nominally specified as Skein-512-384): short name: - * skein384 (64) - * - Skein-512 (nominally specified as Skein-512-512): short name: - * skein512 (64) - * - * For the second-round SHA-3 candidates, the functions are as specified - * for round 2, i.e. with the "tweaks" that some candidates added - * between round 1 and round 2. Also, some of the submitted packages for - * round 2 contained errors, in the specification, reference code, or - * both. sphlib implements the corrected versions. - */ - -/** @hideinitializer - * Unsigned integer type whose length is at least 32 bits; on most - * architectures, it will have a width of exactly 32 bits. Unsigned C - * types implement arithmetics modulo a power of 2; use the - * SPH_T32() macro to ensure that the value is truncated - * to exactly 32 bits. Unless otherwise specified, all macros and - * functions which accept sph_u32 values assume that these - * values fit on 32 bits, i.e. do not exceed 2^32-1, even on architectures - * where sph_u32 is larger than that. - */ -typedef __arch_dependant__ sph_u32; - -/** @hideinitializer - * Signed integer type corresponding to sph_u32; it has - * width 32 bits or more. - */ -typedef __arch_dependant__ sph_s32; - -/** @hideinitializer - * Unsigned integer type whose length is at least 64 bits; on most - * architectures which feature such a type, it will have a width of - * exactly 64 bits. C99-compliant platform will have this type; it - * is also defined when the GNU compiler (gcc) is used, and on - * platforms where unsigned long is large enough. If this - * type is not available, then some hash functions which depends on - * a 64-bit type will not be available (most notably SHA-384, SHA-512, - * Tiger and WHIRLPOOL). - */ -typedef __arch_dependant__ sph_u64; - -/** @hideinitializer - * Signed integer type corresponding to sph_u64; it has - * width 64 bits or more. - */ -typedef __arch_dependant__ sph_s64; - -/** - * This macro expands the token x into a suitable - * constant expression of type sph_u32. Depending on - * how this type is defined, a suffix such as UL may - * be appended to the argument. - * - * @param x the token to expand into a suitable constant expression - */ -#define SPH_C32(x) - -/** - * Truncate a 32-bit value to exactly 32 bits. On most systems, this is - * a no-op, recognized as such by the compiler. - * - * @param x the value to truncate (of type sph_u32) - */ -#define SPH_T32(x) - -/** - * Rotate a 32-bit value by a number of bits to the left. The rotate - * count must reside between 1 and 31. This macro assumes that its - * first argument fits in 32 bits (no extra bit allowed on machines where - * sph_u32 is wider); both arguments may be evaluated - * several times. - * - * @param x the value to rotate (of type sph_u32) - * @param n the rotation count (between 1 and 31, inclusive) - */ -#define SPH_ROTL32(x, n) - -/** - * Rotate a 32-bit value by a number of bits to the left. The rotate - * count must reside between 1 and 31. This macro assumes that its - * first argument fits in 32 bits (no extra bit allowed on machines where - * sph_u32 is wider); both arguments may be evaluated - * several times. - * - * @param x the value to rotate (of type sph_u32) - * @param n the rotation count (between 1 and 31, inclusive) - */ -#define SPH_ROTR32(x, n) - -/** - * This macro is defined on systems for which a 64-bit type has been - * detected, and is used for sph_u64. - */ -#define SPH_64 - -/** - * This macro is defined on systems for the "native" integer size is - * 64 bits (64-bit values fit in one register). - */ -#define SPH_64_TRUE - -/** - * This macro expands the token x into a suitable - * constant expression of type sph_u64. Depending on - * how this type is defined, a suffix such as ULL may - * be appended to the argument. This macro is defined only if a - * 64-bit type was detected and used for sph_u64. - * - * @param x the token to expand into a suitable constant expression - */ -#define SPH_C64(x) - -/** - * Truncate a 64-bit value to exactly 64 bits. On most systems, this is - * a no-op, recognized as such by the compiler. This macro is defined only - * if a 64-bit type was detected and used for sph_u64. - * - * @param x the value to truncate (of type sph_u64) - */ -#define SPH_T64(x) - -/** - * Rotate a 64-bit value by a number of bits to the left. The rotate - * count must reside between 1 and 63. This macro assumes that its - * first argument fits in 64 bits (no extra bit allowed on machines where - * sph_u64 is wider); both arguments may be evaluated - * several times. This macro is defined only if a 64-bit type was detected - * and used for sph_u64. - * - * @param x the value to rotate (of type sph_u64) - * @param n the rotation count (between 1 and 63, inclusive) - */ -#define SPH_ROTL64(x, n) - -/** - * Rotate a 64-bit value by a number of bits to the left. The rotate - * count must reside between 1 and 63. This macro assumes that its - * first argument fits in 64 bits (no extra bit allowed on machines where - * sph_u64 is wider); both arguments may be evaluated - * several times. This macro is defined only if a 64-bit type was detected - * and used for sph_u64. - * - * @param x the value to rotate (of type sph_u64) - * @param n the rotation count (between 1 and 63, inclusive) - */ -#define SPH_ROTR64(x, n) - -/** - * This macro evaluates to inline or an equivalent construction, - * if available on the compilation platform, or to nothing otherwise. This - * is used to declare inline functions, for which the compiler should - * endeavour to include the code directly in the caller. Inline functions - * are typically defined in header files as replacement for macros. - */ -#define SPH_INLINE - -/** - * This macro is defined if the platform has been detected as using - * little-endian convention. This implies that the sph_u32 - * type (and the sph_u64 type also, if it is defined) has - * an exact width (i.e. exactly 32-bit, respectively 64-bit). - */ -#define SPH_LITTLE_ENDIAN - -/** - * This macro is defined if the platform has been detected as using - * big-endian convention. This implies that the sph_u32 - * type (and the sph_u64 type also, if it is defined) has - * an exact width (i.e. exactly 32-bit, respectively 64-bit). - */ -#define SPH_BIG_ENDIAN - -/** - * This macro is defined if 32-bit words (and 64-bit words, if defined) - * can be read from and written to memory efficiently in little-endian - * convention. This is the case for little-endian platforms, and also - * for the big-endian platforms which have special little-endian access - * opcodes (e.g. Ultrasparc). - */ -#define SPH_LITTLE_FAST - -/** - * This macro is defined if 32-bit words (and 64-bit words, if defined) - * can be read from and written to memory efficiently in big-endian - * convention. This is the case for little-endian platforms, and also - * for the little-endian platforms which have special big-endian access - * opcodes. - */ -#define SPH_BIG_FAST - -/** - * On some platforms, this macro is defined to an unsigned integer type - * into which pointer values may be cast. The resulting value can then - * be tested for being a multiple of 2, 4 or 8, indicating an aligned - * pointer for, respectively, 16-bit, 32-bit or 64-bit memory accesses. - */ -#define SPH_UPTR - -/** - * When defined, this macro indicates that unaligned memory accesses - * are possible with only a minor penalty, and thus should be prefered - * over strategies which first copy data to an aligned buffer. - */ -#define SPH_UNALIGNED - -/** - * Byte-swap a 32-bit word (i.e. 0x12345678 becomes - * 0x78563412). This is an inline function which resorts - * to inline assembly on some platforms, for better performance. - * - * @param x the 32-bit value to byte-swap - * @return the byte-swapped value - */ -static inline sph_u32 sph_bswap32(sph_u32 x); - -/** - * Byte-swap a 64-bit word. This is an inline function which resorts - * to inline assembly on some platforms, for better performance. This - * function is defined only if a suitable 64-bit type was found for - * sph_u64 - * - * @param x the 64-bit value to byte-swap - * @return the byte-swapped value - */ -static inline sph_u64 sph_bswap64(sph_u64 x); - -/** - * Decode a 16-bit unsigned value from memory, in little-endian convention - * (least significant byte comes first). - * - * @param src the source address - * @return the decoded value - */ -static inline unsigned sph_dec16le(const void *src); - -/** - * Encode a 16-bit unsigned value into memory, in little-endian convention - * (least significant byte comes first). - * - * @param dst the destination buffer - * @param val the value to encode - */ -static inline void sph_enc16le(void *dst, unsigned val); - -/** - * Decode a 16-bit unsigned value from memory, in big-endian convention - * (most significant byte comes first). - * - * @param src the source address - * @return the decoded value - */ -static inline unsigned sph_dec16be(const void *src); - -/** - * Encode a 16-bit unsigned value into memory, in big-endian convention - * (most significant byte comes first). - * - * @param dst the destination buffer - * @param val the value to encode - */ -static inline void sph_enc16be(void *dst, unsigned val); - -/** - * Decode a 32-bit unsigned value from memory, in little-endian convention - * (least significant byte comes first). - * - * @param src the source address - * @return the decoded value - */ -static inline sph_u32 sph_dec32le(const void *src); - -/** - * Decode a 32-bit unsigned value from memory, in little-endian convention - * (least significant byte comes first). This function assumes that the - * source address is suitably aligned for a direct access, if the platform - * supports such things; it can thus be marginally faster than the generic - * sph_dec32le() function. - * - * @param src the source address - * @return the decoded value - */ -static inline sph_u32 sph_dec32le_aligned(const void *src); - -/** - * Encode a 32-bit unsigned value into memory, in little-endian convention - * (least significant byte comes first). - * - * @param dst the destination buffer - * @param val the value to encode - */ -static inline void sph_enc32le(void *dst, sph_u32 val); - -/** - * Encode a 32-bit unsigned value into memory, in little-endian convention - * (least significant byte comes first). This function assumes that the - * destination address is suitably aligned for a direct access, if the - * platform supports such things; it can thus be marginally faster than - * the generic sph_enc32le() function. - * - * @param dst the destination buffer - * @param val the value to encode - */ -static inline void sph_enc32le_aligned(void *dst, sph_u32 val); - -/** - * Decode a 32-bit unsigned value from memory, in big-endian convention - * (most significant byte comes first). - * - * @param src the source address - * @return the decoded value - */ -static inline sph_u32 sph_dec32be(const void *src); - -/** - * Decode a 32-bit unsigned value from memory, in big-endian convention - * (most significant byte comes first). This function assumes that the - * source address is suitably aligned for a direct access, if the platform - * supports such things; it can thus be marginally faster than the generic - * sph_dec32be() function. - * - * @param src the source address - * @return the decoded value - */ -static inline sph_u32 sph_dec32be_aligned(const void *src); - -/** - * Encode a 32-bit unsigned value into memory, in big-endian convention - * (most significant byte comes first). - * - * @param dst the destination buffer - * @param val the value to encode - */ -static inline void sph_enc32be(void *dst, sph_u32 val); - -/** - * Encode a 32-bit unsigned value into memory, in big-endian convention - * (most significant byte comes first). This function assumes that the - * destination address is suitably aligned for a direct access, if the - * platform supports such things; it can thus be marginally faster than - * the generic sph_enc32be() function. - * - * @param dst the destination buffer - * @param val the value to encode - */ -static inline void sph_enc32be_aligned(void *dst, sph_u32 val); - -/** - * Decode a 64-bit unsigned value from memory, in little-endian convention - * (least significant byte comes first). This function is defined only - * if a suitable 64-bit type was detected and used for sph_u64. - * - * @param src the source address - * @return the decoded value - */ -static inline sph_u64 sph_dec64le(const void *src); - -/** - * Decode a 64-bit unsigned value from memory, in little-endian convention - * (least significant byte comes first). This function assumes that the - * source address is suitably aligned for a direct access, if the platform - * supports such things; it can thus be marginally faster than the generic - * sph_dec64le() function. This function is defined only - * if a suitable 64-bit type was detected and used for sph_u64. - * - * @param src the source address - * @return the decoded value - */ -static inline sph_u64 sph_dec64le_aligned(const void *src); - -/** - * Encode a 64-bit unsigned value into memory, in little-endian convention - * (least significant byte comes first). This function is defined only - * if a suitable 64-bit type was detected and used for sph_u64. - * - * @param dst the destination buffer - * @param val the value to encode - */ -static inline void sph_enc64le(void *dst, sph_u64 val); - -/** - * Encode a 64-bit unsigned value into memory, in little-endian convention - * (least significant byte comes first). This function assumes that the - * destination address is suitably aligned for a direct access, if the - * platform supports such things; it can thus be marginally faster than - * the generic sph_enc64le() function. This function is defined - * only if a suitable 64-bit type was detected and used for - * sph_u64. - * - * @param dst the destination buffer - * @param val the value to encode - */ -static inline void sph_enc64le_aligned(void *dst, sph_u64 val); - -/** - * Decode a 64-bit unsigned value from memory, in big-endian convention - * (most significant byte comes first). This function is defined only - * if a suitable 64-bit type was detected and used for sph_u64. - * - * @param src the source address - * @return the decoded value - */ -static inline sph_u64 sph_dec64be(const void *src); - -/** - * Decode a 64-bit unsigned value from memory, in big-endian convention - * (most significant byte comes first). This function assumes that the - * source address is suitably aligned for a direct access, if the platform - * supports such things; it can thus be marginally faster than the generic - * sph_dec64be() function. This function is defined only - * if a suitable 64-bit type was detected and used for sph_u64. - * - * @param src the source address - * @return the decoded value - */ -static inline sph_u64 sph_dec64be_aligned(const void *src); - -/** - * Encode a 64-bit unsigned value into memory, in big-endian convention - * (most significant byte comes first). This function is defined only - * if a suitable 64-bit type was detected and used for sph_u64. - * - * @param dst the destination buffer - * @param val the value to encode - */ -static inline void sph_enc64be(void *dst, sph_u64 val); - -/** - * Encode a 64-bit unsigned value into memory, in big-endian convention - * (most significant byte comes first). This function assumes that the - * destination address is suitably aligned for a direct access, if the - * platform supports such things; it can thus be marginally faster than - * the generic sph_enc64be() function. This function is defined - * only if a suitable 64-bit type was detected and used for - * sph_u64. - * - * @param dst the destination buffer - * @param val the value to encode - */ -static inline void sph_enc64be_aligned(void *dst, sph_u64 val); - -#endif - -/* ============== END documentation block for Doxygen ============= */ - -#ifndef DOXYGEN_IGNORE - -/* - * We want to define the types "sph_u32" and "sph_u64" which hold - * unsigned values of at least, respectively, 32 and 64 bits. These - * tests should select appropriate types for most platforms. The - * macro "SPH_64" is defined if the 64-bit is supported. - */ - -#undef SPH_64 -#undef SPH_64_TRUE - -#if defined __STDC__ && __STDC_VERSION__ >= 199901L - -/* - * On C99 implementations, we can use to get an exact 64-bit - * type, if any, or otherwise use a wider type (which must exist, for - * C99 conformance). - */ - -#include - -#ifdef UINT32_MAX -typedef uint32_t sph_u32; -typedef int32_t sph_s32; -#else -typedef uint_fast32_t sph_u32; -typedef int_fast32_t sph_s32; -#endif -#if !SPH_NO_64 -#ifdef UINT64_MAX -typedef uint64_t sph_u64; -typedef int64_t sph_s64; -#else -typedef uint_fast64_t sph_u64; -typedef int_fast64_t sph_s64; -#endif -#endif - -#define SPH_C32(x) ((sph_u32)(x)) -#if !SPH_NO_64 -#define SPH_C64(x) ((sph_u64)(x)) -#define SPH_64 1 -#endif - -#else - -/* - * On non-C99 systems, we use "unsigned int" if it is wide enough, - * "unsigned long" otherwise. This supports all "reasonable" architectures. - * We have to be cautious: pre-C99 preprocessors handle constants - * differently in '#if' expressions. Hence the shifts to test UINT_MAX. - */ - -#if ((UINT_MAX >> 11) >> 11) >= 0x3FF - -typedef unsigned int sph_u32; -typedef int sph_s32; - -#define SPH_C32(x) ((sph_u32)(x ## U)) - -#else - -typedef unsigned long sph_u32; -typedef long sph_s32; - -#define SPH_C32(x) ((sph_u32)(x ## UL)) - -#endif - -#if !SPH_NO_64 - -/* - * We want a 64-bit type. We use "unsigned long" if it is wide enough (as - * is common on 64-bit architectures such as AMD64, Alpha or Sparcv9), - * "unsigned long long" otherwise, if available. We use ULLONG_MAX to - * test whether "unsigned long long" is available; we also know that - * gcc features this type, even if the libc header do not know it. - */ - -#if ((ULONG_MAX >> 31) >> 31) >= 3 - -typedef unsigned long sph_u64; -typedef long sph_s64; - -#define SPH_C64(x) ((sph_u64)(x ## UL)) - -#define SPH_64 1 - -#elif ((ULLONG_MAX >> 31) >> 31) >= 3 || defined __GNUC__ - -typedef unsigned long long sph_u64; -typedef long long sph_s64; - -#define SPH_C64(x) ((sph_u64)(x ## ULL)) - -#define SPH_64 1 - -#else - -/* - * No 64-bit type... - */ - -#endif - -#endif - -#endif - -/* - * If the "unsigned long" type has length 64 bits or more, then this is - * a "true" 64-bit architectures. This is also true with Visual C on - * amd64, even though the "long" type is limited to 32 bits. - */ -#if SPH_64 && (((ULONG_MAX >> 31) >> 31) >= 3 || defined _M_X64) -#define SPH_64_TRUE 1 -#endif - -/* - * Implementation note: some processors have specific opcodes to perform - * a rotation. Recent versions of gcc recognize the expression above and - * use the relevant opcodes, when appropriate. - */ - -#define SPH_T32(x) ((x) & SPH_C32(0xFFFFFFFF)) -#define SPH_ROTL32(x, n) SPH_T32(((x) << (n)) | ((x) >> (32 - (n)))) -#define SPH_ROTR32(x, n) SPH_ROTL32(x, (32 - (n))) - -#if SPH_64 - -#define SPH_T64(x) ((x) & SPH_C64(0xFFFFFFFFFFFFFFFF)) -#define SPH_ROTL64(x, n) SPH_T64(((x) << (n)) | ((x) >> (64 - (n)))) -#define SPH_ROTR64(x, n) SPH_ROTL64(x, (64 - (n))) - -#endif - -#ifndef DOXYGEN_IGNORE -/* - * Define SPH_INLINE to be an "inline" qualifier, if available. We define - * some small macro-like functions which benefit greatly from being inlined. - */ -#if (defined __STDC__ && __STDC_VERSION__ >= 199901L) || defined __GNUC__ -#define SPH_INLINE inline -#elif defined _MSC_VER -#define SPH_INLINE __inline -#else -#define SPH_INLINE -#endif -#endif - -/* - * We define some macros which qualify the architecture. These macros - * may be explicit set externally (e.g. as compiler parameters). The - * code below sets those macros if they are not already defined. - * - * Most macros are boolean, thus evaluate to either zero or non-zero. - * The SPH_UPTR macro is special, in that it evaluates to a C type, - * or is not defined. - * - * SPH_UPTR if defined: unsigned type to cast pointers into - * - * SPH_UNALIGNED non-zero if unaligned accesses are efficient - * SPH_LITTLE_ENDIAN non-zero if architecture is known to be little-endian - * SPH_BIG_ENDIAN non-zero if architecture is known to be big-endian - * SPH_LITTLE_FAST non-zero if little-endian decoding is fast - * SPH_BIG_FAST non-zero if big-endian decoding is fast - * - * If SPH_UPTR is defined, then encoding and decoding of 32-bit and 64-bit - * values will try to be "smart". Either SPH_LITTLE_ENDIAN or SPH_BIG_ENDIAN - * _must_ be non-zero in those situations. The 32-bit and 64-bit types - * _must_ also have an exact width. - * - * SPH_SPARCV9_GCC_32 UltraSPARC-compatible with gcc, 32-bit mode - * SPH_SPARCV9_GCC_64 UltraSPARC-compatible with gcc, 64-bit mode - * SPH_SPARCV9_GCC UltraSPARC-compatible with gcc - * SPH_I386_GCC x86-compatible (32-bit) with gcc - * SPH_I386_MSVC x86-compatible (32-bit) with Microsoft Visual C - * SPH_AMD64_GCC x86-compatible (64-bit) with gcc - * SPH_AMD64_MSVC x86-compatible (64-bit) with Microsoft Visual C - * SPH_PPC32_GCC PowerPC, 32-bit, with gcc - * SPH_PPC64_GCC PowerPC, 64-bit, with gcc - * - * TODO: enhance automatic detection, for more architectures and compilers. - * Endianness is the most important. SPH_UNALIGNED and SPH_UPTR help with - * some very fast functions (e.g. MD4) when using unaligned input data. - * The CPU-specific-with-GCC macros are useful only for inline assembly, - * normally restrained to this header file. - */ - -/* - * 32-bit x86, aka "i386 compatible". - */ -#if defined __i386__ || defined _M_IX86 - -#define SPH_DETECT_UNALIGNED 1 -#define SPH_DETECT_LITTLE_ENDIAN 1 -#define SPH_DETECT_UPTR sph_u32 -#ifdef __GNUC__ -#define SPH_DETECT_I386_GCC 1 -#endif -#ifdef _MSC_VER -#define SPH_DETECT_I386_MSVC 1 -#endif - -/* - * 64-bit x86, hereafter known as "amd64". - */ -#elif defined __x86_64 || defined _M_X64 - -#define SPH_DETECT_UNALIGNED 1 -#define SPH_DETECT_LITTLE_ENDIAN 1 -#define SPH_DETECT_UPTR sph_u64 -#ifdef __GNUC__ -#define SPH_DETECT_AMD64_GCC 1 -#endif -#ifdef _MSC_VER -#define SPH_DETECT_AMD64_MSVC 1 -#endif - -/* - * 64-bit Sparc architecture (implies v9). - */ -#elif ((defined __sparc__ || defined __sparc) && defined __arch64__) \ - || defined __sparcv9 - -#define SPH_DETECT_BIG_ENDIAN 1 -#define SPH_DETECT_UPTR sph_u64 -#ifdef __GNUC__ -#define SPH_DETECT_SPARCV9_GCC_64 1 -#define SPH_DETECT_LITTLE_FAST 1 -#endif - -/* - * 32-bit Sparc. - */ -#elif (defined __sparc__ || defined __sparc) \ - && !(defined __sparcv9 || defined __arch64__) - -#define SPH_DETECT_BIG_ENDIAN 1 -#define SPH_DETECT_UPTR sph_u32 -#if defined __GNUC__ && defined __sparc_v9__ -#define SPH_DETECT_SPARCV9_GCC_32 1 -#define SPH_DETECT_LITTLE_FAST 1 -#endif - -/* - * ARM, little-endian. - */ -#elif defined __arm__ && __ARMEL__ - -#define SPH_DETECT_LITTLE_ENDIAN 1 - -/* - * MIPS, little-endian. - */ -#elif MIPSEL || _MIPSEL || __MIPSEL || __MIPSEL__ - -#define SPH_DETECT_LITTLE_ENDIAN 1 - -/* - * MIPS, big-endian. - */ -#elif MIPSEB || _MIPSEB || __MIPSEB || __MIPSEB__ - -#define SPH_DETECT_BIG_ENDIAN 1 - -/* - * PowerPC. - */ -#elif defined __powerpc__ || defined __POWERPC__ || defined __ppc__ \ - || defined _ARCH_PPC - -/* - * Note: we do not declare cross-endian access to be "fast": even if - * using inline assembly, implementation should still assume that - * keeping the decoded word in a temporary is faster than decoding - * it again. - */ -#if defined __GNUC__ -#if SPH_64_TRUE -#define SPH_DETECT_PPC64_GCC 1 -#else -#define SPH_DETECT_PPC32_GCC 1 -#endif -#endif - -#if defined __BIG_ENDIAN__ || defined _BIG_ENDIAN -#define SPH_DETECT_BIG_ENDIAN 1 -#elif defined __LITTLE_ENDIAN__ || defined _LITTLE_ENDIAN -#define SPH_DETECT_LITTLE_ENDIAN 1 -#endif - -/* - * Itanium, 64-bit. - */ -#elif defined __ia64 || defined __ia64__ \ - || defined __itanium__ || defined _M_IA64 - -#if defined __BIG_ENDIAN__ || defined _BIG_ENDIAN -#define SPH_DETECT_BIG_ENDIAN 1 -#else -#define SPH_DETECT_LITTLE_ENDIAN 1 -#endif -#if defined __LP64__ || defined _LP64 -#define SPH_DETECT_UPTR sph_u64 -#else -#define SPH_DETECT_UPTR sph_u32 -#endif - -#endif - -#if defined SPH_DETECT_SPARCV9_GCC_32 || defined SPH_DETECT_SPARCV9_GCC_64 -#define SPH_DETECT_SPARCV9_GCC 1 -#endif - -#if defined SPH_DETECT_UNALIGNED && !defined SPH_UNALIGNED -#define SPH_UNALIGNED SPH_DETECT_UNALIGNED -#endif -#if defined SPH_DETECT_UPTR && !defined SPH_UPTR -#define SPH_UPTR SPH_DETECT_UPTR -#endif -#if defined SPH_DETECT_LITTLE_ENDIAN && !defined SPH_LITTLE_ENDIAN -#define SPH_LITTLE_ENDIAN SPH_DETECT_LITTLE_ENDIAN -#endif -#if defined SPH_DETECT_BIG_ENDIAN && !defined SPH_BIG_ENDIAN -#define SPH_BIG_ENDIAN SPH_DETECT_BIG_ENDIAN -#endif -#if defined SPH_DETECT_LITTLE_FAST && !defined SPH_LITTLE_FAST -#define SPH_LITTLE_FAST SPH_DETECT_LITTLE_FAST -#endif -#if defined SPH_DETECT_BIG_FAST && !defined SPH_BIG_FAST -#define SPH_BIG_FAST SPH_DETECT_BIG_FAST -#endif -#if defined SPH_DETECT_SPARCV9_GCC_32 && !defined SPH_SPARCV9_GCC_32 -#define SPH_SPARCV9_GCC_32 SPH_DETECT_SPARCV9_GCC_32 -#endif -#if defined SPH_DETECT_SPARCV9_GCC_64 && !defined SPH_SPARCV9_GCC_64 -#define SPH_SPARCV9_GCC_64 SPH_DETECT_SPARCV9_GCC_64 -#endif -#if defined SPH_DETECT_SPARCV9_GCC && !defined SPH_SPARCV9_GCC -#define SPH_SPARCV9_GCC SPH_DETECT_SPARCV9_GCC -#endif -#if defined SPH_DETECT_I386_GCC && !defined SPH_I386_GCC -#define SPH_I386_GCC SPH_DETECT_I386_GCC -#endif -#if defined SPH_DETECT_I386_MSVC && !defined SPH_I386_MSVC -#define SPH_I386_MSVC SPH_DETECT_I386_MSVC -#endif -#if defined SPH_DETECT_AMD64_GCC && !defined SPH_AMD64_GCC -#define SPH_AMD64_GCC SPH_DETECT_AMD64_GCC -#endif -#if defined SPH_DETECT_AMD64_MSVC && !defined SPH_AMD64_MSVC -#define SPH_AMD64_MSVC SPH_DETECT_AMD64_MSVC -#endif -#if defined SPH_DETECT_PPC32_GCC && !defined SPH_PPC32_GCC -#define SPH_PPC32_GCC SPH_DETECT_PPC32_GCC -#endif -#if defined SPH_DETECT_PPC64_GCC && !defined SPH_PPC64_GCC -#define SPH_PPC64_GCC SPH_DETECT_PPC64_GCC -#endif - -#if SPH_LITTLE_ENDIAN && !defined SPH_LITTLE_FAST -#define SPH_LITTLE_FAST 1 -#endif -#if SPH_BIG_ENDIAN && !defined SPH_BIG_FAST -#define SPH_BIG_FAST 1 -#endif - -#if defined SPH_UPTR && !(SPH_LITTLE_ENDIAN || SPH_BIG_ENDIAN) -#error SPH_UPTR defined, but endianness is not known. -#endif - -#if SPH_I386_GCC && !SPH_NO_ASM - -/* - * On x86 32-bit, with gcc, we use the bswapl opcode to byte-swap 32-bit - * values. - */ - -static SPH_INLINE sph_u32 -sph_bswap32(sph_u32 x) -{ - __asm__ __volatile__ ("bswapl %0" : "=r" (x) : "0" (x)); - return x; -} - -#if SPH_64 - -static SPH_INLINE sph_u64 -sph_bswap64(sph_u64 x) -{ - return ((sph_u64)sph_bswap32((sph_u32)x) << 32) - | (sph_u64)sph_bswap32((sph_u32)(x >> 32)); -} - -#endif - -#elif SPH_AMD64_GCC && !SPH_NO_ASM - -/* - * On x86 64-bit, with gcc, we use the bswapl opcode to byte-swap 32-bit - * and 64-bit values. - */ - -static SPH_INLINE sph_u32 -sph_bswap32(sph_u32 x) -{ - __asm__ __volatile__ ("bswapl %0" : "=r" (x) : "0" (x)); - return x; -} - -#if SPH_64 - -static SPH_INLINE sph_u64 -sph_bswap64(sph_u64 x) -{ - __asm__ __volatile__ ("bswapq %0" : "=r" (x) : "0" (x)); - return x; -} - -#endif - -/* - * Disabled code. Apparently, Microsoft Visual C 2005 is smart enough - * to generate proper opcodes for endianness swapping with the pure C - * implementation below. - * - -#elif SPH_I386_MSVC && !SPH_NO_ASM - -static __inline sph_u32 __declspec(naked) __fastcall -sph_bswap32(sph_u32 x) -{ - __asm { - bswap ecx - mov eax,ecx - ret - } -} - -#if SPH_64 - -static SPH_INLINE sph_u64 -sph_bswap64(sph_u64 x) -{ - return ((sph_u64)sph_bswap32((sph_u32)x) << 32) - | (sph_u64)sph_bswap32((sph_u32)(x >> 32)); -} - -#endif - - * - * [end of disabled code] - */ - -#else - -static SPH_INLINE sph_u32 -sph_bswap32(sph_u32 x) -{ - x = SPH_T32((x << 16) | (x >> 16)); - x = ((x & SPH_C32(0xFF00FF00)) >> 8) - | ((x & SPH_C32(0x00FF00FF)) << 8); - return x; -} - -#if SPH_64 - -/** - * Byte-swap a 64-bit value. - * - * @param x the input value - * @return the byte-swapped value - */ -static SPH_INLINE sph_u64 -sph_bswap64(sph_u64 x) -{ - x = SPH_T64((x << 32) | (x >> 32)); - x = ((x & SPH_C64(0xFFFF0000FFFF0000)) >> 16) - | ((x & SPH_C64(0x0000FFFF0000FFFF)) << 16); - x = ((x & SPH_C64(0xFF00FF00FF00FF00)) >> 8) - | ((x & SPH_C64(0x00FF00FF00FF00FF)) << 8); - return x; -} - -#endif - -#endif - -#if SPH_SPARCV9_GCC && !SPH_NO_ASM - -/* - * On UltraSPARC systems, native ordering is big-endian, but it is - * possible to perform little-endian read accesses by specifying the - * address space 0x88 (ASI_PRIMARY_LITTLE). Basically, either we use - * the opcode "lda [%reg]0x88,%dst", where %reg is the register which - * contains the source address and %dst is the destination register, - * or we use "lda [%reg+imm]%asi,%dst", which uses the %asi register - * to get the address space name. The latter format is better since it - * combines an addition and the actual access in a single opcode; but - * it requires the setting (and subsequent resetting) of %asi, which is - * slow. Some operations (i.e. MD5 compression function) combine many - * successive little-endian read accesses, which may share the same - * %asi setting. The macros below contain the appropriate inline - * assembly. - */ - -#define SPH_SPARCV9_SET_ASI \ - sph_u32 sph_sparcv9_asi; \ - __asm__ __volatile__ ( \ - "rd %%asi,%0\n\twr %%g0,0x88,%%asi" : "=r" (sph_sparcv9_asi)); - -#define SPH_SPARCV9_RESET_ASI \ - __asm__ __volatile__ ("wr %%g0,%0,%%asi" : : "r" (sph_sparcv9_asi)); - -#define SPH_SPARCV9_DEC32LE(base, idx) ({ \ - sph_u32 sph_sparcv9_tmp; \ - __asm__ __volatile__ ("lda [%1+" #idx "*4]%%asi,%0" \ - : "=r" (sph_sparcv9_tmp) : "r" (base)); \ - sph_sparcv9_tmp; \ - }) - -#endif - -static SPH_INLINE void -sph_enc16be(void *dst, unsigned val) -{ - ((unsigned char *)dst)[0] = (val >> 8); - ((unsigned char *)dst)[1] = val; -} - -static SPH_INLINE unsigned -sph_dec16be(const void *src) -{ - return ((unsigned)(((const unsigned char *)src)[0]) << 8) - | (unsigned)(((const unsigned char *)src)[1]); -} - -static SPH_INLINE void -sph_enc16le(void *dst, unsigned val) -{ - ((unsigned char *)dst)[0] = val; - ((unsigned char *)dst)[1] = val >> 8; -} - -static SPH_INLINE unsigned -sph_dec16le(const void *src) -{ - return (unsigned)(((const unsigned char *)src)[0]) - | ((unsigned)(((const unsigned char *)src)[1]) << 8); -} - -/** - * Encode a 32-bit value into the provided buffer (big endian convention). - * - * @param dst the destination buffer - * @param val the 32-bit value to encode - */ -static SPH_INLINE void -sph_enc32be(void *dst, sph_u32 val) -{ -#if defined SPH_UPTR -#if SPH_UNALIGNED -#if SPH_LITTLE_ENDIAN - val = sph_bswap32(val); -#endif - *(sph_u32 *)dst = val; -#else - if (((SPH_UPTR)dst & 3) == 0) { -#if SPH_LITTLE_ENDIAN - val = sph_bswap32(val); -#endif - *(sph_u32 *)dst = val; - } else { - ((unsigned char *)dst)[0] = (val >> 24); - ((unsigned char *)dst)[1] = (val >> 16); - ((unsigned char *)dst)[2] = (val >> 8); - ((unsigned char *)dst)[3] = val; - } -#endif -#else - ((unsigned char *)dst)[0] = (val >> 24); - ((unsigned char *)dst)[1] = (val >> 16); - ((unsigned char *)dst)[2] = (val >> 8); - ((unsigned char *)dst)[3] = val; -#endif -} - -/** - * Encode a 32-bit value into the provided buffer (big endian convention). - * The destination buffer must be properly aligned. - * - * @param dst the destination buffer (32-bit aligned) - * @param val the value to encode - */ -static SPH_INLINE void -sph_enc32be_aligned(void *dst, sph_u32 val) -{ -#if SPH_LITTLE_ENDIAN - *(sph_u32 *)dst = sph_bswap32(val); -#elif SPH_BIG_ENDIAN - *(sph_u32 *)dst = val; -#else - ((unsigned char *)dst)[0] = (val >> 24); - ((unsigned char *)dst)[1] = (val >> 16); - ((unsigned char *)dst)[2] = (val >> 8); - ((unsigned char *)dst)[3] = val; -#endif -} - -/** - * Decode a 32-bit value from the provided buffer (big endian convention). - * - * @param src the source buffer - * @return the decoded value - */ -static SPH_INLINE sph_u32 -sph_dec32be(const void *src) -{ -#if defined SPH_UPTR -#if SPH_UNALIGNED -#if SPH_LITTLE_ENDIAN - return sph_bswap32(*(const sph_u32 *)src); -#else - return *(const sph_u32 *)src; -#endif -#else - if (((SPH_UPTR)src & 3) == 0) { -#if SPH_LITTLE_ENDIAN - return sph_bswap32(*(const sph_u32 *)src); -#else - return *(const sph_u32 *)src; -#endif - } else { - return ((sph_u32)(((const unsigned char *)src)[0]) << 24) - | ((sph_u32)(((const unsigned char *)src)[1]) << 16) - | ((sph_u32)(((const unsigned char *)src)[2]) << 8) - | (sph_u32)(((const unsigned char *)src)[3]); - } -#endif -#else - return ((sph_u32)(((const unsigned char *)src)[0]) << 24) - | ((sph_u32)(((const unsigned char *)src)[1]) << 16) - | ((sph_u32)(((const unsigned char *)src)[2]) << 8) - | (sph_u32)(((const unsigned char *)src)[3]); -#endif -} - -/** - * Decode a 32-bit value from the provided buffer (big endian convention). - * The source buffer must be properly aligned. - * - * @param src the source buffer (32-bit aligned) - * @return the decoded value - */ -static SPH_INLINE sph_u32 -sph_dec32be_aligned(const void *src) -{ -#if SPH_LITTLE_ENDIAN - return sph_bswap32(*(const sph_u32 *)src); -#elif SPH_BIG_ENDIAN - return *(const sph_u32 *)src; -#else - return ((sph_u32)(((const unsigned char *)src)[0]) << 24) - | ((sph_u32)(((const unsigned char *)src)[1]) << 16) - | ((sph_u32)(((const unsigned char *)src)[2]) << 8) - | (sph_u32)(((const unsigned char *)src)[3]); -#endif -} - -/** - * Encode a 32-bit value into the provided buffer (little endian convention). - * - * @param dst the destination buffer - * @param val the 32-bit value to encode - */ -static SPH_INLINE void -sph_enc32le(void *dst, sph_u32 val) -{ -#if defined SPH_UPTR -#if SPH_UNALIGNED -#if SPH_BIG_ENDIAN - val = sph_bswap32(val); -#endif - *(sph_u32 *)dst = val; -#else - if (((SPH_UPTR)dst & 3) == 0) { -#if SPH_BIG_ENDIAN - val = sph_bswap32(val); -#endif - *(sph_u32 *)dst = val; - } else { - ((unsigned char *)dst)[0] = val; - ((unsigned char *)dst)[1] = (val >> 8); - ((unsigned char *)dst)[2] = (val >> 16); - ((unsigned char *)dst)[3] = (val >> 24); - } -#endif -#else - ((unsigned char *)dst)[0] = val; - ((unsigned char *)dst)[1] = (val >> 8); - ((unsigned char *)dst)[2] = (val >> 16); - ((unsigned char *)dst)[3] = (val >> 24); -#endif -} - -/** - * Encode a 32-bit value into the provided buffer (little endian convention). - * The destination buffer must be properly aligned. - * - * @param dst the destination buffer (32-bit aligned) - * @param val the value to encode - */ -static SPH_INLINE void -sph_enc32le_aligned(void *dst, sph_u32 val) -{ -#if SPH_LITTLE_ENDIAN - *(sph_u32 *)dst = val; -#elif SPH_BIG_ENDIAN - *(sph_u32 *)dst = sph_bswap32(val); -#else - ((unsigned char *)dst)[0] = val; - ((unsigned char *)dst)[1] = (val >> 8); - ((unsigned char *)dst)[2] = (val >> 16); - ((unsigned char *)dst)[3] = (val >> 24); -#endif -} - -/** - * Decode a 32-bit value from the provided buffer (little endian convention). - * - * @param src the source buffer - * @return the decoded value - */ -static SPH_INLINE sph_u32 -sph_dec32le(const void *src) -{ -#if defined SPH_UPTR -#if SPH_UNALIGNED -#if SPH_BIG_ENDIAN - return sph_bswap32(*(const sph_u32 *)src); -#else - return *(const sph_u32 *)src; -#endif -#else - if (((SPH_UPTR)src & 3) == 0) { -#if SPH_BIG_ENDIAN -#if SPH_SPARCV9_GCC && !SPH_NO_ASM - sph_u32 tmp; - - /* - * "__volatile__" is needed here because without it, - * gcc-3.4.3 miscompiles the code and performs the - * access before the test on the address, thus triggering - * a bus error... - */ - __asm__ __volatile__ ( - "lda [%1]0x88,%0" : "=r" (tmp) : "r" (src)); - return tmp; -/* - * On PowerPC, this turns out not to be worth the effort: the inline - * assembly makes GCC optimizer uncomfortable, which tends to nullify - * the decoding gains. - * - * For most hash functions, using this inline assembly trick changes - * hashing speed by less than 5% and often _reduces_ it. The biggest - * gains are for MD4 (+11%) and CubeHash (+30%). For all others, it is - * less then 10%. The speed gain on CubeHash is probably due to the - * chronic shortage of registers that CubeHash endures; for the other - * functions, the generic code appears to be efficient enough already. - * -#elif (SPH_PPC32_GCC || SPH_PPC64_GCC) && !SPH_NO_ASM - sph_u32 tmp; - - __asm__ __volatile__ ( - "lwbrx %0,0,%1" : "=r" (tmp) : "r" (src)); - return tmp; - */ -#else - return sph_bswap32(*(const sph_u32 *)src); -#endif -#else - return *(const sph_u32 *)src; -#endif - } else { - return (sph_u32)(((const unsigned char *)src)[0]) - | ((sph_u32)(((const unsigned char *)src)[1]) << 8) - | ((sph_u32)(((const unsigned char *)src)[2]) << 16) - | ((sph_u32)(((const unsigned char *)src)[3]) << 24); - } -#endif -#else - return (sph_u32)(((const unsigned char *)src)[0]) - | ((sph_u32)(((const unsigned char *)src)[1]) << 8) - | ((sph_u32)(((const unsigned char *)src)[2]) << 16) - | ((sph_u32)(((const unsigned char *)src)[3]) << 24); -#endif -} - -/** - * Decode a 32-bit value from the provided buffer (little endian convention). - * The source buffer must be properly aligned. - * - * @param src the source buffer (32-bit aligned) - * @return the decoded value - */ -static SPH_INLINE sph_u32 -sph_dec32le_aligned(const void *src) -{ -#if SPH_LITTLE_ENDIAN - return *(const sph_u32 *)src; -#elif SPH_BIG_ENDIAN -#if SPH_SPARCV9_GCC && !SPH_NO_ASM - sph_u32 tmp; - - __asm__ __volatile__ ("lda [%1]0x88,%0" : "=r" (tmp) : "r" (src)); - return tmp; -/* - * Not worth it generally. - * -#elif (SPH_PPC32_GCC || SPH_PPC64_GCC) && !SPH_NO_ASM - sph_u32 tmp; - - __asm__ __volatile__ ("lwbrx %0,0,%1" : "=r" (tmp) : "r" (src)); - return tmp; - */ -#else - return sph_bswap32(*(const sph_u32 *)src); -#endif -#else - return (sph_u32)(((const unsigned char *)src)[0]) - | ((sph_u32)(((const unsigned char *)src)[1]) << 8) - | ((sph_u32)(((const unsigned char *)src)[2]) << 16) - | ((sph_u32)(((const unsigned char *)src)[3]) << 24); -#endif -} - -#if SPH_64 - -/** - * Encode a 64-bit value into the provided buffer (big endian convention). - * - * @param dst the destination buffer - * @param val the 64-bit value to encode - */ -static SPH_INLINE void -sph_enc64be(void *dst, sph_u64 val) -{ -#if defined SPH_UPTR -#if SPH_UNALIGNED -#if SPH_LITTLE_ENDIAN - val = sph_bswap64(val); -#endif - *(sph_u64 *)dst = val; -#else - if (((SPH_UPTR)dst & 7) == 0) { -#if SPH_LITTLE_ENDIAN - val = sph_bswap64(val); -#endif - *(sph_u64 *)dst = val; - } else { - ((unsigned char *)dst)[0] = (val >> 56); - ((unsigned char *)dst)[1] = (val >> 48); - ((unsigned char *)dst)[2] = (val >> 40); - ((unsigned char *)dst)[3] = (val >> 32); - ((unsigned char *)dst)[4] = (val >> 24); - ((unsigned char *)dst)[5] = (val >> 16); - ((unsigned char *)dst)[6] = (val >> 8); - ((unsigned char *)dst)[7] = val; - } -#endif -#else - ((unsigned char *)dst)[0] = (val >> 56); - ((unsigned char *)dst)[1] = (val >> 48); - ((unsigned char *)dst)[2] = (val >> 40); - ((unsigned char *)dst)[3] = (val >> 32); - ((unsigned char *)dst)[4] = (val >> 24); - ((unsigned char *)dst)[5] = (val >> 16); - ((unsigned char *)dst)[6] = (val >> 8); - ((unsigned char *)dst)[7] = val; -#endif -} - -/** - * Encode a 64-bit value into the provided buffer (big endian convention). - * The destination buffer must be properly aligned. - * - * @param dst the destination buffer (64-bit aligned) - * @param val the value to encode - */ -static SPH_INLINE void -sph_enc64be_aligned(void *dst, sph_u64 val) -{ -#if SPH_LITTLE_ENDIAN - *(sph_u64 *)dst = sph_bswap64(val); -#elif SPH_BIG_ENDIAN - *(sph_u64 *)dst = val; -#else - ((unsigned char *)dst)[0] = (val >> 56); - ((unsigned char *)dst)[1] = (val >> 48); - ((unsigned char *)dst)[2] = (val >> 40); - ((unsigned char *)dst)[3] = (val >> 32); - ((unsigned char *)dst)[4] = (val >> 24); - ((unsigned char *)dst)[5] = (val >> 16); - ((unsigned char *)dst)[6] = (val >> 8); - ((unsigned char *)dst)[7] = val; -#endif -} - -/** - * Decode a 64-bit value from the provided buffer (big endian convention). - * - * @param src the source buffer - * @return the decoded value - */ -static SPH_INLINE sph_u64 -sph_dec64be(const void *src) -{ -#if defined SPH_UPTR -#if SPH_UNALIGNED -#if SPH_LITTLE_ENDIAN - return sph_bswap64(*(const sph_u64 *)src); -#else - return *(const sph_u64 *)src; -#endif -#else - if (((SPH_UPTR)src & 7) == 0) { -#if SPH_LITTLE_ENDIAN - return sph_bswap64(*(const sph_u64 *)src); -#else - return *(const sph_u64 *)src; -#endif - } else { - return ((sph_u64)(((const unsigned char *)src)[0]) << 56) - | ((sph_u64)(((const unsigned char *)src)[1]) << 48) - | ((sph_u64)(((const unsigned char *)src)[2]) << 40) - | ((sph_u64)(((const unsigned char *)src)[3]) << 32) - | ((sph_u64)(((const unsigned char *)src)[4]) << 24) - | ((sph_u64)(((const unsigned char *)src)[5]) << 16) - | ((sph_u64)(((const unsigned char *)src)[6]) << 8) - | (sph_u64)(((const unsigned char *)src)[7]); - } -#endif -#else - return ((sph_u64)(((const unsigned char *)src)[0]) << 56) - | ((sph_u64)(((const unsigned char *)src)[1]) << 48) - | ((sph_u64)(((const unsigned char *)src)[2]) << 40) - | ((sph_u64)(((const unsigned char *)src)[3]) << 32) - | ((sph_u64)(((const unsigned char *)src)[4]) << 24) - | ((sph_u64)(((const unsigned char *)src)[5]) << 16) - | ((sph_u64)(((const unsigned char *)src)[6]) << 8) - | (sph_u64)(((const unsigned char *)src)[7]); -#endif -} - -/** - * Decode a 64-bit value from the provided buffer (big endian convention). - * The source buffer must be properly aligned. - * - * @param src the source buffer (64-bit aligned) - * @return the decoded value - */ -static SPH_INLINE sph_u64 -sph_dec64be_aligned(const void *src) -{ -#if SPH_LITTLE_ENDIAN - return sph_bswap64(*(const sph_u64 *)src); -#elif SPH_BIG_ENDIAN - return *(const sph_u64 *)src; -#else - return ((sph_u64)(((const unsigned char *)src)[0]) << 56) - | ((sph_u64)(((const unsigned char *)src)[1]) << 48) - | ((sph_u64)(((const unsigned char *)src)[2]) << 40) - | ((sph_u64)(((const unsigned char *)src)[3]) << 32) - | ((sph_u64)(((const unsigned char *)src)[4]) << 24) - | ((sph_u64)(((const unsigned char *)src)[5]) << 16) - | ((sph_u64)(((const unsigned char *)src)[6]) << 8) - | (sph_u64)(((const unsigned char *)src)[7]); -#endif -} - -/** - * Encode a 64-bit value into the provided buffer (little endian convention). - * - * @param dst the destination buffer - * @param val the 64-bit value to encode - */ -static SPH_INLINE void -sph_enc64le(void *dst, sph_u64 val) -{ -#if defined SPH_UPTR -#if SPH_UNALIGNED -#if SPH_BIG_ENDIAN - val = sph_bswap64(val); -#endif - *(sph_u64 *)dst = val; -#else - if (((SPH_UPTR)dst & 7) == 0) { -#if SPH_BIG_ENDIAN - val = sph_bswap64(val); -#endif - *(sph_u64 *)dst = val; - } else { - ((unsigned char *)dst)[0] = val; - ((unsigned char *)dst)[1] = (val >> 8); - ((unsigned char *)dst)[2] = (val >> 16); - ((unsigned char *)dst)[3] = (val >> 24); - ((unsigned char *)dst)[4] = (val >> 32); - ((unsigned char *)dst)[5] = (val >> 40); - ((unsigned char *)dst)[6] = (val >> 48); - ((unsigned char *)dst)[7] = (val >> 56); - } -#endif -#else - ((unsigned char *)dst)[0] = val; - ((unsigned char *)dst)[1] = (val >> 8); - ((unsigned char *)dst)[2] = (val >> 16); - ((unsigned char *)dst)[3] = (val >> 24); - ((unsigned char *)dst)[4] = (val >> 32); - ((unsigned char *)dst)[5] = (val >> 40); - ((unsigned char *)dst)[6] = (val >> 48); - ((unsigned char *)dst)[7] = (val >> 56); -#endif -} - -/** - * Encode a 64-bit value into the provided buffer (little endian convention). - * The destination buffer must be properly aligned. - * - * @param dst the destination buffer (64-bit aligned) - * @param val the value to encode - */ -static SPH_INLINE void -sph_enc64le_aligned(void *dst, sph_u64 val) -{ -#if SPH_LITTLE_ENDIAN - *(sph_u64 *)dst = val; -#elif SPH_BIG_ENDIAN - *(sph_u64 *)dst = sph_bswap64(val); -#else - ((unsigned char *)dst)[0] = val; - ((unsigned char *)dst)[1] = (val >> 8); - ((unsigned char *)dst)[2] = (val >> 16); - ((unsigned char *)dst)[3] = (val >> 24); - ((unsigned char *)dst)[4] = (val >> 32); - ((unsigned char *)dst)[5] = (val >> 40); - ((unsigned char *)dst)[6] = (val >> 48); - ((unsigned char *)dst)[7] = (val >> 56); -#endif -} - -/** - * Decode a 64-bit value from the provided buffer (little endian convention). - * - * @param src the source buffer - * @return the decoded value - */ -static SPH_INLINE sph_u64 -sph_dec64le(const void *src) -{ -#if defined SPH_UPTR -#if SPH_UNALIGNED -#if SPH_BIG_ENDIAN - return sph_bswap64(*(const sph_u64 *)src); -#else - return *(const sph_u64 *)src; -#endif -#else - if (((SPH_UPTR)src & 7) == 0) { -#if SPH_BIG_ENDIAN -#if SPH_SPARCV9_GCC_64 && !SPH_NO_ASM - sph_u64 tmp; - - __asm__ __volatile__ ( - "ldxa [%1]0x88,%0" : "=r" (tmp) : "r" (src)); - return tmp; -/* - * Not worth it generally. - * -#elif SPH_PPC32_GCC && !SPH_NO_ASM - return (sph_u64)sph_dec32le_aligned(src) - | ((sph_u64)sph_dec32le_aligned( - (const char *)src + 4) << 32); -#elif SPH_PPC64_GCC && !SPH_NO_ASM - sph_u64 tmp; - - __asm__ __volatile__ ( - "ldbrx %0,0,%1" : "=r" (tmp) : "r" (src)); - return tmp; - */ -#else - return sph_bswap64(*(const sph_u64 *)src); -#endif -#else - return *(const sph_u64 *)src; -#endif - } else { - return (sph_u64)(((const unsigned char *)src)[0]) - | ((sph_u64)(((const unsigned char *)src)[1]) << 8) - | ((sph_u64)(((const unsigned char *)src)[2]) << 16) - | ((sph_u64)(((const unsigned char *)src)[3]) << 24) - | ((sph_u64)(((const unsigned char *)src)[4]) << 32) - | ((sph_u64)(((const unsigned char *)src)[5]) << 40) - | ((sph_u64)(((const unsigned char *)src)[6]) << 48) - | ((sph_u64)(((const unsigned char *)src)[7]) << 56); - } -#endif -#else - return (sph_u64)(((const unsigned char *)src)[0]) - | ((sph_u64)(((const unsigned char *)src)[1]) << 8) - | ((sph_u64)(((const unsigned char *)src)[2]) << 16) - | ((sph_u64)(((const unsigned char *)src)[3]) << 24) - | ((sph_u64)(((const unsigned char *)src)[4]) << 32) - | ((sph_u64)(((const unsigned char *)src)[5]) << 40) - | ((sph_u64)(((const unsigned char *)src)[6]) << 48) - | ((sph_u64)(((const unsigned char *)src)[7]) << 56); -#endif -} - -/** - * Decode a 64-bit value from the provided buffer (little endian convention). - * The source buffer must be properly aligned. - * - * @param src the source buffer (64-bit aligned) - * @return the decoded value - */ -static SPH_INLINE sph_u64 -sph_dec64le_aligned(const void *src) -{ -#if SPH_LITTLE_ENDIAN - return *(const sph_u64 *)src; -#elif SPH_BIG_ENDIAN -#if SPH_SPARCV9_GCC_64 && !SPH_NO_ASM - sph_u64 tmp; - - __asm__ __volatile__ ("ldxa [%1]0x88,%0" : "=r" (tmp) : "r" (src)); - return tmp; -/* - * Not worth it generally. - * -#elif SPH_PPC32_GCC && !SPH_NO_ASM - return (sph_u64)sph_dec32le_aligned(src) - | ((sph_u64)sph_dec32le_aligned((const char *)src + 4) << 32); -#elif SPH_PPC64_GCC && !SPH_NO_ASM - sph_u64 tmp; - - __asm__ __volatile__ ("ldbrx %0,0,%1" : "=r" (tmp) : "r" (src)); - return tmp; - */ -#else - return sph_bswap64(*(const sph_u64 *)src); -#endif -#else - return (sph_u64)(((const unsigned char *)src)[0]) - | ((sph_u64)(((const unsigned char *)src)[1]) << 8) - | ((sph_u64)(((const unsigned char *)src)[2]) << 16) - | ((sph_u64)(((const unsigned char *)src)[3]) << 24) - | ((sph_u64)(((const unsigned char *)src)[4]) << 32) - | ((sph_u64)(((const unsigned char *)src)[5]) << 40) - | ((sph_u64)(((const unsigned char *)src)[6]) << 48) - | ((sph_u64)(((const unsigned char *)src)[7]) << 56); -#endif -} - -#endif - -#endif /* Doxygen excluded block */ - -#endif diff --git a/libaxolotl/libs/armeabi-v7a/libcurve25519.so b/libaxolotl/libs/armeabi-v7a/libcurve25519.so index 37484699776f8518a295de03a67f277ee3bd22e0..0b9965a837fd2ae92f828f4e413fddcdace18f36 100755 GIT binary patch delta 60216 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

#&%tW?9q=RHBWL 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 Yq_~R3n#O)8#;&2MQ<6C-r6lry0G^9zw*UYD diff --git a/libaxolotl/libs/mips/libcurve25519.so b/libaxolotl/libs/mips/libcurve25519.so index eac95cd7fedd2e2574657de3ec0d8d6f83933750..990620f999dfa4bcf46e856ad70ddd79f03a33ec 100755 GIT binary patch delta 74815 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%0A< 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 delta 28826 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 M-vQ&nN^!vd0jGF2sQ>@~ diff --git a/libaxolotl/libs/x86/libcurve25519.so b/libaxolotl/libs/x86/libcurve25519.so index 4b7ea39c73332af766218e176dd2b566cbc4dda9..0169fe55ba95ee0a8ce7d9d4696062c9861d3f70 100755 GIT binary patch delta 69043 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

W`eMiIsv11wN2z(Bw$x?AH0i$t>h*Qc1xf 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 diff --git a/libaxolotl/src/androidTest/java/org/whispersystems/test/ecc/Curve25519Test.java b/libaxolotl/src/androidTest/java/org/whispersystems/test/ecc/Curve25519Test.java index b0f9617084..4b8ce2ea1d 100644 --- a/libaxolotl/src/androidTest/java/org/whispersystems/test/ecc/Curve25519Test.java +++ b/libaxolotl/src/androidTest/java/org/whispersystems/test/ecc/Curve25519Test.java @@ -79,4 +79,76 @@ public class Curve25519Test extends AndroidTestCase { assertTrue(Arrays.equals(sharedAlice, sharedBob)); } } + + public void testSignature() throws InvalidKeyException { + byte[] aliceIdentityPrivate = {(byte)0xc0, (byte)0x97, (byte)0x24, (byte)0x84, (byte)0x12, + (byte)0xe5, (byte)0x8b, (byte)0xf0, (byte)0x5d, (byte)0xf4, + (byte)0x87, (byte)0x96, (byte)0x82, (byte)0x05, (byte)0x13, + (byte)0x27, (byte)0x94, (byte)0x17, (byte)0x8e, (byte)0x36, + (byte)0x76, (byte)0x37, (byte)0xf5, (byte)0x81, (byte)0x8f, + (byte)0x81, (byte)0xe0, (byte)0xe6, (byte)0xce, (byte)0x73, + (byte)0xe8, (byte)0x65}; + + byte[] aliceIdentityPublic = {(byte)0x05, (byte)0xab, (byte)0x7e, (byte)0x71, (byte)0x7d, + (byte)0x4a, (byte)0x16, (byte)0x3b, (byte)0x7d, (byte)0x9a, + (byte)0x1d, (byte)0x80, (byte)0x71, (byte)0xdf, (byte)0xe9, + (byte)0xdc, (byte)0xf8, (byte)0xcd, (byte)0xcd, (byte)0x1c, + (byte)0xea, (byte)0x33, (byte)0x39, (byte)0xb6, (byte)0x35, + (byte)0x6b, (byte)0xe8, (byte)0x4d, (byte)0x88, (byte)0x7e, + (byte)0x32, (byte)0x2c, (byte)0x64}; + + byte[] aliceEphemeralPublic = {(byte)0x05, (byte)0xed, (byte)0xce, (byte)0x9d, (byte)0x9c, + (byte)0x41, (byte)0x5c, (byte)0xa7, (byte)0x8c, (byte)0xb7, + (byte)0x25, (byte)0x2e, (byte)0x72, (byte)0xc2, (byte)0xc4, + (byte)0xa5, (byte)0x54, (byte)0xd3, (byte)0xeb, (byte)0x29, + (byte)0x48, (byte)0x5a, (byte)0x0e, (byte)0x1d, (byte)0x50, + (byte)0x31, (byte)0x18, (byte)0xd1, (byte)0xa8, (byte)0x2d, + (byte)0x99, (byte)0xfb, (byte)0x4a}; + + byte[] aliceSignature = {(byte)0x5d, (byte)0xe8, (byte)0x8c, (byte)0xa9, (byte)0xa8, + (byte)0x9b, (byte)0x4a, (byte)0x11, (byte)0x5d, (byte)0xa7, + (byte)0x91, (byte)0x09, (byte)0xc6, (byte)0x7c, (byte)0x9c, + (byte)0x74, (byte)0x64, (byte)0xa3, (byte)0xe4, (byte)0x18, + (byte)0x02, (byte)0x74, (byte)0xf1, (byte)0xcb, (byte)0x8c, + (byte)0x63, (byte)0xc2, (byte)0x98, (byte)0x4e, (byte)0x28, + (byte)0x6d, (byte)0xfb, (byte)0xed, (byte)0xe8, (byte)0x2d, + (byte)0xeb, (byte)0x9d, (byte)0xcd, (byte)0x9f, (byte)0xae, + (byte)0x0b, (byte)0xfb, (byte)0xb8, (byte)0x21, (byte)0x56, + (byte)0x9b, (byte)0x3d, (byte)0x90, (byte)0x01, (byte)0xbd, + (byte)0x81, (byte)0x30, (byte)0xcd, (byte)0x11, (byte)0xd4, + (byte)0x86, (byte)0xce, (byte)0xf0, (byte)0x47, (byte)0xbd, + (byte)0x60, (byte)0xb8, (byte)0x6e, (byte)0x88}; + + ECPrivateKey alicePrivateKey = Curve.decodePrivatePoint(aliceIdentityPrivate); + ECPublicKey alicePublicKey = Curve.decodePoint(aliceIdentityPublic, 0); + ECPublicKey aliceEphemeral = Curve.decodePoint(aliceEphemeralPublic, 0); + + if (!Curve.verifySignature(alicePublicKey, aliceEphemeral.serialize(), aliceSignature)) { + throw new AssertionError("Sig verification failed!"); + } + + for (int i=0;i