|
|
@ -1,101 +1,106 @@ |
|
|
|
/* |
|
|
|
* BLAKE2 reference source code package - reference C implementations |
|
|
|
* |
|
|
|
* Copyright 2012, Samuel Neves <sneves@dei.uc.pt>. |
|
|
|
* You may use this under the terms of the CC0, the OpenSSL Licence, or the |
|
|
|
* Apache Public License 2.0, at your option. The terms of these licenses can |
|
|
|
* be found at: |
|
|
|
* |
|
|
|
* - OpenSSL license : https://www.openssl.org/source/license.html |
|
|
|
* - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 |
|
|
|
* - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 |
|
|
|
* Copyright 2016 The OpenSSL Project Authors. All Rights Reserved. |
|
|
|
* |
|
|
|
* More information about the BLAKE2 hash function can be found at |
|
|
|
* https://blake2.net. |
|
|
|
* Licensed under the OpenSSL licenses, (the "License"); |
|
|
|
* you may not use this file except in compliance with the License. |
|
|
|
* You may obtain a copy of the License at |
|
|
|
* https://www.openssl.org/source/license.html |
|
|
|
* or in the file LICENSE in the source distribution. |
|
|
|
*/ |
|
|
|
|
|
|
|
/* crypto/blake2/blake2_impl.h */ |
|
|
|
/* |
|
|
|
* Derived from the BLAKE2 reference implementation written by Samuel Neves. |
|
|
|
* More information about the BLAKE2 hash function and its implementations |
|
|
|
* can be found at https://blake2.net. |
|
|
|
*/ |
|
|
|
|
|
|
|
#include <stdint.h> |
|
|
|
#include <string.h> |
|
|
|
#include "e_os.h" |
|
|
|
|
|
|
|
static inline uint32_t load32(const void *src) |
|
|
|
static ossl_inline uint32_t load32(const void *src) |
|
|
|
{ |
|
|
|
#if defined(L_ENDIAN) |
|
|
|
uint32_t w; |
|
|
|
memcpy(&w, src, sizeof(w)); |
|
|
|
return w; |
|
|
|
#else |
|
|
|
const uint8_t *p = (const uint8_t *)src; |
|
|
|
uint32_t w = *p++; |
|
|
|
w |= (uint32_t)(*p++) << 8; |
|
|
|
w |= (uint32_t)(*p++) << 16; |
|
|
|
w |= (uint32_t)(*p++) << 24; |
|
|
|
return w; |
|
|
|
#endif |
|
|
|
const union { |
|
|
|
long one; |
|
|
|
char little; |
|
|
|
} is_endian = { 1 }; |
|
|
|
|
|
|
|
if (is_endian.little) { |
|
|
|
uint32_t w; |
|
|
|
memcpy(&w, src, sizeof(w)); |
|
|
|
return w; |
|
|
|
} else { |
|
|
|
const uint8_t *p = (const uint8_t *)src; |
|
|
|
uint32_t w = *p++; |
|
|
|
w |= (uint32_t)(*p++) << 8; |
|
|
|
w |= (uint32_t)(*p++) << 16; |
|
|
|
w |= (uint32_t)(*p++) << 24; |
|
|
|
return w; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
static inline uint64_t load64(const void *src) |
|
|
|
static ossl_inline uint64_t load64(const void *src) |
|
|
|
{ |
|
|
|
#if defined(L_ENDIAN) |
|
|
|
uint64_t w; |
|
|
|
memcpy(&w, src, sizeof(w)); |
|
|
|
return w; |
|
|
|
#else |
|
|
|
const uint8_t *p = (const uint8_t *)src; |
|
|
|
uint64_t w = *p++; |
|
|
|
w |= (uint64_t)(*p++) << 8; |
|
|
|
w |= (uint64_t)(*p++) << 16; |
|
|
|
w |= (uint64_t)(*p++) << 24; |
|
|
|
w |= (uint64_t)(*p++) << 32; |
|
|
|
w |= (uint64_t)(*p++) << 40; |
|
|
|
w |= (uint64_t)(*p++) << 48; |
|
|
|
w |= (uint64_t)(*p++) << 56; |
|
|
|
return w; |
|
|
|
#endif |
|
|
|
const union { |
|
|
|
long one; |
|
|
|
char little; |
|
|
|
} is_endian = { 1 }; |
|
|
|
|
|
|
|
if (is_endian.little) { |
|
|
|
uint64_t w; |
|
|
|
memcpy(&w, src, sizeof(w)); |
|
|
|
return w; |
|
|
|
} else { |
|
|
|
const uint8_t *p = (const uint8_t *)src; |
|
|
|
uint64_t w = *p++; |
|
|
|
w |= (uint64_t)(*p++) << 8; |
|
|
|
w |= (uint64_t)(*p++) << 16; |
|
|
|
w |= (uint64_t)(*p++) << 24; |
|
|
|
w |= (uint64_t)(*p++) << 32; |
|
|
|
w |= (uint64_t)(*p++) << 40; |
|
|
|
w |= (uint64_t)(*p++) << 48; |
|
|
|
w |= (uint64_t)(*p++) << 56; |
|
|
|
return w; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
static inline void store32(void *dst, uint32_t w) |
|
|
|
static ossl_inline void store32(void *dst, uint32_t w) |
|
|
|
{ |
|
|
|
#if defined(L_ENDIAN) |
|
|
|
memcpy(dst, &w, sizeof(w)); |
|
|
|
#else |
|
|
|
uint8_t *p = (uint8_t *)dst; |
|
|
|
*p++ = (uint8_t)w; |
|
|
|
w >>= 8; |
|
|
|
*p++ = (uint8_t)w; |
|
|
|
w >>= 8; |
|
|
|
*p++ = (uint8_t)w; |
|
|
|
w >>= 8; |
|
|
|
*p++ = (uint8_t)w; |
|
|
|
#endif |
|
|
|
const union { |
|
|
|
long one; |
|
|
|
char little; |
|
|
|
} is_endian = { 1 }; |
|
|
|
|
|
|
|
if (is_endian.little) { |
|
|
|
memcpy(dst, &w, sizeof(w)); |
|
|
|
} else { |
|
|
|
uint8_t *p = (uint8_t *)dst; |
|
|
|
int i; |
|
|
|
|
|
|
|
for (i = 0; i < 4; i++) |
|
|
|
p[i] = (uint8_t)(w >> (8 * i)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
static inline void store64(void *dst, uint64_t w) |
|
|
|
static ossl_inline void store64(void *dst, uint64_t w) |
|
|
|
{ |
|
|
|
#if defined(L_ENDIAN) |
|
|
|
memcpy(dst, &w, sizeof(w)); |
|
|
|
#else |
|
|
|
uint8_t *p = (uint8_t *)dst; |
|
|
|
*p++ = (uint8_t)w; |
|
|
|
w >>= 8; |
|
|
|
*p++ = (uint8_t)w; |
|
|
|
w >>= 8; |
|
|
|
*p++ = (uint8_t)w; |
|
|
|
w >>= 8; |
|
|
|
*p++ = (uint8_t)w; |
|
|
|
w >>= 8; |
|
|
|
*p++ = (uint8_t)w; |
|
|
|
w >>= 8; |
|
|
|
*p++ = (uint8_t)w; |
|
|
|
w >>= 8; |
|
|
|
*p++ = (uint8_t)w; |
|
|
|
w >>= 8; |
|
|
|
*p++ = (uint8_t)w; |
|
|
|
#endif |
|
|
|
const union { |
|
|
|
long one; |
|
|
|
char little; |
|
|
|
} is_endian = { 1 }; |
|
|
|
|
|
|
|
if (is_endian.little) { |
|
|
|
memcpy(dst, &w, sizeof(w)); |
|
|
|
} else { |
|
|
|
uint8_t *p = (uint8_t *)dst; |
|
|
|
int i; |
|
|
|
|
|
|
|
for (i = 0; i < 8; i++) |
|
|
|
p[i] = (uint8_t)(w >> (8 * i)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
static inline uint64_t load48(const void *src) |
|
|
|
static ossl_inline uint64_t load48(const void *src) |
|
|
|
{ |
|
|
|
const uint8_t *p = (const uint8_t *)src; |
|
|
|
uint64_t w = *p++; |
|
|
@ -107,7 +112,7 @@ static inline uint64_t load48(const void *src) |
|
|
|
return w; |
|
|
|
} |
|
|
|
|
|
|
|
static inline void store48(void *dst, uint64_t w) |
|
|
|
static ossl_inline void store48(void *dst, uint64_t w) |
|
|
|
{ |
|
|
|
uint8_t *p = (uint8_t *)dst; |
|
|
|
*p++ = (uint8_t)w; |
|
|
@ -123,22 +128,12 @@ static inline void store48(void *dst, uint64_t w) |
|
|
|
*p++ = (uint8_t)w; |
|
|
|
} |
|
|
|
|
|
|
|
static inline uint32_t rotl32(const uint32_t w, const unsigned c) |
|
|
|
{ |
|
|
|
return (w << c) | (w >> (32 - c)); |
|
|
|
} |
|
|
|
|
|
|
|
static inline uint64_t rotl64(const uint64_t w, const unsigned c) |
|
|
|
{ |
|
|
|
return (w << c) | (w >> (64 - c)); |
|
|
|
} |
|
|
|
|
|
|
|
static inline uint32_t rotr32(const uint32_t w, const unsigned c) |
|
|
|
static ossl_inline uint32_t rotr32(const uint32_t w, const unsigned c) |
|
|
|
{ |
|
|
|
return (w >> c) | (w << (32 - c)); |
|
|
|
} |
|
|
|
|
|
|
|
static inline uint64_t rotr64(const uint64_t w, const unsigned c) |
|
|
|
static ossl_inline uint64_t rotr64(const uint64_t w, const unsigned c) |
|
|
|
{ |
|
|
|
return (w >> c) | (w << (64 - c)); |
|
|
|
} |