File Coverage

src/blake2/blake2-impl.h
Criterion Covered Total %
statement 1 1 100.0
branch n/a
condition n/a
subroutine n/a
pod n/a
total 1 1 100.0


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