Per analizzare la tua chiave memorizzata in formato PEM, puoi usare il modulo openssl: sudo gem install openssl
Usando questo modulo, estrai la chiave privata in questo modo: OpenSSL::PKey::EC.new(pemcontent).private_key
Tieni presente che la tua chiave privata è basata sulla curva ellittica 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
Pertanto, il primo parametro da dare a EDSA.sign()
deve essere ECDSA::Group::Secp256k1
. Questo è un oggetto che contiene i parametri che definiscono questa curva.
Finalmente, ecco il tuo codice, sul quale ho apportato le modifiche necessarie per farlo funzionare:
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: il valore di temp_key dovrebbe essere generato con un metodo più casuale rispetto all'utilizzo della lunghezza del messaggio da firmare, come nel codice di esempio (è molto strong cattiva idea, poiché presto o tardi, firmerai due messaggi con la stessa lunghezza, e questo potrebbe far scoprire la tua chiave privata).