Para analizar su clave almacenada en formato PEM, puede usar el módulo openssl: sudo gem install openssl
Usando este módulo, extraerás la clave privada de esta manera: OpenSSL::PKey::EC.new(pemcontent).private_key
Tenga en cuenta que su clave privada se basa en la curva elíptica secp256k1 :
% openssl ec -text 2>&1 << EOF | grep OID
-----BEGIN EC PRIVATE KEY-----
MHQCAQEEIBAFWFAlCWPb8IvM4yHLLKBIN/mEJU9cZnM5JD2U2EmAoAcGBSuBBAAK
oUQDQgAErMGUjbHcEf7Gk9gVOOlWdqSaGc0YhE5HBPqhoniBUG8MTx5AT7mxtuyn
QkydMeOciHyvvyU0gf81UW9udef2nA==
-----END EC PRIVATE KEY-----
EOF
ASN1 OID: secp256k1
Por lo tanto, el primer parámetro para dar a EDSA.sign()
debe ser ECDSA::Group::Secp256k1
. Este es un objeto que contiene los parámetros que definen esta curva.
Finalmente, aquí está su código, en el que he realizado los cambios necesarios para que funcione:
require 'ecdsa'
require 'openssl'
def sign(str)
pemcontent = "-----BEGIN EC PRIVATE KEY-----
MHQCAQEEIBAFWFAlCWPb8IvM4yHLLKBIN/mEJU9cZnM5JD2U2EmAoAcGBSuBBAAK
oUQDQgAErMGUjbHcEf7Gk9gVOOlWdqSaGc0YhE5HBPqhoniBUG8MTx5AT7mxtuyn
QkydMeOciHyvvyU0gf81UW9udef2nA==
-----END EC PRIVATE KEY-----"
digest = Digest::SHA256.digest(str)
temp_key = str.size
signature = ECDSA.sign(ECDSA::Group::Secp256k1, OpenSSL::PKey::EC.new(pemcontent).private_key, digest, temp_key)
return signature
end
Nota: el valor de temp_key debe generarse de forma más aleatoria que utilizando la longitud del mensaje para firmar, como lo hizo en el código de ejemplo (es una muy muy mala idea, ya que tarde o temprano, firmarás dos mensajes con la misma longitud, y esto podría permitir que tu clave privada haya sido descubierta).