package org.icepdf.core.pobjects.annotations; import org.icepdf.core.pobjects.acroform.FieldDictionary; import org.icepdf.core.pobjects.acroform.SignatureDictionary; import org.icepdf.core.pobjects.acroform.SignatureFieldDictionary; import org.icepdf.core.pobjects.acroform.SignatureHandler; import org.icepdf.core.pobjects.acroform.signature.SignatureValidator; import org.icepdf.core.util.Library; import java.awt.geom.AffineTransform; import java.util.HashMap; import java.util.logging.Logger; /** * A digital signature (PDF 1.3) may be used to authenticate the identity of a user and the document's contents. It * stores information about the signer and the state of the document when it was signed. The signature may be purely * mathematical, such as a public/private-key encrypted document digest, or it may be a biometric form of identification, * such as a handwritten signature, fingerprint, or retinal scan. The specific form of authentication used shall be * implemented by a special software module called a signature handler. Signature handlers shall be identified in * accordance with the rules defined in Annex E. * <br> * NOTE 2<br> * The entries in the signature dictionary can be conceptualized as being in different dictionaries; they are in one * dictionary for historical and cryptographic reasons. The categories are signature properties (R, M, Name, Reason, * Location, Prop_Build, Prop_AuthTime, and Prop_AuthType); key information (Cert and portions of Contents when the * signature value is a PKCS#7 object); reference (Reference and ByteRange); and signature value (Contents when the * signature value is a PKCS#1 object). */ public class SignatureWidgetAnnotation extends AbstractWidgetAnnotation<SignatureFieldDictionary> { private static final Logger logger = Logger.getLogger(SignatureWidgetAnnotation.class.toString()); // signature field dictionary, private SignatureFieldDictionary fieldDictionary; // signatures value holds all the signature info for signing. private SignatureDictionary signatureDictionary; private SignatureValidator signatureValidator; public SignatureWidgetAnnotation(Library l, HashMap h) { super(l, h); fieldDictionary = new SignatureFieldDictionary(library, entries); HashMap valueDict = library.getDictionary(entries, FieldDictionary.V_KEY); signatureDictionary = new SignatureDictionary(library, valueDict); } public SignatureValidator getSignatureValidator() { if (signatureValidator == null) { SignatureHandler signatureHandler = fieldDictionary.getLibrary().getSignatureHandler(); signatureValidator = signatureHandler.validateSignature(fieldDictionary); } return signatureValidator; } public SignatureWidgetAnnotation(Annotation widgetAnnotation) { super(widgetAnnotation.getLibrary(), widgetAnnotation.getEntries()); fieldDictionary = new SignatureFieldDictionary(library, entries); // copy over the reference number. setPObjectReference(widgetAnnotation.getPObjectReference()); } public SignatureDictionary getSignatureDictionary() { return signatureDictionary; } @Override public void reset() { } @Override public void resetAppearanceStream(double dx, double dy, AffineTransform pageSpace) { } @Override public SignatureFieldDictionary getFieldDictionary() { return fieldDictionary; } }