Module: Bitcoin::Secp256k1::Native

Extended by:
Secp256k1
Defined in:
lib/bitcoin/secp256k1/native.rb

Overview

binding for secp256k1 (github.com/bitcoin-core/secp256k1/) tag: v0.4.0 this is not included by default, to enable set shared object path to ENV for linux, ENV = ‘/usr/local/lib/libsecp256k1.so’ or ‘/usr/lib64/libsecp256k1.so’ for mac,

Class Method Summary collapse

Class Method Details

.generate_key(compressed: true) ⇒ Object

generate bitcoin key object



26
27
28
29
# File 'lib/bitcoin/secp256k1/native.rb', line 26

def generate_key(compressed: true)
  privkey, pubkey = generate_key_pair(compressed: compressed)
  Bitcoin::Key.new(priv_key: privkey, pubkey: pubkey, compressed: compressed)
end

.native?Boolean

Whether this module is native c wrapper or not?

Returns:

  • (Boolean)


21
22
23
# File 'lib/bitcoin/secp256k1/native.rb', line 21

def native?
  true
end

.recover_compact(data, signature, compressed) ⇒ Bitcoin::Key

Recover public key from compact signature.

Parameters:

  • data (String)

    message digest using signature.

  • signature (String)

    signature with binary format(65 bytes).

  • compressed (Boolean)

    whether compressed public key or not.

Returns:



45
46
47
48
# File 'lib/bitcoin/secp256k1/native.rb', line 45

def recover_compact(data, signature, compressed)
  pubkey = recover(data, signature, compressed)
  Bitcoin::Key.new(pubkey: pubkey, compressed: compressed)
end

.sign_compact(data, privkey) ⇒ Array[signature, recovery id]

Sign data with compact format.

Parameters:

  • data (String)

    a data to be signed with binary format

  • privkey (String)

    a private key using sign with hex format

Returns:

  • (Array[signature, recovery id])


35
36
37
38
# File 'lib/bitcoin/secp256k1/native.rb', line 35

def sign_compact(data, privkey)
  sig, rec_id = sign_recoverable(data, privkey)
  [ECDSA::Signature.new(sig[0...64].to_i(16), sig[64..-1].to_i(16)), rec_id]
end

.sign_data(data, private_key, extra_entropy = nil, algo: :ecdsa) ⇒ String

Sign to data.

Parameters:

  • data (String)

    The 32-byte message hash being signed with binary format.

  • private_key (String)

    a private key with hex format using sign.

  • extra_entropy (String) (defaults to: nil)

    a extra entropy with binary format for rfc6979.

  • algo (Symbol) (defaults to: :ecdsa)

    signature algorithm. ecdsa(default) or schnorr.

Returns:

  • (String)

    signature data with binary format. If unsupported algorithm specified, return nil.

Raises:

  • (ArgumentError)

    If invalid arguments specified.



57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/bitcoin/secp256k1/native.rb', line 57

def sign_data(data, private_key, extra_entropy = nil, algo: :ecdsa)
  case algo
  when :ecdsa
    begin
      sign_ecdsa(data, private_key, extra_entropy)
    rescue ArgumentError
      false
    end
  when :schnorr
    begin
      sign_schnorr(data, private_key, extra_entropy)
    rescue ArgumentError
      false
    end
  else
    raise ArgumentError, "unknown algo: #{algo}"
  end
end

.verify_sig(data, signature, pubkey, algo: :ecdsa) ⇒ Boolean

Verify signature.

Parameters:

  • data (String)

    The 32-byte message hash assumed to be signed.

  • signature (String)

    signature data with binary format

  • pubkey (String)

    a public key with hex format using verify.

  • algo (Symbol) (defaults to: :ecdsa)

    signature algorithm. ecdsa(default) or schnorr.

Returns:

  • (Boolean)

    verification result.

Raises:

  • (ArgumentError)

    If invalid arguments specified.



83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/bitcoin/secp256k1/native.rb', line 83

def verify_sig(data, signature, pubkey, algo: :ecdsa)
  case algo
  when :ecdsa
    begin
      verify_ecdsa(data, signature, pubkey)
    rescue ArgumentError
      false
    end
  when :schnorr
    begin
      verify_schnorr(data, signature, pubkey)
    rescue ArgumentError
      false
    end
  else
    raise ArgumentError, "unknown algo: #{algo}"
  end
end