TCmsSignerIdKind = (sidIssuerAndSerial, sidSubjectKeyIdentifier);
TCmsSignerId = record
Kind: TCmsSignerIdKind;
IssuerDer: TBytes;
SerialDer: TBytes;
SubjectKeyId: TBytes;
end;
ICmsSigner = interface
function GetDigestAlgorithmOid: AnsiString;
function GetSignatureAlgorithmOid: AnsiString;
function GetSignatureAlgorithmParams: TBytes;
function GetSignerId: TCmsSignerId;
function SignSignedAttrsDigest(const Digest: TSHA256Digest): TBytes;
end;
TCmsBuildOptions = record
SigningTimeUtc: TDateTime;
CommitmentTypeOid: AnsiString;
SignaturePolicyOid: AnsiString;
SignaturePolicyHash: TBytes;
SignaturePolicyUri: AnsiString;
SignaturePolicyDocument: TBytes;
class function Default: TCmsBuildOptions; static;
end;
function CertKeyAlgorithmOid(const CertDer: TBytes): AnsiString;
function ExtractIssuerAndSerial(const CertDer: TBytes;
out IssuerTlv, SerialTlv: TBytes): Boolean;
function EcDsaP1363ToDer(const Raw: TBytes): TBytes;
function VerifyCmsSignaturePolicyDocument(const Options: TCmsBuildOptions;
const PolicyDocument: TBytes; out ErrorText: string): Boolean;
function BuildSignedData(const DetachedDigest: TSHA256Digest;
const Signer: ICmsSigner; const SignerCertDer: TBytes;
const ChainCertDer: array of TBytes;
const Options: TCmsBuildOptions): TBytes;
function ExtractSignatureValue(const CmsDer: TBytes;
out SignatureValueOctets: TBytes): Boolean;
procedure AddSignatureTimestampToCms(var CmsDer: TBytes;
const TimestampTokenDer: TBytes);
FPdfCms est le constructeur CMS de bas niveau utilisé en interne par le chemin de signature PAdES. Il permet à un utilisateur avancé d’assembler une valeur CMS SignedData à partir d’une empreinte SHA-256 des attributs signés, d’une abstraction de signataire, du certificat du signataire et d’une chaîne de certificats facultative
L’interface ICmsSigner est le contrat du backend cryptographique : l’appelant fournit les OID des algorithmes d’empreinte et de signature, l’identifiant du signataire, et effectue l’opération à clé privée effective sur l’empreinte des attributs signés. Cela découle l’encodage CMS de tout fournisseur cryptographique spécifique
TCmsBuildOptions peut ajouter l’heure de signature, le type d’engagement et un identifiant de politique de signature explicite avec empreinte SHA-256 de politique, URI et document de politique en mémoire facultatif
ExtractSignatureValue extrait les octets bruts de la signature d’une valeur CMS terminée afin de pouvoir les envoyer à une autorité d’horodatage ; AddSignatureTimestampToCms incorpore ensuite le jeton d’horodatage renvoyé comme attribut non signé, produisant la forme conforme B-T/B-LTA
| Method | Description |
|---|---|
GetDigestAlgorithmOid | Renvoie l’OID de l’algorithme de hachage utilisé sur les attributs signés (par exemple 2.16.840.1.101.3.4.2.1 pour SHA-256) |
GetSignatureAlgorithmOid | Renvoie l’OID de l’algorithme de signature appliqué à l’empreinte |
GetSignatureAlgorithmParams | Renvoie les paramètres de l’algorithme (souvent vide pour ECDSA ; transporte le blob de paramètres RSA-PSS pour PSS) |
GetSignerId | Renvoie le TCmsSignerId identifiant le signataire par émetteur/numéro de série ou par identifiant de clé de sujet |
SignSignedAttrsDigest | Effectue la signature à clé privée sur l’empreinte fournie et renvoie les octets de signature |
| Routine | Description |
|---|---|
CertKeyAlgorithmOid | Lit l’OID d’algorithme du SubjectPublicKeyInfo d’un certificat, celui qui décide entre un algorithme de signature RSA et ECDSA ; chaque backend de signature en a besoin, aussi est-elle placée ici plutôt que dans l’un d’eux |
ExtractIssuerAndSerial | Extrait les TLV bruts d’émetteur et de serialNumber que porte un SignerIdentifier, vers IssuerTlv et SerialTlv |
EcDsaP1363ToDer | Enveloppe une signature ECDSA P1363 r||s brute dans la SEQUENCE DER de deux INTEGER qu’attend CMS ; les jetons et les API cryptographiques des plateformes renvoient la forme brute |
VerifyCmsSignaturePolicyDocument | Exige un SignaturePolicyOid non vide et un SignaturePolicyHash de 32 octets, puis vérifie le document de politique fourni avec SHA-256 et renvoie un texte de diagnostic en cas d’échec |
BuildSignedData | Construit un ContentInfo CMS RFC 5652 détaché complet avec un CAdES SignerInfo, le certificat du signataire, une chaîne facultative et les attributs signés configurés |
ExtractSignatureValue | Extrait les octets bruts de signature du SignerInfo utilisés comme entrée d’empreinte de message pour l’horodatage RFC 3161 |
AddSignatureTimestampToCms | Ajoute un TimeStampToken RFC 3161 complet comme attribut non signé signature-time-stamp et réencode les longueurs englobantes |
| Type | Description |
|---|---|
TCmsSignerIdKind | sidIssuerAndSerial sélectionne le Name de l’émetteur plus le TLV de numéro de série et sidSubjectKeyIdentifier sélectionne les octets bruts de l’identifiant de clé de sujet |
TCmsSignerId | Kind, IssuerDer, SerialDer et SubjectKeyId transportent la forme d’identifiant SignerInfo sélectionnée |
TCmsBuildOptions | SigningTimeUtc, CommitmentTypeOid, SignaturePolicyOid, SignaturePolicyHash, SignaturePolicyUri et SignaturePolicyDocument configurent les attributs signés ; Default efface chaque valeur facultative |
TSHA256Digest est fourni par l’unité FPdfSha256BuildSignedData prend la chaîne de certificats comme open array de certificats encodés en DER, le signataire en premier n’est pas exigé ; l’ordre suit le EncapsulatedCertificateSet de CMS