Skip to content

feat(identity): Firmar con un certificado del Almacén de macOS - #2033

Merged
sgomez merged 2 commits into
agent/developer/spec-2000from
agent/developer/issue-2005
Oct 19, 2026
Merged

sgomez merged 2 commits into
agent/developer/spec-2000from
agent/developer/issue-2005

Conversation

@sgomez

@sgomez sgomez commented Oct 19, 2026

Copy link
Copy Markdown
Owner

Closes #2005

What changed

  • MacosToken firma con el llavero: busca la identidad por la huella SHA-1 de la referencia, Rust calcula el resumen (ecdsa::digest) y SecKeyCreateSignature lo firma con el algoritmo Digest de Security.framework: PKCS#1 v1.5, PSS (sal del tamaño del resumen) y ECDSA X9.62, que ya sale en DER. SHA-1 tiene su rama explícita en la tabla over_a_digest.
  • offers comprueba la clase de clave del certificado frente al algoritmo, como en CNG.
  • situation_of(domain, code) traduce por dominio del CFError: errSecUserCanceled y TKErrorCodeCanceledByUser → cancelación; errSecAuthFailed, TKErrorCodeAuthenticationFailed y SCARD_W_WRONG_CHV → PIN incorrecto; SCARD_W_CHV_BLOCKED → PIN bloqueado; TKErrorCodeTokenNotFound, SCARD_E_NO_SMARTCARD y SCARD_W_REMOVED_CARD → tarjeta retirada; errSecItemNotFound y TKErrorCodeObjectNotFound → certificado no encontrado.
  • Decisión ante un punto ambiguo: ni Security.framework ni CryptoTokenKit tienen un código propio de «PIN bloqueado», así que el bloqueo solo se reconoce cuando llega el código PC/SC; un token del sistema que lo comunique como TKErrorCodeAuthenticationFailed saldrá como PIN incorrecto. Lo confirmarán las sondas con tarjeta real.
  • La fila del ADR-0040 que decía que el Almacén de macOS «todavía no firma» se corrige.

Test plan

  • RSA PKCS#1 v1.5 y PSS con todos los resúmenes, SHA-1 incluido, contra un llavero temporal, verificando con OpenSSL — signs_with_rsa_pkcs1_and_pss_through_the_keychain_with_every_hash_sha1_included, vista en rojo
  • ECDSA en DER con todos los resúmenes — signs_with_ecdsa_through_the_keychain_in_der_with_every_hash_sha1_included, vista en rojo
  • La clave solo ofrece los algoritmos de su clase — a_keychain_key_offers_only_the_algorithms_of_its_kind, vista en rojo
  • Un certificado que ya no está en el llavero es «no encontrado» — a_certificate_gone_from_the_keychain_is_not_found_when_signing, vista en rojo
  • Traducción de errores — denying_the_macos_dialog_is_the_person_cancelling, system_errors_map_to_their_situations, vistas en rojo
  • Cancelar o equivocarse en el diálogo real de macOS no se puede provocar en una prueba automática: queda para la prueba manual. Las pruebas importan la clave con el binario de prueba como aplicación de confianza, así que macOS no pide nada.
  • just check-rust (clippy) no ha corrido en local: el pre-push no lo disparó; el veredicto es del carril de macOS del CI.

Sergio Gómez Bachiller added 2 commits October 19, 2026 16:14
Implements #2005: Firmar con un certificado del Almacén de macOS
- Rust resume y `SecKeyCreateSignature` firma el resumen: PKCS#1 v1.5, PSS y ECDSA en DER,
  con SHA-1 como rama explícita de la tabla de algoritmos.
- Los errores de Security.framework, CryptoTokenKit y PC/SC se traducen por dominio y código.
@sgomez
sgomez marked this pull request as ready for review October 19, 2026 14:15
@sgomez
sgomez merged commit 80d9213 into agent/developer/spec-2000 Oct 19, 2026
@sgomez
sgomez deleted the agent/developer/issue-2005 branch October 19, 2026 14:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant