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?