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 to transport znaczników czasu dla platform spoza Windows, używany przez FPdfTsa jako odpowiednik FPdfTsaWin. Wysyła zakodowane TimeStampReq metodą POST na URL urzędu znaczników czasu przez HTTP lub HTTPS i zbiera bajty TimeStampResp; budowanie i parsowanie DER zostaje w FPdfTsa
Transportem jest libcurl, wiązany w czasie działania zamiast konsolidowany, więc biblioteka nie jest zależnością czasu budowania, a jej brak jest raportowany zamiast wywrócić ładowanie. Przejście przez libcurl trzyma też stos TLS poza tym modułem: libcurl wybiera własne zaplecze i waliduje łańcuch serwera względem platformowego magazynu zaufania
TsaHttpAvailable raportuje, czy libcurl zostało znalezione, a wymagane punkty wejścia rozwiązane; TsaHttpBackendName podaje nazwę rozwiązanego zaplecza; PostTimeStampQuery wykonuje wymianę HTTP i zwraca False (zamiast zgłaszać wyjątek) przy każdej awarii transportu, pozwalając wywołującemu dodać własny kontekst i politykę ponawiania
Cała sekcja interfejsu jest kompilowana wyłącznie pod FPC. Pod Delphi moduł jest pusty, ponieważ Delphi celuje w Windows, a zapleczem jest tam FPdfTsaWin. Moduł nadal kompiluje się na każdym celu FPC, łącznie z Windows, gdzie FPdfTsa przedkłada zaplecze WinHttp i nic nie wywołuje tego modułu
Typy uchwytów libcurl, wiązania punktów wejścia i stałe opcji żyją w sekcji implementation; interfejs udostępnia tylko sprawdzenie dostępności, nazwę zaplecza, pomocnik POST i trzy limity transportu
| Function | Description |
|---|---|
TsaHttpAvailable | Zwraca True, gdy libcurl zostało zlokalizowane, a każdy wymagany punkt wejścia rozwiązany w czasie działania |
TsaHttpBackendName | Zwraca nazwę rozwiązanego zaplecza, libcurl, gdy transport jest użyteczny, i pusty ciąg w przeciwnym razie |
PostTimeStampQuery | Wysyła ReqDer metodą POST na TsaUrl i wypełnia RespDer surową treścią TimeStampResp; zwraca False przy awarii transportu |
| Constant | Value | Description |
|---|---|---|
TsaMaxResponseBytes | 4 * 1024 * 1024 | Górna granica akceptowanej treści TimeStampResp; większa odpowiedź przerywa transfer zamiast rozrosnąć bufor bez ograniczenia. Trzymana w zgodzie z tą samą stałą w FPdfTsaWin |
TsaRequestTimeoutSeconds | 30 | Budżet całego żądania w sekundach, dopasowany do limitów WinHttp, aby martwy TSA nie mógł zawiesić wątku podpisującego na żadnej z platform |
TsaConnectTimeoutSeconds | 30 | Budżet nawiązania połączenia w sekundach, nakładany przed budżetem żądania |
Content-Type: application/timestamp-query i oczekuje application/timestamp-reply; Expect: 100-continue jest tłumione, aby milczący responder nie mógł zablokować treści większej niż 1 KBhttp i https, a przekierowania nie są wykonywane: responder odpowiadający przekierowaniem jest traktowany jako źle skonfigurowany, a nie po cichu ponawiany względem punktu końcowego, którego wywołujący nigdy nie podałTsaHttpAvailable, a uchwyt jest celowo utrzymywany otwarty przez czas życia procesu, ponieważ jego wyładowanie w chwili, gdy inny wątek jest w trakcie transferu, powaliłoby hosta. Limity czasu resolvera oparte na sygnałach pozostają wyłączone, aby podpisywanie mogło działać na wątkach roboczychTsaHttpAvailable zwraca False, a FPdfTsa raportuje PadesTsaAvailable = False, chyba że inny transport został zarejestrowany przez PadesTimestampOverride