Generando firma ECDSA con Node.js / crypto
Tengo un código que genera una firma concatenada (r-s) para la firma ECDSA usandojsrsasign
y una clave en formato JWK:
const sig = new Signature({ alg: 'SHA256withECDSA' });
sig.init(KEYUTIL.getKey(key));
sig.updateHex(dataBuffer.toString('hex'));
const asn1hexSig = sig.sign();
const concatSig = ECDSA.asn1SigToConcatSig(asn1hexSig);
return new Buffer(concatSig, 'hex');
Parece funcionar. También tengo código que usaSubtleCrypto
para lograr lo mismo:
importEcdsaKey(key, 'sign') // importKey JWK -> raw
.then((privateKey) => subtle.sign(
{ name: 'ECDSA', hash: {name: 'SHA-256'} },
privateKey,
dataBuffer
))
Ambos devuelven buffers de 128 bytes; y verifican de forma cruzada (es decir, puedo verificarjsrsasign
firmas conSubtleCrypto
y viceversa). Sin embargo, cuando uso elSign
clase en el Node.jscrypto
módulo, parece que obtengo algo bastante diferente.
key = require('jwk-to-pem')(key, {'private': true});
const sign = require('crypto').createSign('sha256');
sign.update(dataBuffer);
return sign.sign(key);
Aquí obtengo un búfer de longitud variable, aproximadamente 70 bytes; no verifica de forma cruzada conjsrsa
(lo que deja de quejarse por una longitud no válida para una firma r-s).
¿Cómo puedo obtener una firma r-s, generada porjsrsasign
ySubtleCrypto
, usando Nodecrypto
?