web-dev-qa-db-fra.com

Analysant un hachage de signature détaché PKCS7

J'essaie de vérifier manuellement les signatures de Apple IOS PassBook Files, qui sont des signatures détachées PKCS # 7 de la clé RSA du Apple Developer qui a créé le déposer.

Ce qui signifie qu'il y a un fichier "Signature" qui est la signature détachée d'un fichier "manifeste.json". J'utilise la nouveauté "Titanic Boarding Pass" Pkass Fichier de http://www.flonsolutions.com/fantastic_voyages.html pour tester. En faisant:

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

revient avec succès, alors je sais que la signature devrait être valide. Maintenant, distinguer le fichier signature, je peux avoir décodé les données ASN.1 codées DER-codées et indique que l'attribut en cours de signature est un digeste SHA1 du message, ce qui a entraîné 733538fde88843c7ad24fb71674dbdd372df7b4d1. Fonctionnement openssl sha1 manifest.json montre que le SHA1 de ce fichier est en effet 7335...b4d1.

Maintenant, analysant les bits SignerInfo bits de signature, je peux attraper l'octetre qui est le cryptage RSA de leur signature:

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

Utilisation de la clé publique du certificat de plus tôt dans le fichier 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-----

Je peux décoder avec succès le cryptage RSA et obtenir un résultat. Le résultat du déchiffrement est une autre chaîne ASN.1 SER-codée, qui est:

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

Analyser cela, il indique que 5bac4551b9a55168288951591f62319ba71550cb est le hachage SHA1 de quelque chose. mais ce n'est pas le SHA1 de manifest.json (5bac...50cb! = 7335...b4d1).

Alors, que suis-je censé comparer que Sha1 déchiffré? Je sais que le propriétaire de ce certificat a chiffré cette chaîne de Ser-codée, mais je ne vois pas comment ils correspondent. Quelle partie du processus RSA/PKCS7 est-ce que je manque ici?

7
MidnightLightning

Le calcul du digest est décrit dans [~ # ~] cms [~ # ~ ~] (le nouveau nom pour PKCS n ° 7), section 5.4. À savoir, quand il y a des attributs signés, alors ce que la signature est un codage de l'ensemble des attributs; Étant donné qu'un des attributs contient le hachage du fichier de données sur lequel s'applique l'objet de signature, cette signature s'étend au fichier de données. Voir ce paragraphe:

Un codage séparé du champ Signesattrs est effectué pour le calcul du message Digest. La balise implicite [0] dans les SIGNDATTRS n'est pas utilisée pour le codage DER, un ensemble d'étiquettes explicite est plutôt utilisé. C'est-à-dire que l'encodage DER de l'ensemble explicite d'étiquette, plutôt que de la balise implicite [0], doit être inclus dans le calcul de la digèse de message avec les octets de longueur et de contenu de la valeur SignificationAttributes.

donc, le hachage doit être calculé sur l'encodage complet de la valeur SignedAttributes, sauf que vous remplacez le premier octet (qui devrait être 0xa0) avec l'octet qui code une étiquette universelle SET OF (c'est 0x31, si je me souviens bien).

5
Thomas Pornin