defmodule SignCore do
@moduledoc """
Signer-agnostic primitives for PDF (PAdES B-B / B-T) and XML
(XAdES B-B / B-T) signing on top of CMS / XML-DSig.
Apps wire in their own signature source by implementing the
`SignCore.Signer` protocol on a struct of their choosing:
* `pkcs11ex` — PKCS#11 hardware tokens / cloud HSMs.
`%Pkcs11ex.Signer{slot_ref: ..., key_ref: ...}`
* `soft_signer` — software keys from PKCS#12 / PKCS#8 PEM.
`%SoftSigner.PKCS12{...}`, `%SoftSigner.PKCS8{...}`
Once a signer is constructed, the format adapters look the same
to callers regardless of where the bytes get signed:
{:ok, signed_pdf} =
SignCore.PDF.sign(pdf,
signer: signer,
alg: :PS256,
x5c: leaf_der
)
{:ok, _subject_id} =
SignCore.PDF.verify(signed_pdf)
Verification is signer-independent — `SignCore.PDF.verify/2` and
`SignCore.XML.verify/2` only need the leaf cert's SPKI from the
embedded chain, plus a `SignCore.Policy` decision on whether to
trust it. Verify-only deployments can depend on `:sign_core` alone
and ship no signer implementation at all.
"""
end