¿Cuál es la diferencia entre los diferentes types de relleno en iOS?

En iOS, la API de Certificado, Clave y Servicios de confianza contiene los siguientes types de relleno:

  • kSecPaddingNone
  • kSecPaddingPKCS1
  • kSecPaddingPKCS1MD2
  • kSecPaddingPKCS1MD5
  • kSecPaddingPKCS1SHA1

Un usuario en la list de correo de Apple CDSA dice que "kSecPaddingPKCS1 […] es lo mismo que PKCS # 1 1.5". La reference de services de confianza, key y certificate anota los últimos tres types de relleno ( kSecPaddingPKCS1MD2 , kSecPaddingPKCS1MD5 y kSecPaddingPKCS1SAH ) con "relleno de ASN.1 estándar, así como relleno de PKCS1 de la operación RSA subyacente".

  1. ¿Cuál es la diferencia con kSecPaddingPKCS1 ?
  2. ¿ kSecPaddingPKCS1 es solo el relleno sin procesar de la operación RSA subyacente según RFC 3447?
  3. Cuando se firma un resumen de SHA-256, SHA-384 o SHA-512 con SecKeyRawSign() , ¿necesita un desarrollador usar kSecPaddingPKCS1 y realizar el relleno de ASN.1? ¿Es necesario el relleno ASN.1 o se puede omitir?

Cualquier sugerencia que me indique en la dirección correcta es muy apreciada.

PKCS # 1 contiene dos "rellenos" para firmas con RSA, el "nuevo" (llamado PSS, agregado en la versión 2.1) y el "antiguo" (renombrado "v1.5", ya que ya estaba en la versión 1.5 de PKCS # 1) Estamos hablando del relleno v1.5.

Cuando algunos datos están firmados, es primero hashed con una function hash adecuada (por ejemplo, SHA-1), luego el valor hash (20 bytes si usa SHA-1) se envuelve en dos capas sucesivas:

  1. El valor de hash se codifica en una estructura basada en ASN.1 que también especifica qué function de hash se usó. En la práctica, si el valor de hash es H , entonces los primeros resultados de envoltura en la secuencia de bytes A || H donde " || " es concatenación y " A " es un encabezado que es específico de la function hash (típicamente de 15 a 20 bytes).

  2. El " A || H " se amplía con algunos bytes adicionales:

0x00 0x01 0xFF 0xFF … 0xFF 0x00 || A || MARIDO

El número de bytes de valor 0xFF se ajusta a que el tamaño total es igual al tamaño del module RSA (es decir, 128 bytes para una key RSA de 1024 bits).

El segundo paso es lo que PKCS # 1 llama "relleno de tipo 1".

kSecPaddingPKCS1 significa que la function realiza solo el segundo paso: se supone que los datos de input ya son los correctos " A || H ". Tenga en count que SSL / TLS (hasta la versión 1.1) utiliza una variante de firma que requiere este modo (no hay " A ", pero hay dos funciones hash). Con kSecPaddingPKCS1SHA1 , la function de firma espera el valor de hash como input y agrega el encabezado " A " en sí mismo.

Para una firma adecuada, compatible con los estándares, que puede ser verificada por implementaciones de terceros, el encabezado " A " debe agregarse en algún momento. Puede agregarlo usted mismo y usar kSecPaddingPKCS1 , o usar kSecpaddingPKCS1SHA1 y dejar que el motor lo agregue por sí mismo, lo que probablemente sea less propenso a errores.

(A partir de 2011, no se recomienda el uso de SHA-1; es mejor que cambie a SHA-256 o SHA-512. Además, la API que está intentando usar parece ser bastante baja y todo sospechosamente parece que se está vinculando para implementar su propio protocolo criptográfico en lugar de utilizar una biblioteca o marco existente).