Class: Sibit::Key

Inherits:
Object
  • Object
show all
Defined in:
lib/sibit/key.rb

Overview

Bitcoin ECDSA key using secp256k1 curve.

Supports OpenSSL 3.0+ by constructing keys via DER encoding instead of using deprecated mutable key APIs.

Author

Yegor Bugayenko ([email protected])

Copyright

Copyright © 2019-2026 Yegor Bugayenko

License

MIT

Constant Summary collapse

MIN_PRIV =
0x01
MAX_PRIV =
0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364140

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(privkey, network: nil) ⇒ Key

Returns a new instance of Key.



33
34
35
36
37
38
39
# File 'lib/sibit/key.rb', line 33

def initialize(privkey, network: nil)
  @override = network
  @network = :mainnet
  @compressed = true
  @privkey = decode(privkey)
  @key = build(@privkey)
end

Instance Attribute Details

#networkObject (readonly)

Returns the value of attribute network.



25
26
27
# File 'lib/sibit/key.rb', line 25

def network
  @network
end

Class Method Details

.generate(network: :mainnet) ⇒ Object



27
28
29
30
31
# File 'lib/sibit/key.rb', line 27

def self.generate(network: :mainnet)
  key = OpenSSL::PKey::EC.generate('secp256k1')
  pvt = key.private_key.to_s(16).rjust(64, '0').downcase
  new(pvt, network: network)
end

Instance Method Details

#base58Object



55
56
57
58
59
60
61
# File 'lib/sibit/key.rb', line 55

def base58
  hash = hash160(pub)
  prefix = @network == :mainnet ? '00' : '6f'
  versioned = "#{prefix}#{hash}"
  checksum = Base58.new(versioned).check
  Base58.new(versioned + checksum).encode
end

#bech32Object



50
51
52
53
# File 'lib/sibit/key.rb', line 50

def bech32
  hrp = { mainnet: 'bc', testnet: 'tb', regtest: 'bcrt' }[@network]
  Bech32.encode(hrp, 0, hash160(pub))
end

#privObject



41
42
43
# File 'lib/sibit/key.rb', line 41

def priv
  @privkey
end

#pubObject



45
46
47
48
# File 'lib/sibit/key.rb', line 45

def pub
  point = @key.public_key
  point.to_octet_string(@compressed ? :compressed : :uncompressed).unpack1('H*')
end

#sign(data) ⇒ Object



63
64
65
# File 'lib/sibit/key.rb', line 63

def sign(data)
  @key.dsa_sign_asn1(data)
end

#verify(data, sig) ⇒ Object



67
68
69
70
71
# File 'lib/sibit/key.rb', line 67

def verify(data, sig)
  @key.dsa_verify_asn1(data, sig)
rescue OpenSSL::PKey::PKeyError
  false
end