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 est le transport d’horodatage non Windows consommé par FPdfTsa, le pendant de FPdfTsaWin. Il envoie en POST un TimeStampReq encodé à l’URL d’une autorité d’horodatage en HTTP ou HTTPS et collecte les octets du TimeStampResp ; la construction et l’analyse du DER restent dans FPdfTsa
Le transport est libcurl, chargé à l’exécution plutôt que lié, si bien que la bibliothèque n’est pas une dépendance de build et que son absence est signalée au lieu de faire échouer le chargement. Passer par libcurl garde aussi la pile TLS hors de cette unité : libcurl choisit son propre backend et valide la chaîne du serveur par rapport au magasin de confiance de la plateforme
TsaHttpAvailable signale si libcurl a été trouvé et les points d’entrée requis résolus ; TsaHttpBackendName nomme le backend résolu ; PostTimeStampQuery effectue l’échange HTTP et renvoie False (au lieu de lever) à tout échec de transport, laissant l’appelant ajouter son propre contexte et sa propre politique de réessai
Toute la section interface est compilée sous FPC uniquement. Sous Delphi, l’unité est vide, car Delphi cible Windows et FPdfTsaWin est le backend là-bas. L’unité se compile quand même sur chaque cible FPC y compris Windows, où FPdfTsa préfère le backend WinHttp et où rien n’appelle celle-ci
Les types de handle libcurl, les liaisons de points d’entrée et les constantes d’options vivent dans la section implementation ; l’interface n’expose que la vérification de disponibilité, le nom du backend, l’aide d’envoi et les trois limites de transport
| Function | Description |
|---|---|
TsaHttpAvailable | Renvoie True lorsque libcurl a été localisé et que chaque point d’entrée requis est résolu à l’exécution |
TsaHttpBackendName | Renvoie le nom du backend résolu, libcurl lorsque le transport est utilisable et une chaîne vide sinon |
PostTimeStampQuery | Envoie en POST ReqDer à TsaUrl et remplit RespDer avec le corps brut du TimeStampResp ; renvoie False à tout échec de transport |
| Constant | Value | Description |
|---|---|---|
TsaMaxResponseBytes | 4 * 1024 * 1024 | Borne supérieure du corps TimeStampResp accepté ; une réponse plus grande abandonne le transfert au lieu de faire croître le tampon sans limite. Maintenue en cohérence avec la même constante dans FPdfTsaWin |
TsaRequestTimeoutSeconds | 30 | Budget de la requête entière en secondes, aligné sur les délais WinHttp pour qu’une TSA morte ne puisse pas bloquer un thread de signature sur l’une ou l’autre plateforme |
TsaConnectTimeoutSeconds | 30 | Budget de connexion en secondes, appliqué avant le budget de la requête |
Content-Type: application/timestamp-query et attend application/timestamp-reply ; Expect: 100-continue est supprimé pour qu’un répondeur silencieux ne puisse pas bloquer un corps de plus de 1 Kohttp et https sont acceptées, et les redirections ne sont pas suivies : un répondeur qui répond par une redirection est traité comme mal configuré plutôt que retenté silencieusement vers un point de terminaison que l’appelant n’a jamais nomméTsaHttpAvailable et le handle est délibérément maintenu ouvert toute la vie du processus, car le décharger pendant qu’un autre thread est dans un transfert ferait tomber l’hôte. Les délais de résolveur basés sur les signaux restent désactivés pour que la signature puisse s’exécuter sur des threads de travailTsaHttpAvailable renvoie False et FPdfTsa signale PadesTsaAvailable = False sauf si un autre transport est enregistré via PadesTimestampOverride