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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 664bd156e4290bfe01d6977508732cdaef1b950d0f1a5d632165106c4670f11a
4
- data.tar.gz: 392f665ea5dca923c1d05f4f7aa2b2b0fc4e853e115d8cf4a7b884ce335b1f83
3
+ metadata.gz: 1e61524cd89cbe401a0a8f1bec0c89b933083e42b6d6db81d3ec36d4065180c4
4
+ data.tar.gz: bc803b62b04aa54a348cf422d85a076cac60d960c9ad9eacdf355a1be5dafb6a
5
5
  SHA512:
6
- metadata.gz: 8daabe85e4c187b61fc65edb6dffb23ee6c6bbc68199521f8a2b4eafdec7c6d35c090a48941ef17748c1e87481771dbe4124d9c8ea6b5a6213f45da6b2cda481
7
- data.tar.gz: 6434d4681b9a4d500ec861315512cec3e1233a5f7afaf376f85a999875d23259b03b1405fd8907b47675bb106ce1499f3a06d70664c13ffb7ba3248d840e684d
6
+ metadata.gz: fd2e07ed2b0ea5e17c05ad35a635f7ac259116953135c948f1392a6be8c4d72fb3dbb77fa1ee92e24de07f7a4ed6bd13620b94844ab5f6a4adbf2ee4f69f750f
7
+ data.tar.gz: 54ca65c115efd9cf3aa8137986ed1be25d31e4bf9e74cc7cb8e586bcb0531adeaa3c2c63e8a868426e751411495197d81af8cdf5c306fdee522376c98dd13fa8
data/.gitignore CHANGED
@@ -9,7 +9,6 @@
9
9
  !/checksums/.keep
10
10
  /lib/**/*.bundle
11
11
  /lib/digest/blake2b/ext.so
12
- /lib/digest/blake2b/sse.so
13
12
 
14
13
  *.o
15
14
  *.gem
data/Gemfile CHANGED
@@ -4,3 +4,7 @@ source 'https://rubygems.org'
4
4
 
5
5
  # Specify your gem's dependencies in digest-blake2b.gemspec
6
6
  gemspec
7
+
8
+ gem 'minitest', require: false
9
+ gem 'rake', require: false
10
+ gem 'rake-compiler', require: false
data/Rakefile CHANGED
@@ -1,22 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'bundler/gem_tasks'
4
- require 'rake/testtask'
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 "digest/blake2b/#{Digest::Blake2b::IMPL}", spec do |ext|
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
- Rake::TestTask.new do |t|
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
 
@@ -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 = '>= 2.1', '< 4'
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[mauricio@edge14.com]
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
- 'homepage_uri' => 'https://github.com/kotovalexarian/digest-blake2b',
29
- 'source_code_uri' => 'https://github.com/kotovalexarian/digest-blake2b',
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").reject do |f|
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 << "ext/digest/blake2b/#{Digest::Blake2b::IMPL}/extconf.rb"
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,7 @@
1
+ #ifdef IMPL_REF
2
+ #include "ref/blake2b-ref.c"
3
+ #endif
4
+
5
+ #ifdef IMPL_SSE
6
+ #include "sse/blake2b-ref.c"
7
+ #endif
@@ -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 Init_sse() {
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
- #if defined(SUPERCOP)
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
- #if defined(BLAKE2B_SELFTEST)
313
+ #ifdef BLAKE2B_SELFTEST
314
314
  #include <string.h>
315
315
  #include "blake2-kat.h"
316
316
  int main( void )
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Digest
4
4
  class Blake2b
5
- VERSION = '0.0.4'
5
+ VERSION = '0.0.6'
6
6
  end
7
7
  end
@@ -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/impl'
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