aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/at/gv/egiz/pdfas/impl
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/at/gv/egiz/pdfas/impl')
-rw-r--r--src/main/java/at/gv/egiz/pdfas/impl/api/CheckHelper.java213
-rw-r--r--src/main/java/at/gv/egiz/pdfas/impl/api/PdfAsObject.java317
-rw-r--r--src/main/java/at/gv/egiz/pdfas/impl/api/PosHelper.java79
-rw-r--r--src/main/java/at/gv/egiz/pdfas/impl/api/analyze/AnalyzeResultImpl.java47
-rw-r--r--src/main/java/at/gv/egiz/pdfas/impl/api/commons/DataSinkAdapter.java83
-rw-r--r--src/main/java/at/gv/egiz/pdfas/impl/api/commons/DataSourceApiAdapter.java85
-rw-r--r--src/main/java/at/gv/egiz/pdfas/impl/api/commons/PdfDataSourceAdapter.java52
-rw-r--r--src/main/java/at/gv/egiz/pdfas/impl/api/commons/SignatureInformationAdapter.java87
-rw-r--r--src/main/java/at/gv/egiz/pdfas/impl/api/commons/SignatureProfileImpl.java56
-rw-r--r--src/main/java/at/gv/egiz/pdfas/impl/api/commons/TextDataSourceAdapter.java52
-rw-r--r--src/main/java/at/gv/egiz/pdfas/impl/api/sign/ActualSignaturePositionAdapter.java73
-rw-r--r--src/main/java/at/gv/egiz/pdfas/impl/api/sign/SignResultImpl.java75
-rw-r--r--src/main/java/at/gv/egiz/pdfas/impl/api/verify/SignatureCheckImpl.java51
-rw-r--r--src/main/java/at/gv/egiz/pdfas/impl/api/verify/VerifyResultAdapter.java126
-rw-r--r--src/main/java/at/gv/egiz/pdfas/impl/api/verify/VerifyResultsImpl.java38
-rw-r--r--src/main/java/at/gv/egiz/pdfas/impl/input/helper/DataSourceHelper.java17
-rw-r--r--src/main/java/at/gv/egiz/pdfas/impl/signator/IncrementalUpdateHelper.java8
-rw-r--r--src/main/java/at/gv/egiz/pdfas/impl/signator/binary/BinarySignatorInformation.java19
-rw-r--r--src/main/java/at/gv/egiz/pdfas/impl/signator/binary/BinarySignator_1_0_0.java2
-rw-r--r--src/main/java/at/gv/egiz/pdfas/impl/signator/textual/TextualSignatorInformation.java19
-rw-r--r--src/main/java/at/gv/egiz/pdfas/impl/signator/textual/TextualSignator_1_0_0.java4
21 files changed, 1491 insertions, 12 deletions
diff --git a/src/main/java/at/gv/egiz/pdfas/impl/api/CheckHelper.java b/src/main/java/at/gv/egiz/pdfas/impl/api/CheckHelper.java
new file mode 100644
index 0000000..467113f
--- /dev/null
+++ b/src/main/java/at/gv/egiz/pdfas/impl/api/CheckHelper.java
@@ -0,0 +1,213 @@
+/**
+ *
+ */
+package at.gv.egiz.pdfas.impl.api;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import at.gv.egiz.pdfas.api.analyze.AnalyzeParameters;
+import at.gv.egiz.pdfas.api.commons.Constants;
+import at.gv.egiz.pdfas.api.io.DataSource;
+import at.gv.egiz.pdfas.api.sign.SignParameters;
+import at.gv.egiz.pdfas.api.sign.pos.SignaturePositioning;
+import at.gv.egiz.pdfas.api.verify.VerifyAfterAnalysisParameters;
+import at.gv.egiz.pdfas.api.verify.VerifyParameters;
+import at.knowcenter.wag.egov.egiz.exceptions.PDFDocumentException;
+import at.knowcenter.wag.egov.egiz.exceptions.SignatureTypesException;
+import at.knowcenter.wag.egov.egiz.sig.SignatureTypes;
+
+/**
+ * Contains check methods frequently used by the {@link PdfAsObject} to check
+ * input parameters.
+ *
+ * @author wprinz
+ *
+ */
+public final class CheckHelper
+{
+ /**
+ * The log.
+ */
+ private static Log log = LogFactory.getLog(CheckHelper.class);
+
+ /**
+ * Hidden default constructor.
+ */
+ private CheckHelper()
+ {
+ // empty block
+ }
+
+ /**
+ * Checks the SignParameters for integrity.
+ *
+ * @param sp
+ * The {@link SignParameters}
+ */
+ public static void checkSignParameters(SignParameters sp)
+ {
+ if (sp == null)
+ {
+ throw new IllegalArgumentException("The signParameters must not be null.");
+ }
+
+ checkDocument(sp.getDocument());
+ if (sp.getOutput() == null)
+ {
+ throw new IllegalArgumentException("The output DataSink must not be null.");
+ }
+ checkSignatureType(sp.getSignatureType());
+ checkSignatureDevice(sp.getSignatureDevice());
+ if (sp.getSignatureProfileId() != null)
+ {
+ checkProfileId(sp.getSignatureProfileId());
+ }
+ if (sp.getSignaturePositioning() != null)
+ {
+ checkSignaturePositioning(sp.getSignaturePositioning());
+ }
+ }
+
+ /**
+ * Checks the VerifyParameters for integrity.
+ *
+ * @param vp
+ * The {@link VerifyParameters}
+ */
+ public static void checkVerifyParameters(VerifyParameters vp)
+ {
+ if (vp == null)
+ {
+ throw new IllegalArgumentException("The verifyParameters must not be null.");
+ }
+
+ checkDocument(vp.getDocument());
+ checkVerifyMode(vp.getVerifyMode());
+ checkSignatureDevice(vp.getSignatureDevice());
+ if (vp.getSignatureToVerify() < Constants.VERIFY_ALL)
+ {
+ throw new IllegalArgumentException("The signatureToVerify parameter is incorrect. " + vp.getSignatureToVerify());
+ }
+ }
+
+ /**
+ * Checks the AnalyzeParameters for integrity.
+ *
+ * @param ap
+ * The {@link AnalyzeParameters}
+ */
+ public static void checkAnalyzeParameters(AnalyzeParameters ap)
+ {
+ if (ap == null)
+ {
+ throw new IllegalArgumentException("The analyzeParameters must not be null.");
+ }
+
+ checkDocument(ap.getDocument());
+ checkVerifyMode(ap.getVerifyMode());
+ }
+
+ /**
+ * Checks the VerifyAfterAnalysisParameters for integrity.
+ *
+ * @param vaap
+ * The {@link VerifyAfterAnalysisParameters}
+ */
+ public static void checkVerifyAfterAnalysisParameters(VerifyAfterAnalysisParameters vaap)
+ {
+ if (vaap == null)
+ {
+ throw new IllegalArgumentException("The analyzeParameters must not be null.");
+ }
+
+ if (vaap.getAnalyzeResult() == null)
+ {
+ throw new IllegalArgumentException("The analyzeResult must not be null.");
+ }
+ checkSignatureDevice(vaap.getSignatureDevice());
+ }
+
+ protected static void checkDocument(DataSource document)
+ {
+ if (document == null)
+ {
+ throw new IllegalArgumentException("The document DataSource must not be null.");
+ }
+ }
+
+ protected static void checkSignatureType(String signatureType)
+ {
+ if (signatureType == null)
+ {
+ throw new IllegalArgumentException("The signatureType must not be null.");
+ }
+ if (!(signatureType.equals(Constants.SIGNATURE_TYPE_BINARY) || signatureType.equals(Constants.SIGNATURE_TYPE_TEXTUAL) || signatureType.equals(Constants.SIGNATURE_TYPE_DETACHEDTEXTUAL)))
+ {
+ throw new IllegalArgumentException("The signatureType must be one of the Constants.SIGNATURE_TYPE_* constants. " + signatureType);
+ }
+ }
+
+ protected static void checkProfileId(String profileId)
+ {
+ if (profileId == null)
+ {
+ throw new IllegalArgumentException("The profileId must not be null.");
+ }
+ try
+ {
+ if (!SignatureTypes.getInstance().getSignatureTypes().contains(profileId))
+ {
+ throw new IllegalArgumentException("The profileId must be defined in the configuration file. " + profileId);
+ }
+ }
+ catch (SignatureTypesException e)
+ {
+ String msg = "Error while checking the profileId parameter - cannot get list of valid profiles. " + profileId;
+ log.error(msg, e);
+ throw new IllegalArgumentException(msg);
+ }
+ }
+
+ protected static void checkSignaturePositioning(SignaturePositioning signaturePositioning)
+ {
+ if (signaturePositioning == null)
+ {
+ throw new IllegalArgumentException("The signaturePosition must not be null.");
+ }
+ try
+ {
+ PosHelper.formTablePos(signaturePositioning);
+ }
+ catch (PDFDocumentException e)
+ {
+ String msg = "The signaturePosition string is not valid. " + signaturePositioning;
+ log.error(msg, e);
+ throw new IllegalArgumentException(msg);
+ }
+ }
+
+ protected static void checkVerifyMode(String verifyMode)
+ {
+ if (verifyMode == null)
+ {
+ throw new IllegalArgumentException("The verifyMode must not be null.");
+ }
+ if (!(verifyMode.equals(Constants.VERIFY_MODE_BINARY_ONLY) || verifyMode.equals(Constants.VERIFY_MODE_SEMI_CONSERVATIVE) || verifyMode.equals(Constants.VERIFY_MODE_FULL_CONSERVATIVE)))
+ {
+ throw new IllegalArgumentException("The verifyMode must be one of the Constants.VERIFY_MODE_* constants. " + verifyMode);
+ }
+ }
+
+ protected static void checkSignatureDevice(String signatureDevice)
+ {
+ if (signatureDevice == null)
+ {
+ throw new IllegalArgumentException("The signatureDevice must not be null.");
+ }
+ if (!(signatureDevice.equals(Constants.SIGNATURE_DEVICE_BKU) || signatureDevice.equals(Constants.SIGNATURE_DEVICE_MOA)))
+ {
+ throw new IllegalArgumentException("The signatureDevice must be one of the Constants.SIGNATURE_DEVICE_* constants. " + signatureDevice);
+ }
+ }
+}
diff --git a/src/main/java/at/gv/egiz/pdfas/impl/api/PdfAsObject.java b/src/main/java/at/gv/egiz/pdfas/impl/api/PdfAsObject.java
new file mode 100644
index 0000000..a343de8
--- /dev/null
+++ b/src/main/java/at/gv/egiz/pdfas/impl/api/PdfAsObject.java
@@ -0,0 +1,317 @@
+/**
+ *
+ */
+package at.gv.egiz.pdfas.impl.api;
+
+import java.io.File;
+import java.io.UnsupportedEncodingException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import at.gv.egiz.pdfas.api.PdfAs;
+import at.gv.egiz.pdfas.api.analyze.AnalyzeParameters;
+import at.gv.egiz.pdfas.api.analyze.AnalyzeResult;
+import at.gv.egiz.pdfas.api.commons.Constants;
+import at.gv.egiz.pdfas.api.commons.SignatureInformation;
+import at.gv.egiz.pdfas.api.commons.SignatureProfile;
+import at.gv.egiz.pdfas.api.exceptions.PdfAsException;
+import at.gv.egiz.pdfas.api.sign.SignParameters;
+import at.gv.egiz.pdfas.api.sign.SignResult;
+import at.gv.egiz.pdfas.api.verify.VerifyAfterAnalysisParameters;
+import at.gv.egiz.pdfas.api.verify.VerifyParameters;
+import at.gv.egiz.pdfas.api.verify.VerifyResult;
+import at.gv.egiz.pdfas.api.verify.VerifyResults;
+import at.gv.egiz.pdfas.commandline.CommandlineConnectorChooser;
+import at.gv.egiz.pdfas.exceptions.ErrorCode;
+import at.gv.egiz.pdfas.framework.config.SettingsHelper;
+import at.gv.egiz.pdfas.framework.input.ExtractionStage;
+import at.gv.egiz.pdfas.framework.signator.SignatorInformation;
+import at.gv.egiz.pdfas.framework.vfilter.VerificationFilterParameters;
+import at.gv.egiz.pdfas.impl.api.analyze.AnalyzeResultImpl;
+import at.gv.egiz.pdfas.impl.api.commons.DataSinkAdapter;
+import at.gv.egiz.pdfas.impl.api.commons.PdfDataSourceAdapter;
+import at.gv.egiz.pdfas.impl.api.commons.SignatureInformationAdapter;
+import at.gv.egiz.pdfas.impl.api.commons.SignatureProfileImpl;
+import at.gv.egiz.pdfas.impl.api.commons.TextDataSourceAdapter;
+import at.gv.egiz.pdfas.impl.api.sign.ActualSignaturePositionAdapter;
+import at.gv.egiz.pdfas.impl.api.sign.SignResultImpl;
+import at.gv.egiz.pdfas.impl.api.verify.VerifyResultAdapter;
+import at.gv.egiz.pdfas.impl.api.verify.VerifyResultsImpl;
+import at.gv.egiz.pdfas.impl.vfilter.VerificationFilterParametersImpl;
+import at.knowcenter.wag.egov.egiz.PdfAS;
+import at.knowcenter.wag.egov.egiz.PdfASID;
+import at.knowcenter.wag.egov.egiz.cfg.SettingsReader;
+import at.knowcenter.wag.egov.egiz.exceptions.PresentableException;
+import at.knowcenter.wag.egov.egiz.exceptions.SignatureException;
+import at.knowcenter.wag.egov.egiz.framework.SignatorFactory;
+import at.knowcenter.wag.egov.egiz.pdf.SignatureHolder;
+import at.knowcenter.wag.egov.egiz.pdf.TablePos;
+import at.knowcenter.wag.egov.egiz.sig.SignatureResponse;
+import at.knowcenter.wag.egov.egiz.sig.SignatureTypeDefinition;
+import at.knowcenter.wag.egov.egiz.sig.SignatureTypes;
+
+/**
+ * Implementation of the {@link PdfAs} interface.
+ *
+ * @author wprinz
+ */
+public class PdfAsObject implements PdfAs
+{
+ /**
+ * The work directory.
+ */
+ protected File workDirectory = null;
+
+ /**
+ * This constructor is for internal use only - use
+ * {@link at.gv.egiz.pdfas.PdfAsFactory} instead.
+ *
+ * @param workDirectory
+ * The work directory.
+ * @throws PdfAsException
+ * Thrown, if the configuration cannot be processed.
+ */
+ public PdfAsObject(File workDirectory) throws PdfAsException
+ {
+ if (workDirectory == null)
+ {
+ throw new IllegalArgumentException("The work directory must not be null.");
+ }
+ if (!workDirectory.isDirectory())
+ {
+ throw new IllegalArgumentException("The work directory does not exist or is not a directory. " + workDirectory.getPath());
+ }
+
+ this.workDirectory = workDirectory;
+
+ SettingsReader.initialize(workDirectory.getPath());
+ reloadConfig();
+ }
+
+ /**
+ * @see at.gv.egiz.pdfas.api.PdfAs#reloadConfig()
+ */
+ public void reloadConfig() throws PdfAsException
+ {
+ SettingsReader.createInstance();
+ SignatureTypes.createInstance();
+ }
+
+ /**
+ * @see at.gv.egiz.pdfas.api.PdfAs#getProfileInformation()
+ */
+ public List getProfileInformation() throws PdfAsException
+ {
+ final String MOA_SIGN_KEY_IDENTIFIER_KEY = "moa.sign.KeyIdentifier";
+
+ SettingsReader settings = SettingsReader.getInstance();
+ final String defaultMoaKeyIdentifiert = settings.getSetting(MOA_SIGN_KEY_IDENTIFIER_KEY, null);
+
+ SignatureTypes types = SignatureTypes.getInstance();
+ List profiles = types.getSignatureTypeDefinitions();
+
+ List profileInformation = new ArrayList(profiles.size());
+
+ Iterator it = profiles.iterator();
+ while (it.hasNext())
+ {
+ SignatureTypeDefinition profile = (SignatureTypeDefinition) it.next();
+
+ final String profileId = profile.getType();
+ final String moaKeyIdentifier = settings.getSetting("sig_obj." + profileId + "." + MOA_SIGN_KEY_IDENTIFIER_KEY, defaultMoaKeyIdentifiert);
+
+ SignatureProfile signatureProfile = new SignatureProfileImpl(profileId, moaKeyIdentifier);
+ profileInformation.add(signatureProfile);
+ }
+
+ return profileInformation;
+ }
+
+ /**
+ * @see at.gv.egiz.pdfas.api.PdfAs#sign(at.gv.egiz.pdfas.api.sign.SignParameters)
+ */
+ public SignResult sign(SignParameters signParameters) throws PdfAsException
+ {
+ CheckHelper.checkSignParameters(signParameters);
+
+ PdfASID signatorId = null;
+ if (signParameters.getSignatureType().equals(Constants.SIGNATURE_TYPE_BINARY))
+ {
+ signatorId = SignatorFactory.MOST_RECENT_BINARY_SIGNATOR_ID;
+ }
+ if (signParameters.getSignatureType().equals(Constants.SIGNATURE_TYPE_TEXTUAL))
+ {
+ signatorId = SignatorFactory.MOST_RECENT_TEXTUAL_SIGNATOR_ID;
+ }
+ if (signParameters.getSignatureType().equals(Constants.SIGNATURE_TYPE_DETACHEDTEXTUAL))
+ {
+ signatorId = SignatorFactory.MOST_RECENT_DETACHEDTEXT_SIGNATOR_ID;
+ }
+
+ TablePos pos = PosHelper.formTablePos(signParameters.getSignaturePositioning());
+
+ String connectorId = CommandlineConnectorChooser.chooseCommandlineConnectorForSign(signParameters.getSignatureDevice());
+
+ SignatorInformation si = PdfAS
+ .signCommandline(new PdfDataSourceAdapter(signParameters.getDocument()), new DataSinkAdapter(signParameters.getOutput()), signatorId, connectorId, signParameters.getSignatureProfileId(), pos);
+
+ return new SignResultImpl(signParameters.getOutput(), si.getSignSignatureObject().getX509Certificate(), new ActualSignaturePositionAdapter(si.getActualTablePos()));
+ }
+
+ /**
+ * @see at.gv.egiz.pdfas.api.PdfAs#verify(at.gv.egiz.pdfas.api.verify.VerifyParameters)
+ */
+ public VerifyResults verify(VerifyParameters verifyParameters) throws PdfAsException
+ {
+ CheckHelper.checkVerifyParameters(verifyParameters);
+
+ AnalyzeParameters ap = new AnalyzeParameters();
+ fillAnalyzeParametersWithVerifyParameters(ap, verifyParameters);
+ AnalyzeResult analyzeResult = analyze(ap);
+
+ if (verifyParameters.getSignatureToVerify() != Constants.VERIFY_ALL)
+ {
+ if (verifyParameters.getSignatureToVerify() >= analyzeResult.getSignatures().size())
+ {
+ throw new SignatureException(312, "The selected signature to be verified doesn't exist. " + verifyParameters.getSignatureToVerify());
+ }
+
+ Object stv = analyzeResult.getSignatures().get(verifyParameters.getSignatureToVerify());
+ List selectedSignature = new ArrayList(1);
+ selectedSignature.add(stv);
+ analyzeResult = new AnalyzeResultImpl(selectedSignature);
+ }
+
+ VerifyAfterAnalysisParameters vaap = new VerifyAfterAnalysisParameters();
+ vaap.setAnalyzeResult(analyzeResult);
+ fillVerifyAfterAnalysisParametersWithVerifyParameters(vaap, verifyParameters);
+ return verify(vaap);
+ }
+
+
+ /**
+ * Copies all adequate parameters from the {@link VerifyParameters} to the
+ * {@link AnalyzeParameters}.
+ *
+ * @param ap
+ * The {@link AnalyzeParameters}.
+ * @param vp
+ * The {@link VerifyParameters}.
+ */
+ protected void fillAnalyzeParametersWithVerifyParameters(AnalyzeParameters ap, VerifyParameters vp)
+ {
+ ap.setDocument(vp.getDocument());
+ ap.setVerifyMode(vp.getVerifyMode());
+ }
+
+ /**
+ * Copies all adequate parameters from the {@link VerifyParameters} to the
+ * {@link VerifyAfterAnalysisParameters}.
+ *
+ * @param vaap
+ * The {@link VerifyAfterAnalysisParameters}.
+ * @param vp
+ * The {@link VerifyParameters}.
+ */
+ protected void fillVerifyAfterAnalysisParametersWithVerifyParameters(VerifyAfterAnalysisParameters vaap, VerifyParameters vp)
+ {
+ vaap.setSignatureDevice(vp.getSignatureDevice());
+ vaap.setVerificationTime(vp.getVerificationTime());
+ vaap.setReturnHashInputData(vp.isReturnHashInputData());
+ }
+
+ /**
+ * @see at.gv.egiz.pdfas.api.PdfAs#analyze(at.gv.egiz.pdfas.api.analyze.AnalyzeParameters)
+ */
+ public AnalyzeResult analyze(AnalyzeParameters analyzeParameters) throws PdfAsException
+ {
+ CheckHelper.checkAnalyzeParameters(analyzeParameters);
+
+ VerificationFilterParameters parametersConfig = SettingsHelper.readVerificationFilterParametersFromSettings();
+ boolean binaryOnly = parametersConfig.extractBinarySignaturesOnly();
+ if (analyzeParameters.getVerifyMode().equals(Constants.VERIFY_MODE_BINARY_ONLY))
+ {
+ binaryOnly = true;
+ }
+ boolean assumeOnlySB = parametersConfig.assumeOnlySignatureUpdateBlocks();
+ if (analyzeParameters.getVerifyMode().equals(Constants.VERIFY_MODE_SEMI_CONSERVATIVE))
+ {
+ assumeOnlySB = true;
+ }
+ if (analyzeParameters.getVerifyMode().equals(Constants.VERIFY_MODE_FULL_CONSERVATIVE))
+ {
+ assumeOnlySB = false;
+ }
+ VerificationFilterParameters parameters = new VerificationFilterParametersImpl(binaryOnly, assumeOnlySB, parametersConfig.scanForOldSignatures());
+
+ at.gv.egiz.pdfas.framework.input.DataSource inputDataSource = null;
+ if (analyzeParameters.getDocument().getMimeType().equals("application/pdf"))
+ {
+ inputDataSource = new PdfDataSourceAdapter(analyzeParameters.getDocument());
+ }
+ else
+ {
+ try
+ {
+ inputDataSource = new TextDataSourceAdapter(analyzeParameters.getDocument());
+ }
+ catch (UnsupportedEncodingException e)
+ {
+ throw new PresentableException(ErrorCode.DOCUMENT_CANNOT_BE_READ, "The characterEncoding is not supported." + analyzeParameters.getDocument().getCharacterEncoding(), e);
+ }
+ }
+ assert inputDataSource != null;
+
+ ExtractionStage es = new ExtractionStage();
+ List signature_holders = es.extractSignatureHolders(inputDataSource, parameters);
+
+ List sigInfs = new ArrayList(signature_holders.size());
+ Iterator it = signature_holders.iterator();
+ while (it.hasNext())
+ {
+ SignatureHolder sh = (SignatureHolder)it.next();
+ SignatureInformation si = new SignatureInformationAdapter(sh);
+ sigInfs.add(si);
+ }
+
+ return new AnalyzeResultImpl(sigInfs);
+ }
+
+ /**
+ * @see at.gv.egiz.pdfas.api.PdfAs#verify(at.gv.egiz.pdfas.api.verify.VerifyAfterAnalysisParameters)
+ */
+ public VerifyResults verify(VerifyAfterAnalysisParameters verifyAfterAnalysisParameters) throws PdfAsException
+ {
+ CheckHelper.checkVerifyAfterAnalysisParameters(verifyAfterAnalysisParameters);
+
+ List signatures = verifyAfterAnalysisParameters.getAnalyzeResult().getSignatures();
+ List signature_holders = new ArrayList(signatures.size());
+ Iterator it = signatures.iterator();
+ while (it.hasNext())
+ {
+ SignatureInformation si = (SignatureInformation) it.next();
+ SignatureHolder sh = (SignatureHolder) si.getInternalSignatureInformation();
+ signature_holders.add(sh);
+ }
+ assert signature_holders.size() == signatures.size();
+
+ List results = PdfAS.verifySignatureHolders(signature_holders, verifyAfterAnalysisParameters.getSignatureDevice(), verifyAfterAnalysisParameters.isReturnHashInputData(), verifyAfterAnalysisParameters.getVerificationTime());
+
+ List vrs = new ArrayList(results.size());
+
+ assert signature_holders.size() == results.size() : "Not all signatures were verified.";
+
+ for (int i = 0; i < signature_holders.size(); i++)
+ {
+ SignatureResponse response = (SignatureResponse) results.get(i);
+ SignatureHolder holder = (SignatureHolder) signature_holders.get(i);
+
+ VerifyResult vr = new VerifyResultAdapter(response, holder, verifyAfterAnalysisParameters.getVerificationTime());
+ vrs.add(vr);
+ }
+
+ return new VerifyResultsImpl(vrs);
+ }
+
+}
diff --git a/src/main/java/at/gv/egiz/pdfas/impl/api/PosHelper.java b/src/main/java/at/gv/egiz/pdfas/impl/api/PosHelper.java
new file mode 100644
index 0000000..14f081f
--- /dev/null
+++ b/src/main/java/at/gv/egiz/pdfas/impl/api/PosHelper.java
@@ -0,0 +1,79 @@
+/**
+ *
+ */
+package at.gv.egiz.pdfas.impl.api;
+
+import at.gv.egiz.pdfas.api.sign.pos.SignaturePositioning;
+import at.gv.egiz.pdfas.api.sign.pos.axis.AbsoluteAxisAlgorithm;
+import at.gv.egiz.pdfas.api.sign.pos.axis.AutoAxisAlgorithm;
+import at.gv.egiz.pdfas.api.sign.pos.axis.AxisAlgorithm;
+import at.gv.egiz.pdfas.api.sign.pos.page.AbsolutePageAlgorithm;
+import at.gv.egiz.pdfas.api.sign.pos.page.AutoPageAlgorithm;
+import at.gv.egiz.pdfas.api.sign.pos.page.NewPageAlgorithm;
+import at.gv.egiz.pdfas.api.sign.pos.page.PageAlgorithm;
+import at.knowcenter.wag.egov.egiz.PdfAS;
+import at.knowcenter.wag.egov.egiz.exceptions.PDFDocumentException;
+import at.knowcenter.wag.egov.egiz.pdf.TablePos;
+
+/**
+ * @author wprinz
+ *
+ */
+public final class PosHelper
+{
+ /**
+ * Hidden default constructor.
+ */
+ private PosHelper()
+ {
+ // empty block
+ }
+
+ public static TablePos formTablePos(SignaturePositioning signaturePositioning) throws PDFDocumentException
+ {
+ if (signaturePositioning == null)
+ {
+ return null;
+ }
+
+ String positioningString = formPositioningString(signaturePositioning);
+ TablePos pos = PdfAS.parsePositionFromPosString(positioningString);
+
+ return pos;
+ }
+
+ protected static String formPositioningString(SignaturePositioning sp)
+ {
+ String x_algo = formAxisAlgoString(sp.getXAlgorithm());
+ String y_algo = formAxisAlgoString(sp.getYAlgorithm());
+ String w_algo = formAxisAlgoString(sp.getWidthAlgorithm());
+ String p_algo = formPageAlgoString(sp.getPageAlgorithm());
+ String positioning = "x:" + x_algo + ";y:" + y_algo + ";w:" + w_algo + ";p:" + p_algo + ";f:" + sp.getFooterLine();
+ return positioning;
+ }
+
+ protected static String formAxisAlgoString(AxisAlgorithm algorithm)
+ {
+ if (algorithm instanceof AutoAxisAlgorithm)
+ {
+ return "auto";
+ }
+ AbsoluteAxisAlgorithm aaa = (AbsoluteAxisAlgorithm) algorithm;
+ return Float.toString(aaa.getAbsoluteValue());
+ }
+
+ protected static String formPageAlgoString(PageAlgorithm algorithm)
+ {
+ if (algorithm instanceof AutoPageAlgorithm)
+ {
+ return "auto";
+ }
+ if (algorithm instanceof NewPageAlgorithm)
+ {
+ return "new";
+ }
+ AbsolutePageAlgorithm apa = (AbsolutePageAlgorithm) algorithm;
+ return Integer.toString(apa.getPage());
+ }
+
+}
diff --git a/src/main/java/at/gv/egiz/pdfas/impl/api/analyze/AnalyzeResultImpl.java b/src/main/java/at/gv/egiz/pdfas/impl/api/analyze/AnalyzeResultImpl.java
new file mode 100644
index 0000000..87a14f0
--- /dev/null
+++ b/src/main/java/at/gv/egiz/pdfas/impl/api/analyze/AnalyzeResultImpl.java
@@ -0,0 +1,47 @@
+/**
+ *
+ */
+package at.gv.egiz.pdfas.impl.api.analyze;
+
+import java.util.List;
+
+import at.gv.egiz.pdfas.api.analyze.AnalyzeResult;
+import at.gv.egiz.pdfas.api.exceptions.PdfAsException;
+
+/**
+ * Holds the result of an analyzation.
+ *
+ * @author wprinz
+ */
+public class AnalyzeResultImpl implements AnalyzeResult
+{
+ /**
+ * The found signatures.
+ */
+ protected List signatures = null;
+
+ /**
+ * Constructor.
+ *
+ * @param signatures
+ * The found signatures.
+ */
+ public AnalyzeResultImpl(List signatures)
+ {
+ if (signatures == null)
+ {
+ throw new IllegalArgumentException("The list of found signatures must not be null.");
+ }
+
+ this.signatures = signatures;
+ }
+
+ /**
+ * @see at.gv.egiz.pdfas.api.analyze.AnalyzeResult#getSignatures()
+ */
+ public List getSignatures() throws PdfAsException
+ {
+ return this.signatures;
+ }
+
+}
diff --git a/src/main/java/at/gv/egiz/pdfas/impl/api/commons/DataSinkAdapter.java b/src/main/java/at/gv/egiz/pdfas/impl/api/commons/DataSinkAdapter.java
new file mode 100644
index 0000000..5744a21
--- /dev/null
+++ b/src/main/java/at/gv/egiz/pdfas/impl/api/commons/DataSinkAdapter.java
@@ -0,0 +1,83 @@
+/**
+ *
+ */
+package at.gv.egiz.pdfas.impl.api.commons;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+import at.gv.egiz.pdfas.api.io.DataSink;
+
+/**
+ * Adapter that converts an API DataSink to a framework DataSink.
+ *
+ * @author wprinz
+ */
+public class DataSinkAdapter implements at.gv.egiz.pdfas.framework.output.DataSink
+{
+ /**
+ * The API DataSink to be adapted to a framework DataSink.
+ */
+ protected at.gv.egiz.pdfas.api.io.DataSink apiDataSink = null;
+
+ /**
+ * Constructor.
+ *
+ * @param apiDataSink
+ * The API DataSink to be adapted to a framework DataSink.
+ */
+ public DataSinkAdapter(DataSink apiDataSink)
+ {
+ this.apiDataSink = apiDataSink;
+ }
+
+ /**
+ * @see at.gv.egiz.pdfas.framework.output.DataSink#createOutputStream(java.lang.String)
+ */
+ public OutputStream createOutputStream(String mimeType)
+ {
+ try
+ {
+ return this.apiDataSink.createOutputStream(mimeType);
+ }
+ catch (IOException e)
+ {
+ e.printStackTrace();
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ * @see at.gv.egiz.pdfas.framework.output.DataSink#createOutputStream(java.lang.String,
+ * java.lang.String)
+ */
+ public OutputStream createOutputStream(String mimeType, String characterEncoding)
+ {
+ try
+ {
+ return this.apiDataSink.createOutputStream(mimeType, characterEncoding);
+ }
+ catch (IOException e)
+ {
+ e.printStackTrace();
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ * @see at.gv.egiz.pdfas.framework.output.DataSink#getCharacterEncoding()
+ */
+ public String getCharacterEncoding()
+ {
+ return this.apiDataSink.getCharacterEncoding();
+ }
+
+ /**
+ * @see at.gv.egiz.pdfas.framework.output.DataSink#getMimeType()
+ */
+ public String getMimeType()
+ {
+ return this.apiDataSink.getMimeType();
+ }
+
+}
diff --git a/src/main/java/at/gv/egiz/pdfas/impl/api/commons/DataSourceApiAdapter.java b/src/main/java/at/gv/egiz/pdfas/impl/api/commons/DataSourceApiAdapter.java
new file mode 100644
index 0000000..9e5495c
--- /dev/null
+++ b/src/main/java/at/gv/egiz/pdfas/impl/api/commons/DataSourceApiAdapter.java
@@ -0,0 +1,85 @@
+/**
+ *
+ */
+package at.gv.egiz.pdfas.impl.api.commons;
+
+import java.io.InputStream;
+
+import at.gv.egiz.pdfas.framework.input.PdfDataSource;
+import at.gv.egiz.pdfas.framework.input.TextDataSource;
+
+/**
+ * Adapter that converts a framework DataSource to an API PdfDataSource.
+ *
+ * @author wprinz
+ */
+public class DataSourceApiAdapter implements at.gv.egiz.pdfas.api.io.DataSource
+{
+ /**
+ * The framework DataSource to be adapted to an API DataSource.
+ */
+ protected at.gv.egiz.pdfas.framework.input.DataSource frameworkDataSource = null;
+
+ /**
+ * Constructor.
+ *
+ * @param frameworkDataSource
+ * The framework DataSource to be adapted to an API DataSource.
+ */
+ public DataSourceApiAdapter(at.gv.egiz.pdfas.framework.input.DataSource frameworkDataSource)
+ {
+ this.frameworkDataSource = frameworkDataSource;
+ }
+
+ /**
+ * @see at.gv.egiz.pdfas.api.io.DataSource#createInputStream()
+ */
+ public InputStream createInputStream()
+ {
+ return this.frameworkDataSource.createInputStream();
+ }
+
+ /**
+ * @see at.gv.egiz.pdfas.api.io.DataSource#getAsByteArray()
+ */
+ public byte[] getAsByteArray()
+ {
+ return this.frameworkDataSource.getAsByteArray();
+ }
+
+ /**
+ * @see at.gv.egiz.pdfas.api.io.DataSource#getLength()
+ */
+ public int getLength()
+ {
+ return this.frameworkDataSource.getLength();
+ }
+
+ public String getCharacterEncoding()
+ {
+ if (this.frameworkDataSource instanceof PdfDataSource)
+ {
+ return null;
+ }
+ if (this.frameworkDataSource instanceof TextDataSource)
+ {
+ return "UTF-8";
+ }
+ return null;
+ }
+
+ public String getMimeType()
+ {
+ if (this.frameworkDataSource instanceof PdfDataSource)
+ {
+ return "application/pdf";
+ }
+ if (this.frameworkDataSource instanceof TextDataSource)
+ {
+ return "text/plain";
+ }
+
+ return null;
+ }
+
+}
diff --git a/src/main/java/at/gv/egiz/pdfas/impl/api/commons/PdfDataSourceAdapter.java b/src/main/java/at/gv/egiz/pdfas/impl/api/commons/PdfDataSourceAdapter.java
new file mode 100644
index 0000000..fbafafe
--- /dev/null
+++ b/src/main/java/at/gv/egiz/pdfas/impl/api/commons/PdfDataSourceAdapter.java
@@ -0,0 +1,52 @@
+/**
+ *
+ */
+package at.gv.egiz.pdfas.impl.api.commons;
+
+import java.io.InputStream;
+
+/**
+ * Adapter that converts an API DataSource to a framework PdfDataSource.
+ *
+ * @author wprinz
+ */
+public class PdfDataSourceAdapter implements at.gv.egiz.pdfas.framework.input.PdfDataSource
+{
+ /**
+ * The API DataSource to be adapted to a framework PdfDataSource.
+ */
+ protected at.gv.egiz.pdfas.api.io.DataSource apiDataSource = null;
+
+ /**
+ * Constructor.
+ * @param apiDataSource The API DataSource to be adapted to a framework PdfDataSource.
+ */
+ public PdfDataSourceAdapter(at.gv.egiz.pdfas.api.io.DataSource apiDataSource)
+ {
+ this.apiDataSource = apiDataSource;
+ }
+
+ /**
+ * @see at.gv.egiz.pdfas.framework.input.DataSource#createInputStream()
+ */
+ public InputStream createInputStream()
+ {
+ return this.apiDataSource.createInputStream();
+ }
+
+ /**
+ * @see at.gv.egiz.pdfas.framework.input.DataSource#getAsByteArray()
+ */
+ public byte[] getAsByteArray()
+ {
+ return this.apiDataSource.getAsByteArray();
+ }
+
+ /**
+ * @see at.gv.egiz.pdfas.framework.input.DataSource#getLength()
+ */
+ public int getLength()
+ {
+ return this.apiDataSource.getLength();
+ }
+}
diff --git a/src/main/java/at/gv/egiz/pdfas/impl/api/commons/SignatureInformationAdapter.java b/src/main/java/at/gv/egiz/pdfas/impl/api/commons/SignatureInformationAdapter.java
new file mode 100644
index 0000000..875c3d9
--- /dev/null
+++ b/src/main/java/at/gv/egiz/pdfas/impl/api/commons/SignatureInformationAdapter.java
@@ -0,0 +1,87 @@
+/**
+ *
+ */
+package at.gv.egiz.pdfas.impl.api.commons;
+
+import java.security.cert.X509Certificate;
+import java.util.Date;
+
+import at.gv.egiz.pdfas.api.commons.Constants;
+import at.gv.egiz.pdfas.api.commons.SignatureInformation;
+import at.gv.egiz.pdfas.api.io.DataSource;
+import at.knowcenter.wag.egov.egiz.pdf.EGIZDate;
+import at.knowcenter.wag.egov.egiz.pdf.SignatureHolder;
+
+/**
+ * Adapter that converts a framework SignatureHolder to an API
+ * SignatureInformation.
+ *
+ * @author wprinz
+ */
+public class SignatureInformationAdapter implements SignatureInformation
+{
+ /**
+ * The framework SignatureHolder to be adapted to an API SignatureInformation.
+ */
+ protected SignatureHolder signatureHolder = null;
+
+ /**
+ * Constructor.
+ *
+ * @param signatureHolder
+ * The framework SignatureHolder to be adapted to an API
+ * SignatureInformation.
+ */
+ public SignatureInformationAdapter(SignatureHolder signatureHolder)
+ {
+ this.signatureHolder = signatureHolder;
+ }
+
+ /**
+ * @see at.gv.egiz.pdfas.api.commons.SignatureInformation#getSignedData()
+ */
+ public DataSource getSignedData()
+ {
+ return new DataSourceApiAdapter(this.signatureHolder.getDataSource());
+ }
+
+ /**
+ * @see at.gv.egiz.pdfas.api.commons.SignatureInformation#getInternalSignatureInformation()
+ */
+ public Object getInternalSignatureInformation()
+ {
+ return this.signatureHolder;
+ }
+
+ /**
+ * @see at.gv.egiz.pdfas.api.commons.SignatureInformation#getSignatureType()
+ */
+ public String getSignatureType()
+ {
+ if (this.signatureHolder.getSignatureObject().isBinary())
+ {
+ return Constants.SIGNATURE_TYPE_BINARY;
+ }
+ return Constants.SIGNATURE_TYPE_TEXTUAL;
+ }
+
+
+ /**
+ * @see at.gv.egiz.pdfas.api.commons.SignatureInformation#getSignerCertificate()
+ */
+ public X509Certificate getSignerCertificate()
+ {
+ return this.signatureHolder.getSignatureObject().getX509Cert().getX509Certificate();
+ }
+
+ /**
+ * @see at.gv.egiz.pdfas.api.commons.SignatureInformation#getSigningTime()
+ */
+ public Date getSigningTime()
+ {
+ String date_value = this.signatureHolder.getSignatureObject().getSignationDate();
+ Date date = EGIZDate.parseDateFromString(date_value);
+ return date;
+ }
+
+}
diff --git a/src/main/java/at/gv/egiz/pdfas/impl/api/commons/SignatureProfileImpl.java b/src/main/java/at/gv/egiz/pdfas/impl/api/commons/SignatureProfileImpl.java
new file mode 100644
index 0000000..0d2bfdd
--- /dev/null
+++ b/src/main/java/at/gv/egiz/pdfas/impl/api/commons/SignatureProfileImpl.java
@@ -0,0 +1,56 @@
+/**
+ *
+ */
+package at.gv.egiz.pdfas.impl.api.commons;
+
+import at.gv.egiz.pdfas.api.commons.SignatureProfile;
+
+/**
+ * Holds the data of a signature profile.
+ *
+ * @author wprinz
+ */
+public class SignatureProfileImpl implements SignatureProfile
+{
+
+ /**
+ * The profile identifier.
+ */
+ protected String profileId = null;
+
+ /**
+ * The MOA key identifiert of this profile.
+ */
+ protected String moaKeyIdentifier = null;
+
+ /**
+ * Constructor.
+ *
+ * @param profileId
+ * The profile identifier.
+ * @param moaKeyIdentifier
+ * The MOA key identifiert of this profile.
+ */
+ public SignatureProfileImpl(String profileId, String moaKeyIdentifier)
+ {
+ this.profileId = profileId;
+ this.moaKeyIdentifier = moaKeyIdentifier;
+ }
+
+ /**
+ * @see at.gv.egiz.pdfas.api.commons.SignatureProfile#getProfileId()
+ */
+ public String getProfileId()
+ {
+ return this.profileId;
+ }
+
+ /**
+ * @see at.gv.egiz.pdfas.api.commons.SignatureProfile#getMOAKeyIdentifier()
+ */
+ public String getMOAKeyIdentifier()
+ {
+ return this.moaKeyIdentifier;
+ }
+
+}
diff --git a/src/main/java/at/gv/egiz/pdfas/impl/api/commons/TextDataSourceAdapter.java b/src/main/java/at/gv/egiz/pdfas/impl/api/commons/TextDataSourceAdapter.java
new file mode 100644
index 0000000..4b34d6f
--- /dev/null
+++ b/src/main/java/at/gv/egiz/pdfas/impl/api/commons/TextDataSourceAdapter.java
@@ -0,0 +1,52 @@
+/**
+ *
+ */
+package at.gv.egiz.pdfas.impl.api.commons;
+
+import java.io.UnsupportedEncodingException;
+
+import at.gv.egiz.pdfas.api.io.TextBased;
+import at.gv.egiz.pdfas.impl.input.TextDataSourceImpl;
+
+/**
+ * Adapter that converts an API DataSource to a framework TextDataSource.
+ *
+ * @author wprinz
+ */
+public class TextDataSourceAdapter extends TextDataSourceImpl
+{
+ /**
+ * The API DataSource to be adapted to a framework TextDataSource.
+ */
+ protected at.gv.egiz.pdfas.api.io.DataSource apiDataSource = null;
+
+ /**
+ * Constructor.
+ *
+ * @param apiDataSource
+ * The API DataSource to be adapted to a framework TextDataSource.
+ * @throws UnsupportedEncodingException
+ */
+ public TextDataSourceAdapter(at.gv.egiz.pdfas.api.io.DataSource apiDataSource) throws UnsupportedEncodingException
+ {
+ super(null);
+ this.apiDataSource = apiDataSource;
+
+ if (this.apiDataSource instanceof TextBased)
+ {
+ TextBased tb = (TextBased) this.apiDataSource;
+ this.text = tb.getText();
+ }
+ else
+ {
+ byte[] data = this.apiDataSource.getAsByteArray();
+ String characterEncoding = this.apiDataSource.getCharacterEncoding();
+ if (characterEncoding == null)
+ {
+ throw new UnsupportedEncodingException("The characterEncoding must not be null. Specify a correct encoding.");
+ }
+ this.text = new String(data, characterEncoding);
+ }
+ assert this.text != null;
+ }
+}
diff --git a/src/main/java/at/gv/egiz/pdfas/impl/api/sign/ActualSignaturePositionAdapter.java b/src/main/java/at/gv/egiz/pdfas/impl/api/sign/ActualSignaturePositionAdapter.java
new file mode 100644
index 0000000..a0c32aa
--- /dev/null
+++ b/src/main/java/at/gv/egiz/pdfas/impl/api/sign/ActualSignaturePositionAdapter.java
@@ -0,0 +1,73 @@
+/**
+ *
+ */
+package at.gv.egiz.pdfas.impl.api.sign;
+
+import at.gv.egiz.pdfas.api.sign.pos.SignaturePosition;
+import at.knowcenter.wag.egov.egiz.pdf.ActualTablePos;
+
+/**
+ * Adapter that converts from a framework ActualTablePos to an API
+ * ActualSignaturePosition.
+ *
+ * @author wprinz
+ *
+ */
+public class ActualSignaturePositionAdapter implements SignaturePosition
+{
+ /**
+ * The framework ActualTablePos.
+ */
+ protected ActualTablePos atp = null;
+
+ /**
+ * Constructor.
+ *
+ * @param actualTablePos
+ * The framework ActualTablePos.
+ */
+ public ActualSignaturePositionAdapter(ActualTablePos actualTablePos)
+ {
+ this.atp = actualTablePos;
+ }
+
+ /**
+ * @see at.gv.egiz.pdfas.api.sign.pos.SignaturePosition#getPage()
+ */
+ public int getPage()
+ {
+ return this.atp.page;
+ }
+
+ /**
+ * @see at.gv.egiz.pdfas.api.sign.pos.SignaturePosition#getX()
+ */
+ public float getX()
+ {
+ return this.atp.x;
+ }
+
+ /**
+ * @see at.gv.egiz.pdfas.api.sign.pos.SignaturePosition#getY()
+ */
+ public float getY()
+ {
+ return this.atp.y;
+ }
+
+ /**
+ * @see at.gv.egiz.pdfas.api.sign.pos.SignaturePosition#getWidth()
+ */
+ public float getWidth()
+ {
+ return this.atp.width;
+ }
+
+ /**
+ * @see at.gv.egiz.pdfas.api.sign.pos.SignaturePosition#getHeight()
+ */
+ public float getHeight()
+ {
+ return this.atp.height;
+ }
+}
diff --git a/src/main/java/at/gv/egiz/pdfas/impl/api/sign/SignResultImpl.java b/src/main/java/at/gv/egiz/pdfas/impl/api/sign/SignResultImpl.java
new file mode 100644
index 0000000..7161f5b
--- /dev/null
+++ b/src/main/java/at/gv/egiz/pdfas/impl/api/sign/SignResultImpl.java
@@ -0,0 +1,75 @@
+/**
+ *
+ */
+package at.gv.egiz.pdfas.impl.api.sign;
+
+import java.security.cert.X509Certificate;
+
+import at.gv.egiz.pdfas.api.io.DataSink;
+import at.gv.egiz.pdfas.api.sign.SignResult;
+import at.gv.egiz.pdfas.api.sign.pos.SignaturePosition;
+
+/**
+ * Implementation of the SignResult interface.
+ *
+ * @author wprinz
+ */
+public class SignResultImpl implements SignResult
+{
+ /**
+ * The filled output DataSink.
+ */
+ protected DataSink outputDocument = null;
+
+ /**
+ * The signer certificate.
+ */
+ protected X509Certificate signerCertificate = null;
+
+ /**
+ * The signature position.
+ */
+ protected SignaturePosition signaturePosition = null;
+
+ /**
+ * Constructor.
+ *
+ * @param outputDocument
+ * The filled output DataSink.
+ * @param signerCertificate
+ * The signer certificate.
+ * @param signaturePosition
+ * The signature position.
+ */
+ public SignResultImpl(DataSink outputDocument, X509Certificate signerCertificate, SignaturePosition signaturePosition)
+ {
+ this.outputDocument = outputDocument;
+ this.signerCertificate = signerCertificate;
+ this.signaturePosition = signaturePosition;
+ }
+
+ /**
+ * @see at.gv.egiz.pdfas.api.sign.SignResult#getOutputDocument()
+ */
+ public DataSink getOutputDocument()
+ {
+ return this.outputDocument;
+ }
+
+ /**
+ * @see at.gv.egiz.pdfas.api.sign.SignResult#getSignaturePosition()
+ */
+ public SignaturePosition getSignaturePosition()
+ {
+ return this.signaturePosition;
+ }
+
+ /**
+ * @see at.gv.egiz.pdfas.api.sign.SignResult#getSignerCertificate()
+ */
+ public X509Certificate getSignerCertificate()
+ {
+ return this.signerCertificate;
+ }
+
+}
diff --git a/src/main/java/at/gv/egiz/pdfas/impl/api/verify/SignatureCheckImpl.java b/src/main/java/at/gv/egiz/pdfas/impl/api/verify/SignatureCheckImpl.java
new file mode 100644
index 0000000..d5803f8
--- /dev/null
+++ b/src/main/java/at/gv/egiz/pdfas/impl/api/verify/SignatureCheckImpl.java
@@ -0,0 +1,51 @@
+/**
+ *
+ */
+package at.gv.egiz.pdfas.impl.api.verify;
+
+import at.gv.egiz.pdfas.api.verify.SignatureCheck;
+
+/**
+ * @author wprinz
+ */
+public class SignatureCheckImpl implements SignatureCheck
+{
+ /**
+ * The check code.
+ */
+ protected int code = -1;
+
+ /**
+ * The check code message.
+ */
+ protected String message = null;
+
+
+
+ /**
+ * @param code The check code.
+ * @param message The check code message.
+ */
+ public SignatureCheckImpl(int code, String message)
+ {
+ this.code = code;
+ this.message = message;
+ }
+
+ /**
+ * @see at.gv.egiz.pdfas.api.verify.SignatureCheck#getCode()
+ */
+ public int getCode()
+ {
+ return this.code;
+ }
+
+ /**
+ * @see at.gv.egiz.pdfas.api.verify.SignatureCheck#getMessage()
+ */
+ public String getMessage()
+ {
+ return this.message;
+ }
+
+}
diff --git a/src/main/java/at/gv/egiz/pdfas/impl/api/verify/VerifyResultAdapter.java b/src/main/java/at/gv/egiz/pdfas/impl/api/verify/VerifyResultAdapter.java
new file mode 100644
index 0000000..d66097a
--- /dev/null
+++ b/src/main/java/at/gv/egiz/pdfas/impl/api/verify/VerifyResultAdapter.java
@@ -0,0 +1,126 @@
+/**
+ *
+ */
+package at.gv.egiz.pdfas.impl.api.verify;
+
+import java.security.cert.X509Certificate;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import at.gv.egiz.pdfas.api.verify.SignatureCheck;
+import at.gv.egiz.pdfas.api.verify.VerifyResult;
+import at.gv.egiz.pdfas.impl.api.commons.SignatureInformationAdapter;
+import at.knowcenter.wag.egov.egiz.exceptions.SettingNotFoundException;
+import at.knowcenter.wag.egov.egiz.pdf.SignatureHolder;
+import at.knowcenter.wag.egov.egiz.sig.SignatureResponse;
+
+/**
+ * Implements the VerifyResult interface.
+ *
+ * @author wprinz
+ */
+public class VerifyResultAdapter extends SignatureInformationAdapter implements VerifyResult
+{
+ protected SignatureResponse sigRes = null;
+
+ protected Date vTime = null;
+
+ /**
+ * Constructor.
+ *
+ * @param sigRes
+ * The SignatureResponse.
+ * @param sh
+ * The SignatureHolder.
+ * @param verificationTime
+ * The time of verification. This is directly returned by {@link #getVerificationTime()}
+ */
+ public VerifyResultAdapter(SignatureResponse sigRes, SignatureHolder sh, Date verificationTime)
+ {
+ super(sh);
+ this.sigRes = sigRes;
+ this.vTime = verificationTime;
+ }
+
+ /**
+ * @see at.gv.egiz.pdfas.api.verify.VerifyResult#getCertificateCheck()
+ */
+ public SignatureCheck getCertificateCheck()
+ {
+ return new SignatureCheckImpl(Integer.parseInt(this.sigRes.getCertificateCheckCode()), this.sigRes.getCertificateCheckInfo());
+ }
+
+ /**
+ * @see at.gv.egiz.pdfas.api.verify.VerifyResult#getManifestCheckCode()
+ */
+ public SignatureCheck getManifestCheckCode()
+ {
+ return new SignatureCheckImpl(Integer.parseInt(this.sigRes.getSignatureManifestCheckCode()), this.sigRes.getSignatureManifestCheckInfo());
+ }
+
+ /**
+ * @see at.gv.egiz.pdfas.api.verify.VerifyResult#getValueCheckCode()
+ */
+ public SignatureCheck getValueCheckCode()
+ {
+ return new SignatureCheckImpl(Integer.parseInt(this.sigRes.getSignatureCheckCode()), this.sigRes.getSignatureCheckInfo());
+ }
+
+ /**
+ * @see at.gv.egiz.pdfas.api.verify.VerifyResult#getVerificationTime()
+ */
+ public Date getVerificationTime()
+ {
+ return this.vTime;
+ }
+
+ /**
+ * @see at.gv.egiz.pdfas.api.verify.VerifyResult#isQualifiedCertificate()
+ */
+ public boolean isQualifiedCertificate()
+ {
+ return this.sigRes.isQualifiedCertificate();
+ }
+
+ /**
+ * @see at.gv.egiz.pdfas.api.verify.VerifyResult#getPublicProperties()
+ */
+ public List getPublicProperties()
+ {
+ try
+ {
+ return this.sigRes.getPublicProperties();
+ }
+ catch (SettingNotFoundException e)
+ {
+ e.printStackTrace();
+ return new ArrayList();
+ }
+ }
+
+ /**
+ * @see at.gv.egiz.pdfas.api.commons.SignatureInformation#getInternalSignatureInformation()
+ */
+ public Object getInternalSignatureInformation()
+ {
+ return null;
+ }
+
+ /**
+ * @see at.gv.egiz.pdfas.api.commons.SignatureInformation#getSignerCertificate()
+ */
+ public X509Certificate getSignerCertificate()
+ {
+ // TODO this should be the same as the signature holder's cert.
+ return this.sigRes.getCertificate().getX509Certificate();
+ }
+
+ /**
+ * @see at.gv.egiz.pdfas.api.verify.VerifyResult#getHashInputData()
+ */
+ public String getHashInputData()
+ {
+ return this.sigRes.getHashInputData();
+ }
+}
diff --git a/src/main/java/at/gv/egiz/pdfas/impl/api/verify/VerifyResultsImpl.java b/src/main/java/at/gv/egiz/pdfas/impl/api/verify/VerifyResultsImpl.java
new file mode 100644
index 0000000..e7cc79d
--- /dev/null
+++ b/src/main/java/at/gv/egiz/pdfas/impl/api/verify/VerifyResultsImpl.java
@@ -0,0 +1,38 @@
+/**
+ *
+ */
+package at.gv.egiz.pdfas.impl.api.verify;
+
+import java.util.List;
+
+import at.gv.egiz.pdfas.api.verify.VerifyResults;
+
+/**
+ * @author wprinz
+ */
+public class VerifyResultsImpl implements VerifyResults
+{
+ /**
+ * The results.
+ */
+ protected List results = null;
+
+ /**
+ * Constructor.
+ *
+ * @param results
+ * The results.
+ */
+ public VerifyResultsImpl(List results)
+ {
+ this.results = results;
+ }
+
+ /**
+ * @see at.gv.egiz.pdfas.api.verify.VerifyResults#getResults()
+ */
+ public List getResults()
+ {
+ return this.results;
+ }
+}
diff --git a/src/main/java/at/gv/egiz/pdfas/impl/input/helper/DataSourceHelper.java b/src/main/java/at/gv/egiz/pdfas/impl/input/helper/DataSourceHelper.java
index 138b269..2a3fedd 100644
--- a/src/main/java/at/gv/egiz/pdfas/impl/input/helper/DataSourceHelper.java
+++ b/src/main/java/at/gv/egiz/pdfas/impl/input/helper/DataSourceHelper.java
@@ -75,6 +75,17 @@ public class DataSourceHelper
{
try
{
+ return convertInputStreamToByteArrayIOEx(inputStream);
+ }
+ catch (IOException e)
+ {
+ log.error(e);
+ throw new RuntimeException(e);
+ }
+ }
+
+ public static byte [] convertInputStreamToByteArrayIOEx(InputStream inputStream) throws IOException
+ {
PerformanceCounters.byteArrays.increment();
ByteArrayOutputStream baos = new ByteArrayOutputStream(4096);
@@ -92,12 +103,6 @@ public class DataSourceHelper
byte [] data = baos.toByteArray();
return data;
- }
- catch (IOException e)
- {
- log.error(e);
- throw new RuntimeException(e);
- }
}
public static void debugDataSourceToFile(DataSource dataSource, File file)
diff --git a/src/main/java/at/gv/egiz/pdfas/impl/signator/IncrementalUpdateHelper.java b/src/main/java/at/gv/egiz/pdfas/impl/signator/IncrementalUpdateHelper.java
index a95cdc6..f308e30 100644
--- a/src/main/java/at/gv/egiz/pdfas/impl/signator/IncrementalUpdateHelper.java
+++ b/src/main/java/at/gv/egiz/pdfas/impl/signator/IncrementalUpdateHelper.java
@@ -32,14 +32,14 @@ public final class IncrementalUpdateHelper
return iui;
}
- public static void writeIncrementalUpdateToDataSink(PdfDataSource pdfDataSource, DataSink dataSink, PdfPTable pdf_table, PositioningInstruction pi) throws PresentableException
+ public static IncrementalUpdateInformation writeIncrementalUpdateToDataSink(PdfDataSource pdfDataSource, DataSink dataSink, PdfPTable pdf_table, PositioningInstruction pi) throws PresentableException
{
- writeIncrementalUpdateToDataSink(pdfDataSource, dataSink, pdf_table, pi, null, null);
+ return writeIncrementalUpdateToDataSink(pdfDataSource, dataSink, pdf_table, pi, null, null);
}
- public static void writeIncrementalUpdateToDataSink(PdfDataSource pdfDataSource, DataSink dataSink, PdfPTable pdf_table, PositioningInstruction pi, List variable_field_definitions,
+ public static IncrementalUpdateInformation writeIncrementalUpdateToDataSink(PdfDataSource pdfDataSource, DataSink dataSink, PdfPTable pdf_table, PositioningInstruction pi, List variable_field_definitions,
List all_field_definitions) throws PresentableException
{
- BinarySignature.writeIncrementalUpdate(pdfDataSource, dataSink, pdf_table, pi, variable_field_definitions, all_field_definitions);
+ return BinarySignature.writeIncrementalUpdate(pdfDataSource, dataSink, pdf_table, pi, variable_field_definitions, all_field_definitions);
}
}
diff --git a/src/main/java/at/gv/egiz/pdfas/impl/signator/binary/BinarySignatorInformation.java b/src/main/java/at/gv/egiz/pdfas/impl/signator/binary/BinarySignatorInformation.java
index 916abf4..0ed3699 100644
--- a/src/main/java/at/gv/egiz/pdfas/impl/signator/binary/BinarySignatorInformation.java
+++ b/src/main/java/at/gv/egiz/pdfas/impl/signator/binary/BinarySignatorInformation.java
@@ -5,6 +5,7 @@ package at.gv.egiz.pdfas.impl.signator.binary;
import java.util.List;
+import at.knowcenter.wag.egov.egiz.pdf.ActualTablePos;
import at.knowcenter.wag.egov.egiz.sig.SignatureData;
import at.knowcenter.wag.egov.egiz.sig.connectors.bku.SignSignatureObject;
import at.gv.egiz.pdfas.framework.input.PdfDataSource;
@@ -31,6 +32,8 @@ public class BinarySignatorInformation implements SignatorInformation
protected int enc_length = -1;
protected SignSignatureObject signSignatureObject = null;
+
+ protected ActualTablePos atp = null;
/**
* @see at.gv.egiz.pdfas.framework.signator.SignatorInformation#getSignatureData()
@@ -48,4 +51,20 @@ public class BinarySignatorInformation implements SignatorInformation
this.signSignatureObject = signSignatureObject;
}
+ /**
+ * @see at.gv.egiz.pdfas.framework.signator.SignatorInformation#getSignSignatureObject()
+ */
+ public SignSignatureObject getSignSignatureObject()
+ {
+ return this.signSignatureObject;
+ }
+
+ /**
+ * @see at.gv.egiz.pdfas.framework.signator.SignatorInformation#getActualTablePos()
+ */
+ public ActualTablePos getActualTablePos()
+ {
+ return this.atp;
+ }
+
}
diff --git a/src/main/java/at/gv/egiz/pdfas/impl/signator/binary/BinarySignator_1_0_0.java b/src/main/java/at/gv/egiz/pdfas/impl/signator/binary/BinarySignator_1_0_0.java
index b1f1cea..73d4866 100644
--- a/src/main/java/at/gv/egiz/pdfas/impl/signator/binary/BinarySignator_1_0_0.java
+++ b/src/main/java/at/gv/egiz/pdfas/impl/signator/binary/BinarySignator_1_0_0.java
@@ -296,6 +296,7 @@ public class BinarySignator_1_0_0 implements Signator
bsi.cert_length = iui.cert_length;
bsi.enc_start = iui.enc_start;
bsi.enc_length = iui.enc_length;
+ bsi.atp = iui.actualTablePos;
return bsi;
}
@@ -312,6 +313,7 @@ public class BinarySignator_1_0_0 implements Signator
iui.cert_length = bsi.cert_length;
iui.enc_start = bsi.enc_start;
iui.enc_length = bsi.enc_length;
+ iui.actualTablePos = bsi.atp;
iui.signed_signature_object = bsi.signSignatureObject;
diff --git a/src/main/java/at/gv/egiz/pdfas/impl/signator/textual/TextualSignatorInformation.java b/src/main/java/at/gv/egiz/pdfas/impl/signator/textual/TextualSignatorInformation.java
index c5b18ff..9e5ebb6 100644
--- a/src/main/java/at/gv/egiz/pdfas/impl/signator/textual/TextualSignatorInformation.java
+++ b/src/main/java/at/gv/egiz/pdfas/impl/signator/textual/TextualSignatorInformation.java
@@ -3,6 +3,7 @@
*/
package at.gv.egiz.pdfas.impl.signator.textual;
+import at.knowcenter.wag.egov.egiz.pdf.ActualTablePos;
import at.knowcenter.wag.egov.egiz.pdf.TablePos;
import at.knowcenter.wag.egov.egiz.sig.SignatureData;
import at.knowcenter.wag.egov.egiz.sig.connectors.bku.SignSignatureObject;
@@ -24,6 +25,8 @@ public class TextualSignatorInformation implements SignatorInformation
protected TablePos pos = null;
public SignSignatureObject signSignatureObject = null;
+
+ protected ActualTablePos atp = null;
/**
* @see at.gv.egiz.pdfas.framework.signator.SignatorInformation#getSignatureData()
@@ -34,7 +37,6 @@ public class TextualSignatorInformation implements SignatorInformation
}
/**
- *
* @see at.gv.egiz.pdfas.framework.signator.SignatorInformation#setSignSignatureObject(at.knowcenter.wag.egov.egiz.sig.connectors.bku.SignSignatureObject)
*/
public void setSignSignatureObject(SignSignatureObject signSignatureObject)
@@ -42,4 +44,19 @@ public class TextualSignatorInformation implements SignatorInformation
this.signSignatureObject = signSignatureObject;
}
+ /**
+ * @see at.gv.egiz.pdfas.framework.signator.SignatorInformation#getSignSignatureObject()
+ */
+ public SignSignatureObject getSignSignatureObject()
+ {
+ return this.signSignatureObject;
+ }
+
+ /**
+ * @see at.gv.egiz.pdfas.framework.signator.SignatorInformation#getActualTablePos()
+ */
+ public ActualTablePos getActualTablePos()
+ {
+ return this.atp;
+ }
}
diff --git a/src/main/java/at/gv/egiz/pdfas/impl/signator/textual/TextualSignator_1_0_0.java b/src/main/java/at/gv/egiz/pdfas/impl/signator/textual/TextualSignator_1_0_0.java
index 1714afc..b49803c 100644
--- a/src/main/java/at/gv/egiz/pdfas/impl/signator/textual/TextualSignator_1_0_0.java
+++ b/src/main/java/at/gv/egiz/pdfas/impl/signator/textual/TextualSignator_1_0_0.java
@@ -29,6 +29,7 @@ import at.knowcenter.wag.egov.egiz.PdfAS;
import at.knowcenter.wag.egov.egiz.PdfASID;
import at.knowcenter.wag.egov.egiz.exceptions.PresentableException;
import at.knowcenter.wag.egov.egiz.framework.SignatorFactory;
+import at.knowcenter.wag.egov.egiz.pdf.IncrementalUpdateInformation;
import at.knowcenter.wag.egov.egiz.pdf.PositioningInstruction;
import at.knowcenter.wag.egov.egiz.pdf.TablePos;
import at.knowcenter.wag.egov.egiz.sig.SignatureDataImpl;
@@ -127,7 +128,8 @@ public class TextualSignator_1_0_0 implements Signator
PositioningInstruction pi = PdfAS.determineTablePositioning(tsi.pos, tsi.profile, tsi.originalDocument, pdf_table);
- IncrementalUpdateHelper.writeIncrementalUpdateToDataSink(tsi.originalDocument, dataSink, pdf_table, pi);
+ IncrementalUpdateInformation iui = IncrementalUpdateHelper.writeIncrementalUpdateToDataSink(tsi.originalDocument, dataSink, pdf_table, pi);
+ tsi.atp = iui.actualTablePos;
// OutputStream os = dataSink.createOutputStream(PdfAS.PDF_MIME_TYPE);
// os.write(signed_iui.signed_pdf);