Fix reference C implementation build on ARM
This commit is contained in:
parent
7884781701
commit
d31a9cf9c7
21 changed files with 30 additions and 504 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -9,7 +9,6 @@
|
|||
!/checksums/.keep
|
||||
/lib/**/*.bundle
|
||||
/lib/digest/blake2b/ext.so
|
||||
/lib/digest/blake2b/sse.so
|
||||
|
||||
*.o
|
||||
*.gem
|
||||
|
|
3
Rakefile
3
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|
|
||||
|
|
|
@ -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'
|
||||
|
|
7
ext/digest/blake2b/ext/blake2b-ref.c
Normal file
7
ext/digest/blake2b/ext/blake2b-ref.c
Normal file
|
@ -0,0 +1,7 @@
|
|||
#ifdef IMPL_REF
|
||||
#include "ref/blake2b-ref.c"
|
||||
#endif
|
||||
|
||||
#ifdef IMPL_SSE
|
||||
#include "sse/blake2b-ref.c"
|
||||
#endif
|
14
ext/digest/blake2b/ext/extconf.rb
Normal file
14
ext/digest/blake2b/ext/extconf.rb
Normal file
|
@ -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'
|
|
@ -1,6 +1,7 @@
|
|||
#include "blake2.h"
|
||||
|
||||
#include <ruby/ruby.h>
|
||||
#include <ruby/encoding.h>
|
||||
#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);
|
|
@ -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 <string.h>
|
||||
#include "blake2-kat.h"
|
||||
int main( void )
|
|
@ -1,160 +0,0 @@
|
|||
/*
|
||||
BLAKE2 reference source code package - reference C implementations
|
||||
|
||||
Copyright 2012, Samuel Neves <sneves@dei.uc.pt>. 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 <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 )( 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
|
|
@ -1,195 +0,0 @@
|
|||
/*
|
||||
BLAKE2 reference source code package - reference C implementations
|
||||
|
||||
Copyright 2012, Samuel Neves <sneves@dei.uc.pt>. 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 <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 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
|
|
@ -1,7 +0,0 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'mkmf'
|
||||
|
||||
$CFLAGS += ' -std=c99 -pedantic -Wall -Wextra'
|
||||
|
||||
create_makefile 'digest/blake2b/ref'
|
|
@ -1,111 +0,0 @@
|
|||
#include <ruby/ruby.h>
|
||||
#include <ruby/encoding.h>
|
||||
#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);
|
||||
}
|
|
@ -1,7 +0,0 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'mkmf'
|
||||
|
||||
$CFLAGS += ' -std=c99 -pedantic -Wall -Wextra -Wno-long-long'
|
||||
|
||||
create_makefile 'digest/blake2b/sse'
|
|
@ -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
|
||||
|
|
|
@ -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
|
Loading…
Reference in a new issue