From 6774b47cd45b54a2b87b31a28252fa2ed4d8f66e Mon Sep 17 00:00:00 2001 From: Frank Denis Date: Wed, 13 Feb 2013 21:14:29 +0800 Subject: [PATCH] Reintroduce shorthash, this time with the key... --- .gitignore | 1 + src/libsodium/Makefile.am | 2 + .../crypto_shorthash/siphash24/ref/api.h | 2 + .../siphash24/ref/crypto_shorthash.h | 12 ++ .../siphash24/ref/shorthash_siphash24.c | 91 +++++++++ src/libsodium/include/Makefile.am | 2 + .../include/sodium/crypto_shorthash.h | 13 ++ .../sodium/crypto_shorthash_siphash24.h | 24 +++ test/Makefile.am | 177 ------------------ test/default/shorthash.c | 23 +++ test/default/shorthash.exp | 64 +++++++ 11 files changed, 234 insertions(+), 177 deletions(-) create mode 100644 src/libsodium/crypto_shorthash/siphash24/ref/api.h create mode 100644 src/libsodium/crypto_shorthash/siphash24/ref/crypto_shorthash.h create mode 100644 src/libsodium/crypto_shorthash/siphash24/ref/shorthash_siphash24.c create mode 100644 src/libsodium/include/sodium/crypto_shorthash.h create mode 100644 src/libsodium/include/sodium/crypto_shorthash_siphash24.h create mode 100644 test/default/shorthash.c create mode 100644 test/default/shorthash.exp diff --git a/.gitignore b/.gitignore index 9d39d81c..3d52af52 100644 --- a/.gitignore +++ b/.gitignore @@ -71,6 +71,7 @@ test/default/secretbox test/default/secretbox2 test/default/secretbox7 test/default/secretbox8 +test/default/shorthash test/default/stream test/default/stream2 test/default/stream3 diff --git a/src/libsodium/Makefile.am b/src/libsodium/Makefile.am index 2ced073e..2a87f149 100644 --- a/src/libsodium/Makefile.am +++ b/src/libsodium/Makefile.am @@ -22,6 +22,8 @@ libsodium_la_SOURCES = \ crypto_hash/sha256/ref/hash_sha256.c \ crypto_hash/sha512/ref/crypto_hash.h \ crypto_hash/sha512/ref/hash_sha512.c \ + crypto_shorthash/siphash24/ref/crypto_shorthash.h \ + crypto_shorthash/siphash24/ref/shorthash_siphash24.c \ crypto_verify/16/ref/crypto_verify.h \ crypto_verify/16/ref/verify_16.c \ crypto_verify/32/ref/crypto_verify.h \ diff --git a/src/libsodium/crypto_shorthash/siphash24/ref/api.h b/src/libsodium/crypto_shorthash/siphash24/ref/api.h new file mode 100644 index 00000000..b7c80611 --- /dev/null +++ b/src/libsodium/crypto_shorthash/siphash24/ref/api.h @@ -0,0 +1,2 @@ +#define CRYPTO_BYTES 8 +#define CRYPTO_KEYBYTES 16 diff --git a/src/libsodium/crypto_shorthash/siphash24/ref/crypto_shorthash.h b/src/libsodium/crypto_shorthash/siphash24/ref/crypto_shorthash.h new file mode 100644 index 00000000..5604c4de --- /dev/null +++ b/src/libsodium/crypto_shorthash/siphash24/ref/crypto_shorthash.h @@ -0,0 +1,12 @@ +#ifndef crypto_shorthash_H +#define crypto_shorthash_H + +#include "crypto_shorthash_siphash24.h" + +#define crypto_shorthash crypto_shorthash_siphash24 +#define crypto_shorthash_BYTES crypto_shorthash_siphash24_BYTES +#define crypto_shorthash_PRIMITIVE "siphash24" +#define crypto_shorthash_IMPLEMENTATION crypto_shorthash_siphash24_IMPLEMENTATION +#define crypto_shorthash_VERSION crypto_shorthash_siphash24_VERSION + +#endif diff --git a/src/libsodium/crypto_shorthash/siphash24/ref/shorthash_siphash24.c b/src/libsodium/crypto_shorthash/siphash24/ref/shorthash_siphash24.c new file mode 100644 index 00000000..e06ea5e5 --- /dev/null +++ b/src/libsodium/crypto_shorthash/siphash24/ref/shorthash_siphash24.c @@ -0,0 +1,91 @@ +#include "crypto_shorthash.h" +#include "crypto_uint64.h" +#include "crypto_uint32.h" +#include "crypto_uint8.h" + +typedef crypto_uint64 u64; +typedef crypto_uint32 u32; +typedef crypto_uint8 u8; + +#define ROTL(x,b) (u64)( ((x) << (b)) | ( (x) >> (64 - (b))) ) + +#define U32TO8_LE(p, v) \ + (p)[0] = (u8)((v) ); (p)[1] = (u8)((v) >> 8); \ + (p)[2] = (u8)((v) >> 16); (p)[3] = (u8)((v) >> 24); + +#define U64TO8_LE(p, v) \ + U32TO8_LE((p), (u32)((v) )); \ + U32TO8_LE((p) + 4, (u32)((v) >> 32)); + +#define U8TO64_LE(p) \ + (((u64)((p)[0]) ) | \ + ((u64)((p)[1]) << 8) | \ + ((u64)((p)[2]) << 16) | \ + ((u64)((p)[3]) << 24) | \ + ((u64)((p)[4]) << 32) | \ + ((u64)((p)[5]) << 40) | \ + ((u64)((p)[6]) << 48) | \ + ((u64)((p)[7]) << 56)) + +#define SIPROUND \ + do { \ + v0 += v1; v1=ROTL(v1,13); v1 ^= v0; v0=ROTL(v0,32); \ + v2 += v3; v3=ROTL(v3,16); v3 ^= v2; \ + v0 += v3; v3=ROTL(v3,21); v3 ^= v0; \ + v2 += v1; v1=ROTL(v1,17); v1 ^= v2; v2=ROTL(v2,32); \ + } while(0) + +int crypto_shorthash(unsigned char *out,const unsigned char *in,unsigned long long inlen,const unsigned char *k) +{ + /* "somepseudorandomlygeneratedbytes" */ + u64 v0 = 0x736f6d6570736575ULL; + u64 v1 = 0x646f72616e646f6dULL; + u64 v2 = 0x6c7967656e657261ULL; + u64 v3 = 0x7465646279746573ULL; + u64 b; + u64 k0 = U8TO64_LE( k ); + u64 k1 = U8TO64_LE( k + 8 ); + u64 m; + const u8 *end = in + inlen - ( inlen % sizeof( u64 ) ); + const int left = inlen & 7; + b = ( ( u64 )inlen ) << 56; + v3 ^= k1; + v2 ^= k0; + v1 ^= k1; + v0 ^= k0; + + for ( ; in != end; in += 8 ) + { + m = U8TO64_LE( in ); + v3 ^= m; + SIPROUND; + SIPROUND; + v0 ^= m; + } + + switch( left ) + { + case 7: b |= ( ( u64 )in[ 6] ) << 48; + case 6: b |= ( ( u64 )in[ 5] ) << 40; + case 5: b |= ( ( u64 )in[ 4] ) << 32; + case 4: b |= ( ( u64 )in[ 3] ) << 24; + case 3: b |= ( ( u64 )in[ 2] ) << 16; + case 2: b |= ( ( u64 )in[ 1] ) << 8; + case 1: b |= ( ( u64 )in[ 0] ); break; + case 0: break; + } + + v3 ^= b; + SIPROUND; + SIPROUND; + v0 ^= b; + v2 ^= 0xff; + SIPROUND; + SIPROUND; + SIPROUND; + SIPROUND; + b = v0 ^ v1 ^ v2 ^ v3; + U64TO8_LE( out, b ); + return 0; +} + diff --git a/src/libsodium/include/Makefile.am b/src/libsodium/include/Makefile.am index 12a92d35..d1b0b2e3 100644 --- a/src/libsodium/include/Makefile.am +++ b/src/libsodium/include/Makefile.am @@ -20,6 +20,8 @@ SODIUM_EXPORT = \ sodium/crypto_scalarmult_curve25519.h \ sodium/crypto_secretbox.h \ sodium/crypto_secretbox_xsalsa20poly1305.h \ + sodium/crypto_shorthash.h \ + sodium/crypto_shorthash_siphash24.h \ sodium/crypto_sign.h \ sodium/crypto_sign_ed25519.h \ sodium/crypto_sign_edwards25519sha512batch.h \ diff --git a/src/libsodium/include/sodium/crypto_shorthash.h b/src/libsodium/include/sodium/crypto_shorthash.h new file mode 100644 index 00000000..885b6f0a --- /dev/null +++ b/src/libsodium/include/sodium/crypto_shorthash.h @@ -0,0 +1,13 @@ +#ifndef crypto_shorthash_H +#define crypto_shorthash_H + +#include "crypto_shorthash_siphash24.h" + +#define crypto_shorthash crypto_shorthash_siphash24 +#define crypto_shorthash_BYTES crypto_shorthash_siphash24_BYTES +#define crypto_shorthash_KEYBYTES crypto_shorthash_siphash24_KEYBYTES +#define crypto_shorthash_PRIMITIVE "siphash24" +#define crypto_shorthash_IMPLEMENTATION crypto_shorthash_siphash24_IMPLEMENTATION +#define crypto_shorthash_VERSION crypto_shorthash_siphash24_VERSION + +#endif diff --git a/src/libsodium/include/sodium/crypto_shorthash_siphash24.h b/src/libsodium/include/sodium/crypto_shorthash_siphash24.h new file mode 100644 index 00000000..cf19f0b9 --- /dev/null +++ b/src/libsodium/include/sodium/crypto_shorthash_siphash24.h @@ -0,0 +1,24 @@ +#ifndef crypto_shorthash_siphash24_H +#define crypto_shorthash_siphash24_H + +#define crypto_shorthash_siphash24_ref_BYTES 8 +#define crypto_shorthash_siphash24_ref_KEYBYTES 16 +#ifdef __cplusplus +#include +extern "C" { +#endif +extern int crypto_shorthash_siphash24_ref(unsigned char *,const unsigned char *,unsigned long long,const unsigned char *); +#ifdef __cplusplus +} +#endif + +#define crypto_shorthash_siphash24 crypto_shorthash_siphash24_ref +#define crypto_shorthash_siphash24_BYTES crypto_shorthash_siphash24_ref_BYTES +#define crypto_shorthash_siphash24_KEYBYTES crypto_shorthash_siphash24_ref_KEYBYTES +#define crypto_shorthash_siphash24_IMPLEMENTATION +#ifndef crypto_shorthash_siphash24_ref_VERSION +#define crypto_shorthash_siphash24_ref_VERSION "-" +#endif +#define crypto_shorthash_siphash24_VERSION crypto_shorthash_siphash24_ref_VERSION + +#endif diff --git a/test/Makefile.am b/test/Makefile.am index 2a78006a..346d2692 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -3,180 +3,3 @@ SUBDIRS = \ EXTRA_DIST = \ quirks/windows/windows-quirks.h - cmptest.h \ - auth.exp \ - auth2.exp \ - auth3.exp \ - auth5.exp \ - box.exp \ - box2.exp \ - box7.exp \ - box8.exp \ - core1.exp \ - core2.exp \ - core3.exp \ - core4.exp \ - core5.exp \ - core6.exp \ - hash.exp \ - hash2.exp \ - hash3.exp \ - onetimeauth.exp \ - onetimeauth2.exp \ - onetimeauth7.exp \ - scalarmult.exp \ - scalarmult2.exp \ - scalarmult5.exp \ - scalarmult6.exp \ - secretbox.exp \ - secretbox2.exp \ - secretbox7.exp \ - secretbox8.exp \ - stream.exp \ - stream2.exp \ - stream3.exp \ - stream4.exp - -AM_CPPFLAGS = \ - -I$(top_srcdir)/src/libsodium/include \ - -I$(top_srcdir)/src/libsodium/include/sodium - -TESTS_TARGETS = \ - auth \ - auth2 \ - auth3 \ - auth5 \ - box \ - box2 \ - box7 \ - box8 \ - core1 \ - core2 \ - core3 \ - core4 \ - core5 \ - core6 \ - hash \ - hash3 \ - onetimeauth \ - onetimeauth2 \ - onetimeauth7 \ - randombytes \ - scalarmult \ - scalarmult2 \ - scalarmult5 \ - scalarmult6 \ - secretbox \ - secretbox2 \ - secretbox7 \ - secretbox8 \ - stream \ - stream2 \ - stream3 \ - stream4 - -check_PROGRAMS = $(TESTS_TARGETS) - -TESTS = $(TESTS_TARGETS) - -TESTS_LDADD = \ - ${top_builddir}/src/libsodium/libsodium.la - -auth_SOURCE = cmptest.h auth.c -auth_LDADD = $(TESTS_LDADD) - -auth2_SOURCE = cmptest.h auth2.c -auth2_LDADD = $(TESTS_LDADD) - -auth3_SOURCE = cmptest.h auth3.c -auth3_LDADD = $(TESTS_LDADD) - -auth5_SOURCE = cmptest.h auth5.c windows/windows-quirks.h -auth5_LDADD = $(TESTS_LDADD) - -box_SOURCE = cmptest.h box.c -box_LDADD = $(TESTS_LDADD) - -box2_SOURCE = cmptest.h box2.c -box2_LDADD = $(TESTS_LDADD) - -box7_SOURCE = cmptest.h box7.c -box7_LDADD = $(TESTS_LDADD) - -box8_SOURCE = cmptest.h box8.c -box8_LDADD = $(TESTS_LDADD) - -core1_SOURCE = cmptest.h core1.c -core1_LDADD = $(TESTS_LDADD) - -core2_SOURCE = cmptest.h core2.c -core2_LDADD = $(TESTS_LDADD) - -core3_SOURCE = cmptest.h core3.c -core3_LDADD = $(TESTS_LDADD) - -core4_SOURCE = cmptest.h core4.c -core4_LDADD = $(TESTS_LDADD) - -core5_SOURCE = cmptest.h core5.c -core5_LDADD = $(TESTS_LDADD) - -core6_SOURCE = cmptest.h core6.c -core6_LDADD = $(TESTS_LDADD) - -hash_SOURCE = cmptest.h hash.c -hash_LDADD = $(TESTS_LDADD) - -hash3_SOURCE = cmptest.h hash3.c -hash3_LDADD = $(TESTS_LDADD) - -onetimeauth_SOURCE = cmptest.h onetimeauth.c -onetimeauth_LDADD = $(TESTS_LDADD) - -onetimeauth2_SOURCE = cmptest.h onetimeauth2.c -onetimeauth2_LDADD = $(TESTS_LDADD) - -onetimeauth7_SOURCE = cmptest.h onetimeauth7.c -onetimeauth7_LDADD = $(TESTS_LDADD) - -randombytes_SOURCE = randombytes.c -randombytes_LDADD = $(TESTS_LDADD) - -scalarmult_SOURCE = cmptest.h scalarmult.c -scalarmult_LDADD = $(TESTS_LDADD) - -scalarmult2_SOURCE = cmptest.h scalarmult2.c -scalarmult2_LDADD = $(TESTS_LDADD) - -scalarmult5_SOURCE = cmptest.h scalarmult5.c -scalarmult5_LDADD = $(TESTS_LDADD) - -scalarmult6_SOURCE = cmptest.h scalarmult6.c -scalarmult6_LDADD = $(TESTS_LDADD) - -secretbox_SOURCE = cmptest.h secretbox.c -secretbox_LDADD = $(TESTS_LDADD) - -secretbox2_SOURCE = cmptest.h secretbox2.c -secretbox2_LDADD = $(TESTS_LDADD) - -secretbox7_SOURCE = cmptest.h secretbox7.c -secretbox7_LDADD = $(TESTS_LDADD) - -secretbox8_SOURCE = cmptest.h secretbox8.c -secretbox8_LDADD = $(TESTS_LDADD) - -stream_SOURCE = cmptest.h stream.c -stream_LDADD = $(TESTS_LDADD) - -stream2_SOURCE = cmptest.h stream2.c -stream2_LDADD = $(TESTS_LDADD) - -stream3_SOURCE = cmptest.h stream3.c -stream3_LDADD = $(TESTS_LDADD) - -stream4_SOURCE = cmptest.h stream4.c -stream4_LDADD = $(TESTS_LDADD) - -verify: check - diff --git a/test/default/shorthash.c b/test/default/shorthash.c new file mode 100644 index 00000000..b939535d --- /dev/null +++ b/test/default/shorthash.c @@ -0,0 +1,23 @@ +#include +#include "crypto_uint8.h" +#include "crypto_shorthash.h" + +#define TEST_NAME "shorthash" +#include "cmptest.h" + +int main(void) +{ +#define MAXLEN 64 + crypto_uint8 in[MAXLEN], out[crypto_shorthash_BYTES], k[crypto_shorthash_KEYBYTES]; + int i,j; + + for( i = 0; i < crypto_shorthash_KEYBYTES; ++i ) k[i] = i; + + for(i=0;i