secp256k1-ruby 0.4.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.
@@ -0,0 +1,103 @@
1
+ # -*- encoding : ascii-8bit -*-
2
+
3
+ $:.unshift File.expand_path('../../lib', __FILE__)
4
+
5
+ require 'minitest/autorun'
6
+ require 'secp256k1'
7
+
8
+ require 'json'
9
+
10
+ class MyECDSA < Secp256k1::BaseKey
11
+ include Secp256k1::Utils, Secp256k1::ECDSA
12
+
13
+ def initialize
14
+ super(nil, Secp256k1::ALL_FLAGS)
15
+ end
16
+ end
17
+
18
+ class Secp256k1Test < Minitest::Test
19
+ include Secp256k1
20
+
21
+ def test_ecdsa
22
+ vec = ecdsa_sig['vectors']
23
+ pk = PrivateKey.new
24
+
25
+ vec.each do |item|
26
+ seckey = Utils.decode_hex item['privkey']
27
+ msg32 = Utils.decode_hex item['msg']
28
+ sig = Utils.decode_hex(item['sig'])[0...-1]
29
+
30
+ pk.set_raw_privkey seckey
31
+
32
+ sig_raw = pk.ecdsa_sign msg32, raw: true
33
+ sig_check = pk.ecdsa_serialize sig_raw
34
+
35
+ assert_equal sig, sig_check
36
+ assert_equal sig_check, pk.ecdsa_serialize(pk.ecdsa_deserialize(sig_check))
37
+ end
38
+ end
39
+
40
+ def test_ecdsa_compact
41
+ pk = PrivateKey.new
42
+ raw_sig = pk.ecdsa_sign 'test'
43
+ assert_equal true, pk.pubkey.ecdsa_verify('test', raw_sig)
44
+
45
+ compact = pk.ecdsa_serialize_compact raw_sig
46
+ assert_equal 64, compact.size
47
+
48
+ sig_raw = pk.ecdsa_deserialize_compact compact
49
+ assert_equal compact, pk.ecdsa_serialize_compact(sig_raw)
50
+ assert_equal true, pk.pubkey.ecdsa_verify('test', sig_raw)
51
+ end
52
+
53
+ def test_ecdsa_normalize
54
+ pk = PrivateKey.new
55
+ raw_sig = pk.ecdsa_sign 'hi'
56
+
57
+ had_to_normalize, normsig = pk.ecdsa_signature_normalize raw_sig
58
+ assert_equal false, had_to_normalize
59
+ assert_equal pk.ecdsa_serialize(raw_sig), pk.ecdsa_serialize(normsig)
60
+ assert_equal pk.ecdsa_serialize_compact(raw_sig), pk.ecdsa_serialize_compact(normsig)
61
+
62
+ had_to_normalize, normsig = pk.ecdsa_signature_normalize(raw_sig, check_only: true)
63
+ assert_equal false, had_to_normalize
64
+ assert_equal nil, normsig
65
+
66
+ sig = "\xAA" + "\xFF"*31 + "\xAA" + "\xFF"*31
67
+ raw_sig = pk.ecdsa_deserialize_compact sig
68
+
69
+ normalized, normsig = pk.ecdsa_signature_normalize raw_sig
70
+ assert_equal true, normalized
71
+ assert pk.ecdsa_serialize(raw_sig) != pk.ecdsa_serialize(normsig)
72
+
73
+ normalized, normsig = pk.ecdsa_signature_normalize raw_sig, check_only: true
74
+ assert_equal true, normalized
75
+ assert_equal nil, normsig
76
+ end
77
+
78
+ def test_ecdsa_recover
79
+ pk = PrivateKey.new
80
+ unrelated = MyECDSA.new
81
+
82
+ recsig = pk.ecdsa_sign_recoverable 'hello'
83
+ pubkey = unrelated.ecdsa_recover 'hello', recsig
84
+ pubser = PublicKey.new(pubkey: pubkey).serialize
85
+ assert_equal pubser, pk.pubkey.serialize
86
+
87
+ recsig_ser = unrelated.ecdsa_recoverable_serialize recsig
88
+ recsig2 = unrelated.ecdsa_recoverable_deserialize *recsig_ser
89
+ pubkey2 = unrelated.ecdsa_recover 'hello', recsig2
90
+ pubser2 = PublicKey.new(pubkey: pubkey2).serialize
91
+ assert_equal pubser, pubser2
92
+
93
+ raw_sig = unrelated.ecdsa_recoverable_convert recsig2
94
+ unrelated.ecdsa_deserialize(unrelated.ecdsa_serialize(raw_sig))
95
+ end
96
+
97
+ private
98
+
99
+ def ecdsa_sig
100
+ @ecdsa_sig = JSON.parse File.read(File.expand_path('../fixtures/ecdsa_sig.json', __FILE__))
101
+ end
102
+
103
+ end
metadata ADDED
@@ -0,0 +1,136 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: secp256k1-ruby
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.4.0
5
+ platform: ruby
6
+ authors:
7
+ - Hajime Yamaguchi
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-01-05 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.15'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.15'
27
+ - !ruby/object:Gem::Dependency
28
+ name: minitest
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '='
32
+ - !ruby/object:Gem::Version
33
+ version: 5.8.3
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '='
39
+ - !ruby/object:Gem::Version
40
+ version: 5.8.3
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '10.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '10.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: yard
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '='
60
+ - !ruby/object:Gem::Version
61
+ version: 0.8.7.6
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '='
67
+ - !ruby/object:Gem::Version
68
+ version: 0.8.7.6
69
+ - !ruby/object:Gem::Dependency
70
+ name: ffi
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: 1.9.10
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: 1.9.10
83
+ description: Ruby binding to bitcoin's secp256k1 implementation.
84
+ email:
85
+ - gen.yamaguchi0@gmail.com
86
+ executables: []
87
+ extensions: []
88
+ extra_rdoc_files: []
89
+ files:
90
+ - ".gitignore"
91
+ - ".gitmodules"
92
+ - ".ruby-version"
93
+ - Gemfile
94
+ - Gemfile.lock
95
+ - LICENSE
96
+ - README.md
97
+ - Rakefile
98
+ - install_lib.sh
99
+ - lib/secp256k1.rb
100
+ - lib/secp256k1/c.rb
101
+ - lib/secp256k1/ecdsa.rb
102
+ - lib/secp256k1/key.rb
103
+ - lib/secp256k1/utils.rb
104
+ - lib/secp256k1/version.rb
105
+ - secp256k1-ruby.gemspec
106
+ - test/fixtures/ecdsa_sig.json
107
+ - test/fixtures/pubkey.json
108
+ - test/secp256k1_test.rb
109
+ homepage: https://github.com/Yamaguchi/secp256k1-ruby
110
+ licenses:
111
+ - MIT
112
+ metadata: {}
113
+ post_install_message:
114
+ rdoc_options: []
115
+ require_paths:
116
+ - lib
117
+ required_ruby_version: !ruby/object:Gem::Requirement
118
+ requirements:
119
+ - - ">="
120
+ - !ruby/object:Gem::Version
121
+ version: '0'
122
+ required_rubygems_version: !ruby/object:Gem::Requirement
123
+ requirements:
124
+ - - ">="
125
+ - !ruby/object:Gem::Version
126
+ version: '0'
127
+ requirements: []
128
+ rubyforge_project:
129
+ rubygems_version: 2.7.3
130
+ signing_key:
131
+ specification_version: 4
132
+ summary: Ruby binding to bitcoin's secp256k1 implementation.
133
+ test_files:
134
+ - test/fixtures/ecdsa_sig.json
135
+ - test/fixtures/pubkey.json
136
+ - test/secp256k1_test.rb