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 ist das Nicht-Windows-Zeitstempel-Transportstück, das FPdfTsa konsumiert - das Gegenstück zu FPdfTsaWin. Es POSTet einen kodierten TimeStampReq über HTTP oder HTTPS an eine Zeitstempelautoritäts-URL und sammelt die TimeStampResp-Bytes; den DER aufzubauen und zu parsen, bleibt in FPdfTsa
Der Transport ist libcurl, zur Laufzeit gebunden statt gelinkt, daher ist die Bibliothek keine Build-Zeit-Abhängigkeit, und ihr Fehlen wird gemeldet, statt das Laden scheitern zu lassen. Der Weg über libcurl hält auch den TLS-Stack aus dieser Unit heraus: libcurl wählt sein eigenes Backend und validiert die Serverkette gegen den Plattform-Trust Store
TsaHttpAvailable meldet, ob libcurl gefunden wurde und die erforderlichen Einstiegspunkte aufgelöst sind; TsaHttpBackendName nennt den aufgelösten Backend-Namen; PostTimeStampQuery führt den HTTP-Austausch durch und gibt bei jedem Transportfehler False zurück (statt eine Exception zu werfen), sodass der Aufrufer eigenen Kontext und eigene Wiederholungslogik ergänzen kann
Der gesamte Interface-Abschnitt wird nur unter FPC kompiliert. Unter Delphi ist die Unit leer, denn Delphi zielt auf Windows, und dort ist FPdfTsaWin das Backend. Die Unit kompiliert weiterhin für jedes FPC-Ziel inklusive Windows, wo FPdfTsa das WinHttp-Backend bevorzugt und nichts in diese Unit aufruft
Die libcurl-Handle-Typen, Einstiegspunkt-Bindungen und Optionskonstanten liegen im Implementation-Abschnitt; das Interface stellt nur die Verfügbarkeitsprüfung, den Backend-Namen, den Post-Helfer und die drei Transportgrenzen bereit
| Funktion | Beschreibung |
|---|---|
TsaHttpAvailable | Gibt True zurück, wenn libcurl gefunden wurde und jeder erforderliche Einstiegspunkt zur Laufzeit aufgelöst wurde |
TsaHttpBackendName | Gibt den Namen des aufgelösten Backends zurück, libcurl, wenn der Transport nutzbar ist, sonst einen leeren String |
PostTimeStampQuery | POSTet ReqDer an TsaUrl und füllt RespDer mit dem rohen TimeStampResp-Body; gibt bei Transportfehlern False zurück |
| Konstante | Wert | Beschreibung |
|---|---|---|
TsaMaxResponseBytes | 4 * 1024 * 1024 | Obergrenze für den akzeptierten TimeStampResp-Body; eine größere Antwort bricht die Übertragung ab, statt den Puffer unbegrenzt wachsen zu lassen. Wird mit derselben Konstante in FPdfTsaWin synchron gehalten |
TsaRequestTimeoutSeconds | 30 | Gesamtbudget für die Anforderung in Sekunden, passend zu den WinHttp-Timeouts, damit eine tote TSA auf keiner Plattform einen Signatur-Thread blockieren kann |
TsaConnectTimeoutSeconds | 30 | Verbindungsbudget in Sekunden, wird vor dem Anforderungsbudget angewendet |
Content-Type: application/timestamp-query raus und erwartet application/timestamp-reply; Expect: 100-continue wird unterdrückt, damit ein stiller Responder keinen Body über 1 KB blockieren kannhttp- und https-URLs werden akzeptiert, und Weiterleitungen werden nicht gefolgt: Ein Responder, der mit einer Weiterleitung antwortet, gilt als fehlkonfiguriert, statt gegen einen Endpunkt erneut versucht zu werden, den der Aufrufer nie genannt hatTsaHttpAvailable-Aufruf geladen, und das Handle bleibt bewusst für die Lebensdauer des Prozesses offen, denn ein Entladen, während sich ein anderer Thread in einer Übertragung befindet, würde den Host reißen. Signalbasierte Resolver-Timeouts bleiben aus, damit Signieren auf Worker-Threads laufen kannTsaHttpAvailable False zurück, und FPdfTsa meldet PadesTsaAvailable = False, sofern nicht über PadesTimestampOverride ein anderer Transport registriert wurde