module Bitcoin::Secp256k1::Ruby
Public Instance Methods
sign_ecdsa(data, privkey, extra_entropy)
click to toggle source
# File lib/block_io/extended_bitcoinrb.rb, line 36 def sign_ecdsa(data, privkey, extra_entropy) privkey = privkey.htb private_key = ECDSA::Format::IntegerOctetString.decode(privkey) extra_entropy ||= '' nonce = RFC6979.generate_rfc6979_nonce(privkey + data, extra_entropy) # port form ecdsa gem. r_point = GROUP.new_point(nonce) point_field = ECDSA::PrimeField.new(GROUP.order) r = point_field.mod(r_point.x) return nil if r.zero? rec = r_point.y & 1 e = ECDSA.normalize_digest(data, GROUP.bit_length) s = point_field.mod(point_field.inverse(nonce) * (e + r * private_key)) # covert to low-s if s > (GROUP.order / 2) s = GROUP.order - s rec = r_point.y & 1 end return nil if s.zero? signature = ECDSA::Signature.new(r, s).to_der # these lines lead to performance issues # public_key = Bitcoin::Key.new(priv_key: privkey.bth, :key_type => Bitcoin::Key::TYPES[:compressed]).pubkey # get rid of the key_type warning # raise 'Creation of signature failed.' unless Bitcoin::Secp256k1::Ruby.verify_sig(data, signature, public_key) [signature, rec] end