PDFium Delphi Component Docs

FPdfCms Unit

Unit: FPdfCms
Erzeugt RFC-5652-CMS-/CAdES-SignedData-Strukturen, validiert Signaturrichtlinien-Dokumente und bettet optionale RFC-3161-Zeitstempel ein

Syntax

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);

Beschreibung

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

ICmsSigner-Methoden

MethodeBeschreibung
GetDigestAlgorithmOidLiefert 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)
GetSignatureAlgorithmOidLiefert die OID des Signaturalgorithmus, der auf den Digest angewendet wird
GetSignatureAlgorithmParamsLiefert Algorithmusparameter (oft leer bei ECDSA; trägt bei PSS den RSA-PSS-Parameter-Blob)
GetSignerIdLiefert die TCmsSignerId, die den Signer über Issuer/Serial oder über den Subject-Key-Identifier identifiziert
SignSignedAttrsDigestFührt die Private-Key-Signatur über den gelieferten Digest aus und gibt die Signaturoktetten zurück

Funktionen und Prozeduren

RoutineBeschreibung
CertKeyAlgorithmOidLiest 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
ExtractIssuerAndSerialExtrahiert die rohen Issuer- und SerialNumber-TLVs, die ein SignerIdentifier trägt, nach IssuerTlv und SerialTlv
EcDsaP1363ToDerVerpackt 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
VerifyCmsSignaturePolicyDocumentVerlangt ein nicht leeres SignaturePolicyOid und einen 32-Byte-SignaturePolicyHash, verifiziert dann das bereitgestellte Richtlinien-Dokument mit SHA-256 und liefert bei einem Fehler Diagnosetext
BuildSignedDataErzeugt eine vollständige losgelöste RFC-5652-CMS-ContentInfo mit einem CAdES-SignerInfo, Signer-Zertifikat, optionaler Kette und konfigurierten signierten Attributen
ExtractSignatureValueExtrahiert die rohen SignerInfo-Signaturoktetten, die als Eingabe für den RFC-3161-Zeitstempel-Message-Imprint verwendet werden
AddSignatureTimestampToCmsFügt einen vollständigen RFC-3161-TimeStampToken als nicht signiertes Attribut signature-time-stamp hinzu und kodiert umschließende Längen neu

Typen

TypBeschreibung
TCmsSignerIdKindsidIssuerAndSerial wählt Issuer-Name plus Serial-TLV und sidSubjectKeyIdentifier wählt rohe Subject-Key-Identifier-Oktetten
TCmsSignerIdKind, IssuerDer, SerialDer und SubjectKeyId tragen die ausgewählte SignerInfo-Bezeichnerform
TCmsBuildOptionsSigningTimeUtc, CommitmentTypeOid, SignaturePolicyOid, SignaturePolicyHash, SignaturePolicyUri und SignaturePolicyDocument konfigurieren signierte Attribute; Default löscht jeden optionalen Wert

Hinweise

Siehe auch

FPdfTsa, FPdfCrypto, FPdfSha256, TPdf.SignPades