PDFium Delphi Component 文件

FPdfTsaFpc 单元

单元: FPdfTsaFpc
Free Pascal libcurl 时间戳传输后端,把 RFC 3161 请求以 POST 方式发送到时间戳机构 URL 并返回响应字节

语法

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。它通过 HTTP 或 HTTPS 把编码后的 TimeStampReq 以 POST 方式发送到时间戳机构 URL,并收集 TimeStampResp 字节;DER 的构建与解析仍留在 FPdfTsa

传输层是 libcurl,在运行时绑定而不是链接,因此该库不是构建期依赖,缺失时会被报告而不是导致加载失败。经由 libcurl 还能让 TLS 栈远离本单元:libcurl 自行选择后端,并针对平台信任存储区校验服务器链

TsaHttpAvailable 报告是否找到了 libcurl 并解析出所需入口点;TsaHttpBackendName 给出解析到的后端名称;PostTimeStampQuery 执行 HTTP 交换,任何传输失败都返回 False(而不是抛出异常),让调用方附加自己的上下文与重试策略

整个接口部分只在 FPC 下编译。在 Delphi 下本单元为空,因为 Delphi 面向 Windows,那里由 FPdfTsaWin 担任后端。本单元仍能在包括 Windows 在内的所有 FPC 目标上编译,只是 Windows 上 FPdfTsa 优先使用 WinHttp 后端,不会有任何代码调用本单元

libcurl 句柄类型、入口点绑定和选项常量位于实现部分;接口只公开可用性检查、后端名称、POST 辅助函数和三个传输限制

函数

FunctionDescription
TsaHttpAvailable当运行时找到 libcurl 且所有必需入口点解析成功时返回 True
TsaHttpBackendName返回解析到的后端名称,传输可用时为 libcurl,否则为空字符串
PostTimeStampQuery把 ReqDer 以 POST 方式发送到 TsaUrl,并用原始 TimeStampResp 主体填充 RespDer;传输失败时返回 False

常量

ConstantValueDescription
TsaMaxResponseBytes4 * 1024 * 1024可接受的 TimeStampResp 主体上限;更大的响应会中止传输,而不是无限制地扩容缓冲区。与 FPdfTsaWin 中的同名常量保持一致
TsaRequestTimeoutSeconds30整个请求的秒级预算,与 WinHttp 超时一致,因此无响应的 TSA 无法在任一平台上挂起签名线程
TsaConnectTimeoutSeconds30连接的秒级预算,先于请求预算应用

备注

参见

FPdfTsa, FPdfTsaWin, FPdfCms, TPdf.SignPades