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 : http://creativecommons.org/publicdomain/zero/1.0 12 * - Apache 2.0 : http://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 <stdint.h> 22 #include <string.h> 23 24 #if defined(_MSC_VER) 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 return (w >> c) | (w << (64 - c)); 152 } 153 154 void clear_internal_memory(void *v, size_t n); 155 156 #endif 157