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 è il trasporto dei timestamp non Windows consumato da FPdfTsa, la controparte di FPdfTsaWin. Invia in POST un TimeStampReq codificato all'URL di una timestamp authority via HTTP o HTTPS e raccoglie i byte del TimeStampResp; la costruzione e il parsing del DER restano in FPdfTsa
Il trasporto è libcurl, caricato a runtime anziché linkato, così la libreria non è una dipendenza in fase di build e la sua assenza viene riportata invece di far fallire il caricamento. Passare per libcurl tiene anche lo stack TLS fuori da questa unità: libcurl seleziona il proprio backend e valida la catena del server contro lo store di attendibilità della piattaforma
TsaHttpAvailable riporta se libcurl è stato trovato e gli entry point richiesti risolti; TsaHttpBackendName nomina il backend risolto; PostTimeStampQuery esegue lo scambio HTTP e restituisce False (anziché sollevare) a ogni fallimento del trasporto, lasciando al chiamante il contesto e la politica di retry
L'intera sezione interface viene compilata solo sotto FPC. Sotto Delphi l'unità è vuota, perché Delphi punta a Windows e lì il backend è FPdfTsaWin. L'unità compila comunque su ogni target FPC incluso Windows, dove FPdfTsa preferisce il backend WinHttp e nulla chiama questa
I tipi di handle libcurl, i binding degli entry point e le costanti delle opzioni vivono nella sezione implementation; l'interfaccia espone solo il controllo di disponibilità, il nome del backend, l'helper di invio e i tre limiti di trasporto
| Function | Description |
|---|---|
TsaHttpAvailable | Restituisce True quando libcurl è stato individuato e ogni entry point richiesto è stato risolto a runtime |
TsaHttpBackendName | Restituisce il nome del backend risolto, libcurl quando il trasporto è utilizzabile e una stringa vuota altrimenti |
PostTimeStampQuery | Invia in POST ReqDer a TsaUrl e riempie RespDer con il corpo raw del TimeStampResp; restituisce False a ogni fallimento del trasporto |
| Constant | Value | Description |
|---|---|---|
TsaMaxResponseBytes | 4 * 1024 * 1024 | Limite superiore del corpo TimeStampResp accettato; una risposta più grande interrompe il trasferimento invece di far crescere il buffer senza limiti. Mantenuto sincronizzato con la stessa costante in FPdfTsaWin |
TsaRequestTimeoutSeconds | 30 | Budget dell'intera richiesta in secondi, allineato ai timeout WinHttp perché una TSA morta non possa bloccare un thread di firma su entrambe le piattaforme |
TsaConnectTimeoutSeconds | 30 | Budget di connessione in secondi, applicato prima del budget della richiesta |
Content-Type: application/timestamp-query e si attende application/timestamp-reply; Expect: 100-continue viene soppresso perché un responder silenzioso non possa bloccare un corpo più grande di 1 KBhttp e https, e i redirect non vengono seguiti: un responder che risponde con un redirect viene trattato come mal configurato anziché ritentato silenziosamente verso un endpoint che il chiamante non ha mai nominatoTsaHttpAvailable e l'handle è deliberamente tenuto aperto per tutta la vita del processo, perché scaricarlo mentre un altro thread è dentro un trasferimento abbatterebbe l'host. I timeout del resolver basati su segnali restano disattivati perché la firma possa girare su thread di lavoroTsaHttpAvailable restituisce False e FPdfTsa riporta PadesTsaAvailable = False a meno che un altro trasporto non sia registrato tramite PadesTimestampOverride