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 es el constructor CMS de bajo nivel consumido internamente por la ruta de firma PAdES. Permite a un usuario avanzado ensamblar un valor SignedData de CMS a partir de un resumen SHA-256 de los atributos firmados, una abstracción de firmante, el certificado del firmante y, opcionalmente, una cadena de certificados
La interfaz ICmsSigner es el contrato del backend criptográfico: el llamador proporciona los OID de los algoritmos de resumen y de firma, el identificador del firmante y realiza la operación de clave privada real sobre el resumen de los atributos firmados. Esto desacopla la codificación CMS de cualquier proveedor criptográfico concreto
TCmsBuildOptions puede añadir la hora de firma, el tipo de compromiso y un identificador explícito de política de firma con hash SHA-256 de la política, URI y documento de política opcional en memoria
ExtractSignatureValue extrae los octetos de firma en bruto de un valor CMS terminado, de modo que puedan enviarse a una autoridad de sellado de tiempo; AddSignatureTimestampToCms incrusta entonces el token de sello de tiempo devuelto como un atributo sin firmar, produciendo la forma conforme a B-T/B-LTA
| Método | Descripción |
|---|---|
GetDigestAlgorithmOid | Devuelve el OID del algoritmo de hash utilizado sobre los atributos firmados (por ejemplo 2.16.840.1.101.3.4.2.1 para SHA-256) |
GetSignatureAlgorithmOid | Devuelve el OID del algoritmo de firma aplicado al resumen |
GetSignatureAlgorithmParams | Devuelve los parámetros del algoritmo (a menudo vacío para ECDSA; transporta el blob de parámetros RSA-PSS en el caso de PSS) |
GetSignerId | Devuelve el TCmsSignerId que identifica al firmante por emisor/número de serie o por identificador de clave del sujeto |
SignSignedAttrsDigest | Realiza la firma de clave privada sobre el resumen proporcionado y devuelve los octetos de la firma |
| Rutina | Descripción |
|---|---|
CertKeyAlgorithmOid | Lee el OID del algoritmo SubjectPublicKeyInfo de un certificado, que es lo que decide entre un algoritmo de firma RSA y ECDSA; todos los backends de firma lo necesitan, por eso vive aquí en vez de dentro de uno de ellos |
ExtractIssuerAndSerial | Extrae las TLV en bruto de issuer y serialNumber que lleva un SignerIdentifier, hacia IssuerTlv y SerialTlv |
EcDsaP1363ToDer | Ajusta una firma ECDSA P1363 r||s en bruto en la secuencia DER de dos INTEGER que CMS espera; los tokens y las API de criptografía de la plataforma devuelven la forma en bruto |
VerifyCmsSignaturePolicyDocument | Exige un SignaturePolicyOid no vacío y un SignaturePolicyHash de 32 bytes, luego verifica el documento de política suministrado con SHA-256 y devuelve texto de diagnóstico en caso de fallo |
BuildSignedData | Construye un ContentInfo CMS RFC 5652 separado completo con un SignerInfo CAdES, el certificado del firmante, la cadena opcional y los atributos firmados configurados |
ExtractSignatureValue | Extrae los octetos de firma en bruto del SignerInfo usados como entrada message imprint del sello de tiempo RFC 3161 |
AddSignatureTimestampToCms | Añade un TimeStampToken RFC 3161 completo como atributo sin firmar signature-time-stamp y recodifica las longitudes envolventes |
| Tipo | Descripción |
|---|---|
TCmsSignerIdKind | sidIssuerAndSerial selecciona el Name del emisor más el TLV de número de serie y sidSubjectKeyIdentifier selecciona octetos en bruto del identificador de clave del sujeto |
TCmsSignerId | Kind, IssuerDer, SerialDer y SubjectKeyId transportan la forma de identificador de SignerInfo seleccionada |
TCmsBuildOptions | SigningTimeUtc, CommitmentTypeOid, SignaturePolicyOid, SignaturePolicyHash, SignaturePolicyUri y SignaturePolicyDocument configuran los atributos firmados; Default borra todos los valores opcionales |
TSHA256Digest lo proporciona la unidad FPdfSha256BuildSignedData recibe la cadena de certificados como un open array de certificados codificados en DER; no se exige que el firmante vaya primero; el orden sigue el EncapsulatedCertificateSet de CMS