From 3e09340faf5a07094837f01e928945c4c3fbc640 Mon Sep 17 00:00:00 2001 From: tkellner Date: Wed, 15 Jan 2014 17:15:33 +0000 Subject: Enable passing CMS Signature data via reference git-svn-id: https://joinup.ec.europa.eu/svn/mocca/trunk@1294 8a26b1a7-26f0-462f-b9ef-d0e30c41f5a4 --- .../impl/CreateCMSSignatureCommandImpl.java | 10 +++++++- .../gv/egiz/bku/slcommands/impl/cms/Signature.java | 29 +++++++++++++++++++--- 2 files changed, 34 insertions(+), 5 deletions(-) (limited to 'bkucommon/src/main') diff --git a/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/impl/CreateCMSSignatureCommandImpl.java b/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/impl/CreateCMSSignatureCommandImpl.java index fe8fb05e..2dab3cf8 100644 --- a/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/impl/CreateCMSSignatureCommandImpl.java +++ b/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/impl/CreateCMSSignatureCommandImpl.java @@ -27,6 +27,7 @@ package at.gv.egiz.bku.slcommands.impl; import iaik.cms.CMSException; import iaik.cms.CMSSignatureException; +import java.security.InvalidParameterException; import java.security.cert.X509Certificate; import java.util.Collections; import java.util.Date; @@ -112,7 +113,14 @@ public class CreateCMSSignatureCommandImpl extends Date signingTime = new Date(); try { signature = new Signature(request.getDataObject(), request.getStructure(), - signingCertificate, signingTime, configurationFacade.getUseStrongHash()); + signingCertificate, signingTime, commandContext.getURLDereferencer(), + configurationFacade.getUseStrongHash()); + } catch (SLCommandException e) { + log.error("Error creating CMS Signature.", e); + throw e; + } catch (InvalidParameterException e) { + log.error("Error creating CMS Signature.", e); + throw new SLCommandException(3004); } catch (Exception e) { log.error("Error creating CMS Signature.", e); throw new SLCommandException(4000); diff --git a/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/impl/cms/Signature.java b/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/impl/cms/Signature.java index 937296b1..dc632ffd 100644 --- a/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/impl/cms/Signature.java +++ b/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/impl/cms/Signature.java @@ -44,6 +44,9 @@ import iaik.smime.ess.ESSCertID; import iaik.smime.ess.ESSCertIDv2; import iaik.x509.X509ExtensionException; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; import java.security.InvalidParameterException; import java.security.NoSuchAlgorithmException; import java.security.PrivateKey; @@ -70,6 +73,7 @@ import at.gv.egiz.bku.slcommands.impl.xsect.AlgorithmMethodFactory; import at.gv.egiz.bku.slcommands.impl.xsect.AlgorithmMethodFactoryImpl; import at.gv.egiz.bku.slcommands.impl.xsect.STALSignatureException; import at.gv.egiz.bku.slexceptions.SLCommandException; +import at.gv.egiz.bku.utils.urldereferencer.URLDereferencer; import at.gv.egiz.stal.HashDataInput; import at.gv.egiz.stal.STAL; @@ -99,9 +103,12 @@ public class Signature { private ExcludedByteRangeType excludedByteRange; public Signature(CMSDataObjectRequiredMetaType dataObject, String structure, - X509Certificate signingCertificate, Date signingTime, boolean useStrongHash) - throws NoSuchAlgorithmException, CertificateEncodingException, CertificateException, X509ExtensionException, InvalidParameterException, CodingException { - byte[] dataToBeSigned = getContent(dataObject); + X509Certificate signingCertificate, Date signingTime, URLDereferencer urlDereferencer, + boolean useStrongHash) + throws NoSuchAlgorithmException, CertificateEncodingException, + CertificateException, X509ExtensionException, InvalidParameterException, + CodingException, SLCommandException, IOException { + byte[] dataToBeSigned = getContent(dataObject, urlDereferencer); int mode = structure.equalsIgnoreCase("enveloping") ? SignedData.IMPLICIT : SignedData.EXPLICIT; this.signedData = new SignedData(dataToBeSigned, mode); setAlgorithmIDs(signingCertificate, useStrongHash); @@ -172,8 +179,22 @@ public class Signature { attributes.add(signingTime); } - private byte[] getContent(CMSDataObjectRequiredMetaType dataObject) throws InvalidParameterException { + private byte[] getContent(CMSDataObjectRequiredMetaType dataObject, URLDereferencer urlDereferencer) + throws InvalidParameterException, SLCommandException, IOException { byte[] data = dataObject.getContent().getBase64Content(); + if (data == null) { + String reference = dataObject.getContent().getReference(); + if (reference == null) + throw new SLCommandException(4003); + InputStream is = urlDereferencer.dereference(reference).getStream(); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + byte[] buffer = new byte[1024]; + for (int i = is.read(buffer); i > -1; i = is.read(buffer)) { + baos.write(buffer, 0, i); + } + data = baos.toByteArray(); + is.close(); + } this.signedDocument = data.clone(); this.excludedByteRange = dataObject.getExcludedByteRange(); -- cgit v1.2.3