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