/ external / blake2 / blake2-impl.h
blake2-impl.h
  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  static inline uint32_t load32( const void *src )
 22  {
 23  #if defined(NATIVE_LITTLE_ENDIAN)
 24    uint32_t w;
 25    memcpy(&w, src, sizeof w);
 26    return w;
 27  #else
 28    const uint8_t *p = ( const uint8_t * )src;
 29    return (( uint32_t )( p[0] ) <<  0) |
 30           (( uint32_t )( p[1] ) <<  8) |
 31           (( uint32_t )( p[2] ) << 16) |
 32           (( uint32_t )( p[3] ) << 24) ;
 33  #endif
 34  }
 35  
 36  static inline uint64_t load64( const void *src )
 37  {
 38  #if defined(NATIVE_LITTLE_ENDIAN)
 39    uint64_t w;
 40    memcpy(&w, src, sizeof w);
 41    return w;
 42  #else
 43    const uint8_t *p = ( const uint8_t * )src;
 44    return (( uint64_t )( p[0] ) <<  0) |
 45           (( uint64_t )( p[1] ) <<  8) |
 46           (( uint64_t )( p[2] ) << 16) |
 47           (( uint64_t )( p[3] ) << 24) |
 48           (( uint64_t )( p[4] ) << 32) |
 49           (( uint64_t )( p[5] ) << 40) |
 50           (( uint64_t )( p[6] ) << 48) |
 51           (( uint64_t )( p[7] ) << 56) ;
 52  #endif
 53  }
 54  
 55  static inline uint16_t load16( const void *src )
 56  {
 57  #if defined(NATIVE_LITTLE_ENDIAN)
 58    uint16_t w;
 59    memcpy(&w, src, sizeof w);
 60    return w;
 61  #else
 62    const uint8_t *p = ( const uint8_t * )src;
 63    return (( uint16_t )( p[0] ) <<  0) |
 64           (( uint16_t )( p[1] ) <<  8) ;
 65  #endif
 66  }
 67  
 68  static inline void store16( void *dst, uint16_t w )
 69  {
 70  #if defined(NATIVE_LITTLE_ENDIAN)
 71    memcpy(dst, &w, sizeof w);
 72  #else
 73    uint8_t *p = ( uint8_t * )dst;
 74    *p++ = ( uint8_t )w; w >>= 8;
 75    *p++ = ( uint8_t )w;
 76  #endif
 77  }
 78  
 79  static inline void store32( void *dst, uint32_t w )
 80  {
 81  #if defined(NATIVE_LITTLE_ENDIAN)
 82    memcpy(dst, &w, sizeof w);
 83  #else
 84    uint8_t *p = ( uint8_t * )dst;
 85    p[0] = (uint8_t)(w >>  0);
 86    p[1] = (uint8_t)(w >>  8);
 87    p[2] = (uint8_t)(w >> 16);
 88    p[3] = (uint8_t)(w >> 24);
 89  #endif
 90  }
 91  
 92  static inline void store64( void *dst, uint64_t w )
 93  {
 94  #if defined(NATIVE_LITTLE_ENDIAN)
 95    memcpy(dst, &w, sizeof w);
 96  #else
 97    uint8_t *p = ( uint8_t * )dst;
 98    p[0] = (uint8_t)(w >>  0);
 99    p[1] = (uint8_t)(w >>  8);
100    p[2] = (uint8_t)(w >> 16);
101    p[3] = (uint8_t)(w >> 24);
102    p[4] = (uint8_t)(w >> 32);
103    p[5] = (uint8_t)(w >> 40);
104    p[6] = (uint8_t)(w >> 48);
105    p[7] = (uint8_t)(w >> 56);
106  #endif
107  }
108  
109  static inline uint64_t load48( const void *src )
110  {
111    const uint8_t *p = ( const uint8_t * )src;
112    return (( uint64_t )( p[0] ) <<  0) |
113           (( uint64_t )( p[1] ) <<  8) |
114           (( uint64_t )( p[2] ) << 16) |
115           (( uint64_t )( p[3] ) << 24) |
116           (( uint64_t )( p[4] ) << 32) |
117           (( uint64_t )( p[5] ) << 40) ;
118  }
119  
120  static inline void store48( void *dst, uint64_t w )
121  {
122    uint8_t *p = ( uint8_t * )dst;
123    p[0] = (uint8_t)(w >>  0);
124    p[1] = (uint8_t)(w >>  8);
125    p[2] = (uint8_t)(w >> 16);
126    p[3] = (uint8_t)(w >> 24);
127    p[4] = (uint8_t)(w >> 32);
128    p[5] = (uint8_t)(w >> 40);
129  }
130  
131  static inline uint32_t rotr32( const uint32_t w, const unsigned c )
132  {
133    return ( w >> c ) | ( w << ( 32 - c ) );
134  }
135  
136  static inline uint64_t rotr64( const uint64_t w, const unsigned c )
137  {
138    return ( w >> c ) | ( w << ( 64 - c ) );
139  }
140  
141  /* prevents compiler optimizing out memset() */
142  static inline void secure_zero_memory(void *v, size_t n)
143  {
144    static void *(*const volatile memset_v)(void *, int, size_t) = &memset;
145    memset_v(v, 0, n);
146  }
147  
148  #endif
149