Author: davsclaus
Date: Tue Jan 29 19:28:33 2013
New Revision: 1440072

URL: http://svn.apache.org/viewvc?rev=1440072&view=rev
Log:
CAMEL-6019: Add PGP signature and signature verification support to 
PGPDataFormat. Thanks to Daniel Gredler for the patch.

Modified:
    
camel/trunk/components/camel-crypto/src/main/java/org/apache/camel/converter/crypto/PGPDataFormat.java
    
camel/trunk/components/camel-crypto/src/main/java/org/apache/camel/converter/crypto/PGPDataFormatUtil.java
    
camel/trunk/components/camel-crypto/src/test/java/org/apache/camel/converter/crypto/AbstractPGPDataFormatTest.java
    
camel/trunk/components/camel-crypto/src/test/java/org/apache/camel/converter/crypto/PGPDataFormatDynamicTest.java
    
camel/trunk/components/camel-crypto/src/test/java/org/apache/camel/converter/crypto/PGPDataFormatElGamalTest.java
    
camel/trunk/components/camel-crypto/src/test/java/org/apache/camel/converter/crypto/PGPDataFormatTest.java
    
camel/trunk/components/camel-crypto/src/test/java/org/apache/camel/converter/crypto/SpringPGPDataFormatTest.java

Modified: 
camel/trunk/components/camel-crypto/src/main/java/org/apache/camel/converter/crypto/PGPDataFormat.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-crypto/src/main/java/org/apache/camel/converter/crypto/PGPDataFormat.java?rev=1440072&r1=1440071&r2=1440072&view=diff
==============================================================================
--- 
camel/trunk/components/camel-crypto/src/main/java/org/apache/camel/converter/crypto/PGPDataFormat.java
 (original)
+++ 
camel/trunk/components/camel-crypto/src/main/java/org/apache/camel/converter/crypto/PGPDataFormat.java
 Tue Jan 29 19:28:33 2013
@@ -16,11 +16,17 @@
  */
 package org.apache.camel.converter.crypto;
 
+import java.io.BufferedOutputStream;
 import java.io.ByteArrayInputStream;
+import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.security.NoSuchAlgorithmException;
+import java.security.NoSuchProviderException;
 import java.security.SecureRandom;
 import java.security.Security;
+import java.security.SignatureException;
+import java.util.Date;
 
 import org.apache.camel.Exchange;
 import org.apache.camel.spi.DataFormat;
@@ -29,16 +35,27 @@ import org.apache.camel.util.IOHelper;
 import org.apache.commons.io.IOUtils;
 import org.bouncycastle.bcpg.ArmoredOutputStream;
 import org.bouncycastle.bcpg.CompressionAlgorithmTags;
+import org.bouncycastle.bcpg.HashAlgorithmTags;
 import org.bouncycastle.jce.provider.BouncyCastleProvider;
 import org.bouncycastle.openpgp.PGPCompressedData;
+import org.bouncycastle.openpgp.PGPCompressedDataGenerator;
 import org.bouncycastle.openpgp.PGPEncryptedData;
 import org.bouncycastle.openpgp.PGPEncryptedDataGenerator;
 import org.bouncycastle.openpgp.PGPEncryptedDataList;
+import org.bouncycastle.openpgp.PGPException;
 import org.bouncycastle.openpgp.PGPLiteralData;
+import org.bouncycastle.openpgp.PGPLiteralDataGenerator;
 import org.bouncycastle.openpgp.PGPObjectFactory;
+import org.bouncycastle.openpgp.PGPOnePassSignature;
+import org.bouncycastle.openpgp.PGPOnePassSignatureList;
 import org.bouncycastle.openpgp.PGPPrivateKey;
 import org.bouncycastle.openpgp.PGPPublicKey;
 import org.bouncycastle.openpgp.PGPPublicKeyEncryptedData;
+import org.bouncycastle.openpgp.PGPSecretKey;
+import org.bouncycastle.openpgp.PGPSignature;
+import org.bouncycastle.openpgp.PGPSignatureGenerator;
+import org.bouncycastle.openpgp.PGPSignatureList;
+import org.bouncycastle.openpgp.PGPSignatureSubpacketGenerator;
 import org.bouncycastle.openpgp.PGPUtil;
 import org.bouncycastle.util.io.Streams;
 
@@ -51,9 +68,22 @@ public class PGPDataFormat implements Da
     public static final String KEY_FILE_NAME = "CamelPGPDataFormatKeyFileName";
     public static final String KEY_USERID = "CamelPGPDataFormatKeyUserid";
     public static final String KEY_PASSWORD = "CamelPGPDataFormatKeyPassword";
+    public static final String SIGNATURE_KEY_FILE_NAME = 
"CamelPGPDataFormatSignatureKeyFileName";
+    public static final String SIGNATURE_KEY_USERID = 
"CamelPGPDataFormatSignatureKeyUserid";
+    public static final String SIGNATURE_KEY_PASSWORD = 
"CamelPGPDataFormatSignatureKeyPassword";
+
+    private static final int BUFFER_SIZE = 16 * 1024;
+
+    // encryption / decryption key info (required)
     private String keyUserid;
     private String password;
     private String keyFileName;
+
+    // signature / verification key info (optional)
+    private String signatureKeyUserid;
+    private String signaturePassword;
+    private String signatureKeyFileName;
+
     private boolean armored;
     private boolean integrity = true;
 
@@ -75,21 +105,25 @@ public class PGPDataFormat implements Da
         return exchange.getIn().getHeader(KEY_PASSWORD, password, 
String.class);
     }
 
+    protected String findSignatureKeyFileName(Exchange exchange) {
+        return exchange.getIn().getHeader(SIGNATURE_KEY_FILE_NAME, 
signatureKeyFileName, String.class);
+    }
+
+    protected String findSignatureKeyUserid(Exchange exchange) {
+        return exchange.getIn().getHeader(SIGNATURE_KEY_USERID, 
signatureKeyUserid, String.class);
+    }
+
+    protected String findSignatureKeyPassword(Exchange exchange) {
+        return exchange.getIn().getHeader(SIGNATURE_KEY_PASSWORD, 
signaturePassword, String.class);
+    }
+
     public void marshal(Exchange exchange, Object graph, OutputStream 
outputStream) throws Exception {
-        PGPPublicKey key = 
PGPDataFormatUtil.findPublicKey(exchange.getContext(), 
findKeyFileName(exchange), findKeyUserid(exchange));
+        PGPPublicKey key = 
PGPDataFormatUtil.findPublicKey(exchange.getContext(), 
findKeyFileName(exchange), findKeyUserid(exchange), true);
         if (key == null) {
             throw new IllegalArgumentException("Public key is null, cannot 
proceed");
         }
 
-        byte[] plaintextData;
-        InputStream plaintextStream = null;
-        try {
-            plaintextStream = ExchangeHelper.convertToMandatoryType(exchange, 
InputStream.class, graph);
-            plaintextData = IOUtils.toByteArray(plaintextStream);
-        } finally {
-            IOUtils.closeQuietly(plaintextStream);
-        }
-        byte[] compressedData = PGPDataFormatUtil.compress(plaintextData, 
PGPLiteralData.CONSOLE, CompressionAlgorithmTags.ZIP);
+        InputStream input = ExchangeHelper.convertToMandatoryType(exchange, 
InputStream.class, graph);
 
         if (armored) {
             outputStream = new ArmoredOutputStream(outputStream);
@@ -97,15 +131,67 @@ public class PGPDataFormat implements Da
 
         PGPEncryptedDataGenerator encGen = new 
PGPEncryptedDataGenerator(PGPEncryptedData.CAST5, integrity, new 
SecureRandom(), "BC");
         encGen.addMethod(key);
+        OutputStream encOut = encGen.open(outputStream, new byte[BUFFER_SIZE]);
+
+        PGPCompressedDataGenerator comData = new 
PGPCompressedDataGenerator(CompressionAlgorithmTags.ZIP);
+        OutputStream comOut = new BufferedOutputStream(comData.open(encOut));
+
+        PGPSignatureGenerator sigGen = createSignatureGenerator(exchange, 
comOut);
+
+        PGPLiteralDataGenerator litData = new PGPLiteralDataGenerator();
+        OutputStream litOut = litData.open(comOut, PGPLiteralData.BINARY, 
PGPLiteralData.CONSOLE, new Date(), new byte[BUFFER_SIZE]);
 
-        OutputStream encOut = encGen.open(outputStream, compressedData.length);
         try {
-            encOut.write(compressedData);
+            byte[] buffer = new byte[BUFFER_SIZE];
+            int bytesRead;
+            while ((bytesRead = input.read(buffer)) != -1) {
+                litOut.write(buffer, 0, bytesRead);
+                if (sigGen != null) {
+                    sigGen.update(buffer, 0, bytesRead);
+                }
+                litOut.flush();
+            }
         } finally {
-            IOHelper.close(encOut, outputStream);
+            IOHelper.close(litOut);
+            if (sigGen != null) {
+                sigGen.generate().encode(comOut);
+            }
+            IOHelper.close(comOut, encOut, outputStream, input);
         }
     }
 
+    protected PGPSignatureGenerator createSignatureGenerator(Exchange 
exchange, OutputStream out)
+        throws IOException, PGPException, NoSuchProviderException, 
NoSuchAlgorithmException {
+
+        String sigKeyFileName = findSignatureKeyFileName(exchange);
+        String sigKeyUserid = findSignatureKeyUserid(exchange);
+        String sigKeyPassword = findSignatureKeyPassword(exchange);
+
+        if (sigKeyFileName == null || sigKeyUserid == null || sigKeyPassword 
== null) {
+            return null;
+        }
+
+        PGPSecretKey sigSecretKey = 
PGPDataFormatUtil.findSecretKey(exchange.getContext(), sigKeyFileName, 
sigKeyPassword);
+        if (sigSecretKey == null) {
+            throw new IllegalArgumentException("Signature secret key is null, 
cannot proceed");
+        }
+
+        PGPPrivateKey sigPrivateKey = 
sigSecretKey.extractPrivateKey(sigKeyPassword.toCharArray(), "BC");
+        if (sigPrivateKey == null) {
+            throw new IllegalArgumentException("Signature private key is null, 
cannot proceed");
+        }
+
+        PGPSignatureSubpacketGenerator spGen = new 
PGPSignatureSubpacketGenerator();
+        spGen.setSignerUserID(false, sigKeyUserid);
+
+        int algorithm = sigSecretKey.getPublicKey().getAlgorithm();
+        PGPSignatureGenerator sigGen = new PGPSignatureGenerator(algorithm, 
HashAlgorithmTags.SHA1, "BC");
+        sigGen.initSign(PGPSignature.BINARY_DOCUMENT, sigPrivateKey);
+        sigGen.setHashedSubpackets(spGen.generate());
+        sigGen.generateOnePassVersion(false).encode(out);
+        return sigGen;
+    }
+
     public Object unmarshal(Exchange exchange, InputStream encryptedStream) 
throws Exception {
         if (encryptedStream == null) {
             return null;
@@ -125,36 +211,69 @@ public class PGPDataFormat implements Da
             IOUtils.closeQuietly(encryptedStream);
         }
 
-        PGPObjectFactory pgpF = new PGPObjectFactory(in);
-        PGPEncryptedDataList enc;
-        Object o = pgpF.nextObject();
+        PGPObjectFactory pgpFactory = new PGPObjectFactory(in);
+        Object o = pgpFactory.nextObject();
 
-        // the first object might be a PGP marker packet.
+        // the first object might be a PGP marker packet
+        PGPEncryptedDataList enc;
         if (o instanceof PGPEncryptedDataList) {
             enc = (PGPEncryptedDataList) o;
         } else {
-            enc = (PGPEncryptedDataList) pgpF.nextObject();
+            enc = (PGPEncryptedDataList) pgpFactory.nextObject();
         }
         IOHelper.close(in);
 
         PGPPublicKeyEncryptedData pbe = (PGPPublicKeyEncryptedData) enc.get(0);
-        InputStream clear = pbe.getDataStream(key, "BC");
+        InputStream encData = pbe.getDataStream(key, "BC");
 
-        PGPObjectFactory pgpFact = new PGPObjectFactory(clear);
-        PGPCompressedData cData = (PGPCompressedData) pgpFact.nextObject();
-        pgpFact = new PGPObjectFactory(cData.getDataStream());
-        PGPLiteralData ld = (PGPLiteralData) pgpFact.nextObject();
+        pgpFactory = new PGPObjectFactory(encData);
+        PGPCompressedData comData = (PGPCompressedData) 
pgpFactory.nextObject();
+
+        pgpFactory = new PGPObjectFactory(comData.getDataStream());
+        Object object = pgpFactory.nextObject();
+
+        PGPOnePassSignature signature;
+        if (object instanceof PGPOnePassSignatureList) {
+            signature = getSignature(exchange, (PGPOnePassSignatureList) 
object);
+            object = pgpFactory.nextObject();
+        } else {
+            signature = null;
+        }
+
+        PGPLiteralData ld = (PGPLiteralData) object;
+        InputStream litData = ld.getInputStream();
 
         byte[] answer;
         try {
-            answer = Streams.readAll(ld.getInputStream());
+            answer = Streams.readAll(litData);
         } finally {
-            IOHelper.close(clear);
+            IOHelper.close(litData, encData, in);
+        }
+
+        if (signature != null) {
+            signature.update(answer);
+            PGPSignatureList sigList = (PGPSignatureList) 
pgpFactory.nextObject();
+            if (!signature.verify(sigList.get(0))) {
+                throw new SignatureException("Cannot verify PGP signature");
+            }
         }
 
         return answer;
     }
 
+    protected PGPOnePassSignature getSignature(Exchange exchange, 
PGPOnePassSignatureList signatureList)
+        throws IOException, PGPException, NoSuchProviderException {
+
+        PGPPublicKey sigPublicKey = 
PGPDataFormatUtil.findPublicKey(exchange.getContext(), 
findSignatureKeyFileName(exchange), findSignatureKeyUserid(exchange), false);
+        if (sigPublicKey == null) {
+            throw new IllegalArgumentException("Signature public key is null, 
cannot proceed");
+        }
+
+        PGPOnePassSignature signature = signatureList.get(0);
+        signature.initVerify(sigPublicKey, "BC");
+        return signature;
+    }
+
     /**
      * Sets if the encrypted file should be written in ascii visible text
      */
@@ -209,4 +328,37 @@ public class PGPDataFormat implements Da
     public String getPassword() {
         return password;
     }
+
+    /**
+     * Userid of the signature key used to sign/verify
+     */
+    public void setSignatureKeyUserid(String signatureKeyUserid) {
+        this.signatureKeyUserid = signatureKeyUserid;
+    }
+
+    public String getSignatureKeyUserid() {
+        return signatureKeyUserid;
+    }
+
+    /**
+     * filename of the signature keyring that will be used, classpathResource
+     */
+    public void setSignatureKeyFileName(String signatureKeyFileName) {
+        this.signatureKeyFileName = signatureKeyFileName;
+    }
+
+    public String getSignatureKeyFileName() {
+        return signatureKeyFileName;
+    }
+
+    /**
+     * Password used to open the signature private keyring
+     */
+    public void setSignaturePassword(String signaturePassword) {
+        this.signaturePassword = signaturePassword;
+    }
+
+    public String getSignaturePassword() {
+        return signaturePassword;
+    }
 }

Modified: 
camel/trunk/components/camel-crypto/src/main/java/org/apache/camel/converter/crypto/PGPDataFormatUtil.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-crypto/src/main/java/org/apache/camel/converter/crypto/PGPDataFormatUtil.java?rev=1440072&r1=1440071&r2=1440072&view=diff
==============================================================================
--- 
camel/trunk/components/camel-crypto/src/main/java/org/apache/camel/converter/crypto/PGPDataFormatUtil.java
 (original)
+++ 
camel/trunk/components/camel-crypto/src/main/java/org/apache/camel/converter/crypto/PGPDataFormatUtil.java
 Tue Jan 29 19:28:33 2013
@@ -16,22 +16,16 @@
  */
 package org.apache.camel.converter.crypto;
 
-import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
-import java.io.OutputStream;
 import java.security.NoSuchProviderException;
-import java.util.Date;
 import java.util.Iterator;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.util.IOHelper;
 import org.apache.camel.util.ResourceHelper;
-import org.bouncycastle.openpgp.PGPCompressedDataGenerator;
 import org.bouncycastle.openpgp.PGPEncryptedDataList;
 import org.bouncycastle.openpgp.PGPException;
-import org.bouncycastle.openpgp.PGPLiteralData;
-import org.bouncycastle.openpgp.PGPLiteralDataGenerator;
 import org.bouncycastle.openpgp.PGPObjectFactory;
 import org.bouncycastle.openpgp.PGPPrivateKey;
 import org.bouncycastle.openpgp.PGPPublicKey;
@@ -39,29 +33,36 @@ import org.bouncycastle.openpgp.PGPPubli
 import org.bouncycastle.openpgp.PGPPublicKeyRing;
 import org.bouncycastle.openpgp.PGPPublicKeyRingCollection;
 import org.bouncycastle.openpgp.PGPSecretKey;
+import org.bouncycastle.openpgp.PGPSecretKeyRing;
 import org.bouncycastle.openpgp.PGPSecretKeyRingCollection;
 import org.bouncycastle.openpgp.PGPUtil;
 
+import static org.bouncycastle.bcpg.PublicKeyAlgorithmTags.DSA;
+import static org.bouncycastle.bcpg.PublicKeyAlgorithmTags.ECDSA;
+import static org.bouncycastle.bcpg.PublicKeyAlgorithmTags.ELGAMAL_GENERAL;
+import static org.bouncycastle.bcpg.PublicKeyAlgorithmTags.RSA_GENERAL;
+import static org.bouncycastle.bcpg.PublicKeyAlgorithmTags.RSA_SIGN;
+
 public final class PGPDataFormatUtil {
 
     private PGPDataFormatUtil() {
     }
-    
-    public static PGPPublicKey findPublicKey(CamelContext context, String 
filename, String userid) throws IOException, PGPException,
+
+    public static PGPPublicKey findPublicKey(CamelContext context, String 
filename, String userid, boolean forEncryption) throws IOException, 
PGPException,
             NoSuchProviderException {
 
         InputStream is = 
ResourceHelper.resolveMandatoryResourceAsInputStream(context.getClassResolver(),
 filename);
-        PGPPublicKey privKey;
+        PGPPublicKey pubKey;
         try {
-            privKey = findPublicKey(context, is, userid);
+            pubKey = findPublicKey(is, userid, forEncryption);
         } finally {
             IOHelper.close(is);
         }
-        return privKey;
+        return pubKey;
     }
 
     @SuppressWarnings("unchecked")
-    public static PGPPublicKey findPublicKey(CamelContext context, InputStream 
input, String userid) throws IOException, PGPException,
+    private static PGPPublicKey findPublicKey(InputStream input, String 
userid, boolean forEncryption) throws IOException, PGPException,
             NoSuchProviderException {
         PGPPublicKeyRingCollection pgpSec = new 
PGPPublicKeyRingCollection(PGPUtil.getDecoderStream(input));
 
@@ -76,8 +77,12 @@ public final class PGPDataFormatUtil {
                 for (Iterator<String> iterator = key.getUserIDs(); 
iterator.hasNext();) {
                     keyUserId = iterator.next();
                 }
-                if (key.isEncryptionKey() && keyUserId != null && 
keyUserId.contains(userid)) {
-                    return key;
+                if (keyUserId != null && keyUserId.contains(userid)) {
+                    if (forEncryption && key.isEncryptionKey()) {
+                        return key;
+                    } else if (!forEncryption && isSignatureKey(key)) {
+                        return key;
+                    }
                 }
             }
         }
@@ -85,6 +90,11 @@ public final class PGPDataFormatUtil {
         return null;
     }
 
+    private static boolean isSignatureKey(PGPPublicKey key) {
+        int algorithm = key.getAlgorithm();
+        return algorithm == RSA_GENERAL || algorithm == RSA_SIGN || algorithm 
== DSA || algorithm == ECDSA || algorithm == ELGAMAL_GENERAL;
+    }
+
     public static PGPPrivateKey findPrivateKey(CamelContext context, String 
keychainFilename, InputStream encryptedInput, String passphrase)
         throws IOException, PGPException, NoSuchProviderException {
 
@@ -92,14 +102,14 @@ public final class PGPDataFormatUtil {
 
         PGPPrivateKey privKey = null;
         try {
-            privKey = findPrivateKey(context, keyChainInputStream, 
encryptedInput, passphrase);
+            privKey = findPrivateKey(keyChainInputStream, encryptedInput, 
passphrase);
         } finally {
             IOHelper.close(keyChainInputStream);
         }
         return privKey;
     }
 
-    public static PGPPrivateKey findPrivateKey(CamelContext context, 
InputStream keyringInput, InputStream encryptedInput, String passphrase) throws 
IOException,
+    private static PGPPrivateKey findPrivateKey(InputStream keyringInput, 
InputStream encryptedInput, String passphrase) throws IOException,
             PGPException, NoSuchProviderException {
         PGPSecretKeyRingCollection pgpSec = new 
PGPSecretKeyRingCollection(PGPUtil.getDecoderStream(keyringInput));
         PGPObjectFactory factory = new 
PGPObjectFactory(PGPUtil.getDecoderStream(encryptedInput));
@@ -122,26 +132,34 @@ public final class PGPDataFormatUtil {
         return privateKey;
     }
 
-    public static byte[] compress(byte[] clearData, String fileName, int 
algorithm) throws IOException {
-        ByteArrayOutputStream bOut = new ByteArrayOutputStream();
-        PGPCompressedDataGenerator comData = new 
PGPCompressedDataGenerator(algorithm);
-        OutputStream cos = comData.open(bOut); // open it with the final 
destination
-
-        PGPLiteralDataGenerator lData = new PGPLiteralDataGenerator();
-
-        OutputStream pOut = lData.open(cos, // the compressed output stream
-                PGPLiteralData.BINARY, fileName, // "filename" to store
-                clearData.length, // length of clear data
-                new Date() // current time
-        );
+    public static PGPSecretKey findSecretKey(CamelContext context, String 
keychainFilename, String passphrase)
+        throws IOException, PGPException, NoSuchProviderException {
+
+        InputStream keyChainInputStream = 
ResourceHelper.resolveMandatoryResourceAsInputStream(context.getClassResolver(),
 keychainFilename);
 
+        PGPSecretKey secKey = null;
         try {
-            pOut.write(clearData);
+            secKey = findSecretKey(keyChainInputStream, passphrase);
         } finally {
-            IOHelper.close(pOut);
-            comData.close();
+            IOHelper.close(keyChainInputStream);
         }
-        return bOut.toByteArray();
+        return secKey;
     }
 
+    private static PGPSecretKey findSecretKey(InputStream keyringInput, String 
passphrase) throws IOException, PGPException, NoSuchProviderException {
+        PGPSecretKey pgpSecKey = null;
+        PGPSecretKeyRingCollection pgpSec = new 
PGPSecretKeyRingCollection(PGPUtil.getDecoderStream(keyringInput));
+        for (Iterator<?> i = pgpSec.getKeyRings(); i.hasNext() && pgpSecKey == 
null;) {
+            Object data = i.next();
+            if (data instanceof PGPSecretKeyRing) {
+                PGPSecretKeyRing keyring = (PGPSecretKeyRing) data;
+                PGPSecretKey secKey = keyring.getSecretKey();
+                PGPPrivateKey privateKey = 
secKey.extractPrivateKey(passphrase.toCharArray(), "BC");
+                if (privateKey != null) {
+                    pgpSecKey = secKey;
+                }
+            }
+        }
+        return pgpSecKey;
+    }
 }

Modified: 
camel/trunk/components/camel-crypto/src/test/java/org/apache/camel/converter/crypto/AbstractPGPDataFormatTest.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-crypto/src/test/java/org/apache/camel/converter/crypto/AbstractPGPDataFormatTest.java?rev=1440072&r1=1440071&r2=1440072&view=diff
==============================================================================
--- 
camel/trunk/components/camel-crypto/src/test/java/org/apache/camel/converter/crypto/AbstractPGPDataFormatTest.java
 (original)
+++ 
camel/trunk/components/camel-crypto/src/test/java/org/apache/camel/converter/crypto/AbstractPGPDataFormatTest.java
 Tue Jan 29 19:28:33 2013
@@ -17,6 +17,7 @@
 package org.apache.camel.converter.crypto;
 
 import java.io.ByteArrayInputStream;
+import java.util.HashMap;
 import java.util.Map;
 
 import org.apache.camel.CamelContext;
@@ -27,11 +28,12 @@ import org.apache.camel.test.junit4.Came
 
 public abstract class AbstractPGPDataFormatTest extends CamelTestSupport {
     
-    protected void doRoundTripEncryptionTests(String endpoint, Map<String, 
Object> headers) throws Exception {
+    protected void doRoundTripEncryptionTests(String endpoint) throws 
Exception {
         MockEndpoint encrypted = setupExpectations(context, 3, 
"mock:encrypted");
         MockEndpoint unencrypted = setupExpectations(context, 3, 
"mock:unencrypted");
 
         String payload = "Hi Alice, Be careful Eve is listening, signed Bob";
+        Map<String, Object> headers = getHeaders();
         template.sendBodyAndHeaders(endpoint, payload, headers);
         template.sendBodyAndHeaders(endpoint, payload.getBytes(), headers);
         template.sendBodyAndHeaders(endpoint, new 
ByteArrayInputStream(payload.getBytes()), headers);
@@ -39,6 +41,10 @@ public abstract class AbstractPGPDataFor
         assertMocksSatisfied(encrypted, unencrypted, payload);
     }
 
+    protected Map<String, Object> getHeaders() {
+        return new HashMap<String, Object>();
+    }
+
     protected void assertMocksSatisfied(MockEndpoint encrypted, MockEndpoint 
unencrypted, String payload) throws InterruptedException, 
InvalidPayloadException {
         awaitAndAssert(unencrypted);
         awaitAndAssert(encrypted);

Modified: 
camel/trunk/components/camel-crypto/src/test/java/org/apache/camel/converter/crypto/PGPDataFormatDynamicTest.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-crypto/src/test/java/org/apache/camel/converter/crypto/PGPDataFormatDynamicTest.java?rev=1440072&r1=1440071&r2=1440072&view=diff
==============================================================================
--- 
camel/trunk/components/camel-crypto/src/test/java/org/apache/camel/converter/crypto/PGPDataFormatDynamicTest.java
 (original)
+++ 
camel/trunk/components/camel-crypto/src/test/java/org/apache/camel/converter/crypto/PGPDataFormatDynamicTest.java
 Tue Jan 29 19:28:33 2013
@@ -19,38 +19,24 @@ package org.apache.camel.converter.crypt
 import java.util.HashMap;
 import java.util.Map;
 
-import org.junit.Test;
-
 public class PGPDataFormatDynamicTest extends PGPDataFormatTest {
     // setup a wrong userid
     protected String getKeyUserId() {
         return "wrong";
     }
+
     // setup a wrong password
     protected String getKeyPassword() {
         return "wrong";
     }
-    
-    private Map<String, Object> getHeaders() {
+
+    // override wrong userid and password with correct userid and password in 
the headers
+    protected Map<String, Object> getHeaders() {
         Map<String, Object> headers = new HashMap<String, Object>();
         headers.put(PGPDataFormat.KEY_USERID, "[email protected]");
+        headers.put(PGPDataFormat.SIGNATURE_KEY_USERID, "[email protected]");
         headers.put(PGPDataFormat.KEY_PASSWORD, "sdude");
+        headers.put(PGPDataFormat.SIGNATURE_KEY_PASSWORD, "sdude");
         return headers;
     }
-    
-    @Test
-    public void testEncryption() throws Exception {
-        doRoundTripEncryptionTests("direct:inline", getHeaders());
-    }
-
-    @Test
-    public void testEncryption2() throws Exception {
-        doRoundTripEncryptionTests("direct:inline2", getHeaders());
-    }
-
-    @Test
-    public void testEncryptionArmor() throws Exception {
-        doRoundTripEncryptionTests("direct:inline-armor", getHeaders());
-    }
-
 }

Modified: 
camel/trunk/components/camel-crypto/src/test/java/org/apache/camel/converter/crypto/PGPDataFormatElGamalTest.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-crypto/src/test/java/org/apache/camel/converter/crypto/PGPDataFormatElGamalTest.java?rev=1440072&r1=1440071&r2=1440072&view=diff
==============================================================================
--- 
camel/trunk/components/camel-crypto/src/test/java/org/apache/camel/converter/crypto/PGPDataFormatElGamalTest.java
 (original)
+++ 
camel/trunk/components/camel-crypto/src/test/java/org/apache/camel/converter/crypto/PGPDataFormatElGamalTest.java
 Tue Jan 29 19:28:33 2013
@@ -18,8 +18,7 @@ package org.apache.camel.converter.crypt
 
 import org.junit.Ignore;
 
-@Ignore("It looks like the bcpg dosen't work well with the JDK of CI"
-+ "The tests are passed in my Mac JDK-1.6.0_33")
+@Ignore("Requires JCE unlimited strength jurisdiction policy files on CI 
server")
 public class PGPDataFormatElGamalTest extends PGPDataFormatTest {
     protected String getKeyFileName() {
         return "org/apache/camel/component/crypto/pubring-ElGamal.gpg";

Modified: 
camel/trunk/components/camel-crypto/src/test/java/org/apache/camel/converter/crypto/PGPDataFormatTest.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-crypto/src/test/java/org/apache/camel/converter/crypto/PGPDataFormatTest.java?rev=1440072&r1=1440071&r2=1440072&view=diff
==============================================================================
--- 
camel/trunk/components/camel-crypto/src/test/java/org/apache/camel/converter/crypto/PGPDataFormatTest.java
 (original)
+++ 
camel/trunk/components/camel-crypto/src/test/java/org/apache/camel/converter/crypto/PGPDataFormatTest.java
 Tue Jan 29 19:28:33 2013
@@ -16,8 +16,6 @@
  */
 package org.apache.camel.converter.crypto;
 
-import java.util.HashMap;
-
 import org.apache.camel.builder.RouteBuilder;
 import org.junit.Test;
 
@@ -41,17 +39,22 @@ public class PGPDataFormatTest extends A
 
     @Test
     public void testEncryption() throws Exception {
-        doRoundTripEncryptionTests("direct:inline", new HashMap<String, 
Object>());
+        doRoundTripEncryptionTests("direct:inline");
     }
 
     @Test
     public void testEncryption2() throws Exception {
-        doRoundTripEncryptionTests("direct:inline2", new HashMap<String, 
Object>());
+        doRoundTripEncryptionTests("direct:inline2");
     }
 
     @Test
     public void testEncryptionArmor() throws Exception {
-        doRoundTripEncryptionTests("direct:inline-armor", new HashMap<String, 
Object>());
+        doRoundTripEncryptionTests("direct:inline-armor");
+    }
+
+    @Test
+    public void testEncryptionSigned() throws Exception {
+        doRoundTripEncryptionTests("direct:inline-sign");
     }
 
     protected RouteBuilder createRouteBuilder() {
@@ -96,6 +99,26 @@ public class PGPDataFormatTest extends A
                         .unmarshal().pgp(keyFileNameSec, keyUserid, 
keyPassword, true, true)
                         .to("mock:unencrypted");
                 // END SNIPPET: pgp-format-header
+
+                PGPDataFormat pgpSignAndEncrypt = new PGPDataFormat();
+                pgpSignAndEncrypt.setKeyFileName(keyFileName);
+                pgpSignAndEncrypt.setKeyUserid(keyUserid);
+                pgpSignAndEncrypt.setSignatureKeyFileName(keyFileNameSec);
+                pgpSignAndEncrypt.setSignatureKeyUserid(keyUserid);
+                pgpSignAndEncrypt.setSignaturePassword(keyPassword);
+
+                PGPDataFormat pgpVerifyAndDecrypt = new PGPDataFormat();
+                pgpVerifyAndDecrypt.setKeyFileName(keyFileNameSec);
+                pgpVerifyAndDecrypt.setKeyUserid(keyUserid);
+                pgpVerifyAndDecrypt.setPassword(keyPassword);
+                pgpVerifyAndDecrypt.setSignatureKeyFileName(keyFileName);
+                pgpVerifyAndDecrypt.setSignatureKeyUserid(keyUserid);
+
+                from("direct:inline-sign")
+                        .marshal(pgpSignAndEncrypt)
+                        .to("mock:encrypted")
+                        .unmarshal(pgpVerifyAndDecrypt)
+                        .to("mock:unencrypted");
             }
         };
     }

Modified: 
camel/trunk/components/camel-crypto/src/test/java/org/apache/camel/converter/crypto/SpringPGPDataFormatTest.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-crypto/src/test/java/org/apache/camel/converter/crypto/SpringPGPDataFormatTest.java?rev=1440072&r1=1440071&r2=1440072&view=diff
==============================================================================
--- 
camel/trunk/components/camel-crypto/src/test/java/org/apache/camel/converter/crypto/SpringPGPDataFormatTest.java
 (original)
+++ 
camel/trunk/components/camel-crypto/src/test/java/org/apache/camel/converter/crypto/SpringPGPDataFormatTest.java
 Tue Jan 29 19:28:33 2013
@@ -16,8 +16,6 @@
  */
 package org.apache.camel.converter.crypto;
 
-import java.util.HashMap;
-
 import org.apache.camel.CamelContext;
 import org.apache.camel.spring.SpringCamelContext;
 import org.junit.Test;
@@ -30,7 +28,7 @@ public class SpringPGPDataFormatTest ext
 
     @Test
     public void testEncryption() throws Exception {
-        doRoundTripEncryptionTests("direct:inline", new HashMap<String, 
Object>());
+        doRoundTripEncryptionTests("direct:inline");
     }
 
 }


Reply via email to