インクリメンタル PFX 署名ジョブ
署名操作は、正確なオリジナル PDF リビジョンと既存の暗号署名をすべて保持しつつ、別途署名された成果物を返す、検証済みインクリメンタルプロファイルに対応します
プロファイルの選択
{"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}}
デフォルトの pfx-unsigned-document プロファイルは元の挙動を維持し、署名フィールドを持たないソースを受け付けます。page、x1、y1、x2、y2 から新規フィールドを作成し、公開前にソースグラフを復元します
pfx-incremental-document は新しいプロファイルを選択します。profile を省略した場合は incremental: true が等価なセレクターになり、明示的に異なるプロファイルが指定されている場合は競合します
existingField: true は名前付きの空署名フィールドを、フィールドを追加せずに埋めます。そうでなければ操作は新規フィールドを作成し、page と矩形がそのウィジェットを特定します
fieldName のデフォルトは Signature1 で、1〜1024 UTF-8 バイトを受け付けます。existingField にはインクリメンタルプロファイル、一致する署名フィールド、欠落または null の V 値が必要です
読み取り専用 Ff ビット 1 と不正 / 範囲外の整数フラグは準備前に拒否されます。継承された SV / Lock 辞書は、一意の意味的 PDF 名と上限付き親走査で解決されます
シード値とフィールドロック
digestMethod は実際の SHA256、SHA384、SHA512 CMS ダイジェストを選択します。デフォルトは SHA256 で、cades: true は ETSI.CAdES.detached を選び、実際の署名証明書を結び付ける signing-certificate-v2 属性を含めます
reason、location、contactName は PDF Unicode テキスト文字列として書き込まれる UTF-8 JSON 文字列です。必須シード reason は Unicode 値を比較します。reason の省略を要求する特殊な単一ドット値も含みます
必須 SV 制約は実際のハンドラー、CMS SubFilter、対応する署名バージョン、ダイジェスト、reason、証明書権限、法的証明、LockDocument モードをチェックします。必須タイムスタンプは Windows 署名タイムスタンプに記載のアプリケーション転送と明示トラストワークフローを、必須の署名付き失効エビデンスは 認証済み CRL / OCSP 署名を、必須の名前付き外観は 実際に生成される署名外観プリセットを使います
必須 SVCert プロパティーは、実際の PFX リーフ証明書と添付発行者チェーン、許可された証明書バイト、証明書ポリシー OID、キー使用ビット、Unicode サブジェクト DN 属性を署名前に検証します
credentialSourceURL は必須 SVCert URL に対して、アプリケーションが主張するクレデンシャル由来を供給します。ライブラリーは宣言された URL と対応する URLType を比較しますが、そのエンドポイントを開いたり転送 ID を認証したりはしません
All / Include / Exclude のフィールドロックは間接 SigFieldLock 辞書と、ドキュメント Catalog に結び付けられた一致する FieldMDP 参照として書き込まれます。フィールド名は PDF Unicode テキスト文字列で、暗号化ドキュメントでは暗号化されたままです
署名済み Lock の P 値は、元の署名フィールドポリシーを使って後続リビジョンを制限します。DocMDP 権限とは独立です。許可された 2 つ目の署名は正確な先行リビジョンと CMS を保持し、ロックされたフィールドや P1 変更は公開前に拒否されます
ポリシー検索は継承された Parent 名を含め PDF 名エスケープを正確に 1 回デコードします。意味的名前が重複する辞書や不正 / 循環する親は公開前に拒否され、有効なエスケープ名はソースバイトを保持します
contentsBytes のデフォルトは 16384 で、1024〜1048576 を受け付けます。reason、location、contactName は新しい署名辞書に入ります
証明書化と法的証明
certificationPermission は承認署名ではデフォルト 0 です。1 / 2 / 3 は要求された DocMDP 権限の証明書署名を作成し、Catalog Perms DocMDP を実際の間接署名辞書に結び付け、独立した FieldMDP 変換を保持します
証明書化は最初の署名でなければならず、1 つのドキュメントに証明書署名は 1 つだけです。不正な Catalog 権限、未解決の参照、元の署名フィールドバインディングのない DocMDP 値は拒否されます
legalAttestation は証明書署名向けのオプション Unicode 文字列で、Catalog Legal Attestation に書き込まれます。必須 SV LegalAttestation リストは選択されたテキストを含まねばならず、空の必須リストは省略を要求します
既存の P2 / P3 証明書署名は、フィールドロックとリビジョンポリシーが許せば後続の承認署名を許可します。P1 署名とロックされたフィールドはバイナリー公開前に変更を拒否します
ソースコントラクト
インクリメンタルジョブプロファイルは、対応する暗号化 PDF を含む保持されたオリジナルソースと、未変更のロード済みオブジェクトグラフを受け付けます。暗号化ソースには pfxPassword とは別に、署名操作に password を渡してください
ソースパスワードは独立した生スナップショットを認証し、元の暗号化コンテキストを初期化し、署名候補を再オープンします。結果のインクリメンタルリビジョンは、元の暗号文プレフィックス、セキュリティー辞書、永続ドキュメント ID を保持します
復号は内部的にオブジェクトを dirty にしたり、復号済みグラフからセキュリティー辞書を取り除いたりすることがあります。操作はこれらの状態と上限付きオブジェクトシリアライズを、新たに認証したソースベースラインと比較し、実際のグラフ変更とフラッシュ済みオブジェクト状態をすべて拒否します
ユーザーパスワードの場合、既存署名フィールドにはフォーム入力または注釈権限が、新規署名ウィジェットには注釈権限が要求されます。認証済みオーナーパスワードは既存署名ポリシーに従いつつどちらの操作も許可します
SaveLoadedDocumentToStream はシリアライズ状態を変ええます。保存 / 編集済みグラフに署名するときは、保存済みバイトを新しいハンドルへ再読み込みし、そのリビジョンに署名してください
ハンドル寿命のあいだ元ソースストレージを安定させてください。ファイルジョブはスナップショットの読み込みと準備のあいだ書き込み共有を拒否します
元ハンドルはフィールド数、既存フィールド ID、フォーム値、ソースバイト、以前の起動 / デコード設定を保持します。署名成功は常に documentUpdated: false を返し、署名失敗後もハンドルは照会・保存・後続の有効な要求に使えます
ファイルジョブは、ハードリンクを含む入力ファイルと同一またはエイリアスの出力パスを拒否します。直接ストリーム API は識別可能なソースストリーム / ソースファイルのエイリアスを拒否し、呼び出し側も不透明なコールバック出力ストレージを入力ストレージと別に保たなければなりません
準備と検証
操作は生ソースバイトを排他的に作成した一時スナップショットへコピーし、独立したインクリメンタルクローンを開き、上限付き SaveIncrementalUpdate でプレースホルダーを追記し、ネイティブ PFX ストリーム署名器で分離 CMS を埋めます
PFX はサイズプレフライトから署名まで書き込み共有を拒否されたままオープンです。一時ファイルは CREATE_NEW で作成され、操作がその作成を所有するときにのみ削除されます
署名候補は正確なソースバイトプレフィックスと期待されるフォーム / 署名フィールド数を含まねばなりません。新しい署名は選択されたフィールドで検証に成功し、以前に埋められた署名はすべて依然検証に成功し、古い署名のリビジョン分析はすべて DocMDP・FieldMDP・使用権限・ID 制約を受け入れなければなりません
未使用の古いフィールドは preservedSignatures に数えられず保持されます。不正・無効・ポリシー違反の既存署名はバイナリー公開前に拒否の原因になります
既存署名検証は、署名済みバイトとネイティブリビジョンポリシーに対する CMS 完全性をチェックします。新しい署名に timestamp を要求した場合、その応答は公開前に明示的な TSA トラストと設定済み失効エビデンスを別に検証します
予算と公開
実効出力上限は min(outputBytes, memoryBytes / 8) で、ソースプレフィックス全体、追記オブジェクト、xref、署名予約を含みます。effectiveOutputLimit が適用された上限を報告します
未署名候補と署名出力はそれぞれこの上限で制限され、PFX バイトは memoryBytes / 8 に上限付けられます。ソースベースライン・クローン・候補デコード予算はそれぞれ memoryBytes / 8 で別々に上限付けられ、ファイルスピルしきい値は 1 MiB 以下です
これらは操作 / バッファー予算であって厳密なプロセス RSS 保証ではありません。暗号、オブジェクトメタデータ、リビジョン分析、すでにロード済みのソースには追加の常駐メモリーが必要になりえます
キャンセルと経過時間チェックは、ソースコピー、デルタシリアライズ / コピー、候補読み取り、署名検証読み取り、リビジョン分析読み取り、コールバック公開に適用されます。スティッキーなネイティブストリーム失敗はジョブ境界でも予算 / キャンセル区分を保持します
バイナリー出力は最初の出力コールバック前にステージングされ検証され、結果 JSON サイズはバイナリー公開前にチェックされます。コールバック出力自体はアトミックでないため、失敗したバイナリー / 結果コールバックは呼び出し側が破棄すべきバイトを残すことがあります
ファイルジョブは所有する同一ディレクトリー候補へ書き込み、フラッシュし、ソース / 出力ハンドルを閉じ、検証成功後に別のターゲットをアトミックに置き換えます。失敗時は既存宛先を保存します
成功は mediaType: application/pdf、fieldName、profile、incremental、existingField、certificationPermission、revocationInfo、appearanceProfile、preservedSignatures、effectiveOutputLimit、outputBytes、documentUpdated: false を返します
リプレイ受け入れ
$env:HOTPDF_SUPPRESS_AUTO_LAUNCH = '1'
./Tests/CABI/Run-IncrementalSigningAcceptance.ps1 -BuildDLL -CheckFPC
ランナーはレジストリー RootDir から RAD Studio を検出し、RADStudioRoot と PythonExecutable の上書きを受け付け、CheckFPC 選択時には設定された FPC ツールチェーンを使います。FPCOnly はネイティブターゲットのみをリプレイし、OpenSSLWin32Library と OpenSSLWin64Library はアーキテクチャーごとに対応するランタイムライブラリーを選びます
非 GUI ランナーは Win32 / Win64 両ネイティブ API と実際の C ABI DLL を、部分コールバック、既存空フィールド、先行署名、必須シード値、実際の SHA384 / SHA512 CAdES、Unicode メタデータ、許可 / ロックされた 2 つ目の署名、実際の PFX 証明書プロパティー、AES-128 / AES-256 フィールドロック変換、権限制約 / オーナークレデンシャル、誤パスワード、dirty な復号グラフ、正確な暗号化ソーススナップショット、暗号化インプレースライター復帰、実際の DocMDP P1 / P2 CMS フィクスチャー、予算、キャンセル、コールバック失敗、失敗後のソース再利用をチェックします
独立した pypdf・MuPDF・OpenSSL チェックが、正確な先行プレフィックス / バイトレンジ、変更なし暗号化 / 永続 ID、検索可能なオリジナルテキスト、有効な新旧 CMS 値、署名 Contents 暗号化例外、改変された署名コンテンツの拒否を実証します。independent-proof.json がバイトレンジと実証結果を記録します
関連トピック
ドキュメント操作、CopyLoadedSourceToStream、SaveIncrementalUpdate、EHPDFIncrementalOutputBudget