APU_DECLARE(void) apr_siphash48_auth(unsigned char out[APR_SIPHASH_DSIZE], const void *src, apr_size_t len, const unsigned char key[APR_SIPHASH_KSIZE]) { apr_uint64_t h; h = apr_siphash48(src, len, key); U64TO8_LE(out, h); }
int crypto_shorthash(unsigned char *out,const unsigned char *in,uint64_t 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; }
static void scrypt_hash_finish(scrypt_hash_state *S, uint8_t *hash) { size_t i; S->buffer[S->leftover] = 0x01; memset(S->buffer + (S->leftover + 1), 0, SCRYPT_HASH_BLOCK_SIZE - (S->leftover + 1)); S->buffer[SCRYPT_HASH_BLOCK_SIZE - 1] |= 0x80; keccak_block(S, S->buffer); for (i = 0; i < SCRYPT_HASH_DIGEST_SIZE; i += 8) { U64TO8_LE(&hash[i], S->state[i / 8]); } }
static int siphash(const uint8_t *in, const size_t inlen, const uint8_t *k, uint8_t *out, const size_t outlen) { assert((outlen == 8) || (outlen == 16)); uint64_t v0 = 0x736f6d6570736575ULL; uint64_t v1 = 0x646f72616e646f6dULL; uint64_t v2 = 0x6c7967656e657261ULL; uint64_t v3 = 0x7465646279746573ULL; uint64_t k0 = U8TO64_LE(k); uint64_t k1 = U8TO64_LE(k + 8); uint64_t m; int i; const uint8_t *end = in + inlen - (inlen % sizeof(uint64_t)); const int left = inlen & 7; uint64_t b = ((uint64_t)inlen) << 56; v3 ^= k1; v2 ^= k0; v1 ^= k1; v0 ^= k0; if (outlen == 16) v1 ^= 0xee; for (; in != end; in += 8) { m = U8TO64_LE(in); v3 ^= m; TRACE; for (i = 0; i < cROUNDS; ++i) SIPROUND; v0 ^= m; } switch (left) { case 7: b |= ((uint64_t)in[6]) << 48; case 6: b |= ((uint64_t)in[5]) << 40; case 5: b |= ((uint64_t)in[4]) << 32; case 4: b |= ((uint64_t)in[3]) << 24; case 3: b |= ((uint64_t)in[2]) << 16; case 2: b |= ((uint64_t)in[1]) << 8; case 1: b |= ((uint64_t)in[0]); break; case 0: break; } v3 ^= b; TRACE; for (i = 0; i < cROUNDS; ++i) SIPROUND; v0 ^= b; if (outlen == 16) v2 ^= 0xee; else v2 ^= 0xff; TRACE; for (i = 0; i < dROUNDS; ++i) SIPROUND; b = v0 ^ v1 ^ v2 ^ v3; U64TO8_LE(out, b); if (outlen == 8) return 0; v1 ^= 0xdd; TRACE; for (i = 0; i < dROUNDS; ++i) SIPROUND; b = v0 ^ v1 ^ v2 ^ v3; U64TO8_LE(out + 8, b); return 0; }
int siphash( uint8_t *out, const uint8_t *in, uint64_t inlen, const uint8_t *k ) { /* "somepseudorandomlygeneratedbytes" */ uint64_t v0 = 0x736f6d6570736575ULL; uint64_t v1 = 0x646f72616e646f6dULL; uint64_t v2 = 0x6c7967656e657261ULL; uint64_t v3 = 0x7465646279746573ULL; uint64_t b; uint64_t k0 = U8TO64_LE( k ); uint64_t k1 = U8TO64_LE( k + 8 ); uint64_t m; int i; const uint8_t *end = in + inlen - ( inlen % sizeof( uint64_t ) ); const int left = inlen & 7; b = ( ( uint64_t )inlen ) << 56; v3 ^= k1; v2 ^= k0; v1 ^= k1; v0 ^= k0; #ifdef DOUBLE v1 ^= 0xee; #endif for ( ; in != end; in += 8 ) { m = U8TO64_LE( in ); v3 ^= m; TRACE; for( i=0; i<cROUNDS; ++i ) SIPROUND; v0 ^= m; } switch( left ) { case 7: b |= ( ( uint64_t )in[ 6] ) << 48; case 6: b |= ( ( uint64_t )in[ 5] ) << 40; case 5: b |= ( ( uint64_t )in[ 4] ) << 32; case 4: b |= ( ( uint64_t )in[ 3] ) << 24; case 3: b |= ( ( uint64_t )in[ 2] ) << 16; case 2: b |= ( ( uint64_t )in[ 1] ) << 8; case 1: b |= ( ( uint64_t )in[ 0] ); break; case 0: break; } v3 ^= b; TRACE; for( i=0; i<cROUNDS; ++i ) SIPROUND; v0 ^= b; #ifndef DOUBLE v2 ^= 0xff; #else v2 ^= 0xee; #endif TRACE; for( i=0; i<dROUNDS; ++i ) SIPROUND; b = v0 ^ v1 ^ v2 ^ v3; U64TO8_LE( out, b ); #ifdef DOUBLE v1 ^= 0xdd; TRACE; for( i=0; i<dROUNDS; ++i ) SIPROUND; b = v0 ^ v1 ^ v2 ^ v3; U64TO8_LE( out+8, b ); #endif return 0; }