Not able to verify digital signature in Pdf file

Viewed 68

I have a digitally signed pdf file and I am trying to verify the signature in that. But Signature is not getting verified. Below is the code

public static void main(String[] args) throws Exception {

        HashMap<String, Object> keyPair = new HashMap<>();
        String password = "123";

        KeyStore keyStore = KeyStore.getInstance("pkcs12"); //, "BC");
        keyStore.load(new FileInputStream("/Users/shivam/Documents/Projects/label-processor/src/main/resources/DigitalSignatureFile.pfx"), password.toCharArray());

        Enumeration<String> keyStoreAliasEnum = keyStore.aliases();
        String alias = null;
        PublicKey publicKey = null;
        PrivateKey privateKey = null;
        byte[] signature = null;
        while ( keyStoreAliasEnum.hasMoreElements() ) {
            alias = keyStoreAliasEnum.nextElement();
            if (password != null) {
                privateKey = (PrivateKey) keyStore.getKey(alias, password.toCharArray());

                X509Certificate x509Certificate = (X509Certificate) keyStore.getCertificate(alias);
                publicKey = x509Certificate.getPublicKey();
                signature = x509Certificate.getSignature();
                keyPair.put("Alias", alias);
                keyPair.put("PublicKey", publicKey);
                keyPair.put("PrivateKey", privateKey);
                keyPair.put("X509Certificate", x509Certificate);
            }
        }
        verify(publicKey, signature);
    }

    public static void verify(PublicKey publicKey, byte[] sigBytes) throws Exception {

        Signature sig = Signature.getInstance("SHA256withRSA");
        sig.initVerify(publicKey);
        FileInputStream datafis = new FileInputStream("/Users/shivam/Desktop/DigitallySignedFile.pdf");
        byte[] data = IOUtils.toByteArray(datafis);
        sig.update(data);
        boolean verifies = sig.verify(sigBytes);
        System.out.println("signature verifies: " + verifies);
        FileUtils.writeByteArrayToFile(
                new File("/Users/shivam/Documents/Projects/label-processor/src/main/resources/VerifiedFile.pdf"),
                data
        );
    }

Above program is giving "Signature verifies: false". And In VerifiedFile.pdf I am still seeing signature not verified. But when I am trying to verify in Adobe Reader it is verifying correctly.

I tried verifying with the help of itext library also. It is verifying signature But In pdf it still shows signature not verified.

public static void main(String[] args) throws Exception {

    byte[] pdfBytes = Files.readAllBytes(
            Paths.get("/Users/shivam/Desktop/DigitallySignedFile.pdf")
    );
    PdfReader pdfReader = new PdfReader(pdfBytes);
    AcroFields acroFields = pdfReader.getAcroFields();
    List<String> signatures = acroFields.getSignatureNames();
    boolean valid = false;
    if (!signatures.isEmpty()) {
        for (String signature : signatures) {
            if (acroFields.signatureCoversWholeDocument(signature)) {
                PdfPKCS7 pkcs7 = acroFields.verifySignature(signature);
                valid = pkcs7.verify();
                String reason = pkcs7.getReason();
                Calendar signedAt = pkcs7.getSignDate();
                X509Certificate x509Certificate = pkcs7.getSigningCertificate();
                Principal issuerDN = x509Certificate.getIssuerDN();
                Principal subjectDN = x509Certificate.getSubjectDN();
                logger.info("valid = {}, date = {}, reason = '{}', issuer = '{}', subject = '{}'",
                        valid, signedAt.getTime(), reason, issuerDN, subjectDN);
                break;
            }
        }
    }
    FileUtils.writeByteArrayToFile(
            new File("/Users/shivam/Documents/Projects/label-processor/src/main/resources/VerifiedFile.pdf"),
            pdfBytes
    );
}

I appreciate any help.

0 Answers
Related