Skip to content

Commit

Permalink
Native implementation of the Blake2bf compress function for EIP152 (h…
Browse files Browse the repository at this point in the history
…yperledger#69)


Only build on Linux (x86_64 and arm64) for now.

Signed-off-by: Fabio Di Fabio <[email protected]>
  • Loading branch information
fab-10 authored Aug 5, 2022
1 parent a1d2c64 commit 9c3cacf
Show file tree
Hide file tree
Showing 21 changed files with 2,013 additions and 0 deletions.
18 changes: 18 additions & 0 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ jobs:
root: .
paths:
- altbn128/build/linux-gnu-x86_64/lib/*.so*
- blake2bf/build/linux-gnu-x86_64/lib/*.so*
- bls12-381/build/linux-gnu-x86_64/lib/*.so*
- secp256k1/build/linux-gnu-x86_64/lib/*.so*
- ipa-multipoint/build/linux-gnu-x86_64/lib/*.so
Expand All @@ -97,6 +98,11 @@ jobs:
path: altbn128/build/linux-gnu-x86_64/lib
destination: altbn128_linux_x86_64_native_artifacts
when: always
- store_artifacts:
name: Linux blake2bf native build artifacts
path: blake2bf/build/linux-gnu-x86_64/lib
destination: blake2bf_linux_x86_64_native_artifacts
when: always
- store_artifacts:
name: Linux bls12-381 native build artifacts
path: bls12-381/build/linux-gnu-x86_64/lib
Expand Down Expand Up @@ -133,6 +139,7 @@ jobs:
root: .
paths:
- altbn128/build/linux-gnu-aarch64/lib/*.so*
- blake2bf/build/linux-gnu-aarch64/lib/*.so*
- secp256k1/build/linux-gnu-aarch64/lib/*.so*
- ipa-multipoint/build/linux-gnu-aarch64/lib/*.so
- secp256r1/besu-native-ec/release/linux-gnu-aarch64/*.so
Expand All @@ -141,6 +148,11 @@ jobs:
path: altbn128/build/linux-gnu-aarch64/lib
destination: altbn128_linux_aarch64_native_artifacts
when: always
- store_artifacts:
name: Linux blake2bf native build artifacts
path: blake2bf/build/linux-gnu-aarch64/lib
destination: blake2bf_linux_aarch64_native_artifacts
when: always
- store_artifacts:
name: Linux secp256k1 native build artifacts
path: secp256k1/build/linux-gnu-aarch64/lib
Expand Down Expand Up @@ -214,6 +226,7 @@ jobs:
root: .
paths:
- altbn128/build/libs/*.jar
- blake2bf/build/libs/*.jar
- bls12-381/build/libs/*.jar
- secp256k1/build/libs/*.jar
- secp256r1/build/libs/*.jar
Expand All @@ -223,6 +236,11 @@ jobs:
path: altbn128/build/libs
destination: secp256k1_jars
when: always
- store_artifacts:
name: Final blake2bf build artifacts
path: blake2bf/build/libs
destination: blake2bf_jars
when: always
- store_artifacts:
name: Final bls12-381 build artifacts
path: bls12-381/build/libs
Expand Down
165 changes: 165 additions & 0 deletions blake2bf/aarch64/blake2-impl.h
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
64 changes: 64 additions & 0 deletions blake2bf/aarch64/blake2.h
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
Loading

0 comments on commit 9c3cacf

Please sign in to comment.