Add crypto_shorthash() for non collision-resistant hash functions
Currently using siphash-2-4
This commit is contained in:
parent
f7e643a75c
commit
c8fe5c4afb
2
.gitignore
vendored
2
.gitignore
vendored
@ -71,8 +71,8 @@ test/secretbox
|
||||
test/secretbox2
|
||||
test/secretbox7
|
||||
test/secretbox8
|
||||
test/shorthash
|
||||
test/stream
|
||||
test/stream2
|
||||
test/stream3
|
||||
test/stream4
|
||||
|
||||
|
@ -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 \
|
||||
|
2
src/libsodium/crypto_shorthash/siphash24/ref/api.h
Normal file
2
src/libsodium/crypto_shorthash/siphash24/ref/api.h
Normal file
@ -0,0 +1,2 @@
|
||||
#define CRYPTO_BYTES 8
|
||||
#define CRYPTO_KEYBYTES 16
|
@ -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
|
@ -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;
|
||||
}
|
||||
|
@ -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 \
|
||||
|
12
src/libsodium/include/sodium/crypto_shorthash.h
Normal file
12
src/libsodium/include/sodium/crypto_shorthash.h
Normal file
@ -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
|
22
src/libsodium/include/sodium/crypto_shorthash_siphash24.h
Normal file
22
src/libsodium/include/sodium/crypto_shorthash_siphash24.h
Normal file
@ -0,0 +1,22 @@
|
||||
#ifndef crypto_shorthash_siphash24_H
|
||||
#define crypto_shorthash_siphash24_H
|
||||
|
||||
#define crypto_shorthash_siphash24_ref_BYTES 8
|
||||
#ifdef __cplusplus
|
||||
#include <string>
|
||||
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
|
@ -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)
|
||||
|
||||
|
17
test/shorthash.c
Normal file
17
test/shorthash.c
Normal file
@ -0,0 +1,17 @@
|
||||
#include <stdio.h>
|
||||
#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;
|
||||
}
|
1
test/shorthash.exp
Normal file
1
test/shorthash.exp
Normal file
@ -0,0 +1 @@
|
||||
4656ce5d9cdde68d
|
Loading…
Reference in New Issue
Block a user