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 é o transporte de timestamps fora do Windows consumido por FPdfTsa, a contraparte de FPdfTsaWin. Ele envia um TimeStampReq codificado por POST para a URL de uma timestamp authority por HTTP ou HTTPS e coleta os bytes do TimeStampResp; construir e analisar o DER fica em FPdfTsa
O transporte é a libcurl, vinculada em tempo de execução em vez de ligada estaticamente, de modo que a biblioteca não é uma dependência de compilação e sua ausência é relatada em vez de falhar o carregamento. Passar pela libcurl também mantém a pilha TLS fora desta unidade: a libcurl escolhe o próprio back-end e valida a cadeia do servidor contra o trust store da plataforma
TsaHttpAvailable relata se a libcurl foi encontrada e se os pontos de entrada exigidos foram resolvidos; TsaHttpBackendName nomeia o back-end resolvido; PostTimeStampQuery executa a troca HTTP e retorna False (em vez de lançar exceção) em qualquer falha de transporte, deixando o chamador adicionar seu próprio contexto e política de nova tentativa
Toda a seção de interface é compilada apenas sob FPC. Sob Delphi a unidade é vazia, porque o Delphi visa o Windows e FPdfTsaWin é o back-end lá. A unidade ainda compila em todos os alvos FPC, incluindo o Windows, onde FPdfTsa prefere o back-end WinHttp e nada chama este
Os tipos de handle da libcurl, as vinculações de pontos de entrada e as constantes de opções ficam na seção de implementação; a interface expõe apenas a verificação de disponibilidade, o nome do back-end, o auxiliar de envio e os três limites de transporte
| Função | Descrição |
|---|---|
TsaHttpAvailable | Retorna True quando a libcurl foi localizada e todos os pontos de entrada exigidos foram resolvidos em tempo de execução |
TsaHttpBackendName | Retorna o nome do back-end resolvido, libcurl quando o transporte é utilizável e uma string vazia caso contrário |
PostTimeStampQuery | Envia ReqDer por POST para TsaUrl e preenche RespDer com o corpo bruto do TimeStampResp; retorna False em falha de transporte |
| Constante | Valor | Descrição |
|---|---|---|
TsaMaxResponseBytes | 4 * 1024 * 1024 | Limite superior do corpo do TimeStampResp aceito; uma resposta maior aborta a transferência em vez de crescer o buffer sem limite. Mantido em sincronia com a mesma constante em FPdfTsaWin |
TsaRequestTimeoutSeconds | 30 | Orçamento para a requisição inteira em segundos, correspondendo aos timeouts do WinHttp para que uma TSA morta não possa travar uma thread de assinatura em nenhuma das plataformas |
TsaConnectTimeoutSeconds | 30 | Orçamento de conexão em segundos, aplicado antes do orçamento da requisição |
Content-Type: application/timestamp-query e espera application/timestamp-reply; Expect: 100-continue é suprimido para que um respondedor silencioso não possa travar um corpo maior que 1 KBhttp e https são aceitas, e redirecionamentos não são seguidos: um respondedor que responde com um redirecionamento é tratado como mal configurado em vez de ser silenciosamente repetido contra um endpoint que o chamador nunca indicouTsaHttpAvailable e o handle é deliberadamente mantido aberto pela vida do processo, porque descarregá-lo enquanto outra thread está dentro de uma transferência derrubaria o host. Timeouts de resolvedor baseados em sinais permanecem desligados para que a assinatura possa rodar em threads de trabalhoTsaHttpAvailable retorna False e FPdfTsa relata PadesTsaAvailable = False, a menos que outro transporte esteja registrado por meio de PadesTimestampOverride