Skip to content

feat(identity): el Almacén de macOS lista los certificados del llavero - #2028

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

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

Conversation

@sgomez

@sgomez sgomez commented Oct 19, 2026

Copy link
Copy Markdown
Owner

Closes #2004

What changed

  • identity/adapters/macos_store.rs: MacosToken, el adaptador del puerto Token en macOS. Los almacenes keychain: van al llavero; el resto, a RealToken. desktop_stores en macOS añade el llavero de la persona usuaria (keychain:search-list) delante de los PKCS#11 descubiertos, salvo si RFIRMA_PKCS11_MODULE nombra un módulo, que sigue mandando.
  • macos_store/keychain.rs: lista las identidades con SecItemCopyMatching con la interacción desactivada (SecKeychain::disable_user_interaction): listar nunca pide contraseña. El token del sistema de la clave (kSecAttrTokenID, leído de los atributos de la clave sin usarla) va en CertificateRef::key_provider; una clave de software no tiene. every_certificate devuelve todos los certificados del llavero y, para la lista de búsqueda, también los de SystemRootCertificates.keychain, para completar la cadena.
  • StoreClass::Macos con MACOS_STORE_PREFIX = "keychain:"; en el orden de copias ocupa el mismo puesto que Windows (ID-531).
  • Los match exhaustivos sobre StoreClass cruzan StoreMarkView::Macos y StoreBrand::Macos ("macos"), y el contrato se ha regenerado. -certtui lo rotula «Almacén de macOS» y --json lo nombra apple; el esquema de listaliases admite ese nombre.
  • ADR-0040: la fila del token y la frase del almacén del sistema decían que faltaba el adaptador, y lo he corregido. Ajustadas también la cabecera de pkcs11/mod.rs y el mapa de identity.

Decisiones en los puntos ambiguos:

Test plan

  • Clase propia y orden (TD-132, parte de software). En identity/application/certificates/tests/macos_store.rs: a_keychain_certificate_with_its_key_in_software_is_in_the_macos_store, the_macos_store_comes_after_the_card_and_before_the_rfirma_store_and_the_nss_ones y without_a_card_the_macos_copy_is_the_one_behind_the_row. Las vi en rojo antes de implementar. Después las comprobé con una mutación (preferencia 6): rojo.
  • Pruebas de macOS contra un llavero temporal (TD-134, parte de listado). Cada prueba crea con SecKeychainCreate un llavero fuera de la lista de búsqueda y lo borra con SecKeychainDelete. En identity/adapters/macos_store/tests.rs: lists_an_rsa_and_an_elliptic_curve_certificate_and_leaves_out_one_without_its_key, a_certificate_with_its_key_in_software_stays_in_the_macos_store, the_chain_of_a_keychain_certificate_is_completed_with_its_issuer_from_the_keychain y macos_asks_for_the_secret_and_never_warns_about_the_pin. Las vi en rojo con el adaptador vacío. La de la cadena la comprobé además con una mutación (every_certificate vacío): rojo.
  • the_macos_store_comes_before_the_pkcs11_stores_unless_a_module_is_named: comprobada con una mutación, rojo.
  • La guarda AUTHORISED_SITES y las guardas estructurales (single_cfg_os_site, cabeceras, comentarios, direcciones, contrato, ADR) pasan en verde en local. El veredicto de Linux y Windows es del CI.
  • just test-one-rust --lib entero (2806) y just check-rust en verde en macOS.
  • Sin probar: listar identidades de una tarjeta real por CryptoTokenKit. No hay tarjeta en el CI; depende de la sonda Sonda: una app con firma ad hoc y las identidades de un token del sistema en macOS #2002.
  • Sello de packaging/flatpak/sources.lock calculado con shasum -a 256: just flatpak-sources no corre sin uv. Cargo.lock no trae paquetes nuevos (security-framework ya estaba en el árbol).

Discoveries

  • just test-one-rust <filtro> sin --lib también lanza los binarios de tests/, y native_cycle_xades se colgó en local (macOS, sin el .dylib del puente reciente). Con just test-one-rust --lib <filtro> no pasa.
  • CLAUDE.md dice que el pre-push corre just check-rust si tocas src-tauri, pero lefthook.yml ya solo corre fmt-check y structural-guards en pre-push.

Sergio Gómez Bachiller added 2 commits October 19, 2026 15:59
Implements #2004: El Almacén de macOS lista los certificados del llavero
- `MacosToken` lista las identidades del llavero por Security.framework sin pedir nada
  y apunta en `key_provider` el token del sistema de la clave, si lo hay.
- `StoreClass::Macos` comparte el puesto del Almacén de Windows en el orden de copias.
- Firmar con el llavero queda para #2005: por ahora el adaptador lo rechaza.
…agent/developer/issue-2004

# Conflicts:
#	packaging/flatpak/sources.lock
#	rfirma-app/src-tauri/Cargo.toml
@sgomez
sgomez marked this pull request as ready for review October 19, 2026 14:04
@sgomez
sgomez merged commit a1a474d into agent/developer/spec-2000 Oct 19, 2026
@sgomez
sgomez deleted the agent/developer/issue-2004 branch October 19, 2026 14:04
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