blake2-impl.h - pee - Pee a password manager;Pee - because you have to...
 (HTM) git clone git://vernunftzentrum.de/pee.git
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) LICENSE
       ---
       blake2-impl.h (3399B)
       ---
            1 /*
            2    BLAKE2 reference source code package - reference C implementations
            3 
            4    Written in 2012 by Samuel Neves <sneves@dei.uc.pt>
            5 
            6    To the extent possible under law, the author(s) have dedicated all copyright
            7    and related and neighboring rights to this software to the public domain
            8    worldwide. This software is distributed without any warranty.
            9 
           10    You should have received a copy of the CC0 Public Domain Dedication along with
           11    this software. If not, see <http://creativecommons.org/publicdomain/zero/1.0/>.
           12 */
           13 #pragma once
           14 #ifndef __BLAKE2_IMPL_H__
           15 #define __BLAKE2_IMPL_H__
           16 
           17 #include <stdint.h>
           18 #include <string.h>
           19 
           20 static inline uint32_t load32( const void *src )
           21 {
           22 #if defined(NATIVE_LITTLE_ENDIAN)
           23   uint32_t w;
           24   memcpy(&w, src, sizeof w);
           25   return w;
           26 #else
           27   const uint8_t *p = ( const uint8_t * )src;
           28   uint32_t w = *p++;
           29   w |= ( uint32_t )( *p++ ) <<  8;
           30   w |= ( uint32_t )( *p++ ) << 16;
           31   w |= ( uint32_t )( *p++ ) << 24;
           32   return w;
           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   uint64_t w = *p++;
           45   w |= ( uint64_t )( *p++ ) <<  8;
           46   w |= ( uint64_t )( *p++ ) << 16;
           47   w |= ( uint64_t )( *p++ ) << 24;
           48   w |= ( uint64_t )( *p++ ) << 32;
           49   w |= ( uint64_t )( *p++ ) << 40;
           50   w |= ( uint64_t )( *p++ ) << 48;
           51   w |= ( uint64_t )( *p++ ) << 56;
           52   return w;
           53 #endif
           54 }
           55 
           56 static inline void store32( void *dst, uint32_t w )
           57 {
           58 #if defined(NATIVE_LITTLE_ENDIAN)
           59   memcpy(dst, &w, sizeof w);
           60 #else
           61   uint8_t *p = ( uint8_t * )dst;
           62   *p++ = ( uint8_t )w; w >>= 8;
           63   *p++ = ( uint8_t )w; w >>= 8;
           64   *p++ = ( uint8_t )w; w >>= 8;
           65   *p++ = ( uint8_t )w;
           66 #endif
           67 }
           68 
           69 static inline void store64( void *dst, uint64_t w )
           70 {
           71 #if defined(NATIVE_LITTLE_ENDIAN)
           72   memcpy(dst, &w, sizeof w);
           73 #else
           74   uint8_t *p = ( uint8_t * )dst;
           75   *p++ = ( uint8_t )w; w >>= 8;
           76   *p++ = ( uint8_t )w; w >>= 8;
           77   *p++ = ( uint8_t )w; w >>= 8;
           78   *p++ = ( uint8_t )w; w >>= 8;
           79   *p++ = ( uint8_t )w; w >>= 8;
           80   *p++ = ( uint8_t )w; w >>= 8;
           81   *p++ = ( uint8_t )w; w >>= 8;
           82   *p++ = ( uint8_t )w;
           83 #endif
           84 }
           85 
           86 static inline uint64_t load48( const void *src )
           87 {
           88   const uint8_t *p = ( const uint8_t * )src;
           89   uint64_t w = *p++;
           90   w |= ( uint64_t )( *p++ ) <<  8;
           91   w |= ( uint64_t )( *p++ ) << 16;
           92   w |= ( uint64_t )( *p++ ) << 24;
           93   w |= ( uint64_t )( *p++ ) << 32;
           94   w |= ( uint64_t )( *p++ ) << 40;
           95   return w;
           96 }
           97 
           98 static inline void store48( void *dst, uint64_t w )
           99 {
          100   uint8_t *p = ( uint8_t * )dst;
          101   *p++ = ( uint8_t )w; w >>= 8;
          102   *p++ = ( uint8_t )w; w >>= 8;
          103   *p++ = ( uint8_t )w; w >>= 8;
          104   *p++ = ( uint8_t )w; w >>= 8;
          105   *p++ = ( uint8_t )w; w >>= 8;
          106   *p++ = ( uint8_t )w;
          107 }
          108 
          109 static inline uint32_t rotl32( const uint32_t w, const unsigned c )
          110 {
          111   return ( w << c ) | ( w >> ( 32 - c ) );
          112 }
          113 
          114 static inline uint64_t rotl64( const uint64_t w, const unsigned c )
          115 {
          116   return ( w << c ) | ( w >> ( 64 - c ) );
          117 }
          118 
          119 static inline uint32_t rotr32( const uint32_t w, const unsigned c )
          120 {
          121   return ( w >> c ) | ( w << ( 32 - c ) );
          122 }
          123 
          124 static inline uint64_t rotr64( const uint64_t w, const unsigned c )
          125 {
          126   return ( w >> c ) | ( w << ( 64 - c ) );
          127 }
          128 
          129 /* prevents compiler optimizing out memset() */
          130 static inline void secure_zero_memory(void *v, size_t n)
          131 {
          132   static void *(*const volatile memset_v)(void *, int, size_t) = &memset;
          133   memset_v(v, 0, n);
          134 }
          135 
          136 #endif
          137