PDFium Delphi Component Docs

Unità FPdfCms

Unità: FPdfCms
Costruisce strutture CMS / CAdES SignedData secondo RFC 5652, valida i documenti di policy di firma e incorpora timestamp RFC 3161 facoltativi

Sintassi

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

Descrizione

FPdfCms è il costruttore CMS di basso livello utilizzato internamente dal percorso di firma PAdES. Permette a un utente esperto di assemblare un valore CMS SignedData a partire dal message digest SHA-256 degli attributi firmati, un'astrazione del firmatario, il certificato del firmatario e una catena di certificati opzionale

L'interfaccia ICmsSigner è il contratto del backend di crittografia: il chiamante fornisce gli OID degli algoritmi di digest e di firma, l'identificatore del firmatario ed esegue l'effettiva operazione a chiave privata sul digest degli attributi firmati. Questo disaccoppia la codifica CMS da un qualsiasi provider di crittografia specifico

TCmsBuildOptions può aggiungere l'ora di firma, il tipo di impegno e un identificatore esplicito di policy di firma con hash SHA-256 della policy, URI e documento di policy in memoria facoltativo

ExtractSignatureValue estrae gli ottetti grezzi della firma da un valore CMS completato, così che possano essere inviati a un'autorità di timestamp; AddSignatureTimestampToCms incorpora quindi il token di timestamp restituito come attributo non firmato, producendo la forma conforme a B-T/B-LTA

Metodi di ICmsSigner

MetodoDescrizione
GetDigestAlgorithmOidRestituisce l'OID dell'algoritmo di hash usato sugli attributi firmati (ad esempio 2.16.840.1.101.3.4.2.1 per SHA-256)
GetSignatureAlgorithmOidRestituisce l'OID dell'algoritmo di firma applicato al digest
GetSignatureAlgorithmParamsRestituisce i parametri dell'algoritmo (spesso vuoto per ECDSA; contiene il blob dei parametri RSA-PSS per PSS)
GetSignerIdRestituisce il TCmsSignerId che identifica il firmatario per issuer/serial o per subject key identifier
SignSignedAttrsDigestEsegue la firma a chiave privata sul digest fornito e restituisce gli ottetti della firma

Funzioni e procedure

RoutineDescrizione
CertKeyAlgorithmOidLegge l'OID dell'algoritmo SubjectPublicKeyInfo da un certificato: è ciò che decide tra un algoritmo di firma RSA e ECDSA; ogni backend di firma lo richiede, per questo vive qui e non dentro uno di essi
ExtractIssuerAndSerialEstrae le TLV raw di issuer e serialNumber trasportate da un SignerIdentifier in IssuerTlv e SerialTlv
EcDsaP1363ToDerIncapsula una firma ECDSA P1363 r||s raw nella sequenza DER di due INTEGER attesa da CMS; token e API crittografiche di piattaforma restituiscono la forma raw
VerifyCmsSignaturePolicyDocumentRichiede un SignaturePolicyOid non vuoto e un SignaturePolicyHash di 32 byte, quindi verifica il documento di policy fornito con SHA-256 e restituisce testo diagnostico in caso di errore
BuildSignedDataCostruisce un ContentInfo CMS RFC 5652 scollegato completo con un CAdES SignerInfo, certificato del firmatario, catena facoltativa e attributi firmati configurati
ExtractSignatureValueEstrae gli ottetti grezzi della firma del SignerInfo usati come input message imprint del timestamp RFC 3161
AddSignatureTimestampToCmsAggiunge un TimeStampToken RFC 3161 completo come attributo non firmato signature-time-stamp e ricodifica le lunghezze contenitore

Tipi

TipoDescrizione
TCmsSignerIdKindsidIssuerAndSerial seleziona Name dell'issuer più TLV seriale e sidSubjectKeyIdentifier seleziona gli ottetti grezzi del subject-key-identifier
TCmsSignerIdKind, IssuerDer, SerialDer e SubjectKeyId contengono la forma di identificatore del SignerInfo selezionata
TCmsBuildOptionsSigningTimeUtc, CommitmentTypeOid, SignaturePolicyOid, SignaturePolicyHash, SignaturePolicyUri e SignaturePolicyDocument configurano gli attributi firmati; Default azzera ogni valore facoltativo

Osservazioni

Vedi anche

FPdfTsa, FPdfCrypto, FPdfSha256, TPdf.SignPades