sibit 0.32.3 → 0.32.4
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 +4 -4
- data/lib/sibit/key.rb +21 -4
- data/lib/sibit/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: addf1c76d3af290c3cdbdaae049db0e9f81fab3b71aed128cd8d284b4b3377e5
|
|
4
|
+
data.tar.gz: d4654c29684e00847a317bf7203a295f018036438a3c64ac93ba6477c84e1a52
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 4405e4c542199ea6a4e99e401cb33321ef6048a8d3e7ff424c99f31718d17e8d03928f9922afd80b02e33f1a447a6e7c0042c038226e50078a35b5c237e16801
|
|
7
|
+
data.tar.gz: 235aa484a4719cdab76cbff47da26b949b25513990b88b12096c8d7081bde1c8bb3331808e144e34b3f2302f1fe462896aff5a60d3a0fcc9a955d9525e58db57
|
data/lib/sibit/key.rb
CHANGED
|
@@ -22,12 +22,23 @@ class Sibit
|
|
|
22
22
|
MIN_PRIV = 0x01
|
|
23
23
|
MAX_PRIV = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364140
|
|
24
24
|
|
|
25
|
+
SECP256K1_N = OpenSSL::BN.new(
|
|
26
|
+
'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141', 16
|
|
27
|
+
)
|
|
28
|
+
|
|
25
29
|
attr_reader :network
|
|
26
30
|
|
|
27
31
|
def self.generate(network: :mainnet)
|
|
28
32
|
key = OpenSSL::PKey::EC.generate('secp256k1')
|
|
29
|
-
pvt = key.private_key
|
|
30
|
-
|
|
33
|
+
pvt = key.private_key
|
|
34
|
+
raise 'Invalid private key: zero' if pvt.zero?
|
|
35
|
+
raise 'Invalid private key: out of range' if pvt >= SECP256K1_N
|
|
36
|
+
raise 'Invalid public key: not on curve' unless key.public_key.on_curve?
|
|
37
|
+
hex = key.private_key.to_s(16).rjust(64, '0').downcase
|
|
38
|
+
raise 'Invalid private key encoding' unless hex.match?(/\A[0-9a-f]{64}\z/)
|
|
39
|
+
trip = OpenSSL::BN.new(hex, 16)
|
|
40
|
+
raise 'Private key serialization is lossy' unless trip == pvt
|
|
41
|
+
new(hex, network: network)
|
|
31
42
|
end
|
|
32
43
|
|
|
33
44
|
def initialize(privkey, network: nil)
|
|
@@ -49,11 +60,17 @@ class Sibit
|
|
|
49
60
|
|
|
50
61
|
def bech32
|
|
51
62
|
hrp = { mainnet: 'bc', testnet: 'tb', regtest: 'bcrt' }[@network]
|
|
52
|
-
|
|
63
|
+
hex = pub
|
|
64
|
+
raise 'Invalid public key: not on curve' unless @key.public_key.on_curve?
|
|
65
|
+
raise 'Invalid public key format' unless hex.match?(/\A0[23][0-9a-f]{64}\z/)
|
|
66
|
+
Bech32.encode(hrp, 0, hash160(hex))
|
|
53
67
|
end
|
|
54
68
|
|
|
55
69
|
def base58
|
|
56
|
-
|
|
70
|
+
hex = pub
|
|
71
|
+
raise 'Invalid public key: not on curve' unless @key.public_key.on_curve?
|
|
72
|
+
raise 'Invalid public key format' unless hex.match?(/\A0[23][0-9a-f]{64}\z/)
|
|
73
|
+
hash = hash160(hex)
|
|
57
74
|
prefix = @network == :mainnet ? '00' : '6f'
|
|
58
75
|
versioned = "#{prefix}#{hash}"
|
|
59
76
|
checksum = Base58.new(versioned).check
|
data/lib/sibit/version.rb
CHANGED