Incrementele PFX signing-jobs
De sign-operatie ondersteunt een gevalideerd incrementeel profiel dat de exacte originele PDF-revisie en elke bestaande cryptografische signature behoudt, terwijl een apart getekend artefact wordt teruggegeven
Kies een profiel
{"schemaVersion":1,"type":"sign","profile":"pfx-incremental-document",
"pfxFile":"C:/keys/signer.pfx","pfxPassword":"password",
"fieldName":"ApprovalTwo","existingField":true,
"budget":{"memoryBytes":268435456,"outputBytes":134217728,
"resultBytes":16777216,"timeMilliseconds":60000,
"objectCount":1000000,"pageCount":1024}}
Het default pfx-unsigned-document-profiel houdt het oorspronkelijke gedrag aan en accepteert bronnen zonder signature-velden; het maakt een nieuw veld aan met page, x1, y1, x2 en y2 en herstelt de brongraaf vóór publicatie
pfx-incremental-document kiest het nieuwe profiel; incremental: true is een equivalente selector wanneer profile ontbreekt, en conflicteert met een expliciet ander profiel
existingField: true vult het benoemde lege signature-veld zonder nog een veld toe te voegen; anders maakt de operatie een nieuw veld aan, en page en rechthoek identificeren diens widget
Het fieldName-default is Signature1 en accepteert 1 tot en met 1024 UTF-8-bytes; existingField vraagt een incrementeel profiel, een matchend signature-veld en een afwezige of null V-waarde
Read-only Ff-bit 1 en misvormde of out-of-range integer-vlaggen worden geweigerd vóór preparatie; geërfde SV- en Lock-dictionaries worden opgelost met unieke semantische PDF-namen en begrensde parent-traversal
Seed-waarden en field locks
digestMethod kiest de echte SHA256-, SHA384- of SHA512-CMS-digest; SHA256 is de default, terwijl cades: true ETSI.CAdES.detached kiest en het signing-certificate-v2-attribute opneemt dat het echte signing-certificaat bindt
reason, location en contactName zijn UTF-8 JSON-strings die als PDF Unicode-tekststrings worden weggeschreven; vereiste seed-reasons vergelijken diens Unicode-waarden, inclusief de speciale single dot-waarde die een weggelaten reason vereist
Vereiste SV-constraints checken de echte handler, CMS SubFilter, ondersteunde signing-versie, digest, reason, certification permission, legal attestation en LockDocument-modus; een vereiste timestamp gebruikt de application transport- en expliciete trust-workflow uit Windows signing timestamps, vereist signed revocation-bewijs gebruikt geauthenticeerde CRL- en OCSP-signing, en vereiste benoemde appearances gebruiken echte gegenereerde signature-appearance-presets
Vereiste SVCert-properties valideren het echte PFX-leaf-certificaat en de meegenomen issuer-keten, toegestane certificaatbytes, certificate policy OID's, key usage-bits en Unicode subject DN-attributes vóór het signeren
credentialSourceURL levert door de applicatie geclaimde credential-provenance voor een vereiste SVCert-URL; de library vergelijkt de gedeclareerde URL en ondersteunde URLType zonder dat endpoint te openen of een transportidentiteit te authentiseren
All-, Include- en Exclude-field locks worden weggeschreven als een indirecte SigFieldLock-dictionary en een matchende FieldMDP-referentie gebonden aan de document-Catalog; veldnamen gebruiken PDF Unicode-tekststrings en blijven versleuteld in versleutelde documenten
Een signed Lock P-waarde beperkt latere revisies via de originele signed field-policy, onafhankelijk van elke DocMDP-permission; toegestane tweede signatures behouden de exacte vorige revisie en CMS, terwijl een locked veld of een P1-wijziging wordt geweigerd vóór publicatie
Policy-opzoek decodeert PDF name-escapes exact één keer, inclusief geërfde Parent-namen; dictionaries met dubbele semantische namen en ongeldige of cyclische parents worden geweigerd vóór publicatie, terwijl geldige geëscapete namen hun bronbytes behouden
contentsBytes defaultt naar 16384 en accepteert 1024 tot en met 1048576; reason, location en contactName vullen de nieuwe signature-dictionary
Certification en legal attestations
certificationPermission defaultt naar 0 voor approval signing; 1, 2 of 3 maakt een certification signature met de gevraagde DocMDP-permission, bindt Catalog Perms DocMDP aan de echte indirecte signature-dictionary en behoudt elke onafhankelijke FieldMDP-transform
Certification moet de eerste signature zijn, en een document kan maar één certification signature bevatten; misvormde Catalog-permissions, onopgeloste referenties en DocMDP-waarden zonder originele signed field-binding worden geweigerd
legalAttestation is een optionele Unicode-string voor certification signing en wordt weggeschreven naar Catalog Legal Attestation; een vereiste SV LegalAttestation-lijst moet de gekozen tekst bevatten, terwijl een lege vereiste lijst weglating afdwingt
Bestaande P2- en P3-certification-signatures staan latere approval signing toe wanneer field locks en revision policy dat toelaten; P1-signatures en locked velden verwerpen wijzigingen vóór binaire publicatie
Source-contract
Het incrementeel job-profiel accepteert een vastgehouden originele bron, inclusief ondersteunde versleutelde PDF's, en een ongewijzigde geladen objectgraaf; lever password in de sign-operatie aan voor een versleutelde bron, apart van pfxPassword
Het bronwachtwoord authenticeert een onafhankelijke raw snapshot, initialiseert de oorspronkelijke encryptiecontext en heropent de signed candidate; de resulterende incrementele revisie behoudt de originele ciphertext-prefix, security dictionary en permanente document-ID
Decryptie kan intern objecten als dirty markeren of een security dictionary uit de gedecodeerde graaf verwijderen; de operatie vergelijkt deze statussen en begrensde object-serialisaties tegen een vers geauthenticeerde bron-baseline, terwijl echte graafwijzigingen en alle geflushede objectstatussen worden geweigerd
Voor een user password vraagt een bestaand signature-veld form-fill- of annotation-permission, en een nieuw signature-widget vraagt annotation-permission; een geauthenticeerd owner-wachtwoord autoriseert beide operaties, onder voorbehoud van bestaande signature-policies
SaveLoadedDocumentToStream kan serialisatiestatus wijzigen; bij het signeren van een opgeslagen of bewerkte graaf: herlaad de opgeslagen bytes in een nieuwe handle en teken die revisie
Houd originele bronopslag stabiel gedurende de levensduur van de handle; file-jobs weigeren write sharing tijdens het laden en voorbereiden van diens snapshot
De originele handle houdt diens veldaantallen, bestaande veldidentiteit, form-waarden, bronbytes en eerdere launch- en decode-instellingen vast; elke signing-succes geeft documentUpdated: false terug, en signing-falen laten de handle beschikbaar voor opvragen, opslaan of een later geldig request
File-jobs verwerpen een uitvoerpad dat gelijk is aan of aliaset met het invoerbestand, inclusief hard links; directe stream-API's verwerpen herkenbare bronstream- en bronbestand-aliases, en aanroepers moeten bovendien opaque callback-uitvoeropslag gescheiden houden van invoeropslag
Preparatie en validatie
De operatie kopieert raw bronbytes naar een exclusief aangemaakte tijdelijke snapshot, opent een onafhankelijke incrementele kloon, plakt de placeholder aan via begrensde SaveIncrementalUpdate en vult de detached CMS via de native PFX-stream-signer
De PFX blijft open met write sharing geweigerd van size preflight tot signing; tijdelijke bestanden gebruiken CREATE_NEW en worden alleen verwijderd wanneer de operatie eigenaar is van hun creatie
De signed candidate moet de exacte bronbyte-prefix en verwachte form- en signature-veldaantallen bevatten; de nieuwe signature moet in diens gekozen veld verifiëren, elke eerder gevulde signature moet nog steeds verifiëren, en de revisieanalyse van elke oude signature moet DocMDP-, FieldMDP-, usage-rights- en identity-constraints accepteren
Niet-gevulde oude velden worden behouden zonder als preservedSignatures te worden geteld; misvormde, ongeldige of policy-schendende bestaande signatures leiden tot rejectie vóór binaire publicatie
Bestaande signature-verificatie checkt CMS-integriteit tegen signed bytes en native revision policy; wanneer timestamp is aangevraagd voor de nieuwe signature, valideert diens response apart expliciete TSA-trust en geconfigureerd revocation-bewijs vóór publicatie
Budgetten en publicatie
De effectieve uitvoercap is min(outputBytes, memoryBytes / 8) en omvat de complete bronprefix, toegevoegde objecten, xref en signature-reservatie; effectiveOutputLimit rapporteert de toegepaste cap
De unsigned candidate en signed uitvoer zijn apart begrensd door die cap, PFX-bytes zijn afgeklemd op memoryBytes / 8, en bron-baseline-, kloon- en candidate-decode-budgetten zijn apart afgeklemd op memoryBytes / 8 met file-spilling-drempels van hoogstens 1 MiB
Dit zijn operation- en bufferbudgetten, geen strikte proces-RSS-garantie; crypto, object-metadata, revisieanalyse en de al geladen bron van de aanroeper kunnen extra resident geheugen vragen
Annulerings- en elapsed-time-checks gelden voor bronkopie, delta-serialisatie en -kopie, candidate-reads, signature-verificatie-reads, revisieanalyse-reads en callback-publicatie; sticky native stream-falen behouden hun budget- of annuleringscategorie aan de jobgrens
Binaire uitvoer wordt gestaged en gevalideerd vóór de eerste output-callback, en de resultaat-JSON-grootte wordt gecheckt vóór binaire publicatie; callback-uitvoer zelf is niet atomair, dus een gefaalde binary- of result-callback kan bytes achterlaten die de aanroeper moet weggooien
File-jobs schrijven naar een owned candidate in dezelfde directory, flußen hem, sluiten bron- en uitvoerhandles en vervangen atomair een distinct target na geslaagde validatie; fouten behouden een bestaande destination
Succes geeft mediaType: application/pdf, fieldName, profile, incremental, existingField, certificationPermission, revocationInfo, appearanceProfile, preservedSignatures, effectiveOutputLimit, outputBytes en documentUpdated: false terug
Replay-acceptatie
$env:HOTPDF_SUPPRESS_AUTO_LAUNCH = '1'
./Tests/CABI/Run-IncrementalSigningAcceptance.ps1 -BuildDLL -CheckFPC
De runner vindt RAD Studio via diens registry RootDir, accepteert RADStudioRoot- en PythonExecutable-overrides en gebruikt de geconfigureerde FPC-toolchain wanneer CheckFPC is gekozen; FPCOnly replayt alleen die native targets, terwijl OpenSSLWin32Library en OpenSSLWin64Library matchende runtime-libraries per architectuur kiezen
De niet-GUI-runner checkt zowel Win32- als Win64-native API's en echte C ABI-DLL's met partiele callbacks, bestaande lege velden, eerdere signatures, vereiste seed-waarden, echte SHA384- en SHA512-CAdES, Unicode-metadata, toegestane en locked tweede signatures, echte PFX-certificaatproperties, AES-128- en AES-256-field-lock-transforms, permission-beperkingen en owner-credentials, verkeerde wachtwoorden, dirty gedecodeerde grafen, exacte versleutelde bron-snapshots, herstel van versleutelde in-place writers, echte DocMDP P1- en P2-CMS-fixtures, budgetten, annulering, callback-fouten en bronhergebruik na fouten
Onafhankelijke pypdf-, MuPDF- en OpenSSL-checks bewijzen exacte eerdere prefixes en bytebereiken, ongewijzigde encryptie en permanente ID's, doorzoekbare originele tekst, geldige oude en nieuwe CMS-waarden, de signature Contents encryption-uitzondering en rejectie van gewijzigde signed content; independent-proof.json registreert de bytebereiken en proof-resultaten
Verwante topics
Document operations, CopyLoadedSourceToStream, SaveIncrementalUpdate, EHPDFIncrementalOutputBudget