iText - Gerando hash PDF sem cadeia de certificados

Estou tentando criar um aplicativo onde acontece o seguinte:

Um cliente solicita um hash PDF do servidor.O servidor gera o hash de um arquivo PDF e envia para o cliente.O cliente assina esse hash com sua chave privada e envia o hash assinado junto com a parte pública de seu próprio certificado.O servidor gera um novo arquivo PDF assinado.

O problema que estou tendo com isso: parece impossível para o servidor gerar um hash a ser assinado sem ter o certificado do cliente disponível previamente. Eu realmente prefiro criar uma solução em que o servidor não precise conhecer o certificado do cliente para criar o resumo do documento.

Todos os exemplos que encontrei até agora usam a função PdfPKCS7.getAuthenticatedAttributeBytes para obter o hash a ser assinado, mas isso exige que um certificado de cliente seja conhecido. Examinei o white paper "Assinaturas digitais para documentos PDF" de Bruno Lowagie, mas não consegui ver exatamente quais informações são digeridas.

Aqui está um trecho de código da minha tentativa atual:

public byte[] simplePresign(String src, String digestAlgorithm) throws IOException, DocumentException, GeneralSecurityException {
    this.digestAlgorithm = digestAlgorithm;
    tsaClient = new CustomTSAClient();

    PdfReader reader = new PdfReader(src);
    os = new ByteArrayOutputStream();
    PdfAStamper stamper = PdfAStamper.createSignature(reader, os, '\0', PdfAConformanceLevel.PDF_A_1B);
    appearance = stamper.getSignatureAppearance();

    PdfSignature dic = new PdfSignature(PdfName.ADOBE_PPKLITE, PdfName.ADBE_PKCS7_DETACHED);
    appearance.setCryptoDictionary(dic);

    HashMap<PdfName, Integer> exc = new HashMap<PdfName, Integer>();
    exc.put(PdfName.CONTENTS, getEstimatedSize(null, tsaClient) * 2 + 2);
    appearance.preClose(exc);

    InputStream data = appearance.getRangeStream();
    MessageDigest mDigest = DigestAlgorithms.getMessageDigest(digestAlgorithm, null);

    return DigestAlgorithms.digest(data, mDigest);

}

Infelizmente, esse hash não parece estar correto, assinar esse hash e gerar um documento assinado com base no hash assinado leva a uma assinatura inválida.

Ficaria muito grato se alguém puder me ajudar a melhorar esse trecho de código ou, de outro modo, fornecer algumas informações sobre os dados que preciso digerir para uma assinatura.

questionAnswers(1)

yourAnswerToTheQuestion