Incremental PFX Signing Jobs
Operace sign podporuje validovaný inkrementální profil, který zachovává přesnou původní PDF revizi i každý stávající kryptografický podpis, zatímco vrací samostatně podepsaný artefakt
Výběr profilu
{"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}}
Defaultní profil pfx-unsigned-document si uchovává původní chování a přijímá zdroje bez jakýchkoli polí podpisů; nové pole vytvoří pomocí page, x1, y1, x2 a y2 a zdrojový graf obnoví, dřív než publikace
pfx-incremental-document vybere nový profil; incremental: true je ekvivalentní selektor, když je profile vynechané, a koliduje s explicitně odlišným profilem
existingField: true vyplní pojmenované prázdné pole podpisu, aniž by přidal další pole; jinak operace vytvoří nové pole a stránka a obdélník identifikují jeho widget
Default fieldName je Signature1 a přijímá 1 až 1024 UTF-8 bajtů; existingField vyžaduje inkrementální profil, odpovídající pole podpisu a chybějící či null hodnotu V
Read-only Ff bit 1 i poškozené či mimo rozsah ležící celočíselné příznaky se odmítnou, dřív než příprava; zděděné slovníky SV a Lock se rozřeší s unikátními sémantickými PDF názvy i ohraničeným traversal rodičů
Seed hodnoty a zámky polí
digestMethod vybere skutečný CMS digest SHA256, SHA384 či SHA512; default je SHA256, zatímco cades: true vybere ETSI.CAdES.detached a zahrne atribut signing-certificate-v2 navazující skutečný podepisující certifikát
reason, location a contactName jsou UTF-8 JSON řetězce zapisované jako PDF Unicode textové řetězce; vyžadované seed důvody porovnávají své Unicode hodnoty, tedy i speciální hodnotu jediné tečky vyžadující vynechaný důvod
Vyžadovaná omezení SV kontrolují skutečný handler, SubFilter CMS, podporovanou podepisovací verzi, digest, důvod, certifikační oprávnění, právní upřesnění i režim LockDocument; vyžadovaný timestamp použije transport aplikace i explicitní trust workflow popsané v Windows podepisovacích timestampech, vyžadované podepsané revokační důkazy autentizované podepisování CRL a OCSP a vyžadované pojmenované appearance skutečně generované presety podpisových appearance
Vyžadované vlastnosti SVCert validují skutečný listový certifikát PFX i zahrnutý řetězec vystavitelů, dovolené bajty certifikátů, OID politik certifikátů, bity key usage i Unicode atributy subjektového DN, dřív než podepsání
credentialSourceURL dodá provenience přihlašovacích údajů tvrzenou aplikací pro vyžadované URL SVCert; knihovna porovná deklarované URL i podporovaný URLType, aniž by ten endpoint otevřela či autentizovala transportní identitu
Zámky polí All, Include a Exclude se zapíší jako nepřímý slovník SigFieldLock i odpovídající reference FieldMDP navázaná na katalog dokumentu; názvy polí používají PDF Unicode textové řetězce a v šifrovaných dokumentech zůstávají šifrované
Podepsaná hodnota Lock P omezuje pozdější revize podle původní politiky podepsaného pole, nezávisle na jakémkoli oprávnění DocMDP; povolené druhé podpisy zachovávají přesnou předchozí revizi i CMS, zatímco uzamčené pole či změna P1 se odmítne, dřív než publikace
Vyhledávání politik dekóduje PDF name escapování přesně jednou, tedy i zděděné názvy Parent; slovníky s duplicitními sémantickými názvy i neplatní či cykličtí rodiče se odmítnou, dřív než publikace, zatímco platné escapované názvy si uchovají své zdrojové bajty
contentsBytes defaultuje na 16384 a přijímá 1024 až 1048576; reason, location a contactName naplní nový slovník podpisu
Certifikace a právní upřesnění
certificationPermission defaultuje na 0 u schvalovacího podepisování; 1, 2 či 3 vytvoří certifikační podpis s vyžádaným oprávněním DocMDP, naváže Catalog Perms DocMDP na skutečný nepřímý slovník podpisu a zachová jakoukoli nezávislou transformaci FieldMDP
Certifikace musí být prvním podpisem a dokument může obsahovat jen jeden certifikační podpis; poškozená katalogová oprávnění, nerozřešené reference i hodnoty DocMDP bez vazby na původní podepsané pole se odmítnou
legalAttestation je volitelný Unicode řetězec pro certifikační podepisování a zapisuje se do Catalog Legal Attestation; vyžadovaný seznam SV LegalAttestation musí obsahovat vybraný text, zatímco prázdný vyžadovaný seznam vyžaduje vynechání
Stávající certifikační podpisy P2 a P3 dovolí pozdější schvalovací podepsání, když to dovolí zámky polí i politika revizí; podpisy P1 i uzamčená pole změny odmítnou, dřív než binární publikace
Zdrojový kontrakt
Inkrementální job profil přijme držený původní zdroj, tedy i podporovaná šifrovaná PDF, a nezměněný načtený objektový graf; heslo pro šifrovaný zdroj dodávejte v operaci sign, odděleně od pfxPassword
Zdrojové heslo autentizuje nezávislý surový snapshot, inicializuje původní šifrovací kontext a znovu otevře podepsaného kandidáta; výsledná inkrementální revize zachová původní ciphertext předponu, bezpečnostní slovník i permanentní ID dokumentu
Dešifrování může interně označit objekty za zašpiněné či odstranit bezpečnostní slovník z dešifrovaného grafu; operace porovná ty stavy i ohraničené objektové serializace proti čerstvě autentizované zdrojové základně, zatímco skutečné grafové změny i všechny flushnuté objektové stavy odmítne
U user hesla vyžaduje stávající pole podpisu oprávnění k vyplňování formulářů či anotacím a nový widget podpisu oprávnění k anotacím; autentizované owner heslo autorizuje kteroukoli operaci, podléhajíc stávajícím politikám podpisů
SaveLoadedDocumentToStream může změnit serializační stav; když podepisujete uložený či editovaný graf, uložené bajty znovu načtěte do nového handlu a podepište tu revizi
Původní úložiště zdroje držte stabilní po celou životnost handlu; file joby při načítání i přípravě svého snapshotu odepřou sdílení zápisu
Původní handle si uchová počty polí, identitu stávajících polí, hodnoty formulářů, zdrojové bajty i předchozí nastavení spuštění a dekódování; každý úspěch podepsání vrací documentUpdated: false a selhání podepsání ponechá handle dostupný pro dotazování, ukládání či pozdější platnou žádost
File joby odmítnou výstupní cestu rovnající se vstupnímu souboru či jeho alias, tedy i hard linky; přímé stream API odmítnou rozpoznatelné aliasy zdrojového streamu i zdrojového souboru a volající musí navíc držet neprůhledné úložiště výstupu callbacků oddělené od vstupního úložiště
Příprava a validace
Operace zkopíruje surové zdrojové bajty do výhradně vytvořeného dočasného snapshotu, otevře nezávislý inkrementální klon, připojí placeholder přes ohraničené SaveIncrementalUpdate a vyplní detached CMS nativním stream podepisovačem PFX
PFX zůstává otevřený se zakázaným sdílením zápisu od preflightu velikosti až po podepsání; dočasné soubory použijí CREATE_NEW a odstraní se jen tehdy, když operace vlastní jejich tvorbu
Podepsaný kandidát musí obsahovat přesnou zdrojovou bajtovou předponu i očekávané počty formulářových a podpisových polí; nový podpis se musí verifikovat ve svém vybraném poli, každý dřív naplněný podpis pořád verifikovat a revizní analýza každého starého podpisu musí přijmout omezení DocMDP, FieldMDP, uživatelských práv i identity
Nenaplněná stará pole se zachovají, aniž by se počítala jako preservedSignatures; poškozené, neplatné či politiku porušující stávající podpisy způsobí odmítnutí, dřív než binární publikace
Verifikace stávajících podpisů kontroluje integritu CMS proti podepsaným bajtům i nativní politice revize; když se u nového podpisu vyžaduje timestamp, jeho odpověď samostatně validuje explicitní TSA důvěru i nakonfigurované revokační důkazy, dřív než publikace
Rozpočty a publikace
Účinný strop výstupu je min(outputBytes, memoryBytes / 8) a zahrnuje celou zdrojovou předponu, připojené objekty, xref i rezervaci podpisu; effectiveOutputLimit reportuje aplikovaný strop
Nepodepsaný kandidát i podepsaný výstup se ohraničují tím stropem samostatně, bajty PFX se ořežou na memoryBytes / 8 a rozpočty dekódování zdrojové základně, klonu i kandidáta se samostatně ořežou na memoryBytes / 8 s prahy spill souborů nejvýše 1 MiB
Toto jsou rozpočty operací a bufferů, nikoli přísná záruka RSS procesu; kryptografie, metadata objektů, revizní analýza i už načtený zdroj volajícího mohou vyžadovat dodatečnou rezidentní paměť
Kontroly zrušení i uplynulého času platí pro kopii zdroje, delta serializaci a kopii, čtení kandidáta, čtení verifikace podpisu, čtení revizní analýzy i publikaci callbackem; lepivé nativní selhání streamů si u hranice jobu uchovají svou kategorii rozpočtu či zrušení
Binární výstup se odstageuje a zvaliduje, dřív než první výstupní callback a velikost výsledkového JSON se kontroluje, dřív než binární publikace; samotný výstup callbackem není atomický, takže neúspěšný binární či výsledkový callback může zanechat bajty, které musí volající zahodit
File joby zapisují do vlastněného kandidáta ve stejném adresáři, flushnou ho, zavřou handly zdroje i výstupu a atomicky vymění odlišný cíl po úspěšné validaci; selhání zachovají existující cíl
Úspěch vrací mediaType: application/pdf, fieldName, profile, incremental, existingField, certificationPermission, revocationInfo, appearanceProfile, preservedSignatures, effectiveOutputLimit, outputBytes a documentUpdated: false
Akceptace replayem
$env:HOTPDF_SUPPRESS_AUTO_LAUNCH = '1'
./Tests/CABI/Run-IncrementalSigningAcceptance.ps1 -BuildDLL -CheckFPC
Runner odhalí RAD Studio přes její registrní RootDir, přijme přepisy RADStudioRoot a PythonExecutable a při zvoleném CheckFPC použije nakonfigurovaný toolchain FPC; FPCOnly přehraje jen ty nativní cíle, zatímco OpenSSLWin32Library a OpenSSLWin64Library vyberou odpovídající runtime knihovny pro každou architekturu
Non-GUI runner kontroluje nativní API Win32 i Win64 i skutečné C ABI DLL pomocí částečných callbacků, stávajících prázdných polí, předchozích podpisů, vyžadovaných seed hodnot, skutečných CAdES SHA384 a SHA512, Unicode metadat, povolených i uzamčených druhých podpisů, skutečných vlastností certifikátu PFX, transformací zámku polí AES-128 a AES-256, restrikcí oprávnění i přihlašovacích údajů vlastníkem, špatných hesel, zašpiněných dešifrovaných grafů, přesných šifrovaných zdrojových snapshotů, zotavení šifrovaného in-place writeru, skutečných CMS fixtur DocMDP P1 a P2, rozpočtů, zrušení, selhání callbacků i znovupoužití zdroje po selháních
Nezávislé kontroly pypdf, MuPDF a OpenSSL dokážou přesné předchozí předpony i bajtové rozsahy, nezměněné šifrování i permanentní ID, prohledávatelný původní text, platné staré i nové CMS hodnoty, výjimku šifrování Contents podpisu i odmítání změněného podepsaného obsahu; independent-proof.json zaznamená bajtové rozsahy i výsledky důkazů
Související témata
Dokumentové operace, CopyLoadedSourceToStream, SaveIncrementalUpdate, EHPDFIncrementalOutputBudget