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 es el transporte de marcas de tiempo para entornos que no son Windows que consume FPdfTsa, el homólogo de FPdfTsaWin. Envía por POST un TimeStampReq codificado a la URL de una autoridad de sellado de tiempo por HTTP o HTTPS y recoge los bytes del TimeStampResp; construir y analizar el DER queda en FPdfTsa
El transporte es libcurl, vinculada en tiempo de ejecución en lugar de vincularse estáticamente, de modo que la biblioteca no es una dependencia de compilación y su ausencia se informa en lugar de hacer fallar la carga. Pasar por libcurl mantiene además fuera de esta unidad la pila TLS: libcurl elige su propio backend y valida la cadena del servidor contra el almacén de confianza de la plataforma
TsaHttpAvailable informa de si libcurl se encontró y los puntos de entrada necesarios se resolvieron; TsaHttpBackendName nombra el backend resuelto; PostTimeStampQuery realiza el intercambio HTTP y devuelve False (en lugar de lanzar una excepción) ante cualquier fallo de transporte, dejando que quien llama añada su propio contexto y su propia política de reintentos
Toda la sección de interfaz se compila solo bajo FPC. Bajo Delphi la unidad está vacía, porque Delphi apunta a Windows y allí el backend es FPdfTsaWin. La unidad sigue compilando en todos los destinos FPC, incluido Windows, donde FPdfTsa prefiere el backend WinHttp y nada llama a esta
Los tipos de identificadores de libcurl, los enlaces de los puntos de entrada y las constantes de opciones viven en la sección de implementación; la interfaz expone solo la comprobación de disponibilidad, el nombre del backend, el ayudante de POST y los tres límites de transporte
| Función | Descripción |
|---|---|
TsaHttpAvailable | Devuelve True cuando libcurl se localizó y todos los puntos de entrada necesarios se resolvieron en tiempo de ejecución |
TsaHttpBackendName | Devuelve el nombre del backend resuelto, libcurl cuando el transporte es utilizable y una cadena vacía en caso contrario |
PostTimeStampQuery | Envía por POST ReqDer a TsaUrl y llena RespDer con el cuerpo bruto del TimeStampResp; devuelve False ante un fallo de transporte |
| Constante | Valor | Descripción |
|---|---|---|
TsaMaxResponseBytes | 4 * 1024 * 1024 | Límite superior del cuerpo de TimeStampResp aceptado; una respuesta mayor aborta la transferencia en lugar de hacer crecer el búfer sin límite. Se mantiene sincronizada con la misma constante de FPdfTsaWin |
TsaRequestTimeoutSeconds | 30 | Presupuesto de la solicitud completa en segundos, a juego con los timeouts de WinHttp para que una TSA muerta no pueda colgar un thread de firma en ninguna de las dos plataformas |
TsaConnectTimeoutSeconds | 30 | Presupuesto de conexión en segundos, aplicado antes del presupuesto de la solicitud |
Content-Type: application/timestamp-query y espera application/timestamp-reply; Expect: 100-continue se suprime para que un respondedor silencioso no pueda frenar un cuerpo mayor de 1 KBhttp y https, y no se siguen las redirecciones: un respondedor que responde con una redirección se trata como mal configurado en lugar de reintentarse en silencio contra un extremo que quien llama nunca nombróTsaHttpAvailable y el identificador se deja abierto deliberadamente durante la vida del proceso, porque descargarlo mientras otro thread está dentro de una transferencia tumbaría el host. Los timeouts del resolvedor basados en señales permanecen desactivados para que la firma pueda ejecutarse en threads de trabajoTsaHttpAvailable devuelve False y FPdfTsa informa PadesTsaAvailable = False, salvo que se haya registrado otro transporte a través de PadesTimestampOverride