From d31a9cf9c73e1144a2fb7bfec3ec580b8f475b5e Mon Sep 17 00:00:00 2001 From: Alex Kotov Date: Fri, 19 Nov 2021 16:00:09 +0500 Subject: [PATCH] Fix reference C implementation build on ARM --- .gitignore | 1 - Rakefile | 3 +- digest-blake2b.gemspec | 3 +- ext/digest/blake2b/{sse => ext}/blake2-impl.h | 0 ext/digest/blake2b/{sse => ext}/blake2.h | 0 ext/digest/blake2b/ext/blake2b-ref.c | 7 + ext/digest/blake2b/ext/extconf.rb | 14 ++ ext/digest/blake2b/{sse => ext}/rbext.c | 5 +- .../blake2b/{ => ext}/ref/blake2b-ref.c | 4 +- .../blake2b/{ => ext}/sse/blake2-config.h | 0 .../blake2b/{ => ext}/sse/blake2b-load-sse2.h | 0 .../{ => ext}/sse/blake2b-load-sse41.h | 0 .../blake2b/{ => ext}/sse/blake2b-ref.c | 0 .../blake2b/{ => ext}/sse/blake2b-round.h | 0 ext/digest/blake2b/ref/blake2-impl.h | 160 -------------- ext/digest/blake2b/ref/blake2.h | 195 ------------------ ext/digest/blake2b/ref/extconf.rb | 7 - ext/digest/blake2b/ref/rbext.c | 111 ---------- ext/digest/blake2b/sse/extconf.rb | 7 - lib/digest/blake2b.rb | 6 +- lib/digest/blake2b/impl.rb | 11 - 21 files changed, 30 insertions(+), 504 deletions(-) rename ext/digest/blake2b/{sse => ext}/blake2-impl.h (100%) rename ext/digest/blake2b/{sse => ext}/blake2.h (100%) create mode 100644 ext/digest/blake2b/ext/blake2b-ref.c create mode 100644 ext/digest/blake2b/ext/extconf.rb rename ext/digest/blake2b/{sse => ext}/rbext.c (99%) rename ext/digest/blake2b/{ => ext}/ref/blake2b-ref.c (99%) rename ext/digest/blake2b/{ => ext}/sse/blake2-config.h (100%) rename ext/digest/blake2b/{ => ext}/sse/blake2b-load-sse2.h (100%) rename ext/digest/blake2b/{ => ext}/sse/blake2b-load-sse41.h (100%) rename ext/digest/blake2b/{ => ext}/sse/blake2b-ref.c (100%) rename ext/digest/blake2b/{ => ext}/sse/blake2b-round.h (100%) delete mode 100644 ext/digest/blake2b/ref/blake2-impl.h delete mode 100644 ext/digest/blake2b/ref/blake2.h delete mode 100644 ext/digest/blake2b/ref/extconf.rb delete mode 100644 ext/digest/blake2b/ref/rbext.c delete mode 100644 ext/digest/blake2b/sse/extconf.rb delete mode 100644 lib/digest/blake2b/impl.rb diff --git a/.gitignore b/.gitignore index 420bbbc..6f727a4 100644 --- a/.gitignore +++ b/.gitignore @@ -9,7 +9,6 @@ !/checksums/.keep /lib/**/*.bundle /lib/digest/blake2b/ext.so -/lib/digest/blake2b/sse.so *.o *.gem diff --git a/Rakefile b/Rakefile index f71090b..b1db527 100644 --- a/Rakefile +++ b/Rakefile @@ -6,9 +6,8 @@ require 'rake/extensiontask' spec = Gem::Specification.load('digest-blake2b.gemspec') -Rake::ExtensionTask.new "digest/blake2b/#{Digest::Blake2b::IMPL}", spec do |ext| +Rake::ExtensionTask.new 'digest/blake2b/ext', spec do |ext| ext.source_pattern = '*.{c,h}' - ext.ext_dir = "ext/digest/blake2b/#{Digest::Blake2b::IMPL}" end Rake::TestTask.new do |t| diff --git a/digest-blake2b.gemspec b/digest-blake2b.gemspec index 6d048b7..78015e2 100644 --- a/digest-blake2b.gemspec +++ b/digest-blake2b.gemspec @@ -4,7 +4,6 @@ lib = File.expand_path('lib', __dir__).freeze $LOAD_PATH.unshift lib unless $LOAD_PATH.include? lib require 'digest/blake2b/version' -require 'digest/blake2b/impl' Gem::Specification.new do |spec| spec.name = 'digest-blake2b' @@ -42,7 +41,7 @@ Gem::Specification.new do |spec| spec.executables = spec.files.grep %r{^exe/}, &File.method(:basename) - spec.extensions << "ext/digest/blake2b/#{Digest::Blake2b::IMPL}/extconf.rb" + spec.extensions << 'ext/digest/blake2b/ext/extconf.rb' spec.add_development_dependency 'bundler' , '~> 2.2' spec.add_development_dependency 'minitest' , '~> 5.11' diff --git a/ext/digest/blake2b/sse/blake2-impl.h b/ext/digest/blake2b/ext/blake2-impl.h similarity index 100% rename from ext/digest/blake2b/sse/blake2-impl.h rename to ext/digest/blake2b/ext/blake2-impl.h diff --git a/ext/digest/blake2b/sse/blake2.h b/ext/digest/blake2b/ext/blake2.h similarity index 100% rename from ext/digest/blake2b/sse/blake2.h rename to ext/digest/blake2b/ext/blake2.h diff --git a/ext/digest/blake2b/ext/blake2b-ref.c b/ext/digest/blake2b/ext/blake2b-ref.c new file mode 100644 index 0000000..60c5358 --- /dev/null +++ b/ext/digest/blake2b/ext/blake2b-ref.c @@ -0,0 +1,7 @@ +#ifdef IMPL_REF +#include "ref/blake2b-ref.c" +#endif + +#ifdef IMPL_SSE +#include "sse/blake2b-ref.c" +#endif diff --git a/ext/digest/blake2b/ext/extconf.rb b/ext/digest/blake2b/ext/extconf.rb new file mode 100644 index 0000000..d894f1c --- /dev/null +++ b/ext/digest/blake2b/ext/extconf.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +require 'mkmf' + +$CFLAGS += ' -std=c99 -pedantic -Wall -Wextra' + +if RUBY_PLATFORM =~ /^x86_64/ + $CPPFLAGS += ' -DIMPL_SSE' + $CFLAGS += ' -Wno-long-long' +else + $CPPFLAGS += ' -DIMPL_REF' +end + +create_makefile 'digest/blake2b/ext' diff --git a/ext/digest/blake2b/sse/rbext.c b/ext/digest/blake2b/ext/rbext.c similarity index 99% rename from ext/digest/blake2b/sse/rbext.c rename to ext/digest/blake2b/ext/rbext.c index e2f760b..bb2a619 100644 --- a/ext/digest/blake2b/sse/rbext.c +++ b/ext/digest/blake2b/ext/rbext.c @@ -1,6 +1,7 @@ +#include "blake2.h" + #include #include -#include "blake2.h" typedef struct { size_t key_length; @@ -100,7 +101,7 @@ VALUE m_blake2_digest(VALUE self, VALUE _input, VALUE _representation) { return result; } -void Init_sse() { +void Init_ext() { mDigest = rb_define_module("Digest"); mDigest_cBlake2 = rb_define_class_under(mDigest, "Blake2b", rb_cObject); diff --git a/ext/digest/blake2b/ref/blake2b-ref.c b/ext/digest/blake2b/ext/ref/blake2b-ref.c similarity index 99% rename from ext/digest/blake2b/ref/blake2b-ref.c rename to ext/digest/blake2b/ext/ref/blake2b-ref.c index cd38b1b..7219ff3 100644 --- a/ext/digest/blake2b/ref/blake2b-ref.c +++ b/ext/digest/blake2b/ext/ref/blake2b-ref.c @@ -303,14 +303,14 @@ int blake2( void *out, size_t outlen, const void *in, size_t inlen, const void * return blake2b(out, outlen, in, inlen, key, keylen); } -#if defined(SUPERCOP) +#ifdef SUPERCOP int crypto_hash( unsigned char *out, unsigned char *in, unsigned long long inlen ) { return blake2b( out, BLAKE2B_OUTBYTES, in, inlen, NULL, 0 ); } #endif -#if defined(BLAKE2B_SELFTEST) +#ifdef BLAKE2B_SELFTEST #include #include "blake2-kat.h" int main( void ) diff --git a/ext/digest/blake2b/sse/blake2-config.h b/ext/digest/blake2b/ext/sse/blake2-config.h similarity index 100% rename from ext/digest/blake2b/sse/blake2-config.h rename to ext/digest/blake2b/ext/sse/blake2-config.h diff --git a/ext/digest/blake2b/sse/blake2b-load-sse2.h b/ext/digest/blake2b/ext/sse/blake2b-load-sse2.h similarity index 100% rename from ext/digest/blake2b/sse/blake2b-load-sse2.h rename to ext/digest/blake2b/ext/sse/blake2b-load-sse2.h diff --git a/ext/digest/blake2b/sse/blake2b-load-sse41.h b/ext/digest/blake2b/ext/sse/blake2b-load-sse41.h similarity index 100% rename from ext/digest/blake2b/sse/blake2b-load-sse41.h rename to ext/digest/blake2b/ext/sse/blake2b-load-sse41.h diff --git a/ext/digest/blake2b/sse/blake2b-ref.c b/ext/digest/blake2b/ext/sse/blake2b-ref.c similarity index 100% rename from ext/digest/blake2b/sse/blake2b-ref.c rename to ext/digest/blake2b/ext/sse/blake2b-ref.c diff --git a/ext/digest/blake2b/sse/blake2b-round.h b/ext/digest/blake2b/ext/sse/blake2b-round.h similarity index 100% rename from ext/digest/blake2b/sse/blake2b-round.h rename to ext/digest/blake2b/ext/sse/blake2b-round.h diff --git a/ext/digest/blake2b/ref/blake2-impl.h b/ext/digest/blake2b/ref/blake2-impl.h deleted file mode 100644 index 5dff7fc..0000000 --- a/ext/digest/blake2b/ref/blake2-impl.h +++ /dev/null @@ -1,160 +0,0 @@ -/* - BLAKE2 reference source code package - reference C implementations - - Copyright 2012, Samuel Neves . You may use this under the - terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at - your option. The terms of these licenses can be found at: - - - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 - - OpenSSL license : https://www.openssl.org/source/license.html - - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 - - More information about the BLAKE2 hash function can be found at - https://blake2.net. -*/ -#ifndef BLAKE2_IMPL_H -#define BLAKE2_IMPL_H - -#include -#include - -#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 )( p[0] ) << 0) | - (( uint16_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 diff --git a/ext/digest/blake2b/ref/blake2.h b/ext/digest/blake2b/ref/blake2.h deleted file mode 100644 index ad62f26..0000000 --- a/ext/digest/blake2b/ref/blake2.h +++ /dev/null @@ -1,195 +0,0 @@ -/* - BLAKE2 reference source code package - reference C implementations - - Copyright 2012, Samuel Neves . You may use this under the - terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at - your option. The terms of these licenses can be found at: - - - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 - - OpenSSL license : https://www.openssl.org/source/license.html - - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 - - More information about the BLAKE2 hash function can be found at - https://blake2.net. -*/ -#ifndef BLAKE2_H -#define BLAKE2_H - -#include -#include - -#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 blake2s_constant - { - BLAKE2S_BLOCKBYTES = 64, - BLAKE2S_OUTBYTES = 32, - BLAKE2S_KEYBYTES = 32, - BLAKE2S_SALTBYTES = 8, - BLAKE2S_PERSONALBYTES = 8 - }; - - enum blake2b_constant - { - BLAKE2B_BLOCKBYTES = 128, - BLAKE2B_OUTBYTES = 64, - BLAKE2B_KEYBYTES = 64, - BLAKE2B_SALTBYTES = 16, - BLAKE2B_PERSONALBYTES = 16 - }; - - typedef struct blake2s_state__ - { - uint32_t h[8]; - uint32_t t[2]; - uint32_t f[2]; - uint8_t buf[BLAKE2S_BLOCKBYTES]; - size_t buflen; - size_t outlen; - uint8_t last_node; - } blake2s_state; - - typedef struct blake2b_state__ - { - uint64_t h[8]; - uint64_t t[2]; - uint64_t f[2]; - uint8_t buf[BLAKE2B_BLOCKBYTES]; - size_t buflen; - size_t outlen; - uint8_t last_node; - } blake2b_state; - - typedef struct blake2sp_state__ - { - blake2s_state S[8][1]; - blake2s_state R[1]; - uint8_t buf[8 * BLAKE2S_BLOCKBYTES]; - size_t buflen; - size_t outlen; - } blake2sp_state; - - typedef struct blake2bp_state__ - { - blake2b_state S[4][1]; - blake2b_state R[1]; - uint8_t buf[4 * BLAKE2B_BLOCKBYTES]; - size_t buflen; - size_t outlen; - } blake2bp_state; - - - BLAKE2_PACKED(struct blake2s_param__ - { - uint8_t digest_length; /* 1 */ - uint8_t key_length; /* 2 */ - uint8_t fanout; /* 3 */ - uint8_t depth; /* 4 */ - uint32_t leaf_length; /* 8 */ - uint32_t node_offset; /* 12 */ - uint16_t xof_length; /* 14 */ - uint8_t node_depth; /* 15 */ - uint8_t inner_length; /* 16 */ - /* uint8_t reserved[0]; */ - uint8_t salt[BLAKE2S_SALTBYTES]; /* 24 */ - uint8_t personal[BLAKE2S_PERSONALBYTES]; /* 32 */ - }); - - typedef struct blake2s_param__ blake2s_param; - - BLAKE2_PACKED(struct blake2b_param__ - { - uint8_t digest_length; /* 1 */ - uint8_t key_length; /* 2 */ - uint8_t fanout; /* 3 */ - uint8_t depth; /* 4 */ - uint32_t leaf_length; /* 8 */ - uint32_t node_offset; /* 12 */ - uint32_t xof_length; /* 16 */ - uint8_t node_depth; /* 17 */ - uint8_t inner_length; /* 18 */ - uint8_t reserved[14]; /* 32 */ - uint8_t salt[BLAKE2B_SALTBYTES]; /* 48 */ - uint8_t personal[BLAKE2B_PERSONALBYTES]; /* 64 */ - }); - - typedef struct blake2b_param__ blake2b_param; - - typedef struct blake2xs_state__ - { - blake2s_state S[1]; - blake2s_param P[1]; - } blake2xs_state; - - typedef struct blake2xb_state__ - { - blake2b_state S[1]; - blake2b_param P[1]; - } blake2xb_state; - - /* Padded structs result in a compile-time error */ - enum { - BLAKE2_DUMMY_1 = 1/(sizeof(blake2s_param) == BLAKE2S_OUTBYTES), - BLAKE2_DUMMY_2 = 1/(sizeof(blake2b_param) == BLAKE2B_OUTBYTES) - }; - - /* Streaming API */ - int blake2s_init( blake2s_state *S, size_t outlen ); - int blake2s_init_key( blake2s_state *S, size_t outlen, const void *key, size_t keylen ); - int blake2s_init_param( blake2s_state *S, const blake2s_param *P ); - int blake2s_update( blake2s_state *S, const void *in, size_t inlen ); - int blake2s_final( blake2s_state *S, void *out, size_t outlen ); - - int blake2b_init( blake2b_state *S, size_t outlen ); - int blake2b_init_key( blake2b_state *S, size_t outlen, const void *key, size_t keylen ); - int blake2b_init_param( blake2b_state *S, const blake2b_param *P ); - int blake2b_update( blake2b_state *S, const void *in, size_t inlen ); - int blake2b_final( blake2b_state *S, void *out, size_t outlen ); - - int blake2sp_init( blake2sp_state *S, size_t outlen ); - int blake2sp_init_key( blake2sp_state *S, size_t outlen, const void *key, size_t keylen ); - int blake2sp_update( blake2sp_state *S, const void *in, size_t inlen ); - int blake2sp_final( blake2sp_state *S, void *out, size_t outlen ); - - int blake2bp_init( blake2bp_state *S, size_t outlen ); - int blake2bp_init_key( blake2bp_state *S, size_t outlen, const void *key, size_t keylen ); - int blake2bp_update( blake2bp_state *S, const void *in, size_t inlen ); - int blake2bp_final( blake2bp_state *S, void *out, size_t outlen ); - - /* Variable output length API */ - int blake2xs_init( blake2xs_state *S, const size_t outlen ); - int blake2xs_init_key( blake2xs_state *S, const size_t outlen, const void *key, size_t keylen ); - int blake2xs_update( blake2xs_state *S, const void *in, size_t inlen ); - int blake2xs_final(blake2xs_state *S, void *out, size_t outlen); - - int blake2xb_init( blake2xb_state *S, const size_t outlen ); - int blake2xb_init_key( blake2xb_state *S, const size_t outlen, const void *key, size_t keylen ); - int blake2xb_update( blake2xb_state *S, const void *in, size_t inlen ); - int blake2xb_final(blake2xb_state *S, void *out, size_t outlen); - - /* Simple API */ - int blake2s( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen ); - int blake2b( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen ); - - int blake2sp( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen ); - int blake2bp( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen ); - - int blake2xs( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen ); - int blake2xb( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen ); - - /* This is simply an alias for blake2b */ - int blake2( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen ); - -#if defined(__cplusplus) -} -#endif - -#endif diff --git a/ext/digest/blake2b/ref/extconf.rb b/ext/digest/blake2b/ref/extconf.rb deleted file mode 100644 index c483f2d..0000000 --- a/ext/digest/blake2b/ref/extconf.rb +++ /dev/null @@ -1,7 +0,0 @@ -# frozen_string_literal: true - -require 'mkmf' - -$CFLAGS += ' -std=c99 -pedantic -Wall -Wextra' - -create_makefile 'digest/blake2b/ref' diff --git a/ext/digest/blake2b/ref/rbext.c b/ext/digest/blake2b/ref/rbext.c deleted file mode 100644 index c84f399..0000000 --- a/ext/digest/blake2b/ref/rbext.c +++ /dev/null @@ -1,111 +0,0 @@ -#include -#include -#include "blake2.h" - -typedef struct { - size_t key_length; - uint8_t *key_bytes; - - size_t output_length; - uint8_t *output; - - VALUE to_hex; - VALUE to_bytes; -} Blake2; - -VALUE mDigest; -VALUE mDigest_cBlake2; - -static void blake2_free(Blake2 *blake2) { - free(blake2->key_bytes); - free(blake2->output); - - rb_gc_mark(blake2->to_hex); - rb_gc_mark(blake2->to_bytes); - - ruby_xfree(blake2); -} - -static VALUE blake2_alloc(VALUE klass) { - Blake2 *blake2_obj = (Blake2 *)ruby_xmalloc(sizeof(Blake2)); - - return Data_Wrap_Struct(klass, NULL, blake2_free, blake2_obj); -} - -VALUE m_blake2_initialize(VALUE self, VALUE _len, VALUE _key) { - Blake2 *blake2; - Data_Get_Struct(self, Blake2, blake2); - unsigned int i; - - ID bytes_method = rb_intern("bytes"); - blake2->to_hex = ID2SYM(rb_intern("to_hex")); - blake2->to_bytes = ID2SYM(rb_intern("to_bytes")); - - VALUE key_bytes_ary = rb_funcall(_key, bytes_method, 0); - blake2->key_length = RARRAY_LEN(key_bytes_ary); - blake2->key_bytes = (uint8_t*)malloc(blake2->key_length * sizeof(uint8_t)); - - for(i = 0; i < blake2->key_length; i++) { - VALUE byte = rb_ary_entry(key_bytes_ary, i); - blake2->key_bytes[i] = NUM2INT(byte); - } - - blake2->output_length = NUM2INT(_len); - blake2->output = (uint8_t*)malloc(blake2->output_length * sizeof(uint8_t)); - - return Qnil; -} - - -VALUE m_blake2_digest(VALUE self, VALUE _input, VALUE _representation) { - Blake2 *blake2; - - char *input = RSTRING_PTR(_input); - uint64_t input_length = RSTRING_LEN(_input); - unsigned int i; - - Data_Get_Struct(self, Blake2, blake2); - - blake2b(blake2->output, blake2->output_length, input, input_length, - blake2->key_bytes, blake2->key_length); - - VALUE result; - - if(_representation == blake2->to_bytes) { - result = rb_ary_new2(blake2->output_length); - - for(i = 0; i < blake2->output_length; i++) { - rb_ary_push(result, INT2NUM(blake2->output[i])); - } - } else if(_representation == blake2->to_hex) { - unsigned long ary_len = blake2->output_length * (unsigned)sizeof(char) * 2; - char *c_str = (char*)malloc(ary_len + 1); - - for(i = 0; i < blake2->output_length; i++) { - sprintf(c_str + (i * 2), "%02x", blake2->output[i]); - } - c_str[ary_len] = 0; - - result = rb_str_new(c_str, ary_len); - - if((unsigned long)RSTRING_LEN(result) != ary_len) { - rb_raise(rb_eRuntimeError, "m_blake2_digest: sizes don't match. Ary: %lu != %lu", RSTRING_LEN(result), ary_len); - } - - free(c_str); - } else { - rb_raise(rb_eArgError, "unknown representation :%"PRIsVALUE"", _representation); - } - - return result; -} - -void Init_ref() { - mDigest = rb_define_module("Digest"); - - mDigest_cBlake2 = rb_define_class_under(mDigest, "Blake2b", rb_cObject); - rb_define_alloc_func(mDigest_cBlake2, blake2_alloc); - - rb_define_private_method(mDigest_cBlake2, "initialize", RUBY_METHOD_FUNC(m_blake2_initialize), 2); - rb_define_method(mDigest_cBlake2, "digest", RUBY_METHOD_FUNC(m_blake2_digest), 2); -} diff --git a/ext/digest/blake2b/sse/extconf.rb b/ext/digest/blake2b/sse/extconf.rb deleted file mode 100644 index 3cb186a..0000000 --- a/ext/digest/blake2b/sse/extconf.rb +++ /dev/null @@ -1,7 +0,0 @@ -# frozen_string_literal: true - -require 'mkmf' - -$CFLAGS += ' -std=c99 -pedantic -Wall -Wextra -Wno-long-long' - -create_makefile 'digest/blake2b/sse' diff --git a/lib/digest/blake2b.rb b/lib/digest/blake2b.rb index fca0cf0..7a68ef3 100644 --- a/lib/digest/blake2b.rb +++ b/lib/digest/blake2b.rb @@ -1,10 +1,8 @@ # frozen_string_literal: true -require 'digest/blake2b/key' require 'digest/blake2b/version' -require 'digest/blake2b/impl' - -require "digest/blake2b/#{Digest::Blake2b::IMPL}" +require 'digest/blake2b/key' +require 'digest/blake2b/ext' module Digest class Blake2b diff --git a/lib/digest/blake2b/impl.rb b/lib/digest/blake2b/impl.rb deleted file mode 100644 index 79c50e7..0000000 --- a/lib/digest/blake2b/impl.rb +++ /dev/null @@ -1,11 +0,0 @@ -# frozen_string_literal: true - -module Digest - class Blake2b - if RUBY_PLATFORM =~ /^x86_64/ - IMPL = 'sse' - else - IMPL = 'ref' - end - end -end