Analisi di un hash della firma distaccato PKCS7

7

Sto provando a verificare manualmente le firme dei file Apple iOS Passbook, che sono le firme distaccate PKCS # 7 della chiave RSA dello sviluppatore Apple che ha creato il file.

Il che significa che c'è una "firma" di file che è la firma staccata di un file "manifest.json". Sto usando il file pkpass "Titanic boarding pass" della novità da link per i test. Fare:

openssl smime -verify -in signature -content manifest.json -inform der -noverify

torna con successo, quindi so che la firma dovrebbe essere valida. Ora, analizzando il file signature , posso avere decodificato i dati ASN.1 codificati DER e mostrare che l'attributo che sta firmando è un digest SHA1 del messaggio, risultante in 733538fde88843c7ad24fb71674dbdd372df7b4d1 . L'esecuzione di openssl sha1 manifest.json mostra che in effetti lo SHA1 di quel file è effettivamente 7335...b4d1 .

Ora, analizzando i SignerInfo bit di signature , posso prendere l'OctetString che è la crittografia RSA della loro firma:

BC C5 F9 F2 53 FD 2C 13 EA CE 64 BB 89 85 60 82 78 63 5B 04 FA F8 BF 7E 2A 6C 20 
5D C3 C8 E8 8A 2F E3 4D B9 8E 1C A1 42 DF 2B 46 89 76 63 0B 8A DD E5 8A 69 4E D0
CF 3F E7 36 1E F8 7F 49 0D 27 EC 0F 73 76 5D 62 A1 4E 8A 43 AB EC ED 2E CD E7 69
3F AD 32 48 0A 79 52 DB 36 5B 61 94 71 3F B3 09 1E 80 17 94 31 06 AF E6 A3 A5 A0
D6 B7 71 31 ED 4C 6F C1 5C B6 4B 79 E5 7A BA BC 1D AD BB D2 F7 39 05 16 73 2C AE
74 E3 9C 4F 7E A7 B1 90 38 FC 92 78 9F 70 C0 D0 94 83 83 EC 01 F4 B6 16 36 4B EE
BC BA DD AC 23 64 4B C2 93 21 9E 9B 21 64 9E 7C 1B 72 87 0B C1 7D 9C 6A 9B AA AB
36 67 F8 7C 7B 8D 9E 88 FC 95 C8 29 57 8B EB B9 5C F6 AB 59 64 CA 87 ED DE 50 BA
67 C0 26 F8 5B FD 47 10 B0 A6 4E D8 D6 F0 E9 A0 DE 2B 6B D4 84 2A 91 A6 A7 27 22
CE D6 5F D2 C7 87 56 A4 E6 E4 D6 D3 C9

Utilizzo della chiave pubblica del certificato da precedenti nel file signature :

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzEjQiB/QgOWX2QF6CGtCiq1ZDyRzJJKJ
4ZW6cuF2MdtOi4If+IhTHcVkdeJ+/cacuRFcscNOXODjriCbAbmTVYTFx290n4vQ1qvPuu3/T41f
4dZHvAM9dmUHuN7M/f/SyGWJiFSYj3VY7S+jyH5zvskGp84YNkHB/Uky3ZFZElOwoOltRNVL25Rw
52nIMVrqO+Cyn2T2LSkk/6yjSll46TyjYuTDEev4XvYhIQBfbraP9rUabRkf1k0EuXl7qM2GeKGM
vq9sQwMRPVFFM2Fa/8xUeA4D/4AWR4S4shuVUxWOx8bq57RNRDogTr4rotaAOyDACu0aS37fWJmQ
zExr3QIDAQAB
-----END PUBLIC KEY-----

Posso decodificare con successo la crittografia RSA e ottenere un risultato. Il risultato della decrittografia è un'altra stringa codificata da DER AS.1, che è:

30 21 30 09 06 05 2B 0E 03 02 1A 05 00 04 14 5B AC 45 51 B9 A5 51 68 28 89
51 59 1F 62 31 9B A7 15 50 CB

Eseguendo l'analisi, indica che 5bac4551b9a55168288951591f62319ba71550cb è l'hash SHA1 di qualcosa. Ma non è lo SHA1 di manifest.json ( 5bac...50cb ! = 7335...b4d1 ).

Quindi, cosa dovrei confrontare con SHA1 decrittografato? So che il proprietario di quel certificato ha crittografato questa particolare stringa con codifica DER, ma non vedo come combaciano. Quale parte del processo RSA / PKCS7 mi manca qui?

    
posta MidnightLightning 29.10.2012 - 18:44
fonte

1 risposta

5

Il calcolo del digest è descritto in CMS (il nuovo nome per PKCS # 7), sezione 5.4. Vale a dire, quando ci sono attributi firmati, quindi ciò che è firmato è una codifica dell'insieme di attributi; poiché uno degli attributi contiene l'hash del file di dati su cui si applica l'oggetto firma, questa firma si estende al file di dati. Vedi questo paragrafo:

A separate encoding of the signedAttrs field is performed for message digest calculation. The IMPLICIT [0] tag in the signedAttrs is not used for the DER encoding, rather an EXPLICIT SET OF tag is used. That is, the DER encoding of the EXPLICIT SET OF tag, rather than of the IMPLICIT [0] tag, MUST be included in the message digest calculation along with the length and content octets of the SignedAttributes value.

quindi l'hash dovrebbe essere calcolato sulla codifica completa del valore SignedAttributes , tranne che sostituisci il primo byte (che dovrebbe essere 0xA0) con il byte che codifica un tag universale SET OF (cioè 0x31, se io ricorda correttamente).

    
risposta data 29.10.2012 - 20:12
fonte

Leggi altre domande sui tag