Leyendo el documento del desarrollador sobre Code Signing , es Dice en la sección Digital Signatures and Signed Code
:
Para crear una firma digital, el software de firma calcula un especial tipo de suma de comprobación denominada hash (o compendio) basado en un dato o codifica y encripta ese hash con la clave privada del firmante. Esta hash cifrado se llama una 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 el firma, obteniendo así el hash original calculado por el firmante. Si los dos hashes coinciden, los datos no se han modificado desde que fue firmado 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 para cada segmento (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 las firmas se almacenan en un archivo llamado _CodeSignature / CodeResources dentro del paquete.
Después de un poco de violín, sé lo siguiente:
- Dentro del binario, obtuve el
CodeDirectory
(0xfade0c02
) que contiene todos los hashes SHA-1 o sumas de comprobación del paquete, por ejemplo.Info.plist
etc. - Dentro del paquete, obtuve el directorio
_CodeSignature
con el archivoCodeResources
, que, como se menciona en el párrafo citado arriba, debe contener todas las firmas. Sin embargo, elCodeResources
solo 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 en realidad sonCMS Signatures
(0xfade0b01
) que sí contienen firmas de certificados . BuscandoCMS
, obtengo Sintaxis de mensajes criptográficos , que se utiliza para firmar datos.
Ahora el párrafo me dice que algunos hash deben almacenarse como una firma (hash cifrado) en el archivo binario o en el archivo CodeResources
.
Sospecho que codesign
usa uno de los certificados / CMS Signatures
para extraer la clave pública, luego descifra una firma (hash cifrado) y compara la salida con el hash original de un archivo dado, por ejemplo. Info.plist
.
Entonces mi pregunta es: ¿Dónde está esta firma (hash cifrado)? ¿Es la firma dentro de un certificado / CMS Signature
? ¿O está en otro lugar?