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 to niskopoziomowy builder CMS używany wewnętrznie przez ścieżkę podpisu PAdES. Pozwala zaawansowanemu użytkownikowi złożyć wartość CMS SignedData ze skrótu SHA-256 atrybutów podpisanych, abstrakcji podpisującego, certyfikatu podpisującego i opcjonalnego łańcucha certyfikatów
Interfejs ICmsSigner to kontrakt zaplecza kryptograficznego: wywołujący dostarcza OID-y algorytmu skrótu i algorytmu podpisu oraz identyfikator podpisującego, a wykonuje rzeczywistą operację klucza prywatnego na skrócie atrybutów podpisanych. To odseparowuje kodowanie CMS od jakiegokolwiek konkretnego dostawcy kryptografii
TCmsBuildOptions może dodać czas podpisania, typ commitment oraz jawny identyfikator polityki podpisu z haszem SHA-256 polityki, URI i opcjonalnym dokumentem polityki trzymanym w pamięci
ExtractSignatureValue wyciąga surowe oktety podpisu z gotowej wartości CMS, aby można było je wysłać do urzędu znaczników czasu; AddSignatureTimestampToCms osadza następnie zwrócony token znacznika czasu jako atrybut niepodpisany, dając formę zgodną z B-T/B-LTA
| Method | Description |
|---|---|
GetDigestAlgorithmOid | Zwraca OID algorytmu haszującego użytego na atrybutach podpisanych (na przykład 2.16.840.1.101.3.4.2.1 dla SHA-256) |
GetSignatureAlgorithmOid | Zwraca OID algorytmu podpisu zastosowanego do skrótu |
GetSignatureAlgorithmParams | Zwraca parametry algorytmu (często puste dla ECDSA; dla PSS niesie blob parametrów RSA-PSS) |
GetSignerId | Zwraca TCmsSignerId identyfikujący podpisującego po issuer/serial albo po identyfikatorze klucza podmiotu |
SignSignedAttrsDigest | Wykonuje podpis kluczem prywatnym nad przekazanym skrótem i zwraca oktety podpisu |
| Routine | Description |
|---|---|
CertKeyAlgorithmOid | Odczytuje z certyfikatu OID algorytmu z SubjectPublicKeyInfo, który rozstrzyga między algorytmem podpisu RSA a ECDSA; potrzebują go wszystkie zaplecza podpisujące, więc funkcja żyje tutaj, a nie w którymś z nich |
ExtractIssuerAndSerial | Wyciąga surowe TLV issuer i serialNumber, które niesie SignerIdentifier, do IssuerTlv i SerialTlv |
EcDsaP1363ToDer | Opakowuje surowy podpis ECDSA r||s w postaci P1363 w sekwencję DER z dwóch INTEGER, której oczekuje CMS; tokeny i platformowe API kryptograficzne zwracają formę surową |
VerifyCmsSignaturePolicyDocument | Wymaga niepustego SignaturePolicyOid i 32-bajtowego SignaturePolicyHash, po czym weryfikuje dostarczony dokument polityki z SHA-256 i przy niepowodzeniu zwraca tekst diagnostyczny |
BuildSignedData | Buduje kompletny odłączony ContentInfo RFC 5652 CMS z jednym SignerInfo CAdES, certyfikatem podpisującego, opcjonalnym łańcuchem i skonfigurowanymi atrybutami podpisanymi |
ExtractSignatureValue | Wyciąga surowe oktety podpisu SignerInfo używane jako wejście message imprint dla znacznika czasu RFC 3161 |
AddSignatureTimestampToCms | Dodaje pełny TimeStampToken RFC 3161 jako niepodpisany atrybut signature-time-stamp i ponownie koduje otaczające długości |
| Type | Description |
|---|---|
TCmsSignerIdKind | sidIssuerAndSerial wybiera Name issuer plus TLV numeru seryjnego, a sidSubjectKeyIdentifier wybiera surowe oktety identyfikatora klucza podmiotu |
TCmsSignerId | Kind, IssuerDer, SerialDer i SubjectKeyId niosą wybraną formę identyfikatora SignerInfo |
TCmsBuildOptions | SigningTimeUtc, CommitmentTypeOid, SignaturePolicyOid, SignaturePolicyHash, SignaturePolicyUri i SignaturePolicyDocument konfigurują atrybuty podpisane; Default czyści każdą wartość opcjonalną |
TSHA256Digest pochodzi z modułu FPdfSha256BuildSignedData przyjmuje łańcuch certyfikatów jako otwartą tablicę certyfikatów zakodowanych w DER; certyfikat podpisującego na pierwszym miejscu nie jest wymagany, a kolejność podąża za CMS EncapsulatedCertificateSet