Repository: camel
Updated Branches:
  refs/heads/master 30afa95e8 -> 792e4c6d6


Added camel-crypto docs to gitbook


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/792e4c6d
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/792e4c6d
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/792e4c6d

Branch: refs/heads/master
Commit: 792e4c6d63224890d266634436e544959b21d133
Parents: 30afa95
Author: Andrea Cosentino <anco...@gmail.com>
Authored: Tue Feb 16 13:26:02 2016 +0100
Committer: Andrea Cosentino <anco...@gmail.com>
Committed: Tue Feb 16 13:26:02 2016 +0100

----------------------------------------------------------------------
 .../main/docs/crypto-digital-signatures.adoc    | 238 ++++++++
 .../camel-crypto/src/main/docs/crypto.adoc      | 609 +++++++++++++++++++
 docs/user-manual/en/SUMMARY.md                  |   2 +
 3 files changed, 849 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/792e4c6d/components/camel-crypto/src/main/docs/crypto-digital-signatures.adoc
----------------------------------------------------------------------
diff --git 
a/components/camel-crypto/src/main/docs/crypto-digital-signatures.adoc 
b/components/camel-crypto/src/main/docs/crypto-digital-signatures.adoc
new file mode 100644
index 0000000..7b0aac2
--- /dev/null
+++ b/components/camel-crypto/src/main/docs/crypto-digital-signatures.adoc
@@ -0,0 +1,238 @@
+[[CryptocomponentforDigitalSignatures]]
+Crypto component for Digital Signatures
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+*Available as of Camel 2.3*
+
+With Camel cryptographic endpoints and Java's Cryptographic extension it
+is easy to create Digital Signatures for link:exchange.html[Exchange]s.
+Camel provides a pair of flexible endpoints which get used in concert to
+create a signature for an exchange in one part of the exchange's
+workflow and then verify the signature in a later part of the workflow.
+
+Maven users will need to add the following dependency to their `pom.xml`
+for this component:
+
+[source,xml]
+------------------------------------------------------------
+<dependency>
+    <groupId>org.apache.camel</groupId>
+    <artifactId>camel-crypto</artifactId>
+    <version>x.x.x</version>
+    <!-- use the same version as your Camel core version -->
+</dependency>
+------------------------------------------------------------
+
+[[Introduction]]
+Introduction
+^^^^^^^^^^^^
+
+Digital signatures make use of Asymmetric Cryptographic techniques to
+sign messages. From a (very) high level, the algorithms use pairs of
+complimentary keys with the special property that data encrypted with
+one key can only be decrypted with the other. One, the private key, is
+closely guarded and used to 'sign' the message while the other, public
+key, is shared around to anyone interested in verifying the signed
+messages. Messages are signed by using the private key to encrypting a
+digest of the message. This encrypted digest is transmitted along with
+the message. On the other side the verifier recalculates the message
+digest and uses the public key to decrypt the the digest in the
+signature. If both digests match the verifier knows only the holder of
+the private key could have created the signature.
+
+Camel uses the Signature service from the Java Cryptographic Extension
+to do all the heavy cryptographic lifting required to create exchange
+signatures. The following are some excellent resources for explaining
+the mechanics of Cryptography, Message digests and Digital Signatures
+and how to leverage them with the JCE.
+
+* Bruce Schneier's Applied Cryptography
+* Beginning Cryptography with Java by David Hook
+* The ever insightful Wikipedia
+http://en.wikipedia.org/wiki/Digital_signature[Digital_signatures]
+
+[[URIformat]]
+URI format
+^^^^^^^^^^
+
+As mentioned Camel provides a pair of crypto endpoints to create and
+verify signatures
+
+[source,java]
+----------------------------
+crypto:sign:name[?options]
+crypto:verify:name[?options]
+----------------------------
+
+* `crypto:sign` creates the signature and stores it in the Header keyed
+by the constant
+`org.apache.camel.component.crypto.DigitalSignatureConstants.SIGNATURE`,
+i.e. `"CamelDigitalSignature"`.
+* `crypto:verify` will read in the contents of this header and do the
+verification calculation.
+
+In order to correctly function, the sign and verify process needs a pair
+of keys to be shared, signing requiring a `PrivateKey` and verifying a
+`PublicKey` (or a `Certificate` containing one). Using the JCE it is
+very simple to generate these key pairs but it is usually most secure to
+use a KeyStore to house and share your keys. The DSL is very flexible
+about how keys are supplied and provides a number of mechanisms.
+
+Note a `crypto:sign` endpoint is typically defined in one route and the
+complimentary `crypto:verify` in another, though for simplicity in the
+examples they appear one after the other. It goes without saying that
+both signing and verifying should be configured identically.
+
+[[Options]]
+Options
+^^^^^^^
+
+[width="70%",cols="10%,10%,10%,70%",options="header",]
+|=======================================================================
+|Name |Type |Default |Description
+
+|`algorithm` |`String` |`SHA1WithDSA` |The name of the JCE Signature algorithm 
that will be used.
+
+|`alias` |`String` |`null` |An alias name that will be used to select a key 
from the keystore.
+
+|`bufferSize` |`Integer` |`2048` |the size of the buffer used in the signature 
process.
+
+|`certificate` |`Certificate` |`null` |A Certificate used to verify the 
signature of the exchange's payload.
+Either this or a Public Key is required.
+
+|`keystore` |`KeyStore` |`null` |A reference to a JCE Keystore that stores 
keys and certificates used to
+sign and verify.
+
+|keyStoreParameters *Camel 2.14.1* |KeyStoreParameters |null |A reference to a 
Camel KeyStoreParameters Object which wraps a Java
+KeyStore Object
+
+|`provider` |`String` |`null` |The name of the JCE Security Provider that 
should be used.
+
+|`privateKey` |`PrivateKey` |`null` |The private key used to sign the 
exchange's payload.
+
+|`publicKey` |`PublicKey` |`null` |The public key used to verify the signature 
of the exchange's payload.
+
+|`secureRandom` |`secureRandom` |`null` |A reference to a `SecureRandom` 
object that will be used to initialize
+the Signature service.
+
+|`password` |`char[]` |`null` |The password to access the private key from the 
keystore
+
+|`clearHeaders` |`String` |`true` |Remove camel crypto headers from Message 
after a verify operation (value
+can be `"true"`/`"false"`).
+|=======================================================================
+
+[[Using]]
+Using
+^^^^^
+
+[[Rawkeys]]
+1) Raw keys
++++++++++++
+
+The most basic way to way to sign and verify an exchange is with a
+KeyPair as follows.
+
+The same can be achieved with the link:spring-xml-extensions.html[Spring
+XML Extensions] using references to keys
+
+[[KeyStoresandAliases]]
+2) KeyStores and Aliases.
++++++++++++++++++++++++++
+
+The JCE provides a very versatile keystore concept for housing pairs of
+private keys and certificates, keeping them encrypted and password
+protected. They can be retrieved by applying an alias to the retrieval
+APIs. There are a number of ways to get keys and Certificates into a
+keystore, most often this is done with the external 'keytool'
+application.
+http://www.exampledepot.com/egs/java.security.cert/CreateCert.html[This]
+is a good example of using keytool to create a KeyStore with a self
+signed Cert and Private key.
+
+The examples use a Keystore with a key and cert aliased by 'bob'. The
+password for the keystore and the key is 'letmein'
+
+The following shows how to use a Keystore via the Fluent builders, it
+also shows how to load and initialize the keystore.
+
+Again in Spring a ref is used to lookup an actual keystore instance.
+
+[[ChangingJCEProviderandAlgorithm]]
+3) Changing JCE Provider and Algorithm
+++++++++++++++++++++++++++++++++++++++
+
+Changing the Signature algorithm or the Security provider is a simple
+matter of specifying their names. You will need to also use Keys that
+are compatible with the algorithm you choose.
+
+or
+
+[[ChangingtheSignatureMessageHeader]]
+4) Changing the Signature Message Header
+++++++++++++++++++++++++++++++++++++++++
+
+It may be desirable to change the message header used to store the
+signature. A different header name can be specified in the route
+definition as follows
+
+or
+
+[[Changingthebuffersize]]
+5) Changing the buffersize
+++++++++++++++++++++++++++
+
+In case you need to update the size of the buffer...
+
+or
+
+[[SupplyingKeysdynamically.]]
+6) Supplying Keys dynamically.
+++++++++++++++++++++++++++++++
+
+When using a Recipient list or similar EIP the recipient of an exchange
+can vary dynamically. Using the same key across all recipients may be
+neither feasible nor desirable. It would be useful to be able to specify
+signature keys dynamically on a per-exchange basis. The exchange could
+then be dynamically enriched with the key of its target recipient prior
+to signing. To facilitate this the signature mechanisms allow for keys
+to be supplied dynamically via the message headers below
+
+* `Exchange.SIGNATURE_PRIVATE_KEY`, `"CamelSignaturePrivateKey"`
+* `Exchange.SIGNATURE_PUBLIC_KEY_OR_CERT`,
+`"CamelSignaturePublicKeyOrCert"`
+
+or
+
+Even better would be to dynamically supply a keystore alias. Again the
+alias can be supplied in a message header
+
+* `Exchange.KEYSTORE_ALIAS`, `"CamelSignatureKeyStoreAlias"`
+
+or
+
+The header would be set as follows
+
+[source,java]
+-------------------------------------------------------------------------------------------------
+Exchange unsigned = getMandatoryEndpoint("direct:alias-sign").createExchange();
+unsigned.getIn().setBody(payload);
+unsigned.getIn().setHeader(DigitalSignatureConstants.KEYSTORE_ALIAS, "bob");
+unsigned.getIn().setHeader(DigitalSignatureConstants.KEYSTORE_PASSWORD, 
"letmein".toCharArray());
+template.send("direct:alias-sign", unsigned);
+Exchange signed = getMandatoryEndpoint("direct:alias-sign").createExchange();
+signed.getIn().copyFrom(unsigned.getOut());
+signed.getIn().setHeader(KEYSTORE_ALIAS, "bob");
+template.send("direct:alias-verify", signed);
+-------------------------------------------------------------------------------------------------
+
+[[SeeAlso]]
+See Also
+^^^^^^^^
+
+* link:configuring-camel.html[Configuring Camel]
+* link:component.html[Component]
+* link:endpoint.html[Endpoint]
+* link:getting-started.html[Getting Started]
+* link:crypto.html[Crypto] Crypto is also available as a
+* link:data-format.html[Data Format]
+

http://git-wip-us.apache.org/repos/asf/camel/blob/792e4c6d/components/camel-crypto/src/main/docs/crypto.adoc
----------------------------------------------------------------------
diff --git a/components/camel-crypto/src/main/docs/crypto.adoc 
b/components/camel-crypto/src/main/docs/crypto.adoc
new file mode 100644
index 0000000..b1c60f9
--- /dev/null
+++ b/components/camel-crypto/src/main/docs/crypto.adoc
@@ -0,0 +1,609 @@
+[[Crypto-Crypto]]
+Crypto
+~~~~~~
+
+*Available as of Camel 2.3* 
+*PGP Available as of Camel 2.9*
+
+The Crypto link:data-format.html[Data Format] integrates the Java
+Cryptographic Extension into Camel, allowing simple and flexible
+encryption and decryption of messages using Camel's familiar marshall
+and unmarshal formatting mechanism. It assumes marshalling to mean
+encryption to cyphertext and unmarshalling to mean decryption back to
+the original plaintext. This data format implements only symmetric
+(shared-key) encryption and decyption.
+
+[[Crypto-Options]]
+Options
+^^^^^^^
+[width="70%",cols="10%,10%,10%,70%",options="header",]
+|=======================================================================
+|Name |Type |Default |Description
+
+|`algorithm` |`String` |`DES/CBC/PKCS5Padding` |The JCE algorithm name 
indicating the cryptographic algorithm that will
+be used.
+
+|`algorithmParameterSpec` |`java.security.spec.AlgorithmParameterSpec` |`null` 
|A JCE AlgorithmParameterSpec used to initialize the Cipher.
+
+|`bufferSize` |`Integer` |`4096` |the size of the buffer used in the signature 
process.
+
+|`cryptoProvider` |`String` |`null` |The name of the JCE Security Provider 
that should be used.
+
+|`initializationVector` |`byte[]` |`null` |A byte array containing the 
Initialization Vector that will be used to
+initialize the Cipher.
+
+|`inline` |`boolean` |`false` |Flag indicating that the configured IV should 
be inlined into the
+encrypted data stream.
+
+|`macAlgorithm` |`String` |`null` |The JCE algorithm name indicating the 
Message Authentication algorithm.
+
+|`shouldAppendHMAC` |`boolean` |`null`
+|=======================================================================
+
+Flag indicating that a Message Authentication Code should be calculated
+and appended to the encrypted data.
+
+[[Crypto-BasicUsage]]
+Basic Usage
+^^^^^^^^^^^
+
+At its most basic all that is required to encrypt/decrypt an exchange is
+a shared secret key. If one or more instances of the Crypto data format
+are configured with this key the format can be used to encrypt the
+payload in one route (or part of one) and decrypted in another. For
+example, using the Java DSL as follows:
+
+In Spring the dataformat is configured first and then used in routes
+
+[source,xml]
+-----------------------------------------------------------------------
+<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring";>
+  <dataFormats>
+    <crypto id="basic" algorithm="DES" keyRef="desKey" />
+  </dataFormats>
+    ...
+  <route>
+    <from uri="direct:basic-encryption" />
+    <marshal ref="basic" />
+    <to uri="mock:encrypted" />
+    <unmarshal ref="basic" />
+    <to uri="mock:unencrypted" />
+  </route>
+</camelContext>
+-----------------------------------------------------------------------
+
+[[Crypto-SpecifyingtheEncryptionAlgorithm]]
+Specifying the Encryption Algorithm
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Changing the algorithm is a matter of supplying the JCE algorithm name.
+If you change the algorithm you will need to use a compatible key.
+
+A list of the available algorithms in Java 7 is available via the
+http://docs.oracle.com/javase/7/docs/technotes/guides/security/StandardNames.html[Java
+Cryptography Architecture Standard Algorithm Name Documentation].
+
+[[Crypto-SpecifyinganInitializationVector]]
+Specifying an Initialization Vector
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Some crypto algorithms, particularly block algorithms, require
+configuration with an initial block of data known as an Initialization
+Vector. In the JCE this is passed as an AlgorithmParameterSpec when the
+Cipher is initialized. To use such a vector with the CryptoDataFormat
+you can configure it with a byte[] containing the required data e.g.
+
+or with spring, suppling a reference to a byte[]
+
+The same vector is required in both the encryption and decryption
+phases. As it is not necessary to keep the IV a secret, the DataFormat
+allows for it to be inlined into the encrypted data and subsequently
+read out in the decryption phase to initialize the Cipher. To inline the
+IV set the /oinline flag.
+
+or with spring.
+
+For more information of the use of Initialization Vectors, consult
+
+*
+http://en.wikipedia.org/wiki/Initialization_vector[http://en.wikipedia.org/wiki/Initialization_vector]
+*
+http://www.herongyang.com/Cryptography/[http://www.herongyang.com/Cryptography/]
+*
+http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation[http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation]
+
+[[Crypto-HashedMessageAuthenticationCodes(HMAC)]]
+Hashed Message Authentication Codes (HMAC)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+To avoid attacks against the encrypted data while it is in transit the
+CryptoDataFormat can also calculate a Message Authentication Code for
+the encrypted exchange contents based on a configurable MAC algorithm.
+The calculated HMAC is appended to the stream after encryption. It is
+separated from the stream in the decryption phase. The MAC is
+recalculated and verified against the transmitted version to insure
+nothing was tampered with in transit.For more information on Message
+Authentication Codes see
+http://en.wikipedia.org/wiki/HMAC[http://en.wikipedia.org/wiki/HMAC]
+
+or with spring.
+
+By default the HMAC is calculated using the HmacSHA1 mac algorithm
+though this can be easily changed by supplying a different algorithm
+name. See
+https://cwiki.apache.org/confluence/pages/createpage.action?spaceKey=CAMEL&title=here&linkCreation=true&fromPageId=17268915[here]
+for how to check what algorithms are available through the configured
+security providers
+
+or with spring.
+
+[[Crypto-SupplyingKeysDynamically]]
+Supplying Keys Dynamically
+^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+When using a Recipient list or similar EIP the recipient of an exchange
+can vary dynamically. Using the same key across all recipients may
+neither be feasible or desirable. It would be useful to be able to
+specify keys dynamically on a per exchange basis. The exchange could
+then be dynamically enriched with the key of its target recipient before
+being processed by the data format. To facilitate this the DataFormat
+allow for keys to be supplied dynamically via the message headers below
+
+* `CryptoDataFormat.KEY` `"CamelCryptoKey"`
+
+or with spring.
+
+[[Crypto-PGPMessage]]
+PGP Message
+^^^^^^^^^^^
+
+The PGP Data Formater can create and decrypt/verify PGP Messages of the
+following PGP packet structure (entries in brackets are optional and
+ellipses indicate repetition, comma represents  sequential composition,
+and vertical bar separates alternatives):
+
+    Public Key Encrypted Session Key ..., Symmetrically Encrypted Data |
+Sym. Encrypted and Integrity Protected Data, (Compressed Data,) (One
+Pass Signature ...,) Literal Data, (Signature ...,)
+
+*Since Camel 2.16*.*0* the Compressed Data packet is optional, before it
+was mandatory.
+
+ 
+
+[[Crypto-PGPDataFormatOptions]]
+PGPDataFormat Options
+^^^^^^^^^^^^^^^^^^^^^
+[width="70%",cols="10%,10%,10%,70%",options="header",]
+|=======================================================================
+|Name |Type |Default |Description
+
+|`keyUserid` |`String` |`null` |The user ID of the key in the PGP keyring used 
during encryption. See
+also option `keyUserids`. Can also be only a part of a user ID. For
+example, if the user ID is "Test User <t...@camel.com>" then you can use
+the part "Test User" or "<t...@camel.com>" to address the user ID.
+
+|`keyUserids` |`List<String>` |`null` |*Since camel 2.12.2*: PGP allows to 
encrypt the symmetric key by several
+asymmetric public receiver keys. You can specify here the User IDs or
+parts of User IDs of several public keys contained in the PGP keyring.
+If you just have one User ID, then you can also use the option
+`keyUserid`. The User ID specified in `keyUserid` and the User IDs in
+`keyUserids` will be merged together and the corresponding public keys
+will be used for the encryption.
+
+|`password` |`String` |`null` |Password used when opening the private key (not 
used for encryption).
+
+|`keyFileName` |`String` |`null` |Filename of the keyring; must be accessible 
as a classpath resource (but
+you can specify a location in the file system by using the "file:"
+prefix).
+
+|`encryptionKeyRing` |`byte[]` |`null` |*Since camel 2.12.1*: encryption 
keyring; you can not set the
+keyFileName and encryptionKeyRing at the same time.
+
+|`signatureKeyUserid` |`String` |`null` |*Since Camel 2.11.0*; optional User 
ID of the key in the PGP keyring
+used for signing (during encryption) or signature verification (during
+decryption). During the signature verification process the specified
+User ID restricts the public keys from the public keyring which can be
+used for the verification. If no User ID is specified for the signature
+verficiation then any public key in the public keyring can be used for
+the verification. Can also be only a part of a user ID. For example, if
+the user ID is "Test User <t...@camel.com>" then you can use the part
+"Test User" or "<t...@camel.com>" to address the User ID.
+
+|`signatureKeyUserids` |`List<String>` |`null` |*Since Camel 2.12.3*: optional 
list of User IDs of the key in the PGP
+keyring used for signing (during encryption) or signature verification
+(during decryption). You can specify here the User IDs or parts of User
+IDs of several keys contained in the PGP keyring. If you just have one
+User ID, then you can also use the option `keyUserid`. The User ID
+specified in `keyUserid` and the User IDs in `keyUserids` will be merged
+together and the corresponding keys will be used for the signing or
+signature verification. If the specified User IDs reference several keys
+then for each key a signature is added to the PGP result during the
+encryption-signing process. In the decryption-verifying process the list
+of User IDs restricts the list of public keys which can be used for
+signature verification. If the list of User IDs is empty then any public
+key in the public keyring can be used for the signature verification.
+
+|`signaturePassword` |`String` |`null` |*Since Camel 2.11.0*: optional 
password used when opening the private
+key used for signing (during encryption).
+
+|`signatureKeyFileName` |`String` |`null` |*Since Camel 2.11.0*: optional 
filename of the keyring to use for
+signing (during encryption) or for signature verification (during
+decryption); must be accessible as a classpath resource (but you can
+specify a location in the file system by using the "file:" prefix).
+
+|`signatureKeyRing` |`byte[]` |`null` |*Since camel 2.12.1*: signature 
keyring; you can not set the
+signatureKeyFileName and signatureKeyRing at the same time.
+
+|`algorithm` |`int` |`SymmetricKeyAlgorithmTags.CAST5` |*Since camel 2.12.2*: 
symmetric key encryption algorithm; possible
+values are defined in `org.bouncycastle.bcpg.SymmetricKeyAlgorithmTags`;
+for example 2 (= TRIPLE DES), 3 (= CAST5), 4 (= BLOWFISH), 6 (= DES), 7
+(= AES_128). Only relevant for encrypting.
+
+|`compressionAlgorithm` |`int` |`CompressionAlgorithmTags.ZIP` |*Since camel 
2.12.2*: compression algorithm; possible values are defined
+in `org.bouncycastle.bcpg.CompressionAlgorithmTags`; for example 0 (=
+UNCOMPRESSED), 1 (= ZIP), 2 (= ZLIB), 3 (= BZIP2). Only relevant for
+encrypting.
+
+|`hashAlgorithm` |`int` |`HashAlgorithmTags.SHA1` |*Since camel 2.12.2*: 
signature hash algorithm; possible values are
+defined in `org.bouncycastle.bcpg.HashAlgorithmTags`; for example 2 (=
+SHA1), 8 (= SHA256), 9 (= SHA384), 10 (= SHA512), 11 (=SHA224). Only
+relevant for signing.
+
+|`armored` |`boolean` |`false` |This option will cause PGP to base64 encode 
the encrypted text, making
+it available for copy/paste, etc.
+
+|`integrity` |`boolean` |`true` |Adds an integrity check/sign into the 
encryption file.
+
+|`passphraseAccessor` |`PGPPassphraseAccessor` |`null` |*Since Camel 2.12.2*: 
provides passphrases corresponding to user Ids. If
+no passpharase can be found from the option `password` or
+`signaturePassword` and from the headers `CamelPGPDataFormatKeyPassword`
+or `CamelPGPDataFormatSignatureKeyPassword` then the passphrase is
+fetched from the passphrase accessor. You provide a bean which
+implements the interface
+https://github.com/apache/camel/blob/master/components/camel-crypto/src/main/java/org/apache/camel/converter/crypto/PGPPassphraseAccessor.java[PGPPassphraseAccessor].
+A default implementation is given by
+https://github.com/apache/camel/blob/master/components/camel-crypto/src/main/java/org/apache/camel/converter/crypto/DefaultPGPPassphraseAccessor.java[DefaultPGPPassphraseAccessor].
+The passphrase accessor is especially useful in the decrypt case; see
+chapter 'PGP Decrypting/Verifying of Messages Encrypted/Signed by
+Different Private/Public Keys' below.
+
+|`signatureVerificationOption` |`String` |`"optional"` |*Since Camel 2.13.0*: 
controls the behavior for verifying the signature
+during unmarshaling. There are three values possible:
+
+* `"optional"`: The PGP message may or may not contain signatures; if it
+does contain signatures, then a signature verification is executed. Use
+the constant
+PGPKeyAccessDataFormat.SIGNATURE_VERIFICATION_OPTION_OPTIONAL.
+* `"required"`: The PGP message must contain at least one signature; if
+this is not the case an exception (PGPException) is thrown. A signature
+verification is executed. Use the constant
+PGPKeyAccessDataFormat.SIGNATURE_VERIFICATION_OPTION_REQUIRED.
+* `"ignore"`: Contained signatures in the PGP message are ignored; no
+signature verification is executed. Use the constant
+PGPKeyAccessDataFormat.SIGNATURE_VERIFICATION_OPTION_IGNORE.
+* `"no_signature_allowed"`: The PGP message must not contain a
+signature; otherwise an exception (PGPException) is thrown. Use the
+constant
+PGPKeyAccessDataFormat.SIGNATURE_VERIFICATION_OPTION_NO_SIGNATURE_ALLOWED.
+
+|`FileName` |`String` |`"_CONSOLE"` |*Since camel 2.15.0*: Sets the file name 
for the literal data packet.
+Can be overwritten by the  header \{@link Exchange#FILE_NAME}.
+
+"`_CONSOLE`" indicates that the message is considered to be "for your
+eyes only". This advises that the message data is unusually sensitive,
+and the receiving program should process it more carefully, perhaps
+avoiding storing the received data to disk, for example.Only used for
+marshaling.
+
+|`withCompressedDataPacket` |boolean |`true` |*Since Camel 2.16.0*: Indicator 
whether the PGP Message shall be created
+with or without a Compressed Data packet. If the value is set to false,
+then no Compressed Data packet is added and the compressionAlgorithm
+value is ignored. Only used for marshaling.
+|=======================================================================
+
+[[Crypto-PGPDataFormatMessageHeaders]]
+PGPDataFormat Message Headers
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+You can override the PGPDataFormat options by applying below headers
+into message dynamically.
+
+[width="70%",cols="10%,10%,80%",options="header",]
+|=======================================================================
+|Name |Type |Description
+
+|`CamelPGPDataFormatKeyFileName` |`String` |*Since Camel 2.11.0*; filename of 
the keyring; will override existing
+setting directly on the PGPDataFormat.
+
+|`CamelPGPDataFormatEncryptionKeyRing` |`byte[]` |*Since Camel 2.12.1*; the 
encryption keyring; will override existing
+setting directly on the PGPDataFormat.
+
+|`CamelPGPDataFormatKeyUserid` |`String` |*Since Camel 2.11.0*; the User ID of 
the key in the PGP keyring; will
+override existing setting directly on the PGPDataFormat.
+
+|`CamelPGPDataFormatKeyUserids` |`List<String>` |*Since camel 2.12.2*: the 
User IDs of the key in the PGP keyring; will
+override existing setting directly on the PGPDataFormat.
+
+|`CamelPGPDataFormatKeyPassword` |`String` |*Since Camel 2.11.0*; password 
used when opening the private key; will
+override existing setting directly on the PGPDataFormat.
+
+|`CamelPGPDataFormatSignatureKeyFileName` |`String` |*Since Camel 2.11.0*; 
filename of the signature keyring; will override
+existing setting directly on the PGPDataFormat.
+
+|`CamelPGPDataFormatSignatureKeyRing` |`byte[]` |*Since Camel 2.12.1*; the 
signature keyring; will override existing
+setting directly on the PGPDataFormat.
+
+|`CamelPGPDataFormatSignatureKeyUserid` |`String` |*Since Camel 2.11.0*; the 
User ID of the signature key in the PGP
+keyring; will override existing setting directly on the PGPDataFormat.
+
+|`CamelPGPDataFormatSignatureKeyUserids` |`List<String>` |*Since Camel 
2.12.3*; the User IDs of the signature keys in the PGP
+keyring; will override existing setting directly on the PGPDataFormat.
+
+|`CamelPGPDataFormatSignatureKeyPassword` |`String` |*Since Camel 2.11.0*; 
password used when opening the signature private
+key; will override existing setting directly on the PGPDataFormat.
+
+|`CamelPGPDataFormatEncryptionAlgorithm` |`int` |*Since Camel 2.12.2*; 
symmetric key encryption algorithm; will override
+existing setting directly on the PGPDataFormat.
+
+|`CamelPGPDataFormatSignatureHashAlgorithm` |`int` |*Since Camel 2.12.2*; 
signature hash algorithm; will override existing
+setting directly on the PGPDataFormat.
+
+|`CamelPGPDataFormatCompressionAlgorithm` |`int` |*Since Camel 2.12.2*; 
compression algorithm; will override existing
+setting directly on the PGPDataFormat.
+
+|`CamelPGPDataFormatNumberOfEncryptionKeys` |`Integer` |*Since* *Camel 
2.12.3; *number of public keys used for encrypting the
+symmectric key, set by PGPDataFormat during encryptiion process
+
+|`CamelPGPDataFormatNumberOfSigningKeys` |`Integer` |*Since* *Camel 2.12.3; 
*number of private keys used for creating
+signatures, set by PGPDataFormat during signing process
+|=======================================================================
+
+[[Crypto-EncryptingwithPGPDataFormat]]
+Encrypting with PGPDataFormat
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The following sample uses the popular PGP format for
+encrypting/decrypting files using the
+http://www.bouncycastle.org/java.html[Bouncy Castle Java libraries]:
+
+The following sample performs signing + encryption, and then signature
+verification + decryption. It uses the same keyring for both signing and
+encryption, but you can obviously use different keys:
+
+Or using Spring:
+
+[[Crypto-Toworkwiththepreviousexampleyouneedthefollowing]]
+To work with the previous example you need the following
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+* A public keyring file which contains the public keys used to encrypt
+the data
+* A private keyring file which contains the keys used to decrypt the
+data
+* The keyring password
+
+[[Crypto-Managingyourkeyring]]
+Managing your keyring
++++++++++++++++++++++
+
+To manage the keyring, I use the command line tools, I find this to be
+the simplest approach in managing the keys. There are also Java
+libraries available from
+http://www.bouncycastle.org/java.html[http://www.bouncycastle.org/java.html]
+if you would prefer to do it that way.
+
+1.  Install the command line utilities on linux
+
+[source,java]
+---------------------
+apt-get install gnupg
+---------------------
+2.  Create your keyring, entering a secure password
+
+[source,java]
+-------------
+gpg --gen-key
+-------------
+3.  If you need to import someone elses public key so that you can
+encrypt a file for them.
+
+[source,java]
+--------------------------
+gpg --import <filename.key
+--------------------------
+4.  The following files should now exist and can be used to run the
+example
+
+[source,java]
+-----------------------------------------------
+ls -l ~/.gnupg/pubring.gpg ~/.gnupg/secring.gpg
+-----------------------------------------------
+
+[[Crypto-PGPDecrypting/VerifyingofMessagesEncrypted/SignedbyDifferentPrivate/PublicKeys]]
+PGP Decrypting/Verifying of Messages Encrypted/Signed by Different
+Private/Public Keys
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Since *Camel 2.12.2*.
+
+A PGP Data Formater can decrypt/verify messages which have been
+encrypted by different public keys or signed by different private keys.
+Just, provide the corresponding private keys in the secret keyring, the
+corresponding public keys in the public keyring, and the passphrases in
+the passphrase accessor.
+
+[source,java]
+------------------------------------------------------------------------------------------------------------------------------------------
+Map<String, String> userId2Passphrase = new HashMap<String, String>(2);
+// add passphrases of several private keys whose corresponding public keys 
have been used to encrypt the messages
+userId2Passphrase.put("UserIdOfKey1","passphrase1"); // you must specify the 
exact User ID!
+userId2Passphrase.put("UserIdOfKey2","passphrase2");
+PGPPassphraseAccessor passphraseAccessor = new 
PGPPassphraseAccessorDefault(userId2Passphrase);
+
+PGPDataFormat pgpVerifyAndDecrypt = new PGPDataFormat();
+pgpVerifyAndDecrypt.setPassphraseAccessor(passphraseAccessor);
+// the method getSecKeyRing() provides the secret keyring as byte array 
containing the private keys
+pgpVerifyAndDecrypt.setEncryptionKeyRing(getSecKeyRing()); // alternatively 
you can use setKeyFileName(keyfileName)
+// the method getPublicKeyRing() provides the public keyring as byte array 
containing the public keys
+pgpVerifyAndDecrypt.setSignatureKeyRing((getPublicKeyRing());  // 
alternatively you can use setSignatureKeyFileName(signatgureKeyfileName)
+// it is not necessary to specify the encryption or signer  User Id
+ 
+from("direct:start")
+         ...     
+        .unmarshal(pgpVerifyAndDecrypt) // can decrypt/verify messages 
encrypted/signed by different private/public keys
+        ...            
+------------------------------------------------------------------------------------------------------------------------------------------
+
+* The functionality is especially useful to support the key exchange. If
+you want to exchange the private key for decrypting you can accept for a
+period of time messages which are either encrypted with the old or new
+corresponding public key. Or if the sender wants to exchange his signer
+private key, you can accept for a period of time, the old or new signer
+key.
+* Technical background: The PGP encrypted data contains a Key ID of the
+public key which was used to encrypt the data. This Key ID can be used
+to locate the private key in the secret keyring to decrypt the data. The
+same mechanism is also used to locate the public key for verifying a
+signature. Therefore you no longer must specify User IDs for the
+unmarshaling.
+
+[[Crypto-RestrictingtheSignerIdentitiesduringPGPSignatureVerification]]
+Restricting the Signer Identities during PGP Signature Verification
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Since *Camel 2.12.3.*
+
+If you verify a signature you not only want to verify the correctness of
+the signature but you also want check that the signature comes from a
+certain identity or a specific set of identities. Therefore it is
+possible to restrict the number of public keys from the public keyring
+which can be used for the verification of a signature.  
+
+*Signature User IDs*
+
+[source,java]
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+// specify the User IDs of the expected signer identities
+ List<String> expectedSigUserIds = new ArrayList<String>();
+ expectedSigUserIds.add("Trusted company1");
+ expectedSigUserIds.add("Trusted company2");
+ 
+ PGPDataFormat pgpVerifyWithSpecificKeysAndDecrypt = new PGPDataFormat();
+ pgpVerifyWithSpecificKeysAndDecrypt.setPassword("my password"); // for 
decrypting with private key
+ pgpVerifyWithSpecificKeysAndDecrypt.setKeyFileName(keyfileName);
+ 
pgpVerifyWithSpecificKeysAndDecrypt.setSignatureKeyFileName(signatgureKeyfileName);
+ 
pgpVerifyWithSpecificKeysAndDecrypt.setSignatureKeyUserids(expectedSigUserIds); 
// if you have only one signer identity then you can also use 
setSignatureKeyUserid("expected Signer")
+ 
+from("direct:start")
+         ...     
+        .unmarshal(pgpVerifyWithSpecificKeysAndDecrypt)
+        ...      
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+
+* If the PGP content has several signatures the verification is
+successful as soon as one signature can be verified.
+* If you do not want to restrict the signer identities for verification
+then do not specify the signature key User IDs. In this case all public
+keys in the public keyring are taken into account.
+
+[[Crypto-SeveralSignaturesinOnePGPDataFormat]]
+Several Signatures in One PGP Data Format
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Since *Camel 2.12.3.*
+
+The PGP specification allows that one PGP data format can contain
+several signatures from different keys. Since Camel 2.13.3 it is
+possible to create such kind of PGP content via specifying signature
+User IDs which relate to several private keys in the secret keyring.
+
+*Several Signatures*
+
+[source,java]
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ PGPDataFormat pgpSignAndEncryptSeveralSignerKeys = new PGPDataFormat();
+ pgpSignAndEncryptSeveralSignerKeys.setKeyUserid(keyUserid); // for 
encrypting, you can also use setKeyUserids if you want to encrypt with several 
keys
+ pgpSignAndEncryptSeveralSignerKeys.setKeyFileName(keyfileName);
+ 
pgpSignAndEncryptSeveralSignerKeys.setSignatureKeyFileName(signatgureKeyfileName);
+ pgpSignAndEncryptSeveralSignerKeys.setSignaturePassword("sdude"); // here we 
assume that all private keys have the same password, if this is not the case 
then you can use setPassphraseAccessor
+
+ List<String> signerUserIds = new ArrayList<String>();
+ signerUserIds.add("company old key");
+ signerUserIds.add("company new key");
+ pgpSignAndEncryptSeveralSignerKeys.setSignatureKeyUserids(signerUserIds);
+ 
+from("direct:start")
+         ...     
+        .marshal(pgpSignAndEncryptSeveralSignerKeys)
+        ...      
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+
+[[Crypto-SupportofSub-KeysandKeyFlagsinPGPDataFormatMarshaler]]
+Support of Sub-Keys and Key Flags in PGP Data Format Marshaler
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Since *Camel 2.12.3. +
+*An https://tools.ietf.org/html/rfc4880#section-12.1[OpenPGP V4 key] can
+have a primary key and sub-keys. The usage of the keys is indicated by
+the so called https://tools.ietf.org/html/rfc4880#section-5.2.3.21[Key
+Flags]. For example, you can have a primary key with two sub-keys; the
+primary key shall only be used for certifying other keys (Key Flag
+0x01), the first sub-key  shall only be used for signing (Key Flag
+0x02), and the second sub-key shall only be used for encryption (Key
+Flag 0x04 or 0x08). The PGP Data Format marshaler takes into account
+these Key Flags of the primary key and sub-keys in order to determine
+the right key for signing and encryption. This is necessary because the
+primary key and its sub-keys have the same User IDs.
+
+[[Crypto-SupportofCustomKeyAccessors]]
+Support of Custom Key Accessors
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Since *Camel 2.13.0. +
+*You can implement custom key accessors for encryption/signing. The
+above PGPDataFormat class selects in a certain predefined way the keys
+which should be used for signing/encryption or verifying/decryption. If
+you have special requirements how your keys should be selected you
+should use the
+https://github.com/apache/camel/blob/master/components/camel-crypto/src/main/java/org/apache/camel/converter/crypto/PGPKeyAccessDataFormat.java[PGPKeyAccessDataFormat]
+class instead and implement the interfaces
+https://github.com/apache/camel/blob/master/components/camel-crypto/src/main/java/org/apache/camel/converter/crypto/PGPPublicKeyAccessor.java[PGPPublicKeyAccessor]
+and
+https://github.com/apache/camel/blob/master/components/camel-crypto/src/main/java/org/apache/camel/converter/crypto/PGPSecretKeyAccessor.java[PGPSecretKeyAccessor]
+as beans. There are default implementations
+https://github.com/apache/camel/blob/master/components/camel-crypto/src/main/java/org/apache/camel/converter/crypto/DefaultPGPPublicKeyAccessor.java[DefaultPGPPublicKeyAccessor]
+and
+https://github.com/apache/camel/blob/master/components/camel-crypto/src/main/java/org/apache/camel/converter/crypto/DefaultPGPSecretKeyAccessor.java[DefaultPGPSecretKeyAccessor]
+which cache the keys, so that not every time the keyring is parsed when
+the processor is called.
+
+PGPKeyAccessDataFormat has the same options as PGPDataFormat except
+password, keyFileName, encryptionKeyRing, signaturePassword,
+signatureKeyFileName, and signatureKeyRing.
+
+[[Crypto-Dependencies]]
+Dependencies
+^^^^^^^^^^^^
+
+To use the link:crypto.html[Crypto] dataformat in your camel routes you
+need to add the following dependency to your pom.
+
+[source,xml]
+----------------------------------------------------------
+<dependency>
+  <groupId>org.apache.camel</groupId>
+  <artifactId>camel-crypto</artifactId>
+  <version>x.x.x</version>
+  <!-- use the same version as your Camel core version -->
+</dependency>
+----------------------------------------------------------
+
+[[Crypto-SeeAlso]]
+See Also
+^^^^^^^^
+
+* link:data-format.html[Data Format]
+* link:crypto-digital-signatures.html[Crypto (Digital Signatures)]
+* http://www.bouncycastle.org/java.html[http://www.bouncycastle.org/java.html]
+

http://git-wip-us.apache.org/repos/asf/camel/blob/792e4c6d/docs/user-manual/en/SUMMARY.md
----------------------------------------------------------------------
diff --git a/docs/user-manual/en/SUMMARY.md b/docs/user-manual/en/SUMMARY.md
index 61194cc..be9a509 100644
--- a/docs/user-manual/en/SUMMARY.md
+++ b/docs/user-manual/en/SUMMARY.md
@@ -108,6 +108,8 @@
        * [Cmis](cmis.adoc)
        * [Cometd](cometd.adoc)
        * [Couchdb](couchdb.adoc)
+       * [Crypto](crypto.adoc)
+               * [Crypto Digital Signatures](crypto-digital-signatures.adoc)
        * [JMS](jms.adoc)
        * [Metrics](metrics.adoc)
        * [Properties](properties.adoc)

Reply via email to