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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 196fa93e65ec890ca33a83d3d56358f311d57933e20432e61b5e3df32ae8515d
4
- data.tar.gz: 0d02c5a2f773d84dbd13c614c6e52533e88a88dff5c07e4ff304650311ce5a22
3
+ metadata.gz: addf1c76d3af290c3cdbdaae049db0e9f81fab3b71aed128cd8d284b4b3377e5
4
+ data.tar.gz: d4654c29684e00847a317bf7203a295f018036438a3c64ac93ba6477c84e1a52
5
5
  SHA512:
6
- metadata.gz: b62032df000f92c6e58147224c5055c3db2ac1798308022899b0e5a5706b691deb9b948733514bcbbac80e70b2ea9f31e085a1da9557a37fd60076240face315
7
- data.tar.gz: 21601d77cf209b9980caef8567321f018efe4442eec5caa96f2e791865519c7499d3f7c64111c01823e90ffeb2ed808608fc7e3387c3fda47d3056612a13449c
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.to_s(16).rjust(64, '0').downcase
30
- new(pvt, network: network)
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
- Bech32.encode(hrp, 0, hash160(pub))
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
- hash = hash160(pub)
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
@@ -9,5 +9,5 @@
9
9
  # License:: MIT
10
10
  class Sibit
11
11
  # Current version of the library.
12
- VERSION = '0.32.3' unless defined?(VERSION)
12
+ VERSION = '0.32.4' unless defined?(VERSION)
13
13
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sibit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.32.3
4
+ version: 0.32.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yegor Bugayenko