tblake2-impl.h - dedup - deduplicating backup program HTML git clone git://bitreich.org/dedup/ git://hg6vgqziawt5s4dj.onion/dedup/ DIR Log DIR Files DIR Refs DIR Tags DIR README DIR LICENSE --- tblake2-impl.h (4201B) --- 1 /* 2 BLAKE2 reference source code package - reference C implementations 3 4 Copyright 2012, Samuel Neves <sneves@dei.uc.pt>. You may use this under the 5 terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at 6 your option. The terms of these licenses can be found at: 7 8 - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 9 - OpenSSL license : https://www.openssl.org/source/license.html 10 - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 11 12 More information about the BLAKE2 hash function can be found at 13 https://blake2.net. 14 */ 15 #ifndef BLAKE2_IMPL_H 16 #define BLAKE2_IMPL_H 17 18 #include <stdint.h> 19 #include <string.h> 20 21 #if !defined(__cplusplus) && (!defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901L) 22 #if defined(_MSC_VER) 23 #define BLAKE2_INLINE __inline 24 #elif defined(__GNUC__) 25 #define BLAKE2_INLINE __inline__ 26 #else 27 #define BLAKE2_INLINE 28 #endif 29 #else 30 #define BLAKE2_INLINE inline 31 #endif 32 33 static BLAKE2_INLINE uint32_t load32( const void *src ) 34 { 35 #if defined(NATIVE_LITTLE_ENDIAN) 36 uint32_t w; 37 memcpy(&w, src, sizeof w); 38 return w; 39 #else 40 const uint8_t *p = ( const uint8_t * )src; 41 return (( uint32_t )( p[0] ) << 0) | 42 (( uint32_t )( p[1] ) << 8) | 43 (( uint32_t )( p[2] ) << 16) | 44 (( uint32_t )( p[3] ) << 24) ; 45 #endif 46 } 47 48 static BLAKE2_INLINE uint64_t load64( const void *src ) 49 { 50 #if defined(NATIVE_LITTLE_ENDIAN) 51 uint64_t w; 52 memcpy(&w, src, sizeof w); 53 return w; 54 #else 55 const uint8_t *p = ( const uint8_t * )src; 56 return (( uint64_t )( p[0] ) << 0) | 57 (( uint64_t )( p[1] ) << 8) | 58 (( uint64_t )( p[2] ) << 16) | 59 (( uint64_t )( p[3] ) << 24) | 60 (( uint64_t )( p[4] ) << 32) | 61 (( uint64_t )( p[5] ) << 40) | 62 (( uint64_t )( p[6] ) << 48) | 63 (( uint64_t )( p[7] ) << 56) ; 64 #endif 65 } 66 67 static BLAKE2_INLINE uint16_t load16( const void *src ) 68 { 69 #if defined(NATIVE_LITTLE_ENDIAN) 70 uint16_t w; 71 memcpy(&w, src, sizeof w); 72 return w; 73 #else 74 const uint8_t *p = ( const uint8_t * )src; 75 return ( uint16_t )((( uint32_t )( p[0] ) << 0) | 76 (( uint32_t )( p[1] ) << 8)); 77 #endif 78 } 79 80 static BLAKE2_INLINE void store16( void *dst, uint16_t w ) 81 { 82 #if defined(NATIVE_LITTLE_ENDIAN) 83 memcpy(dst, &w, sizeof w); 84 #else 85 uint8_t *p = ( uint8_t * )dst; 86 *p++ = ( uint8_t )w; w >>= 8; 87 *p++ = ( uint8_t )w; 88 #endif 89 } 90 91 static BLAKE2_INLINE void store32( void *dst, uint32_t w ) 92 { 93 #if defined(NATIVE_LITTLE_ENDIAN) 94 memcpy(dst, &w, sizeof w); 95 #else 96 uint8_t *p = ( uint8_t * )dst; 97 p[0] = (uint8_t)(w >> 0); 98 p[1] = (uint8_t)(w >> 8); 99 p[2] = (uint8_t)(w >> 16); 100 p[3] = (uint8_t)(w >> 24); 101 #endif 102 } 103 104 static BLAKE2_INLINE void store64( void *dst, uint64_t w ) 105 { 106 #if defined(NATIVE_LITTLE_ENDIAN) 107 memcpy(dst, &w, sizeof w); 108 #else 109 uint8_t *p = ( uint8_t * )dst; 110 p[0] = (uint8_t)(w >> 0); 111 p[1] = (uint8_t)(w >> 8); 112 p[2] = (uint8_t)(w >> 16); 113 p[3] = (uint8_t)(w >> 24); 114 p[4] = (uint8_t)(w >> 32); 115 p[5] = (uint8_t)(w >> 40); 116 p[6] = (uint8_t)(w >> 48); 117 p[7] = (uint8_t)(w >> 56); 118 #endif 119 } 120 121 static BLAKE2_INLINE uint64_t load48( const void *src ) 122 { 123 const uint8_t *p = ( const uint8_t * )src; 124 return (( uint64_t )( p[0] ) << 0) | 125 (( uint64_t )( p[1] ) << 8) | 126 (( uint64_t )( p[2] ) << 16) | 127 (( uint64_t )( p[3] ) << 24) | 128 (( uint64_t )( p[4] ) << 32) | 129 (( uint64_t )( p[5] ) << 40) ; 130 } 131 132 static BLAKE2_INLINE void store48( void *dst, uint64_t w ) 133 { 134 uint8_t *p = ( uint8_t * )dst; 135 p[0] = (uint8_t)(w >> 0); 136 p[1] = (uint8_t)(w >> 8); 137 p[2] = (uint8_t)(w >> 16); 138 p[3] = (uint8_t)(w >> 24); 139 p[4] = (uint8_t)(w >> 32); 140 p[5] = (uint8_t)(w >> 40); 141 } 142 143 static BLAKE2_INLINE uint32_t rotr32( const uint32_t w, const unsigned c ) 144 { 145 return ( w >> c ) | ( w << ( 32 - c ) ); 146 } 147 148 static BLAKE2_INLINE uint64_t rotr64( const uint64_t w, const unsigned c ) 149 { 150 return ( w >> c ) | ( w << ( 64 - c ) ); 151 } 152 153 /* prevents compiler optimizing out memset() */ 154 static BLAKE2_INLINE void secure_zero_memory(void *v, size_t n) 155 { 156 static void *(*const volatile memset_v)(void *, int, size_t) = &memset; 157 memset_v(v, 0, n); 158 } 159 160 #endif