Bouncy Castle on the Android platform.
---

The code in this directory is based on $BOUNCYCASTLE_VERSION in the
file bouncycastle.version. See patches/README for more information on
how the code differs from $BOUNCYCASTLE_VERSION.

Porting New Versions of Bouncy Castle.
--

The following steps are recommended for porting new Bouncy Castle versions.

1) Retrieve the appropriate version of the Bouncy Castle source from
   www.bouncycastle.org/latest_releases.html (both bcprov-jdk*-*.tar.gz
   and bcpkix-jdk*-*.tar.gz files).

   Check the checksum (found at http://bouncycastle.org/checksums.html) with:

     md5sum bcprov-jdk*-*.tar.gz
     sha1sum bcprov-jdk*-*.tar.gz
     md5sum bcpkix-jdk*-*.tar.gz
     sha1sum bcpkix-jdk*-*.tar.gz

2) Update the variables in bouncycastle.config and bouncycastle.version as appropriate.
   At the very least you will need to update the bouncycastle.version.

3) Run:

     ./import_bouncycastle.sh import bcprov-jdk*-*.tar.gz

   Note the script expects to find the bcpkix-jdk*-*.tar.gz alongside the bcprov file.

4) If there are any errors, then modify bouncycastle.config, bouncycastle.version
   and patches in patches/ as appropriate.  You might want to use:

     ./import_bouncycastle.sh regenerate patches/*.patch

   Repeat step 3.

5) Cleanup before building with:

     m -j16 clean-bouncycastle

6) Build the bouncycastle target from the external/bouncycastle directory with:

     mm -j16 snod && adb sync system

   If there are build errors, then patches/*.mk or bouncycastle.config
   may need updating.

7) Run tests to make sure things are working:

     Some suggested tests by area:
     - java.security.AlgorithmParameterGenerator
       libcore/luni/src/test/java/libcore/java/security/OldAlgorithmParameterGeneratorTest.java
       libcore/luni/src/test/java/libcore/javax/crypto/spec/AlgorithmParameterGeneratorTestDH.java
       libcore/luni/src/test/java/libcore/javax/crypto/spec/AlgorithmParameterGeneratorTestDSA.java
     - java.security.AlgorithmParameters
       libcore/luni/src/test/java/libcore/javax/crypto/spec/AlgorithmParametersTestDSA.java
       libcore/luni/src/test/java/libcore/javax/crypto/spec/AlgorithmParametersTestAES.java
       libcore/luni/src/test/java/libcore/javax/crypto/spec/AlgorithmParametersTestDH.java
       libcore/luni/src/test/java/libcore/javax/crypto/spec/AlgorithmParametersTestDESede.java
       libcore/luni/src/test/java/libcore/javax/crypto/spec/AlgorithmParametersTestDES.java
       libcore/luni/src/test/java/libcore/javax/crypto/spec/AlgorithmParametersTestOAEP.java
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/AlgorithmParameterGenerator1Test.java
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/AlgorithmParameterGenerator2Test.java
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/AlgorithmParametersSpiTest.java
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/AlgorithmParametersTest.java
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/AlgorithmParametersTest.java
     - java.security.cert.CertPathBuilder
       libcore/luni/src/test/java/tests/targets/security/cert/CertPathBuilderTestPKIX.java
     - java.security.cert.CertPathValidator
       libcore/luni/src/test/java/tests/targets/security/cert/CertPathValidatorTestPKIX.java
     - java.security.cert.CertStore
       libcore/luni/src/test/java/tests/security/cert/CertStoreSpiTest.java
       libcore/luni/src/test/java/tests/security/cert/CertStore2Test.java
       libcore/luni/src/test/java/tests/security/cert/CertStore1Test.java
       libcore/luni/src/test/java/tests/security/cert/CertStoreExceptionTest.java
     - java.security.cert.Certificate
       libcore/luni/src/test/java/libcore/java/security/cert/X509CertificateTest.java
       libcore/luni/src/test/java/tests/api/javax/security/cert/X509CertificateTest.java
       libcore/luni/src/test/java/tests/security/cert/CertificateCertificateRepTest.java
       libcore/luni/src/test/java/tests/security/cert/CertificateTest.java
       libcore/luni/src/test/java/tests/security/cert/X509Certificate2Test.java
       libcore/luni/src/test/java/tests/targets/security/cert/CertificateTest.java
     - java.security.cert.CertificateFactory
       libcore/luni/src/test/java/libcore/java/security/cert/CertificateFactoryTest.java
       libcore/luni/src/test/java/tests/security/cert/CertificateFactory1Test.java
       libcore/luni/src/test/java/tests/security/cert/CertificateFactory2Test.java
       libcore/luni/src/test/java/tests/security/cert/CertificateFactory3Test.java
       libcore/luni/src/test/java/tests/security/cert/CertificateFactory4Test.java
       libcore/luni/src/test/java/tests/targets/security/cert/CertificateFactoryTestX509.java
     - java.security.cert.CertificateFactorySpi
       libcore/luni/src/test/java/tests/security/cert/CertificateFactorySpiTest.java
     - java.security.cert.CRL
       libcore/luni/src/test/java/libcore/java/security/cert/X509CRLSelectorTest.java
       libcore/luni/src/test/java/libcore/java/security/cert/X509CRLTest.java
       libcore/luni/src/test/java/tests/security/cert/CRLTest.java
       libcore/luni/src/test/java/tests/security/cert/X509CRL2Test.java
       libcore/luni/src/test/java/tests/security/cert/X509CRLEntryTest.java
       libcore/luni/src/test/java/tests/security/cert/X509CRLSelector2Test.java
       libcore/luni/src/test/java/tests/security/cert/X509CRLSelectorTest.java
       libcore/luni/src/test/java/tests/security/cert/X509CRLTest.java
     - javax.security.cert.Certificate
       libcore/luni/src/test/java/tests/api/javax/security/cert/CertificateTest.java
     - java.security.CodeSigner
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/CodeSignerTest.java
     - javax.crypto.Cipher
       libcore/luni/src/test/java/libcore/javax/crypto/CipherTest.java
       libcore/luni/src/test/java/org/apache/harmony/crypto/tests/javax/crypto/CipherTest.java
       libcore/luni/src/test/java/org/apache/harmony/crypto/tests/javax/crypto/NullCipherTest.java
     - java.security.DigestInputStream
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/DigestInputStream2Test.java
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/DigestInputStreamTest.java
     - java.security.DigestOutputStream
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/DigestOutputStreamTest.java
     - javax.crypto.spec.GCMParameterSpec
       libcore/luni/src/test/java/org/apache/harmony/crypto/tests/javax/crypto/spec/GCMParameterSpecTest.java
     - java.security.GuardedObject
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/GuardedObjectTest.java
     - java.security.Identity
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/Identity2Test.java
     - java.security.IdentityScope
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/IdentityScope2Test.java
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/IdentityScopeTest.java
     - javax.crypto.Key
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/KeyTest.java
     - javax.crypto.KeyAgreement
       libcore/luni/src/test/java/org/apache/harmony/crypto/tests/javax/crypto/KeyAgreementTest.java
     - java.security.KeyFactory
       libcore/luni/src/test/java/libcore/javax/crypto/spec/KeyFactoryTestDH.java
       libcore/luni/src/test/java/libcore/javax/crypto/spec/KeyFactoryTestDSA.java
       libcore/luni/src/test/java/libcore/javax/crypto/spec/KeyFactoryTestRSA.java
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/KeyFactory2Test.java
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/KeyFactoryTest.java
     - java.security.KeyFactorySpi
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/KeyFactorySpiTest.java
     - javax.crypto.KeyGenerator
       libcore/luni/src/test/java/libcore/javax/crypto/KeyGeneratorTest.java
       libcore/luni/src/test/java/org/apache/harmony/crypto/tests/javax/crypto/KeyGeneratorTest.java
     - javax.net.ssl.KeyManagerFactory
       libcore/luni/src/test/java/libcore/javax/net/ssl/KeyManagerFactoryTest.java
     - java.security.KeyPair
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/KeyPairTest.java
     - java.security.KeyPairGenerator
       libcore/luni/src/test/java/libcore/java/security/KeyPairGeneratorTest.java
       libcore/luni/src/test/java/libcore/java/security/OldKeyPairGeneratorTestDH.java
       libcore/luni/src/test/java/libcore/javax/crypto/spec/KeyPairGeneratorTestDH.java
       libcore/luni/src/test/java/libcore/javax/crypto/spec/KeyPairGeneratorTestDSA.java
       libcore/luni/src/test/java/libcore/javax/crypto/spec/KeyPairGeneratorTestRSA.java
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/KeyPairGenerator1Test.java
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/KeyPairGenerator2Test.java
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/KeyPairGenerator3Test.java
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/KeyPairGenerator4Test.java
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/KeyPairGeneratorSpiTest.java
       libcore/luni/src/test/java/tests/security/interfaces/DSAKeyPairGeneratorTest.java
     - java.security.KeyRep
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/KeyRepTest.java
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/KeyRepTypeTest.java
     - java.security.KeyStore
       libcore/luni/src/test/java/libcore/java/security/KeyStoreTest.java
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/KSCallbackHandlerProtectionTest.java
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/KSPasswordProtectionTest.java
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/KSPrivateKeyEntryTest.java
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/KSSecretKeyEntryTest.java
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/KSTrustedCertificateEntryTest.java
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/KeyStore2Test.java
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/KeyStore3Test.java
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/KeyStore4Test.java
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/KeyStoreBuilderTest.java
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/KeyStorePrivateKeyEntryTest.java
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/KeyStoreTest.java
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/KeyStoreTest.java
     - java.security.KeyStoreSpi
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/KeyStoreSpiTest.java
     - javax.crypto.Mac
       libcore/luni/src/test/java/org/apache/harmony/crypto/tests/javax/crypto/MacTest.java
     - java.security.MessageDigest
       libcore/luni/src/test/java/libcore/java/security/MessageDigestTest.java
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/MessageDigest1Test.java
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/MessageDigest2Test.java
       libcore/luni/src/test/java/tests/targets/security/MessageDigestTestMD2.java
       libcore/luni/src/test/java/tests/targets/security/MessageDigestTestMD5.java
       libcore/luni/src/test/java/tests/targets/security/MessageDigestTestSHA1.java
       libcore/luni/src/test/java/tests/targets/security/MessageDigestTestSHA256.java
       libcore/luni/src/test/java/tests/targets/security/MessageDigestTestSHA384.java
       libcore/luni/src/test/java/tests/targets/security/MessageDigestTestSHA512.java
     - java.security.MessageDigestSpi
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/MessageDigestSpiTest.java
     - java.security.PrivateKey
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/PrivateKeyTest.java
     - java.security.PrivilegedAction
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/PrivilegedActionTest.java
     - java.security.Provider
       libcore/luni/src/test/java/libcore/java/security/ProviderTest.java
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/Provider2Test.java
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/ProviderServiceTest.java
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/ProviderTest.java
     - java.security.PublicKey
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/PublicKeyTest.java
     - java.security.Security
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/Security2Test.java
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/SecurityTest.java
     - javax.net.ssl.SSLContext
       libcore/luni/src/test/java/libcore/javax/net/ssl/SSLContextTest.java
     - javax.crypto.SecretKeyFactory
       libcore/luni/src/test/java/libcore/javax/crypto/SecretKeyFactoryTest.java
       libcore/luni/src/test/java/org/apache/harmony/crypto/tests/javax/crypto/SecretKeyFactoryTest.java
     - java.security.SecureRandom
       libcore/luni/src/test/java/libcore/java/security/SecureRandomTest.java
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/SecureRandom2Test.java
       libcore/luni/src/test/java/tests/java/security/SecureRandomTest.java
       libcore/luni/src/test/java/tests/targets/security/SecureRandomTestSHA1PRNG.java
     - java.security.SecureRandomSpi
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/SecureRandomSpiTest.java
     - java.security.Signature
       libcore/crypto/src/test/java/org/conscrypt/OpenSSLSignatureTest.java
       libcore/luni/src/test/java/libcore/java/security/SignatureTest.java
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/Signature2Test.java
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/SignatureTest.java
       libcore/luni/src/test/java/tests/targets/security/SignatureTestMD2withRSA.java
     - java.security.SignatureSpi
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/SignatureSpiTest.java
     - java.security.SignedObject
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/SignedObjectTest.java
     - java.security.Signer
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/SignerTest.java
     - java.security.Timestamp
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/TimestampTest.java
     - java.security.cert.TrustAnchor
       libcore/luni/src/test/java/tests/security/cert/TrustAnchorTest.java
     - javax.net.ssl.TrustManagerFactory
       libcore/luni/src/test/java/libcore/javax/net/ssl/TrustManagerFactoryTest.java
     - java.net.URLConnection
       libcore/luni/src/test/java/libcore/java/net/URLConnectionTest.java
       libcore/luni/src/test/java/org/apache/harmony/luni/tests/java/net/URLConnectionTest.java
     - javax.security.auth.x500.X500Principal
       libcore/luni/src/test/java/libcore/javax/net/ssl/DistinguishedNameParserTest.java
       libcore/luni/src/test/java/libcore/javax/security/auth/x500/X500PrincipalTest.java
       libcore/luni/src/test/java/tests/api/javax/security/auth/X500PrincipalTest.java
     - javax.net.ssl.SSLSocket and javax.net.ssl.SSLEngine (which touch on Cipher, MessageDigest, Signature)
       libcore/luni/src/test/java/libcore/javax/net/ssl/
     - Test Android additions to bouncycastle such as org.bouncycastle.crypto.digests.OpenSSLDigest and org.bouncycastle.jce.provider.CertBlacklist
       libcore/luni/src/test/java/com/android/org/bouncycastle/
     - Exception "tests"
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/DigestExceptionTest.java
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/GeneralSecurityExceptionTest.java
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/InvalidAlgorithmParameterExceptionTest.java
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/InvalidKeyExceptionTest.java
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/InvalidParameterExceptionTest.java
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/KeyExceptionTest.java
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/KeyManagementExceptionTest.java
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/KeyStoreExceptionTest.java
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/NoSuchAlgorithmExceptionTest.java
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/NoSuchProviderExceptionTest.java
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/ProviderExceptionTest.java
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/SignatureExceptionTest.java
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/UnrecoverableEntryExceptionTest.java
       libcore/luni/src/test/java/org/apache/harmony/security/tests/java/security/UnrecoverableKeyExceptionTest.java
       libcore/luni/src/test/java/tests/api/javax/security/cert/CertificateEncodingExceptionTest.java
       libcore/luni/src/test/java/tests/api/javax/security/cert/CertificateExceptionTest.java
       libcore/luni/src/test/java/tests/api/javax/security/cert/CertificateExpiredExceptionTest.java
       libcore/luni/src/test/java/tests/api/javax/security/cert/CertificateNotYetValidExceptionTest.java
       libcore/luni/src/test/java/tests/api/javax/security/cert/CertificateParsingExceptionTest.java
       libcore/luni/src/test/java/tests/security/cert/CRLExceptionTest.java
       libcore/luni/src/test/java/tests/security/cert/CertificateEncodingException2Test.java
       libcore/luni/src/test/java/tests/security/cert/CertificateEncodingExceptionTest.java
       libcore/luni/src/test/java/tests/security/cert/CertificateException2Test.java
       libcore/luni/src/test/java/tests/security/cert/CertificateExceptionTest.java
       libcore/luni/src/test/java/tests/security/cert/CertificateExpiredExceptionTest.java
       libcore/luni/src/test/java/tests/security/cert/CertificateNotYetValidExceptionTest.java
       libcore/luni/src/test/java/tests/security/cert/CertificateParsingExceptionTest.java


8) Do a full build before checking in:

     m -j16