blake2 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,3 @@
1
+ require 'mkmf'
2
+ $CFLAGS += ' -std=c99'
3
+ create_makefile 'blake2_ext'
@@ -0,0 +1,92 @@
1
+ #include <ruby/ruby.h>
2
+ #include <ruby/encoding.h>
3
+ #include "blake2.h"
4
+
5
+ typedef struct {
6
+ uint8_t key_length;
7
+ uint8_t *key;
8
+
9
+ uint8_t output_length;
10
+ uint8_t *output;
11
+ } Blake2;
12
+
13
+ void _hexdump(char * data, int len)
14
+ {
15
+ int i;
16
+ for (i = 0; i < len; i++) {
17
+ printf("%02X", (unsigned char)data[i]);
18
+ }
19
+ printf("\n");
20
+ }
21
+
22
+ static void blake2_free(Blake2 *blake2) {
23
+ rb_gc_mark(blake2->key);
24
+ }
25
+
26
+ static VALUE blake2_alloc(VALUE klass) {
27
+ return Data_Wrap_Struct(klass, NULL, blake2_free, ruby_xmalloc(sizeof(Blake2)));
28
+ }
29
+
30
+ VALUE m_blake2_initialize(VALUE self, VALUE _len, VALUE _key) {
31
+ Blake2 *blake2;
32
+ Data_Get_Struct(self, Blake2, blake2);
33
+
34
+ blake2->key = _key;
35
+ blake2->output_length = NUM2INT(_len);
36
+ blake2->output = (uint8_t*)ruby_xmalloc(blake2->output_length * sizeof(uint8_t));
37
+
38
+ return Qnil;
39
+ }
40
+
41
+ VALUE m_blake2_digest(VALUE self, VALUE _input, VALUE _representation) {
42
+ Blake2 *blake2;
43
+
44
+ VALUE to_hex = ID2SYM(rb_intern("to_hex"));
45
+ VALUE to_bytes = ID2SYM(rb_intern("to_bytes"));
46
+
47
+ char * input = RSTRING_PTR(_input);
48
+ int input_length = RSTRING_LEN(_input);
49
+ int i;
50
+
51
+ Data_Get_Struct(self, Blake2, blake2);
52
+
53
+ ID bytes_method = rb_intern("bytes");
54
+ VALUE bytes_ary = rb_funcall(blake2->key, bytes_method, 0);
55
+ int key_len = RARRAY_LEN(bytes_ary);
56
+
57
+ uint8_t * key_bytes = (uint8_t*)ruby_xmalloc(key_len * sizeof(uint8_t));
58
+
59
+ for(i = 0; i < key_len; i++) {
60
+ VALUE byte = rb_ary_entry(bytes_ary, i);
61
+ key_bytes[i] = NUM2INT(byte);
62
+ }
63
+
64
+ blake2s(blake2->output, input, key_bytes,
65
+ blake2->output_length, input_length, key_len);
66
+
67
+ if(_representation == to_bytes) {
68
+ VALUE result = rb_ary_new2(blake2->output_length);
69
+
70
+ for(i = 0; i < blake2->output_length; i++) {
71
+ rb_ary_push(result, INT2NUM(blake2->output[i]));
72
+ }
73
+
74
+ return result;
75
+ } else if(_representation == to_hex) {
76
+ char * c_str = (char*)ruby_xmalloc(blake2->output_length * sizeof(char) * 2);
77
+
78
+ for(i = 0; i < blake2->output_length; i++) {
79
+ sprintf(c_str + (i * 2), "%02x", blake2->output[i]);
80
+ }
81
+ return rb_str_new2(c_str);
82
+ } else {
83
+ rb_raise(rb_eArgError, "Unknown representation", _representation);
84
+ }
85
+ }
86
+ void Init_blake2_ext() {
87
+ VALUE blake2 = rb_define_class("Blake2", rb_cObject);
88
+ rb_define_alloc_func(blake2, blake2_alloc);
89
+
90
+ rb_define_private_method(blake2 , "initialize", RUBY_METHOD_FUNC(m_blake2_initialize), 2);
91
+ rb_define_method(blake2 , "digest", RUBY_METHOD_FUNC(m_blake2_digest), 2);
92
+ }
@@ -0,0 +1,2 @@
1
+ require 'blake2_ext'
2
+ require 'blake2/key'
@@ -0,0 +1,23 @@
1
+ class Blake2
2
+ class Key
3
+ def bytes
4
+ @bytes
5
+ end
6
+
7
+ def initialize(bytes)
8
+ @bytes = bytes
9
+ end
10
+
11
+ def self.from_string(str)
12
+ new(@bytes = str.bytes)
13
+ end
14
+
15
+ def self.from_hex(hex_str)
16
+ new(@bytes = [hex_str].pack("H*").bytes)
17
+ end
18
+
19
+ def self.none
20
+ new(@bytes = [])
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,18 @@
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
@@ -0,0 +1,25 @@
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
@@ -0,0 +1,11 @@
1
+ require 'minitest/autorun'
2
+ require 'minitest/assertions'
3
+ require 'pp'
4
+
5
+ class Array
6
+ def hd
7
+ self.each.map { |b| sprintf("%X", b) }.join
8
+ end
9
+ end
10
+
11
+ require 'blake2'
metadata ADDED
@@ -0,0 +1,147 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: blake2
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Franck Verrot
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain:
11
+ - |
12
+ -----BEGIN CERTIFICATE-----
13
+ MIIDaDCCAlCgAwIBAgIBATANBgkqhkiG9w0BAQUFADA9MQ8wDQYDVQQDDAZmcmFu
14
+ Y2sxFjAUBgoJkiaJk/IsZAEZFgZ2ZXJyb3QxEjAQBgoJkiaJk/IsZAEZFgJmcjAe
15
+ Fw0xNDA5MDcwODE4MDRaFw0xNTA5MDcwODE4MDRaMD0xDzANBgNVBAMMBmZyYW5j
16
+ azEWMBQGCgmSJomT8ixkARkWBnZlcnJvdDESMBAGCgmSJomT8ixkARkWAmZyMIIB
17
+ IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAw8Sqy/b4OzhODXkAqv/Ve7hp
18
+ oH5irjrS20ebbzWqefcHCybwqcmePUs4BtWnGMkGl+fe4Dxfh55m7EXbmbcLBqPJ
19
+ 3Q5bqIgXqmkzHU6oBpkY/fdcP0dLyYBTAo8jZsx6XE1NoC5MBFfHQ8GFzEox7ca7
20
+ eoRPETTFkrlOU8fQQvRMZV8cO9XbzX8PFsJ9iE7CSrZ3+78oFBrj+WslkdU/pR5g
21
+ CYU7eNmWPBbJsgWy9T63K4QkwMElJRvlge3dzAZBEktaxdbiPTQeBtLugIZV2nWA
22
+ mNVMXQ9FzDeSFEhm3ICMuSjJdyEsl9/Su6WFFDaRW4ntRzThdh0+Zs5YEz3+swID
23
+ AQABo3MwcTAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUjJzR97Cw
24
+ I8juLYc/MgodFZPIVYkwGwYDVR0RBBQwEoEQZnJhbmNrQHZlcnJvdC5mcjAbBgNV
25
+ HRIEFDASgRBmcmFuY2tAdmVycm90LmZyMA0GCSqGSIb3DQEBBQUAA4IBAQAkNGfg
26
+ 9ysYJi/jrQ25GWgN3uJuvlscFYGPVmuyyOfsgm2NAkAV5Kn/rbeYxRecIRBU7HcZ
27
+ yVrHFaF36omjo5QIvNDNszHj4b/bwcW30QG0nNqzQlMTvAcsI9kwrDgoAd7qnSmb
28
+ Udf49ZrzniqaFR7OiBia2oXrYynD8Q4mRMzLTMdtdf8oy69DjCrrpzQvEcfHnxML
29
+ MY7zkhoLIwqbZ+/yfSm26+3h91WoEKEdK+caiHotdq1goqlBDIsLSR65siB2yna3
30
+ UeH0jxnbT6lYw622u74Z7Dd6iQfaOy1h+iJxnCQglf70rs9bS665Nr0QvvrbW8Hz
31
+ Vr/YT3S8RkdBsIdM
32
+ -----END CERTIFICATE-----
33
+ date: 2014-10-05 00:00:00.000000000 Z
34
+ dependencies:
35
+ - !ruby/object:Gem::Dependency
36
+ name: rake-compiler
37
+ requirement: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ type: :development
43
+ prerelease: false
44
+ version_requirements: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ - !ruby/object:Gem::Dependency
50
+ name: bundler
51
+ requirement: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - "~>"
54
+ - !ruby/object:Gem::Version
55
+ version: '1.5'
56
+ type: :development
57
+ prerelease: false
58
+ version_requirements: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - "~>"
61
+ - !ruby/object:Gem::Version
62
+ version: '1.5'
63
+ - !ruby/object:Gem::Dependency
64
+ name: rake
65
+ requirement: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ - !ruby/object:Gem::Dependency
78
+ name: minitest
79
+ requirement: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ type: :development
85
+ prerelease: false
86
+ version_requirements: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ description: BLAKE2 - fast secure hashing - for Ruby
92
+ email:
93
+ - franck@verrot.fr
94
+ executables: []
95
+ extensions:
96
+ - ext/blake2_ext/extconf.rb
97
+ extra_rdoc_files: []
98
+ files:
99
+ - ".gitignore"
100
+ - ".travis.yml"
101
+ - CHANGELOG.md
102
+ - Gemfile
103
+ - LICENSE.txt
104
+ - README.md
105
+ - Rakefile
106
+ - blake2.gemspec
107
+ - certs/franckverrot.pem
108
+ - checksums/0.1.0.sha512
109
+ - ext/blake2_ext/blake2-impl.h
110
+ - ext/blake2_ext/blake2.h
111
+ - ext/blake2_ext/blake2s-ref.c
112
+ - ext/blake2_ext/extconf.rb
113
+ - ext/blake2_ext/rbext.c
114
+ - lib/blake2.rb
115
+ - lib/blake2/key.rb
116
+ - test/blake2/key_test.rb
117
+ - test/blake2_test.rb
118
+ - test/test_helper.rb
119
+ homepage: https://github.com/franckverrot/blake2
120
+ licenses:
121
+ - GPLv3
122
+ metadata: {}
123
+ post_install_message:
124
+ rdoc_options: []
125
+ require_paths:
126
+ - lib
127
+ required_ruby_version: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ required_rubygems_version: !ruby/object:Gem::Requirement
133
+ requirements:
134
+ - - ">="
135
+ - !ruby/object:Gem::Version
136
+ version: '0'
137
+ requirements: []
138
+ rubyforge_project:
139
+ rubygems_version: 2.2.0
140
+ signing_key:
141
+ specification_version: 4
142
+ 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
147
+ has_rdoc:
@@ -0,0 +1 @@
1
+ i�;�ڭ�1�=��0��*`I����@������<� �G�\f-���qNO�/��ᜯ\q�my�DICwZCL����{���F�5J1\��]q2� ��=�W�����+�®�}�j7����6�xR�?q8��a`m�=�)WR(�\��*k�¥�ze��qj��HFF��Ԋ%�����ϙ�:��s�];�^1m��T�ю^0��¹��-���k��b���eI�-�)�*R�v�()L{�Z.���Uۋҗ