Bouncy Castle on the Android platform.
---

The code in this directory is based on $BOUNCYCASTLE_VERSION in the
file bouncycastle.version. See the in-file change markers 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) Submit the code to the upstream-master branch:

  a) Create a new branch tracking upstream-master

      git checkout -b upgrade-to-xxx --track aosp/upstream-master

  b) Update the variables in bouncycastle.version.

  c) Expand the source from the .tar.gz files

  d) Replace bc{prov,pkix}/src/main/java/org with the equivalent source
     directory

  e) Ensure any new files are added

      git add bc{prov,pkix}

  f) Commit the change

      git commit -a -m 'bouncycastle: Android tree with upstream code for version X.XX'

  g) Get the change reviewed

      repo upload . -D upstream-master

3) Merge the code into the master branch

  a) Create a new branch

      repo start merge-xxx

  b) Merge the changes in

      git fetch aosp upstream-master
      git merge aosp/upstream-master

  c) Resolve any conflicts.  Some common cases:

     * If upstream changed a file that's deleted locally, we probably don't
       need it
     * If upstream added a file to a directory we deleted, we probably don't
       need it

  d) Confirm all changes

      git diff aosp/master

  e) Run the tests, commonly at least

      cts -m CtsLibcoreTestCases
      cts -m CtsLibcoreFileIOTestCases
      cts -m CtsLibcoreJsr166TestCases
      cts -m CtsLibcoreOjTestCases
      cts -m CtsLibcoreOkHttpTestCases
      cts -m CtsLibcoreWycheproofBCTestCases

  e) Get the change reviewed

      repo upload .
