/* * Retrieve digital signature information including PAdES status * The following types of signatures are checked: * * - plain (approval) signatures with CAdES/PAdES vs. CMS distinction * - certification signatures and permissions * - document timestamp signatures * - DSS (Document Security Store) information is also dumped * - signatures for Reader-enabling a document * * Required software: pCOS interface 9 (PDFlib+PDI 10, TET 5.x, PLOP 5.x) * Required data: signed PDF document */ package com.pdflib.cookbook.pcos.interactive; import com.pdflib.IpCOS; import com.pdflib.cookbook.pcos.pcos_cookbook_example; public class signatures extends pcos_cookbook_example { /* This is where the data files are. Adjust as necessary. */ private final static String SEARCH_PATH = "../input"; public void example_code(IpCOS p, int doc) throws Exception { System.out.println("File name: " + p.pcos_get_string(doc, "filename")); String objtype; int fieldcount = (int) p.pcos_get_number(doc, "length:signaturefields"); if (fieldcount == 0) { System.out.println("no signature fields"); return; } // ------------------------------------------------------------- // Analyze all signature fields and dump details of signed fields for (int f = 0; f < fieldcount; f++) { boolean visible = (p.pcos_get_number(doc, "signaturefields[" + f + "]/visible") > 0); System.out.print(visible ? "Visible" : "Invisible"); String res = p.pcos_get_string(doc, "signaturefields[" + f + "]/fullname"); System.out.print(" signature field '" + res + "': "); String sigtype = p.pcos_get_string(doc, "signaturefields[" + f + "]/sigtype"); if (sigtype.equals("none")) { System.out.println("unsigned"); continue; } System.out.print(sigtype + " signature"); if (sigtype.equals("certification")) { String permissions = p.pcos_get_string(doc, "signaturefields[" + f + "]/permissions"); System.out.print(" (changes allowed: " + permissions + ")"); } System.out.println(); // Old-style CMS signature or newer CAdES signature? if (p.pcos_get_number(doc, "signaturefields[" + f + "]/cades") > 0) System.out.println("CAdES/PAdES signature"); else System.out.println("CMS signature"); /* Dump various pieces of other signature information if present*/ objtype = p.pcos_get_string(doc, "type:signaturefields[" + f + "]/V/Name"); if (objtype.equals("string")) { res = p.pcos_get_string(doc, "signaturefields[" + f + "]/V/Name"); System.out.println("Name of signer: '" + res + "'"); } objtype = p.pcos_get_string(doc, "type:signaturefields[" + f + "]/V/Reason"); if (objtype.equals("string")) { res = p.pcos_get_string(doc, "signaturefields[" + f + "]/V/Reason"); System.out.println("Reason: '" + res + "'"); } objtype = p.pcos_get_string(doc, "type:signaturefields[" + f + "]/V/M"); if (objtype.equals("string")) { res = p.pcos_get_string(doc, "signaturefields[" + f + "]/V/M"); System.out.println("Time of signing: '" + res + "'"); } System.out.println(); } // ------------------------------------------------------------- // Check Document Security Store (DSS) objtype = p.pcos_get_string(doc, "type:/Root/DSS"); if (objtype.equals("dict")) { System.out.println("Document Security Store (DSS) present:"); int val = 0; objtype = p.pcos_get_string(doc, "type:/Root/DSS/VRI"); if (objtype.equals("dict")) val = (int) p.pcos_get_number(doc, "length:/Root/DSS/VRI"); System.out.println("\t" + val + " VRI entries (validation-related information)"); val = 0; objtype = p.pcos_get_string(doc, "type:/Root/DSS/Certs"); if (objtype.equals("array")) val = (int) p.pcos_get_number(doc, "length:/Root/DSS/Certs"); System.out.println("\t" + val + " certificate(s)"); val = 0; objtype = p.pcos_get_string(doc, "type:/Root/DSS/OCSPs"); if (objtype.equals("array")) val = (int) p.pcos_get_number(doc, "length:/Root/DSS/OCSPs"); System.out.println("\t" + val + " OCSP response(s)"); val = 0; objtype = p.pcos_get_string(doc, "type:/Root/DSS/CRLs"); if (objtype.equals("array")) val = (int) p.pcos_get_number(doc, "length:/Root/DSS/CRLs"); System.out.println("\t" + val + " CRL(s)"); } // ------------------------------------------------------------- // Check Reader-enabled document if (p.pcos_get_number(doc, "usagerights") > 0) { System.out.println("document contains signed usage rights (Reader-enabled)"); } } public signatures(String[] argv, String readable_name, String search_path) { super(argv, readable_name, search_path); } public static void main(String argv[]) { signatures example = new signatures(argv, "Digital signature", SEARCH_PATH); example.execute(); } }