money-tree 0.9.0 → 0.11.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 +5 -5
- data/{donation_btc_qr_code.gif → .github/donation_btc_qr_code.gif} +0 -0
- data/.github/workflows/spec.yml +31 -0
- data/README.md +36 -21
- data/Rakefile +1 -1
- data/certs/mattatgemco.pem +24 -0
- data/checksum/money-tree-0.9.0.gem.sha512 +1 -0
- data/lib/money-tree/address.rb +2 -2
- data/lib/money-tree/key.rb +9 -9
- data/lib/money-tree/node.rb +10 -5
- data/lib/money-tree/support.rb +17 -17
- data/lib/money-tree/version.rb +1 -1
- data/lib/money-tree.rb +0 -1
- data/lib/openssl_extensions.rb +7 -52
- data/money-tree.gemspec +9 -20
- data/spec/lib/money-tree/address_spec.rb +23 -7
- data/spec/lib/money-tree/node_spec.rb +190 -190
- data/spec/lib/money-tree/openssl_extensions_spec.rb +49 -1
- data/spec/lib/money-tree/private_key_spec.rb +31 -21
- data/spec/lib/money-tree/public_key_spec.rb +43 -31
- data/spec/lib/money-tree/support_spec.rb +3 -3
- data/spec/spec_helper.rb +0 -1
- metadata +31 -78
- checksums.yaml.gz.sig +0 -0
- data/.simplecov +0 -7
- data/.travis.yml +0 -3
- data.tar.gz.sig +0 -0
- metadata.gz.sig +0 -0
@@ -1,5 +1,23 @@
|
|
1
1
|
require 'spec_helper'
|
2
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
|
+
|
3
21
|
describe MoneyTree::OpenSSLExtensions do
|
4
22
|
include MoneyTree::OpenSSLExtensions
|
5
23
|
|
@@ -8,8 +26,15 @@ describe MoneyTree::OpenSSLExtensions do
|
|
8
26
|
let(:key2) { OpenSSL::PKey::EC.new("secp256k1").generate_key }
|
9
27
|
let(:point_1) { key1.public_key }
|
10
28
|
let(:point_2) { key2.public_key }
|
29
|
+
|
11
30
|
let(:point_infinity) { key1.public_key.set_to_infinity! }
|
12
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
|
+
|
13
38
|
it "requires valid points" do
|
14
39
|
expect { MoneyTree::OpenSSLExtensions.add(0, 0) }.to raise_error(ArgumentError)
|
15
40
|
expect { MoneyTree::OpenSSLExtensions.add(nil, nil) }.to raise_error(ArgumentError)
|
@@ -17,7 +42,30 @@ describe MoneyTree::OpenSSLExtensions do
|
|
17
42
|
expect { MoneyTree::OpenSSLExtensions.add(0, point_2) }.to raise_error(ArgumentError)
|
18
43
|
expect { MoneyTree::OpenSSLExtensions.add(point_infinity, point_2) }.to raise_error(ArgumentError)
|
19
44
|
expect { MoneyTree::OpenSSLExtensions.add(point_1, point_2) }.to_not raise_error
|
45
|
+
expect { MoneyTree::OpenSSLExtensions.validate_points(point_1) }.to_not raise_error
|
46
|
+
end
|
47
|
+
|
48
|
+
it "validates points correctly" do
|
49
|
+
expect { MoneyTree::OpenSSLExtensions.validate_points(point_1) }.to_not raise_error
|
50
|
+
expect { MoneyTree::OpenSSLExtensions.validate_points(point_2) }.to_not raise_error
|
51
|
+
expect { MoneyTree::OpenSSLExtensions.validate_points(point_infinity) }.to raise_error(ArgumentError)
|
52
|
+
end
|
53
|
+
|
54
|
+
it "should add points correctly" do
|
55
|
+
result = MoneyTree::OpenSSLExtensions.add(fixed_point1, fixed_point2)
|
56
|
+
|
57
|
+
expect(result).to eql(FIXED_SUM)
|
58
|
+
|
59
|
+
group = OpenSSL::PKey::EC::Group.new("secp256k1")
|
60
|
+
result_point = OpenSSL::PKey::EC::Point.new(group, OpenSSL::BN.new(result, 16))
|
61
|
+
|
62
|
+
expect(result_point).to eql(fixed_sum_point)
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'should be able to create the same hex output for the point' do
|
66
|
+
hex_output = fixed_sum_point.to_bn.to_s(16)
|
67
|
+
|
68
|
+
expect(hex_output).to eq(FIXED_SUM)
|
20
69
|
end
|
21
70
|
end
|
22
|
-
|
23
71
|
end
|
@@ -4,7 +4,7 @@ describe MoneyTree::PrivateKey do
|
|
4
4
|
before do
|
5
5
|
@key = MoneyTree::PrivateKey.new key: "5eae5375fb5f7a0ea650566363befa2830ef441bdcb19198adf318faee86d64b"
|
6
6
|
end
|
7
|
-
|
7
|
+
|
8
8
|
describe "to_hex" do
|
9
9
|
it "has 64 characters" do
|
10
10
|
# must always be 64 characters - leading zeroes need to be preserved!
|
@@ -15,85 +15,95 @@ describe MoneyTree::PrivateKey do
|
|
15
15
|
master = MoneyTree::Master.new seed_hex: "9cf6b6e8451c7d551cb402e2997566e5c7c258543eadb184f9f39322b2e6959b"
|
16
16
|
expect(master.node_for_path("m/427").private_key.to_hex.length).to eql(64)
|
17
17
|
end
|
18
|
-
|
18
|
+
|
19
19
|
it "is a valid hex" do
|
20
|
-
expect(@key.to_hex).to eql('5eae5375fb5f7a0ea650566363befa2830ef441bdcb19198adf318faee86d64b'
|
20
|
+
expect(@key.to_hex).to eql('5eae5375fb5f7a0ea650566363befa2830ef441bdcb19198adf318faee86d64b')
|
21
21
|
end
|
22
22
|
end
|
23
|
-
|
23
|
+
|
24
24
|
describe "to_wif" do
|
25
25
|
it "is a 52 character base58 key" do
|
26
26
|
expect(@key.to_wif.length).to eql(52)
|
27
27
|
end
|
28
|
-
|
28
|
+
|
29
29
|
it "starts with K or L" do
|
30
30
|
expect(%w(K L)).to include(@key.to_wif[0])
|
31
31
|
end
|
32
|
-
|
32
|
+
|
33
33
|
it "is a valid compressed wif" do
|
34
|
-
expect(@key.to_wif).to eql('KzPkwAXJ4wtXHnbamTaJqoMrzwCUUJaqhUxnqYhnZvZH6KhgmDPK'
|
34
|
+
expect(@key.to_wif).to eql('KzPkwAXJ4wtXHnbamTaJqoMrzwCUUJaqhUxnqYhnZvZH6KhgmDPK')
|
35
35
|
end
|
36
36
|
end
|
37
|
-
|
37
|
+
|
38
38
|
describe "to_wif(compressed: false)" do
|
39
39
|
it "is a 51 character base58 key" do
|
40
40
|
expect(@key.to_wif(compressed: false).length).to eql(51)
|
41
41
|
end
|
42
|
-
|
42
|
+
|
43
43
|
it "starts with 5" do
|
44
44
|
expect(@key.to_wif(compressed: false)[0]).to eql('5')
|
45
45
|
end
|
46
|
-
|
46
|
+
|
47
47
|
it "is valid" do
|
48
48
|
expect(@key.to_wif(compressed: false)).to eql('5JXz5ZyFk31oHVTQxqce7yitCmTAPxBqeGQ4b7H3Aj3L45wUhoa')
|
49
49
|
end
|
50
50
|
end
|
51
|
-
|
51
|
+
|
52
52
|
describe "from_wif(wif)" do
|
53
53
|
it "returns the key from a wif" do
|
54
54
|
expect(@key.from_wif("5HueCGU8rMjxEXxiPuD5BDku4MkFqeZyd4dZ1jvhTVqvbTLvyTJ")).to eql('0c28fca386c7a227600b2fe50b7cae11ec86d3bf1fbe471be89827e19d72aa1d')
|
55
55
|
end
|
56
|
-
|
56
|
+
|
57
57
|
it "raises an error on bad checksum" do
|
58
58
|
expect { @key.from_wif("5HueCGU8rMjxEXxiPuD5BDku4MkFqeZyd4dZ1jvhTVqvbTBADTJ") }.to raise_error(MoneyTree::Key::InvalidWIFFormat)
|
59
59
|
end
|
60
60
|
end
|
61
|
-
|
61
|
+
|
62
62
|
describe "to_base64" do
|
63
63
|
it "has 44 characters" do
|
64
64
|
expect(@key.to_base64.length).to eql(44)
|
65
65
|
end
|
66
|
-
|
66
|
+
|
67
67
|
it "is a valid base64" do
|
68
|
-
expect(@key.to_base64).to eql('Xq5Tdftfeg6mUFZjY776KDDvRBvcsZGYrfMY+u6G1ks='
|
68
|
+
expect(@key.to_base64).to eql('Xq5Tdftfeg6mUFZjY776KDDvRBvcsZGYrfMY+u6G1ks=')
|
69
69
|
end
|
70
70
|
end
|
71
|
-
|
71
|
+
|
72
72
|
describe "from_base64(base64_key)" do
|
73
73
|
it "parses base64 key" do
|
74
74
|
@key = MoneyTree::PrivateKey.new(key: "Xq5Tdftfeg6mUFZjY776KDDvRBvcsZGYrfMY+u6G1ks=")
|
75
75
|
expect(@key.to_hex).to eql("5eae5375fb5f7a0ea650566363befa2830ef441bdcb19198adf318faee86d64b")
|
76
76
|
end
|
77
|
-
|
77
|
+
|
78
78
|
it "returns the key from base64 encoding" do
|
79
79
|
expect(@key.from_base64("Xq5Tdftfeg6mUFZjY776KDDvRBvcsZGYrfMY+u6G1ks=")).to eql('5eae5375fb5f7a0ea650566363befa2830ef441bdcb19198adf318faee86d64b')
|
80
80
|
end
|
81
|
-
|
81
|
+
|
82
82
|
it "raises an error on bad encoding" do
|
83
83
|
expect { @key.from_base64("Xq5Tdftfeg6mUFZjY776KD&%#BbadBADrfMY+u6G1ks=") }.to raise_error(MoneyTree::Key::InvalidBase64Format)
|
84
84
|
end
|
85
85
|
end
|
86
|
-
|
86
|
+
|
87
87
|
describe "valid?(eckey)" do
|
88
88
|
it "checks for a valid key" do
|
89
89
|
expect(@key.valid?).to be_truthy
|
90
90
|
end
|
91
91
|
end
|
92
|
-
|
92
|
+
|
93
93
|
describe "parse_raw_key" do
|
94
94
|
it "returns error if key is not Bignum, hex, base64, or wif formatted" do
|
95
95
|
expect { @key = MoneyTree::PrivateKey.new(key: "Thisisnotakey") }.to raise_error(MoneyTree::Key::KeyFormatNotFound)
|
96
|
-
|
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
|
97
107
|
end
|
98
108
|
end
|
99
109
|
|
@@ -1,111 +1,111 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe MoneyTree::PublicKey do
|
4
|
-
|
4
|
+
|
5
5
|
describe "with a private key" do
|
6
6
|
before do
|
7
7
|
@private_key = MoneyTree::PrivateKey.new key: "5eae5375fb5f7a0ea650566363befa2830ef441bdcb19198adf318faee86d64b"
|
8
8
|
@key = MoneyTree::PublicKey.new @private_key
|
9
9
|
end
|
10
|
-
|
10
|
+
|
11
11
|
describe "to_hex(compressed: false)" do
|
12
12
|
it "has 65 bytes" do
|
13
13
|
expect(@key.uncompressed.to_hex.length).to eql(130)
|
14
14
|
end
|
15
|
-
|
15
|
+
|
16
16
|
it "is a valid hex" do
|
17
|
-
expect(@key.uncompressed.to_hex).to eql('042dfc2557a007c93092c2915f11e8aa70c4f399a6753e2e908330014091580e4b11203096f1a1c5276a73f91b9465357004c2103cc42c63d6d330df589080d2e4'
|
17
|
+
expect(@key.uncompressed.to_hex).to eql('042dfc2557a007c93092c2915f11e8aa70c4f399a6753e2e908330014091580e4b11203096f1a1c5276a73f91b9465357004c2103cc42c63d6d330df589080d2e4')
|
18
18
|
end
|
19
19
|
end
|
20
|
-
|
20
|
+
|
21
21
|
describe "to_hex" do
|
22
22
|
it "has 33 bytes" do
|
23
23
|
expect(@key.to_hex.length).to eql(66)
|
24
24
|
end
|
25
|
-
|
25
|
+
|
26
26
|
it "is a valid compressed hex" do
|
27
|
-
expect(@key.to_hex).to eql('022dfc2557a007c93092c2915f11e8aa70c4f399a6753e2e908330014091580e4b'
|
27
|
+
expect(@key.to_hex).to eql('022dfc2557a007c93092c2915f11e8aa70c4f399a6753e2e908330014091580e4b')
|
28
28
|
end
|
29
29
|
end
|
30
|
-
|
30
|
+
|
31
31
|
describe "to_fingerprint" do
|
32
32
|
it "returns a valid fingerprint" do
|
33
33
|
expect(@key.to_fingerprint).to eql("1fddf42e")
|
34
34
|
end
|
35
35
|
end
|
36
|
-
|
36
|
+
|
37
37
|
describe "to_address(compressed: false)" do
|
38
38
|
it "has 34 characters" do
|
39
39
|
expect(@key.uncompressed.to_address.length).to eql(34)
|
40
40
|
end
|
41
|
-
|
41
|
+
|
42
42
|
it "is a valid bitcoin address" do
|
43
|
-
expect(@key.uncompressed.to_address).to eql('133bJA2xoVqBUsiR3uSkciMo5r15fLAaZg'
|
43
|
+
expect(@key.uncompressed.to_address).to eql('133bJA2xoVqBUsiR3uSkciMo5r15fLAaZg')
|
44
44
|
end
|
45
45
|
end
|
46
|
-
|
46
|
+
|
47
47
|
describe "to_compressed_address" do
|
48
48
|
it "has 34 characters" do
|
49
49
|
expect(@key.to_address.length).to eql(34)
|
50
50
|
end
|
51
|
-
|
51
|
+
|
52
52
|
it "is a valid compressed bitcoin address" do
|
53
|
-
expect(@key.to_address).to eql('13uVqa35BMo4mYq9LiZrXVzoz9EFZ6aoXe'
|
53
|
+
expect(@key.to_address).to eql('13uVqa35BMo4mYq9LiZrXVzoz9EFZ6aoXe')
|
54
54
|
end
|
55
55
|
end
|
56
56
|
end
|
57
|
-
|
57
|
+
|
58
58
|
describe "without a private key" do
|
59
59
|
before do
|
60
60
|
@key = MoneyTree::PublicKey.new '042dfc2557a007c93092c2915f11e8aa70c4f399a6753e2e908330014091580e4b11203096f1a1c5276a73f91b9465357004c2103cc42c63d6d330df589080d2e4'
|
61
61
|
end
|
62
|
-
|
62
|
+
|
63
63
|
describe "to_hex(compressed: false)" do
|
64
64
|
it "has 65 bytes" do
|
65
65
|
expect(@key.uncompressed.to_hex.length).to eql(130)
|
66
66
|
end
|
67
|
-
|
67
|
+
|
68
68
|
it "is a valid hex" do
|
69
|
-
expect(@key.uncompressed.to_hex).to eql('042dfc2557a007c93092c2915f11e8aa70c4f399a6753e2e908330014091580e4b11203096f1a1c5276a73f91b9465357004c2103cc42c63d6d330df589080d2e4'
|
69
|
+
expect(@key.uncompressed.to_hex).to eql('042dfc2557a007c93092c2915f11e8aa70c4f399a6753e2e908330014091580e4b11203096f1a1c5276a73f91b9465357004c2103cc42c63d6d330df589080d2e4')
|
70
70
|
end
|
71
71
|
end
|
72
|
-
|
72
|
+
|
73
73
|
describe "to_hex" do
|
74
74
|
it "has 33 bytes" do
|
75
75
|
expect(@key.compressed.to_hex.length).to eql(66)
|
76
76
|
end
|
77
|
-
|
77
|
+
|
78
78
|
it "is a valid compressed hex" do
|
79
|
-
expect(@key.compressed.to_hex).to eql('022dfc2557a007c93092c2915f11e8aa70c4f399a6753e2e908330014091580e4b'
|
79
|
+
expect(@key.compressed.to_hex).to eql('022dfc2557a007c93092c2915f11e8aa70c4f399a6753e2e908330014091580e4b')
|
80
80
|
end
|
81
81
|
end
|
82
|
-
|
82
|
+
|
83
83
|
describe "to_fingerprint" do
|
84
84
|
it "returns a valid fingerprint" do
|
85
85
|
expect(@key.compressed.to_fingerprint).to eql("1fddf42e")
|
86
86
|
end
|
87
87
|
end
|
88
|
-
|
88
|
+
|
89
89
|
describe "to_address(compressed: false)" do
|
90
90
|
it "has 34 characters" do
|
91
91
|
expect(@key.uncompressed.to_address.length).to eql(34)
|
92
92
|
end
|
93
|
-
|
93
|
+
|
94
94
|
it "is a valid bitcoin address" do
|
95
|
-
expect(@key.uncompressed.to_address).to eql('133bJA2xoVqBUsiR3uSkciMo5r15fLAaZg'
|
95
|
+
expect(@key.uncompressed.to_address).to eql('133bJA2xoVqBUsiR3uSkciMo5r15fLAaZg')
|
96
96
|
end
|
97
97
|
end
|
98
|
-
|
98
|
+
|
99
99
|
describe "to_compressed_address" do
|
100
100
|
it "has 34 characters" do
|
101
101
|
expect(@key.compressed.to_address.length).to eql(34)
|
102
102
|
end
|
103
|
-
|
103
|
+
|
104
104
|
it "is a valid compressed bitcoin address" do
|
105
|
-
expect(@key.compressed.to_address).to eql('13uVqa35BMo4mYq9LiZrXVzoz9EFZ6aoXe'
|
105
|
+
expect(@key.compressed.to_address).to eql('13uVqa35BMo4mYq9LiZrXVzoz9EFZ6aoXe')
|
106
106
|
end
|
107
107
|
end
|
108
|
-
|
108
|
+
|
109
109
|
describe "#compression" do
|
110
110
|
it "returns current compression setting" do
|
111
111
|
@key.compression = :uncompressed
|
@@ -115,7 +115,7 @@ describe MoneyTree::PublicKey do
|
|
115
115
|
end
|
116
116
|
end
|
117
117
|
end
|
118
|
-
|
118
|
+
|
119
119
|
describe "with a bad key" do
|
120
120
|
it "raises KeyFormatNotFound" do
|
121
121
|
expect { @key = MoneyTree::PublicKey.new 'THISISNOTAVALIDKEY' }.to raise_error(MoneyTree::Key::KeyFormatNotFound)
|
@@ -125,7 +125,7 @@ describe MoneyTree::PublicKey do
|
|
125
125
|
describe "recalcuating public key" do
|
126
126
|
it "produces same results" do
|
127
127
|
results = []
|
128
|
-
100.times do
|
128
|
+
100.times do
|
129
129
|
results << MoneyTree::PublicKey.new('042dfc2557a007c93092c2915f11e8aa70c4f399a6753e2e908330014091580e4b11203096f1a1c5276a73f91b9465357004c2103cc42c63d6d330df589080d2e4').to_s
|
130
130
|
end
|
131
131
|
expect(results.uniq.length).to eql(1)
|
@@ -158,6 +158,18 @@ describe MoneyTree::PublicKey do
|
|
158
158
|
end
|
159
159
|
end
|
160
160
|
|
161
|
+
context "wobine's blackboard 101 series" do
|
162
|
+
# ref https://github.com/wobine/blackboard101/blob/e991ea0b98fd26059bf3806e5749b5e5f737e791/EllipticCurvesPart4-PrivateKeyToPublicKey.py
|
163
|
+
subject(:wobine) { MoneyTree::PrivateKey.new key: 'A0DC65FFCA799873CBEA0AC274015B9526505DAAAED385155425F7337704883E' }
|
164
|
+
|
165
|
+
it "always recovers wobine's public keys" do
|
166
|
+
expect(wobine.key).to eq 'a0dc65ffca799873cbea0ac274015b9526505daaaed385155425f7337704883e'
|
167
|
+
public_key = MoneyTree::PublicKey.new wobine
|
168
|
+
expect(public_key.key).to eq '020791dc70b75aa995213244ad3f4886d74d61ccd3ef658243fcad14c9ccee2b0a'
|
169
|
+
expect(public_key.uncompressed.to_hex).to eq '040791dc70b75aa995213244ad3f4886d74d61ccd3ef658243fcad14c9ccee2b0aa762fbc6ac0921b8f17025bb8458b92794ae87a133894d70d7995fc0b6b5ab90'
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
161
173
|
context "testnet" do
|
162
174
|
context 'with private key' do
|
163
175
|
before do
|
@@ -10,20 +10,20 @@ describe MoneyTree::Support do
|
|
10
10
|
expect(sha256("8147786c4d15106333bf278d71dadaf1079ef2d2440a4dde37d747ded5403592")).to eql("507a5b8dfed0fc6fe8801743720cedec06aa5c6fca72b07c49964492fb98a714")
|
11
11
|
end
|
12
12
|
end
|
13
|
-
|
13
|
+
|
14
14
|
describe "ripemd160(str)" do
|
15
15
|
it "properly calculates ripemd160 hash" do
|
16
16
|
expect(ripemd160("abc", ascii: true)).to eql("8eb208f7e05d987a9b044a8e98c6b087f15a0bfc")
|
17
17
|
expect(ripemd160("e8026715af68676e0287ec9aa774f8103e4bddd5505b209263a8ff97c6ea29cc")).to eql("166db6510884918f31a9d246404760db8154bf84")
|
18
18
|
end
|
19
19
|
end
|
20
|
-
|
20
|
+
|
21
21
|
describe "hmac_sha512_hex(key, message)" do
|
22
22
|
it "properly calculates hmac sha512" do
|
23
23
|
expect(hmac_sha512_hex("Jefe", "what do ya want for nothing?")).to eql("164b7a7bfcf819e2e395fbe73b56e0a387bd64222e831fd610270cd7ea2505549758bf75c05a994a6d034f65f8f0e6fdcaeab1a34d4a6b4b636e070a38bce737")
|
24
24
|
end
|
25
25
|
end
|
26
|
-
|
26
|
+
|
27
27
|
describe "hex_to_int" do
|
28
28
|
it "converts hex to integer" do
|
29
29
|
expect(hex_to_int("abcdef0123456789")).to eql(12379813738877118345)
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,150 +1,104 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: money-tree
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.11.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Micah Winkelspecht
|
8
|
-
|
8
|
+
- Afri Schoedon
|
9
|
+
autorequire:
|
9
10
|
bindir: bin
|
10
|
-
cert_chain:
|
11
|
-
-
|
12
|
-
-----BEGIN CERTIFICATE-----
|
13
|
-
MIIDXDCCAkSgAwIBAgIBATANBgkqhkiG9w0BAQUFADA6MQ8wDQYDVQQDDAZqdWxp
|
14
|
-
YW4xEzARBgoJkiaJk/IsZAEZFgNnZW0xEjAQBgoJkiaJk/IsZAEZFgJjbzAeFw0x
|
15
|
-
NTA0MDMwODAwMTdaFw0xNjA0MDIwODAwMTdaMDoxDzANBgNVBAMMBmp1bGlhbjET
|
16
|
-
MBEGCgmSJomT8ixkARkWA2dlbTESMBAGCgmSJomT8ixkARkWAmNvMIIBIjANBgkq
|
17
|
-
hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAp0qCsOUQyTRA4f7WxoU2ctpUO5+eLZw8
|
18
|
-
ILvHJy/0dC2nnIgib+FaFA8TRIGw6fjX2hQ43QJyO36zkjUhAwNu/+TBCfG+Grut
|
19
|
-
2dI9XmqU5Z6PvvXRj6Gu5IkDeIVDKILZv3bDugHJalre4BUKnwPYv5WpZ/e/c6+z
|
20
|
-
E4fwe4ZQzqslSXZo0o/wFvs5dGuIoP93bazSeqddre0JKFFiEP/SNGP9e/lXEd2V
|
21
|
-
rLFYAY409no9J+VQOHP0Nu9ShlCZp8M45abKd2ykuSDaT6jH9YcUHBr3/IEsA4+f
|
22
|
-
DypeS1ySVvad+o8iTnfz1Hyohz4ORm3spf0BOtGI/Swbv3LObZJqkwIDAQABo20w
|
23
|
-
azAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUERhBDW/kkq7tz2hN
|
24
|
-
hPNHtounnkowGAYDVR0RBBEwD4ENanVsaWFuQGdlbS5jbzAYBgNVHRIEETAPgQ1q
|
25
|
-
dWxpYW5AZ2VtLmNvMA0GCSqGSIb3DQEBBQUAA4IBAQAgnumhg8ST8JohYWcoDoQt
|
26
|
-
3BUG5rbfJ/qE0utOt6esi9d6Vz6YHpiT08woaj68OWl9U9N4vjox+ckkTRs93KBd
|
27
|
-
y3thnK9cIEAzoEZs3BBguXYOoFLughGD7hEuLlRYbwZzyIdzx/XdLgsy5Di8Gqaa
|
28
|
-
RKurfXP+dERQww34CUhmhOLO4/rYGqaD88so0MzCImgS+OX+G4ppqd38iQpaxCHL
|
29
|
-
tdc4VS7IlSRxlZ3dBOgiigy9GXpJ+7F831AqjxL39EPwdr7RguTNz+pi//RKaT/U
|
30
|
-
IlpVB+Xfk0vQdP7iYfjGxDzUf0FACMjsR95waJmadKW1Iy6STw2hwPhYIQz1Hu1A
|
31
|
-
-----END CERTIFICATE-----
|
32
|
-
date: 2015-05-19 00:00:00.000000000 Z
|
11
|
+
cert_chain: []
|
12
|
+
date: 2022-11-03 00:00:00.000000000 Z
|
33
13
|
dependencies:
|
34
14
|
- !ruby/object:Gem::Dependency
|
35
|
-
name:
|
15
|
+
name: openssl
|
36
16
|
requirement: !ruby/object:Gem::Requirement
|
37
17
|
requirements:
|
38
18
|
- - ">="
|
39
19
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
20
|
+
version: '2.2'
|
41
21
|
type: :runtime
|
42
22
|
prerelease: false
|
43
23
|
version_requirements: !ruby/object:Gem::Requirement
|
44
24
|
requirements:
|
45
25
|
- - ">="
|
46
26
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
27
|
+
version: '2.2'
|
48
28
|
- !ruby/object:Gem::Dependency
|
49
29
|
name: bundler
|
50
30
|
requirement: !ruby/object:Gem::Requirement
|
51
31
|
requirements:
|
52
32
|
- - "~>"
|
53
33
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
34
|
+
version: '2.2'
|
55
35
|
type: :development
|
56
36
|
prerelease: false
|
57
37
|
version_requirements: !ruby/object:Gem::Requirement
|
58
38
|
requirements:
|
59
39
|
- - "~>"
|
60
40
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
41
|
+
version: '2.2'
|
62
42
|
- !ruby/object:Gem::Dependency
|
63
43
|
name: rake
|
64
44
|
requirement: !ruby/object:Gem::Requirement
|
65
45
|
requirements:
|
66
|
-
- - "
|
46
|
+
- - "~>"
|
67
47
|
- !ruby/object:Gem::Version
|
68
|
-
version: '0'
|
48
|
+
version: '13.0'
|
69
49
|
type: :development
|
70
50
|
prerelease: false
|
71
51
|
version_requirements: !ruby/object:Gem::Requirement
|
72
52
|
requirements:
|
73
|
-
- - "
|
53
|
+
- - "~>"
|
74
54
|
- !ruby/object:Gem::Version
|
75
|
-
version: '0'
|
55
|
+
version: '13.0'
|
76
56
|
- !ruby/object:Gem::Dependency
|
77
57
|
name: rspec
|
78
58
|
requirement: !ruby/object:Gem::Requirement
|
79
59
|
requirements:
|
80
|
-
- - "
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: '0'
|
83
|
-
type: :development
|
84
|
-
prerelease: false
|
85
|
-
version_requirements: !ruby/object:Gem::Requirement
|
86
|
-
requirements:
|
87
|
-
- - ">="
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version: '0'
|
90
|
-
- !ruby/object:Gem::Dependency
|
91
|
-
name: simplecov
|
92
|
-
requirement: !ruby/object:Gem::Requirement
|
93
|
-
requirements:
|
94
|
-
- - ">="
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
version: '0'
|
97
|
-
type: :development
|
98
|
-
prerelease: false
|
99
|
-
version_requirements: !ruby/object:Gem::Requirement
|
100
|
-
requirements:
|
101
|
-
- - ">="
|
102
|
-
- !ruby/object:Gem::Version
|
103
|
-
version: '0'
|
104
|
-
- !ruby/object:Gem::Dependency
|
105
|
-
name: coveralls
|
106
|
-
requirement: !ruby/object:Gem::Requirement
|
107
|
-
requirements:
|
108
|
-
- - ">="
|
60
|
+
- - "~>"
|
109
61
|
- !ruby/object:Gem::Version
|
110
|
-
version: '
|
62
|
+
version: '3.10'
|
111
63
|
type: :development
|
112
64
|
prerelease: false
|
113
65
|
version_requirements: !ruby/object:Gem::Requirement
|
114
66
|
requirements:
|
115
|
-
- - "
|
67
|
+
- - "~>"
|
116
68
|
- !ruby/object:Gem::Version
|
117
|
-
version: '
|
69
|
+
version: '3.10'
|
118
70
|
- !ruby/object:Gem::Dependency
|
119
71
|
name: pry
|
120
72
|
requirement: !ruby/object:Gem::Requirement
|
121
73
|
requirements:
|
122
|
-
- - "
|
74
|
+
- - "~>"
|
123
75
|
- !ruby/object:Gem::Version
|
124
|
-
version: '0'
|
76
|
+
version: '0.4'
|
125
77
|
type: :development
|
126
78
|
prerelease: false
|
127
79
|
version_requirements: !ruby/object:Gem::Requirement
|
128
80
|
requirements:
|
129
|
-
- - "
|
81
|
+
- - "~>"
|
130
82
|
- !ruby/object:Gem::Version
|
131
|
-
version: '0'
|
83
|
+
version: '0.4'
|
132
84
|
description: A Ruby Gem implementation of Bitcoin HD Wallets
|
133
85
|
email:
|
134
86
|
- winkelspecht@gmail.com
|
87
|
+
- gems@q9f.cc
|
135
88
|
executables: []
|
136
89
|
extensions: []
|
137
90
|
extra_rdoc_files: []
|
138
91
|
files:
|
92
|
+
- ".github/donation_btc_qr_code.gif"
|
93
|
+
- ".github/workflows/spec.yml"
|
139
94
|
- ".gitignore"
|
140
95
|
- ".rspec"
|
141
|
-
- ".simplecov"
|
142
|
-
- ".travis.yml"
|
143
96
|
- Gemfile
|
144
97
|
- LICENSE.txt
|
145
98
|
- README.md
|
146
99
|
- Rakefile
|
147
|
-
-
|
100
|
+
- certs/mattatgemco.pem
|
101
|
+
- checksum/money-tree-0.9.0.gem.sha512
|
148
102
|
- lib/money-tree.rb
|
149
103
|
- lib/money-tree/address.rb
|
150
104
|
- lib/money-tree/key.rb
|
@@ -161,11 +115,11 @@ files:
|
|
161
115
|
- spec/lib/money-tree/public_key_spec.rb
|
162
116
|
- spec/lib/money-tree/support_spec.rb
|
163
117
|
- spec/spec_helper.rb
|
164
|
-
homepage:
|
118
|
+
homepage: https://github.com/gemhq/money-tree
|
165
119
|
licenses:
|
166
120
|
- MIT
|
167
121
|
metadata: {}
|
168
|
-
post_install_message:
|
122
|
+
post_install_message:
|
169
123
|
rdoc_options: []
|
170
124
|
require_paths:
|
171
125
|
- lib
|
@@ -180,9 +134,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
180
134
|
- !ruby/object:Gem::Version
|
181
135
|
version: '0'
|
182
136
|
requirements: []
|
183
|
-
|
184
|
-
|
185
|
-
signing_key:
|
137
|
+
rubygems_version: 3.3.23
|
138
|
+
signing_key:
|
186
139
|
specification_version: 4
|
187
140
|
summary: Bitcoin Hierarchical Deterministic Wallets in Ruby! (Bitcoin standard BIP0032)
|
188
141
|
test_files:
|
checksums.yaml.gz.sig
DELETED
Binary file
|
data/.simplecov
DELETED
data/.travis.yml
DELETED
data.tar.gz.sig
DELETED
Binary file
|
metadata.gz.sig
DELETED
Binary file
|