aboutsummaryrefslogtreecommitdiff
path: root/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/PdfAsImpl.java
diff options
context:
space:
mode:
Diffstat (limited to 'pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/PdfAsImpl.java')
-rw-r--r--pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/PdfAsImpl.java139
1 files changed, 119 insertions, 20 deletions
diff --git a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/PdfAsImpl.java b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/PdfAsImpl.java
index 5bda572b..a8cee107 100644
--- a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/PdfAsImpl.java
+++ b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/PdfAsImpl.java
@@ -1,12 +1,24 @@
package at.gv.egiz.pdfas.lib.impl;
+import iaik.cms.CMSException;
+import iaik.cms.CMSParsingException;
+import iaik.cms.SignedData;
+import iaik.cms.SignerInfo;
import iaik.x509.X509Certificate;
import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
import java.io.File;
+import java.io.IOException;
import java.io.OutputStream;
+import java.security.SignatureException;
import java.util.List;
+import org.apache.pdfbox.cos.COSArray;
+import org.apache.pdfbox.cos.COSBase;
+import org.apache.pdfbox.cos.COSDictionary;
+import org.apache.pdfbox.cos.COSName;
+import org.apache.pdfbox.cos.COSString;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -17,6 +29,7 @@ import at.gv.egiz.pdfas.common.exceptions.PdfAsSettingsException;
import at.gv.egiz.pdfas.common.settings.ISettings;
import at.gv.egiz.pdfas.common.settings.Settings;
import at.gv.egiz.pdfas.common.settings.SignatureProfileSettings;
+import at.gv.egiz.pdfas.common.utils.StringUtils;
import at.gv.egiz.pdfas.lib.api.Configuration;
import at.gv.egiz.pdfas.lib.api.IConfigurationConstants;
import at.gv.egiz.pdfas.lib.api.PdfAs;
@@ -36,25 +49,28 @@ import at.gv.egiz.pdfas.lib.impl.stamping.StamperFactory;
import at.gv.egiz.pdfas.lib.impl.stamping.TableFactory;
import at.gv.egiz.pdfas.lib.impl.status.OperationStatus;
import at.gv.egiz.pdfas.lib.impl.status.RequestedSignature;
+import at.gv.egiz.pdfas.lib.impl.verify.IVerifyFilter;
+import at.gv.egiz.pdfas.lib.impl.verify.VerifierDispatcher;
import at.knowcenter.wag.egov.egiz.pdf.PositioningInstruction;
import at.knowcenter.wag.egov.egiz.pdf.TablePos;
import at.knowcenter.wag.egov.egiz.table.Table;
public class PdfAsImpl implements PdfAs, IConfigurationConstants {
- private static final Logger logger = LoggerFactory.getLogger(PdfAsImpl.class);
-
+ private static final Logger logger = LoggerFactory
+ .getLogger(PdfAsImpl.class);
+
private Settings settings;
-
+
public PdfAsImpl(File cfgFile) {
logger.info("Initializing PDF-AS with config: " + cfgFile.getPath());
this.settings = new Settings(cfgFile);
}
-
+
public SignResult sign(SignParameter parameter) throws PdfAsException {
logger.trace("sign started");
-
+
// TODO: verify signParameter
try {
@@ -62,7 +78,7 @@ public class PdfAsImpl implements PdfAs, IConfigurationConstants {
if (!(parameter.getConfiguration() instanceof ISettings)) {
throw new PdfAsSettingsException("Invalid settings object!");
}
-
+
ISettings settings = (ISettings) parameter.getConfiguration();
OperationStatus status = new OperationStatus(settings, parameter);
PlaceholderConfiguration placeholderConfiguration = status
@@ -76,7 +92,7 @@ public class PdfAsImpl implements PdfAs, IConfigurationConstants {
.getSignatureProfileID();
logger.info("Selected signature Profile: " + signatureProfileID);
-
+
SignatureProfileConfiguration signatureProfileConfiguration = status
.getSignatureProfileConfiguration(signatureProfileID);
@@ -88,7 +104,7 @@ public class PdfAsImpl implements PdfAs, IConfigurationConstants {
if (placeholderConfiguration.isGlobalPlaceholderEnabled()) {
// TODO: Do placeholder search
}
-
+
if (requestedSignature.isVisual()) {
logger.info("Creating visual siganture block");
// ================================================================
@@ -98,9 +114,11 @@ public class PdfAsImpl implements PdfAs, IConfigurationConstants {
.createProfile(signatureProfileID, settings);
Table main = TableFactory.createSigTable(
- signatureProfileSettings, MAIN, settings, requestedSignature);
+ signatureProfileSettings, MAIN, settings,
+ requestedSignature);
- IPDFStamper stamper = StamperFactory.createDefaultStamper(settings);
+ IPDFStamper stamper = StamperFactory
+ .createDefaultStamper(settings);
IPDFVisualObject visualObject = stamper.createVisualPDFObject(
status.getPdfObject(), main);
@@ -149,19 +167,22 @@ public class PdfAsImpl implements PdfAs, IConfigurationConstants {
// TODO: Create signature
IPdfSigner signer = PdfSignerFactory.createPdfSigner();
- signer.signPDF(status.getPdfObject(), requestedSignature, status.getSignParamter().getPlainSigner());
-
- //status.getPdfObject().setSignedDocument(status.getPdfObject().getStampedDocument());
-
+ signer.signPDF(status.getPdfObject(), requestedSignature, status
+ .getSignParamter().getPlainSigner());
+
+ // status.getPdfObject().setSignedDocument(status.getPdfObject().getStampedDocument());
+
// ================================================================
// Create SignResult
- SignResultImpl result = new SignResultImpl(status.getSignParamter().getOutput());
- OutputStream outputStream = result.getOutputDocument().createOutputStream();
-
+ SignResultImpl result = new SignResultImpl(status.getSignParamter()
+ .getOutput());
+ OutputStream outputStream = result.getOutputDocument()
+ .createOutputStream();
+
outputStream.write(status.getPdfObject().getSignedDocument());
-
+
outputStream.close();
-
+
return result;
} catch (Throwable e) {
logger.error("sign failed " + e.getMessage(), e);
@@ -172,7 +193,85 @@ public class PdfAsImpl implements PdfAs, IConfigurationConstants {
}
public List<VerifyResult> verify(VerifyParameter parameter) {
- // TODO Auto-generated method stub
+ try {
+ ISettings settings = (ISettings) parameter.getConfiguration();
+ VerifierDispatcher verifier = new VerifierDispatcher(settings);
+ PDDocument doc = PDDocument.load(new ByteArrayInputStream(parameter
+ .getDataSource().getByteData()));
+
+ COSDictionary trailer = doc.getDocument().getTrailer();
+ COSDictionary root = (COSDictionary) trailer
+ .getDictionaryObject(COSName.ROOT);
+ COSDictionary acroForm = (COSDictionary) root
+ .getDictionaryObject(COSName.ACRO_FORM);
+ COSArray fields = (COSArray) acroForm
+ .getDictionaryObject(COSName.FIELDS);
+ for (int i = 0; i < fields.size(); i++) {
+ COSDictionary field = (COSDictionary) fields.getObject(i);
+ String type = field.getNameAsString("FT");
+ if ("Sig".equals(type)) {
+ logger.trace("Found Signature: ");
+ COSBase base = field.getDictionaryObject("V");
+ COSDictionary dict = (COSDictionary) base;
+
+ logger.debug("Signer: "
+ + dict.getNameAsString("Name"));
+ logger.debug("SubFilter: "
+ + dict.getNameAsString("SubFilter"));
+ logger.debug("Filter: "
+ + dict.getNameAsString("Filter"));
+ logger.debug("Modified: " + dict.getNameAsString("M"));
+ COSArray byteRange = (COSArray) dict
+ .getDictionaryObject("ByteRange");
+
+
+ StringBuilder sb = new StringBuilder();
+ int[] bytes = new int[byteRange.size()];
+ for (int j = 0; j < byteRange.size(); j++) {
+ bytes[j] = byteRange.getInt(j);
+ sb.append(" " + bytes[j]);
+ }
+
+ logger.debug("ByteRange" + sb.toString());
+
+ COSString content = (COSString) dict
+ .getDictionaryObject("Contents");
+ /*logger.trace("Content: "
+ + StringUtils.bytesToHexString(content.getBytes()));*/
+
+ ByteArrayOutputStream contentData = new ByteArrayOutputStream();
+ for (int j = 0; j < bytes.length; j = j + 2) {
+ int offset = bytes[j];
+ int length = bytes[j + 1];
+ contentData.write(parameter.getDataSource()
+ .getByteData(), offset, length);
+ }
+ contentData.close();
+
+ IVerifyFilter verifyFilter =
+ verifier.getVerifier(dict.getNameAsString("Filter"), dict.getNameAsString("SubFilter"));
+
+ verifyFilter.verify(contentData.toByteArray(), content.getBytes());
+
+ /*
+ * Iterator<Map.Entry<COSName, COSBase>> iterator =
+ * dict.entrySet().iterator();
+ *
+ * while(iterator.hasNext()) { Map.Entry<COSName, COSBase>
+ * entry = iterator.next(); System.out.println("Key: "
+ * +entry.getKey().toString());
+ *
+ * }
+ */
+
+ }
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ } catch (PdfAsException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
return null;
}