Qual è il formato di una chiave X9.62?

4

RFC8292 contiene questo gioiello:

The "k" parameter includes an ECDSA public key [FIPS186] in
uncompressed form [X9.62] that is encoded using base64url encoding
[RFC7515].

C'è un esempio dell'uso di tale chiave un po 'più in basso:

Authorization: vapid
   t=eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiJ9.eyJhdWQiOiJodHRwczovL3
     B1c2guZXhhbXBsZS5uZXQiLCJleHAiOjE0NTM1MjM3NjgsInN1YiI6Im1ha
     Wx0bzpwdXNoQGV4YW1wbGUuY29tIn0.i3CYb7t4xfxCDquptFOepC9GAu_H
     LGkMlMuCGSK2rpiUfnK9ojFwDXb1JrErtmysazNjjvW2L9OkSSHzvoD1oA,
   k=BA1Hxzyi1RUM1b5wjxsn7nGxAszw2u61m164i3MrAIxHF6YK5h4SDYic-dR
     uU_RCPCfA5aq9ojSwk5Y2EmClBPs

La chiave è il campo k= nell'esempio.

Questo non sembra essere nel formato ASN.1:

$ cat vapidkey
-----BEGIN PUBLIC KEY-----
BA1Hxzyi1RUM1b5wjxsn7nGxAszw2u61m164i3MrAIxHF6YK5h4SDYic-dRuU_RCPCfA5aq9ojSwk5Y2EmClBPs
-----END PUBLIC KEY-----
$ openssl asn1parse -in vapidkey -i
    0:d=0  hl=2 l=  13 prim: OCTET STRING      [HEX DUMP]:47C73CA2D5150CD5BE708F1B27
Error in encoding
139686682194112:error:0D07209B:asn1 encoding routines:ASN1_get_object:too long:../crypto/asn1/asn1_lib.c:91:

Come analizzo questo formato?

Sfortunatamente, lo standard X9.62 sembra essere dietro un paywall. Va bene, non ho bisogno dello standard completo , ho solo bisogno di leggere una chiave e passare i relativi bit in una libreria che sa come gestirla. Ma sembra più difficile di quanto sembri; questo formato non è compreso immediatamente dalle librerie che ho provato, quindi dovrò fare una conversione da solo. Questo è piuttosto difficile se non so in che formato sono i tasti, però.

    
posta Wouter Verhelst 09.05.2018 - 18:03
fonte

1 risposta

2

In effetti non è ASN.1.

(AFAIK tutti) I formati da X9.62 sono replicati in SEC1 liberi da SECG con un punto di curva (che è l'effettivo valore della chiave pubblica, esclusi i metadati) in 2.3.3 e 2.3.4.

Il formato punto non compresso, che hai, è solo un ottetto 04 seguito dalle coordinate X e Y come un intero intero senza firma di dimensioni determinato dal campo sottostante la curva, che devi conoscere già - di solito il la chiave pubblica è incorporata in un SPKI X.509 (vedi sotto) che identifica la curva e quindi fornisce la sua dimensione del campo. Il formato compresso, che è anche comune, è un ottetto 02 o 03 che indica se Y è pari o dispari (per una curva caratteristica principale, spesso primo e Fp abbreviato) seguita solo da X.

Non ho mai visto nessuna libreria che implementa ECC affatto che non implementa il formato di punti non compresso (X9.62) e pochi che non implementino anche i file compressi. È molto più comune avere un disaccordo sul formato di una firma di ECDSA, ma non è il tuo caso.

Si noti inoltre che lo schema base64url-unpadded utilizzato in 8292 e 7515 non è compatibile con il (tradizionale) base64 PEM / SMIME utilizzato da OpenSSL. I due caratteri 'extra' sono diversi, e OpenSSL richiede padding (se non è un multiplo esatto di 3), e nella maggior parte dei casi richiede interruzioni di riga. Inoltre, il tipo PEM "PUBLIC KEY" dovrebbe essere una struttura SubjectPublicKeyInfo X.509, denominata PUBKEY nell'API OpenSSL (e nel codice), inclusi SEQUENCE e AlgorithmIdentifier e BIT STRING, anche se non importa qui perché non hai provare a leggerlo come chiave solo come ASN.1 arbitrario.

    
risposta data 10.05.2018 - 05:56
fonte

Leggi altre domande sui tag