blake2-impl.h (4067B)
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 /* blake2-impl.h 14 * 15 * Copyright (C) 2006-2025 wolfSSL Inc. 16 * 17 * This file is part of wolfSSL. 18 * 19 * wolfSSL is free software; you can redistribute it and/or modify 20 * it under the terms of the GNU General Public License as published by 21 * the Free Software Foundation; either version 3 of the License, or 22 * (at your option) any later version. 23 * 24 * wolfSSL is distributed in the hope that it will be useful, 25 * but WITHOUT ANY WARRANTY; without even the implied warranty of 26 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 27 * GNU General Public License for more details. 28 * 29 * You should have received a copy of the GNU General Public License 30 * along with this program; if not, write to the Free Software 31 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA 32 */ 33 34 35 36 #ifndef WOLFCRYPT_BLAKE2_IMPL_H 37 #define WOLFCRYPT_BLAKE2_IMPL_H 38 39 #include <wolfssl/wolfcrypt/types.h> 40 41 static WC_INLINE word32 load32( const void *src ) 42 { 43 #if defined(LITTLE_ENDIAN_ORDER) 44 return *( word32 * )( src ); 45 #else 46 const byte *p = ( byte * )src; 47 word32 w = *p++; 48 w |= ( word32 )( *p++ ) << 8; 49 w |= ( word32 )( *p++ ) << 16; 50 w |= ( word32 )( *p++ ) << 24; 51 return w; 52 #endif 53 } 54 55 static WC_INLINE word64 load64( const void *src ) 56 { 57 #if defined(LITTLE_ENDIAN_ORDER) 58 return *( word64 * )( src ); 59 #else 60 const byte *p = ( byte * )src; 61 word64 w = *p++; 62 w |= ( word64 )( *p++ ) << 8; 63 w |= ( word64 )( *p++ ) << 16; 64 w |= ( word64 )( *p++ ) << 24; 65 w |= ( word64 )( *p++ ) << 32; 66 w |= ( word64 )( *p++ ) << 40; 67 w |= ( word64 )( *p++ ) << 48; 68 w |= ( word64 )( *p++ ) << 56; 69 return w; 70 #endif 71 } 72 73 static WC_INLINE void store32( void *dst, word32 w ) 74 { 75 #if defined(LITTLE_ENDIAN_ORDER) 76 *( word32 * )( dst ) = w; 77 #else 78 byte *p = ( byte * )dst; 79 *p++ = ( byte )w; w >>= 8; 80 *p++ = ( byte )w; w >>= 8; 81 *p++ = ( byte )w; w >>= 8; 82 *p++ = ( byte )w; 83 #endif 84 } 85 86 static WC_INLINE void store64( void *dst, word64 w ) 87 { 88 #if defined(LITTLE_ENDIAN_ORDER) && !defined(WOLFSSL_GENERAL_ALIGNMENT) 89 *( word64 * )( dst ) = w; 90 #else 91 byte *p = ( byte * )dst; 92 *p++ = ( byte )w; w >>= 8; 93 *p++ = ( byte )w; w >>= 8; 94 *p++ = ( byte )w; w >>= 8; 95 *p++ = ( byte )w; w >>= 8; 96 *p++ = ( byte )w; w >>= 8; 97 *p++ = ( byte )w; w >>= 8; 98 *p++ = ( byte )w; w >>= 8; 99 *p++ = ( byte )w; 100 #endif 101 } 102 103 static WC_INLINE word64 load48( const void *src ) 104 { 105 const byte *p = ( const byte * )src; 106 word64 w = *p++; 107 w |= ( word64 )( *p++ ) << 8; 108 w |= ( word64 )( *p++ ) << 16; 109 w |= ( word64 )( *p++ ) << 24; 110 w |= ( word64 )( *p++ ) << 32; 111 w |= ( word64 )( *p++ ) << 40; 112 return w; 113 } 114 115 static WC_INLINE void store48( void *dst, word64 w ) 116 { 117 byte *p = ( byte * )dst; 118 *p++ = ( byte )w; w >>= 8; 119 *p++ = ( byte )w; w >>= 8; 120 *p++ = ( byte )w; w >>= 8; 121 *p++ = ( byte )w; w >>= 8; 122 *p++ = ( byte )w; w >>= 8; 123 *p++ = ( byte )w; 124 } 125 126 static WC_INLINE word32 rotl32( const word32 w, const unsigned c ) 127 { 128 return ( w << c ) | ( w >> ( 32 - c ) ); 129 } 130 131 static WC_INLINE word64 rotl64( const word64 w, const unsigned c ) 132 { 133 return ( w << c ) | ( w >> ( 64 - c ) ); 134 } 135 136 static WC_INLINE word32 rotr32( const word32 w, const unsigned c ) 137 { 138 return ( w >> c ) | ( w << ( 32 - c ) ); 139 } 140 141 static WC_INLINE word64 rotr64( const word64 w, const unsigned c ) 142 { 143 return ( w >> c ) | ( w << ( 64 - c ) ); 144 } 145 146 /* prevents compiler optimizing out memset() */ 147 static WC_INLINE void secure_zero_memory( void *v, word64 n ) 148 { 149 volatile byte *p = ( volatile byte * )v; 150 151 while( n-- ) *p++ = 0; 152 } 153 154 #endif /* WOLFCRYPT_BLAKE2_IMPL_H */ 155