diff options
Diffstat (limited to 'crypto/blake2/blake2_impl.h')
-rw-r--r-- | crypto/blake2/blake2_impl.h | 177 |
1 files changed, 86 insertions, 91 deletions
diff --git a/crypto/blake2/blake2_impl.h b/crypto/blake2/blake2_impl.h index 6490e1e155..bd02de9ad2 100644 --- a/crypto/blake2/blake2_impl.h +++ b/crypto/blake2/blake2_impl.h @@ -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)); } |