Actualmente trato de firmar un tx usando OpenSSL. Después de algunos retoques, creo que obtuve la mayor parte del tx correcto, pero Electrum se queja de mandatory-script-verify-flag-failed (Non-canonical signature: S value is unnecessarily high)
que probablemente se deba a BIP62 .
¿Hay alguna manera de crear firmas adecuadas con OpenSSL, excepto intentar y esperar obtener un s
valor pequeño?
El resto de mi código está en Golang y no pude encontrar un paquete adecuado para la curva ECDSA utilizada y, por lo tanto, envuelto en OpenSSL.
Alternativamente, podría usar libsecp256k1 . Este es el código utilizado por Bitcoin Core para firmar y creará automáticamente firmas de bajo S (descargo de responsabilidad: soy el autor principal de esa biblioteca). Tal vez exista un envoltorio Go.
Si se apega a OpenSSL, es posible ajustar manualmente el valor S después de firmar. Esto es lo que solía hacer Bitcoin Core antes de la v0.10. Esto es lo que solía hacer: https://github.com/bitcoin/bitcoin/blob/v0.9.0/src/key.cpp#L204L224
Open SSL no lo forzará, tendrá que hacerlo usted mismo. Del BIP 62:
El valor S en firmas debe estar entre 0x1 y 0x7FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 5D576E73 57A4501D DFE92F46 681B20A0 (inclusive). Si S es demasiado alto, simplemente reemplácelo por S' = 0xFFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE BAAEDCE6 AF48A03B BFD25E8C D0364141 - S.
¿Hay alguna manera de crear firmas adecuadas con OpenSSL, excepto intentar y esperar obtener un valor de s pequeño?
Si la velocidad no es significativa, no es mala idea.
actualización: toma un poco de pseudocódigo:
while ( true )
{
signature = createOpenSslSignature ( params );
if ( !signature.toHex ( ).contains ( "022100" ) )
return signature;
}
sr-gi