Pular para o conteúdo
ecdsa.com

Formato de assinatura r‖s bruto (IEEE P1363)

A codificação de tamanho fixo de uma assinatura ECDSA ou DSA como r e s concatenados, cada um completado com zeros à esquerda até o comprimento em bytes da ordem do grupo, usada por JOSE, COSE, WebCrypto e muitas APIs de HSM.
Também escrito comoIEEE P1363raw ECDSA signaturer||sconcatenated signature

O nome vem do IEEE Std 1363-2000. Os tamanhos são fixos: 64 bytes para P-256 e secp256k1, 96 para P-384, 132 para P-521. A alternativa é o DER: uma SEQUENCE de dois INTEGERs mínimos em big-endian, cada um com um 0x00 à frente quando o bit mais alto está ligado, o que dá 70–72 bytes na P-256 e é variável por definição.

O formato bruto é usado pelo ES256 do JWS e similares (RFC 7518 §3.4), pelo COSE (RFC 9053 §2.1), pelo WebCrypto, pelo CKM_ECDSA do PKCS #11, pelo Windows CNG e pelo Apple CryptoKit. O DER é usado pelo X.509 e pelo CMS, pelo CertificateVerify do TLS, pelas assinaturas de asserção do WebAuthn, pelo OpenSSL, pelo SHA256withECDSA do Java, pelo ecdsa.SignASN1 do Go e pelo crypto.sign() do Node. Para alternar: no Node, dsaEncoding: "ieee-p1363"; no Java, SHA256withECDSAinP1363Format; no Python, encode_dss_signature e decode_dss_signature.

As conversões precisam aplicar o padding: r ou s tem menos de 32 bytes em cerca de uma assinatura a cada 128, e manter o byte de sinal do DER ou descartar o padding gera assinaturas “brutas” de 63 ou 65 bytes que falham em outros lugares. O conversor DER ⇄ bruto mostra as duas formas.

Padrões e referências

Todos os termos