Leer la documentación del desarrollador sobre Firma de códigos , dice en la sección Digital Signatures and Signed Code
:
Para crear una firma digital, el software de firma calcula un tipo de suma de comprobación llamada "hash" (o compendio) basada en un fragmento de datos o código y encripta ese hash con la clave privada del firmante. Este hash cifrado en cifrado se llama firma.
Para verificar esa firma, el software de verificación calcula un hash de los datos o el código. A continuación, utiliza la clave pública del firmante para descifrar la firma, obteniendo así el hash original calculado por el firmante. Si los dos hashes coinciden, los datos no han sido modificados desde que fueron firmados por alguien en posesión de la clave privada del firmante.
El código firmado contiene varias firmas digitales:
- Si el código es universal, el código objeto de cada trozo (arquitectura) se firma por separado. Esta firma se almacena dentro de el propio archivo binario.
- Varios componentes del paquete de aplicaciones (como el archivo Info.plist, si lo hay) también están firmados. Estas firmas de firmas se almacenan en un archivo llamado _CodeSignature/CodeResources dentro del paquete.
Después de algunos toqueteos, sé lo siguiente:
- Dentro del binario, tengo el
CodeDirectory
(0xfade0c02
) que contiene todos los hashes o sumas de comprobación SHA-1 del paquete, por ejemploInfo.plist
etc. - Dentro del paquete, tengo el
_CodeSignature
con el directorioCodeResources
que, como se menciona en el párrafo citado, debe contener todas las firmas. Sin embargo, elCodeResources
sólo contiene hashes SHA-1 codificados en base64 de varios archivos. - Dentro del binario, tengo algunos certificados, que puedo extraer usando
codesign -d --extract-certificates <binary>
- generandocodesign0
,codesign1
etc. Estos certificados son en realidadCMS Signatures
(0xfade0b01
) que sí contienen firmas de certificados. BuscandoCMS
Me sale Sintaxis de los mensajes criptográficos que se utiliza para firmar los datos.
Ahora el párrafo me dice que hay que almacenar algún hash como firma (hash encriptado) en el binario o en el CodeResources
archivo.
Sospecho que codesign
utiliza uno de los certificados/ CMS Signatures
para extraer la clave pública, luego descifra una firma (hash cifrado) y compara el resultado con el hash original de un archivo determinado, por ejemplo Info.plist
.
Así que mi pregunta es: ¿Dónde está esta firma (hash encriptado)? ¿Es la firma dentro de un certificado/ CMS Signature
? ¿O es en otro lugar?