forked from hyperledger/besu-native
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Native implementation of the Blake2bf compress function for EIP152 (h…
…yperledger#69) Only build on Linux (x86_64 and arm64) for now. Signed-off-by: Fabio Di Fabio <[email protected]>
- Loading branch information
Showing
21 changed files
with
2,013 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,165 @@ | ||
/* | ||
* Copyright 2012, Samuel Neves <[email protected]>. | ||
* Copyright Hyperledger Besu Contributors. | ||
* | ||
* Copied and adapted from BLAKE2 reference source code (https://github.com/BLAKE2/BLAKE2) | ||
* | ||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with | ||
* the License. You may obtain a copy of the License at | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on | ||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the | ||
* specific language governing permissions and limitations under the License. | ||
* | ||
* | ||
* SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
|
||
#ifndef BLAKE2_IMPL_H | ||
#define BLAKE2_IMPL_H | ||
|
||
#include <stdint.h> | ||
#include <string.h> | ||
|
||
#if !defined(__cplusplus) && (!defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901L) | ||
#if defined(_MSC_VER) | ||
#define BLAKE2_INLINE __inline | ||
#elif defined(__GNUC__) | ||
#define BLAKE2_INLINE __inline__ | ||
#else | ||
#define BLAKE2_INLINE | ||
#endif | ||
#else | ||
#define BLAKE2_INLINE inline | ||
#endif | ||
|
||
static BLAKE2_INLINE uint32_t load32( const void *src ) | ||
{ | ||
#if defined(NATIVE_LITTLE_ENDIAN) | ||
uint32_t w; | ||
memcpy(&w, src, sizeof w); | ||
return w; | ||
#else | ||
const uint8_t *p = ( const uint8_t * )src; | ||
return (( uint32_t )( p[0] ) << 0) | | ||
(( uint32_t )( p[1] ) << 8) | | ||
(( uint32_t )( p[2] ) << 16) | | ||
(( uint32_t )( p[3] ) << 24) ; | ||
#endif | ||
} | ||
|
||
static BLAKE2_INLINE uint64_t load64( const void *src ) | ||
{ | ||
#if defined(NATIVE_LITTLE_ENDIAN) | ||
uint64_t w; | ||
memcpy(&w, src, sizeof w); | ||
return w; | ||
#else | ||
const uint8_t *p = ( const uint8_t * )src; | ||
return (( uint64_t )( p[0] ) << 0) | | ||
(( uint64_t )( p[1] ) << 8) | | ||
(( uint64_t )( p[2] ) << 16) | | ||
(( uint64_t )( p[3] ) << 24) | | ||
(( uint64_t )( p[4] ) << 32) | | ||
(( uint64_t )( p[5] ) << 40) | | ||
(( uint64_t )( p[6] ) << 48) | | ||
(( uint64_t )( p[7] ) << 56) ; | ||
#endif | ||
} | ||
|
||
static BLAKE2_INLINE uint16_t load16( const void *src ) | ||
{ | ||
#if defined(NATIVE_LITTLE_ENDIAN) | ||
uint16_t w; | ||
memcpy(&w, src, sizeof w); | ||
return w; | ||
#else | ||
const uint8_t *p = ( const uint8_t * )src; | ||
return ( uint16_t )((( uint32_t )( p[0] ) << 0) | | ||
(( uint32_t )( p[1] ) << 8)); | ||
#endif | ||
} | ||
|
||
static BLAKE2_INLINE void store16( void *dst, uint16_t w ) | ||
{ | ||
#if defined(NATIVE_LITTLE_ENDIAN) | ||
memcpy(dst, &w, sizeof w); | ||
#else | ||
uint8_t *p = ( uint8_t * )dst; | ||
*p++ = ( uint8_t )w; w >>= 8; | ||
*p++ = ( uint8_t )w; | ||
#endif | ||
} | ||
|
||
static BLAKE2_INLINE void store32( void *dst, uint32_t w ) | ||
{ | ||
#if defined(NATIVE_LITTLE_ENDIAN) | ||
memcpy(dst, &w, sizeof w); | ||
#else | ||
uint8_t *p = ( uint8_t * )dst; | ||
p[0] = (uint8_t)(w >> 0); | ||
p[1] = (uint8_t)(w >> 8); | ||
p[2] = (uint8_t)(w >> 16); | ||
p[3] = (uint8_t)(w >> 24); | ||
#endif | ||
} | ||
|
||
static BLAKE2_INLINE void store64( void *dst, uint64_t w ) | ||
{ | ||
#if defined(NATIVE_LITTLE_ENDIAN) | ||
memcpy(dst, &w, sizeof w); | ||
#else | ||
uint8_t *p = ( uint8_t * )dst; | ||
p[0] = (uint8_t)(w >> 0); | ||
p[1] = (uint8_t)(w >> 8); | ||
p[2] = (uint8_t)(w >> 16); | ||
p[3] = (uint8_t)(w >> 24); | ||
p[4] = (uint8_t)(w >> 32); | ||
p[5] = (uint8_t)(w >> 40); | ||
p[6] = (uint8_t)(w >> 48); | ||
p[7] = (uint8_t)(w >> 56); | ||
#endif | ||
} | ||
|
||
static BLAKE2_INLINE uint64_t load48( const void *src ) | ||
{ | ||
const uint8_t *p = ( const uint8_t * )src; | ||
return (( uint64_t )( p[0] ) << 0) | | ||
(( uint64_t )( p[1] ) << 8) | | ||
(( uint64_t )( p[2] ) << 16) | | ||
(( uint64_t )( p[3] ) << 24) | | ||
(( uint64_t )( p[4] ) << 32) | | ||
(( uint64_t )( p[5] ) << 40) ; | ||
} | ||
|
||
static BLAKE2_INLINE void store48( void *dst, uint64_t w ) | ||
{ | ||
uint8_t *p = ( uint8_t * )dst; | ||
p[0] = (uint8_t)(w >> 0); | ||
p[1] = (uint8_t)(w >> 8); | ||
p[2] = (uint8_t)(w >> 16); | ||
p[3] = (uint8_t)(w >> 24); | ||
p[4] = (uint8_t)(w >> 32); | ||
p[5] = (uint8_t)(w >> 40); | ||
} | ||
|
||
static BLAKE2_INLINE uint32_t rotr32( const uint32_t w, const unsigned c ) | ||
{ | ||
return ( w >> c ) | ( w << ( 32 - c ) ); | ||
} | ||
|
||
static BLAKE2_INLINE uint64_t rotr64( const uint64_t w, const unsigned c ) | ||
{ | ||
return ( w >> c ) | ( w << ( 64 - c ) ); | ||
} | ||
|
||
/* prevents compiler optimizing out memset() */ | ||
static BLAKE2_INLINE void secure_zero_memory(void *v, size_t n) | ||
{ | ||
static void *(*const volatile memset_v)(void *, int, size_t) = &memset; | ||
memset_v(v, 0, n); | ||
} | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,64 @@ | ||
/* | ||
* Copyright 2012, Samuel Neves <[email protected]>. | ||
* Copyright Hyperledger Besu Contributors. | ||
* | ||
* Copied and adapted from BLAKE2 reference source code (https://github.com/BLAKE2/BLAKE2) | ||
* | ||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with | ||
* the License. You may obtain a copy of the License at | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on | ||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the | ||
* specific language governing permissions and limitations under the License. | ||
* | ||
* | ||
* SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
|
||
#ifndef BLAKE2_H | ||
#define BLAKE2_H | ||
|
||
#include <stddef.h> | ||
#include <stdint.h> | ||
|
||
#if defined(_MSC_VER) | ||
#define BLAKE2_PACKED(x) __pragma(pack(push, 1)) x __pragma(pack(pop)) | ||
#else | ||
#define BLAKE2_PACKED(x) x __attribute__((packed)) | ||
#endif | ||
|
||
#if defined(__cplusplus) | ||
extern "C" { | ||
#endif | ||
|
||
|
||
enum blake2b_constant | ||
{ | ||
BLAKE2B_BLOCKBYTES = 128, | ||
BLAKE2B_OUTBYTES = 64 | ||
}; | ||
|
||
enum eip152_constant | ||
{ | ||
EIP152_PAYLOAD_LEN=213, | ||
EIP152_ROUNDS_OFFSET=0, | ||
EIP152_ROUNDS_LEN=4, | ||
EIP152_H_OFFSET = EIP152_ROUNDS_OFFSET + EIP152_ROUNDS_LEN, | ||
EIP152_H_LEN = 64, | ||
EIP152_M_OFFSET = EIP152_H_OFFSET + EIP152_H_LEN, | ||
EIP152_M_LEN = 128, | ||
EIP152_T_OFFSET = EIP152_M_OFFSET + EIP152_M_LEN, | ||
EIP152_T_LEN = 16, | ||
EIP152_F_OFFSET = EIP152_T_OFFSET + EIP152_T_LEN, | ||
EIP152_F_LEN = 1 | ||
}; | ||
|
||
void blake2bf_eip152(uint8_t out[BLAKE2B_OUTBYTES], const uint8_t payload[EIP152_PAYLOAD_LEN]); | ||
|
||
#if defined(__cplusplus) | ||
} | ||
#endif | ||
|
||
#endif |
Oops, something went wrong.