1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
|
/*
* 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 License, 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
|