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 è 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
| Metodo | Descrizione |
|---|---|
GetDigestAlgorithmOid | Restituisce l'OID dell'algoritmo di hash usato sugli attributi firmati (ad esempio 2.16.840.1.101.3.4.2.1 per SHA-256) |
GetSignatureAlgorithmOid | Restituisce l'OID dell'algoritmo di firma applicato al digest |
GetSignatureAlgorithmParams | Restituisce i parametri dell'algoritmo (spesso vuoto per ECDSA; contiene il blob dei parametri RSA-PSS per PSS) |
GetSignerId | Restituisce il TCmsSignerId che identifica il firmatario per issuer/serial o per subject key identifier |
SignSignedAttrsDigest | Esegue la firma a chiave privata sul digest fornito e restituisce gli ottetti della firma |
| Routine | Descrizione |
|---|---|
CertKeyAlgorithmOid | Legge 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 |
ExtractIssuerAndSerial | Estrae le TLV raw di issuer e serialNumber trasportate da un SignerIdentifier in IssuerTlv e SerialTlv |
EcDsaP1363ToDer | Incapsula 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 |
VerifyCmsSignaturePolicyDocument | Richiede 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 |
BuildSignedData | Costruisce un ContentInfo CMS RFC 5652 scollegato completo con un CAdES SignerInfo, certificato del firmatario, catena facoltativa e attributi firmati configurati |
ExtractSignatureValue | Estrae gli ottetti grezzi della firma del SignerInfo usati come input message imprint del timestamp RFC 3161 |
AddSignatureTimestampToCms | Aggiunge un TimeStampToken RFC 3161 completo come attributo non firmato signature-time-stamp e ricodifica le lunghezze contenitore |
| Tipo | Descrizione |
|---|---|
TCmsSignerIdKind | sidIssuerAndSerial seleziona Name dell'issuer più TLV seriale e sidSubjectKeyIdentifier seleziona gli ottetti grezzi del subject-key-identifier |
TCmsSignerId | Kind, IssuerDer, SerialDer e SubjectKeyId contengono la forma di identificatore del SignerInfo selezionata |
TCmsBuildOptions | SigningTimeUtc, CommitmentTypeOid, SignaturePolicyOid, SignaturePolicyHash, SignaturePolicyUri e SignaturePolicyDocument configurano gli attributi firmati; Default azzera ogni valore facoltativo |
TSHA256Digest è fornito dall'unità FPdfSha256BuildSignedData accetta la catena di certificati come open array di certificati codificati DER; il firmatario per primo non è richiesto; l'ordinamento segue il CMS EncapsulatedCertificateSet