const
TsaMaxResponseBytes = 4 * 1024 * 1024;
TsaRequestTimeoutSeconds = 30;
TsaConnectTimeoutSeconds = 30;
function TsaHttpAvailable: Boolean;
function TsaHttpBackendName: string;
function PostTimeStampQuery(const TsaUrl: string; const ReqDer: TBytes;
out RespDer: TBytes): Boolean;
FPdfTsaFpc は、FPdfTsa が利用する非 Windows 向けタイムスタンプトランスポートで、FPdfTsaWin と対になる存在です。エンコード済みの TimeStampReq を HTTP または HTTPS でタイムスタンプ機関の URL に POST し、TimeStampResp のバイト列を受け取ります。DER の構築と解析は FPdfTsa の側にあります
トランスポートは libcurl で、リンクではなく実行時にバインドされます。そのためライブラリはビルド時の依存ではなく、存在しないことは読み込みの失敗ではなく報告されます。libcurl を経由することで、TLS スタックもこのユニットの外に保たれます。libcurl が自身のバックエンドを選び、サーバーのチェーンをプラットフォームの信頼ストアに対して検証します
TsaHttpAvailable は libcurl が見つかり必要なエントリポイントが解決されたかを報告し、TsaHttpBackendName は解決されたバックエンドの名前を返します。PostTimeStampQuery は HTTP のやり取りを行い、トランスポートの失敗時には例外ではなく False を返します。呼び出し側が自分のコンテキストとリトライ方針を追加できます
interface セクション全体は FPC の下でのみコンパイルされます。Delphi の下ではこのユニットは空です。Delphi は Windows をターゲットとし、そこでは FPdfTsaWin がバックエンドだからです。それでもこのユニットは Windows を含むすべての FPC ターゲットでコンパイルできます。Windows では FPdfTsa は WinHttp バックエンドを優先し、このユニットを呼ぶものはありません
libcurl のハンドル型、エントリポイントのバインディング、オプション定数は implementation セクションにあります。interface が公開するのは、可用性チェック、バックエンド名、送信ヘルパー、3 つのトランスポート上限だけです
| 関数 | 説明 |
|---|---|
TsaHttpAvailable | libcurl が見つかり、必要なすべてのエントリポイントが実行時に解決されていれば True を返します |
TsaHttpBackendName | 解決されたバックエンドの名前を返します。トランスポートが使えるなら libcurl、そうでなければ空文字列です |
PostTimeStampQuery | ReqDer を TsaUrl に POST し、生の TimeStampResp ボディを RespDer に格納します。トランスポートの失敗時には False を返します |
| 定数 | 値 | 説明 |
|---|---|---|
TsaMaxResponseBytes | 4 * 1024 * 1024 | 受け付ける TimeStampResp ボディの上限です。それより大きいレスポンスは、バッファを無制限に育てる代わりに転送を中断します。FPdfTsaWin の同じ定数と同期が保たれています |
TsaRequestTimeoutSeconds | 30 | リクエスト全体の予算 (秒) です。WinHttp のタイムアウトと一致しており、死んだ TSA がどちらのプラットフォームでも署名スレッドをハングさせられません |
TsaConnectTimeoutSeconds | 30 | 接続の予算 (秒) です。リクエスト予算の前に適用されます |
Content-Type: application/timestamp-query で送られ、application/timestamp-reply を期待します。Expect: 100-continue は抑制されます。無言のレスポンダが 1 KB を超えるボディを止められないようにするためですhttp と https の URL だけで、リダイレクトは追跡しません。リダイレクトで応答するレスポンダは、呼び出し側が名指ししていないエンドポイントへ黙ってリトライされるのではなく、設定ミスとして扱われますTsaHttpAvailable の最初の呼び出しで読み込まれ、ハンドルは意図的にプロセスの寿命の間開いたままにされます。別のスレッドが転送中にアンロードするとホストが落ちるためです。シグナルベースのリゾルバタイムアウトは無効のままです。ワーカースレッドで署名できるようにするためですTsaHttpAvailable は False を返し、別のトランスポートが PadesTimestampOverride で登録されていない限り FPdfTsa は PadesTsaAvailable = False を報告します