aboutsummaryrefslogtreecommitdiff
path: root/pdf-as-lib/src/main/java/at/gv/egiz/sl/util
diff options
context:
space:
mode:
Diffstat (limited to 'pdf-as-lib/src/main/java/at/gv/egiz/sl/util')
-rw-r--r--pdf-as-lib/src/main/java/at/gv/egiz/sl/util/BKUSLConnector.java165
-rw-r--r--pdf-as-lib/src/main/java/at/gv/egiz/sl/util/BaseSLConnector.java120
-rw-r--r--pdf-as-lib/src/main/java/at/gv/egiz/sl/util/ISLConnector.java15
-rw-r--r--pdf-as-lib/src/main/java/at/gv/egiz/sl/util/SLMarschaller.java49
-rw-r--r--pdf-as-lib/src/main/java/at/gv/egiz/sl/util/package-info.java8
5 files changed, 357 insertions, 0 deletions
diff --git a/pdf-as-lib/src/main/java/at/gv/egiz/sl/util/BKUSLConnector.java b/pdf-as-lib/src/main/java/at/gv/egiz/sl/util/BKUSLConnector.java
new file mode 100644
index 00000000..3381dca5
--- /dev/null
+++ b/pdf-as-lib/src/main/java/at/gv/egiz/sl/util/BKUSLConnector.java
@@ -0,0 +1,165 @@
+package at.gv.egiz.sl.util;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+import javax.xml.bind.JAXBElement;
+import javax.xml.bind.JAXBException;
+
+import org.apache.http.HttpResponse;
+import org.apache.http.client.ClientProtocolException;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.ContentType;
+import org.apache.http.entity.mime.MultipartEntityBuilder;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.DefaultHttpClient;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import at.gv.egiz.pdfas.common.exceptions.PDFIOException;
+import at.gv.egiz.pdfas.common.exceptions.PdfAsException;
+import at.gv.egiz.pdfas.common.exceptions.SLPdfAsException;
+import at.gv.egiz.pdfas.lib.api.Configuration;
+import at.gv.egiz.sl.CreateCMSSignatureRequestType;
+import at.gv.egiz.sl.CreateCMSSignatureResponseType;
+import at.gv.egiz.sl.ErrorResponseType;
+import at.gv.egiz.sl.InfoboxReadRequestType;
+import at.gv.egiz.sl.InfoboxReadResponseType;
+
+public class BKUSLConnector extends BaseSLConnector {
+
+ private static final Logger logger = LoggerFactory
+ .getLogger(BKUSLConnector.class);
+
+ public static final String CONFIG_BKU_URL = "bku.sign.url";
+
+ private String bkuUrl;
+
+ public BKUSLConnector(Configuration config) {
+ this.bkuUrl = config.getValue(CONFIG_BKU_URL);
+ }
+
+ private CloseableHttpClient buildHttpClient() {
+ HttpClientBuilder builder = HttpClientBuilder.create();
+ return builder.build();
+ }
+
+ private String performHttpRequestToBKU(String xmlRequest)
+ throws ClientProtocolException, IOException, IllegalStateException {
+ CloseableHttpClient client = null;
+ try {
+ client = buildHttpClient();
+ HttpPost post = new HttpPost(this.bkuUrl);
+
+ MultipartEntityBuilder entityBuilder = MultipartEntityBuilder
+ .create();
+ entityBuilder.addTextBody(XMLREQUEST, xmlRequest,
+ ContentType.TEXT_XML);
+
+ post.setEntity(entityBuilder.build());
+
+ HttpResponse response = client.execute(post);
+ logger.debug("Response Code : "
+ + response.getStatusLine().getStatusCode());
+
+ BufferedReader rd = new BufferedReader(new InputStreamReader(
+ response.getEntity().getContent()));
+
+ StringBuffer result = new StringBuffer();
+ String line = "";
+ while ((line = rd.readLine()) != null) {
+ result.append(line);
+ }
+
+ logger.trace(result.toString());
+ return result.toString();
+ } finally {
+ if(client != null) {
+ client.close();
+ }
+ }
+ }
+
+ @SuppressWarnings("rawtypes")
+ public InfoboxReadResponseType sendInfoboxReadRequest(
+ InfoboxReadRequestType request) throws PdfAsException {
+ JAXBElement element = null;
+ String slRequest;
+ try {
+ slRequest = SLMarschaller.marshalToString(of
+ .createInfoboxReadRequest(request));
+ logger.trace(slRequest);
+
+ String slResponse = performHttpRequestToBKU(slRequest);
+
+ element = (JAXBElement) SLMarschaller
+ .unmarshalFromString(slResponse);
+
+ } catch (JAXBException e) {
+ throw new PDFIOException("SL_COM", e);
+ } catch (ClientProtocolException e) {
+ throw new PDFIOException("SL_COM", e);
+ } catch (IOException e) {
+ throw new PDFIOException("SL_COM", e);
+ }
+
+ if (element == null) {
+ throw new PDFIOException("SL ELEMENT NOT AVAILABLE");
+ }
+
+ if (element.getValue() instanceof InfoboxReadResponseType) {
+ InfoboxReadResponseType infoboxReadResponseType = (InfoboxReadResponseType) element
+ .getValue();
+ return infoboxReadResponseType;
+ } else if (element.getValue() instanceof ErrorResponseType) {
+ ErrorResponseType errorResponseType = (ErrorResponseType) element
+ .getValue();
+ throw new SLPdfAsException(errorResponseType.getErrorCode(),
+ errorResponseType.getInfo());
+ }
+ throw new PdfAsException("Invalid SL Repsonse");
+ }
+
+ public CreateCMSSignatureResponseType sendCMSRequest(
+ CreateCMSSignatureRequestType request) throws PdfAsException {
+ JAXBElement element = null;
+ String slRequest;
+ try {
+ slRequest = SLMarschaller.marshalToString(of
+ .createCreateCMSSignatureRequest(request));
+ logger.trace(slRequest);
+
+ String slResponse = performHttpRequestToBKU(slRequest);
+
+ element = (JAXBElement) SLMarschaller
+ .unmarshalFromString(slResponse);
+ } catch (JAXBException e) {
+ throw new PDFIOException("SL_COM", e);
+ } catch (ClientProtocolException e) {
+ throw new PDFIOException("SL_COM", e);
+ } catch (IOException e) {
+ throw new PDFIOException("SL_COM", e);
+ }
+
+ if (element == null) {
+ throw new PDFIOException("SL ELEMENT NOT AVAILABLE");
+ }
+
+ if (element.getValue() instanceof CreateCMSSignatureResponseType) {
+ CreateCMSSignatureResponseType createCMSSignatureResponseType = (CreateCMSSignatureResponseType) element
+ .getValue();
+ logger.debug(createCMSSignatureResponseType.toString());
+ return createCMSSignatureResponseType;
+ } else if (element.getValue() instanceof ErrorResponseType) {
+ ErrorResponseType errorResponseType = (ErrorResponseType) element
+ .getValue();
+ throw new SLPdfAsException(errorResponseType.getErrorCode(),
+ errorResponseType.getInfo());
+ }
+ throw new PdfAsException("Invalid SL Repsonse");
+
+ }
+}
diff --git a/pdf-as-lib/src/main/java/at/gv/egiz/sl/util/BaseSLConnector.java b/pdf-as-lib/src/main/java/at/gv/egiz/sl/util/BaseSLConnector.java
new file mode 100644
index 00000000..51b63f51
--- /dev/null
+++ b/pdf-as-lib/src/main/java/at/gv/egiz/sl/util/BaseSLConnector.java
@@ -0,0 +1,120 @@
+package at.gv.egiz.sl.util;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.nio.Buffer;
+import java.util.Arrays;
+
+import javax.xml.bind.JAXBElement;
+import javax.xml.bind.JAXBException;
+
+import org.apache.http.HttpResponse;
+import org.apache.http.client.ClientProtocolException;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.ContentType;
+import org.apache.http.entity.mime.HttpMultipartMode;
+import org.apache.http.entity.mime.MultipartEntity;
+import org.apache.http.entity.mime.MultipartEntityBuilder;
+import org.apache.http.entity.mime.content.StringBody;
+import org.apache.http.impl.client.DefaultHttpClient;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import at.gv.egiz.pdfas.common.exceptions.PDFIOException;
+import at.gv.egiz.pdfas.common.exceptions.PdfAsException;
+import at.gv.egiz.pdfas.common.exceptions.SLPdfAsException;
+import at.gv.egiz.pdfas.lib.impl.signing.pdfbox.PADESPDFBOXSigner;
+import at.gv.egiz.sl.Base64OptRefContentType;
+import at.gv.egiz.sl.CMSDataObjectRequiredMetaType;
+import at.gv.egiz.sl.CreateCMSSignatureRequestType;
+import at.gv.egiz.sl.CreateCMSSignatureResponseType;
+import at.gv.egiz.sl.ErrorResponseType;
+import at.gv.egiz.sl.InfoboxReadParamsAssocArrayType;
+import at.gv.egiz.sl.InfoboxReadRequestType;
+import at.gv.egiz.sl.InfoboxReadResponseType;
+import at.gv.egiz.sl.MetaInfoType;
+import at.gv.egiz.sl.InfoboxReadParamsAssocArrayType.ReadValue;
+import at.gv.egiz.sl.ObjectFactory;
+
+public abstract class BaseSLConnector implements ISLConnector {
+
+ private static final Logger logger = LoggerFactory.getLogger(BaseSLConnector.class);
+
+ public static final String SecureSignatureKeypair = "SecureSignatureKeypair";
+
+ public static final String PDF_MIME_TYPE = "application/pdf";
+ public static final String PDF_MIME_TYPE_DESC = "Adobe PDF-Dateien";
+
+ public static final String DETACHED = "detached";
+
+ public static final String XMLREQUEST = "XMLRequest";
+
+ protected ObjectFactory of = new ObjectFactory();
+
+ public InfoboxReadRequestType createInfoboxReadRequest() {
+ InfoboxReadRequestType request = new InfoboxReadRequestType();
+ request.setInfoboxIdentifier("Certificates");
+ InfoboxReadParamsAssocArrayType readData = new InfoboxReadParamsAssocArrayType();
+
+ ReadValue readValue = new ReadValue();
+ readValue.setKey(SecureSignatureKeypair);
+
+ readData.setReadValue(readValue);
+ request.setAssocArrayParameters(readData);
+ return request;
+ }
+
+ public CreateCMSSignatureRequestType createCMSRequest(byte[] signatureData, int[] byteRange) {
+ // TODO build byte[] from signatureData and fill 0 bytes in byteRanged
+ if(byteRange.length % 2 != 0) {
+ // TODO: error
+ }
+
+ int lastOffset = byteRange[byteRange.length - 2];
+ int lastSize = byteRange[byteRange.length - 1];
+
+ int dataSize = lastOffset + lastSize;
+
+ byte[] data = new byte[dataSize];
+ int currentdataOff = 0;
+
+ Arrays.fill(data, (byte)0);
+
+ for(int i = 0; i < byteRange.length; i = i + 2) {
+ int offset = byteRange[i];
+ int size = byteRange[i+1];
+
+ for(int j = 0; j < size; j++) {
+ data[offset + j] = signatureData[currentdataOff];
+ currentdataOff++;
+ }
+
+ }
+
+ // == MetaInfoType
+ MetaInfoType metaInfoType = new MetaInfoType();
+ metaInfoType.setMimeType(PDF_MIME_TYPE);
+ metaInfoType.setDescription(PDF_MIME_TYPE_DESC);
+
+ // == Base64OptRefContentType
+ Base64OptRefContentType base64OptRefContentType = new Base64OptRefContentType();
+ base64OptRefContentType.setBase64Content(data);
+
+ // == CMSDataObjectRequiredMetaType
+ CMSDataObjectRequiredMetaType cmsDataObjectRequiredMetaType = new CMSDataObjectRequiredMetaType();
+ cmsDataObjectRequiredMetaType.setMetaInfo(metaInfoType);
+ cmsDataObjectRequiredMetaType.setContent(base64OptRefContentType);
+ // cmsDataObjectRequiredMetaType.setExcludedByteRange()
+
+ // == CreateCMSSignatureRequestType
+ CreateCMSSignatureRequestType request = new CreateCMSSignatureRequestType();
+ request.setKeyboxIdentifier(SecureSignatureKeypair);
+ request.setDataObject(cmsDataObjectRequiredMetaType);
+ request.setStructure(DETACHED);
+
+ return request;
+ }
+
+}
diff --git a/pdf-as-lib/src/main/java/at/gv/egiz/sl/util/ISLConnector.java b/pdf-as-lib/src/main/java/at/gv/egiz/sl/util/ISLConnector.java
new file mode 100644
index 00000000..82571720
--- /dev/null
+++ b/pdf-as-lib/src/main/java/at/gv/egiz/sl/util/ISLConnector.java
@@ -0,0 +1,15 @@
+package at.gv.egiz.sl.util;
+
+import at.gv.egiz.pdfas.common.exceptions.PdfAsException;
+import at.gv.egiz.sl.CreateCMSSignatureRequestType;
+import at.gv.egiz.sl.CreateCMSSignatureResponseType;
+import at.gv.egiz.sl.InfoboxReadRequestType;
+import at.gv.egiz.sl.InfoboxReadResponseType;
+
+public interface ISLConnector {
+
+ public InfoboxReadRequestType createInfoboxReadRequest();
+ public InfoboxReadResponseType sendInfoboxReadRequest(InfoboxReadRequestType request) throws PdfAsException;
+ public CreateCMSSignatureRequestType createCMSRequest(byte[] signatureData, int[] byteRange);
+ public CreateCMSSignatureResponseType sendCMSRequest(CreateCMSSignatureRequestType request) throws PdfAsException;
+}
diff --git a/pdf-as-lib/src/main/java/at/gv/egiz/sl/util/SLMarschaller.java b/pdf-as-lib/src/main/java/at/gv/egiz/sl/util/SLMarschaller.java
new file mode 100644
index 00000000..8f1b3cc5
--- /dev/null
+++ b/pdf-as-lib/src/main/java/at/gv/egiz/sl/util/SLMarschaller.java
@@ -0,0 +1,49 @@
+package at.gv.egiz.sl.util;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.StringReader;
+import java.io.StringWriter;
+
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.Marshaller;
+import javax.xml.bind.Unmarshaller;
+
+public class SLMarschaller {
+ private static Marshaller marshaller = null;
+ private static Unmarshaller unmarshaller = null;
+
+ static {
+ try {
+ JAXBContext context = JAXBContext.newInstance("at.gv.egiz.sl");
+ marshaller = context.createMarshaller();
+ marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
+ marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
+
+ unmarshaller = context.createUnmarshaller();
+ } catch (JAXBException e) {
+ throw new RuntimeException(
+ "There was a problem creating a JAXBContext object for formatting the object to XML.");
+ }
+ }
+
+ public static void marshal(Object obj, OutputStream os) throws JAXBException {
+ marshaller.marshal(obj, os);
+ }
+
+ public static String marshalToString(Object obj) throws JAXBException {
+ StringWriter sw = new StringWriter();
+ marshaller.marshal(obj, sw);
+ return sw.toString();
+ }
+
+ public static Object unmarshal(InputStream is) throws JAXBException {
+ return unmarshaller.unmarshal(is);
+ }
+
+ public static Object unmarshalFromString(String message) throws JAXBException {
+ StringReader sr = new StringReader(message);
+ return unmarshaller.unmarshal(sr);
+ }
+}
diff --git a/pdf-as-lib/src/main/java/at/gv/egiz/sl/util/package-info.java b/pdf-as-lib/src/main/java/at/gv/egiz/sl/util/package-info.java
new file mode 100644
index 00000000..f370e34d
--- /dev/null
+++ b/pdf-as-lib/src/main/java/at/gv/egiz/sl/util/package-info.java
@@ -0,0 +1,8 @@
+/**
+ *
+ */
+/**
+ * @author afitzek
+ *
+ */
+package at.gv.egiz.sl.util; \ No newline at end of file