blake2 0.2.0 → 0.5.0
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
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/.travis.yml +3 -0
- data/CHANGELOG.md +13 -1
- data/README.md +70 -16
- data/Rakefile +35 -7
- data/bin/console +7 -0
- data/bin/setup +6 -0
- data/blake2.gemspec +11 -8
- data/checksums/0.3.0.sha512 +1 -0
- data/ext/blake2_ext/blake2-impl.h +15 -12
- data/ext/blake2_ext/blake2.h +46 -49
- data/ext/blake2_ext/blake2s-ref.c +38 -16
- data/ext/blake2_ext/rbext.c +18 -10
- data/lib/blake2.rb +27 -0
- data/lib/blake2/key.rb +40 -8
- metadata +35 -24
- metadata.gz.sig +0 -0
- data/test/blake2/key_test.rb +0 -18
- data/test/blake2_test.rb +0 -25
- data/test/test_helper.rb +0 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ebb3461da94a57c4dd9ebeaed5555d4b11b0d720
|
4
|
+
data.tar.gz: 3784c55e622aa55dd12d07b5e7eb95c3271e73cb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c55e7c376319578fe76410cb85dfa2f0e9c32d071292e27100bf12c4e963928fe8c38dda15375d83e5f4554485e150100fa1bd2ce3a72e2957bccf6b296011c8
|
7
|
+
data.tar.gz: 21b309d84d0195f062452c086857fc387be0a928ca5234a029ee083eb8a62c00089e65f98da8516bc06bfd64701f720f380daec4412cd6796398a9f764562359
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,18 @@
|
|
1
1
|
# Releases
|
2
2
|
|
3
|
-
##
|
3
|
+
## 0.5.0
|
4
|
+
|
5
|
+
* Locked development dependencies in the gemspec
|
6
|
+
|
7
|
+
## 0.4.0 (yanked)
|
8
|
+
|
9
|
+
* Signed commits and tags
|
10
|
+
* I (Franck) changed my PGP key since 0.3.0
|
11
|
+
|
12
|
+
## 0.3.0 (yanked)
|
13
|
+
|
14
|
+
* Another pass at memory leaks
|
15
|
+
* Performance non-regression tests
|
4
16
|
|
5
17
|
## 0.2.0
|
6
18
|
|
data/README.md
CHANGED
@@ -1,36 +1,90 @@
|
|
1
|
-
#
|
1
|
+
# BLAKE2s for Ruby
|
2
2
|
|
3
3
|
## SUMMARY
|
4
4
|
|
5
|
-
This gem is a C-extension for using
|
5
|
+
This gem is a C-extension for using BLAKE2s in Ruby.
|
6
6
|
|
7
|
-
|
7
|
+
>BLAKE2 comes in two basic flavors:
|
8
|
+
>
|
9
|
+
>BLAKE2b (or just BLAKE2) is optimized for 64-bit platforms and
|
10
|
+
>produces digests of any size between 1 and 64 bytes.
|
11
|
+
>
|
12
|
+
>BLAKE2s is optimized for 8- to 32-bit platforms and produces
|
13
|
+
>digests of any size between 1 and 32 bytes.
|
14
|
+
>
|
15
|
+
>Both BLAKE2b and BLAKE2s are believed to be highly secure and perform
|
16
|
+
>well on any platform, software, or hardware. BLAKE2 does not require
|
17
|
+
>a special "HMAC" (Hashed Message Authentication Code) construction
|
18
|
+
>for keyed message authentication as it has a built-in keying
|
19
|
+
>mechanism.
|
20
|
+
>
|
21
|
+
>[https://tools.ietf.org/html/rfc7693#page-3](https://tools.ietf.org/html/rfc7693#page-3)
|
8
22
|
|
9
|
-
|
23
|
+
This implementation supports the BLAKE2s variant with 32 Bytes of output.
|
24
|
+
|
25
|
+
The C code for this gem is taken from the [official reference C implementation](https://github.com/BLAKE2/BLAKE2)
|
26
|
+
as of commit `02bf34f3d49c205812c34dfce9123a7c74509605`.
|
27
|
+
|
28
|
+
For a detailed explanation about BLAKE2s, [here's the offical website](https://blake2.net/).
|
10
29
|
|
11
|
-
|
30
|
+
## INSTALL
|
12
31
|
|
32
|
+
```
|
33
|
+
gem install blake2
|
34
|
+
```
|
13
35
|
|
14
36
|
## USAGE
|
15
37
|
|
16
|
-
|
17
|
-
|
18
|
-
|
38
|
+
``` ruby
|
39
|
+
require 'blake2'
|
40
|
+
|
41
|
+
# The UTF-8 String (Required) that you want to digest.
|
42
|
+
input = 'abc'
|
43
|
+
|
44
|
+
# The main application of keyed BLAKE2 is as a message authentication code (MAC)
|
45
|
+
# By default `Blake2::Key.none` is used.
|
46
|
+
key = Blake2::Key.none
|
47
|
+
# key = Blake2::Key.from_string("foo bar baz")
|
48
|
+
# key = Blake2::Key.from_hex('DEADBEAF')
|
49
|
+
# key = Blake2::Key.from_bytes([222, 173, 190, 175])
|
50
|
+
|
51
|
+
# The output length in Bytes of the Hash, Max and Default is 32.
|
52
|
+
out_len = 32
|
53
|
+
|
54
|
+
# HEX OUTPUT
|
55
|
+
############
|
56
|
+
|
57
|
+
Blake2.hex(input)
|
58
|
+
=> "508c5e8c327c14e2e1a72ba34eeb452f37458b209ed63a294d999b4c86675982"
|
59
|
+
|
60
|
+
Blake2.hex(input, key)
|
61
|
+
=> "508c5e8c327c14e2e1a72ba34eeb452f37458b209ed63a294d999b4c86675982"
|
62
|
+
|
63
|
+
Blake2.hex(input, key, out_len)
|
64
|
+
=> "508c5e8c327c14e2e1a72ba34eeb452f37458b209ed63a294d999b4c86675982"
|
65
|
+
|
66
|
+
# BYTES OUTPUT
|
67
|
+
##############
|
19
68
|
|
20
|
-
|
69
|
+
Blake2.bytes(input)
|
70
|
+
=> [80, 140, 94, ...]
|
21
71
|
|
22
|
-
|
23
|
-
|
72
|
+
Blake2.bytes(input, key)
|
73
|
+
=> [80, 140, 94, ...]
|
24
74
|
|
75
|
+
Blake2.bytes(input, key, out_len)
|
76
|
+
=> [80, 140, 94, ...]
|
25
77
|
|
26
|
-
|
78
|
+
```
|
27
79
|
|
28
|
-
|
80
|
+
## DEVELOPMENT
|
29
81
|
|
30
|
-
|
82
|
+
After checking out the repo, run `bin/setup` to install dependencies. Then,
|
83
|
+
run `rake full` to build and test, or `rake test` to only run the tests.
|
84
|
+
You can also run `bin/console` for an interactive prompt that will allow you
|
85
|
+
to experiment.
|
31
86
|
|
32
|
-
|
33
|
-
* [ ] Improve controls/type checks in the `digest` methods
|
87
|
+
To install this gem onto your local machine, run `bundle exec rake install`.
|
34
88
|
|
35
89
|
## CONTRIBUTE
|
36
90
|
|
data/Rakefile
CHANGED
@@ -1,18 +1,46 @@
|
|
1
|
+
require 'bundler/gem_tasks'
|
2
|
+
require 'rake/testtask'
|
1
3
|
require 'rake/extensiontask'
|
4
|
+
|
2
5
|
spec = Gem::Specification.load('blake2.gemspec')
|
6
|
+
|
3
7
|
Rake::ExtensionTask.new('blake2_ext', spec) do |ext|
|
4
|
-
ext.source_pattern =
|
8
|
+
ext.source_pattern = '*.{c,h}'
|
5
9
|
end
|
6
10
|
|
7
|
-
require 'rake/testtask'
|
8
11
|
Rake::TestTask.new do |t|
|
9
|
-
t.libs <<
|
10
|
-
t.pattern =
|
12
|
+
t.libs << 'test'
|
13
|
+
t.pattern = 'test/**/*_test.rb'
|
11
14
|
t.verbose = true
|
12
15
|
t.warning = true
|
13
16
|
end
|
14
17
|
|
15
|
-
task :
|
18
|
+
task default: :full
|
19
|
+
|
20
|
+
desc 'clean, compile, and run the full test suite'
|
21
|
+
task full: %w(clean compile test)
|
16
22
|
|
17
|
-
|
18
|
-
|
23
|
+
def gemspec
|
24
|
+
@gemspec ||= begin
|
25
|
+
file = File.expand_path('../blake2.gemspec', __FILE__)
|
26
|
+
eval(File.read(file), binding, file)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
desc "Validate the gemspec"
|
31
|
+
task :gemspec do
|
32
|
+
gemspec.validate
|
33
|
+
end
|
34
|
+
|
35
|
+
desc "Build the gem"
|
36
|
+
task :gem => [:gemspec, :build] do
|
37
|
+
mkdir_p "pkg"
|
38
|
+
sh "gem build blake2.gemspec"
|
39
|
+
mv "#{gemspec.full_name}.gem", "pkg"
|
40
|
+
|
41
|
+
require 'digest/sha2'
|
42
|
+
built_gem_path = "pkg/#{gemspec.full_name}.gem"
|
43
|
+
checksum = Digest::SHA512.new.hexdigest(File.read(built_gem_path))
|
44
|
+
checksum_path = "checksums/#{gemspec.version}.sha512"
|
45
|
+
File.open(checksum_path, 'w' ) {|f| f.write(checksum) }
|
46
|
+
end
|
data/bin/console
ADDED
data/bin/setup
ADDED
data/blake2.gemspec
CHANGED
@@ -1,25 +1,28 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
Gem::Specification.new do |spec|
|
3
3
|
spec.name = "blake2"
|
4
|
-
spec.version = "0.
|
4
|
+
spec.version = "0.5.0"
|
5
5
|
spec.authors = ["Franck Verrot"]
|
6
6
|
spec.email = ["franck@verrot.fr"]
|
7
7
|
spec.homepage = "https://github.com/franckverrot/blake2"
|
8
|
-
spec.license = "
|
8
|
+
spec.license = "GPL-3.0"
|
9
9
|
|
10
10
|
spec.summary = "BLAKE2 - fast secure hashing - for Ruby"
|
11
|
-
spec.
|
12
|
-
spec.
|
11
|
+
spec.required_ruby_version = ">= 2.1.0"
|
12
|
+
spec.description = "BLAKE2 is a C-extension for using BLAKE2s in Ruby"
|
13
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
14
|
+
spec.bindir = "bin"
|
13
15
|
|
14
16
|
spec.extensions << "ext/blake2_ext/extconf.rb"
|
15
17
|
|
16
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
17
19
|
spec.require_paths = ["lib"]
|
18
20
|
|
19
|
-
spec.add_development_dependency "rake-compiler"
|
20
|
-
spec.add_development_dependency "bundler", "~> 1.5"
|
21
|
-
spec.add_development_dependency "rake"
|
22
|
-
spec.add_development_dependency "minitest"
|
21
|
+
spec.add_development_dependency "rake-compiler", "~> 0.9"
|
22
|
+
spec.add_development_dependency "bundler" , "~> 1.5"
|
23
|
+
spec.add_development_dependency "rake" , "~> 11.1"
|
24
|
+
spec.add_development_dependency "minitest" , "~> 5.8"
|
25
|
+
spec.add_development_dependency "pry" , "~> 0.10"
|
23
26
|
|
24
27
|
spec.cert_chain = ['certs/franckverrot.pem']
|
25
28
|
spec.signing_key = File.expand_path(ENV['RUBYGEMS_CERT_PATH']) if $0 =~ /gem\z/
|
@@ -0,0 +1 @@
|
|
1
|
+
db9a73c5bb1baea243f4b690023d2a990b2bbb5e5a9ab032b6f844cef9dfe8cb534bf2d121993e986518caeedb7263d67b1c7d9693739b234118f46ba4ae4df1
|
@@ -1,20 +1,23 @@
|
|
1
1
|
/*
|
2
2
|
BLAKE2 reference source code package - reference C implementations
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
3
|
+
|
4
|
+
Copyright 2012, Samuel Neves <sneves@dei.uc.pt>. You may use this under the
|
5
|
+
terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at
|
6
|
+
your option. The terms of these licenses can be found at:
|
7
|
+
|
8
|
+
- CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0
|
9
|
+
- OpenSSL license : https://www.openssl.org/source/license.html
|
10
|
+
- Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
|
12
|
+
More information about the BLAKE2 hash function can be found at
|
13
|
+
https://blake2.net.
|
12
14
|
*/
|
13
15
|
#pragma once
|
14
16
|
#ifndef __BLAKE2_IMPL_H__
|
15
17
|
#define __BLAKE2_IMPL_H__
|
16
18
|
|
17
19
|
#include <stdint.h>
|
20
|
+
#include <string.h>
|
18
21
|
|
19
22
|
static inline uint32_t load32( const void *src )
|
20
23
|
{
|
@@ -126,10 +129,10 @@ static inline uint64_t rotr64( const uint64_t w, const unsigned c )
|
|
126
129
|
}
|
127
130
|
|
128
131
|
/* prevents compiler optimizing out memset() */
|
129
|
-
static inline void secure_zero_memory(
|
132
|
+
static inline void secure_zero_memory(void *v, size_t n)
|
130
133
|
{
|
131
|
-
|
132
|
-
|
134
|
+
static void *(*const volatile memset_v)(void *, int, size_t) = &memset;
|
135
|
+
memset_v(v, 0, n);
|
133
136
|
}
|
134
137
|
|
135
138
|
#endif
|
data/ext/blake2_ext/blake2.h
CHANGED
@@ -1,14 +1,16 @@
|
|
1
1
|
/*
|
2
2
|
BLAKE2 reference source code package - reference C implementations
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
3
|
+
|
4
|
+
Copyright 2012, Samuel Neves <sneves@dei.uc.pt>. You may use this under the
|
5
|
+
terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at
|
6
|
+
your option. The terms of these licenses can be found at:
|
7
|
+
|
8
|
+
- CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0
|
9
|
+
- OpenSSL license : https://www.openssl.org/source/license.html
|
10
|
+
- Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
|
12
|
+
More information about the BLAKE2 hash function can be found at
|
13
|
+
https://blake2.net.
|
12
14
|
*/
|
13
15
|
#pragma once
|
14
16
|
#ifndef __BLAKE2_H__
|
@@ -17,12 +19,6 @@
|
|
17
19
|
#include <stddef.h>
|
18
20
|
#include <stdint.h>
|
19
21
|
|
20
|
-
#if defined(_MSC_VER)
|
21
|
-
#define ALIGN(x) __declspec(align(x))
|
22
|
-
#else
|
23
|
-
#define ALIGN(x) __attribute__((aligned(x)))
|
24
|
-
#endif
|
25
|
-
|
26
22
|
#if defined(__cplusplus)
|
27
23
|
extern "C" {
|
28
24
|
#endif
|
@@ -45,23 +41,7 @@ extern "C" {
|
|
45
41
|
BLAKE2B_PERSONALBYTES = 16
|
46
42
|
};
|
47
43
|
|
48
|
-
|
49
|
-
typedef struct __blake2s_param
|
50
|
-
{
|
51
|
-
uint8_t digest_length; // 1
|
52
|
-
uint8_t key_length; // 2
|
53
|
-
uint8_t fanout; // 3
|
54
|
-
uint8_t depth; // 4
|
55
|
-
uint32_t leaf_length; // 8
|
56
|
-
uint8_t node_offset[6];// 14
|
57
|
-
uint8_t node_depth; // 15
|
58
|
-
uint8_t inner_length; // 16
|
59
|
-
// uint8_t reserved[0];
|
60
|
-
uint8_t salt[BLAKE2S_SALTBYTES]; // 24
|
61
|
-
uint8_t personal[BLAKE2S_PERSONALBYTES]; // 32
|
62
|
-
} blake2s_param;
|
63
|
-
|
64
|
-
ALIGN( 64 ) typedef struct __blake2s_state
|
44
|
+
typedef struct __blake2s_state
|
65
45
|
{
|
66
46
|
uint32_t h[8];
|
67
47
|
uint32_t t[2];
|
@@ -69,24 +49,9 @@ extern "C" {
|
|
69
49
|
uint8_t buf[2 * BLAKE2S_BLOCKBYTES];
|
70
50
|
size_t buflen;
|
71
51
|
uint8_t last_node;
|
72
|
-
} blake2s_state
|
73
|
-
|
74
|
-
typedef struct __blake2b_param
|
75
|
-
{
|
76
|
-
uint8_t digest_length; // 1
|
77
|
-
uint8_t key_length; // 2
|
78
|
-
uint8_t fanout; // 3
|
79
|
-
uint8_t depth; // 4
|
80
|
-
uint32_t leaf_length; // 8
|
81
|
-
uint64_t node_offset; // 16
|
82
|
-
uint8_t node_depth; // 17
|
83
|
-
uint8_t inner_length; // 18
|
84
|
-
uint8_t reserved[14]; // 32
|
85
|
-
uint8_t salt[BLAKE2B_SALTBYTES]; // 48
|
86
|
-
uint8_t personal[BLAKE2B_PERSONALBYTES]; // 64
|
87
|
-
} blake2b_param;
|
52
|
+
} blake2s_state;
|
88
53
|
|
89
|
-
|
54
|
+
typedef struct __blake2b_state
|
90
55
|
{
|
91
56
|
uint64_t h[8];
|
92
57
|
uint64_t t[2];
|
@@ -111,6 +76,38 @@ extern "C" {
|
|
111
76
|
uint8_t buf[4 * BLAKE2B_BLOCKBYTES];
|
112
77
|
size_t buflen;
|
113
78
|
} blake2bp_state;
|
79
|
+
|
80
|
+
|
81
|
+
#pragma pack(push, 1)
|
82
|
+
typedef struct __blake2s_param
|
83
|
+
{
|
84
|
+
uint8_t digest_length; // 1
|
85
|
+
uint8_t key_length; // 2
|
86
|
+
uint8_t fanout; // 3
|
87
|
+
uint8_t depth; // 4
|
88
|
+
uint32_t leaf_length; // 8
|
89
|
+
uint8_t node_offset[6];// 14
|
90
|
+
uint8_t node_depth; // 15
|
91
|
+
uint8_t inner_length; // 16
|
92
|
+
// uint8_t reserved[0];
|
93
|
+
uint8_t salt[BLAKE2S_SALTBYTES]; // 24
|
94
|
+
uint8_t personal[BLAKE2S_PERSONALBYTES]; // 32
|
95
|
+
} blake2s_param;
|
96
|
+
|
97
|
+
typedef struct __blake2b_param
|
98
|
+
{
|
99
|
+
uint8_t digest_length; // 1
|
100
|
+
uint8_t key_length; // 2
|
101
|
+
uint8_t fanout; // 3
|
102
|
+
uint8_t depth; // 4
|
103
|
+
uint32_t leaf_length; // 8
|
104
|
+
uint64_t node_offset; // 16
|
105
|
+
uint8_t node_depth; // 17
|
106
|
+
uint8_t inner_length; // 18
|
107
|
+
uint8_t reserved[14]; // 32
|
108
|
+
uint8_t salt[BLAKE2B_SALTBYTES]; // 48
|
109
|
+
uint8_t personal[BLAKE2B_PERSONALBYTES]; // 64
|
110
|
+
} blake2b_param;
|
114
111
|
#pragma pack(pop)
|
115
112
|
|
116
113
|
// Streaming API
|
@@ -1,14 +1,16 @@
|
|
1
1
|
/*
|
2
2
|
BLAKE2 reference source code package - reference C implementations
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
3
|
+
|
4
|
+
Copyright 2012, Samuel Neves <sneves@dei.uc.pt>. You may use this under the
|
5
|
+
terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at
|
6
|
+
your option. The terms of these licenses can be found at:
|
7
|
+
|
8
|
+
- CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0
|
9
|
+
- OpenSSL license : https://www.openssl.org/source/license.html
|
10
|
+
- Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
|
12
|
+
More information about the BLAKE2 hash function can be found at
|
13
|
+
https://blake2.net.
|
12
14
|
*/
|
13
15
|
|
14
16
|
#include <stdint.h>
|
@@ -40,22 +42,27 @@ static const uint8_t blake2s_sigma[10][16] =
|
|
40
42
|
|
41
43
|
static inline int blake2s_set_lastnode( blake2s_state *S )
|
42
44
|
{
|
43
|
-
S->f[1] =
|
45
|
+
S->f[1] = -1;
|
44
46
|
return 0;
|
45
47
|
}
|
46
48
|
|
47
49
|
static inline int blake2s_clear_lastnode( blake2s_state *S )
|
48
50
|
{
|
49
|
-
S->f[1] =
|
51
|
+
S->f[1] = 0;
|
50
52
|
return 0;
|
51
53
|
}
|
52
54
|
|
53
55
|
/* Some helper functions, not necessarily useful */
|
56
|
+
static inline int blake2s_is_lastblock( const blake2s_state *S )
|
57
|
+
{
|
58
|
+
return S->f[0] != 0;
|
59
|
+
}
|
60
|
+
|
54
61
|
static inline int blake2s_set_lastblock( blake2s_state *S )
|
55
62
|
{
|
56
63
|
if( S->last_node ) blake2s_set_lastnode( S );
|
57
64
|
|
58
|
-
S->f[0] =
|
65
|
+
S->f[0] = -1;
|
59
66
|
return 0;
|
60
67
|
}
|
61
68
|
|
@@ -63,7 +70,7 @@ static inline int blake2s_clear_lastblock( blake2s_state *S )
|
|
63
70
|
{
|
64
71
|
if( S->last_node ) blake2s_clear_lastnode( S );
|
65
72
|
|
66
|
-
S->f[0] =
|
73
|
+
S->f[0] = 0;
|
67
74
|
return 0;
|
68
75
|
}
|
69
76
|
|
@@ -301,9 +308,13 @@ int blake2s_final( blake2s_state *S, uint8_t *out, uint8_t outlen )
|
|
301
308
|
{
|
302
309
|
uint8_t buffer[BLAKE2S_OUTBYTES] = {0};
|
303
310
|
|
304
|
-
if( outlen > BLAKE2S_OUTBYTES )
|
311
|
+
if( out == NULL || outlen == 0 || outlen > BLAKE2S_OUTBYTES )
|
312
|
+
return -1;
|
313
|
+
|
314
|
+
if( blake2s_is_lastblock( S ) )
|
305
315
|
return -1;
|
306
316
|
|
317
|
+
|
307
318
|
if( S->buflen > BLAKE2S_BLOCKBYTES )
|
308
319
|
{
|
309
320
|
blake2s_increment_counter( S, BLAKE2S_BLOCKBYTES );
|
@@ -329,11 +340,15 @@ int blake2s( uint8_t *out, const void *in, const void *key, const uint8_t outlen
|
|
329
340
|
blake2s_state S[1];
|
330
341
|
|
331
342
|
/* Verify parameters */
|
332
|
-
if ( NULL == in ) return -1;
|
343
|
+
if ( NULL == in && inlen > 0 ) return -1;
|
333
344
|
|
334
345
|
if ( NULL == out ) return -1;
|
335
346
|
|
336
|
-
if ( NULL == key
|
347
|
+
if ( NULL == key && keylen > 0) return -1;
|
348
|
+
|
349
|
+
if( !outlen || outlen > BLAKE2S_OUTBYTES ) return -1;
|
350
|
+
|
351
|
+
if( keylen > BLAKE2S_KEYBYTES ) return -1;
|
337
352
|
|
338
353
|
if( keylen > 0 )
|
339
354
|
{
|
@@ -349,6 +364,13 @@ int blake2s( uint8_t *out, const void *in, const void *key, const uint8_t outlen
|
|
349
364
|
return 0;
|
350
365
|
}
|
351
366
|
|
367
|
+
#if defined(SUPERCOP)
|
368
|
+
int crypto_hash( unsigned char *out, unsigned char *in, unsigned long long inlen )
|
369
|
+
{
|
370
|
+
return blake2s( out, in, NULL, BLAKE2S_OUTBYTES, inlen, 0 );
|
371
|
+
}
|
372
|
+
#endif
|
373
|
+
|
352
374
|
#if defined(BLAKE2S_SELFTEST)
|
353
375
|
#include <string.h>
|
354
376
|
#include "blake2-kat.h"
|
data/ext/blake2_ext/rbext.c
CHANGED
@@ -18,15 +18,19 @@ VALUE cBlake2;
|
|
18
18
|
static void blake2_free(Blake2 *blake2) {
|
19
19
|
if(blake2->key_length > 0) {
|
20
20
|
ruby_xfree(blake2->key_bytes);
|
21
|
+
blake2->key_length = 0;
|
21
22
|
}
|
22
23
|
|
23
24
|
if(blake2->output_length > 0) {
|
24
25
|
ruby_xfree(blake2->output);
|
26
|
+
blake2->output_length = 0;
|
25
27
|
}
|
28
|
+
|
29
|
+
free(blake2);
|
26
30
|
}
|
27
31
|
|
28
|
-
VALUE blake2_alloc(VALUE klass) {
|
29
|
-
|
32
|
+
static VALUE blake2_alloc(VALUE klass) {
|
33
|
+
Blake2 *blake2_obj = (Blake2 *)malloc(sizeof(Blake2));
|
30
34
|
|
31
35
|
return Data_Wrap_Struct(klass, NULL, blake2_free, blake2_obj);
|
32
36
|
}
|
@@ -59,7 +63,7 @@ VALUE m_blake2_initialize(VALUE self, VALUE _len, VALUE _key) {
|
|
59
63
|
VALUE m_blake2_digest(VALUE self, VALUE _input, VALUE _representation) {
|
60
64
|
Blake2 *blake2;
|
61
65
|
|
62
|
-
char *
|
66
|
+
char *input = RSTRING_PTR(_input);
|
63
67
|
int input_length = RSTRING_LEN(_input);
|
64
68
|
int i;
|
65
69
|
|
@@ -76,23 +80,27 @@ VALUE m_blake2_digest(VALUE self, VALUE _input, VALUE _representation) {
|
|
76
80
|
for(i = 0; i < blake2->output_length; i++) {
|
77
81
|
rb_ary_push(result, INT2NUM(blake2->output[i]));
|
78
82
|
}
|
79
|
-
|
80
|
-
return result;
|
81
83
|
} else if(_representation == blake2->to_hex) {
|
82
|
-
|
84
|
+
int ary_len = blake2->output_length * sizeof(char) * 2;
|
85
|
+
char *c_str = (char*)malloc(ary_len + 1);
|
83
86
|
|
84
87
|
for(i = 0; i < blake2->output_length; i++) {
|
85
88
|
sprintf(c_str + (i * 2), "%02x", blake2->output[i]);
|
86
89
|
}
|
90
|
+
c_str[ary_len] = 0;
|
87
91
|
|
88
|
-
result =
|
92
|
+
result = rb_str_new(c_str, ary_len);
|
89
93
|
|
90
|
-
|
94
|
+
if(RSTRING_LEN(result) != ary_len) {
|
95
|
+
rb_raise(rb_eRuntimeError, "m_blake2_digest: sizes don't match. Ary: %d != %d", RSTRING_LEN(result), ary_len);
|
96
|
+
}
|
91
97
|
|
92
|
-
|
98
|
+
free(c_str);
|
93
99
|
} else {
|
94
|
-
rb_raise(rb_eArgError, "
|
100
|
+
rb_raise(rb_eArgError, "unknown representation :%"PRIsVALUE"", _representation);
|
95
101
|
}
|
102
|
+
|
103
|
+
return result;
|
96
104
|
}
|
97
105
|
|
98
106
|
void Init_blake2_ext() {
|
data/lib/blake2.rb
CHANGED
@@ -1,2 +1,29 @@
|
|
1
1
|
require 'blake2_ext'
|
2
2
|
require 'blake2/key'
|
3
|
+
|
4
|
+
class Blake2
|
5
|
+
def self.hex(input, key = Blake2::Key.none, out_len = 32)
|
6
|
+
check_if_valid!(input, key, out_len)
|
7
|
+
Blake2.new(out_len, key).digest(input, :to_hex)
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.bytes(input, key = Blake2::Key.none, out_len = 32)
|
11
|
+
check_if_valid!(input, key, out_len)
|
12
|
+
Blake2.new(out_len, key).digest(input, :to_bytes)
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.check_if_valid!(input, key, out_len)
|
16
|
+
unless input.is_a?(String)
|
17
|
+
raise ArgumentError, 'input arg must be a String'
|
18
|
+
end
|
19
|
+
|
20
|
+
unless key.is_a?(Blake2::Key)
|
21
|
+
raise ArgumentError, 'key arg must be a Blake2::Key'
|
22
|
+
end
|
23
|
+
|
24
|
+
unless out_len.is_a?(Integer) && out_len.between?(1, 32)
|
25
|
+
raise ArgumentError, 'out_len arg must be an Integer between 1 and 32 inclusive'
|
26
|
+
end
|
27
|
+
end
|
28
|
+
private_class_method :check_if_valid!
|
29
|
+
end
|
data/lib/blake2/key.rb
CHANGED
@@ -1,23 +1,55 @@
|
|
1
1
|
class Blake2
|
2
|
+
# Validate and normalize an HMAC key, provided in different formats,
|
3
|
+
# into an Array of Integer Bytes.
|
2
4
|
class Key
|
3
|
-
|
4
|
-
@bytes
|
5
|
-
end
|
5
|
+
attr_reader :bytes
|
6
6
|
|
7
7
|
def initialize(bytes)
|
8
8
|
@bytes = bytes
|
9
9
|
end
|
10
10
|
|
11
|
+
# Create a blank Key
|
12
|
+
#
|
13
|
+
# @return [Blake2::Key] a Blake2::Key object with a `bytes` attr
|
14
|
+
def self.none
|
15
|
+
new([])
|
16
|
+
end
|
17
|
+
|
18
|
+
# Create a key from an ASCII String
|
19
|
+
#
|
20
|
+
# @param str [String] an ASCII String key
|
21
|
+
# @return [Blake2::Key] a Blake2::Key object with a `bytes` attr
|
11
22
|
def self.from_string(str)
|
12
|
-
|
23
|
+
if str.is_a?(String) && str.ascii_only?
|
24
|
+
new(str.bytes)
|
25
|
+
else
|
26
|
+
raise ArgumentError, 'key must be an ASCII String'
|
27
|
+
end
|
13
28
|
end
|
14
29
|
|
15
|
-
|
16
|
-
|
30
|
+
# Create a key from a Hex String [a-fA-F0-9]
|
31
|
+
#
|
32
|
+
# @param str [String] a Hex String key
|
33
|
+
# @return [Blake2::Key] a Blake2::Key object with a `bytes` attr
|
34
|
+
def self.from_hex(str)
|
35
|
+
if str.is_a?(String) && str.match(/^[a-fA-F0-9]+$/)
|
36
|
+
new([str].pack('H*').bytes)
|
37
|
+
else
|
38
|
+
raise ArgumentError, 'key must be a Hex String [a-fA-F0-9]'
|
39
|
+
end
|
17
40
|
end
|
18
41
|
|
19
|
-
|
20
|
-
|
42
|
+
# Create a key from Array of Integer (0-255) Bytes.
|
43
|
+
# This simply validates and passes through the Array.
|
44
|
+
#
|
45
|
+
# @param str [Array] an Array of Integer (0-255) Bytes
|
46
|
+
# @return [Blake2::Key] a Blake2::Key object with a `bytes` attr
|
47
|
+
def self.from_bytes(bytes)
|
48
|
+
if bytes.all? { |b| b.is_a?(Integer) && b.between?(0, 255) }
|
49
|
+
new(bytes)
|
50
|
+
else
|
51
|
+
raise ArgumentError, 'key must be a Byte Array of Integers (0-255)'
|
52
|
+
end
|
21
53
|
end
|
22
54
|
end
|
23
55
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: blake2
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Franck Verrot
|
@@ -30,22 +30,22 @@ cert_chain:
|
|
30
30
|
Z7BoH/Mfxw3P4yyir173p9JWvVqLiQE13XBeD13NPA8neoWpLJxm6k03PcTElT/E
|
31
31
|
QrOSgKrHAb/fFJma
|
32
32
|
-----END CERTIFICATE-----
|
33
|
-
date: 2016-05-
|
33
|
+
date: 2016-05-15 00:00:00.000000000 Z
|
34
34
|
dependencies:
|
35
35
|
- !ruby/object:Gem::Dependency
|
36
36
|
name: rake-compiler
|
37
37
|
requirement: !ruby/object:Gem::Requirement
|
38
38
|
requirements:
|
39
|
-
- - "
|
39
|
+
- - "~>"
|
40
40
|
- !ruby/object:Gem::Version
|
41
|
-
version: '0'
|
41
|
+
version: '0.9'
|
42
42
|
type: :development
|
43
43
|
prerelease: false
|
44
44
|
version_requirements: !ruby/object:Gem::Requirement
|
45
45
|
requirements:
|
46
|
-
- - "
|
46
|
+
- - "~>"
|
47
47
|
- !ruby/object:Gem::Version
|
48
|
-
version: '0'
|
48
|
+
version: '0.9'
|
49
49
|
- !ruby/object:Gem::Dependency
|
50
50
|
name: bundler
|
51
51
|
requirement: !ruby/object:Gem::Requirement
|
@@ -64,31 +64,45 @@ dependencies:
|
|
64
64
|
name: rake
|
65
65
|
requirement: !ruby/object:Gem::Requirement
|
66
66
|
requirements:
|
67
|
-
- - "
|
67
|
+
- - "~>"
|
68
68
|
- !ruby/object:Gem::Version
|
69
|
-
version: '
|
69
|
+
version: '11.1'
|
70
70
|
type: :development
|
71
71
|
prerelease: false
|
72
72
|
version_requirements: !ruby/object:Gem::Requirement
|
73
73
|
requirements:
|
74
|
-
- - "
|
74
|
+
- - "~>"
|
75
75
|
- !ruby/object:Gem::Version
|
76
|
-
version: '
|
76
|
+
version: '11.1'
|
77
77
|
- !ruby/object:Gem::Dependency
|
78
78
|
name: minitest
|
79
79
|
requirement: !ruby/object:Gem::Requirement
|
80
80
|
requirements:
|
81
|
-
- - "
|
81
|
+
- - "~>"
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: '5.8'
|
84
|
+
type: :development
|
85
|
+
prerelease: false
|
86
|
+
version_requirements: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - "~>"
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: '5.8'
|
91
|
+
- !ruby/object:Gem::Dependency
|
92
|
+
name: pry
|
93
|
+
requirement: !ruby/object:Gem::Requirement
|
94
|
+
requirements:
|
95
|
+
- - "~>"
|
82
96
|
- !ruby/object:Gem::Version
|
83
|
-
version: '0'
|
97
|
+
version: '0.10'
|
84
98
|
type: :development
|
85
99
|
prerelease: false
|
86
100
|
version_requirements: !ruby/object:Gem::Requirement
|
87
101
|
requirements:
|
88
|
-
- - "
|
102
|
+
- - "~>"
|
89
103
|
- !ruby/object:Gem::Version
|
90
|
-
version: '0'
|
91
|
-
description: BLAKE2 -
|
104
|
+
version: '0.10'
|
105
|
+
description: BLAKE2 is a C-extension for using BLAKE2s in Ruby
|
92
106
|
email:
|
93
107
|
- franck@verrot.fr
|
94
108
|
executables: []
|
@@ -103,9 +117,12 @@ files:
|
|
103
117
|
- LICENSE.txt
|
104
118
|
- README.md
|
105
119
|
- Rakefile
|
120
|
+
- bin/console
|
121
|
+
- bin/setup
|
106
122
|
- blake2.gemspec
|
107
123
|
- certs/franckverrot.pem
|
108
124
|
- checksums/0.1.0.sha512
|
125
|
+
- checksums/0.3.0.sha512
|
109
126
|
- ext/blake2_ext/blake2-impl.h
|
110
127
|
- ext/blake2_ext/blake2.h
|
111
128
|
- ext/blake2_ext/blake2s-ref.c
|
@@ -113,12 +130,9 @@ files:
|
|
113
130
|
- ext/blake2_ext/rbext.c
|
114
131
|
- lib/blake2.rb
|
115
132
|
- lib/blake2/key.rb
|
116
|
-
- test/blake2/key_test.rb
|
117
|
-
- test/blake2_test.rb
|
118
|
-
- test/test_helper.rb
|
119
133
|
homepage: https://github.com/franckverrot/blake2
|
120
134
|
licenses:
|
121
|
-
-
|
135
|
+
- GPL-3.0
|
122
136
|
metadata: {}
|
123
137
|
post_install_message:
|
124
138
|
rdoc_options: []
|
@@ -128,7 +142,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
128
142
|
requirements:
|
129
143
|
- - ">="
|
130
144
|
- !ruby/object:Gem::Version
|
131
|
-
version:
|
145
|
+
version: 2.1.0
|
132
146
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
133
147
|
requirements:
|
134
148
|
- - ">="
|
@@ -140,7 +154,4 @@ rubygems_version: 2.6.4
|
|
140
154
|
signing_key:
|
141
155
|
specification_version: 4
|
142
156
|
summary: BLAKE2 - fast secure hashing - for Ruby
|
143
|
-
test_files:
|
144
|
-
- test/blake2/key_test.rb
|
145
|
-
- test/blake2_test.rb
|
146
|
-
- test/test_helper.rb
|
157
|
+
test_files: []
|
metadata.gz.sig
CHANGED
Binary file
|
data/test/blake2/key_test.rb
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
class KeyTest < MiniTest::Test
|
4
|
-
def test_from_string
|
5
|
-
key = Blake2::Key.from_string("foo bar baz")
|
6
|
-
assert_equal [102, 111, 111, 32, 98, 97, 114, 32, 98, 97, 122], key.bytes
|
7
|
-
end
|
8
|
-
|
9
|
-
def test_none
|
10
|
-
key = Blake2::Key.none
|
11
|
-
assert_equal [], key.bytes
|
12
|
-
end
|
13
|
-
|
14
|
-
def test_from_hex
|
15
|
-
key = Blake2::Key.from_hex("DEADBEAF")
|
16
|
-
assert_equal [0XDE, 0xAD, 0xBE, 0xAF], key.bytes
|
17
|
-
end
|
18
|
-
end
|
data/test/blake2_test.rb
DELETED
@@ -1,25 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
class Blake2Test < MiniTest::Test
|
4
|
-
def setup
|
5
|
-
out_len = 32
|
6
|
-
key = Blake2::Key.from_string("foo bar baz") # or `Key.none`, or `Key.from_hex("0xDEADBEAF")`
|
7
|
-
|
8
|
-
@digestor = Blake2.new(out_len, key)
|
9
|
-
|
10
|
-
@input = "hello world"
|
11
|
-
@expected = "95670379036532875f58bf23fbcb549675b656bd639a6124a614ccd8a980b180"
|
12
|
-
end
|
13
|
-
|
14
|
-
def test_to_hex
|
15
|
-
res = @digestor.digest(@input, :to_hex) # => 9567...b180
|
16
|
-
assert_kind_of String, res
|
17
|
-
assert_equal @expected, res
|
18
|
-
end
|
19
|
-
|
20
|
-
def to_bytes
|
21
|
-
res = @digestor.digest(@input, :to_bytes) # => [0x95, 0x67, <28 bytes later...>, 0xb1, 0x80]
|
22
|
-
assert_kind_of Array, res
|
23
|
-
assert_equal @expected.pack("H*").bytes, res
|
24
|
-
end
|
25
|
-
end
|