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 de 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 una cadena de certificados opcional
La interfaz ICmsSigner es el contrato del backend criptográfico: quien llama suministra los OID de los algoritmos de resumen y de firma, el identificador del firmante y ejecuta la operación real de clave privada sobre el resumen de los atributos firmados. Esto desacopla la codificación CMS de cualquier proveedor criptográfico específico
TCmsBuildOptions puede agregar la hora de firma, el tipo de compromiso y un identificador explícito de política de firma con hash de política SHA-256, URI y documento de política opcional en memoria
ExtractSignatureValue extrae los octetos de la firma en bruto de un valor CMS terminado para poder enviarlos a una autoridad de sellado de tiempo; AddSignatureTimestampToCms luego incorpora el token de sello de tiempo devuelto como atributo no firmado, produciendo la forma conforme B-T/B-LTA
| Método | Descripción |
|---|---|
GetDigestAlgorithmOid | Devuelve el OID del algoritmo de hash aplicado a 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íos para ECDSA; transporta el blob de parámetros RSA-PSS para PSS) |
GetSignerId | Devuelve el TCmsSignerId que identifica al firmante por emisor/número de serie o por identificador de clave de sujeto |
SignSignedAttrsDigest | Ejecuta la firma de clave privada sobre el resumen suministrado y devuelve los octetos de la firma |
| Rutina | Descripción |
|---|---|
CertKeyAlgorithmOid | Lee el OID del algoritmo SubjectPublicKeyInfo de un certificado, que es lo que determina si se usa un algoritmo de firma RSA o ECDSA; todos los backends de firma lo necesitan, por eso vive aquí y no dentro de uno de ellos |
ExtractIssuerAndSerial | Extrae las TLV crudas de issuer y serialNumber que contiene un SignerIdentifier hacia IssuerTlv y SerialTlv |
EcDsaP1363ToDer | Codifica una firma ECDSA P1363 r||s cruda en la secuencia DER de dos INTEGER que CMS espera; los tokens y las API criptográficas de la plataforma devuelven la forma cruda |
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 falla |
BuildSignedData | Construye un ContentInfo CMS RFC 5652 separado y completo con un SignerInfo CAdES, el certificado del firmante, una cadena opcional y los atributos firmados configurados |
ExtractSignatureValue | Extrae los octetos de firma en bruto del SignerInfo usados como entrada de impresión de mensaje del sello de tiempo RFC 3161 |
AddSignatureTimestampToCms | Agrega un TimeStampToken RFC 3161 completo como atributo no firmado signature-time-stamp y recodifica las longitudes envolventes |
| Tipo | Descripción |
|---|---|
TCmsSignerIdKind | sidIssuerAndSerial selecciona el Name del emisor más el TLV del número de serie y sidSubjectKeyIdentifier selecciona octetos en bruto del identificador de clave de sujeto |
TCmsSignerId | Kind, IssuerDer, SerialDer y SubjectKeyId transportan la forma de identificador del SignerInfo seleccionada |
TCmsBuildOptions | SigningTimeUtc, CommitmentTypeOid, SignaturePolicyOid, SignaturePolicyHash, SignaturePolicyUri y SignaturePolicyDocument configuran los atributos firmados; Default borra cada valor opcional |
TSHA256Digest lo proporciona la unidad FPdfSha256BuildSignedData recibe la cadena de certificados como un arreglo abierto de certificados codificados en DER; no se exige que el firmante vaya primero; el orden sigue el EncapsulatedCertificateSet de CMS