module Secp256k1::ECDSA

Constants

SIZE_COMPACT
SIZE_SERIALIZED

Public Instance Methods

ecdsa_deserialize(ser_sig) click to toggle source
# File lib/secp256k1/ecdsa.rb, line 17
def ecdsa_deserialize(ser_sig)
  raw_sig = C::ECDSASignature.new.pointer

  res = C.secp256k1_ecdsa_signature_parse_der(@ctx, raw_sig, ser_sig, ser_sig.size)
  raise AssertError, "raw signature parse failed" unless res == 1

  raw_sig
end
ecdsa_deserialize_compact(ser_sig) click to toggle source
# File lib/secp256k1/ecdsa.rb, line 35
def ecdsa_deserialize_compact(ser_sig)
  raise ArgumentError, 'invalid signature length' unless ser_sig.size == 64

  raw_sig = C::ECDSASignature.new.pointer

  res = C.secp256k1_ecdsa_signature_parse_compact(@ctx, raw_sig, ser_sig)
  raise AssertError, "failed to deserialize compact signature" unless res == 1

  raw_sig
end
ecdsa_recover(msg, recover_sig, raw: false, digest: Digest::SHA256) click to toggle source
# File lib/secp256k1/ecdsa.rb, line 61
def ecdsa_recover(msg, recover_sig, raw: false, digest: Digest::SHA256)
  raise AssertError, 'instance not configured for ecdsa recover' if (@flags & ALL_FLAGS) != ALL_FLAGS

  msg32 = hash32 msg, raw, digest
  pubkey = C::Pubkey.new.pointer

  res = C.secp256k1_ecdsa_recover(@ctx, pubkey, recover_sig, msg32)
  raise AssertError, 'failed to recover ECDSA public key' unless res == 1

  pubkey
end
ecdsa_recoverable_convert(recover_sig) click to toggle source
# File lib/secp256k1/ecdsa.rb, line 94
def ecdsa_recoverable_convert(recover_sig)
  normal_sig = C::ECDSASignature.new.pointer
  C.secp256k1_ecdsa_recoverable_signature_convert(@ctx, normal_sig, recover_sig)
  normal_sig
end
ecdsa_recoverable_deserialize(ser_sig, rec_id) click to toggle source
# File lib/secp256k1/ecdsa.rb, line 82
def ecdsa_recoverable_deserialize(ser_sig, rec_id)
  raise ArgumentError, 'invalid rec_id' if rec_id < 0 || rec_id > 3
  raise ArgumentError, 'invalid signature length' if ser_sig.size != 64

  recover_sig = C::ECDSARecoverableSignature.new.pointer

  res = C.secp256k1_ecdsa_recoverable_signature_parse_compact(@ctx, recover_sig, ser_sig, rec_id)
  raise AssertError, 'failed to parse ECDSA compact sig' unless res == 1

  recover_sig
end
ecdsa_recoverable_serialize(recover_sig) click to toggle source
# File lib/secp256k1/ecdsa.rb, line 73
def ecdsa_recoverable_serialize(recover_sig)
  output = FFI::MemoryPointer.new :uchar, SIZE_COMPACT
  recid = FFI::MemoryPointer.new :int

  C.secp256k1_ecdsa_recoverable_signature_serialize_compact(@ctx, output, recid, recover_sig)

  [output.read_bytes(SIZE_COMPACT), recid.read_int]
end
ecdsa_serialize(raw_sig) click to toggle source
# File lib/secp256k1/ecdsa.rb, line 7
def ecdsa_serialize(raw_sig)
  output = FFI::MemoryPointer.new(:uchar, SIZE_SERIALIZED)
  outputlen = FFI::MemoryPointer.new(:size_t).put_uint(0, SIZE_SERIALIZED)

  res = C.secp256k1_ecdsa_signature_serialize_der(@ctx, output, outputlen, raw_sig)
  raise AssertError, "failed to seriazlie signature" unless res == 1

  output.read_bytes(outputlen.read_uint)
end
ecdsa_serialize_compact(raw_sig) click to toggle source
# File lib/secp256k1/ecdsa.rb, line 26
def ecdsa_serialize_compact(raw_sig)
  output = FFI::MemoryPointer.new(:uchar, SIZE_COMPACT)

  res = C.secp256k1_ecdsa_signature_serialize_compact(@ctx, output, raw_sig)
  raise AssertError, "failed to seriazlie compact signature" unless res == 1

  output.read_bytes(SIZE_COMPACT)
end
ecdsa_signature_normalize(raw_sig, check_only: false) click to toggle source

Check and optionally convert a signature to a normalized lower-S form. If check_only is `true` then the normalized signature is not returned.

This function always return a tuple containing a boolean (`true` if not previously normalized or `false` if signature was already normalized), and the normalized signature. When check_only is `true`, the normalized signature returned is always `nil`.

# File lib/secp256k1/ecdsa.rb, line 55
def ecdsa_signature_normalize(raw_sig, check_only: false)
  sigout = check_only ? nil : C::ECDSASignature.new.pointer
  res = C.secp256k1_ecdsa_signature_normalize(@ctx, sigout, raw_sig)
  [res == 1, sigout]
end