Class: Secp256k1::PrivateKey

Inherits:
BaseKey
  • Object
show all
Includes:
ECDSA, Utils
Defined in:
lib/secp256k1/key.rb

Constant Summary

Constants included from ECDSA

ECDSA::SIZE_COMPACT, ECDSA::SIZE_SERIALIZED

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from ECDSA

#ecdsa_deserialize, #ecdsa_deserialize_compact, #ecdsa_recover, #ecdsa_recoverable_convert, #ecdsa_recoverable_deserialize, #ecdsa_recoverable_serialize, #ecdsa_serialize, #ecdsa_serialize_compact, #ecdsa_signature_normalize

Methods included from Utils

#decode_hex, #encode_hex, #hash32

Constructor Details

#initialize(privkey: nil, raw: true, flags: ALL_FLAGS, ctx: nil) ⇒ PrivateKey

Returns a new instance of PrivateKey.

Raises:



147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
# File 'lib/secp256k1/key.rb', line 147

def initialize(privkey: nil, raw: true, flags: ALL_FLAGS, ctx: nil)
  raise AssertError, "invalid flags" unless [ALL_FLAGS, FLAG_SIGN].include?(flags)

  super(ctx, flags)

  @pubkey = nil
  @private_key = nil

  if privkey
    if raw
      raise ArgumentError, "privkey must be composed of 32 bytes" unless privkey.instance_of?(String) && privkey.size == 32
      set_raw_privkey privkey
    else
      deserialize privkey
    end
  else
    set_raw_privkey generate_private_key
  end
end

Instance Attribute Details

#pubkeyObject (readonly)

Returns the value of attribute pubkey.



145
146
147
# File 'lib/secp256k1/key.rb', line 145

def pubkey
  @pubkey
end

Instance Method Details

#ecdsa_sign(msg, raw: false, digest: Digest::SHA256) ⇒ Object

Raises:



167
168
169
170
171
172
173
174
175
# File 'lib/secp256k1/key.rb', line 167

def ecdsa_sign(msg, raw: false, digest: Digest::SHA256)
  msg32 = hash32 msg, raw, digest
  raw_sig = C::ECDSASignature.new.pointer

  res = C.secp256k1_ecdsa_sign @ctx, raw_sig, msg32, @private_key, nil, nil
  raise AssertError, "failed to sign" unless res == 1

  raw_sig
end

#ecdsa_sign_recoverable(msg, raw: false, digest: Digest::SHA256) ⇒ Object

Raises:



177
178
179
180
181
182
183
184
185
# File 'lib/secp256k1/key.rb', line 177

def ecdsa_sign_recoverable(msg, raw: false, digest: Digest::SHA256)
  msg32 = hash32 msg, raw, digest
  raw_sig = C::ECDSARecoverableSignature.new.pointer

  res = C.secp256k1_ecdsa_sign_recoverable @ctx, raw_sig, msg32, @private_key, nil, nil
  raise AssertError, "failed to sign" unless res == 1

  raw_sig
end

#set_raw_privkey(privkey) ⇒ Object

Raises:

  • (ArgumentError)


187
188
189
190
191
# File 'lib/secp256k1/key.rb', line 187

def set_raw_privkey(privkey)
  raise ArgumentError, "invalid private key" unless C.secp256k1_ec_seckey_verify(@ctx, privkey)
  @private_key = privkey
  update_public_key
end

#tweak_add(scalar) ⇒ Object

Tweak the current private key by adding a 32 bytes scalar to it and return a new raw private key composed of 32 bytes.



197
198
199
# File 'lib/secp256k1/key.rb', line 197

def tweak_add(scalar)
  tweak_private :secp256k1_ec_privkey_tweak_add, scalar
end

#tweak_mul(scalar) ⇒ Object

Tweak the current private key by multiplying it by a 32 byte scalar and return a new raw private key composed of 32 bytes.



205
206
207
# File 'lib/secp256k1/key.rb', line 205

def tweak_mul(scalar)
  tweak_private :secp256k1_ec_pubkey_tweak_mul, scalar
end