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 é o construtor CMS de baixo nível consumido internamente pelo caminho de assinatura PAdES. Ele permite que um usuário avançado monte um valor CMS SignedData a partir de um resumo da mensagem SHA-256 dos atributos assinados, de uma abstração de signatário, do certificado do signatário e de uma cadeia de certificados opcional
A interface ICmsSigner é o contrato do back-end criptográfico: o chamador fornece os OIDs dos algoritmos de resumo e de assinatura, o identificador do signatário e executa a operação de chave privada de fato sobre o resumo dos atributos assinados. Isso desacopla a codificação CMS de qualquer provedor criptográfico específico
TCmsBuildOptions pode adicionar hora de assinatura, tipo de compromisso e um identificador explícito de política de assinatura com hash SHA-256 da política, URI e documento de política opcional em memória
ExtractSignatureValue extrai os octetos de assinatura brutos de um valor CMS finalizado para que possam ser enviados a uma autoridade de carimbo de data/hora; AddSignatureTimestampToCms então incorpora o token de carimbo de data/hora retornado como um atributo não assinado, produzindo a forma compatível com B-T/B-LTA
| Method | Description |
|---|---|
GetDigestAlgorithmOid | Retorna o OID do algoritmo de hash usado sobre os atributos assinados (por exemplo, 2.16.840.1.101.3.4.2.1 para SHA-256) |
GetSignatureAlgorithmOid | Retorna o OID do algoritmo de assinatura aplicado ao resumo |
GetSignatureAlgorithmParams | Retorna os parâmetros do algoritmo (frequentemente vazio para ECDSA; contém o blob de parâmetros RSA-PSS para PSS) |
GetSignerId | Retorna o TCmsSignerId que identifica o signatário por emissor/número de série ou por identificador de chave de sujeito |
SignSignedAttrsDigest | Executa a assinatura de chave privada sobre o resumo fornecido e retorna os octetos da assinatura |
| Rotina | Descrição |
|---|---|
CertKeyAlgorithmOid | Lê o OID do algoritmo SubjectPublicKeyInfo de um certificado, que é o que decide entre um algoritmo de assinatura RSA e ECDSA; todo backend de assinatura precisa dele, por isso ele vive aqui em vez de dentro de um deles |
ExtractIssuerAndSerial | Extrai as TLVs brutas de issuer e serialNumber que um SignerIdentifier carrega, para IssuerTlv e SerialTlv |
EcDsaP1363ToDer | Empacota uma assinatura ECDSA P1363 r||s bruta na sequência DER de dois INTEGER que o CMS espera; tokens e APIs de criptografia de plataforma devolvem a forma bruta |
VerifyCmsSignaturePolicyDocument | Exige um SignaturePolicyOid não vazio e um SignaturePolicyHash de 32 bytes, então verifica o documento de política fornecido com SHA-256 e retorna texto de diagnóstico em caso de falha |
BuildSignedData | Constrói um ContentInfo CMS RFC 5652 separado completo com um SignerInfo CAdES, certificado do signatário, cadeia opcional e atributos assinados configurados |
ExtractSignatureValue | Extrai os octetos brutos de assinatura do SignerInfo usados como entrada de message imprint do carimbo de data/hora RFC 3161 |
AddSignatureTimestampToCms | Adiciona um TimeStampToken RFC 3161 completo como atributo não assinado signature-time-stamp e recodifica os comprimentos delimitadores |
| Type | Description |
|---|---|
TCmsSignerIdKind | sidIssuerAndSerial seleciona emissor Name mais TLV de número de série e sidSubjectKeyIdentifier seleciona octetos brutos de identificador-de-chave-de-sujeito |
TCmsSignerId | Kind, IssuerDer, SerialDer e SubjectKeyId contêm a forma de identificador do SignerInfo selecionada |
TCmsBuildOptions | SigningTimeUtc, CommitmentTypeOid, SignaturePolicyOid, SignaturePolicyHash, SignaturePolicyUri e SignaturePolicyDocument configuram atributos assinados; Default limpa todos os valores opcionais |
TSHA256Digest é fornecido pela unidade FPdfSha256BuildSignedData recebe a cadeia de certificados como um array aberto de certificados codificados em DER; o signatário primeiro não é exigido; a ordenação segue o EncapsulatedCertificateSet do CMS