money-tree-openssl 1.1

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,64 @@
1
+ require 'spec_helper'
2
+
3
+ FIXED_KEY1 = <<-fixed_key
4
+ -----BEGIN EC PRIVATE KEY-----
5
+ MHQCAQEEIOvYaAN53KFhyLIElYFZCpm/Q2wq72Uu0kRcKeCDdlJVoAcGBSuBBAAK
6
+ oUQDQgAE4cdbt+NxMCBLg0cQYqo/UEwfzAONpz/n7ux+QrdKuH9NRulf9D4996x5
7
+ r7QBY+l5GJ+RgzLoXbFjPyPQtCV+/Q==
8
+ -----END EC PRIVATE KEY-----
9
+ fixed_key
10
+
11
+ FIXED_KEY2 = <<-fixed_key
12
+ -----BEGIN EC PRIVATE KEY-----
13
+ MHQCAQEEIP6nKLMEcH9R3hv695rCUl9OV+ueC9UX18F2PIH5wcFpoAcGBSuBBAAK
14
+ oUQDQgAErilvn3ms9cKHLNHHegiUU+NuW8c2f223vYInEV+s9ZNSGd28usAXZ6lN
15
+ O2zE534+k09fFe2skHtdoXbLJuZV8g==
16
+ -----END EC PRIVATE KEY-----
17
+ fixed_key
18
+
19
+ FIXED_SUM = "04F3C291542F410F61D61861D911F71ABD320A7B77ED571F92FEC533F61549BF218BAA47BD134847D89917F7483AFE20CCD9B1A4CBDFC443B389D1313B48E018F4"
20
+
21
+ describe MoneyTree::OpenSSLExtensions do
22
+ include MoneyTree::OpenSSLExtensions
23
+
24
+ context "with inputs" do
25
+ let(:key1) { OpenSSL::PKey::EC.new("secp256k1").generate_key }
26
+ let(:key2) { OpenSSL::PKey::EC.new("secp256k1").generate_key }
27
+ let(:point_1) { key1.public_key }
28
+ let(:point_2) { key2.public_key }
29
+
30
+ let(:point_infinity) { key1.public_key.set_to_infinity! }
31
+
32
+ let(:fixed_key1) { OpenSSL::PKey::EC.new(FIXED_KEY1) }
33
+ let(:fixed_key2) { OpenSSL::PKey::EC.new(FIXED_KEY2) }
34
+ let(:fixed_point1) { fixed_key1.public_key }
35
+ let(:fixed_point2) { fixed_key2.public_key }
36
+ let(:fixed_sum_point) { OpenSSL::PKey::EC::Point.new(OpenSSL::PKey::EC::Group.new("secp256k1"), OpenSSL::BN.new(FIXED_SUM, 16)) }
37
+
38
+ it "requires valid points" do
39
+ expect { MoneyTree::OpenSSLExtensions.add(0, 0) }.to raise_error(ArgumentError)
40
+ expect { MoneyTree::OpenSSLExtensions.add(nil, nil) }.to raise_error(ArgumentError)
41
+ expect { MoneyTree::OpenSSLExtensions.add(point_1, 0) }.to raise_error(ArgumentError)
42
+ expect { MoneyTree::OpenSSLExtensions.add(0, point_2) }.to raise_error(ArgumentError)
43
+ expect { MoneyTree::OpenSSLExtensions.add(point_infinity, point_2) }.to raise_error(ArgumentError)
44
+ expect { MoneyTree::OpenSSLExtensions.add(point_1, point_2) }.to_not raise_error
45
+ end
46
+
47
+ it "should add points correctly" do
48
+ result = MoneyTree::OpenSSLExtensions.add(fixed_point1, fixed_point2)
49
+
50
+ expect(result).to eql(FIXED_SUM)
51
+
52
+ group = OpenSSL::PKey::EC::Group.new("secp256k1")
53
+ result_point = OpenSSL::PKey::EC::Point.new(group, OpenSSL::BN.new(result, 16))
54
+
55
+ expect(result_point).to eql(fixed_sum_point)
56
+ end
57
+
58
+ it 'should be able to create the same hex output for the point' do
59
+ hex_output = fixed_sum_point.to_bn.to_s(16)
60
+
61
+ expect(hex_output).to eq(FIXED_SUM)
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,121 @@
1
+ require 'spec_helper'
2
+
3
+ describe MoneyTree::PrivateKey do
4
+ before do
5
+ @key = MoneyTree::PrivateKey.new key: "5eae5375fb5f7a0ea650566363befa2830ef441bdcb19198adf318faee86d64b"
6
+ end
7
+
8
+ describe "to_hex" do
9
+ it "has 64 characters" do
10
+ # must always be 64 characters - leading zeroes need to be preserved!
11
+ expect(@key.to_hex.length).to eql(64)
12
+ end
13
+
14
+ it "preserves leading zeros" do
15
+ master = MoneyTree::Master.new seed_hex: "9cf6b6e8451c7d551cb402e2997566e5c7c258543eadb184f9f39322b2e6959b"
16
+ expect(master.node_for_path("m/427").private_key.to_hex.length).to eql(64)
17
+ end
18
+
19
+ it "is a valid hex" do
20
+ expect(@key.to_hex).to eql('5eae5375fb5f7a0ea650566363befa2830ef441bdcb19198adf318faee86d64b' )
21
+ end
22
+ end
23
+
24
+ describe "to_wif" do
25
+ it "is a 52 character base58 key" do
26
+ expect(@key.to_wif.length).to eql(52)
27
+ end
28
+
29
+ it "starts with K or L" do
30
+ expect(%w(K L)).to include(@key.to_wif[0])
31
+ end
32
+
33
+ it "is a valid compressed wif" do
34
+ expect(@key.to_wif).to eql('KzPkwAXJ4wtXHnbamTaJqoMrzwCUUJaqhUxnqYhnZvZH6KhgmDPK' )
35
+ end
36
+ end
37
+
38
+ describe "to_wif(compressed: false)" do
39
+ it "is a 51 character base58 key" do
40
+ expect(@key.to_wif(compressed: false).length).to eql(51)
41
+ end
42
+
43
+ it "starts with 5" do
44
+ expect(@key.to_wif(compressed: false)[0]).to eql('5')
45
+ end
46
+
47
+ it "is valid" do
48
+ expect(@key.to_wif(compressed: false)).to eql('5JXz5ZyFk31oHVTQxqce7yitCmTAPxBqeGQ4b7H3Aj3L45wUhoa')
49
+ end
50
+ end
51
+
52
+ describe "from_wif(wif)" do
53
+ it "returns the key from a wif" do
54
+ expect(@key.from_wif("5HueCGU8rMjxEXxiPuD5BDku4MkFqeZyd4dZ1jvhTVqvbTLvyTJ")).to eql('0c28fca386c7a227600b2fe50b7cae11ec86d3bf1fbe471be89827e19d72aa1d')
55
+ end
56
+
57
+ it "raises an error on bad checksum" do
58
+ expect { @key.from_wif("5HueCGU8rMjxEXxiPuD5BDku4MkFqeZyd4dZ1jvhTVqvbTBADTJ") }.to raise_error(MoneyTree::Key::InvalidWIFFormat)
59
+ end
60
+ end
61
+
62
+ describe "to_base64" do
63
+ it "has 44 characters" do
64
+ expect(@key.to_base64.length).to eql(44)
65
+ end
66
+
67
+ it "is a valid base64" do
68
+ expect(@key.to_base64).to eql('Xq5Tdftfeg6mUFZjY776KDDvRBvcsZGYrfMY+u6G1ks=' )
69
+ end
70
+ end
71
+
72
+ describe "from_base64(base64_key)" do
73
+ it "parses base64 key" do
74
+ @key = MoneyTree::PrivateKey.new(key: "Xq5Tdftfeg6mUFZjY776KDDvRBvcsZGYrfMY+u6G1ks=")
75
+ expect(@key.to_hex).to eql("5eae5375fb5f7a0ea650566363befa2830ef441bdcb19198adf318faee86d64b")
76
+ end
77
+
78
+ it "returns the key from base64 encoding" do
79
+ expect(@key.from_base64("Xq5Tdftfeg6mUFZjY776KDDvRBvcsZGYrfMY+u6G1ks=")).to eql('5eae5375fb5f7a0ea650566363befa2830ef441bdcb19198adf318faee86d64b')
80
+ end
81
+
82
+ it "raises an error on bad encoding" do
83
+ expect { @key.from_base64("Xq5Tdftfeg6mUFZjY776KD&%#BbadBADrfMY+u6G1ks=") }.to raise_error(MoneyTree::Key::InvalidBase64Format)
84
+ end
85
+ end
86
+
87
+ describe "valid?(eckey)" do
88
+ it "checks for a valid key" do
89
+ expect(@key.valid?).to be_truthy
90
+ end
91
+ end
92
+
93
+ describe "parse_raw_key" do
94
+ it "returns error if key is not Bignum, hex, base64, or wif formatted" do
95
+ expect { @key = MoneyTree::PrivateKey.new(key: "Thisisnotakey") }.to raise_error(MoneyTree::Key::KeyFormatNotFound)
96
+ end
97
+
98
+ it "raises an error that can be caught using a standard exception block" do
99
+ exception_raised = false
100
+
101
+ begin
102
+ MoneyTree::PrivateKey.new(key: "Thisisnotakey")
103
+ rescue => ex
104
+ exception_raised = true
105
+ end
106
+ fail unless exception_raised
107
+ end
108
+ end
109
+
110
+ context "testnet" do
111
+ before do
112
+ @key = MoneyTree::PrivateKey.new key: 'cRhes8SBnsF6WizphaRKQKZZfDniDa9Bxcw31yKeEC1KDExhxFgD'
113
+ end
114
+
115
+ describe "to_wif" do
116
+ it "returns same wif" do
117
+ expect(@key.to_wif(network: :bitcoin_testnet)).to eql('cRhes8SBnsF6WizphaRKQKZZfDniDa9Bxcw31yKeEC1KDExhxFgD')
118
+ end
119
+ end
120
+ end
121
+ end
@@ -0,0 +1,187 @@
1
+ require 'spec_helper'
2
+
3
+ describe MoneyTree::PublicKey do
4
+
5
+ describe "with a private key" do
6
+ before do
7
+ @private_key = MoneyTree::PrivateKey.new key: "5eae5375fb5f7a0ea650566363befa2830ef441bdcb19198adf318faee86d64b"
8
+ @key = MoneyTree::PublicKey.new @private_key
9
+ end
10
+
11
+ describe "to_hex(compressed: false)" do
12
+ it "has 65 bytes" do
13
+ expect(@key.uncompressed.to_hex.length).to eql(130)
14
+ end
15
+
16
+ it "is a valid hex" do
17
+ expect(@key.uncompressed.to_hex).to eql('042dfc2557a007c93092c2915f11e8aa70c4f399a6753e2e908330014091580e4b11203096f1a1c5276a73f91b9465357004c2103cc42c63d6d330df589080d2e4' )
18
+ end
19
+ end
20
+
21
+ describe "to_hex" do
22
+ it "has 33 bytes" do
23
+ expect(@key.to_hex.length).to eql(66)
24
+ end
25
+
26
+ it "is a valid compressed hex" do
27
+ expect(@key.to_hex).to eql('022dfc2557a007c93092c2915f11e8aa70c4f399a6753e2e908330014091580e4b' )
28
+ end
29
+ end
30
+
31
+ describe "to_fingerprint" do
32
+ it "returns a valid fingerprint" do
33
+ expect(@key.to_fingerprint).to eql("1fddf42e")
34
+ end
35
+ end
36
+
37
+ describe "to_address(compressed: false)" do
38
+ it "has 34 characters" do
39
+ expect(@key.uncompressed.to_address.length).to eql(34)
40
+ end
41
+
42
+ it "is a valid bitcoin address" do
43
+ expect(@key.uncompressed.to_address).to eql('133bJA2xoVqBUsiR3uSkciMo5r15fLAaZg' )
44
+ end
45
+ end
46
+
47
+ describe "to_compressed_address" do
48
+ it "has 34 characters" do
49
+ expect(@key.to_address.length).to eql(34)
50
+ end
51
+
52
+ it "is a valid compressed bitcoin address" do
53
+ expect(@key.to_address).to eql('13uVqa35BMo4mYq9LiZrXVzoz9EFZ6aoXe' )
54
+ end
55
+ end
56
+ end
57
+
58
+ describe "without a private key" do
59
+ before do
60
+ @key = MoneyTree::PublicKey.new '042dfc2557a007c93092c2915f11e8aa70c4f399a6753e2e908330014091580e4b11203096f1a1c5276a73f91b9465357004c2103cc42c63d6d330df589080d2e4'
61
+ end
62
+
63
+ describe "to_hex(compressed: false)" do
64
+ it "has 65 bytes" do
65
+ expect(@key.uncompressed.to_hex.length).to eql(130)
66
+ end
67
+
68
+ it "is a valid hex" do
69
+ expect(@key.uncompressed.to_hex).to eql('042dfc2557a007c93092c2915f11e8aa70c4f399a6753e2e908330014091580e4b11203096f1a1c5276a73f91b9465357004c2103cc42c63d6d330df589080d2e4' )
70
+ end
71
+ end
72
+
73
+ describe "to_hex" do
74
+ it "has 33 bytes" do
75
+ expect(@key.compressed.to_hex.length).to eql(66)
76
+ end
77
+
78
+ it "is a valid compressed hex" do
79
+ expect(@key.compressed.to_hex).to eql('022dfc2557a007c93092c2915f11e8aa70c4f399a6753e2e908330014091580e4b' )
80
+ end
81
+ end
82
+
83
+ describe "to_fingerprint" do
84
+ it "returns a valid fingerprint" do
85
+ expect(@key.compressed.to_fingerprint).to eql("1fddf42e")
86
+ end
87
+ end
88
+
89
+ describe "to_address(compressed: false)" do
90
+ it "has 34 characters" do
91
+ expect(@key.uncompressed.to_address.length).to eql(34)
92
+ end
93
+
94
+ it "is a valid bitcoin address" do
95
+ expect(@key.uncompressed.to_address).to eql('133bJA2xoVqBUsiR3uSkciMo5r15fLAaZg' )
96
+ end
97
+ end
98
+
99
+ describe "to_compressed_address" do
100
+ it "has 34 characters" do
101
+ expect(@key.compressed.to_address.length).to eql(34)
102
+ end
103
+
104
+ it "is a valid compressed bitcoin address" do
105
+ expect(@key.compressed.to_address).to eql('13uVqa35BMo4mYq9LiZrXVzoz9EFZ6aoXe' )
106
+ end
107
+ end
108
+
109
+ describe "#compression" do
110
+ it "returns current compression setting" do
111
+ @key.compression = :uncompressed
112
+ expect(@key.compression).to eql(:uncompressed)
113
+ @key.compression = :compressed
114
+ expect(@key.compression).to eql(:compressed)
115
+ end
116
+ end
117
+ end
118
+
119
+ describe "with a bad key" do
120
+ it "raises KeyFormatNotFound" do
121
+ expect { @key = MoneyTree::PublicKey.new 'THISISNOTAVALIDKEY' }.to raise_error(MoneyTree::Key::KeyFormatNotFound)
122
+ end
123
+ end
124
+
125
+ describe "recalcuating public key" do
126
+ it "produces same results" do
127
+ results = []
128
+ 100.times do
129
+ results << MoneyTree::PublicKey.new('042dfc2557a007c93092c2915f11e8aa70c4f399a6753e2e908330014091580e4b11203096f1a1c5276a73f91b9465357004c2103cc42c63d6d330df589080d2e4').to_s
130
+ end
131
+ expect(results.uniq.length).to eql(1)
132
+ end
133
+ end
134
+
135
+ describe "#uncompressed" do
136
+ before do
137
+ @key = MoneyTree::PublicKey.new('022dfc2557a007c93092c2915f11e8aa70c4f399a6753e2e908330014091580e4b')
138
+ end
139
+
140
+ it "does not mutate key" do
141
+ before_str = @key.to_s
142
+ @key.uncompressed
143
+ after_str = @key.to_s
144
+ expect(before_str).to eql(after_str)
145
+ end
146
+ end
147
+
148
+ describe "#compressed" do
149
+ before do
150
+ @key = MoneyTree::PublicKey.new('042dfc2557a007c93092c2915f11e8aa70c4f399a6753e2e908330014091580e4b11203096f1a1c5276a73f91b9465357004c2103cc42c63d6d330df589080d2e4')
151
+ end
152
+
153
+ it "does not mutate key" do
154
+ before_str = @key.to_s
155
+ @key.compressed
156
+ after_str = @key.to_s
157
+ expect(before_str).to eql(after_str)
158
+ end
159
+ end
160
+
161
+ context "testnet" do
162
+ context 'with private key' do
163
+ before do
164
+ @private_key = MoneyTree::PrivateKey.new
165
+ @key = MoneyTree::PublicKey.new(@private_key)
166
+ end
167
+
168
+ it "should have an address starting with m or n" do
169
+ expect(%w(m n)).to include(@key.to_s(network: :bitcoin_testnet)[0])
170
+ end
171
+
172
+ it "should have an uncompressed address starting with m or n" do
173
+ expect(%w(m n)).to include(@key.uncompressed.to_s(network: :bitcoin_testnet)[0])
174
+ end
175
+ end
176
+
177
+ context 'without private key' do
178
+ before do
179
+ @key = MoneyTree::PublicKey.new('0297b033ba894611345a0e777861237ef1632370fbd58ebe644eb9f3714e8fe2bc')
180
+ end
181
+
182
+ it "should have an address starting with m or n" do
183
+ expect(%w(m n)).to include(@key.to_s(network: :bitcoin_testnet)[0])
184
+ end
185
+ end
186
+ end
187
+ end
@@ -0,0 +1,32 @@
1
+ require 'spec_helper'
2
+
3
+ describe MoneyTree::Support do
4
+ include MoneyTree::Support
5
+
6
+ describe "sha256(str)" do
7
+ it "properly calculates sha256 hash" do
8
+ expect(sha256("abc", ascii: true)).to eql("ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad")
9
+ expect(sha256("800c28fca386c7a227600b2fe50b7cae11ec86d3bf1fbe471be89827e19d72aa1d")).to eql("8147786c4d15106333bf278d71dadaf1079ef2d2440a4dde37d747ded5403592")
10
+ expect(sha256("8147786c4d15106333bf278d71dadaf1079ef2d2440a4dde37d747ded5403592")).to eql("507a5b8dfed0fc6fe8801743720cedec06aa5c6fca72b07c49964492fb98a714")
11
+ end
12
+ end
13
+
14
+ describe "ripemd160(str)" do
15
+ it "properly calculates ripemd160 hash" do
16
+ expect(ripemd160("abc", ascii: true)).to eql("8eb208f7e05d987a9b044a8e98c6b087f15a0bfc")
17
+ expect(ripemd160("e8026715af68676e0287ec9aa774f8103e4bddd5505b209263a8ff97c6ea29cc")).to eql("166db6510884918f31a9d246404760db8154bf84")
18
+ end
19
+ end
20
+
21
+ describe "hmac_sha512_hex(key, message)" do
22
+ it "properly calculates hmac sha512" do
23
+ expect(hmac_sha512_hex("Jefe", "what do ya want for nothing?")).to eql("164b7a7bfcf819e2e395fbe73b56e0a387bd64222e831fd610270cd7ea2505549758bf75c05a994a6d034f65f8f0e6fdcaeab1a34d4a6b4b636e070a38bce737")
24
+ end
25
+ end
26
+
27
+ describe "hex_to_int" do
28
+ it "converts hex to integer" do
29
+ expect(hex_to_int("abcdef0123456789")).to eql(12379813738877118345)
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,3 @@
1
+ require 'simplecov'
2
+ require 'money-tree'
3
+ require 'pry'
metadata ADDED
@@ -0,0 +1,175 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: money-tree-openssl
3
+ version: !ruby/object:Gem::Version
4
+ version: '1.1'
5
+ platform: ruby
6
+ authors:
7
+ - Micah Winkelspecht
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2021-10-01 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: openssl
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '2.2'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '2.2'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: simplecov
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: coveralls
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: pry
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ description: A Ruby Gem implementation of Bitcoin HD Wallets (forked to remove ffi)
112
+ email:
113
+ - winkelspecht@gmail.com
114
+ executables: []
115
+ extensions: []
116
+ extra_rdoc_files: []
117
+ files:
118
+ - ".gitignore"
119
+ - ".rspec"
120
+ - ".simplecov"
121
+ - ".travis.yml"
122
+ - Gemfile
123
+ - LICENSE.txt
124
+ - README.md
125
+ - Rakefile
126
+ - certs/mattatgemco.pem
127
+ - checksum/money-tree-0.9.0.gem.sha512
128
+ - donation_btc_qr_code.gif
129
+ - lib/money-tree.rb
130
+ - lib/money-tree/address.rb
131
+ - lib/money-tree/key.rb
132
+ - lib/money-tree/networks.rb
133
+ - lib/money-tree/node.rb
134
+ - lib/money-tree/support.rb
135
+ - lib/money-tree/version.rb
136
+ - lib/openssl_extensions.rb
137
+ - money-tree.gemspec
138
+ - spec/lib/money-tree/address_spec.rb
139
+ - spec/lib/money-tree/node_spec.rb
140
+ - spec/lib/money-tree/openssl_extensions_spec.rb
141
+ - spec/lib/money-tree/private_key_spec.rb
142
+ - spec/lib/money-tree/public_key_spec.rb
143
+ - spec/lib/money-tree/support_spec.rb
144
+ - spec/spec_helper.rb
145
+ homepage: https://github.com/cte/money-tree
146
+ licenses:
147
+ - MIT
148
+ metadata: {}
149
+ post_install_message:
150
+ rdoc_options: []
151
+ require_paths:
152
+ - lib
153
+ required_ruby_version: !ruby/object:Gem::Requirement
154
+ requirements:
155
+ - - ">="
156
+ - !ruby/object:Gem::Version
157
+ version: '0'
158
+ required_rubygems_version: !ruby/object:Gem::Requirement
159
+ requirements:
160
+ - - ">="
161
+ - !ruby/object:Gem::Version
162
+ version: '0'
163
+ requirements: []
164
+ rubygems_version: 3.2.22
165
+ signing_key:
166
+ specification_version: 4
167
+ summary: Bitcoin Hierarchical Deterministic Wallets in Ruby! (Bitcoin standard BIP0032)
168
+ test_files:
169
+ - spec/lib/money-tree/address_spec.rb
170
+ - spec/lib/money-tree/node_spec.rb
171
+ - spec/lib/money-tree/openssl_extensions_spec.rb
172
+ - spec/lib/money-tree/private_key_spec.rb
173
+ - spec/lib/money-tree/public_key_spec.rb
174
+ - spec/lib/money-tree/support_spec.rb
175
+ - spec/spec_helper.rb