Reintroduce shorthash, this time with the key...
This commit is contained in:
parent
e5e2150919
commit
6774b47cd4
1
.gitignore
vendored
1
.gitignore
vendored
@ -71,6 +71,7 @@ test/default/secretbox
|
|||||||
test/default/secretbox2
|
test/default/secretbox2
|
||||||
test/default/secretbox7
|
test/default/secretbox7
|
||||||
test/default/secretbox8
|
test/default/secretbox8
|
||||||
|
test/default/shorthash
|
||||||
test/default/stream
|
test/default/stream
|
||||||
test/default/stream2
|
test/default/stream2
|
||||||
test/default/stream3
|
test/default/stream3
|
||||||
|
@ -22,6 +22,8 @@ libsodium_la_SOURCES = \
|
|||||||
crypto_hash/sha256/ref/hash_sha256.c \
|
crypto_hash/sha256/ref/hash_sha256.c \
|
||||||
crypto_hash/sha512/ref/crypto_hash.h \
|
crypto_hash/sha512/ref/crypto_hash.h \
|
||||||
crypto_hash/sha512/ref/hash_sha512.c \
|
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/crypto_verify.h \
|
||||||
crypto_verify/16/ref/verify_16.c \
|
crypto_verify/16/ref/verify_16.c \
|
||||||
crypto_verify/32/ref/crypto_verify.h \
|
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,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;
|
||||||
|
}
|
||||||
|
|
@ -20,6 +20,8 @@ SODIUM_EXPORT = \
|
|||||||
sodium/crypto_scalarmult_curve25519.h \
|
sodium/crypto_scalarmult_curve25519.h \
|
||||||
sodium/crypto_secretbox.h \
|
sodium/crypto_secretbox.h \
|
||||||
sodium/crypto_secretbox_xsalsa20poly1305.h \
|
sodium/crypto_secretbox_xsalsa20poly1305.h \
|
||||||
|
sodium/crypto_shorthash.h \
|
||||||
|
sodium/crypto_shorthash_siphash24.h \
|
||||||
sodium/crypto_sign.h \
|
sodium/crypto_sign.h \
|
||||||
sodium/crypto_sign_ed25519.h \
|
sodium/crypto_sign_ed25519.h \
|
||||||
sodium/crypto_sign_edwards25519sha512batch.h \
|
sodium/crypto_sign_edwards25519sha512batch.h \
|
||||||
|
13
src/libsodium/include/sodium/crypto_shorthash.h
Normal file
13
src/libsodium/include/sodium/crypto_shorthash.h
Normal 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
|
24
src/libsodium/include/sodium/crypto_shorthash_siphash24.h
Normal file
24
src/libsodium/include/sodium/crypto_shorthash_siphash24.h
Normal 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
|
177
test/Makefile.am
177
test/Makefile.am
@ -3,180 +3,3 @@ SUBDIRS = \
|
|||||||
|
|
||||||
EXTRA_DIST = \
|
EXTRA_DIST = \
|
||||||
quirks/windows/windows-quirks.h
|
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
23
test/default/shorthash.c
Normal 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;
|
||||||
|
}
|
64
test/default/shorthash.exp
Normal file
64
test/default/shorthash.exp
Normal 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
|
Loading…
Reference in New Issue
Block a user