bird/lib/blake2-impl.h

154 lines
3.3 KiB
C

/*
* BIRD Library -- BLAKE2 Support Code
*
* Based on the code from BLAKE2 reference source code package
*
* 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:
*
* - CC0 1.0 Universal : https://creativecommons.org/publicdomain/zero/1.0
* - OpenSSL license : https://www.openssl.org/source/license.html
* - Apache 2.0 : https://www.apache.org/licenses/LICENSE-2.0
*
* More information about the BLAKE2 hash function can be found at
* https://blake2.net/ web.
*/
#ifndef _BIRD_BLAKE2_IMPL_H_
#define _BIRD_BLAKE2_IMPL_H_
#include "nest/bird.h"
static inline u32 load32(const void *src)
{
#if !defined(CPU_BIG_ENDIAN)
u32 w;
memcpy(&w, src, sizeof w);
return w;
#else
const u8 *p = (const u8 *) src;
return ((u32) (p[0]) << 0) |
((u32) (p[1]) << 8) |
((u32) (p[2]) << 16) |
((u32) (p[3]) << 24) ;
#endif
}
static inline u64 load64(const void *src)
{
#if !defined(CPU_BIG_ENDIAN)
u64 w;
memcpy(&w, src, sizeof w);
return w;
#else
const u8 *p = (const u8 *) src;
return ((u64) (p[0]) << 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) ;
#endif
}
static inline u16 load16(const void *src)
{
#if !defined(CPU_BIG_ENDIAN)
u16 w;
memcpy(&w, src, sizeof w);
return w;
#else
const u8 *p = (const u8 *) src;
return (u16) (((u32) (p[0]) << 0) |
((u32) (p[1]) << 8));
#endif
}
static inline void store16(void *dst, u16 w)
{
#if !defined(CPU_BIG_ENDIAN)
memcpy(dst, &w, sizeof w);
#else
u8 *p = (u8 *) dst;
*p++ = (u8)w; w >>= 8;
*p++ = (u8)w;
#endif
}
static inline void store32(void *dst, u32 w)
{
#if !defined(CPU_BIG_ENDIAN)
memcpy(dst, &w, sizeof w);
#else
u8 *p = (u8 *)dst;
p[0] = (u8) (w >> 0);
p[1] = (u8) (w >> 8);
p[2] = (u8) (w >> 16);
p[3] = (u8) (w >> 24);
#endif
}
static inline void store64(void *dst, u64 w)
{
#if !defined(CPU_BIG_ENDIAN)
memcpy(dst, &w, sizeof w);
#else
u8 *p = (u8 *) dst;
p[0] = (u8) (w >> 0);
p[1] = (u8) (w >> 8);
p[2] = (u8) (w >> 16);
p[3] = (u8) (w >> 24);
p[4] = (u8) (w >> 32);
p[5] = (u8) (w >> 40);
p[6] = (u8) (w >> 48);
p[7] = (u8) (w >> 56);
#endif
}
static inline u64 load48(const void *src)
{
const u8 *p = (const u8 *) src;
return ((u64) (p[0]) << 0) |
((u64) (p[1]) << 8) |
((u64) (p[2]) << 16) |
((u64) (p[3]) << 24) |
((u64) (p[4]) << 32) |
((u64) (p[5]) << 40) ;
}
static inline void store48(void *dst, u64 w)
{
u8 *p = (u8 *) dst;
p[0] = (u8) (w >> 0);
p[1] = (u8) (w >> 8);
p[2] = (u8) (w >> 16);
p[3] = (u8) (w >> 24);
p[4] = (u8) (w >> 32);
p[5] = (u8) (w >> 40);
}
static inline u32 rotr32(const u32 w, const uint c)
{
return (w >> c) | (w << (32 - c));
}
static inline u64 rotr64(const u64 w, const uint c)
{
return (w >> c) | (w << (64 - c));
}
/* prevents compiler optimizing out memset() */
static inline void secure_zero_memory(void *v, size_t n)
{
static void *(*const volatile memset_v)(void *, int, size_t) = &memset;
memset_v(v, 0, n);
}
#endif