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 ist der Low-Level-CMS-Builder, der intern vom PAdES-Signaturpfad verwendet wird. Er ermöglicht es einem fortgeschrittenen Anwender, einen CMS-SignedData-Wert aus einem SHA-256-Nachrichtendigest der signierten Attribute, einer Signer-Abstraktion, dem Signer-Zertifikat und einer optionalen Zertifikatskette zusammenzusetzen
Die Schnittstelle ICmsSigner ist der Krypto-Backend-Vertrag: der Aufrufer liefert die Digest- und Signaturalgorithmus-OIDs, den Signer-Bezeichner und führt die eigentliche Private-Key-Operation über den Digest der signierten Attribute aus. Dadurch wird die CMS-Kodierung von jedem spezifischen Krypto-Provider entkoppelt
TCmsBuildOptions kann Signaturzeit, Commitment-Type und eine explizite Signaturrichtlinien-Kennung mit SHA-256-Richtlinien-Hash, URI und optionalem Richtlinien-Dokument im Speicher hinzufügen
ExtractSignatureValue extrahiert die rohen Signaturoktetten aus einem fertigen CMS-Wert, damit sie an eine Zeitstempel-Autorität gesendet werden können; AddSignatureTimestampToCms bettet das zurückgegebene Zeitstempel-Token dann als nicht signiertes Attribut ein und erzeugt die B-T-/B-LTA-konforme Form
| Methode | Beschreibung |
|---|---|
GetDigestAlgorithmOid | Liefert die OID des Hash-Algorithmus, der über die signierten Attribute verwendet wird (beispielsweise 2.16.840.1.101.3.4.2.1 für SHA-256) |
GetSignatureAlgorithmOid | Liefert die OID des Signaturalgorithmus, der auf den Digest angewendet wird |
GetSignatureAlgorithmParams | Liefert Algorithmusparameter (oft leer bei ECDSA; trägt bei PSS den RSA-PSS-Parameter-Blob) |
GetSignerId | Liefert die TCmsSignerId, die den Signer über Issuer/Serial oder über den Subject-Key-Identifier identifiziert |
SignSignedAttrsDigest | Führt die Private-Key-Signatur über den gelieferten Digest aus und gibt die Signaturoktetten zurück |
| Routine | Beschreibung |
|---|---|
CertKeyAlgorithmOid | Liest die SubjectPublicKeyInfo-Algorithmus-OID aus einem Zertifikat, die darüber entscheidet, ob ein RSA- oder ein ECDSA-Signaturalgorithmus verwendet wird; jedes Signing-Backend benötigt sie, deshalb liegt sie hier und nicht in einem der Backends |
ExtractIssuerAndSerial | Extrahiert die rohen Issuer- und SerialNumber-TLVs, die ein SignerIdentifier trägt, nach IssuerTlv und SerialTlv |
EcDsaP1363ToDer | Verpackt eine rohe P1363-r||s-ECDSA-Signatur in die DER-SEQUENCE aus zwei INTEGERs, die CMS erwartet; Tokens und plattformeigene Krypto-APIs liefern die rohe Form zurück |
VerifyCmsSignaturePolicyDocument | Verlangt ein nicht leeres SignaturePolicyOid und einen 32-Byte-SignaturePolicyHash, verifiziert dann das bereitgestellte Richtlinien-Dokument mit SHA-256 und liefert bei einem Fehler Diagnosetext |
BuildSignedData | Erzeugt eine vollständige losgelöste RFC-5652-CMS-ContentInfo mit einem CAdES-SignerInfo, Signer-Zertifikat, optionaler Kette und konfigurierten signierten Attributen |
ExtractSignatureValue | Extrahiert die rohen SignerInfo-Signaturoktetten, die als Eingabe für den RFC-3161-Zeitstempel-Message-Imprint verwendet werden |
AddSignatureTimestampToCms | Fügt einen vollständigen RFC-3161-TimeStampToken als nicht signiertes Attribut signature-time-stamp hinzu und kodiert umschließende Längen neu |
| Typ | Beschreibung |
|---|---|
TCmsSignerIdKind | sidIssuerAndSerial wählt Issuer-Name plus Serial-TLV und sidSubjectKeyIdentifier wählt rohe Subject-Key-Identifier-Oktetten |
TCmsSignerId | Kind, IssuerDer, SerialDer und SubjectKeyId tragen die ausgewählte SignerInfo-Bezeichnerform |
TCmsBuildOptions | SigningTimeUtc, CommitmentTypeOid, SignaturePolicyOid, SignaturePolicyHash, SignaturePolicyUri und SignaturePolicyDocument konfigurieren signierte Attribute; Default löscht jeden optionalen Wert |
TSHA256Digest wird von der Unit FPdfSha256 bereitgestelltBuildSignedData nimmt die Zertifikatskette als offenes Array DER-kodierter Zertifikate entgegen; der Signer muss nicht zuerst stehen; die Reihenfolge folgt dem CMS-EncapsulatedCertificateSet