digest-blake2b 0.0.4 → 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +0 -1
- data/Gemfile +4 -0
- data/Rakefile +3 -9
- data/digest-blake2b.gemspec +10 -16
- data/ext/digest/blake2b/ext/blake2b-ref.c +7 -0
- data/ext/digest/blake2b/ext/extconf.rb +14 -0
- data/ext/digest/blake2b/{sse → ext}/rbext.c +3 -2
- data/ext/digest/blake2b/{ref → ext/ref}/blake2b-ref.c +2 -2
- data/lib/digest/blake2b/version.rb +1 -1
- data/lib/digest/blake2b.rb +2 -4
- data/test/blake2/key_test.rb +42 -0
- data/test/blake2b_api_test.rb +74 -0
- data/test/blake2b_test.rb +25 -0
- data/test/blake2b_vector_test.rb +593 -0
- data/test/performance/blake2b_gc_test.rb +9 -0
- data/test/test_helper.rb +3 -0
- metadata +33 -83
- data/ext/digest/blake2b/ref/blake2-impl.h +0 -160
- data/ext/digest/blake2b/ref/blake2.h +0 -195
- data/ext/digest/blake2b/ref/extconf.rb +0 -7
- data/ext/digest/blake2b/ref/rbext.c +0 -111
- data/ext/digest/blake2b/sse/extconf.rb +0 -7
- data/lib/digest/blake2b/impl.rb +0 -11
- /data/ext/digest/blake2b/{sse → ext}/blake2-impl.h +0 -0
- /data/ext/digest/blake2b/{sse → ext}/blake2.h +0 -0
- /data/ext/digest/blake2b/{sse → ext/sse}/blake2-config.h +0 -0
- /data/ext/digest/blake2b/{sse → ext/sse}/blake2b-load-sse2.h +0 -0
- /data/ext/digest/blake2b/{sse → ext/sse}/blake2b-load-sse41.h +0 -0
- /data/ext/digest/blake2b/{sse → ext/sse}/blake2b-ref.c +0 -0
- /data/ext/digest/blake2b/{sse → ext/sse}/blake2b-round.h +0 -0
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 1e61524cd89cbe401a0a8f1bec0c89b933083e42b6d6db81d3ec36d4065180c4
|
|
4
|
+
data.tar.gz: bc803b62b04aa54a348cf422d85a076cac60d960c9ad9eacdf355a1be5dafb6a
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: fd2e07ed2b0ea5e17c05ad35a635f7ac259116953135c948f1392a6be8c4d72fb3dbb77fa1ee92e24de07f7a4ed6bd13620b94844ab5f6a4adbf2ee4f69f750f
|
|
7
|
+
data.tar.gz: 54ca65c115efd9cf3aa8137986ed1be25d31e4bf9e74cc7cb8e586bcb0531adeaa3c2c63e8a868426e751411495197d81af8cdf5c306fdee522376c98dd13fa8
|
data/.gitignore
CHANGED
data/Gemfile
CHANGED
data/Rakefile
CHANGED
|
@@ -1,22 +1,16 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
require 'bundler/gem_tasks'
|
|
4
|
-
require '
|
|
4
|
+
require 'minitest/test_task'
|
|
5
5
|
require 'rake/extensiontask'
|
|
6
6
|
|
|
7
7
|
spec = Gem::Specification.load('digest-blake2b.gemspec')
|
|
8
8
|
|
|
9
|
-
Rake::ExtensionTask.new
|
|
9
|
+
Rake::ExtensionTask.new 'digest/blake2b/ext', spec do |ext|
|
|
10
10
|
ext.source_pattern = '*.{c,h}'
|
|
11
|
-
ext.ext_dir = "ext/digest/blake2b/#{Digest::Blake2b::IMPL}"
|
|
12
11
|
end
|
|
13
12
|
|
|
14
|
-
|
|
15
|
-
t.libs << 'test'
|
|
16
|
-
t.pattern = 'test/**/*_test.rb'
|
|
17
|
-
t.verbose = true
|
|
18
|
-
t.warning = true
|
|
19
|
-
end
|
|
13
|
+
Minitest::TestTask.create
|
|
20
14
|
|
|
21
15
|
task default: :full
|
|
22
16
|
|
data/digest-blake2b.gemspec
CHANGED
|
@@ -4,7 +4,6 @@ lib = File.expand_path('lib', __dir__).freeze
|
|
|
4
4
|
$LOAD_PATH.unshift lib unless $LOAD_PATH.include? lib
|
|
5
5
|
|
|
6
6
|
require 'digest/blake2b/version'
|
|
7
|
-
require 'digest/blake2b/impl'
|
|
8
7
|
|
|
9
8
|
Gem::Specification.new do |spec|
|
|
10
9
|
spec.name = 'digest-blake2b'
|
|
@@ -14,10 +13,10 @@ Gem::Specification.new do |spec|
|
|
|
14
13
|
spec.summary = 'The BLAKE2b cryptographic hash function.'
|
|
15
14
|
spec.platform = Gem::Platform::RUBY
|
|
16
15
|
|
|
17
|
-
spec.required_ruby_version = '>=
|
|
16
|
+
spec.required_ruby_version = '>= 3.1', '< 4.1'
|
|
18
17
|
|
|
19
18
|
spec.authors = ['Alex Kotov', 'Franck Verrot', 'Mauricio Gomes']
|
|
20
|
-
spec.email = %w[
|
|
19
|
+
spec.email = %w[kotovalexarian@gmail.com]
|
|
21
20
|
|
|
22
21
|
spec.description = <<-DESCRIPTION.split.join ' '
|
|
23
22
|
BLAKE2b is a cryptographic hash function
|
|
@@ -25,8 +24,11 @@ Gem::Specification.new do |spec|
|
|
|
25
24
|
DESCRIPTION
|
|
26
25
|
|
|
27
26
|
spec.metadata = {
|
|
28
|
-
'
|
|
29
|
-
'
|
|
27
|
+
'rubygems_mfa_required' => 'true',
|
|
28
|
+
'homepage_uri' =>
|
|
29
|
+
'https://github.com/kotovalexarian/digest-blake2b',
|
|
30
|
+
'source_code_uri' =>
|
|
31
|
+
'https://github.com/kotovalexarian/digest-blake2b',
|
|
30
32
|
'bug_tracker_uri' =>
|
|
31
33
|
'https://github.com/kotovalexarian/digest-blake2b/issues',
|
|
32
34
|
}.freeze
|
|
@@ -34,18 +36,10 @@ Gem::Specification.new do |spec|
|
|
|
34
36
|
spec.bindir = 'exe'
|
|
35
37
|
spec.require_paths = ['lib']
|
|
36
38
|
|
|
37
|
-
spec.files = `git ls-files -z`.split("\x0")
|
|
38
|
-
f.match %r{^(test|spec|features)/}
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
spec.test_files = spec.files.grep %r{^(test|spec|features)/}
|
|
39
|
+
spec.files = `git ls-files -z`.split("\x0")
|
|
42
40
|
|
|
43
41
|
spec.executables = spec.files.grep %r{^exe/}, &File.method(:basename)
|
|
42
|
+
spec.test_files = spec.files.grep %r{^(test|spec|features)/}
|
|
44
43
|
|
|
45
|
-
spec.extensions <<
|
|
46
|
-
|
|
47
|
-
spec.add_development_dependency 'bundler' , '~> 2.2'
|
|
48
|
-
spec.add_development_dependency 'minitest' , '~> 5.11'
|
|
49
|
-
spec.add_development_dependency 'rake' , '~> 13.0'
|
|
50
|
-
spec.add_development_dependency 'rake-compiler', '~> 0.9'
|
|
44
|
+
spec.extensions << 'ext/digest/blake2b/ext/extconf.rb'
|
|
51
45
|
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'mkmf'
|
|
4
|
+
|
|
5
|
+
$CFLAGS += ' -std=c99 -pedantic -Wall -Wextra'
|
|
6
|
+
|
|
7
|
+
if RUBY_PLATFORM =~ /^x86_64/
|
|
8
|
+
$CPPFLAGS += ' -DIMPL_SSE'
|
|
9
|
+
$CFLAGS += ' -Wno-long-long'
|
|
10
|
+
else
|
|
11
|
+
$CPPFLAGS += ' -DIMPL_REF'
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
create_makefile 'digest/blake2b/ext'
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
#include "blake2.h"
|
|
2
|
+
|
|
1
3
|
#include <ruby/ruby.h>
|
|
2
4
|
#include <ruby/encoding.h>
|
|
3
|
-
#include "blake2.h"
|
|
4
5
|
|
|
5
6
|
typedef struct {
|
|
6
7
|
size_t key_length;
|
|
@@ -100,7 +101,7 @@ VALUE m_blake2_digest(VALUE self, VALUE _input, VALUE _representation) {
|
|
|
100
101
|
return result;
|
|
101
102
|
}
|
|
102
103
|
|
|
103
|
-
void
|
|
104
|
+
void Init_ext() {
|
|
104
105
|
mDigest = rb_define_module("Digest");
|
|
105
106
|
|
|
106
107
|
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 *
|
|
|
303
303
|
return blake2b(out, outlen, in, inlen, key, keylen);
|
|
304
304
|
}
|
|
305
305
|
|
|
306
|
-
#
|
|
306
|
+
#ifdef SUPERCOP
|
|
307
307
|
int crypto_hash( unsigned char *out, unsigned char *in, unsigned long long inlen )
|
|
308
308
|
{
|
|
309
309
|
return blake2b( out, BLAKE2B_OUTBYTES, in, inlen, NULL, 0 );
|
|
310
310
|
}
|
|
311
311
|
#endif
|
|
312
312
|
|
|
313
|
-
#
|
|
313
|
+
#ifdef BLAKE2B_SELFTEST
|
|
314
314
|
#include <string.h>
|
|
315
315
|
#include "blake2-kat.h"
|
|
316
316
|
int main( void )
|
data/lib/digest/blake2b.rb
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require 'digest/blake2b/key'
|
|
4
3
|
require 'digest/blake2b/version'
|
|
5
|
-
require 'digest/blake2b/
|
|
6
|
-
|
|
7
|
-
require "digest/blake2b/#{Digest::Blake2b::IMPL}"
|
|
4
|
+
require 'digest/blake2b/key'
|
|
5
|
+
require 'digest/blake2b/ext'
|
|
8
6
|
|
|
9
7
|
module Digest
|
|
10
8
|
class Blake2b
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
class KeyTest < Minitest::Test
|
|
4
|
+
def test_none
|
|
5
|
+
key = Digest::Blake2b::Key.none
|
|
6
|
+
assert_equal [], key.bytes
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def test_from_string
|
|
10
|
+
key = Digest::Blake2b::Key.from_string('foo bar baz')
|
|
11
|
+
assert_equal [102, 111, 111, 32, 98, 97, 114, 32, 98, 97, 122], key.bytes
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def test_from_string_raises_on_non_ascii_string
|
|
15
|
+
assert_raises(ArgumentError) { Digest::Blake2b::Key.from_string('💩') }
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def test_from_hex
|
|
19
|
+
key = Digest::Blake2b::Key.from_hex('DEADBEAF')
|
|
20
|
+
assert_equal [222, 173, 190, 175], key.bytes
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def test_from_hex_raises_on_non_hex_string
|
|
24
|
+
assert_raises(ArgumentError) { Digest::Blake2b::Key.from_hex('DEADBEAFZZ') }
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def test_from_bytes_hex
|
|
28
|
+
key = Digest::Blake2b::Key.from_bytes([0xDE, 0xAD, 0xBE, 0xAF])
|
|
29
|
+
assert_equal [222, 173, 190, 175], key.bytes
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def test_from_bytes_int
|
|
33
|
+
key = Digest::Blake2b::Key.from_bytes([222, 173, 190, 175])
|
|
34
|
+
assert_equal [222, 173, 190, 175], key.bytes
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def test_from_hex_raises_on_non_valid_byte_array
|
|
38
|
+
assert_raises(ArgumentError) { Digest::Blake2b::Key.from_bytes([-1]) }
|
|
39
|
+
assert_raises(ArgumentError) { Digest::Blake2b::Key.from_bytes([256]) }
|
|
40
|
+
assert_raises(ArgumentError) { Digest::Blake2b::Key.from_bytes(['foo']) }
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
class Blake2bTest < Minitest::Test
|
|
4
|
+
def test_hex_with_input_only
|
|
5
|
+
res = Digest::Blake2b.hex('abc')
|
|
6
|
+
assert_kind_of String, res
|
|
7
|
+
assert_equal 'bddd813c634239723171ef3fee98579b94964e3bb1cb3e427262c8c068d52319', res
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def test_hex_with_input_and_key
|
|
11
|
+
res = Digest::Blake2b.hex('abc', Digest::Blake2b::Key.none)
|
|
12
|
+
assert_kind_of String, res
|
|
13
|
+
assert_equal 'bddd813c634239723171ef3fee98579b94964e3bb1cb3e427262c8c068d52319', res
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# From the computation in the RFC
|
|
17
|
+
# https://tools.ietf.org/html/rfc7693#appendix-A
|
|
18
|
+
def test_hex_with_input_key_and_length
|
|
19
|
+
res = Digest::Blake2b.hex('abc', Digest::Blake2b::Key.none, 64)
|
|
20
|
+
assert_kind_of String, res
|
|
21
|
+
assert_equal 'ba80a53f981c4d0d6a2797b69f12f6e94c212f14685ac4b74b12bb6fdbffa2d17d87c5392aab792dc252d5de4533cc9518d38aa8dbf1925ab92386edd4009923', res
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def test_hex_with_blank_input_key_and_length
|
|
25
|
+
res = Digest::Blake2b.hex('', Digest::Blake2b::Key.none, 64)
|
|
26
|
+
assert_kind_of String, res
|
|
27
|
+
assert_equal '786a02f742015903c6c6fd852552d272912f4740e15847618a86e217f71f5419d25e1031afee585313896444934eb04b903a685b1448b755d56f701afe9be2ce', res
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def test_hex_with_known_input_key_and_length
|
|
31
|
+
res = Digest::Blake2b.hex('The quick brown fox jumps over the lazy dog', Digest::Blake2b::Key.none, 64)
|
|
32
|
+
assert_kind_of String, res
|
|
33
|
+
assert_equal 'a8add4bdddfd93e4877d2746e62817b116364a1fa7bc148d95090bc7333b3673f82401cf7aa2e4cb1ecd90296e3f14cb5413f8ed77be73045b13914cdcd6a918', res
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def test_bytes_with_input_only
|
|
37
|
+
res = Digest::Blake2b.bytes('abc')
|
|
38
|
+
assert_kind_of Array, res
|
|
39
|
+
assert_equal [189, 221, 129, 60, 99, 66, 57, 114, 49, 113, 239, 63, 238, 152, 87, 155, 148, 150, 78, 59, 177, 203, 62, 66, 114, 98, 200, 192, 104, 213, 35, 25], res
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def test_bytes_with_input_and_key
|
|
43
|
+
res = Digest::Blake2b.bytes('abc', Digest::Blake2b::Key.none)
|
|
44
|
+
assert_kind_of Array, res
|
|
45
|
+
assert_equal [189, 221, 129, 60, 99, 66, 57, 114, 49, 113, 239, 63, 238, 152, 87, 155, 148, 150, 78, 59, 177, 203, 62, 66, 114, 98, 200, 192, 104, 213, 35, 25], res
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def test_bytes_with_input_key_and_length
|
|
49
|
+
res = Digest::Blake2b.bytes('abc', Digest::Blake2b::Key.none, 32)
|
|
50
|
+
assert_kind_of Array, res
|
|
51
|
+
assert_equal [189, 221, 129, 60, 99, 66, 57, 114, 49, 113, 239, 63, 238, 152, 87, 155, 148, 150, 78, 59, 177, 203, 62, 66, 114, 98, 200, 192, 104, 213, 35, 25], res
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def test_input_raises_on_non_string
|
|
55
|
+
assert_raises(ArgumentError) { Digest::Blake2b.hex(nil) }
|
|
56
|
+
assert_raises(ArgumentError) { Digest::Blake2b.bytes(nil) }
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def test_key_raises_on_non_key
|
|
60
|
+
assert_raises(ArgumentError) { Digest::Blake2b.hex('abc', []) }
|
|
61
|
+
assert_raises(ArgumentError) { Digest::Blake2b.bytes('abc', []) }
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def test_length_raises_on_invalid
|
|
65
|
+
assert_raises(ArgumentError) { Digest::Blake2b.hex('abc', Digest::Blake2b::Key.none, -1) }
|
|
66
|
+
assert_raises(ArgumentError) { Digest::Blake2b.hex('abc', Digest::Blake2b::Key.none, 0) }
|
|
67
|
+
assert_raises(ArgumentError) { Digest::Blake2b.hex('abc', Digest::Blake2b::Key.none, 65) }
|
|
68
|
+
assert_raises(ArgumentError) { Digest::Blake2b.hex('abc', Digest::Blake2b::Key.none, '32') }
|
|
69
|
+
assert_raises(ArgumentError) { Digest::Blake2b.bytes('abc', Digest::Blake2b::Key.none, -1) }
|
|
70
|
+
assert_raises(ArgumentError) { Digest::Blake2b.bytes('abc', Digest::Blake2b::Key.none, 0) }
|
|
71
|
+
assert_raises(ArgumentError) { Digest::Blake2b.bytes('abc', Digest::Blake2b::Key.none, 65) }
|
|
72
|
+
assert_raises(ArgumentError) { Digest::Blake2b.bytes('abc', Digest::Blake2b::Key.none, '32') }
|
|
73
|
+
end
|
|
74
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
class Blake2bTest < Minitest::Test
|
|
4
|
+
def setup
|
|
5
|
+
out_len = 64
|
|
6
|
+
key = Digest::Blake2b::Key.from_string('foo bar baz')
|
|
7
|
+
|
|
8
|
+
@digestor = Digest::Blake2b.new(out_len, key)
|
|
9
|
+
|
|
10
|
+
@input = 'The quick brown fox jumps over the lazy dog'
|
|
11
|
+
@expected = '2c2d3abee08b19d67e4de4e953bbe0dba2f9e878f61e087191d00cf459a173281d93b0e28ea5303fe488312178dd7603d45b8d09311affe4aaa9a467cae3c9ef'
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def test_to_hex
|
|
15
|
+
res = @digestor.digest(@input, :to_hex)
|
|
16
|
+
assert_kind_of String, res
|
|
17
|
+
assert_equal @expected, res
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def test_to_bytes
|
|
21
|
+
res = @digestor.digest(@input, :to_bytes)
|
|
22
|
+
assert_kind_of Array, res
|
|
23
|
+
assert_equal [@expected].pack('H*').bytes, res
|
|
24
|
+
end
|
|
25
|
+
end
|