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.