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 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 is de low-level CMS-builder die intern wordt gebruikt door het PAdES-handtekenpad. Een gevorderde gebruiker kan er een CMS SignedData-waarde mee assembleren uit een SHA-256-messagedigest van de signed attributes, een signer-abstractie, het signercertificaat en een optionele certificaatketen
De interface ICmsSigner is het contract met de cryptobackend: de aanroeper levert de digest- en signature-algoritme-OIDs, de signer-identificator en voert de eigenlijke private-key-bewerking uit over de digest van de signed attributes. Dit ontkoppelt CMS-codering van een specifieke cryptoprovider
TCmsBuildOptions kan het ondertekeningstijdstip, een commitment type en een expliciete handtekeningsbeleidsidentificator toevoegen, met SHA-256-beleidshash, URI en een optioneel beleidsdocument in het geheugen
ExtractSignatureValue haalt de ruwe signature-octetten uit een voltooide CMS-waarde zodat ze naar een timestamp-authority gestuurd kunnen worden; AddSignatureTimestampToCms bedt het teruggekregen timestamp-token vervolgens in als een unsigned attribute, wat de B-T/B-LTA-conforme vorm oplevert
| Method | Description |
|---|---|
GetDigestAlgorithmOid | Geeft de OID terug van het hashalgoritme over de signed attributes (bijvoorbeeld 2.16.840.1.101.3.4.2.1 voor SHA-256) |
GetSignatureAlgorithmOid | Geeft de OID terug van het signature-algoritme dat op de digest wordt toegepast |
GetSignatureAlgorithmParams | Geeft algoritmeparameters terug (vaak leeg voor ECDSA; bevat de RSA-PSS-parameterblob voor PSS) |
GetSignerId | Geeft de TCmsSignerId terug die de signer identificeert op issuer/serial of op subject key identifier |
SignSignedAttrsDigest | Voert de private-key-handtekening uit over de aangeleverde digest en geeft de signature-octetten terug |
| Routine | Description |
|---|---|
CertKeyAlgorithmOid | Leest de SubjectPublicKeyInfo-algoritme-OID uit een certificaat; daaraan wordt bepaald of het RSA- of het ECDSA-handtekeningalgoritme wordt gebruikt. Elke ondertekeningsbackend heeft dit nodig, daarom staat het hier en niet in één van die backends |
ExtractIssuerAndSerial | Haalt de ruwe issuer- en serialNumber-TLV's die een SignerIdentifier bevat op in IssuerTlv en SerialTlv |
EcDsaP1363ToDer | Wikkelt een rauwe P1363 r||s ECDSA-handtekening in de DER-rij van twee INTEGER's die CMS verwacht; tokens en platformcrypto-API's geven de rauwe vorm terug |
VerifyCmsSignaturePolicyDocument | Vereist een niet-lege SignaturePolicyOid en een SignaturePolicyHash van 32 bytes, verifieert vervolgens het aangeleverde beleidsdocument met SHA-256 en geeft bij falen diagnostische tekst terug |
BuildSignedData | Bouwt een volledige losse RFC 5652 CMS ContentInfo met één CAdES SignerInfo, signercertificaat, optionele keten en geconfigureerde signed attributes |
ExtractSignatureValue | Extraheert de ruwe signature-octetten van de SignerInfo die als invoer voor de RFC 3161-timestamp-message-imprint dienen |
AddSignatureTimestampToCms | Voegt een volledige RFC 3161 TimeStampToken toe als het unsigned attribute signature-time-stamp en codeert de omvattende lengtes opnieuw |
| Type | Description |
|---|---|
TCmsSignerIdKind | sidIssuerAndSerial kiest issuer Name plus serial TLV en sidSubjectKeyIdentifier kiest ruwe subject-key-identifier-octetten |
TCmsSignerId | Kind, IssuerDer, SerialDer en SubjectKeyId bevatten de geselecteerde identificeervorm van de SignerInfo |
TCmsBuildOptions | SigningTimeUtc, CommitmentTypeOid, SignaturePolicyOid, SignaturePolicyHash, SignaturePolicyUri en SignaturePolicyDocument configureren signed attributes; Default wist elke optionele waarde |
TSHA256Digest wordt geleverd door de unit FPdfSha256BuildSignedData neemt de certificaatketen als een open array van DER-gecodeerde certificaten; signer eerst is niet vereist, de volgorde volgt de CMS EncapsulatedCertificateSet