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 — транспорт меток времени вне Windows, используемый FPdfTsa, аналог FPdfTsaWin. Он отправляет закодированный TimeStampReq методом POST на URL службы меток времени по HTTP или HTTPS и собирает байты TimeStampResp; построение и разбор DER остаются в FPdfTsa
Транспорт — libcurl, привязываемая во время выполнения, а не линкуемая, поэтому библиотека не является зависимостью сборки, а её отсутствие сообщается вместо провала загрузки. Прохождение через libcurl также оставляет стек TLS за пределами этого модуля: libcurl сама выбирает бэкенд и проверяет цепочку сервера по хранилищу доверия платформы
TsaHttpAvailable сообщает, найдена ли libcurl и разрешены ли требуемые точки входа; TsaHttpBackendName называет разрешённый бэкенд; PostTimeStampQuery выполняет HTTP-обмен и возвращает False (вместо того чтобы возбуждать исключение) при любой ошибке транспорта, позволяя вызывающему коду добавить собственный контекст и политику повторов
Вся секция интерфейса компилируется только под FPC. Под Delphi модуль пуст, потому что Delphi нацелен на Windows и бэкенд там — FPdfTsaWin. Модуль по-прежнему компилируется для любой цели FPC, включая Windows, где FPdfTsa предпочитает бэкенд WinHttp и ничего не вызывает в этот
Типы дескрипторов libcurl, привязки точек входа и константы опций живут в секции реализации; интерфейс открывает только проверку доступности, имя бэкенда, помощник отправки и три транспортных предела
| Function | Description |
|---|---|
TsaHttpAvailable | Возвращает True, когда libcurl обнаружена и все требуемые точки входа разрешены во время выполнения |
TsaHttpBackendName | Возвращает имя разрешённого бэкенда, libcurl, когда транспорт пригоден, и пустую строку в противном случае |
PostTimeStampQuery | Отправляет ReqDer методом POST на TsaUrl и заполняет RespDer сырым телом TimeStampResp; возвращает False при ошибке транспорта |
| Constant | Value | Description |
|---|---|---|
TsaMaxResponseBytes | 4 * 1024 * 1024 | Верхняя граница принимаемого тела TimeStampResp; более крупный ответ прерывает передачу вместо неограниченного роста буфера. Держится синхронно с той же константой в FPdfTsaWin |
TsaRequestTimeoutSeconds | 30 | Бюджет всего запроса в секундах, совпадающий с таймаутами WinHttp, чтобы мёртвая TSA не могла повесить поток подписи на любой из платформ |
TsaConnectTimeoutSeconds | 30 | Бюджет соединения в секундах, применяется до бюджета запроса |
Content-Type: application/timestamp-query и ожидает application/timestamp-reply; Expect: 100-continue подавляется, чтобы молчаливый респондер не мог заблокировать тело больше 1 КБhttp и https, а перенаправления не отслеживаются: респондер, отвечающий перенаправлением, считается неверно настроенным, а не молча повторяется против конечной точки, которую вызывающий код никогда не называлTsaHttpAvailable, и дескриптор сознательно держится открытым всё время жизни процесса, потому что выгрузка, пока другой поток находится внутри передачи, уронила бы хост. Таймауты распознавателя на основе сигналов остаются выключенными, чтобы подпись могла работать в рабочих потокахTsaHttpAvailable возвращает False, а FPdfTsa сообщает PadesTsaAvailable = False, если только другой транспорт не зарегистрирован через PadesTimestampOverride