ruby-bitcoin-secp256k1 0.5.2

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,112 @@
1
+ # -*- encoding : ascii-8bit -*-
2
+
3
+ $:.unshift File.expand_path('../../lib', __FILE__)
4
+
5
+ require 'minitest/autorun'
6
+ require 'bitcoin_secp256k1'
7
+
8
+ require 'json'
9
+
10
+ class MyECDSA < BitcoinSecp256k1::BaseKey
11
+ include BitcoinSecp256k1::Utils, BitcoinSecp256k1::ECDSA
12
+
13
+ def initialize
14
+ super(nil, BitcoinSecp256k1::ALL_FLAGS)
15
+ end
16
+ end
17
+
18
+ class BitcoinSecp256k1Test < Minitest::Test
19
+ include BitcoinSecp256k1
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_verity
41
+ pk = PrivateKey.new
42
+ raw_sig = pk.ecdsa_sign 'test'
43
+ assert pk.pubkey.ecdsa_verify('test', raw_sig)
44
+ assert !pk.pubkey.ecdsa_verify('testtest', raw_sig)
45
+ end
46
+
47
+ def test_ecdsa_compact
48
+ pk = PrivateKey.new
49
+ raw_sig = pk.ecdsa_sign 'test'
50
+ assert_equal true, pk.pubkey.ecdsa_verify('test', raw_sig)
51
+
52
+ compact = pk.ecdsa_serialize_compact raw_sig
53
+ assert_equal 64, compact.size
54
+
55
+ sig_raw = pk.ecdsa_deserialize_compact compact
56
+ assert_equal compact, pk.ecdsa_serialize_compact(sig_raw)
57
+ assert_equal true, pk.pubkey.ecdsa_verify('test', sig_raw)
58
+ end
59
+
60
+ def test_ecdsa_normalize
61
+ pk = PrivateKey.new
62
+ raw_sig = pk.ecdsa_sign 'hi'
63
+
64
+ had_to_normalize, normsig = pk.ecdsa_signature_normalize raw_sig
65
+ assert_equal false, had_to_normalize
66
+ assert_equal pk.ecdsa_serialize(raw_sig), pk.ecdsa_serialize(normsig)
67
+ assert_equal pk.ecdsa_serialize_compact(raw_sig), pk.ecdsa_serialize_compact(normsig)
68
+
69
+ had_to_normalize, normsig = pk.ecdsa_signature_normalize(raw_sig, check_only: true)
70
+ assert_equal false, had_to_normalize
71
+ assert_nil normsig
72
+
73
+ sig = "\xAA" + "\xFF"*31 + "\xAA" + "\xFF"*31
74
+ raw_sig = pk.ecdsa_deserialize_compact sig
75
+
76
+ normalized, normsig = pk.ecdsa_signature_normalize raw_sig
77
+ assert_equal true, normalized
78
+ assert pk.ecdsa_serialize(raw_sig) != pk.ecdsa_serialize(normsig)
79
+
80
+ normalized, normsig = pk.ecdsa_signature_normalize raw_sig, check_only: true
81
+ assert_equal true, normalized
82
+ assert_nil normsig
83
+ end
84
+
85
+ def test_ecdsa_recover
86
+ return unless C.module_recovery_enabled?
87
+
88
+ pk = PrivateKey.new
89
+ unrelated = MyECDSA.new
90
+
91
+ recsig = pk.ecdsa_sign_recoverable 'hello'
92
+ pubkey = unrelated.ecdsa_recover 'hello', recsig
93
+ pubser = PublicKey.new(pubkey: pubkey).serialize
94
+ assert_equal pubser, pk.pubkey.serialize
95
+
96
+ recsig_ser = unrelated.ecdsa_recoverable_serialize recsig
97
+ recsig2 = unrelated.ecdsa_recoverable_deserialize(*recsig_ser)
98
+ pubkey2 = unrelated.ecdsa_recover 'hello', recsig2
99
+ pubser2 = PublicKey.new(pubkey: pubkey2).serialize
100
+ assert_equal pubser, pubser2
101
+
102
+ raw_sig = unrelated.ecdsa_recoverable_convert recsig2
103
+ unrelated.ecdsa_deserialize(unrelated.ecdsa_serialize(raw_sig))
104
+ end
105
+
106
+ private
107
+
108
+ def ecdsa_sig
109
+ @ecdsa_sig = JSON.parse File.read(File.expand_path('../fixtures/ecdsa_sig.json', __FILE__))
110
+ end
111
+
112
+ end
metadata ADDED
@@ -0,0 +1,121 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ruby-bitcoin-secp256k1
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.5.2
5
+ platform: ruby
6
+ authors:
7
+ - Jan Xie
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-06-28 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: ffi
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 1.9.25
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 1.9.25
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '12.3'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '12.3'
41
+ - !ruby/object:Gem::Dependency
42
+ name: minitest
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '='
46
+ - !ruby/object:Gem::Version
47
+ version: 5.11.3
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '='
53
+ - !ruby/object:Gem::Version
54
+ version: 5.11.3
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.9.20
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '='
67
+ - !ruby/object:Gem::Version
68
+ version: 0.9.20
69
+ description: Ruby binding to bitcoin's secp256k1 implementation.
70
+ email:
71
+ - jan.h.xie@gmail.com
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - ".gitignore"
77
+ - ".gitmodules"
78
+ - ".travis.yml"
79
+ - Gemfile
80
+ - Gemfile.lock
81
+ - LICENSE
82
+ - README.md
83
+ - Rakefile
84
+ - install_lib.sh
85
+ - lib/bitcoin_secp256k1.rb
86
+ - lib/bitcoin_secp256k1/c.rb
87
+ - lib/bitcoin_secp256k1/ecdsa.rb
88
+ - lib/bitcoin_secp256k1/key.rb
89
+ - lib/bitcoin_secp256k1/utils.rb
90
+ - lib/bitcoin_secp256k1/version.rb
91
+ - ruby-bitcoin-secp256k1.gemspec
92
+ - test/fixtures/ecdsa_sig.json
93
+ - test/fixtures/pubkey.json
94
+ - test/secp256k1_test.rb
95
+ homepage: https://github.com/mechanizm/ruby-bitcoin-secp256k1
96
+ licenses:
97
+ - MIT
98
+ metadata: {}
99
+ post_install_message:
100
+ rdoc_options: []
101
+ require_paths:
102
+ - lib
103
+ required_ruby_version: !ruby/object:Gem::Requirement
104
+ requirements:
105
+ - - ">="
106
+ - !ruby/object:Gem::Version
107
+ version: '0'
108
+ required_rubygems_version: !ruby/object:Gem::Requirement
109
+ requirements:
110
+ - - ">="
111
+ - !ruby/object:Gem::Version
112
+ version: '0'
113
+ requirements: []
114
+ rubygems_version: 3.1.4
115
+ signing_key:
116
+ specification_version: 4
117
+ summary: Ruby binding to bitcoin's secp256k1 implementation.
118
+ test_files:
119
+ - test/fixtures/ecdsa_sig.json
120
+ - test/fixtures/pubkey.json
121
+ - test/secp256k1_test.rb