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