xref: /netbsd-src/external/apache2/argon2/dist/phc-winner-argon2/src/blake2/blake2-impl.h (revision 0090dad1538a6131df82f874b870c800d894ee40)
1*0090dad1Sjhigh /*
2*0090dad1Sjhigh  * Argon2 reference source code package - reference C implementations
3*0090dad1Sjhigh  *
4*0090dad1Sjhigh  * Copyright 2015
5*0090dad1Sjhigh  * Daniel Dinu, Dmitry Khovratovich, Jean-Philippe Aumasson, and Samuel Neves
6*0090dad1Sjhigh  *
7*0090dad1Sjhigh  * You may use this work under the terms of a Creative Commons CC0 1.0
8*0090dad1Sjhigh  * License/Waiver or the Apache Public License 2.0, at your option. The terms of
9*0090dad1Sjhigh  * these licenses can be found at:
10*0090dad1Sjhigh  *
11*0090dad1Sjhigh  * - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0
12*0090dad1Sjhigh  * - Apache 2.0        : http://www.apache.org/licenses/LICENSE-2.0
13*0090dad1Sjhigh  *
14*0090dad1Sjhigh  * You should have received a copy of both of these licenses along with this
15*0090dad1Sjhigh  * software. If not, they may be obtained at the above URLs.
16*0090dad1Sjhigh  */
17*0090dad1Sjhigh 
18*0090dad1Sjhigh #ifndef PORTABLE_BLAKE2_IMPL_H
19*0090dad1Sjhigh #define PORTABLE_BLAKE2_IMPL_H
20*0090dad1Sjhigh 
21*0090dad1Sjhigh #include <stdint.h>
22*0090dad1Sjhigh #include <string.h>
23*0090dad1Sjhigh 
24*0090dad1Sjhigh #if defined(_MSC_VER)
25*0090dad1Sjhigh #define BLAKE2_INLINE __inline
26*0090dad1Sjhigh #elif defined(__GNUC__) || defined(__clang__)
27*0090dad1Sjhigh #define BLAKE2_INLINE __inline__
28*0090dad1Sjhigh #else
29*0090dad1Sjhigh #define BLAKE2_INLINE
30*0090dad1Sjhigh #endif
31*0090dad1Sjhigh 
32*0090dad1Sjhigh /* Argon2 Team - Begin Code */
33*0090dad1Sjhigh /*
34*0090dad1Sjhigh    Not an exhaustive list, but should cover the majority of modern platforms
35*0090dad1Sjhigh    Additionally, the code will always be correct---this is only a performance
36*0090dad1Sjhigh    tweak.
37*0090dad1Sjhigh */
38*0090dad1Sjhigh #if (defined(__BYTE_ORDER__) &&                                                \
39*0090dad1Sjhigh      (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)) ||                           \
40*0090dad1Sjhigh     defined(__LITTLE_ENDIAN__) || defined(__ARMEL__) || defined(__MIPSEL__) || \
41*0090dad1Sjhigh     defined(__AARCH64EL__) || defined(__amd64__) || defined(__i386__) ||       \
42*0090dad1Sjhigh     defined(_M_IX86) || defined(_M_X64) || defined(_M_AMD64) ||                \
43*0090dad1Sjhigh     defined(_M_ARM)
44*0090dad1Sjhigh #define NATIVE_LITTLE_ENDIAN
45*0090dad1Sjhigh #endif
46*0090dad1Sjhigh /* Argon2 Team - End Code */
47*0090dad1Sjhigh 
load32(const void * src)48*0090dad1Sjhigh static BLAKE2_INLINE uint32_t load32(const void *src) {
49*0090dad1Sjhigh #if defined(NATIVE_LITTLE_ENDIAN)
50*0090dad1Sjhigh     uint32_t w;
51*0090dad1Sjhigh     memcpy(&w, src, sizeof w);
52*0090dad1Sjhigh     return w;
53*0090dad1Sjhigh #else
54*0090dad1Sjhigh     const uint8_t *p = (const uint8_t *)src;
55*0090dad1Sjhigh     uint32_t w = *p++;
56*0090dad1Sjhigh     w |= (uint32_t)(*p++) << 8;
57*0090dad1Sjhigh     w |= (uint32_t)(*p++) << 16;
58*0090dad1Sjhigh     w |= (uint32_t)(*p++) << 24;
59*0090dad1Sjhigh     return w;
60*0090dad1Sjhigh #endif
61*0090dad1Sjhigh }
62*0090dad1Sjhigh 
load64(const void * src)63*0090dad1Sjhigh static BLAKE2_INLINE uint64_t load64(const void *src) {
64*0090dad1Sjhigh #if defined(NATIVE_LITTLE_ENDIAN)
65*0090dad1Sjhigh     uint64_t w;
66*0090dad1Sjhigh     memcpy(&w, src, sizeof w);
67*0090dad1Sjhigh     return w;
68*0090dad1Sjhigh #else
69*0090dad1Sjhigh     const uint8_t *p = (const uint8_t *)src;
70*0090dad1Sjhigh     uint64_t w = *p++;
71*0090dad1Sjhigh     w |= (uint64_t)(*p++) << 8;
72*0090dad1Sjhigh     w |= (uint64_t)(*p++) << 16;
73*0090dad1Sjhigh     w |= (uint64_t)(*p++) << 24;
74*0090dad1Sjhigh     w |= (uint64_t)(*p++) << 32;
75*0090dad1Sjhigh     w |= (uint64_t)(*p++) << 40;
76*0090dad1Sjhigh     w |= (uint64_t)(*p++) << 48;
77*0090dad1Sjhigh     w |= (uint64_t)(*p++) << 56;
78*0090dad1Sjhigh     return w;
79*0090dad1Sjhigh #endif
80*0090dad1Sjhigh }
81*0090dad1Sjhigh 
store32(void * dst,uint32_t w)82*0090dad1Sjhigh static BLAKE2_INLINE void store32(void *dst, uint32_t w) {
83*0090dad1Sjhigh #if defined(NATIVE_LITTLE_ENDIAN)
84*0090dad1Sjhigh     memcpy(dst, &w, sizeof w);
85*0090dad1Sjhigh #else
86*0090dad1Sjhigh     uint8_t *p = (uint8_t *)dst;
87*0090dad1Sjhigh     *p++ = (uint8_t)w;
88*0090dad1Sjhigh     w >>= 8;
89*0090dad1Sjhigh     *p++ = (uint8_t)w;
90*0090dad1Sjhigh     w >>= 8;
91*0090dad1Sjhigh     *p++ = (uint8_t)w;
92*0090dad1Sjhigh     w >>= 8;
93*0090dad1Sjhigh     *p++ = (uint8_t)w;
94*0090dad1Sjhigh #endif
95*0090dad1Sjhigh }
96*0090dad1Sjhigh 
store64(void * dst,uint64_t w)97*0090dad1Sjhigh static BLAKE2_INLINE void store64(void *dst, uint64_t w) {
98*0090dad1Sjhigh #if defined(NATIVE_LITTLE_ENDIAN)
99*0090dad1Sjhigh     memcpy(dst, &w, sizeof w);
100*0090dad1Sjhigh #else
101*0090dad1Sjhigh     uint8_t *p = (uint8_t *)dst;
102*0090dad1Sjhigh     *p++ = (uint8_t)w;
103*0090dad1Sjhigh     w >>= 8;
104*0090dad1Sjhigh     *p++ = (uint8_t)w;
105*0090dad1Sjhigh     w >>= 8;
106*0090dad1Sjhigh     *p++ = (uint8_t)w;
107*0090dad1Sjhigh     w >>= 8;
108*0090dad1Sjhigh     *p++ = (uint8_t)w;
109*0090dad1Sjhigh     w >>= 8;
110*0090dad1Sjhigh     *p++ = (uint8_t)w;
111*0090dad1Sjhigh     w >>= 8;
112*0090dad1Sjhigh     *p++ = (uint8_t)w;
113*0090dad1Sjhigh     w >>= 8;
114*0090dad1Sjhigh     *p++ = (uint8_t)w;
115*0090dad1Sjhigh     w >>= 8;
116*0090dad1Sjhigh     *p++ = (uint8_t)w;
117*0090dad1Sjhigh #endif
118*0090dad1Sjhigh }
119*0090dad1Sjhigh 
load48(const void * src)120*0090dad1Sjhigh static BLAKE2_INLINE uint64_t load48(const void *src) {
121*0090dad1Sjhigh     const uint8_t *p = (const uint8_t *)src;
122*0090dad1Sjhigh     uint64_t w = *p++;
123*0090dad1Sjhigh     w |= (uint64_t)(*p++) << 8;
124*0090dad1Sjhigh     w |= (uint64_t)(*p++) << 16;
125*0090dad1Sjhigh     w |= (uint64_t)(*p++) << 24;
126*0090dad1Sjhigh     w |= (uint64_t)(*p++) << 32;
127*0090dad1Sjhigh     w |= (uint64_t)(*p++) << 40;
128*0090dad1Sjhigh     return w;
129*0090dad1Sjhigh }
130*0090dad1Sjhigh 
store48(void * dst,uint64_t w)131*0090dad1Sjhigh static BLAKE2_INLINE void store48(void *dst, uint64_t w) {
132*0090dad1Sjhigh     uint8_t *p = (uint8_t *)dst;
133*0090dad1Sjhigh     *p++ = (uint8_t)w;
134*0090dad1Sjhigh     w >>= 8;
135*0090dad1Sjhigh     *p++ = (uint8_t)w;
136*0090dad1Sjhigh     w >>= 8;
137*0090dad1Sjhigh     *p++ = (uint8_t)w;
138*0090dad1Sjhigh     w >>= 8;
139*0090dad1Sjhigh     *p++ = (uint8_t)w;
140*0090dad1Sjhigh     w >>= 8;
141*0090dad1Sjhigh     *p++ = (uint8_t)w;
142*0090dad1Sjhigh     w >>= 8;
143*0090dad1Sjhigh     *p++ = (uint8_t)w;
144*0090dad1Sjhigh }
145*0090dad1Sjhigh 
rotr32(const uint32_t w,const unsigned c)146*0090dad1Sjhigh static BLAKE2_INLINE uint32_t rotr32(const uint32_t w, const unsigned c) {
147*0090dad1Sjhigh     return (w >> c) | (w << (32 - c));
148*0090dad1Sjhigh }
149*0090dad1Sjhigh 
rotr64(const uint64_t w,const unsigned c)150*0090dad1Sjhigh static BLAKE2_INLINE uint64_t rotr64(const uint64_t w, const unsigned c) {
151*0090dad1Sjhigh     return (w >> c) | (w << (64 - c));
152*0090dad1Sjhigh }
153*0090dad1Sjhigh 
154*0090dad1Sjhigh void clear_internal_memory(void *v, size_t n);
155*0090dad1Sjhigh 
156*0090dad1Sjhigh #endif
157