1
mirror of https://github.com/jedisct1/libsodium.git synced 2024-12-19 01:55:02 -07:00

Reintroduce shorthash, this time with the key...

This commit is contained in:
Frank Denis 2013-02-13 21:14:29 +08:00
parent e5e2150919
commit 6774b47cd4
11 changed files with 234 additions and 177 deletions

1
.gitignore vendored
View File

@ -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

View File

@ -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 \

View File

@ -0,0 +1,2 @@
#define CRYPTO_BYTES 8
#define CRYPTO_KEYBYTES 16

View 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

View File

@ -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;
}

View File

@ -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 \

View File

@ -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

View File

@ -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 <string>
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

View File

@ -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

23
test/default/shorthash.c Normal file
View File

@ -0,0 +1,23 @@
#include <stdio.h>
#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<MAXLEN;++i) {
in[i]=i;
crypto_shorthash( out, in, i, k );
for (j = 0;j < crypto_shorthash_BYTES;++j) printf("%02x",(unsigned int) out[j]);
printf("\n");
}
return 0;
}

View File

@ -0,0 +1,64 @@
310e0edd47db6f72
fd67dc93c539f874
5a4fa9d909806c0d
2d7efbd796666785
b7877127e09427cf
8da699cd64557618
cee3fe586e46c9cb
37d1018bf50002ab
6224939a79f5f593
b0e4a90bdf82009e
f3b9dd94c5bb5d7a
a7ad6b22462fb3f4
fbe50e86bc8f1e75
903d84c02756ea14
eef27a8e90ca23f7
e545be4961ca29a1
db9bc2577fcc2a3f
9447be2cf5e99a69
9cd38d96f0b3c14b
bd6179a71dc96dbb
98eea21af25cd6be
c7673b2eb0cbf2d0
883ea3e395675393
c8ce5ccd8c030ca8
94af49f6c650adb8
eab8858ade92e1bc
f315bb5bb835d817
adcf6b0763612e2f
a5c91da7acaa4dde
716595876650a2a6
28ef495c53a387ad
42c341d8fa92d832
ce7cf2722f512771
e37859f94623f3a7
381205bb1ab0e012
ae97a10fd434e015
b4a31508beff4d31
81396229f0907902
4d0cf49ee5d4dcca
5c73336a76d8bf9a
d0a704536ba93e0e
925958fcd6420cad
a915c29bc8067318
952b79f3bc0aa6d4
f21df2e41d4535f9
87577519048f53a9
10a56cf5dfcd9adb
eb75095ccd986cd0
51a9cb9ecba312e6
96afadfc2ce666c7
72fe52975a4364ee
5a1645b276d592a1
b274cb8ebf87870a
6f9bb4203de7b381
eaecb2a30b22a87f
9924a43cc1315724
bd838d3aafbf8db7
0b1a2a3265d51aea
135079a3231ce660
932b2846e4d70666
e1915f5cb1eca46c
f325965ca16d629f
575ff28e60381be5
724506eb4c328a95