diff options
Diffstat (limited to 'pdf-as-lib/src/main/java/at/gv/egiz/sl/util')
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 |