Validação de política de assinatura PAdES
O HotPDF cria e valida o atributo assinado CMS explícito signature-policy-identifier usado por assinaturas PAdES E-EPES
Gerar uma política explícita
Defina SignaturePolicyOID e o digest do documento de política em THPDFCMSSignOptions e depois escolha qualificadores estruturados opcionais
Options := HPDFCMSDefaultOptions(palExtended_E_EPES);
Options.SignaturePolicyOID := '1.2.3.4.5.1';
Options.SignaturePolicyHash := HPDFCMSDigestBytes(PolicyDocument, cmsdaSHA256);
Options.SignaturePolicyURI := 'https://policies.example/approval-v1';
SetLength(Options.SignaturePolicyQualifiers, 1);
Options.SignaturePolicyQualifiers[0].Kind := cmsqUserNotice;
Options.SignaturePolicyQualifiers[0].ExplicitText := 'Approval policy applies';
CMS := HPDFCMSBuildSignedDataEx(KeyMaterial, DocumentDigest, Options);
SignaturePolicyHashAlgOID assume SHA-256 como padrão quando vazio, enquanto SignaturePolicyURI permanece um atalho de compatibilidade para um único qualificador SPuri e pode ser combinado com SignaturePolicyQualifiers
O modelo de qualificador estruturado suporta SPuri, SPUserNotice com uma referência de aviso e um texto explícito opcionais, e SPDocSpecification identificado por OID ou URI
Defina SignaturePolicyHashIsUnknown apenas quando o signatário não conhece o hash da política; o HotPDF então emite a representação de todos os zeros da ETSI no comprimento de digest selecionado
Analisar e relatar
HPDFParseCMSSignature expõe o atributo por meio de THPDFSignatureInfo.SignaturePolicy, incluindo seu identificador, algoritmo de hash, bytes do hash, sinalizador de hash desconhecido, qualificadores e status de validação
Valores de qualificadores conhecidos são decodificados em campos tipados, enquanto um qualificador não reconhecido retém seu OID e seu valor DER bruto para tratamento no nível da aplicação
HPDFSignatureValidationReportToJSON serializa os mesmos dados de política e qualificador com um status de validação legível por máquina
Fixar uma política obrigatória
VerifyOptions := THPDFCMSVerifyOptions.Default;
VerifyOptions.RequireSignaturePolicy := True;
VerifyOptions.ExpectedSignaturePolicyOID := '1.2.3.4.5.1';
VerifyOptions.ExpectedSignaturePolicyHash := ExpectedPolicyHash;
VerifyOptions.SignaturePolicyDocument := PolicyDocument;
VerifyOptions.VerifySignaturePolicyDocumentHash := True;
VerifyOptions.RejectUnknownSignaturePolicyHash := True;
Status := HPDFVerifyCMSSignatureEx(Source, ByteRange, CMS,
VerifyOptions, SignatureInfo);
Os campos de OID e hash esperados restringem apenas o valor correspondente, e a verificação do documento de política calcula o hash mesmo de um documento intencionalmente vazio quando VerifySignaturePolicyDocumentHash é verdadeiro
Políticas ausentes, divergentes, não suportadas ou desconhecidas rejeitadas retornam svSignaturePolicyMismatch e vfcSignaturePolicyMismatch com um THPDFSignaturePolicyValidationStatus preciso
As verificações de política executam antes do trabalho de provedor de assinatura, caminho de certificado ou evidência, e se aplicam apenas a registros SignerInfo primários, de modo que a política do documento pai não restringe contrassassinaturas
Rigor e limites
O analisador rejeita atributos de política duplicados, múltiplos valores, NULL de política implícita, qualificadores conhecidos malformados, valores IA5String não ASCII, Unicode inválido, comprimentos errados de digest conhecidos e tamanhos de coleção acima dos limites de implementação configurados
PAdES E-EPES exige o atributo de política explícito exatamente uma vez e proíbe a entrada /Reason do PDF Signature Dictionary quando esse atributo está presente; a camada CMS não consegue inspecionar o dicionário PDF, então o fluxo de trabalho que produz o PDF precisa impor essa restrição final
Veja CMS multiple primary signers, CMS digest-algorithm consistency e CMS validation reports