Class: Sibit::Key
- Inherits:
-
Object
- Object
- Sibit::Key
- 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
-
#network ⇒ Object
readonly
Returns the value of attribute network.
Class Method Summary collapse
Instance Method Summary collapse
- #base58 ⇒ Object
- #bech32 ⇒ Object
-
#initialize(privkey, network: nil) ⇒ Key
constructor
A new instance of Key.
- #priv ⇒ Object
- #pub ⇒ Object
- #sign(data) ⇒ Object
- #verify(data, sig) ⇒ Object
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
#network ⇒ Object (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
#base58 ⇒ Object
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 |
#bech32 ⇒ Object
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 |
#priv ⇒ Object
41 42 43 |
# File 'lib/sibit/key.rb', line 41 def priv @privkey end |
#pub ⇒ Object
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 |