                Apache James Cryptographic Mailets
                ----------------------------------    
Release Notes
-------------

   Apache James Cryptographic Mailets encode, decode, sign and 
   verify mail, together with related cryptology utilities.
   They implement the Apache Mailet API (a framework
   assisting the rapid development of email processing functionality
   see http://james.apache.org/mailet). 
   
   Maven 2 (http://maven.apache.org) is used to build this project.
   
1.1 (In Preparation)
--------------------

   Is a JRE update release upgrading dependencies and code to Java 1.5

 * Upgrading to BouncyCastle 1.43 from 1.29 adds numerous features,
   resolves many defects and addresses some security advisories.
   See http://www.bouncycastle.org/releasenotes.html for more details.
   
 * The secondary Ant build has now been removed. Maven should be used
   to build. The Maven build now inherits and uses the Apache standard
   pom.    
   
1.0
---
   This is the first independent release of this code. Previously 
   it was shipped as part of the Apache James server (an advanced 
   mail server http://james.apache.org/server). This release is 
   not dependent on that server but can be used in any Mailet
   container. 

Cryptography Notice
-------------------
   This distribution includes cryptographic software.  The country in 
   which you currently reside may have restrictions on the import, 
   possession, use, and/or re-export to another country, of 
   encryption software.  BEFORE using any encryption software, please 
   check your country's laws, regulations and policies concerning the
   import, possession, or use, and re-export of encryption software, to 
   see if this is permitted.  See http://www.wassenaar.org for more
   information.

   The U.S. Government Department of Commerce, Bureau of Industry and
   Security (BIS), has classified this software as Export Commodity 
   Control Number (ECCN) 5D002.C.1, which includes information security
   software using or performing cryptographic functions with asymmetric
   algorithms.  The form and manner of this Apache Software Foundation
   distribution makes it eligible for export under the License Exception
   ENC Technology Software Unrestricted (TSU) exception (see the BIS 
   Export Administration Regulations, Section 740.13) for both object 
   code and source code.

   The following provides more details on the included cryptographic
   software:
    		
    		This library provides high level crytographic operations
    		based on lower level crytographic libraries created
    		by The Legion of the Bouncy Castle (http://www.bouncycastle.org/).

    Export classifications and source links can be found
    at http://www.apache.org/licenses/exports/.
  