From c8fe5c4afb9890fea1534ab92935080a1ff58e66 Mon Sep 17 00:00:00 2001 From: Frank Denis Date: Sat, 9 Feb 2013 03:51:20 +0800 Subject: [PATCH] Add crypto_shorthash() for non collision-resistant hash functions Currently using siphash-2-4 --- .gitignore | 2 +- 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 | 12 +++ .../sodium/crypto_shorthash_siphash24.h | 22 +++++ test/Makefile.am | 5 + test/shorthash.c | 17 ++++ test/shorthash.exp | 1 + 11 files changed, 167 insertions(+), 1 deletion(-) 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/shorthash.c create mode 100644 test/shorthash.exp diff --git a/.gitignore b/.gitignore index 8c3eaff9..c8e50864 100644 --- a/.gitignore +++ b/.gitignore @@ -71,8 +71,8 @@ test/secretbox test/secretbox2 test/secretbox7 test/secretbox8 +test/shorthash test/stream test/stream2 test/stream3 test/stream4 - 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..88be22b6 --- /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) +{ + /* "somepseudorandomlygeneratedbytes" */ + u64 v0 = 0x736f6d6570736575ULL; + u64 v1 = 0x646f72616e646f6dULL; + u64 v2 = 0x6c7967656e657261ULL; + u64 v3 = 0x7465646279746573ULL; + u64 b; + u64 k0 = U8TO64_LE( out ); + u64 k1 = U8TO64_LE( out + 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..5604c4de --- /dev/null +++ b/src/libsodium/include/sodium/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/include/sodium/crypto_shorthash_siphash24.h b/src/libsodium/include/sodium/crypto_shorthash_siphash24.h new file mode 100644 index 00000000..e3ad6166 --- /dev/null +++ b/src/libsodium/include/sodium/crypto_shorthash_siphash24.h @@ -0,0 +1,22 @@ +#ifndef crypto_shorthash_siphash24_H +#define crypto_shorthash_siphash24_H + +#define crypto_shorthash_siphash24_ref_BYTES 8 +#ifdef __cplusplus +#include +extern "C" { +#endif +extern int crypto_shorthash_siphash24_ref(unsigned char *,const unsigned char *,unsigned long long); +#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_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 00c0f9ae..45f70ce0 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -30,6 +30,7 @@ EXTRA_DIST = \ secretbox2.exp \ secretbox7.exp \ secretbox8.exp \ + shorthash.exp \ stream.exp \ stream2.exp \ stream3.exp \ @@ -68,6 +69,7 @@ TESTS_TARGETS = \ secretbox2 \ secretbox7 \ secretbox8 \ + shorthash \ stream \ stream2 \ stream3 \ @@ -164,6 +166,9 @@ secretbox7_LDADD = $(TESTS_LDADD) secretbox8_SOURCE = cmptest.h secretbox8.c secretbox8_LDADD = $(TESTS_LDADD) +shorthash_SOURCE = cmptest.h shorthash.c +shorthash_LDADD = $(TESTS_LDADD) + stream_SOURCE = cmptest.h stream.c stream_LDADD = $(TESTS_LDADD) diff --git a/test/shorthash.c b/test/shorthash.c new file mode 100644 index 00000000..37314e26 --- /dev/null +++ b/test/shorthash.c @@ -0,0 +1,17 @@ +#include +#include "crypto_shorthash.h" + +#define TEST_NAME "shorthash" +#include "cmptest.h" + +unsigned char x[8] = "testing\n"; +unsigned char h[crypto_shorthash_BYTES]; + +int main(void) +{ + int i; + crypto_shorthash(h,x,sizeof x); + for (i = 0;i < crypto_shorthash_BYTES;++i) printf("%02x",(unsigned int) h[i]); + printf("\n"); + return 0; +} diff --git a/test/shorthash.exp b/test/shorthash.exp new file mode 100644 index 00000000..78e06089 --- /dev/null +++ b/test/shorthash.exp @@ -0,0 +1 @@ +4656ce5d9cdde68d