diff -Naur bcprov-jdk16-145.orig/org/bouncycastle/asn1/ASN1Collection.java bcprov-jdk16-145/org/bouncycastle/asn1/ASN1Collection.java
--- bcprov-jdk16-145.orig/org/bouncycastle/asn1/ASN1Collection.java	1970-01-01 00:00:00.000000000 +0000
+++ bcprov-jdk16-145/org/bouncycastle/asn1/ASN1Collection.java	2011-09-01 17:21:06.000000000 +0000
@@ -0,0 +1,298 @@
+package org.bouncycastle.asn1;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.Enumeration;
+import java.util.ConcurrentModificationException;
+
+// BEGIN android-note
+/*
+ * This is a new class that was synthesized from ASN1Sequence and
+ * ASN1Set, but with extra smarts about efficiently storing its
+ * elements.
+ */
+// END android-note
+
+/**
+ * Base class for collection-like <code>DERObject</code>s. Instances
+ * of this class will keep up to four elements directly, resorting to
+ * an external collection only if more elements than that need to be
+ * stored.
+ */
+public abstract class ASN1Collection
+    extends ASN1Object
+{
+    /** &gt;= 0; size of the collection */
+    private int size;
+
+    /** null-ok; element #0 */
+    private DEREncodable obj0;
+
+    /** null-ok; element #1 */
+    private DEREncodable obj1;
+
+    /** null-ok; element #2 */
+    private DEREncodable obj2;
+
+    /** null-ok; element #3 */
+    private DEREncodable obj3;
+
+    /** null-ok; elements #4 and higher */
+    private DEREncodable[] rest;
+
+    /**
+     * Returns the object at the postion indicated by index.
+     *
+     * @param index the index (starting at zero) of the object
+     * @return the object at the postion indicated by index
+     */
+    public DEREncodable getObjectAt(int index) {
+        if ((index < 0) || (index >= size)) {
+            throw new IndexOutOfBoundsException(Integer.toString(index));
+        }
+                    
+        switch (index) {
+            case 0: return obj0;
+            case 1: return obj1;
+            case 2: return obj2;
+            case 3: return obj3;
+            default: return rest[index - 4];
+        }
+    }
+
+    /**
+     * Returns the number of objects in this instance.
+     *
+     * @return the number of objects in this instance
+     */
+    public int size() {
+        return size;
+    }
+
+    /** {@inheritDoc} */
+    public final int hashCode() {
+        Enumeration e = this.getObjects();
+        int hashCode = 0;
+
+        while (e.hasMoreElements()) {
+            Object o = e.nextElement();
+            
+            if (o != null) {
+                hashCode ^= o.hashCode();
+            }
+        }
+
+        return hashCode;
+    }
+
+    /**
+     * Adds a new element to this instance.
+     * 
+     * @param obj non-null; the instance to add
+     */
+    protected void addObject(DEREncodable obj) {
+        if (obj == null) {
+            throw new NullPointerException("obj == null");
+        }
+
+        int sz = size;
+        
+        switch (sz) {
+            case 0: obj0 = obj; break;
+            case 1: obj1 = obj; break;
+            case 2: obj2 = obj; break;
+            case 3: obj3 = obj; break;
+            case 4: {
+                // Initial allocation of rest.
+                rest = new DEREncodable[5];
+                rest[0] = obj;
+                break;
+            }
+            default: {
+                int index = sz - 4;
+                if (index >= rest.length) {
+                    // Grow rest.
+                    DEREncodable[] newRest = new DEREncodable[index * 2 + 10];
+                    System.arraycopy(rest, 0, newRest, 0, rest.length);
+                    rest = newRest;
+                }
+                rest[index] = obj;
+                break;
+            }
+        }
+
+        size++;
+    }
+
+    /**
+     * Sets the element at a given index (used by {@link #sort}).
+     * 
+     * @param obj non-null; the object to set
+     * @param index &gt;= 0; the index
+     */
+    private void setObjectAt(DEREncodable obj, int index) {
+        switch (index) {
+            case 0: obj0 = obj; break;
+            case 1: obj1 = obj; break;
+            case 2: obj2 = obj; break;
+            case 3: obj3 = obj; break;
+            default: {
+                rest[index - 4] = obj;
+                break;
+            }
+        }
+    }
+
+    /**
+     * Encodes this instance to the given stream.
+     * 
+     * @param out non-null; stream to encode to
+     */
+    /*package*/ abstract void encode(DEROutputStream out) throws IOException;
+
+    /**
+     * Gets an enumeration of all the objects in this collection.
+     * 
+     * @return non-null; the enumeration
+     */
+    public Enumeration getObjects() {
+        return new ASN1CollectionEnumeration();
+    }
+
+    /**
+     * Associated enumeration class.
+     */
+    private class ASN1CollectionEnumeration implements Enumeration {
+        /** original size; used for modification detection */
+        private final int origSize = size;
+
+        /** &gt;= 0; current cursor */
+        private int at = 0;
+
+        /** {@inheritDoc} */
+        public boolean hasMoreElements() {
+            if (size != origSize) {
+                throw new ConcurrentModificationException();
+            }
+
+            return at < origSize;
+        }
+
+        /** {@inheritDoc} */
+        public Object nextElement() {
+            if (size != origSize) {
+                throw new ConcurrentModificationException();
+            }
+
+            switch (at++) {
+                case 0: return obj0;
+                case 1: return obj1;
+                case 2: return obj2;
+                case 3: return obj3;
+                default: return rest[at - 5];
+            }
+        }
+    }
+
+    /**
+     * Sorts the elements in this instance.
+     */
+    protected void sort() {
+        if (size <= 1) {
+            return;
+        }
+
+        boolean swapped = true;
+
+        // TODO: This is bubble sort. Probably not the best choice.
+        while (swapped) {
+            int index = 0;
+            byte[] a = getEncoded(getObjectAt(0));
+                
+            swapped = false;
+                
+            while (index != size - 1) {
+                int nextIndex = index + 1;
+                byte[] b = getEncoded(getObjectAt(nextIndex));
+
+                if (lessThanOrEqual(a, b)) {
+                    a = b;
+                } else {
+                    DEREncodable o = getObjectAt(index);
+                    
+                    setObjectAt(getObjectAt(nextIndex), index);
+                    setObjectAt(o, nextIndex);
+
+                    swapped = true;
+                }
+
+                index++;
+            }
+        }
+    }
+    
+    /**
+     * Returns true if a <= b (arrays are assumed padded with zeros).
+     */
+    private static boolean lessThanOrEqual(byte[] a, byte[] b) {
+        if (a.length <= b.length) {
+            for (int i = 0; i != a.length; i++) {
+                int l = a[i] & 0xff;
+                int r = b[i] & 0xff;
+                 
+                if (r > l) {
+                    return true;
+                } else if (l > r) {
+                    return false;
+                }
+            }
+
+            return true;
+        } else {
+            for (int i = 0; i != b.length; i++) {
+                 int l = a[i] & 0xff;
+                 int r = b[i] & 0xff;
+                 
+                 if (r > l) {
+                     return true;
+                 } else if (l > r) {
+                     return false;
+                 }
+             }
+
+             return false;
+         }
+    }
+
+    /**
+     * Gets the encoded form of an object.
+     * 
+     * @param obj non-null; object to encode
+     * @return non-null; the encoded form
+     */
+    private static byte[] getEncoded(DEREncodable obj) {
+        ByteArrayOutputStream bOut = new ByteArrayOutputStream();
+        ASN1OutputStream aOut = new ASN1OutputStream(bOut);
+
+        try {
+            aOut.writeObject(obj);
+        } catch (IOException e) {
+            throw new IllegalArgumentException(
+                    "cannot encode object added to collection");
+        }
+
+        return bOut.toByteArray();
+    }
+
+    /** {@inheritDoc} */
+    public final String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append('[');
+        for (int i = 0; i < size; i++) {
+            if (i != 0) sb.append(", ");
+            sb.append(getObjectAt(i));
+        }
+        sb.append(']');
+        return sb.toString();
+    }
+}
diff -Naur bcprov-jdk16-145.orig/org/bouncycastle/asn1/ASN1InputStream.java bcprov-jdk16-145/org/bouncycastle/asn1/ASN1InputStream.java
--- bcprov-jdk16-145.orig/org/bouncycastle/asn1/ASN1InputStream.java	2010-01-11 21:46:14.000000000 +0000
+++ bcprov-jdk16-145/org/bouncycastle/asn1/ASN1InputStream.java	2011-09-01 17:21:06.000000000 +0000
@@ -348,7 +348,9 @@
             case BMP_STRING:
                 return new DERBMPString(bytes);
             case BOOLEAN:
-                return new DERBoolean(bytes);
+                // BEGIN android-changed
+                return DERBoolean.getInstance(bytes);
+                // END android-changed
             case ENUMERATED:
                 return new DEREnumerated(bytes);
             case GENERALIZED_TIME:
diff -Naur bcprov-jdk16-145.orig/org/bouncycastle/asn1/ASN1Null.java bcprov-jdk16-145/org/bouncycastle/asn1/ASN1Null.java
--- bcprov-jdk16-145.orig/org/bouncycastle/asn1/ASN1Null.java	2010-01-11 21:46:14.000000000 +0000
+++ bcprov-jdk16-145/org/bouncycastle/asn1/ASN1Null.java	2011-09-01 17:21:06.000000000 +0000
@@ -8,9 +8,11 @@
 public abstract class ASN1Null
     extends ASN1Object
 {
-    public ASN1Null()
+    // BEGIN android-changed
+    /*package*/ ASN1Null()
     {
     }
+    // END android-changed
 
     public int hashCode()
     {
diff -Naur bcprov-jdk16-145.orig/org/bouncycastle/asn1/ASN1Sequence.java bcprov-jdk16-145/org/bouncycastle/asn1/ASN1Sequence.java
--- bcprov-jdk16-145.orig/org/bouncycastle/asn1/ASN1Sequence.java	2010-01-11 21:46:14.000000000 +0000
+++ bcprov-jdk16-145/org/bouncycastle/asn1/ASN1Sequence.java	2011-09-01 17:21:06.000000000 +0000
@@ -2,12 +2,20 @@
 
 import java.io.IOException;
 import java.util.Enumeration;
-import java.util.Vector;
+// BEGIN android-removed
+// import java.util.Vector;
+// END android-removed
+
+// BEGIN android-note
+// Changed inheritence of class.
+// END android-note
 
 public abstract class ASN1Sequence
-    extends ASN1Object
+    extends ASN1Collection
 {
-    private Vector seq = new Vector();
+    // BEGIN android-removed
+    // private Vector seq = new Vector();
+    // END android-removed
 
     /**
      * return an ASN1Sequence from the given object.
@@ -85,10 +93,12 @@
         throw new IllegalArgumentException("unknown object in getInstance: " + obj.getClass().getName());
     }
 
-    public Enumeration getObjects()
-    {
-        return seq.elements();
-    }
+    // BEGIN android-removed
+    // public Enumeration getObjects()
+    // {
+    //     return seq.elements();
+    // }
+    // END android-removed
 
     public ASN1SequenceParser parser()
     {
@@ -127,45 +137,47 @@
         };
     }
 
-    /**
-     * return the object at the sequence position indicated by index.
-     *
-     * @param index the sequence number (starting at zero) of the object
-     * @return the object at the sequence position indicated by index.
-     */
-    public DEREncodable getObjectAt(
-        int index)
-    {
-        return (DEREncodable)seq.elementAt(index);
-    }
-
-    /**
-     * return the number of objects in this sequence.
-     *
-     * @return the number of objects in this sequence.
-     */
-    public int size()
-    {
-        return seq.size();
-    }
-
-    public int hashCode()
-    {
-        Enumeration             e = this.getObjects();
-        int                     hashCode = size();
-
-        while (e.hasMoreElements())
-        {
-            Object o = e.nextElement();
-            hashCode *= 17;
-            if (o != null)
-            {
-                hashCode ^= o.hashCode();
-            }
-        }
-
-        return hashCode;
-    }
+    // BEGIN android-removed
+    // /**
+    //  * return the object at the sequence position indicated by index.
+    //  *
+    //  * @param index the sequence number (starting at zero) of the object
+    //  * @return the object at the sequence position indicated by index.
+    //  */
+    // public DEREncodable getObjectAt(
+    //     int index)
+    // {
+    //     return (DEREncodable)seq.elementAt(index);
+    // }
+    //
+    // /**
+    //  * return the number of objects in this sequence.
+    //  *
+    //  * @return the number of objects in this sequence.
+    //  */
+    // public int size()
+    // {
+    //     return seq.size();
+    // }
+    //
+    // public int hashCode()
+    // {
+    //     Enumeration             e = this.getObjects();
+    //     int                     hashCode = size();
+    //
+    //     while (e.hasMoreElements())
+    //     {
+    //         Object o = e.nextElement();
+    //         hashCode *= 17;
+    //         if (o != null)
+    //         {
+    //             hashCode ^= o.hashCode();
+    //         }
+    //     }
+    //
+    //     return hashCode;
+    // }
+    // END android-removed
 
     boolean asn1Equals(
         DERObject  o)
@@ -201,17 +213,19 @@
         return true;
     }
 
-    protected void addObject(
-        DEREncodable obj)
-    {
-        seq.addElement(obj);
-    }
-
-    abstract void encode(DEROutputStream out)
-        throws IOException;
-
-    public String toString() 
-    {
-      return seq.toString();
-    }
+    // BEGIN android-removed
+    //protected void addObject(
+    //    DEREncodable obj)
+    //{
+    //    seq.addElement(obj);
+    //}
+
+    //abstract void encode(DEROutputStream out)
+    //    throws IOException;
+
+    //public String toString() 
+    //{
+    //  return seq.toString();
+    //}
+    // END android-removed
 }
diff -Naur bcprov-jdk16-145.orig/org/bouncycastle/asn1/ASN1Set.java bcprov-jdk16-145/org/bouncycastle/asn1/ASN1Set.java
--- bcprov-jdk16-145.orig/org/bouncycastle/asn1/ASN1Set.java	2010-01-11 21:46:14.000000000 +0000
+++ bcprov-jdk16-145/org/bouncycastle/asn1/ASN1Set.java	2011-09-01 17:21:06.000000000 +0000
@@ -3,12 +3,20 @@
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.util.Enumeration;
-import java.util.Vector;
+// BEGIN android-removed
+// import java.util.Vector;
+// END android-removed
+
+// BEGIN android-note
+// Changed inheritence of class.
+// END android-note
 
 abstract public class ASN1Set
-    extends ASN1Object
+    extends ASN1Collection
 {
-    protected Vector set = new Vector();
+    // BEGIN android-removed
+    // protected Vector set = new Vector();
+    // END android-removed
 
     /**
      * return an ASN1Set from the given object.
@@ -104,32 +112,34 @@
     {
     }
 
-    public Enumeration getObjects()
-    {
-        return set.elements();
-    }
-
-    /**
-     * return the object at the set position indicated by index.
-     *
-     * @param index the set number (starting at zero) of the object
-     * @return the object at the set position indicated by index.
-     */
-    public DEREncodable getObjectAt(
-        int index)
-    {
-        return (DEREncodable)set.elementAt(index);
-    }
-
-    /**
-     * return the number of objects in this set.
-     *
-     * @return the number of objects in this set.
-     */
-    public int size()
-    {
-        return set.size();
-    }
+    // BEGIN android-removed
+    // public Enumeration getObjects()
+    // {
+    //     return set.elements();
+    // }
+    //
+    // /**
+    //  * return the object at the set position indicated by index.
+    //  *
+    //  * @param index the set number (starting at zero) of the object
+    //  * @return the object at the set position indicated by index.
+    //  */
+    // public DEREncodable getObjectAt(
+    //     int index)
+    // {
+    //     return (DEREncodable)set.elementAt(index);
+    // }
+    //
+    // /**
+    //  * return the number of objects in this set.
+    //  *
+    //  * @return the number of objects in this set.
+    //  */
+    // public int size()
+    // {
+    //     return set.size();
+    // }
+    // END android-removed
 
     public ASN1SetParser parser()
     {
@@ -168,23 +178,25 @@
         };
     }
 
-    public int hashCode()
-    {
-        Enumeration             e = this.getObjects();
-        int                     hashCode = size();
-
-        while (e.hasMoreElements())
-        {
-            Object o = e.nextElement();
-            hashCode *= 17;
-            if (o != null)
-            {
-                hashCode ^= o.hashCode();
-            }
-        }
-
-        return hashCode;
-    }
+    // BEGIN android-removed
+    // public int hashCode()
+    // {
+    //     Enumeration             e = this.getObjects();
+    //     int                     hashCode = size();
+    //
+    //     while (e.hasMoreElements())
+    //     {
+    //         Object o = e.nextElement();
+    //         hashCode *= 17;
+    //         if (o != null)
+    //         {
+    //             hashCode ^= o.hashCode();
+    //         }
+    //     }
+    //
+    //     return hashCode;
+    // }
+    // END android-removed
 
     boolean asn1Equals(
         DERObject  o)
@@ -220,52 +232,54 @@
         return true;
     }
 
-    /**
-     * return true if a <= b (arrays are assumed padded with zeros).
-     */
-    private boolean lessThanOrEqual(
-         byte[] a,
-         byte[] b)
-    {
-         if (a.length <= b.length)
-         {
-             for (int i = 0; i != a.length; i++)
-             {
-                 int    l = a[i] & 0xff;
-                 int    r = b[i] & 0xff;
-                 
-                 if (r > l)
-                 {
-                     return true;
-                 }
-                 else if (l > r)
-                 {
-                     return false;
-                 }
-             }
-
-             return true;
-         }
-         else
-         {
-             for (int i = 0; i != b.length; i++)
-             {
-                 int    l = a[i] & 0xff;
-                 int    r = b[i] & 0xff;
-                 
-                 if (r > l)
-                 {
-                     return true;
-                 }
-                 else if (l > r)
-                 {
-                     return false;
-                 }
-             }
-
-             return false;
-         }
-    }
+    // BEGIN android-removed
+    // /**
+    //  * return true if a <= b (arrays are assumed padded with zeros).
+    //  */
+    // private boolean lessThanOrEqual(
+    //      byte[] a,
+    //      byte[] b)
+    // {
+    //      if (a.length <= b.length)
+    //      {
+    //          for (int i = 0; i != a.length; i++)
+    //          {
+    //              int    l = a[i] & 0xff;
+    //              int    r = b[i] & 0xff;
+    //
+    //              if (r > l)
+    //              {
+    //                  return true;
+    //              }
+    //              else if (l > r)
+    //              {
+    //                  return false;
+    //              }
+    //          }
+    //
+    //          return true;
+    //      }
+    //      else
+    //      {
+    //          for (int i = 0; i != b.length; i++)
+    //          {
+    //              int    l = a[i] & 0xff;
+    //              int    r = b[i] & 0xff;
+    //
+    //              if (r > l)
+    //              {
+    //                  return true;
+    //              }
+    //              else if (l > r)
+    //              {
+    //                  return false;
+    //              }
+    //          }
+    //
+    //          return false;
+    //      }
+    // }
+    // END android-removed
 
     private byte[] getEncoded(
         DEREncodable obj)
@@ -285,59 +299,61 @@
         return bOut.toByteArray();
     }
 
-    protected void sort()
-    {
-        if (set.size() > 1)
-        {
-            boolean    swapped = true;
-            int        lastSwap = set.size() - 1;
-
-            while (swapped)
-            {
-                int    index = 0;
-                int    swapIndex = 0;
-                byte[] a = getEncoded((DEREncodable)set.elementAt(0));
-                
-                swapped = false;
-
-                while (index != lastSwap)
-                {
-                    byte[] b = getEncoded((DEREncodable)set.elementAt(index + 1));
-
-                    if (lessThanOrEqual(a, b))
-                    {
-                        a = b;
-                    }
-                    else
-                    {
-                        Object  o = set.elementAt(index);
-
-                        set.setElementAt(set.elementAt(index + 1), index);
-                        set.setElementAt(o, index + 1);
-
-                        swapped = true;
-                        swapIndex = index;
-                    }
-
-                    index++;
-                }
-
-                lastSwap = swapIndex;
-            }
-        }
-    }
-
-    protected void addObject(
-        DEREncodable obj)
-    {
-        set.addElement(obj);
-    }
-
-    abstract void encode(DEROutputStream out)
-            throws IOException;
-
-    public String toString() 
-    {
-      return set.toString();
-    }
+    // BEGIN android-removed
+    // protected void sort()
+    // {
+    //     if (set.size() > 1)
+    //     {
+    //         boolean    swapped = true;
+    //         int        lastSwap = set.size() - 1;
+    //
+    //         while (swapped)
+    //         {
+    //             int    index = 0;
+    //             int    swapIndex = 0;
+    //             byte[] a = getEncoded((DEREncodable)set.elementAt(0));
+    //
+    //             swapped = false;
+    //
+    //             while (index != lastSwap)
+    //             {
+    //                 byte[] b = getEncoded((DEREncodable)set.elementAt(index + 1));
+    //
+    //                 if (lessThanOrEqual(a, b))
+    //                 {
+    //                     a = b;
+    //                 }
+    //                 else
+    //                 {
+    //                     Object  o = set.elementAt(index);
+    //
+    //                     set.setElementAt(set.elementAt(index + 1), index);
+    //                     set.setElementAt(o, index + 1);
+    //
+    //                     swapped = true;
+    //                     swapIndex = index;
+    //                 }
+    //
+    //                 index++;
+    //             }
+    //
+    //             lastSwap = swapIndex;
+    //         }
+    //     }
+    // }
+    //
+    // protected void addObject(
+    //     DEREncodable obj)
+    // {
+    //     set.addElement(obj);
+    // }
+    //
+    // abstract void encode(DEROutputStream out)
+    //         throws IOException;
+    //
+    // public String toString() 
+    // {
+    //   return set.toString();
+    // }
+    // END android-removed
 }
diff -Naur bcprov-jdk16-145.orig/org/bouncycastle/asn1/DERBoolean.java bcprov-jdk16-145/org/bouncycastle/asn1/DERBoolean.java
--- bcprov-jdk16-145.orig/org/bouncycastle/asn1/DERBoolean.java	2010-01-11 21:46:14.000000000 +0000
+++ bcprov-jdk16-145/org/bouncycastle/asn1/DERBoolean.java	2011-09-01 17:21:06.000000000 +0000
@@ -5,7 +5,9 @@
 public class DERBoolean
     extends ASN1Object
 {
-    byte         value;
+    // BEGIN android-changed
+    private final byte  value;
+    // END android-changed
 
     public static final DERBoolean FALSE = new DERBoolean(false);
     public static final DERBoolean TRUE  = new DERBoolean(true);
@@ -25,7 +27,9 @@
 
         if (obj instanceof ASN1OctetString)
         {
-            return new DERBoolean(((ASN1OctetString)obj).getOctets());
+            // BEGIN android-changed
+            return getInstance(((ASN1OctetString)obj).getOctets());
+            // END android-changed
         }
 
         if (obj instanceof ASN1TaggedObject)
@@ -45,6 +49,17 @@
         return (value ? TRUE : FALSE);
     }
 
+    // BEGIN android-added
+    /**
+     * return a DERBoolean from the passed in array.
+     */
+    public static DERBoolean getInstance(
+        byte[] octets)
+    {
+        return (octets[0] != 0) ? TRUE : FALSE;
+    }
+    // END android-added
+
     /**
      * return a Boolean from a tagged object.
      *
@@ -60,18 +75,22 @@
     {
         return getInstance(obj.getObject());
     }
-    
-    public DERBoolean(
-        byte[]       value)
-    {
-        this.value = value[0];
-    }
 
-    public DERBoolean(
+    // BEGIN android-removed
+    //private DERBoolean(
+    //    byte[]       value)
+    //{
+    //    this.value = value[0];
+    //}
+    // END android-removed
+
+    // BEGIN android-changed
+    private DERBoolean(
         boolean     value)
     {
         this.value = (value) ? (byte)0xff : (byte)0;
     }
+    // END android-changed
 
     public boolean isTrue()
     {
diff -Naur bcprov-jdk16-145.orig/org/bouncycastle/asn1/DERInputStream.java bcprov-jdk16-145/org/bouncycastle/asn1/DERInputStream.java
--- bcprov-jdk16-145.orig/org/bouncycastle/asn1/DERInputStream.java	2010-01-11 21:46:14.000000000 +0000
+++ bcprov-jdk16-145/org/bouncycastle/asn1/DERInputStream.java	2011-09-01 17:21:06.000000000 +0000
@@ -144,7 +144,9 @@
                 return new DERConstructedSet(v);
             }
         case BOOLEAN:
-            return new DERBoolean(bytes);
+            // BEGIN android-changed
+            return DERBoolean.getInstance(bytes);
+            // BEGIN android-changed
         case INTEGER:
             return new DERInteger(bytes);
         case ENUMERATED:
@@ -195,7 +197,9 @@
                 {
                     if ((tag & CONSTRUCTED) == 0)
                     {
-                        return new DERTaggedObject(false, tag & 0x1f, new DERNull());
+                        // BEGIN android-changed
+                        return new DERTaggedObject(false, tag & 0x1f, DERNull.INSTANCE);
+                        // END android-changed
                     }
                     else
                     {
diff -Naur bcprov-jdk16-145.orig/org/bouncycastle/asn1/DERNull.java bcprov-jdk16-145/org/bouncycastle/asn1/DERNull.java
--- bcprov-jdk16-145.orig/org/bouncycastle/asn1/DERNull.java	2010-01-11 21:46:14.000000000 +0000
+++ bcprov-jdk16-145/org/bouncycastle/asn1/DERNull.java	2011-09-01 17:21:06.000000000 +0000
@@ -10,9 +10,13 @@
 {
     public static final DERNull INSTANCE = new DERNull();
 
-    byte[]  zeroBytes = new byte[0];
+    // BEGIN android-changed
+    private static final byte[]  zeroBytes = new byte[0];
+    // END android-changed
 
-    public DERNull()
+    // BEGIN android-changed
+    protected DERNull()
+    // END android-changed
     {
     }
 
diff -Naur bcprov-jdk16-145.orig/org/bouncycastle/asn1/DERObjectIdentifier.java bcprov-jdk16-145/org/bouncycastle/asn1/DERObjectIdentifier.java
--- bcprov-jdk16-145.orig/org/bouncycastle/asn1/DERObjectIdentifier.java	2010-01-11 21:46:14.000000000 +0000
+++ bcprov-jdk16-145/org/bouncycastle/asn1/DERObjectIdentifier.java	2011-09-01 17:21:06.000000000 +0000
@@ -111,7 +111,13 @@
             }
         }
 
-        this.identifier = objId.toString();
+        // BEGIN android-changed
+        /*
+         * Intern the identifier so there aren't hundreds of duplicates
+         * (in practice).
+         */
+        this.identifier = objId.toString().intern();
+        // END android-changed
     }
 
     public DERObjectIdentifier(
@@ -122,7 +128,13 @@
             throw new IllegalArgumentException("string " + identifier + " not an OID");
         }
 
-        this.identifier = identifier;
+        // BEGIN android-changed
+        /*
+         * Intern the identifier so there aren't hundreds of duplicates
+         * (in practice).
+         */
+        this.identifier = identifier.intern();
+        // END android-changed
     }
 
     public String getId()
diff -Naur bcprov-jdk16-145.orig/org/bouncycastle/asn1/DERPrintableString.java bcprov-jdk16-145/org/bouncycastle/asn1/DERPrintableString.java
--- bcprov-jdk16-145.orig/org/bouncycastle/asn1/DERPrintableString.java	2010-01-11 21:46:14.000000000 +0000
+++ bcprov-jdk16-145/org/bouncycastle/asn1/DERPrintableString.java	2011-09-01 17:21:06.000000000 +0000
@@ -9,7 +9,9 @@
     extends ASN1Object
     implements DERString
 {
-    String  string;
+    // BEGIN android-changed
+    private final String string;
+    // END android-changed
 
     /**
      * return a printable string from the passed in object.
@@ -66,7 +68,9 @@
             cs[i] = (char)(string[i] & 0xff);
         }
 
-        this.string = new String(cs);
+        // BEGIN android-changed
+        this.string = new String(cs).intern();
+        // END android-changed
     }
 
     /**
@@ -95,7 +99,9 @@
             throw new IllegalArgumentException("string contains illegal characters");
         }
 
-        this.string = string;
+        // BEGIN android-changed
+        this.string = string.intern();
+        // END android-changed
     }
 
     public String getString()
diff -Naur bcprov-jdk16-145.orig/org/bouncycastle/asn1/OrderedTable.java bcprov-jdk16-145/org/bouncycastle/asn1/OrderedTable.java
--- bcprov-jdk16-145.orig/org/bouncycastle/asn1/OrderedTable.java	1970-01-01 00:00:00.000000000 +0000
+++ bcprov-jdk16-145/org/bouncycastle/asn1/OrderedTable.java	2011-09-01 17:21:06.000000000 +0000
@@ -0,0 +1,281 @@
+package org.bouncycastle.asn1;
+
+import java.util.Enumeration;
+import java.util.ConcurrentModificationException;
+
+// BEGIN android-note
+/*
+ * This is a new class that was synthesized from the observed
+ * requirement for a lookup table that preserves order. Since in
+ * practice the element count is typically very low, we just use a
+ * flat list rather than doing any hashing / bucketing.
+ */
+// END android-note
+
+/**
+ * Ordered lookup table. Instances of this class will keep up to four
+ * key-value pairs directly, resorting to an external collection only
+ * if more elements than that need to be stored.
+ */
+public final class OrderedTable {
+    /** null-ok; key #0 */
+    private DERObjectIdentifier key0;
+    
+    /** null-ok; key #1 */
+    private DERObjectIdentifier key1;
+
+    /** null-ok; key #2 */
+    private DERObjectIdentifier key2;
+
+    /** null-ok; key #3 */
+    private DERObjectIdentifier key3;
+    
+    /** null-ok; value #0 */
+    private Object value0;
+    
+    /** null-ok; value #1 */
+    private Object value1;
+
+    /** null-ok; value #2 */
+    private Object value2;
+
+    /** null-ok; value #3 */
+    private Object value3;
+    
+    /**
+     * null-ok; array of additional keys and values, alternating
+     * key then value, etc. 
+     */
+    private Object[] rest;
+
+    /** &gt;= 0; number of elements in the list */
+    private int size;
+
+    // Note: Default public constructor.
+
+    /**
+     * Adds an element assuming no duplicate key.
+     * 
+     * @see #put
+     * 
+     * @param key non-null; the key
+     * @param value non-null; the value
+     */
+    public void add(DERObjectIdentifier key, Object value) {
+        if (key == null) {
+            throw new NullPointerException("key == null");
+        }
+
+        if (value == null) {
+            throw new NullPointerException("value == null");
+        }
+
+        int sz = size;
+
+        switch (sz) {
+            case 0: {
+                key0 = key;
+                value0 = value;
+                break;
+            }
+            case 1: {
+                key1 = key;
+                value1 = value;
+                break;
+            }
+            case 2: {
+                key2 = key;
+                value2 = value;
+                break;
+            }
+            case 3: {
+                key3 = key;
+                value3 = value;
+                break;
+            }
+            case 4: {
+                // Do initial allocation of rest.
+                rest = new Object[10];
+                rest[0] = key;
+                rest[1] = value;
+                break;
+            }
+            default: {
+                int index = (sz - 4) * 2;
+                int index1 = index + 1;
+                if (index1 >= rest.length) {
+                    // Grow rest.
+                    Object[] newRest = new Object[index1 * 2 + 10];
+                    System.arraycopy(rest, 0, newRest, 0, rest.length);
+                    rest = newRest;
+                }
+                rest[index] = key;
+                rest[index1] = value;
+                break;
+            }
+        }
+        
+        size = sz + 1;
+    }
+
+    /**
+     * Gets the number of elements in this instance.
+     */
+    public int size() {
+        return size;
+    }
+
+    /**
+     * Look up the given key, returning the associated value if found.
+     * 
+     * @param key non-null; the key to look up
+     * @return null-ok; the associated value
+     */
+    public Object get(DERObjectIdentifier key) {
+        int keyHash = key.hashCode();
+        int sz = size;
+
+        for (int i = 0; i < size; i++) {
+            DERObjectIdentifier probe = getKey(i);
+            if ((probe.hashCode() == keyHash) &&
+                    probe.equals(key)) {
+                return getValue(i);
+            }
+        }
+
+        return null;
+    }
+    
+    /**
+     * Replace a key if present, otherwise add
+     * 
+     * @see #add
+     * 
+     * @param key non-null; the key
+     * @param value non-null; the value
+     */
+    public void put(DERObjectIdentifier key, Object value) {
+        if (key == null) {
+            throw new NullPointerException("key == null");
+        }
+
+        if (value == null) {
+            throw new NullPointerException("value == null");
+        }
+
+        int keyHash = key.hashCode();
+        int sz = size;
+
+        for (int i = 0; i < size; i++) {
+            DERObjectIdentifier probe = getKey(i);
+            if ((probe.hashCode() == keyHash) &&
+                    probe.equals(key)) {
+                setValue(i, value);
+                return;
+            }
+        }
+
+        add(key, value);
+    }
+    
+    /**
+     * Gets the nth key.
+     * 
+     * @param n index
+     * @return non-null; the nth key
+     */
+    public DERObjectIdentifier getKey(int n) {
+        if ((n < 0) || (n >= size)) {
+            throw new IndexOutOfBoundsException(Integer.toString(n));
+        }
+
+        switch (n) {
+            case 0: return key0;
+            case 1: return key1;
+            case 2: return key2;
+            case 3: return key3;
+            default: return (DERObjectIdentifier) rest[(n - 4) * 2];
+        }
+    }
+
+    /**
+     * Gets the nth value.
+     * 
+     * @param n index
+     * @return non-null; the nth value
+     */
+    public Object getValue(int n) {
+        if ((n < 0) || (n >= size)) {
+            throw new IndexOutOfBoundsException(Integer.toString(n));
+        }
+
+        switch (n) {
+            case 0: return value0;
+            case 1: return value1;
+            case 2: return value2;
+            case 3: return value3;
+            default: return rest[((n - 4) * 2) + 1];
+        }
+    }
+
+    /**
+     * Sets the nth value.
+     * 
+     * @param n index
+     * @param value non-null object
+     */
+    public void setValue(int n, Object value) {
+        if ((n < 0) || (n >= size)) {
+            throw new IndexOutOfBoundsException(Integer.toString(n));
+        }
+        if (value == null) {
+            throw new NullPointerException("value == null");
+        }
+
+        switch (n) {
+            case 0: value0 = value; return;
+            case 1: value1 = value; return;
+            case 2: value2 = value; return;
+            case 3: value3 = value; return;
+            default: rest[((n - 4) * 2) + 1] = value; return;
+        }
+    }
+
+    /**
+     * Gets an enumeration of the keys, in order.
+     * 
+     * @return non-null; an enumeration of the keys
+     */
+    public Enumeration getKeys() {
+        return new KeyEnumeration();
+    }
+
+    /**
+     * Associated enumeration class.
+     */
+    private class KeyEnumeration implements Enumeration {
+        /** original size; used for modification detection */
+        private final int origSize = size;
+
+        /** &gt;= 0; current cursor */
+        private int at = 0;
+
+        /** {@inheritDoc} */
+        public boolean hasMoreElements() {
+            if (size != origSize) {
+                throw new ConcurrentModificationException();
+            }
+
+            return at < origSize;
+        }
+
+        /** {@inheritDoc} */
+        public Object nextElement() {
+            if (size != origSize) {
+                throw new ConcurrentModificationException();
+            }
+
+            return getKey(at++);
+        }
+    }
+}
diff -Naur bcprov-jdk16-145.orig/org/bouncycastle/asn1/pkcs/PKCSObjectIdentifiers.java bcprov-jdk16-145/org/bouncycastle/asn1/pkcs/PKCSObjectIdentifiers.java
--- bcprov-jdk16-145.orig/org/bouncycastle/asn1/pkcs/PKCSObjectIdentifiers.java	2010-01-11 21:46:14.000000000 +0000
+++ bcprov-jdk16-145/org/bouncycastle/asn1/pkcs/PKCSObjectIdentifiers.java	2011-09-01 17:21:06.000000000 +0000
@@ -10,7 +10,10 @@
     //
     static final String                 pkcs_1                    = "1.2.840.113549.1.1";
     static final DERObjectIdentifier    rsaEncryption             = new DERObjectIdentifier(pkcs_1 + ".1");
-    static final DERObjectIdentifier    md2WithRSAEncryption      = new DERObjectIdentifier(pkcs_1 + ".2");
+    // BEGIN android-removed
+    // Dropping MD2
+    // static final DERObjectIdentifier    md2WithRSAEncryption      = new DERObjectIdentifier(pkcs_1 + ".2");
+    // END android-removed
     static final DERObjectIdentifier    md4WithRSAEncryption      = new DERObjectIdentifier(pkcs_1 + ".3");
     static final DERObjectIdentifier    md5WithRSAEncryption      = new DERObjectIdentifier(pkcs_1 + ".4");
     static final DERObjectIdentifier    sha1WithRSAEncryption     = new DERObjectIdentifier(pkcs_1 + ".5");
@@ -65,7 +68,10 @@
     // md2 OBJECT IDENTIFIER ::=
     //      {iso(1) member-body(2) US(840) rsadsi(113549) digestAlgorithm(2) 2}
     //
-    static final DERObjectIdentifier    md2                     = new DERObjectIdentifier(digestAlgorithm + ".2");
+    // BEGIN android-removed
+    // Dropping MD2
+    // static final DERObjectIdentifier    md2                     = new DERObjectIdentifier(digestAlgorithm + ".2");
+    // END android-removed
 
     //
     // md4 OBJECT IDENTIFIER ::=
diff -Naur bcprov-jdk16-145.orig/org/bouncycastle/asn1/pkcs/RSAESOAEPparams.java bcprov-jdk16-145/org/bouncycastle/asn1/pkcs/RSAESOAEPparams.java
--- bcprov-jdk16-145.orig/org/bouncycastle/asn1/pkcs/RSAESOAEPparams.java	2010-01-11 21:46:14.000000000 +0000
+++ bcprov-jdk16-145/org/bouncycastle/asn1/pkcs/RSAESOAEPparams.java	2011-09-01 17:21:06.000000000 +0000
@@ -19,7 +19,9 @@
     private AlgorithmIdentifier maskGenAlgorithm;
     private AlgorithmIdentifier pSourceAlgorithm;
     
-    public final static AlgorithmIdentifier DEFAULT_HASH_ALGORITHM = new AlgorithmIdentifier(OIWObjectIdentifiers.idSHA1, new DERNull());
+    // BEGIN android-changed
+    public final static AlgorithmIdentifier DEFAULT_HASH_ALGORITHM = new AlgorithmIdentifier(OIWObjectIdentifiers.idSHA1, DERNull.INSTANCE);
+    // END android-changed
     public final static AlgorithmIdentifier DEFAULT_MASK_GEN_FUNCTION = new AlgorithmIdentifier(PKCSObjectIdentifiers.id_mgf1, DEFAULT_HASH_ALGORITHM);
     public final static AlgorithmIdentifier DEFAULT_P_SOURCE_ALGORITHM = new AlgorithmIdentifier(PKCSObjectIdentifiers.id_pSpecified, new DEROctetString(new byte[0]));
     
diff -Naur bcprov-jdk16-145.orig/org/bouncycastle/asn1/pkcs/RSASSAPSSparams.java bcprov-jdk16-145/org/bouncycastle/asn1/pkcs/RSASSAPSSparams.java
--- bcprov-jdk16-145.orig/org/bouncycastle/asn1/pkcs/RSASSAPSSparams.java	2010-01-11 21:46:14.000000000 +0000
+++ bcprov-jdk16-145/org/bouncycastle/asn1/pkcs/RSASSAPSSparams.java	2011-09-01 17:21:06.000000000 +0000
@@ -20,7 +20,9 @@
     private DERInteger          saltLength;
     private DERInteger          trailerField;
     
-    public final static AlgorithmIdentifier DEFAULT_HASH_ALGORITHM = new AlgorithmIdentifier(OIWObjectIdentifiers.idSHA1, new DERNull());
+    // BEGIN android-changed
+    public final static AlgorithmIdentifier DEFAULT_HASH_ALGORITHM = new AlgorithmIdentifier(OIWObjectIdentifiers.idSHA1, DERNull.INSTANCE);
+    // END android-changed
     public final static AlgorithmIdentifier DEFAULT_MASK_GEN_FUNCTION = new AlgorithmIdentifier(PKCSObjectIdentifiers.id_mgf1, DEFAULT_HASH_ALGORITHM);
     public final static DERInteger          DEFAULT_SALT_LENGTH = new DERInteger(20);
     public final static DERInteger          DEFAULT_TRAILER_FIELD = new DERInteger(1);
diff -Naur bcprov-jdk16-145.orig/org/bouncycastle/asn1/util/ASN1Dump.java bcprov-jdk16-145/org/bouncycastle/asn1/util/ASN1Dump.java
--- bcprov-jdk16-145.orig/org/bouncycastle/asn1/util/ASN1Dump.java	2010-01-11 21:46:14.000000000 +0000
+++ bcprov-jdk16-145/org/bouncycastle/asn1/util/ASN1Dump.java	2011-09-01 17:21:06.000000000 +0000
@@ -90,7 +90,9 @@
             {
                 Object  o = e.nextElement();
 
-                if (o == null || o.equals(new DERNull()))
+                // BEGIN android-changed
+                if (o == null || o.equals(DERNull.INSTANCE))
+                // END android-changed
                 {
                     buf.append(tab);
                     buf.append("NULL");
diff -Naur bcprov-jdk16-145.orig/org/bouncycastle/asn1/x509/AttCertIssuer.java bcprov-jdk16-145/org/bouncycastle/asn1/x509/AttCertIssuer.java
--- bcprov-jdk16-145.orig/org/bouncycastle/asn1/x509/AttCertIssuer.java	2010-01-11 21:46:14.000000000 +0000
+++ bcprov-jdk16-145/org/bouncycastle/asn1/x509/AttCertIssuer.java	2011-09-01 17:21:06.000000000 +0000
@@ -45,7 +45,7 @@
         ASN1TaggedObject obj,
         boolean          explicit)
     {
-        return getInstance(obj.getObject()); // must be explictly tagged
+        return getInstance(obj.getObject()); // must be explicitly tagged
     }
 
     /**
diff -Naur bcprov-jdk16-145.orig/org/bouncycastle/asn1/x509/BasicConstraints.java bcprov-jdk16-145/org/bouncycastle/asn1/x509/BasicConstraints.java
--- bcprov-jdk16-145.orig/org/bouncycastle/asn1/x509/BasicConstraints.java	2010-01-11 21:46:14.000000000 +0000
+++ bcprov-jdk16-145/org/bouncycastle/asn1/x509/BasicConstraints.java	2011-09-01 17:21:06.000000000 +0000
@@ -14,7 +14,9 @@
 public class BasicConstraints
     extends ASN1Encodable
 {
-    DERBoolean  cA = new DERBoolean(false);
+    // BEGIN android-changed
+    DERBoolean  cA = DERBoolean.FALSE;
+    // END android-changed
     DERInteger  pathLenConstraint = null;
 
     public static BasicConstraints getInstance(
@@ -89,7 +91,9 @@
     {
         if (cA)
         {
-            this.cA = new DERBoolean(cA);
+            // BEGIN android-changed
+            this.cA = DERBoolean.getInstance(cA);
+            // END android-changed
             this.pathLenConstraint = new DERInteger(pathLenConstraint);
         }
         else
@@ -104,7 +108,9 @@
     {
         if (cA)
         {
-            this.cA = new DERBoolean(true);
+            // BEGIN android-changed
+            this.cA = DERBoolean.TRUE;
+            // END android-changed
         }
         else
         {
@@ -121,7 +127,9 @@
     public BasicConstraints(
         int     pathLenConstraint)
     {
-        this.cA = new DERBoolean(true);
+        // BEGIN android-changed
+        this.cA = DERBoolean.TRUE;
+        // END android-changed
         this.pathLenConstraint = new DERInteger(pathLenConstraint);
     }
 
diff -Naur bcprov-jdk16-145.orig/org/bouncycastle/asn1/x509/IssuingDistributionPoint.java bcprov-jdk16-145/org/bouncycastle/asn1/x509/IssuingDistributionPoint.java
--- bcprov-jdk16-145.orig/org/bouncycastle/asn1/x509/IssuingDistributionPoint.java	2010-01-11 21:46:14.000000000 +0000
+++ bcprov-jdk16-145/org/bouncycastle/asn1/x509/IssuingDistributionPoint.java	2011-09-01 17:21:06.000000000 +0000
@@ -96,11 +96,15 @@
         }
         if (onlyContainsUserCerts)
         {
-            vec.add(new DERTaggedObject(false, 1, new DERBoolean(true)));
+            // BEGIN android-changed
+            vec.add(new DERTaggedObject(false, 1, DERBoolean.TRUE));
+            // END android-changed
         }
         if (onlyContainsCACerts)
         {
-            vec.add(new DERTaggedObject(false, 2, new DERBoolean(true)));
+            // BEGIN android-changed
+            vec.add(new DERTaggedObject(false, 2, DERBoolean.TRUE));
+            // END android-changed
         }
         if (onlySomeReasons != null)
         {
@@ -108,11 +112,15 @@
         }
         if (indirectCRL)
         {
-            vec.add(new DERTaggedObject(false, 4, new DERBoolean(true)));
+            // BEGIN android-changed
+            vec.add(new DERTaggedObject(false, 4, DERBoolean.TRUE));
+            // END android-changed
         }
         if (onlyContainsAttributeCerts)
         {
-            vec.add(new DERTaggedObject(false, 5, new DERBoolean(true)));
+            // BEGIN android-changed
+            vec.add(new DERTaggedObject(false, 5, DERBoolean.TRUE));
+            // END android-changed
         }
 
         seq = new DERSequence(vec);
diff -Naur bcprov-jdk16-145.orig/org/bouncycastle/asn1/x509/X509Extensions.java bcprov-jdk16-145/org/bouncycastle/asn1/x509/X509Extensions.java
--- bcprov-jdk16-145.orig/org/bouncycastle/asn1/x509/X509Extensions.java	2010-01-11 21:46:14.000000000 +0000
+++ bcprov-jdk16-145/org/bouncycastle/asn1/x509/X509Extensions.java	2011-09-01 17:21:06.000000000 +0000
@@ -9,6 +9,9 @@
 import org.bouncycastle.asn1.DERObject;
 import org.bouncycastle.asn1.DERObjectIdentifier;
 import org.bouncycastle.asn1.DERSequence;
+// BEGIN android-added
+import org.bouncycastle.asn1.OrderedTable;
+// END android-added
 
 import java.util.Enumeration;
 import java.util.Hashtable;
@@ -172,8 +175,9 @@
      */
     public static final DERObjectIdentifier TargetInformation = new DERObjectIdentifier("2.5.29.55");
     
-    private Hashtable               extensions = new Hashtable();
-    private Vector                  ordering = new Vector();
+    // BEGIN android-changed
+    private OrderedTable table = new OrderedTable();
+    // END android-changed
 
     public static X509Extensions getInstance(
         ASN1TaggedObject obj,
@@ -217,20 +221,26 @@
         {
             ASN1Sequence            s = ASN1Sequence.getInstance(e.nextElement());
 
-            if (s.size() == 3)
+            // BEGIN android-changed
+            int sSize = s.size();
+            DERObjectIdentifier key = (DERObjectIdentifier) s.getObjectAt(0);
+            Object value;
+            
+            if (sSize == 3)
             {
-                extensions.put(s.getObjectAt(0), new X509Extension(DERBoolean.getInstance(s.getObjectAt(1)), ASN1OctetString.getInstance(s.getObjectAt(2))));
+                value = new X509Extension(DERBoolean.getInstance(s.getObjectAt(1)), ASN1OctetString.getInstance(s.getObjectAt(2)));
             }
-            else if (s.size() == 2)
+            else if (sSize == 2)
             {
-                extensions.put(s.getObjectAt(0), new X509Extension(false, ASN1OctetString.getInstance(s.getObjectAt(1))));
+                value = new X509Extension(false, ASN1OctetString.getInstance(s.getObjectAt(1)));
             }
             else
             {
-                throw new IllegalArgumentException("Bad sequence size: " + s.size());
+                throw new IllegalArgumentException("Bad sequence size: " + sSize);
             }
 
-            ordering.addElement(s.getObjectAt(0));
+            table.add(key, value);
+            // END android-changed
         }
     }
 
@@ -265,20 +275,14 @@
             e = ordering.elements();
         }
 
-        while (e.hasMoreElements())
-        {
-            this.ordering.addElement(e.nextElement()); 
-        }
-
-        e = this.ordering.elements();
-
+        // BEGIN android-changed
         while (e.hasMoreElements())
         {
             DERObjectIdentifier     oid = (DERObjectIdentifier)e.nextElement();
             X509Extension           ext = (X509Extension)extensions.get(oid);
-
-            this.extensions.put(oid, ext);
+            table.add(oid, ext);
         }
+        // END android-changed
     }
 
     /**
@@ -293,23 +297,18 @@
     {
         Enumeration e = objectIDs.elements();
 
-        while (e.hasMoreElements())
-        {
-            this.ordering.addElement(e.nextElement()); 
-        }
-
+        // BEGIN android-changed
         int count = 0;
         
-        e = this.ordering.elements();
-
         while (e.hasMoreElements())
         {
             DERObjectIdentifier     oid = (DERObjectIdentifier)e.nextElement();
             X509Extension           ext = (X509Extension)values.elementAt(count);
 
-            this.extensions.put(oid, ext);
+            table.add(oid, ext);
             count++;
         }
+        // END android-changed
     }
     
     /**
@@ -317,7 +316,9 @@
      */
     public Enumeration oids()
     {
-        return ordering.elements();
+        // BEGIN android-changed
+        return table.getKeys();
+        // END android-changed
     }
 
     /**
@@ -329,7 +330,9 @@
     public X509Extension getExtension(
         DERObjectIdentifier oid)
     {
-        return (X509Extension)extensions.get(oid);
+        // BEGIN android-changed
+        return (X509Extension)table.get(oid);
+        // END android-changed
     }
 
     /**
@@ -345,19 +348,23 @@
     public DERObject toASN1Object()
     {
         ASN1EncodableVector     vec = new ASN1EncodableVector();
-        Enumeration             e = ordering.elements();
+        // BEGIN android-changed
+        int                     size = table.size();
 
-        while (e.hasMoreElements())
+        for (int i = 0; i < size; i++)
         {
-            DERObjectIdentifier     oid = (DERObjectIdentifier)e.nextElement();
-            X509Extension           ext = (X509Extension)extensions.get(oid);
+            DERObjectIdentifier     oid = table.getKey(i);
+            X509Extension           ext = (X509Extension)table.getValue(i);
+            // END android-changed
             ASN1EncodableVector     v = new ASN1EncodableVector();
 
             v.add(oid);
 
             if (ext.isCritical())
             {
-                v.add(new DERBoolean(true));
+                // BEGIN android-changed
+                v.add(DERBoolean.TRUE);
+                // END android-changed
             }
 
             v.add(ext.getValue());
@@ -371,18 +378,24 @@
     public boolean equivalent(
         X509Extensions other)
     {
-        if (extensions.size() != other.extensions.size())
+        // BEGIN android-changed
+        if (table.size() != other.table.size())
+        // END android-changed
         {
             return false;
         }
 
-        Enumeration     e1 = extensions.keys();
+        // BEGIN android-changed
+        Enumeration     e1 = table.getKeys();
+        // END android-changed
 
         while (e1.hasMoreElements())
         {
-            Object  key = e1.nextElement();
+            // BEGIN android-changed
+            DERObjectIdentifier  key = (DERObjectIdentifier)e1.nextElement();
 
-            if (!extensions.get(key).equals(other.extensions.get(key)))
+            if (!table.get(key).equals(other.table.get(key)))
+            // END android-changed
             {
                 return false;
             }
diff -Naur bcprov-jdk16-145.orig/org/bouncycastle/asn1/x509/X509Name.java bcprov-jdk16-145/org/bouncycastle/asn1/x509/X509Name.java
--- bcprov-jdk16-145.orig/org/bouncycastle/asn1/x509/X509Name.java	2010-01-11 21:46:14.000000000 +0000
+++ bcprov-jdk16-145/org/bouncycastle/asn1/x509/X509Name.java	2011-09-01 17:21:06.000000000 +0000
@@ -247,8 +247,10 @@
      */
     public static final Hashtable SymbolLookUp = DefaultLookUp;
 
-    private static final Boolean TRUE = new Boolean(true); // for J2ME compatibility
-    private static final Boolean FALSE = new Boolean(false);
+    // BEGIN android-removed
+    //private static final Boolean TRUE = new Boolean(true); // for J2ME compatibility
+    //private static final Boolean FALSE = new Boolean(false);
+    // END android-removed
 
     static
     {
@@ -340,9 +342,9 @@
     }
 
     private X509NameEntryConverter  converter = null;
-    private Vector                  ordering = new Vector();
-    private Vector                  values = new Vector();
-    private Vector                  added = new Vector();
+    // BEGIN android-changed
+    private X509NameElementList     elems = new X509NameElementList();
+    // END android-changed
 
     private ASN1Sequence            seq;
 
@@ -403,26 +405,30 @@
                        throw new IllegalArgumentException("badly sized pair");
                    }
 
-                   ordering.addElement(DERObjectIdentifier.getInstance(s.getObjectAt(0)));
+                   // BEGIN android-changed
+                   DERObjectIdentifier key = DERObjectIdentifier.getInstance(s.getObjectAt(0));
                    
                    DEREncodable value = s.getObjectAt(1);
+                   String valueStr;
                    if (value instanceof DERString && !(value instanceof DERUniversalString))
                    {
                        String v = ((DERString)value).getString();
                        if (v.length() > 0 && v.charAt(0) == '#')
                        {
-                           values.addElement("\\" + v);
+                           valueStr = "\\" + v;
                        }
                        else
                        {
-                           values.addElement(v);
+                           valueStr = v;
                        }
                    }
                    else
                    {
-                       values.addElement("#" + bytesToString(Hex.encode(value.getDERObject().getDEREncoded())));
+                       valueStr = "#" + bytesToString(Hex.encode(value.getDERObject().getDEREncoded()));
                    }
-                   added.addElement((i != 0) ? TRUE : FALSE);  // to allow earlier JDK compatibility
+                   boolean added = (i != 0);  // to allow earlier JDK compatibility
+                   elems.add(key, valueStr, added);
+                   // END android-changed
             }
         }
     }
@@ -476,14 +482,23 @@
         Hashtable                attributes,
         X509NameEntryConverter   converter)
     {
+        // BEGIN android-changed
+        DERObjectIdentifier problem = null;
         this.converter = converter;
 
         if (ordering != null)
         {
             for (int i = 0; i != ordering.size(); i++)
             {
-                this.ordering.addElement(ordering.elementAt(i));
-                this.added.addElement(FALSE);
+                DERObjectIdentifier key =
+                    (DERObjectIdentifier) ordering.elementAt(i);
+                String value = (String) attributes.get(key);
+                if (value == null)
+                {
+                    problem = key;
+                    break;
+                }
+                elems.add(key, value);
             }
         }
         else
@@ -492,22 +507,23 @@
 
             while (e.hasMoreElements())
             {
-                this.ordering.addElement(e.nextElement());
-                this.added.addElement(FALSE);
+                DERObjectIdentifier key =
+                    (DERObjectIdentifier) e.nextElement();
+                String value = (String) attributes.get(key);
+                if (value == null)
+                {
+                    problem = key;
+                    break;
+                }
+                elems.add(key, value);
             }
         }
 
-        for (int i = 0; i != this.ordering.size(); i++)
+        if (problem != null)
         {
-            DERObjectIdentifier     oid = (DERObjectIdentifier)this.ordering.elementAt(i);
-
-            if (attributes.get(oid) == null)
-            {
-                throw new IllegalArgumentException("No attribute for object id - " + oid.getId() + " - passed to distinguished name");
-            }
-
-            this.values.addElement(attributes.get(oid)); // copy the hash table
+            throw new IllegalArgumentException("No attribute for object id - " + problem.getId() + " - passed to distinguished name");
         }
+        // END android-changed
     }
 
     /**
@@ -540,9 +556,10 @@
 
         for (int i = 0; i < oids.size(); i++)
         {
-            this.ordering.addElement(oids.elementAt(i));
-            this.values.addElement(values.elementAt(i));
-            this.added.addElement(FALSE);
+            // BEGIN android-changed
+            elems.add((DERObjectIdentifier) oids.elementAt(i),
+                    (String) values.elementAt(i));
+            // END android-changed
         }
     }
 
@@ -679,7 +696,7 @@
 
             if (index == -1)
             {
-                throw new IllegalArgumentException("badly formated directory string");
+                throw new IllegalArgumentException("badly formatted directory string");
             }
 
             String              name = token.substring(0, index);
@@ -691,9 +708,9 @@
                 X509NameTokenizer   vTok = new X509NameTokenizer(value, '+');
                 String  v = vTok.nextToken();
 
-                this.ordering.addElement(oid);
-                this.values.addElement(v);
-                this.added.addElement(FALSE);
+                // BEGIN android-changed
+                this.elems.add(oid, v);
+                // END android-changed
 
                 while (vTok.hasMoreTokens())
                 {
@@ -702,48 +719,24 @@
 
                     String  nm = sv.substring(0, ndx);
                     String  vl = sv.substring(ndx + 1);
-                    this.ordering.addElement(decodeOID(nm, lookUp));
-                    this.values.addElement(vl);
-                    this.added.addElement(TRUE);
+                    // BEGIN android-changed
+                    this.elems.add(decodeOID(nm, lookUp), vl, true);
+                    // END android-changed
                 }
             }
             else
             {
-                this.ordering.addElement(oid);
-                this.values.addElement(value);
-                this.added.addElement(FALSE);
+                // BEGIN android-changed
+                this.elems.add(oid, value);
+                // END android-changed
             }
         }
 
         if (reverse)
         {
-            Vector  o = new Vector();
-            Vector  v = new Vector();
-            Vector  a = new Vector();
-
-            int count = 1;
-
-            for (int i = 0; i < this.ordering.size(); i++)
-            {
-                if (((Boolean)this.added.elementAt(i)).booleanValue())
-                {
-                    o.insertElementAt(this.ordering.elementAt(i), count);
-                    v.insertElementAt(this.values.elementAt(i), count);
-                    a.insertElementAt(this.added.elementAt(i), count);
-                    count++;
-                }
-                else
-                {
-                    o.insertElementAt(this.ordering.elementAt(i), 0);
-                    v.insertElementAt(this.values.elementAt(i), 0);
-                    a.insertElementAt(this.added.elementAt(i), 0);
-                    count = 1;
-                }
-            }
-
-            this.ordering = o;
-            this.values = v;
-            this.added = a;
+            // BEGIN android-changed
+            this.elems = this.elems.reverse();
+            // END android-changed
         }
     }
 
@@ -752,14 +745,17 @@
      */
     public Vector getOIDs()
     {
+        // BEGIN android-changed
         Vector  v = new Vector();
+        int     size = elems.size();
 
-        for (int i = 0; i != ordering.size(); i++)
+        for (int i = 0; i < size; i++)
         {
-            v.addElement(ordering.elementAt(i));
+            v.addElement(elems.getKey(i));
         }
 
         return v;
+        // END android-changed
     }
 
     /**
@@ -769,11 +765,14 @@
     public Vector getValues()
     {
         Vector  v = new Vector();
+        // BEGIN android-changed
+        int     size = elems.size();
 
-        for (int i = 0; i != values.size(); i++)
+        for (int i = 0; i != size; i++)
         {
-            v.addElement(values.elementAt(i));
+            v.addElement(elems.getValue(i));
         }
+        // END android-changed
 
         return v;
     }
@@ -786,12 +785,14 @@
         DERObjectIdentifier oid)
     {
         Vector  v = new Vector();
+        int     size = elems.size();
+        // BEGIN android-changed
 
-        for (int i = 0; i != values.size(); i++)
+        for (int i = 0; i != size; i++)
         {
-            if (ordering.elementAt(i).equals(oid))
+            if (elems.getKey(i).equals(oid))
             {
-                String val = (String)values.elementAt(i);
+                String val = elems.getValue(i);
 
                 if (val.length() > 2 && val.charAt(0) == '\\' && val.charAt(1) == '#')
                 {
@@ -803,6 +804,7 @@
                 }
             }
         }
+        // END android-changed
 
         return v;
     }
@@ -814,20 +816,23 @@
             ASN1EncodableVector  vec = new ASN1EncodableVector();
             ASN1EncodableVector  sVec = new ASN1EncodableVector();
             DERObjectIdentifier  lstOid = null;
+            // BEGIN android-changed
+            int                  size = elems.size();
             
-            for (int i = 0; i != ordering.size(); i++)
+            for (int i = 0; i != size; i++)
             {
                 ASN1EncodableVector     v = new ASN1EncodableVector();
-                DERObjectIdentifier     oid = (DERObjectIdentifier)ordering.elementAt(i);
+                DERObjectIdentifier     oid = elems.getKey(i);
 
                 v.add(oid);
 
-                String  str = (String)values.elementAt(i);
+                String  str = elems.getValue(i);
 
                 v.add(converter.getConvertedValue(oid, str));
  
                 if (lstOid == null 
-                    || ((Boolean)this.added.elementAt(i)).booleanValue())
+                    || this.elems.getAdded(i))
+                // END android-changed
                 {
                     sVec.add(new DERSequence(v));
                 }
@@ -845,6 +850,7 @@
             vec.add(new DERSet(sVec));
             
             seq = new DERSequence(vec);
+            // END android-changed
         }
 
         return seq;
@@ -889,22 +895,28 @@
             return false;
         }
 
-        int      orderingSize = ordering.size();
+        // BEGIN android-changed
+        int      orderingSize = elems.size();
 
-        if (orderingSize != other.ordering.size())
+        if (orderingSize != other.elems.size())
+        // END android-changed
         {
             return false;
         }
 
         for (int i = 0; i < orderingSize; i++)
         {
-            DERObjectIdentifier  oid = (DERObjectIdentifier)ordering.elementAt(i);
-            DERObjectIdentifier  oOid = (DERObjectIdentifier)other.ordering.elementAt(i);
+            // BEGIN android-changed
+            DERObjectIdentifier  oid = elems.getKey(i);
+            DERObjectIdentifier  oOid = other.elems.getKey(i);
+            // END android-changed
 
             if (oid.equals(oOid))
             {
-                String value = (String)values.elementAt(i);
-                String oValue = (String)other.values.elementAt(i);
+                // BEGIN android-changed
+                String value = elems.getValue(i);
+                String oValue = other.elems.getValue(i);
+                // END android-changed
 
                 if (!equivalentStrings(value, oValue))
                 {
@@ -930,9 +942,9 @@
         isHashCodeCalculated = true;
 
         // this needs to be order independent, like equals
-        for (int i = 0; i != ordering.size(); i += 1)
+        for (int i = 0; i != elems.size(); i += 1)
         {
-            String value = (String)values.elementAt(i);
+            String value = (String)elems.getValue(i);
 
             value = canonicalize(value);
             value = stripInternalSpaces(value);
@@ -976,9 +988,11 @@
             return false;
         }
 
-        int      orderingSize = ordering.size();
+        // BEGIN android-changed
+        int      orderingSize = elems.size();
 
-        if (orderingSize != other.ordering.size())
+        if (orderingSize != other.elems.size())
+            // END android-changed
         {
             return false;
         }
@@ -986,7 +1000,9 @@
         boolean[] indexes = new boolean[orderingSize];
         int       start, end, delta;
 
-        if (ordering.elementAt(0).equals(other.ordering.elementAt(0)))   // guess forward
+        // BEGIN android-changed
+        if (elems.getKey(0).equals(other.elems.getKey(0)))   // guess forward
+        // END android-changed
         {
             start = 0;
             end = orderingSize;
@@ -1002,8 +1018,10 @@
         for (int i = start; i != end; i += delta)
         {
             boolean              found = false;
-            DERObjectIdentifier  oid = (DERObjectIdentifier)ordering.elementAt(i);
-            String               value = (String)values.elementAt(i);
+            // BEGIN android-changed
+            DERObjectIdentifier  oid = elems.getKey(i);
+            String               value = elems.getValue(i);
+            // END android-changed
 
             for (int j = 0; j < orderingSize; j++)
             {
@@ -1012,11 +1030,15 @@
                     continue;
                 }
 
-                DERObjectIdentifier oOid = (DERObjectIdentifier)other.ordering.elementAt(j);
+                // BEGIN android-changed
+                DERObjectIdentifier oOid = other.elems.getKey(j);
+                // END android-changed
 
                 if (oid.equals(oOid))
                 {
-                    String oValue = (String)other.values.elementAt(j);
+                    // BEGIN android-changed
+                    String oValue = other.elems.getValue(j);
+                    // END android-changed
 
                     if (equivalentStrings(value, oValue))
                     {
@@ -1181,28 +1203,36 @@
 
         StringBuffer ava = null;
 
-        for (int i = 0; i < ordering.size(); i++)
+        // BEGIN android-changed
+        for (int i = 0; i < elems.size(); i++)
+        // END android-changed
         {
-            if (((Boolean)added.elementAt(i)).booleanValue())
+            if (elems.getAdded(i))
             {
                 ava.append('+');
                 appendValue(ava, oidSymbols,
-                    (DERObjectIdentifier)ordering.elementAt(i),
-                    (String)values.elementAt(i));
+                    // BEGIN android-changed
+                    elems.getKey(i),
+                    elems.getValue(i));
+                    // END android-changed
             }
             else
             {
                 ava = new StringBuffer();
                 appendValue(ava, oidSymbols,
-                    (DERObjectIdentifier)ordering.elementAt(i),
-                    (String)values.elementAt(i));
+                    // BEGIN android-changed
+                    elems.getKey(i),
+                    elems.getValue(i));
+                    // END android-changed
                 components.addElement(ava);
             }
         }
 
         if (reverse)
         {
-            for (int i = components.size() - 1; i >= 0; i--)
+            // BEGIN android-changed
+            for (int i = elems.size() - 1; i >= 0; i--)
+            // END android-changed
             {
                 if (first)
                 {
diff -Naur bcprov-jdk16-145.orig/org/bouncycastle/asn1/x509/X509NameElementList.java bcprov-jdk16-145/org/bouncycastle/asn1/x509/X509NameElementList.java
--- bcprov-jdk16-145.orig/org/bouncycastle/asn1/x509/X509NameElementList.java	1970-01-01 00:00:00.000000000 +0000
+++ bcprov-jdk16-145/org/bouncycastle/asn1/x509/X509NameElementList.java	2011-09-01 17:21:06.000000000 +0000
@@ -0,0 +1,206 @@
+package org.bouncycastle.asn1.x509;
+
+import java.util.ArrayList;
+import java.util.BitSet;
+import org.bouncycastle.asn1.DERObjectIdentifier;
+
+// BEGIN android-note
+// This class was extracted from X509Name as a way to keep the element
+// list in a more controlled fashion.
+// END android-note
+
+/**
+ * List of elements of an X509 name. Each element has a key, a value, and
+ * an "added" flag.
+ */
+public class X509NameElementList {
+    /** null-ok; key #0 */
+    private DERObjectIdentifier key0;
+    
+    /** null-ok; key #1 */
+    private DERObjectIdentifier key1;
+
+    /** null-ok; key #2 */
+    private DERObjectIdentifier key2;
+
+    /** null-ok; key #3 */
+    private DERObjectIdentifier key3;
+    
+    /** null-ok; value #0 */
+    private String value0;
+    
+    /** null-ok; value #1 */
+    private String value1;
+
+    /** null-ok; value #2 */
+    private String value2;
+
+    /** null-ok; value #3 */
+    private String value3;
+    
+    /**
+     * null-ok; array of additional keys and values, alternating
+     * key then value, etc. 
+     */
+    private ArrayList<Object> rest;
+
+    /** bit vector for all the "added" bits */
+    private BitSet added = new BitSet();
+
+    /** &gt;= 0; number of elements in the list */
+    private int size;
+
+    // Note: Default public constructor.
+    
+    /**
+     * Adds an element. The "added" flag is set to false for the element.
+     * 
+     * @param key non-null; the key
+     * @param value non-null; the value
+     */
+    public void add(DERObjectIdentifier key, String value) {
+        add(key, value, false);
+    }
+
+    /**
+     * Adds an element.
+     * 
+     * @param key non-null; the key
+     * @param value non-null; the value
+     * @param added the added bit
+     */
+    public void add(DERObjectIdentifier key, String value, boolean added) {
+        if (key == null) {
+            throw new NullPointerException("key == null");
+        }
+
+        if (value == null) {
+            throw new NullPointerException("value == null");
+        }
+
+        int sz = size;
+
+        switch (sz) {
+            case 0: {
+                key0 = key;
+                value0 = value;
+                break;
+            }
+            case 1: {
+                key1 = key;
+                value1 = value;
+                break;
+            }
+            case 2: {
+                key2 = key;
+                value2 = value;
+                break;
+            }
+            case 3: {
+                key3 = key;
+                value3 = value;
+                break;
+            }
+            case 4: {
+                // Do initial allocation of rest.
+                rest = new ArrayList<Object>();
+                // Fall through...
+            }
+            default: {
+                rest.add(key);
+                rest.add(value);
+                break;
+            }
+        }
+
+        if (added) {
+            this.added.set(sz);
+        }
+        
+        size = sz + 1;
+    }
+
+    /**
+     * Sets the "added" flag on the most recently added element.
+     */
+    public void setLastAddedFlag() {
+        added.set(size - 1);
+    }
+
+    /**
+     * Gets the number of elements in this instance.
+     */
+    public int size() {
+        return size;
+    }
+    
+    /**
+     * Gets the nth key.
+     * 
+     * @param n index
+     * @return non-null; the nth key
+     */
+    public DERObjectIdentifier getKey(int n) {
+        if ((n < 0) || (n >= size)) {
+            throw new IndexOutOfBoundsException(Integer.toString(n));
+        }
+
+        switch (n) {
+            case 0: return key0;
+            case 1: return key1;
+            case 2: return key2;
+            case 3: return key3;
+            default: return (DERObjectIdentifier) rest.get((n - 4) * 2);
+        }
+    }
+
+    /**
+     * Gets the nth value.
+     * 
+     * @param n index
+     * @return non-null; the nth value
+     */
+    public String getValue(int n) {
+        if ((n < 0) || (n >= size)) {
+            throw new IndexOutOfBoundsException(Integer.toString(n));
+        }
+
+        switch (n) {
+            case 0: return value0;
+            case 1: return value1;
+            case 2: return value2;
+            case 3: return value3;
+            default: return (String) rest.get(((n - 4) * 2) + 1);
+        }
+    }
+
+    /**
+     * Gets the nth added flag bit.
+     * 
+     * @param n index
+     * @return the nth added flag bit
+     */
+    public boolean getAdded(int n) {
+        if ((n < 0) || (n >= size)) {
+            throw new IndexOutOfBoundsException(Integer.toString(n));
+        }
+
+        return added.get(n);
+    }
+
+    /**
+     * Constructs and returns a new instance which consists of the
+     * elements of this one in reverse order
+     * 
+     * @return non-null; the reversed instance
+     */
+    public X509NameElementList reverse() {
+        X509NameElementList result = new X509NameElementList();
+            
+        for (int i = size - 1; i >= 0; i--) {
+            result.add(getKey(i), getValue(i), getAdded(i));
+        }
+
+        return result;
+    }
+}
diff -Naur bcprov-jdk16-145.orig/org/bouncycastle/asn1/x509/X509NameTokenizer.java bcprov-jdk16-145/org/bouncycastle/asn1/x509/X509NameTokenizer.java
--- bcprov-jdk16-145.orig/org/bouncycastle/asn1/x509/X509NameTokenizer.java	2010-01-11 21:46:14.000000000 +0000
+++ bcprov-jdk16-145/org/bouncycastle/asn1/x509/X509NameTokenizer.java	2011-09-01 17:21:06.000000000 +0000
@@ -58,6 +58,17 @@
                 }
                 else
                 {
+                    // BEGIN android-added
+                    // copied from a newer version of BouncyCastle
+                    if (c == '#' && buf.charAt(buf.length() - 1) == '=')
+                    {
+                        buf.append('\\');
+                    }
+                    else if (c == '+' && seperator != '+')
+                    {
+                        buf.append('\\');
+                    }
+                    // END android-added
                     buf.append(c);
                 }
                 escaped = false;
@@ -96,4 +107,4 @@
         index = end;
         return buf.toString().trim();
     }
-}
+}
\ No newline at end of file
diff -Naur bcprov-jdk16-145.orig/org/bouncycastle/crypto/PBEParametersGenerator.java bcprov-jdk16-145/org/bouncycastle/crypto/PBEParametersGenerator.java
--- bcprov-jdk16-145.orig/org/bouncycastle/crypto/PBEParametersGenerator.java	2010-01-11 21:46:14.000000000 +0000
+++ bcprov-jdk16-145/org/bouncycastle/crypto/PBEParametersGenerator.java	2011-09-01 17:21:06.000000000 +0000
@@ -136,7 +136,8 @@
     public static byte[] PKCS12PasswordToBytes(
         char[]  password)
     {
-        if (password.length > 0)
+        // BEGIN android-changed
+        if (password != null && password.length > 0)
         {
                                        // +1 for extra 2 pad bytes.
             byte[]  bytes = new byte[(password.length + 1) * 2];
@@ -153,5 +154,6 @@
         {
             return new byte[0];
         }
+        // END android-changed
     }
 }
diff -Naur bcprov-jdk16-145.orig/org/bouncycastle/crypto/digests/OpenSSLDigest.java bcprov-jdk16-145/org/bouncycastle/crypto/digests/OpenSSLDigest.java
--- bcprov-jdk16-145.orig/org/bouncycastle/crypto/digests/OpenSSLDigest.java	1970-01-01 00:00:00.000000000 +0000
+++ bcprov-jdk16-145/org/bouncycastle/crypto/digests/OpenSSLDigest.java	2011-09-01 17:21:06.000000000 +0000
@@ -0,0 +1,122 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.bouncycastle.crypto.digests;
+
+import org.apache.harmony.xnet.provider.jsse.NativeCrypto;
+import org.bouncycastle.crypto.ExtendedDigest;
+
+/**
+ * Implements the BouncyCastle Digest interface using OpenSSL's EVP API.
+ */
+public class OpenSSLDigest implements ExtendedDigest {
+
+    /**
+     * Holds the standard name of the hashing algorithm, e.g. "SHA-1";
+     */
+    private final String algorithm;
+
+    /**
+     * Holds the OpenSSL name of the hashing algorithm, e.g. "sha1";
+     */
+    private final String openssl;
+
+    /**
+     * Holds a pointer to the native message digest context.
+     */
+    private int ctx;
+
+    /**
+     * Holds a dummy buffer for writing single bytes to the digest.
+     */
+    private final byte[] singleByte = new byte[1];
+
+    /**
+     * Creates a new OpenSSLMessageDigest instance for the given algorithm
+     * name.
+     *
+     * @param algorithm The standard name of the algorithm, e.g. "SHA-1".
+     * @param algorithm The name of the openssl algorithm, e.g. "sha1".
+     */
+    private OpenSSLDigest(String algorithm, String openssl) {
+        this.algorithm = algorithm;
+        this.openssl = openssl;
+        ctx = NativeCrypto.EVP_MD_CTX_create();
+        try {
+            NativeCrypto.EVP_DigestInit(ctx, openssl);
+        } catch (Exception ex) {
+            throw new RuntimeException(ex.getMessage() + " (" + algorithm + ")");
+        }
+    }
+
+    public int doFinal(byte[] out, int outOff) {
+        int i = NativeCrypto.EVP_DigestFinal(ctx, out, outOff);
+        reset();
+        return i;
+    }
+
+    public String getAlgorithmName() {
+        return algorithm;
+    }
+
+    public int getDigestSize() {
+        return NativeCrypto.EVP_MD_CTX_size(ctx);
+    }
+
+    public int getByteLength() {
+        return NativeCrypto.EVP_MD_CTX_block_size(ctx);
+    }
+
+    public void reset() {
+        NativeCrypto.EVP_DigestInit(ctx, openssl);
+    }
+
+    public void update(byte in) {
+        singleByte[0] = in;
+        NativeCrypto.EVP_DigestUpdate(ctx, singleByte, 0, 1);
+    }
+
+    public void update(byte[] in, int inOff, int len) {
+        NativeCrypto.EVP_DigestUpdate(ctx, in, inOff, len);
+    }
+
+    @Override
+    protected void finalize() throws Throwable {
+        super.finalize();
+        NativeCrypto.EVP_MD_CTX_destroy(ctx);
+        ctx = 0;
+    }
+
+    public static class MD5 extends OpenSSLDigest {
+        public MD5() { super("MD5", "md5"); }
+    }
+
+    public static class SHA1 extends OpenSSLDigest {
+        public SHA1() { super("SHA-1", "sha1"); }
+    }
+
+    public static class SHA256 extends OpenSSLDigest {
+        public SHA256() { super("SHA-256", "sha256"); }
+    }
+
+    public static class SHA384 extends OpenSSLDigest {
+        public SHA384() { super("SHA-384", "sha384"); }
+    }
+
+    public static class SHA512 extends OpenSSLDigest {
+        public SHA512() { super("SHA-512", "sha512"); }
+    }
+}
diff -Naur bcprov-jdk16-145.orig/org/bouncycastle/crypto/engines/RC2Engine.java bcprov-jdk16-145/org/bouncycastle/crypto/engines/RC2Engine.java
--- bcprov-jdk16-145.orig/org/bouncycastle/crypto/engines/RC2Engine.java	2010-01-11 21:46:14.000000000 +0000
+++ bcprov-jdk16-145/org/bouncycastle/crypto/engines/RC2Engine.java	2011-09-01 17:21:06.000000000 +0000
@@ -313,4 +313,4 @@
         out[outOff + 6] = (byte)x76;
         out[outOff + 7] = (byte)(x76 >> 8);
     }
-}
+}
\ No newline at end of file
diff -Naur bcprov-jdk16-145.orig/org/bouncycastle/crypto/macs/HMac.java bcprov-jdk16-145/org/bouncycastle/crypto/macs/HMac.java
--- bcprov-jdk16-145.orig/org/bouncycastle/crypto/macs/HMac.java	2010-01-11 21:46:14.000000000 +0000
+++ bcprov-jdk16-145/org/bouncycastle/crypto/macs/HMac.java	2011-09-01 17:21:06.000000000 +0000
@@ -32,23 +32,23 @@
     {
         blockLengths = new Hashtable();
         
-        blockLengths.put("GOST3411", new Integer(32));
+        blockLengths.put("GOST3411", Integer.valueOf(32));
         
-        blockLengths.put("MD2", new Integer(16));
-        blockLengths.put("MD4", new Integer(64));
-        blockLengths.put("MD5", new Integer(64));
-        
-        blockLengths.put("RIPEMD128", new Integer(64));
-        blockLengths.put("RIPEMD160", new Integer(64));
-        
-        blockLengths.put("SHA-1", new Integer(64));
-        blockLengths.put("SHA-224", new Integer(64));
-        blockLengths.put("SHA-256", new Integer(64));
-        blockLengths.put("SHA-384", new Integer(128));
-        blockLengths.put("SHA-512", new Integer(128));
+        blockLengths.put("MD2", Integer.valueOf(16));
+        blockLengths.put("MD4", Integer.valueOf(64));
+        blockLengths.put("MD5", Integer.valueOf(64));
+        
+        blockLengths.put("RIPEMD128", Integer.valueOf(64));
+        blockLengths.put("RIPEMD160", Integer.valueOf(64));
+        
+        blockLengths.put("SHA-1", Integer.valueOf(64));
+        blockLengths.put("SHA-224", Integer.valueOf(64));
+        blockLengths.put("SHA-256", Integer.valueOf(64));
+        blockLengths.put("SHA-384", Integer.valueOf(128));
+        blockLengths.put("SHA-512", Integer.valueOf(128));
         
-        blockLengths.put("Tiger", new Integer(64));
-        blockLengths.put("Whirlpool", new Integer(64));
+        blockLengths.put("Tiger", Integer.valueOf(64));
+        blockLengths.put("Whirlpool", Integer.valueOf(64));
     }
     
     private static int getByteLength(
diff -Naur bcprov-jdk16-145.orig/org/bouncycastle/crypto/signers/RSADigestSigner.java bcprov-jdk16-145/org/bouncycastle/crypto/signers/RSADigestSigner.java
--- bcprov-jdk16-145.orig/org/bouncycastle/crypto/signers/RSADigestSigner.java	2010-01-11 21:46:14.000000000 +0000
+++ bcprov-jdk16-145/org/bouncycastle/crypto/signers/RSADigestSigner.java	2011-09-01 17:21:06.000000000 +0000
@@ -46,8 +46,10 @@
         oidMap.put("SHA-384", NISTObjectIdentifiers.id_sha384);
         oidMap.put("SHA-512", NISTObjectIdentifiers.id_sha512);
 
-        oidMap.put("MD2", PKCSObjectIdentifiers.md2);
-        oidMap.put("MD4", PKCSObjectIdentifiers.md4);
+        // BEGIN android-removed
+        // oidMap.put("MD2", PKCSObjectIdentifiers.md2);
+        // oidMap.put("MD4", PKCSObjectIdentifiers.md4);
+        // END android-removed
         oidMap.put("MD5", PKCSObjectIdentifiers.md5);
     }
 
diff -Naur bcprov-jdk16-145.orig/org/bouncycastle/crypto/util/PrivateKeyFactory.java bcprov-jdk16-145/org/bouncycastle/crypto/util/PrivateKeyFactory.java
--- bcprov-jdk16-145.orig/org/bouncycastle/crypto/util/PrivateKeyFactory.java	2010-01-11 21:46:14.000000000 +0000
+++ bcprov-jdk16-145/org/bouncycastle/crypto/util/PrivateKeyFactory.java	2011-09-01 17:21:06.000000000 +0000
@@ -7,31 +7,39 @@
 import org.bouncycastle.asn1.DERInteger;
 import org.bouncycastle.asn1.DERObject;
 import org.bouncycastle.asn1.DERObjectIdentifier;
-import org.bouncycastle.asn1.nist.NISTNamedCurves;
-import org.bouncycastle.asn1.oiw.ElGamalParameter;
+// BEGIN android-removed
+// import org.bouncycastle.asn1.nist.NISTNamedCurves;
+// import org.bouncycastle.asn1.oiw.ElGamalParameter;
+// END android-removed
 import org.bouncycastle.asn1.oiw.OIWObjectIdentifiers;
 import org.bouncycastle.asn1.pkcs.DHParameter;
 import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
 import org.bouncycastle.asn1.pkcs.PrivateKeyInfo;
 import org.bouncycastle.asn1.pkcs.RSAPrivateKeyStructure;
-import org.bouncycastle.asn1.sec.ECPrivateKeyStructure;
-import org.bouncycastle.asn1.sec.SECNamedCurves;
-import org.bouncycastle.asn1.teletrust.TeleTrusTNamedCurves;
+// BEGIN android-removed
+// import org.bouncycastle.asn1.sec.ECPrivateKeyStructure;
+// import org.bouncycastle.asn1.sec.SECNamedCurves;
+// import org.bouncycastle.asn1.teletrust.TeleTrusTNamedCurves;
+// END android-removed
 import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
 import org.bouncycastle.asn1.x509.DSAParameter;
-import org.bouncycastle.asn1.x9.X962NamedCurves;
-import org.bouncycastle.asn1.x9.X962Parameters;
-import org.bouncycastle.asn1.x9.X9ECParameters;
-import org.bouncycastle.asn1.x9.X9ObjectIdentifiers;
+// BEGIN android-removed
+// import org.bouncycastle.asn1.x9.X962NamedCurves;
+// import org.bouncycastle.asn1.x9.X962Parameters;
+// import org.bouncycastle.asn1.x9.X9ECParameters;
+// import org.bouncycastle.asn1.x9.X9ObjectIdentifiers;
+// END android-removed
 import org.bouncycastle.crypto.params.AsymmetricKeyParameter;
 import org.bouncycastle.crypto.params.DHParameters;
 import org.bouncycastle.crypto.params.DHPrivateKeyParameters;
 import org.bouncycastle.crypto.params.DSAParameters;
 import org.bouncycastle.crypto.params.DSAPrivateKeyParameters;
-import org.bouncycastle.crypto.params.ECDomainParameters;
-import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
-import org.bouncycastle.crypto.params.ElGamalParameters;
-import org.bouncycastle.crypto.params.ElGamalPrivateKeyParameters;
+// BEGIN android-removed
+// import org.bouncycastle.crypto.params.ECDomainParameters;
+// import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
+// import org.bouncycastle.crypto.params.ElGamalParameters;
+// import org.bouncycastle.crypto.params.ElGamalPrivateKeyParameters;
+// END android-removed
 import org.bouncycastle.crypto.params.RSAPrivateCrtKeyParameters;
 
 import java.io.IOException;
@@ -113,75 +121,77 @@
 
             return new DHPrivateKeyParameters(derX.getValue(), dhParams);
         }
-        else if (algId.getObjectId().equals(OIWObjectIdentifiers.elGamalAlgorithm))
-        {
-            ElGamalParameter    params = new ElGamalParameter((ASN1Sequence)keyInfo.getAlgorithmId().getParameters());
-            DERInteger          derX = (DERInteger)keyInfo.getPrivateKey();
-
-            return new ElGamalPrivateKeyParameters(derX.getValue(), new ElGamalParameters(params.getP(), params.getG()));
-        }
-        else if (algId.getObjectId().equals(X9ObjectIdentifiers.id_dsa))
-        {
-            DERInteger derX = (DERInteger)keyInfo.getPrivateKey();
-            DEREncodable de = keyInfo.getAlgorithmId().getParameters();
-
-            DSAParameters parameters = null;
-            if (de != null)
-            {
-                DSAParameter params = DSAParameter.getInstance(de.getDERObject());
-                parameters = new DSAParameters(params.getP(), params.getQ(), params.getG());
-            }
-
-            return new DSAPrivateKeyParameters(derX.getValue(), parameters);
-        }
-        else if (algId.getObjectId().equals(X9ObjectIdentifiers.id_ecPublicKey))
-        {
-            X962Parameters      params = new X962Parameters((DERObject)keyInfo.getAlgorithmId().getParameters());
-            ECDomainParameters  dParams = null;
-            
-            if (params.isNamedCurve())
-            {
-                DERObjectIdentifier oid = (DERObjectIdentifier)params.getParameters();
-                X9ECParameters      ecP = X962NamedCurves.getByOID(oid);
-
-                if (ecP == null)
-                {
-                    ecP = SECNamedCurves.getByOID(oid);
-
-                    if (ecP == null)
-                    {
-                        ecP = NISTNamedCurves.getByOID(oid);
-
-                        if (ecP == null)
-                        {
-                            ecP = TeleTrusTNamedCurves.getByOID(oid);
-                        }
-                    }
-                }
-
-                dParams = new ECDomainParameters(
-                                            ecP.getCurve(),
-                                            ecP.getG(),
-                                            ecP.getN(),
-                                            ecP.getH(),
-                                            ecP.getSeed());
-            }
-            else
-            {
-                X9ECParameters ecP = new X9ECParameters(
-                            (ASN1Sequence)params.getParameters());
-                dParams = new ECDomainParameters(
-                                            ecP.getCurve(),
-                                            ecP.getG(),
-                                            ecP.getN(),
-                                            ecP.getH(),
-                                            ecP.getSeed());
-            }
-
-            ECPrivateKeyStructure   ec = new ECPrivateKeyStructure((ASN1Sequence)keyInfo.getPrivateKey());
-
-            return new ECPrivateKeyParameters(ec.getKey(), dParams);
-        }
+        // BEGIN android-removed
+        // else if (algId.getObjectId().equals(OIWObjectIdentifiers.elGamalAlgorithm))
+        // {
+        //     ElGamalParameter    params = new ElGamalParameter((ASN1Sequence)keyInfo.getAlgorithmId().getParameters());
+        //     DERInteger          derX = (DERInteger)keyInfo.getPrivateKey();
+        //
+        //     return new ElGamalPrivateKeyParameters(derX.getValue(), new ElGamalParameters(params.getP(), params.getG()));
+        // }
+        // else if (algId.getObjectId().equals(X9ObjectIdentifiers.id_dsa))
+        // {
+        //     DERInteger derX = (DERInteger)keyInfo.getPrivateKey();
+        //     DEREncodable de = keyInfo.getAlgorithmId().getParameters();
+        //
+        //     DSAParameters parameters = null;
+        //     if (de != null)
+        //     {
+        //         DSAParameter params = DSAParameter.getInstance(de.getDERObject());
+        //         parameters = new DSAParameters(params.getP(), params.getQ(), params.getG());
+        //     }
+        //
+        //     return new DSAPrivateKeyParameters(derX.getValue(), parameters);
+        // }
+        // else if (algId.getObjectId().equals(X9ObjectIdentifiers.id_ecPublicKey))
+        // {
+        //     X962Parameters      params = new X962Parameters((DERObject)keyInfo.getAlgorithmId().getParameters());
+        //     ECDomainParameters  dParams = null;
+        //
+        //     if (params.isNamedCurve())
+        //     {
+        //         DERObjectIdentifier oid = (DERObjectIdentifier)params.getParameters();
+        //         X9ECParameters      ecP = X962NamedCurves.getByOID(oid);
+        //
+        //         if (ecP == null)
+        //         {
+        //             ecP = SECNamedCurves.getByOID(oid);
+        //
+        //             if (ecP == null)
+        //             {
+        //                 ecP = NISTNamedCurves.getByOID(oid);
+        //
+        //                 if (ecP == null)
+        //                 {
+        //                     ecP = TeleTrusTNamedCurves.getByOID(oid);
+        //                 }
+        //             }
+        //         }
+        //
+        //         dParams = new ECDomainParameters(
+        //                                     ecP.getCurve(),
+        //                                     ecP.getG(),
+        //                                     ecP.getN(),
+        //                                     ecP.getH(),
+        //                                     ecP.getSeed());
+        //     }
+        //     else
+        //     {
+        //         X9ECParameters ecP = new X9ECParameters(
+        //                     (ASN1Sequence)params.getParameters());
+        //         dParams = new ECDomainParameters(
+        //                                     ecP.getCurve(),
+        //                                     ecP.getG(),
+        //                                     ecP.getN(),
+        //                                     ecP.getH(),
+        //                                     ecP.getSeed());
+        //     }
+        //
+        //     ECPrivateKeyStructure   ec = new ECPrivateKeyStructure((ASN1Sequence)keyInfo.getPrivateKey());
+        //
+        //     return new ECPrivateKeyParameters(ec.getKey(), dParams);
+        // }
+        // END android-removed
         else
         {
             throw new RuntimeException("algorithm identifier in key not recognised");
diff -Naur bcprov-jdk16-145.orig/org/bouncycastle/crypto/util/PublicKeyFactory.java bcprov-jdk16-145/org/bouncycastle/crypto/util/PublicKeyFactory.java
--- bcprov-jdk16-145.orig/org/bouncycastle/crypto/util/PublicKeyFactory.java	2010-01-11 21:46:14.000000000 +0000
+++ bcprov-jdk16-145/org/bouncycastle/crypto/util/PublicKeyFactory.java	2011-09-01 17:21:06.000000000 +0000
@@ -10,32 +10,40 @@
 import org.bouncycastle.asn1.DERObject;
 import org.bouncycastle.asn1.DERObjectIdentifier;
 import org.bouncycastle.asn1.DEROctetString;
-import org.bouncycastle.asn1.nist.NISTNamedCurves;
-import org.bouncycastle.asn1.oiw.ElGamalParameter;
+// BEGIN android-removed
+// import org.bouncycastle.asn1.nist.NISTNamedCurves;
+// import org.bouncycastle.asn1.oiw.ElGamalParameter;
+// END android-removed
 import org.bouncycastle.asn1.oiw.OIWObjectIdentifiers;
 import org.bouncycastle.asn1.pkcs.DHParameter;
 import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
-import org.bouncycastle.asn1.sec.SECNamedCurves;
-import org.bouncycastle.asn1.teletrust.TeleTrusTNamedCurves;
+// BEGIN android-removed
+// import org.bouncycastle.asn1.sec.SECNamedCurves;
+// import org.bouncycastle.asn1.teletrust.TeleTrusTNamedCurves;
+// END android-removed
 import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
 import org.bouncycastle.asn1.x509.DSAParameter;
 import org.bouncycastle.asn1.x509.RSAPublicKeyStructure;
 import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;
 import org.bouncycastle.asn1.x509.X509ObjectIdentifiers;
-import org.bouncycastle.asn1.x9.X962NamedCurves;
-import org.bouncycastle.asn1.x9.X962Parameters;
-import org.bouncycastle.asn1.x9.X9ECParameters;
-import org.bouncycastle.asn1.x9.X9ECPoint;
+// BEGIN android-removed
+// import org.bouncycastle.asn1.x9.X962NamedCurves;
+// import org.bouncycastle.asn1.x9.X962Parameters;
+// import org.bouncycastle.asn1.x9.X9ECParameters;
+// import org.bouncycastle.asn1.x9.X9ECPoint;
+// END android-removed
 import org.bouncycastle.asn1.x9.X9ObjectIdentifiers;
 import org.bouncycastle.crypto.params.AsymmetricKeyParameter;
 import org.bouncycastle.crypto.params.DHParameters;
 import org.bouncycastle.crypto.params.DHPublicKeyParameters;
 import org.bouncycastle.crypto.params.DSAParameters;
 import org.bouncycastle.crypto.params.DSAPublicKeyParameters;
-import org.bouncycastle.crypto.params.ECDomainParameters;
-import org.bouncycastle.crypto.params.ECPublicKeyParameters;
-import org.bouncycastle.crypto.params.ElGamalParameters;
-import org.bouncycastle.crypto.params.ElGamalPublicKeyParameters;
+// BEGIN android-removed
+// import org.bouncycastle.crypto.params.ECDomainParameters;
+// import org.bouncycastle.crypto.params.ECPublicKeyParameters;
+// import org.bouncycastle.crypto.params.ElGamalParameters;
+// import org.bouncycastle.crypto.params.ElGamalPublicKeyParameters;
+// END android-removed
 import org.bouncycastle.crypto.params.RSAKeyParameters;
 
 import java.io.IOException;
@@ -112,13 +120,15 @@
 
             return new DHPublicKeyParameters(derY.getValue(), dhParams);
         }
-        else if (algId.getObjectId().equals(OIWObjectIdentifiers.elGamalAlgorithm))
-        {
-            ElGamalParameter    params = new ElGamalParameter((ASN1Sequence)keyInfo.getAlgorithmId().getParameters());
-            DERInteger          derY = (DERInteger)keyInfo.getPublicKey();
-
-            return new ElGamalPublicKeyParameters(derY.getValue(), new ElGamalParameters(params.getP(), params.getG()));
-        }
+        // BEGIN android-removed
+        // else if (algId.getObjectId().equals(OIWObjectIdentifiers.elGamalAlgorithm))
+        // {
+        //     ElGamalParameter    params = new ElGamalParameter((ASN1Sequence)keyInfo.getAlgorithmId().getParameters());
+        //     DERInteger          derY = (DERInteger)keyInfo.getPublicKey();
+        //
+        //     return new ElGamalPublicKeyParameters(derY.getValue(), new ElGamalParameters(params.getP(), params.getG()));
+        // }
+        // END android-removed
         else if (algId.getObjectId().equals(X9ObjectIdentifiers.id_dsa)
                  || algId.getObjectId().equals(OIWObjectIdentifiers.dsaWithSHA1))
         {
@@ -134,58 +144,60 @@
 
             return new DSAPublicKeyParameters(derY.getValue(), parameters);
         }
-        else if (algId.getObjectId().equals(X9ObjectIdentifiers.id_ecPublicKey))
-        {
-            X962Parameters      params = new X962Parameters((DERObject)keyInfo.getAlgorithmId().getParameters());
-            ECDomainParameters  dParams = null;
-            
-            if (params.isNamedCurve())
-            {
-                DERObjectIdentifier oid = (DERObjectIdentifier)params.getParameters();
-                X9ECParameters      ecP = X962NamedCurves.getByOID(oid);
-
-                if (ecP == null)
-                {
-                    ecP = SECNamedCurves.getByOID(oid);
-
-                    if (ecP == null)
-                    {
-                        ecP = NISTNamedCurves.getByOID(oid);
-
-                        if (ecP == null)
-                        {
-                            ecP = TeleTrusTNamedCurves.getByOID(oid);
-                        }
-                    }
-                }
-
-                dParams = new ECDomainParameters(
-                                            ecP.getCurve(),
-                                            ecP.getG(),
-                                            ecP.getN(),
-                                            ecP.getH(),
-                                            ecP.getSeed());
-            }
-            else
-            {
-                X9ECParameters ecP = new X9ECParameters(
-                            (ASN1Sequence)params.getParameters());
-                dParams = new ECDomainParameters(
-                                            ecP.getCurve(),
-                                            ecP.getG(),
-                                            ecP.getN(),
-                                            ecP.getH(),
-                                            ecP.getSeed());
-            }
-
-            DERBitString    bits = keyInfo.getPublicKeyData();
-            byte[]          data = bits.getBytes();
-            ASN1OctetString key = new DEROctetString(data);
-
-            X9ECPoint       derQ = new X9ECPoint(dParams.getCurve(), key);
-            
-            return new ECPublicKeyParameters(derQ.getPoint(), dParams);
-        }
+        // BEGIN android-removed
+        // else if (algId.getObjectId().equals(X9ObjectIdentifiers.id_ecPublicKey))
+        // {
+        //     X962Parameters      params = new X962Parameters((DERObject)keyInfo.getAlgorithmId().getParameters());
+        //     ECDomainParameters  dParams = null;
+        //
+        //     if (params.isNamedCurve())
+        //     {
+        //         DERObjectIdentifier oid = (DERObjectIdentifier)params.getParameters();
+        //         X9ECParameters      ecP = X962NamedCurves.getByOID(oid);
+        //
+        //         if (ecP == null)
+        //         {
+        //             ecP = SECNamedCurves.getByOID(oid);
+        //
+        //             if (ecP == null)
+        //             {
+        //                 ecP = NISTNamedCurves.getByOID(oid);
+        //
+        //                 if (ecP == null)
+        //                 {
+        //                     ecP = TeleTrusTNamedCurves.getByOID(oid);
+        //                 }
+        //             }
+        //         }
+        //
+        //         dParams = new ECDomainParameters(
+        //                                     ecP.getCurve(),
+        //                                     ecP.getG(),
+        //                                     ecP.getN(),
+        //                                     ecP.getH(),
+        //                                     ecP.getSeed());
+        //     }
+        //     else
+        //     {
+        //         X9ECParameters ecP = new X9ECParameters(
+        //                     (ASN1Sequence)params.getParameters());
+        //         dParams = new ECDomainParameters(
+        //                                     ecP.getCurve(),
+        //                                     ecP.getG(),
+        //                                     ecP.getN(),
+        //                                     ecP.getH(),
+        //                                     ecP.getSeed());
+        //     }
+        //
+        //     DERBitString    bits = keyInfo.getPublicKeyData();
+        //     byte[]          data = bits.getBytes();
+        //     ASN1OctetString key = new DEROctetString(data);
+        //
+        //     X9ECPoint       derQ = new X9ECPoint(dParams.getCurve(), key);
+        //
+        //     return new ECPublicKeyParameters(derQ.getPoint(), dParams);
+        // }
+        // END android-removed
         else
         {
             throw new RuntimeException("algorithm identifier in key not recognised");
diff -Naur bcprov-jdk16-145.orig/org/bouncycastle/jce/PKCS10CertificationRequest.java bcprov-jdk16-145/org/bouncycastle/jce/PKCS10CertificationRequest.java
--- bcprov-jdk16-145.orig/org/bouncycastle/jce/PKCS10CertificationRequest.java	2010-01-11 21:46:14.000000000 +0000
+++ bcprov-jdk16-145/org/bouncycastle/jce/PKCS10CertificationRequest.java	2011-09-01 17:21:06.000000000 +0000
@@ -78,8 +78,11 @@
 
     static
     {
-        algorithms.put("MD2WITHRSAENCRYPTION", new DERObjectIdentifier("1.2.840.113549.1.1.2"));
-        algorithms.put("MD2WITHRSA", new DERObjectIdentifier("1.2.840.113549.1.1.2"));
+        // BEGIN android-removed
+        // Dropping MD2
+        // algorithms.put("MD2WITHRSAENCRYPTION", new DERObjectIdentifier("1.2.840.113549.1.1.2"));
+        // algorithms.put("MD2WITHRSA", new DERObjectIdentifier("1.2.840.113549.1.1.2"));
+        // END android-removed
         algorithms.put("MD5WITHRSAENCRYPTION", new DERObjectIdentifier("1.2.840.113549.1.1.4"));
         algorithms.put("MD5WITHRSA", new DERObjectIdentifier("1.2.840.113549.1.1.4"));
         algorithms.put("RSAWITHMD5", new DERObjectIdentifier("1.2.840.113549.1.1.4"));
@@ -129,7 +132,10 @@
         oids.put(CryptoProObjectIdentifiers.gostR3411_94_with_gostR3410_2001, "GOST3411WITHECGOST3410");
         
         oids.put(new DERObjectIdentifier("1.2.840.113549.1.1.4"), "MD5WITHRSA");
-        oids.put(new DERObjectIdentifier("1.2.840.113549.1.1.2"), "MD2WITHRSA");
+        // BEGIN android-removed
+        // Dropping MD2
+        // oids.put(new DERObjectIdentifier("1.2.840.113549.1.1.2"), "MD2WITHRSA");
+        // END android-removed
         oids.put(new DERObjectIdentifier("1.2.840.10040.4.3"), "SHA1WITHDSA");
         oids.put(X9ObjectIdentifiers.ecdsa_with_SHA1, "SHA1WITHECDSA");
         oids.put(X9ObjectIdentifiers.ecdsa_with_SHA224, "SHA224WITHECDSA");
@@ -168,19 +174,29 @@
         //
         // explicit params
         //
-        AlgorithmIdentifier sha1AlgId = new AlgorithmIdentifier(OIWObjectIdentifiers.idSHA1, new DERNull());
+        // BEGIN android-changed
+        AlgorithmIdentifier sha1AlgId = new AlgorithmIdentifier(OIWObjectIdentifiers.idSHA1, DERNull.INSTANCE);
+        // END android-changed
         params.put("SHA1WITHRSAANDMGF1", creatPSSParams(sha1AlgId, 20));
 
-        AlgorithmIdentifier sha224AlgId = new AlgorithmIdentifier(NISTObjectIdentifiers.id_sha224, new DERNull());
+        // BEGIN android-changed
+        AlgorithmIdentifier sha224AlgId = new AlgorithmIdentifier(NISTObjectIdentifiers.id_sha224, DERNull.INSTANCE);
+        // END android-changed
         params.put("SHA224WITHRSAANDMGF1", creatPSSParams(sha224AlgId, 28));
 
-        AlgorithmIdentifier sha256AlgId = new AlgorithmIdentifier(NISTObjectIdentifiers.id_sha256, new DERNull());
+        // BEGIN android-changed
+        AlgorithmIdentifier sha256AlgId = new AlgorithmIdentifier(NISTObjectIdentifiers.id_sha256, DERNull.INSTANCE);
+        // END android-changed
         params.put("SHA256WITHRSAANDMGF1", creatPSSParams(sha256AlgId, 32));
 
-        AlgorithmIdentifier sha384AlgId = new AlgorithmIdentifier(NISTObjectIdentifiers.id_sha384, new DERNull());
+        // BEGIN android-changed
+        AlgorithmIdentifier sha384AlgId = new AlgorithmIdentifier(NISTObjectIdentifiers.id_sha384, DERNull.INSTANCE);
+        // END android-changed
         params.put("SHA384WITHRSAANDMGF1", creatPSSParams(sha384AlgId, 48));
 
-        AlgorithmIdentifier sha512AlgId = new AlgorithmIdentifier(NISTObjectIdentifiers.id_sha512, new DERNull());
+        // BEGIN android-changed
+        AlgorithmIdentifier sha512AlgId = new AlgorithmIdentifier(NISTObjectIdentifiers.id_sha512, DERNull.INSTANCE);
+        // END android-changed
         params.put("SHA512WITHRSAANDMGF1", creatPSSParams(sha512AlgId, 64));
     }
 
diff -Naur bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/BouncyCastleProvider.java bcprov-jdk16-145/org/bouncycastle/jce/provider/BouncyCastleProvider.java
--- bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/BouncyCastleProvider.java	2010-01-11 21:46:14.000000000 +0000
+++ bcprov-jdk16-145/org/bouncycastle/jce/provider/BouncyCastleProvider.java	2011-09-01 17:21:06.000000000 +0000
@@ -53,7 +53,12 @@
     private static final String SYMMETRIC_CIPHER_PACKAGE = "org.bouncycastle.jce.provider.symmetric.";
     private static final String[] SYMMETRIC_CIPHERS =
     {
-        "AES", "Camellia", "CAST5", "Grainv1", "Grain128", "IDEA", "Noekeon", "SEED"
+        // BEGIN android-removed
+        // "AES", "Camellia", "CAST5", "Grainv1", "Grain128", "IDEA", "Noekeon", "SEED"
+        // END android-removed
+        // BEGIN android-added
+        "AES",
+        // END android-added
     };
 
     /*
@@ -62,7 +67,9 @@
     private static final String ASYMMETRIC_CIPHER_PACKAGE = "org.bouncycastle.jce.provider.asymmetric.";
     private static final String[] ASYMMETRIC_CIPHERS =
     {
-        "EC"
+        // BEGIN android-removed
+        // "EC"
+        // END android-removed
     };
 
     /**
@@ -89,26 +96,28 @@
         loadAlgorithms(SYMMETRIC_CIPHER_PACKAGE, SYMMETRIC_CIPHERS);
         loadAlgorithms(ASYMMETRIC_CIPHER_PACKAGE, ASYMMETRIC_CIPHERS);
 
-        //
-        // X509Store
-        //
-        put("X509Store.CERTIFICATE/COLLECTION", "org.bouncycastle.jce.provider.X509StoreCertCollection");
-        put("X509Store.ATTRIBUTECERTIFICATE/COLLECTION", "org.bouncycastle.jce.provider.X509StoreAttrCertCollection");
-        put("X509Store.CRL/COLLECTION", "org.bouncycastle.jce.provider.X509StoreCRLCollection");
-        put("X509Store.CERTIFICATEPAIR/COLLECTION", "org.bouncycastle.jce.provider.X509StoreCertPairCollection");
-
-        put("X509Store.CERTIFICATE/LDAP", "org.bouncycastle.jce.provider.X509StoreLDAPCerts");
-        put("X509Store.CRL/LDAP", "org.bouncycastle.jce.provider.X509StoreLDAPCRLs");
-        put("X509Store.ATTRIBUTECERTIFICATE/LDAP", "org.bouncycastle.jce.provider.X509StoreLDAPAttrCerts");
-        put("X509Store.CERTIFICATEPAIR/LDAP", "org.bouncycastle.jce.provider.X509StoreLDAPCertPairs");
-        
-        //
-        // X509StreamParser
-        //
-        put("X509StreamParser.CERTIFICATE", "org.bouncycastle.jce.provider.X509CertParser");
-        put("X509StreamParser.ATTRIBUTECERTIFICATE", "org.bouncycastle.jce.provider.X509AttrCertParser");
-        put("X509StreamParser.CRL", "org.bouncycastle.jce.provider.X509CRLParser");
-        put("X509StreamParser.CERTIFICATEPAIR", "org.bouncycastle.jce.provider.X509CertPairParser");
+        // BEGIN android-removed
+        // //
+        // // X509Store
+        // //
+        // put("X509Store.CERTIFICATE/COLLECTION", "org.bouncycastle.jce.provider.X509StoreCertCollection");
+        // put("X509Store.ATTRIBUTECERTIFICATE/COLLECTION", "org.bouncycastle.jce.provider.X509StoreAttrCertCollection");
+        // put("X509Store.CRL/COLLECTION", "org.bouncycastle.jce.provider.X509StoreCRLCollection");
+        // put("X509Store.CERTIFICATEPAIR/COLLECTION", "org.bouncycastle.jce.provider.X509StoreCertPairCollection");
+        //
+        // put("X509Store.CERTIFICATE/LDAP", "org.bouncycastle.jce.provider.X509StoreLDAPCerts");
+        // put("X509Store.CRL/LDAP", "org.bouncycastle.jce.provider.X509StoreLDAPCRLs");
+        // put("X509Store.ATTRIBUTECERTIFICATE/LDAP", "org.bouncycastle.jce.provider.X509StoreLDAPAttrCerts");
+        // put("X509Store.CERTIFICATEPAIR/LDAP", "org.bouncycastle.jce.provider.X509StoreLDAPCertPairs");
+        //
+        // //
+        // // X509StreamParser
+        // //
+        // put("X509StreamParser.CERTIFICATE", "org.bouncycastle.jce.provider.X509CertParser");
+        // put("X509StreamParser.ATTRIBUTECERTIFICATE", "org.bouncycastle.jce.provider.X509AttrCertParser");
+        // put("X509StreamParser.CRL", "org.bouncycastle.jce.provider.X509CRLParser");
+        // put("X509StreamParser.CERTIFICATEPAIR", "org.bouncycastle.jce.provider.X509CertPairParser");
+        // END android-removed
 
 
         //
@@ -117,14 +126,24 @@
         put("KeyStore.BKS", "org.bouncycastle.jce.provider.JDKKeyStore");
         put("KeyStore.BouncyCastle", "org.bouncycastle.jce.provider.JDKKeyStore$BouncyCastleStore");
         put("KeyStore.PKCS12", "org.bouncycastle.jce.provider.JDKPKCS12KeyStore$BCPKCS12KeyStore");
-        put("KeyStore.BCPKCS12", "org.bouncycastle.jce.provider.JDKPKCS12KeyStore$BCPKCS12KeyStore");
-        put("KeyStore.PKCS12-DEF", "org.bouncycastle.jce.provider.JDKPKCS12KeyStore$DefPKCS12KeyStore");
-
-        put("KeyStore.PKCS12-3DES-40RC2", "org.bouncycastle.jce.provider.JDKPKCS12KeyStore$BCPKCS12KeyStore");
-        put("KeyStore.PKCS12-3DES-3DES", "org.bouncycastle.jce.provider.JDKPKCS12KeyStore$BCPKCS12KeyStore3DES");
-
-        put("KeyStore.PKCS12-DEF-3DES-40RC2", "org.bouncycastle.jce.provider.JDKPKCS12KeyStore$DefPKCS12KeyStore");
-        put("KeyStore.PKCS12-DEF-3DES-3DES", "org.bouncycastle.jce.provider.JDKPKCS12KeyStore$DefPKCS12KeyStore3DES");
+        // BEGIN android-changed
+        put("Alg.Alias.KeyStore.BCPKCS12", "PKCS12");
+        // END android-changed
+        // BEGIN android-removed
+        // put("KeyStore.PKCS12-DEF", "org.bouncycastle.jce.provider.JDKPKCS12KeyStore$DefPKCS12KeyStore");
+        // END android-removed
+
+        // BEGIN android-changed
+        put("Alg.Alias.KeyStore.PKCS12-3DES-40RC2", "PKCS12");
+        // END android-changed
+        // BEGIN android-removed
+        // put("KeyStore.PKCS12-3DES-3DES", "org.bouncycastle.jce.provider.JDKPKCS12KeyStore$BCPKCS12KeyStore3DES");
+        // END android-removed
+
+        // BEGIN android-removed
+        // put("KeyStore.PKCS12-DEF-3DES-40RC2", "org.bouncycastle.jce.provider.JDKPKCS12KeyStore$DefPKCS12KeyStore");
+        // put("KeyStore.PKCS12-DEF-3DES-3DES", "org.bouncycastle.jce.provider.JDKPKCS12KeyStore$DefPKCS12KeyStore3DES");
+        // END android-removed
 
         put("Alg.Alias.KeyStore.UBER", "BouncyCastle");
         put("Alg.Alias.KeyStore.BOUNCYCASTLE", "BouncyCastle");
@@ -141,44 +160,63 @@
         //
         put("AlgorithmParameterGenerator.DH", "org.bouncycastle.jce.provider.JDKAlgorithmParameterGenerator$DH");
         put("AlgorithmParameterGenerator.DSA", "org.bouncycastle.jce.provider.JDKAlgorithmParameterGenerator$DSA");
-        put("AlgorithmParameterGenerator.GOST3410", "org.bouncycastle.jce.provider.JDKAlgorithmParameterGenerator$GOST3410");
-        put("AlgorithmParameterGenerator.ELGAMAL", "org.bouncycastle.jce.provider.JDKAlgorithmParameterGenerator$ElGamal");
-        put("AlgorithmParameterGenerator.DES", "org.bouncycastle.jce.provider.JDKAlgorithmParameterGenerator$DES");
-        put("AlgorithmParameterGenerator.DESEDE", "org.bouncycastle.jce.provider.JDKAlgorithmParameterGenerator$DES");
-        put("AlgorithmParameterGenerator." + PKCSObjectIdentifiers.des_EDE3_CBC, "org.bouncycastle.jce.provider.JDKAlgorithmParameterGenerator$DES");
-        put("AlgorithmParameterGenerator." + OIWObjectIdentifiers.desCBC, "org.bouncycastle.jce.provider.JDKAlgorithmParameterGenerator$DES");
-        put("AlgorithmParameterGenerator.RC2", "org.bouncycastle.jce.provider.JDKAlgorithmParameterGenerator$RC2");
-        put("AlgorithmParameterGenerator.1.2.840.113549.3.2", "org.bouncycastle.jce.provider.JDKAlgorithmParameterGenerator$RC2");
+        // BEGIN android-removed
+        // put("AlgorithmParameterGenerator.GOST3410", "org.bouncycastle.jce.provider.JDKAlgorithmParameterGenerator$GOST3410");
+        // put("AlgorithmParameterGenerator.ELGAMAL", "org.bouncycastle.jce.provider.JDKAlgorithmParameterGenerator$ElGamal");
+        // put("AlgorithmParameterGenerator.DES", "org.bouncycastle.jce.provider.JDKAlgorithmParameterGenerator$DES");
+        // put("AlgorithmParameterGenerator.DESEDE", "org.bouncycastle.jce.provider.JDKAlgorithmParameterGenerator$DES");
+        // put("AlgorithmParameterGenerator." + PKCSObjectIdentifiers.des_EDE3_CBC, "org.bouncycastle.jce.provider.JDKAlgorithmParameterGenerator$DES");
+        // put("AlgorithmParameterGenerator." + OIWObjectIdentifiers.desCBC, "org.bouncycastle.jce.provider.JDKAlgorithmParameterGenerator$DES");
+        // put("AlgorithmParameterGenerator.RC2", "org.bouncycastle.jce.provider.JDKAlgorithmParameterGenerator$RC2");
+        // put("AlgorithmParameterGenerator.1.2.840.113549.3.2", "org.bouncycastle.jce.provider.JDKAlgorithmParameterGenerator$RC2");
+        // END android-removed
 
         put("Alg.Alias.AlgorithmParameterGenerator.DIFFIEHELLMAN", "DH");
-        put("Alg.Alias.AlgorithmParameterGenerator.GOST-3410", "GOST3410");
+        // BEGIN android-removed
+        // put("Alg.Alias.AlgorithmParameterGenerator.GOST-3410", "GOST3410");
+        // END android-removed
         //
         // algorithm parameters
         //
         put("AlgorithmParameters.OAEP", "org.bouncycastle.jce.provider.JDKAlgorithmParameters$OAEP");
-        put("AlgorithmParameters.PSS", "org.bouncycastle.jce.provider.JDKAlgorithmParameters$PSS");
+        // BEGIN android-removed
+        // put("AlgorithmParameters.PSS", "org.bouncycastle.jce.provider.JDKAlgorithmParameters$PSS");
+        // END android-removed
         put("AlgorithmParameters.DH", "org.bouncycastle.jce.provider.JDKAlgorithmParameters$DH");
         put("Alg.Alias.AlgorithmParameters.DIFFIEHELLMAN", "DH");
         put("AlgorithmParameters.DSA", "org.bouncycastle.jce.provider.JDKAlgorithmParameters$DSA");
-        put("AlgorithmParameters.ELGAMAL", "org.bouncycastle.jce.provider.JDKAlgorithmParameters$ElGamal");
-        put("AlgorithmParameters.IES", "org.bouncycastle.jce.provider.JDKAlgorithmParameters$IES");
+        // BEGIN android-removed
+        // put("AlgorithmParameters.ELGAMAL", "org.bouncycastle.jce.provider.JDKAlgorithmParameters$ElGamal");
+        // put("AlgorithmParameters.IES", "org.bouncycastle.jce.provider.JDKAlgorithmParameters$IES");
+        // END android-removed
         put("AlgorithmParameters.PKCS12PBE", "org.bouncycastle.jce.provider.JDKAlgorithmParameters$PKCS12PBE");
-        put("AlgorithmParameters." + PKCSObjectIdentifiers.des_EDE3_CBC, "org.bouncycastle.jce.provider.JDKAlgorithmParameters$IVAlgorithmParameters");
-        put("AlgorithmParameters." + PKCSObjectIdentifiers.id_PBKDF2, "org.bouncycastle.jce.provider.JDKAlgorithmParameters$PBKDF2");
-
-        put("AlgorithmParameters.GOST3410", "org.bouncycastle.jce.provider.JDKAlgorithmParameters$GOST3410");
-        put("Alg.Alias.AlgorithmParameters.GOST-3410", "GOST3410");
+        // BEGIN android-changed
+        // redundant with below
+        // put("Alg.Alias.AlgorithmParameters." + PKCSObjectIdentifiers.des_EDE3_CBC, "DESede");
+        // END android-changed
+        // BEGIN android-removed
+        // put("AlgorithmParameters." + PKCSObjectIdentifiers.id_PBKDF2, "org.bouncycastle.jce.provider.JDKAlgorithmParameters$PBKDF2");
+        //
+        // put("AlgorithmParameters.GOST3410", "org.bouncycastle.jce.provider.JDKAlgorithmParameters$GOST3410");
+        // put("Alg.Alias.AlgorithmParameters.GOST-3410", "GOST3410");
+        // END android-removed
         put("Alg.Alias.AlgorithmParameters.PBEWITHSHA1ANDRC2", "PKCS12PBE");
-        put("Alg.Alias.AlgorithmParameters.PBEWITHSHAAND3-KEYTRIPLEDES", "PKCS12PBE");
-        put("Alg.Alias.AlgorithmParameters.PBEWITHSHAAND2-KEYTRIPLEDES", "PKCS12PBE");
-        put("Alg.Alias.AlgorithmParameters.PBEWITHSHAANDRC2", "PKCS12PBE");
-        put("Alg.Alias.AlgorithmParameters.PBEWITHSHAANDRC4", "PKCS12PBE");
+        // BEGIN android-removed
+        // put("Alg.Alias.AlgorithmParameters.PBEWITHSHAAND3-KEYTRIPLEDES", "PKCS12PBE");
+        // put("Alg.Alias.AlgorithmParameters.PBEWITHSHAAND2-KEYTRIPLEDES", "PKCS12PBE");
+        // put("Alg.Alias.AlgorithmParameters.PBEWITHSHAANDRC2", "PKCS12PBE");
+        // put("Alg.Alias.AlgorithmParameters.PBEWITHSHAANDRC4", "PKCS12PBE");
+        // END android-removed
         put("Alg.Alias.AlgorithmParameters.PBEWITHSHAANDTWOFISH", "PKCS12PBE");
-        put("Alg.Alias.AlgorithmParameters.PBEWITHSHA1ANDRC2-CBC", "PKCS12PBE");
+        // BEGIN android-removed
+        // put("Alg.Alias.AlgorithmParameters.PBEWITHSHA1ANDRC2-CBC", "PKCS12PBE");
+        // END android-removed
         put("Alg.Alias.AlgorithmParameters.PBEWITHSHAAND3-KEYTRIPLEDES-CBC", "PKCS12PBE");
         put("Alg.Alias.AlgorithmParameters.PBEWITHSHAAND2-KEYTRIPLEDES-CBC", "PKCS12PBE");
-        put("Alg.Alias.AlgorithmParameters.PBEWITHSHAANDDES3KEY-CBC", "PKCS12PBE");
-        put("Alg.Alias.AlgorithmParameters.PBEWITHSHAANDDES2KEY-CBC", "PKCS12PBE");
+        // BEGIN android-removed
+        // put("Alg.Alias.AlgorithmParameters.PBEWITHSHAANDDES3KEY-CBC", "PKCS12PBE");
+        // put("Alg.Alias.AlgorithmParameters.PBEWITHSHAANDDES2KEY-CBC", "PKCS12PBE");
+        // END android-removed
         put("Alg.Alias.AlgorithmParameters.PBEWITHSHAAND40BITRC2-CBC", "PKCS12PBE");
         put("Alg.Alias.AlgorithmParameters.PBEWITHSHAAND40BITRC4", "PKCS12PBE");
         put("Alg.Alias.AlgorithmParameters.PBEWITHSHAAND128BITRC2-CBC", "PKCS12PBE");
@@ -192,7 +230,7 @@
         put("Alg.Alias.AlgorithmParameters.1.2.840.113549.1.12.1.5", "PKCS12PBE");
         put("Alg.Alias.AlgorithmParameters.1.2.840.113549.1.12.1.6", "PKCS12PBE");
         put("Alg.Alias.AlgorithmParameters.PBEWithSHAAnd3KeyTripleDES", "PKCS12PBE");
-
+        
         put("Alg.Alias.AlgorithmParameters." + BCObjectIdentifiers.bc_pbe_sha1_pkcs12_aes128_cbc.getId(), "PKCS12PBE");
         put("Alg.Alias.AlgorithmParameters." + BCObjectIdentifiers.bc_pbe_sha1_pkcs12_aes192_cbc.getId(), "PKCS12PBE");
         put("Alg.Alias.AlgorithmParameters." + BCObjectIdentifiers.bc_pbe_sha1_pkcs12_aes256_cbc.getId(), "PKCS12PBE");
@@ -202,22 +240,24 @@
 
         put("Alg.Alias.AlgorithmParameters." + PKCSObjectIdentifiers.id_RSAES_OAEP, "OAEP");
         
-        put("Alg.Alias.AlgorithmParameters.RSAPSS", "PSS");
-        put("Alg.Alias.AlgorithmParameters.RSASSA-PSS", "PSS");
-        put("Alg.Alias.AlgorithmParameters." + PKCSObjectIdentifiers.id_RSASSA_PSS, "PSS");
-        put("Alg.Alias.AlgorithmParameters.SHA1withRSA/PSS", "PSS");
-        put("Alg.Alias.AlgorithmParameters.SHA224withRSA/PSS", "PSS");
-        put("Alg.Alias.AlgorithmParameters.SHA256withRSA/PSS", "PSS");
-        put("Alg.Alias.AlgorithmParameters.SHA384withRSA/PSS", "PSS");
-        put("Alg.Alias.AlgorithmParameters.SHA512withRSA/PSS", "PSS");
-        put("Alg.Alias.AlgorithmParameters.SHA1WITHRSAANDMGF1", "PSS");
-        put("Alg.Alias.AlgorithmParameters.SHA224WITHRSAANDMGF1", "PSS");
-        put("Alg.Alias.AlgorithmParameters.SHA256WITHRSAANDMGF1", "PSS");
-        put("Alg.Alias.AlgorithmParameters.SHA384WITHRSAANDMGF1", "PSS");
-        put("Alg.Alias.AlgorithmParameters.SHA512WITHRSAANDMGF1", "PSS");
-        put("Alg.Alias.AlgorithmParameters.RAWRSAPSS", "PSS");
-        put("Alg.Alias.AlgorithmParameters.NONEWITHRSAPSS", "PSS");
-        put("Alg.Alias.AlgorithmParameters.NONEWITHRSASSA-PSS", "PSS");
+        // BEGIN android-removed
+        // put("Alg.Alias.AlgorithmParameters.RSAPSS", "PSS");
+        // put("Alg.Alias.AlgorithmParameters.RSASSA-PSS", "PSS");
+        // put("Alg.Alias.AlgorithmParameters." + PKCSObjectIdentifiers.id_RSASSA_PSS, "PSS");
+        // put("Alg.Alias.AlgorithmParameters.SHA1withRSA/PSS", "PSS");
+        // put("Alg.Alias.AlgorithmParameters.SHA224withRSA/PSS", "PSS");
+        // put("Alg.Alias.AlgorithmParameters.SHA256withRSA/PSS", "PSS");
+        // put("Alg.Alias.AlgorithmParameters.SHA384withRSA/PSS", "PSS");
+        // put("Alg.Alias.AlgorithmParameters.SHA512withRSA/PSS", "PSS");
+        // put("Alg.Alias.AlgorithmParameters.SHA1WITHRSAANDMGF1", "PSS");
+        // put("Alg.Alias.AlgorithmParameters.SHA224WITHRSAANDMGF1", "PSS");
+        // put("Alg.Alias.AlgorithmParameters.SHA256WITHRSAANDMGF1", "PSS");
+        // put("Alg.Alias.AlgorithmParameters.SHA384WITHRSAANDMGF1", "PSS");
+        // put("Alg.Alias.AlgorithmParameters.SHA512WITHRSAANDMGF1", "PSS");
+        // put("Alg.Alias.AlgorithmParameters.RAWRSAPSS", "PSS");
+        // put("Alg.Alias.AlgorithmParameters.NONEWITHRSAPSS", "PSS");
+        // put("Alg.Alias.AlgorithmParameters.NONEWITHRSASSA-PSS", "PSS");
+        // END android-removed
         
         put("Alg.Alias.AlgorithmParameters.PBEWITHSHAAND128BITAES-CBC-BC", "PKCS12PBE");
         put("Alg.Alias.AlgorithmParameters.PBEWITHSHAAND192BITAES-CBC-BC", "PKCS12PBE");
@@ -234,12 +274,14 @@
         put("Alg.Alias.AlgorithmParameters.PBEWITHSHA-256AND128BITAES-CBC-BC","PKCS12PBE");
         put("Alg.Alias.AlgorithmParameters.PBEWITHSHA-256AND192BITAES-CBC-BC","PKCS12PBE");
         put("Alg.Alias.AlgorithmParameters.PBEWITHSHA-256AND256BITAES-CBC-BC","PKCS12PBE");
-
-        put("AlgorithmParameters.SHA1WITHECDSA", "org.bouncycastle.jce.provider.JDKECDSAAlgParameters$SigAlgParameters");
-        put("AlgorithmParameters.SHA224WITHECDSA", "org.bouncycastle.jce.provider.JDKECDSAAlgParameters$SigAlgParameters");
-        put("AlgorithmParameters.SHA256WITHECDSA", "org.bouncycastle.jce.provider.JDKECDSAAlgParameters$SigAlgParameters");
-        put("AlgorithmParameters.SHA384WITHECDSA", "org.bouncycastle.jce.provider.JDKECDSAAlgParameters$SigAlgParameters");
-        put("AlgorithmParameters.SHA512WITHECDSA", "org.bouncycastle.jce.provider.JDKECDSAAlgParameters$SigAlgParameters");
+        
+        // BEGIN android-removed
+        // put("AlgorithmParameters.SHA1WITHECDSA", "org.bouncycastle.jce.provider.JDKECDSAAlgParameters$SigAlgParameters");
+        // put("AlgorithmParameters.SHA224WITHECDSA", "org.bouncycastle.jce.provider.JDKECDSAAlgParameters$SigAlgParameters");
+        // put("AlgorithmParameters.SHA256WITHECDSA", "org.bouncycastle.jce.provider.JDKECDSAAlgParameters$SigAlgParameters");
+        // put("AlgorithmParameters.SHA384WITHECDSA", "org.bouncycastle.jce.provider.JDKECDSAAlgParameters$SigAlgParameters");
+        // put("AlgorithmParameters.SHA512WITHECDSA", "org.bouncycastle.jce.provider.JDKECDSAAlgParameters$SigAlgParameters");
+        // END android-removed
         
         //
         // key agreement
@@ -252,97 +294,129 @@
         //
         put("Cipher.DES", "org.bouncycastle.jce.provider.JCEBlockCipher$DES");
         put("Cipher.DESEDE", "org.bouncycastle.jce.provider.JCEBlockCipher$DESede");
-        put("Cipher." + PKCSObjectIdentifiers.des_EDE3_CBC, "org.bouncycastle.jce.provider.JCEBlockCipher$DESedeCBC");
-        put("Cipher." + OIWObjectIdentifiers.desCBC, "org.bouncycastle.jce.provider.JCEBlockCipher$DESCBC");
+        // BEGIN android-removed
+        // put("Cipher." + PKCSObjectIdentifiers.des_EDE3_CBC, "org.bouncycastle.jce.provider.JCEBlockCipher$DESedeCBC");
+        // put("Cipher." + OIWObjectIdentifiers.desCBC, "org.bouncycastle.jce.provider.JCEBlockCipher$DESCBC");
+        // END android-removed
         put("Cipher.DESEDEWRAP", "org.bouncycastle.jce.provider.WrapCipherSpi$DESEDEWrap");
-        put("Cipher." + PKCSObjectIdentifiers.id_alg_CMS3DESwrap, "org.bouncycastle.jce.provider.WrapCipherSpi$DESEDEWrap");
-        put("Cipher.SKIPJACK", "org.bouncycastle.jce.provider.JCEBlockCipher$Skipjack");
+        // BEGIN android-changed
+        put("Alg.Alias.Cipher." + PKCSObjectIdentifiers.id_alg_CMS3DESwrap, "DESEDEWRAP");
+        // END android-changed
+        // BEGIN android-removed
+        // put("Cipher.SKIPJACK", "org.bouncycastle.jce.provider.JCEBlockCipher$Skipjack");
+        // END android-removed
         put("Cipher.BLOWFISH", "org.bouncycastle.jce.provider.JCEBlockCipher$Blowfish");
-        put("Cipher.1.3.6.1.4.1.3029.1.2", "org.bouncycastle.jce.provider.JCEBlockCipher$BlowfishCBC");
-        put("Cipher.TWOFISH", "org.bouncycastle.jce.provider.JCEBlockCipher$Twofish");
-        put("Cipher.RC2", "org.bouncycastle.jce.provider.JCEBlockCipher$RC2");
-        put("Cipher.RC2WRAP", "org.bouncycastle.jce.provider.WrapCipherSpi$RC2Wrap");
-        put("Cipher.1.2.840.113549.1.9.16.3.7", "org.bouncycastle.jce.provider.WrapCipherSpi$RC2Wrap");
+        // BEGIN android-removed
+        // put("Cipher.1.3.6.1.4.1.3029.1.2", "org.bouncycastle.jce.provider.JCEBlockCipher$BlowfishCBC");
+        // put("Cipher.TWOFISH", "org.bouncycastle.jce.provider.JCEBlockCipher$Twofish");
+        // put("Cipher.RC2", "org.bouncycastle.jce.provider.JCEBlockCipher$RC2");
+        // put("Cipher.RC2WRAP", "org.bouncycastle.jce.provider.WrapCipherSpi$RC2Wrap");
+        // put("Cipher.1.2.840.113549.1.9.16.3.7", "org.bouncycastle.jce.provider.WrapCipherSpi$RC2Wrap");
+        // END android-removed
         put("Cipher.ARC4", "org.bouncycastle.jce.provider.JCEStreamCipher$RC4");
         put("Alg.Alias.Cipher.1.2.840.113549.3.4", "ARC4");
         put("Alg.Alias.Cipher.ARCFOUR", "ARC4");
         put("Alg.Alias.Cipher.RC4", "ARC4");
-        put("Cipher.SALSA20", "org.bouncycastle.jce.provider.JCEStreamCipher$Salsa20");
-        put("Cipher.HC128", "org.bouncycastle.jce.provider.JCEStreamCipher$HC128");
-        put("Cipher.HC256", "org.bouncycastle.jce.provider.JCEStreamCipher$HC256");
-        put("Cipher.VMPC", "org.bouncycastle.jce.provider.JCEStreamCipher$VMPC");
-        put("Cipher.VMPC-KSA3", "org.bouncycastle.jce.provider.JCEStreamCipher$VMPCKSA3");
-        put("Cipher.RC5", "org.bouncycastle.jce.provider.JCEBlockCipher$RC5");
-        put("Cipher.1.2.840.113549.3.2", "org.bouncycastle.jce.provider.JCEBlockCipher$RC2CBC");
-        put("Alg.Alias.Cipher.RC5-32", "RC5");
-        put("Cipher.RC5-64", "org.bouncycastle.jce.provider.JCEBlockCipher$RC564");
-        put("Cipher.RC6", "org.bouncycastle.jce.provider.JCEBlockCipher$RC6");
-        put("Cipher.RIJNDAEL", "org.bouncycastle.jce.provider.JCEBlockCipher$Rijndael");
-        put("Cipher.DESEDERFC3211WRAP", "org.bouncycastle.jce.provider.WrapCipherSpi$RFC3211DESedeWrap");
-        put("Cipher.SERPENT", "org.bouncycastle.jce.provider.JCEBlockCipher$Serpent");
-
-
-        put("Cipher.CAST6", "org.bouncycastle.jce.provider.JCEBlockCipher$CAST6");
+        // BEGIN android-removed
+        // put("Cipher.SALSA20", "org.bouncycastle.jce.provider.JCEStreamCipher$Salsa20");
+        // put("Cipher.HC128", "org.bouncycastle.jce.provider.JCEStreamCipher$HC128");
+        // put("Cipher.HC256", "org.bouncycastle.jce.provider.JCEStreamCipher$HC256");
+        // put("Cipher.VMPC", "org.bouncycastle.jce.provider.JCEStreamCipher$VMPC");
+        // put("Cipher.VMPC-KSA3", "org.bouncycastle.jce.provider.JCEStreamCipher$VMPCKSA3");
+        // put("Cipher.RC5", "org.bouncycastle.jce.provider.JCEBlockCipher$RC5");
+        // put("Cipher.1.2.840.113549.3.2", "org.bouncycastle.jce.provider.JCEBlockCipher$RC2CBC");
+        // put("Alg.Alias.Cipher.RC5-32", "RC5");
+        // put("Cipher.RC5-64", "org.bouncycastle.jce.provider.JCEBlockCipher$RC564");
+        // put("Cipher.RC6", "org.bouncycastle.jce.provider.JCEBlockCipher$RC6");
+        // put("Cipher.RIJNDAEL", "org.bouncycastle.jce.provider.JCEBlockCipher$Rijndael");
+        // put("Cipher.DESEDERFC3211WRAP", "org.bouncycastle.jce.provider.WrapCipherSpi$RFC3211DESedeWrap");
+        // put("Cipher.SERPENT", "org.bouncycastle.jce.provider.JCEBlockCipher$Serpent");
+        // END android-removed
+
+
+        // BEGIN android-removed
+        // put("Cipher.CAST6", "org.bouncycastle.jce.provider.JCEBlockCipher$CAST6");
+        // END android-removed
         put("Alg.Alias.Cipher.PBEWithSHAAnd3KeyTripleDES",  "PBEWITHSHAAND3-KEYTRIPLEDES-CBC");
         
-        put("Cipher.GOST28147", "org.bouncycastle.jce.provider.JCEBlockCipher$GOST28147");
-        put("Alg.Alias.Cipher.GOST", "GOST28147");
-        put("Alg.Alias.Cipher.GOST-28147", "GOST28147");
-        put("Cipher." + CryptoProObjectIdentifiers.gostR28147_cbc, "org.bouncycastle.jce.provider.JCEBlockCipher$GOST28147cbc");
-
-        put("Cipher.TEA", "org.bouncycastle.jce.provider.JCEBlockCipher$TEA");
-        put("Cipher.XTEA", "org.bouncycastle.jce.provider.JCEBlockCipher$XTEA");
+        // BEGIN android-removed
+        // put("Cipher.GOST28147", "org.bouncycastle.jce.provider.JCEBlockCipher$GOST28147");
+        // put("Alg.Alias.Cipher.GOST", "GOST28147");
+        // put("Alg.Alias.Cipher.GOST-28147", "GOST28147");
+        // put("Cipher." + CryptoProObjectIdentifiers.gostR28147_cbc, "org.bouncycastle.jce.provider.JCEBlockCipher$GOST28147cbc");
+        //
+        // put("Cipher.TEA", "org.bouncycastle.jce.provider.JCEBlockCipher$TEA");
+        // put("Cipher.XTEA", "org.bouncycastle.jce.provider.JCEBlockCipher$XTEA");
+        // END android-removed
 
         put("Cipher.RSA", "org.bouncycastle.jce.provider.JCERSACipher$NoPadding");
-        put("Cipher.RSA/RAW", "org.bouncycastle.jce.provider.JCERSACipher$NoPadding");
-        put("Cipher.RSA/PKCS1", "org.bouncycastle.jce.provider.JCERSACipher$PKCS1v1_5Padding");
-        put("Cipher.1.2.840.113549.1.1.1", "org.bouncycastle.jce.provider.JCERSACipher$PKCS1v1_5Padding");
-        put("Cipher.2.5.8.1.1", "org.bouncycastle.jce.provider.JCERSACipher$PKCS1v1_5Padding");
-        put("Cipher.RSA/1", "org.bouncycastle.jce.provider.JCERSACipher$PKCS1v1_5Padding_PrivateOnly");
-        put("Cipher.RSA/2", "org.bouncycastle.jce.provider.JCERSACipher$PKCS1v1_5Padding_PublicOnly");
-        put("Cipher.RSA/OAEP", "org.bouncycastle.jce.provider.JCERSACipher$OAEPPadding");
-        put("Cipher." + PKCSObjectIdentifiers.id_RSAES_OAEP, "org.bouncycastle.jce.provider.JCERSACipher$OAEPPadding");
-        put("Cipher.RSA/ISO9796-1", "org.bouncycastle.jce.provider.JCERSACipher$ISO9796d1Padding");
-
-        put("Cipher.ECIES", "org.bouncycastle.jce.provider.JCEIESCipher$ECIES");
-        put("Cipher.BrokenECIES", "org.bouncycastle.jce.provider.JCEIESCipher$BrokenECIES");
-        put("Cipher.IES", "org.bouncycastle.jce.provider.JCEIESCipher$IES");
-        put("Cipher.BrokenIES", "org.bouncycastle.jce.provider.JCEIESCipher$BrokenIES");
-        put("Cipher.ELGAMAL", "org.bouncycastle.jce.provider.JCEElGamalCipher$NoPadding");
-        put("Cipher.ELGAMAL/PKCS1", "org.bouncycastle.jce.provider.JCEElGamalCipher$PKCS1v1_5Padding");
+        // BEGIN android-changed
+        put("Alg.Alias.Cipher.RSA/RAW", "RSA");
+        // END android-changed
+        // BEGIN android-removed
+        // put("Cipher.RSA/PKCS1", "org.bouncycastle.jce.provider.JCERSACipher$PKCS1v1_5Padding");
+        // put("Cipher.1.2.840.113549.1.1.1", "org.bouncycastle.jce.provider.JCERSACipher$PKCS1v1_5Padding");
+        // put("Cipher.2.5.8.1.1", "org.bouncycastle.jce.provider.JCERSACipher$PKCS1v1_5Padding");
+        // put("Cipher.RSA/1", "org.bouncycastle.jce.provider.JCERSACipher$PKCS1v1_5Padding_PrivateOnly");
+        // put("Cipher.RSA/2", "org.bouncycastle.jce.provider.JCERSACipher$PKCS1v1_5Padding_PublicOnly");
+        // put("Cipher.RSA/OAEP", "org.bouncycastle.jce.provider.JCERSACipher$OAEPPadding");
+        // put("Cipher." + PKCSObjectIdentifiers.id_RSAES_OAEP, "org.bouncycastle.jce.provider.JCERSACipher$OAEPPadding");
+        // put("Cipher.RSA/ISO9796-1", "org.bouncycastle.jce.provider.JCERSACipher$ISO9796d1Padding");
+        // END android-removed
+
+        // BEGIN android-removed
+        // put("Cipher.ECIES", "org.bouncycastle.jce.provider.JCEIESCipher$ECIES");
+        // put("Cipher.BrokenECIES", "org.bouncycastle.jce.provider.JCEIESCipher$BrokenECIES");
+        // put("Cipher.IES", "org.bouncycastle.jce.provider.JCEIESCipher$IES");
+        // put("Cipher.BrokenIES", "org.bouncycastle.jce.provider.JCEIESCipher$BrokenIES");
+        // put("Cipher.ELGAMAL", "org.bouncycastle.jce.provider.JCEElGamalCipher$NoPadding");
+        // put("Cipher.ELGAMAL/PKCS1", "org.bouncycastle.jce.provider.JCEElGamalCipher$PKCS1v1_5Padding");
+        // END android-removed
 
         put("Alg.Alias.Cipher.RSA//RAW", "RSA");
         put("Alg.Alias.Cipher.RSA//NOPADDING", "RSA");
-        put("Alg.Alias.Cipher.RSA//PKCS1PADDING", "RSA/PKCS1");
-        put("Alg.Alias.Cipher.RSA//OAEPPADDING", "RSA/OAEP");
-        put("Alg.Alias.Cipher.RSA//ISO9796-1PADDING", "RSA/ISO9796-1");
-        
-        put("Alg.Alias.Cipher.ELGAMAL/ECB/PKCS1PADDING", "ELGAMAL/PKCS1");
-        put("Alg.Alias.Cipher.ELGAMAL/NONE/PKCS1PADDING", "ELGAMAL/PKCS1");
-        put("Alg.Alias.Cipher.ELGAMAL/NONE/NOPADDING", "ELGAMAL");
+        // BEGIN android-removed
+        // put("Alg.Alias.Cipher.RSA//PKCS1PADDING", "RSA/PKCS1");
+        // put("Alg.Alias.Cipher.RSA//OAEPPADDING", "RSA/OAEP");
+        // put("Alg.Alias.Cipher.RSA//ISO9796-1PADDING", "RSA/ISO9796-1");
+        // END android-removed
+        
+        // BEGIN android-removed
+        // put("Alg.Alias.Cipher.ELGAMAL/ECB/PKCS1PADDING", "ELGAMAL/PKCS1");
+        // put("Alg.Alias.Cipher.ELGAMAL/NONE/PKCS1PADDING", "ELGAMAL/PKCS1");
+        // put("Alg.Alias.Cipher.ELGAMAL/NONE/NOPADDING", "ELGAMAL");
+        // END android-removed
 
         put("Cipher.PBEWITHMD5ANDDES", "org.bouncycastle.jce.provider.JCEBlockCipher$PBEWithMD5AndDES");
-        put("Cipher.BROKENPBEWITHMD5ANDDES", "org.bouncycastle.jce.provider.BrokenJCEBlockCipher$BrokePBEWithMD5AndDES");
+        // BEGIN android-removed
+        // put("Cipher.BROKENPBEWITHMD5ANDDES", "org.bouncycastle.jce.provider.BrokenJCEBlockCipher$BrokePBEWithMD5AndDES");
+        // END android-removed
         put("Cipher.PBEWITHMD5ANDRC2", "org.bouncycastle.jce.provider.JCEBlockCipher$PBEWithMD5AndRC2");
         put("Cipher.PBEWITHSHA1ANDDES", "org.bouncycastle.jce.provider.JCEBlockCipher$PBEWithSHA1AndDES");
-        put("Cipher.BROKENPBEWITHSHA1ANDDES", "org.bouncycastle.jce.provider.BrokenJCEBlockCipher$BrokePBEWithSHA1AndDES");
+        // BEGIN android-removed
+        // put("Cipher.BROKENPBEWITHSHA1ANDDES", "org.bouncycastle.jce.provider.BrokenJCEBlockCipher$BrokePBEWithSHA1AndDES");
+        // END android-removed
         put("Cipher.PBEWITHSHA1ANDRC2", "org.bouncycastle.jce.provider.JCEBlockCipher$PBEWithSHA1AndRC2");
         put("Cipher.PBEWITHSHAAND3-KEYTRIPLEDES-CBC", "org.bouncycastle.jce.provider.JCEBlockCipher$PBEWithSHAAndDES3Key");
-        put("Cipher.BROKENPBEWITHSHAAND3-KEYTRIPLEDES-CBC", "org.bouncycastle.jce.provider.BrokenJCEBlockCipher$BrokePBEWithSHAAndDES3Key");
-        put("Cipher.OLDPBEWITHSHAAND3-KEYTRIPLEDES-CBC", "org.bouncycastle.jce.provider.BrokenJCEBlockCipher$OldPBEWithSHAAndDES3Key");
+        // BEGIN android-removed
+        // put("Cipher.BROKENPBEWITHSHAAND3-KEYTRIPLEDES-CBC", "org.bouncycastle.jce.provider.BrokenJCEBlockCipher$BrokePBEWithSHAAndDES3Key");
+        // put("Cipher.OLDPBEWITHSHAAND3-KEYTRIPLEDES-CBC", "org.bouncycastle.jce.provider.BrokenJCEBlockCipher$OldPBEWithSHAAndDES3Key");
+        // END android-removed
         put("Cipher.PBEWITHSHAAND2-KEYTRIPLEDES-CBC", "org.bouncycastle.jce.provider.JCEBlockCipher$PBEWithSHAAndDES2Key");
-        put("Cipher.BROKENPBEWITHSHAAND2-KEYTRIPLEDES-CBC", "org.bouncycastle.jce.provider.BrokenJCEBlockCipher$BrokePBEWithSHAAndDES2Key");
+        // BEGIN android-removed
+        // put("Cipher.BROKENPBEWITHSHAAND2-KEYTRIPLEDES-CBC", "org.bouncycastle.jce.provider.BrokenJCEBlockCipher$BrokePBEWithSHAAndDES2Key");
+        // END android-removed
         put("Cipher.PBEWITHSHAAND128BITRC2-CBC", "org.bouncycastle.jce.provider.JCEBlockCipher$PBEWithSHAAnd128BitRC2");
         put("Cipher.PBEWITHSHAAND40BITRC2-CBC", "org.bouncycastle.jce.provider.JCEBlockCipher$PBEWithSHAAnd40BitRC2");
         put("Cipher.PBEWITHSHAAND128BITRC4", "org.bouncycastle.jce.provider.JCEStreamCipher$PBEWithSHAAnd128BitRC4");
         put("Cipher.PBEWITHSHAAND40BITRC4", "org.bouncycastle.jce.provider.JCEStreamCipher$PBEWithSHAAnd40BitRC4");
 
-        put("Alg.Alias.Cipher.PBEWITHSHA1AND3-KEYTRIPLEDES-CBC", "Cipher.PBEWITHSHAAND3-KEYTRIPLEDES-CBC");
-        put("Alg.Alias.Cipher.PBEWITHSHA1AND2-KEYTRIPLEDES-CBC", "Cipher.PBEWITHSHAAND2-KEYTRIPLEDES-CBC");
-        put("Alg.Alias.Cipher.PBEWITHSHA1AND128BITRC2-CBC", "Cipher.PBEWITHSHAAND128BITRC2-CBC");
-        put("Alg.Alias.Cipher.PBEWITHSHA1AND40BITRC2-CBC", "Cipher.PBEWITHSHAAND40BITRC2-CBC");
-        put("Alg.Alias.Cipher.PBEWITHSHA1AND128BITRC4", "Cipher.PBEWITHSHAAND128BITRC4");
-        put("Alg.Alias.Cipher.PBEWITHSHA1AND40BITRC4", "Cipher.PBEWITHSHAAND40BITRC4");
+        put("Alg.Alias.Cipher.PBEWITHSHA1AND3-KEYTRIPLEDES-CBC", "PBEWITHSHAAND3-KEYTRIPLEDES-CBC");
+        put("Alg.Alias.Cipher.PBEWITHSHA1AND2-KEYTRIPLEDES-CBC", "PBEWITHSHAAND2-KEYTRIPLEDES-CBC");
+        put("Alg.Alias.Cipher.PBEWITHSHA1AND128BITRC2-CBC", "PBEWITHSHAAND128BITRC2-CBC");
+        put("Alg.Alias.Cipher.PBEWITHSHA1AND40BITRC2-CBC", "PBEWITHSHAAND40BITRC2-CBC");
+        put("Alg.Alias.Cipher.PBEWITHSHA1AND128BITRC4", "PBEWITHSHAAND128BITRC4");
+        put("Alg.Alias.Cipher.PBEWITHSHA1AND40BITRC4", "PBEWITHSHAAND40BITRC4");
 
         put("Alg.Alias.Cipher." + BCObjectIdentifiers.bc_pbe_sha1_pkcs12_aes128_cbc.getId(), "PBEWITHSHAAND128BITAES-CBC-BC");
         put("Alg.Alias.Cipher." + BCObjectIdentifiers.bc_pbe_sha1_pkcs12_aes192_cbc.getId(), "PBEWITHSHAAND192BITAES-CBC-BC");
@@ -350,7 +424,7 @@
         put("Alg.Alias.Cipher." + BCObjectIdentifiers.bc_pbe_sha256_pkcs12_aes128_cbc.getId(), "PBEWITHSHA256AND128BITAES-CBC-BC");
         put("Alg.Alias.Cipher." + BCObjectIdentifiers.bc_pbe_sha256_pkcs12_aes192_cbc.getId(), "PBEWITHSHA256AND192BITAES-CBC-BC");
         put("Alg.Alias.Cipher." + BCObjectIdentifiers.bc_pbe_sha256_pkcs12_aes256_cbc.getId(), "PBEWITHSHA256AND256BITAES-CBC-BC");
-
+        
         put("Cipher.PBEWITHSHAAND128BITAES-CBC-BC", "org.bouncycastle.jce.provider.JCEBlockCipher$PBEWithAESCBC");
         put("Cipher.PBEWITHSHAAND192BITAES-CBC-BC", "org.bouncycastle.jce.provider.JCEBlockCipher$PBEWithAESCBC");
         put("Cipher.PBEWITHSHAAND256BITAES-CBC-BC", "org.bouncycastle.jce.provider.JCEBlockCipher$PBEWithAESCBC");
@@ -372,7 +446,9 @@
         put("Cipher.PBEWITHMD5AND256BITAES-CBC-OPENSSL", "org.bouncycastle.jce.provider.JCEBlockCipher$PBEWithAESCBC");
         
         put("Cipher.PBEWITHSHAANDTWOFISH-CBC", "org.bouncycastle.jce.provider.JCEBlockCipher$PBEWithSHAAndTwofish");
-        put("Cipher.OLDPBEWITHSHAANDTWOFISH-CBC", "org.bouncycastle.jce.provider.BrokenJCEBlockCipher$OldPBEWithSHAAndTwofish");
+        // BEGIN android-removed
+        // put("Cipher.OLDPBEWITHSHAANDTWOFISH-CBC", "org.bouncycastle.jce.provider.BrokenJCEBlockCipher$OldPBEWithSHAAndTwofish");
+        // END android-removed
 
         put("Alg.Alias.Cipher.1.2.840.113549.1.12.1.1", "PBEWITHSHAAND128BITRC4");
         put("Alg.Alias.Cipher.1.2.840.113549.1.12.1.2", "PBEWITHSHAAND40BITRC4");
@@ -387,38 +463,49 @@
         put("KeyGenerator.DES", "org.bouncycastle.jce.provider.JCEKeyGenerator$DES");
         put("Alg.Alias.KeyGenerator." + OIWObjectIdentifiers.desCBC, "DES");
         put("KeyGenerator.DESEDE", "org.bouncycastle.jce.provider.JCEKeyGenerator$DESede");
-        put("KeyGenerator." + PKCSObjectIdentifiers.des_EDE3_CBC, "org.bouncycastle.jce.provider.JCEKeyGenerator$DESede3");
-        put("KeyGenerator.DESEDEWRAP", "org.bouncycastle.jce.provider.JCEKeyGenerator$DESede");
-        put("KeyGenerator.SKIPJACK", "org.bouncycastle.jce.provider.JCEKeyGenerator$Skipjack");
+        // BEGIN android-removed
+        // put("KeyGenerator." + PKCSObjectIdentifiers.des_EDE3_CBC, "org.bouncycastle.jce.provider.JCEKeyGenerator$DESede3");
+        // put("KeyGenerator.DESEDEWRAP", "org.bouncycastle.jce.provider.JCEKeyGenerator$DESede");
+        // put("KeyGenerator.SKIPJACK", "org.bouncycastle.jce.provider.JCEKeyGenerator$Skipjack");
+        // END android-removed
         put("KeyGenerator.BLOWFISH", "org.bouncycastle.jce.provider.JCEKeyGenerator$Blowfish");
         put("Alg.Alias.KeyGenerator.1.3.6.1.4.1.3029.1.2", "BLOWFISH");
-        put("KeyGenerator.TWOFISH", "org.bouncycastle.jce.provider.JCEKeyGenerator$Twofish");
-        put("KeyGenerator.RC2", "org.bouncycastle.jce.provider.JCEKeyGenerator$RC2");
-        put("KeyGenerator.1.2.840.113549.3.2", "org.bouncycastle.jce.provider.JCEKeyGenerator$RC2");
+        // BEGIN android-removed
+        // put("KeyGenerator.TWOFISH", "org.bouncycastle.jce.provider.JCEKeyGenerator$Twofish");
+        // put("KeyGenerator.RC2", "org.bouncycastle.jce.provider.JCEKeyGenerator$RC2");
+        // put("KeyGenerator.1.2.840.113549.3.2", "org.bouncycastle.jce.provider.JCEKeyGenerator$RC2");
+        // END android-removed
         put("KeyGenerator.RC4", "org.bouncycastle.jce.provider.JCEKeyGenerator$RC4");
         put("Alg.Alias.KeyGenerator.ARC4", "RC4");
-        put("Alg.Alias.KeyGenerator.1.2.840.113549.3.4", "RC4");
-        put("KeyGenerator.RC5", "org.bouncycastle.jce.provider.JCEKeyGenerator$RC5");
-        put("Alg.Alias.KeyGenerator.RC5-32", "RC5");
-        put("KeyGenerator.RC5-64", "org.bouncycastle.jce.provider.JCEKeyGenerator$RC564");
-        put("KeyGenerator.RC6", "org.bouncycastle.jce.provider.JCEKeyGenerator$RC6");
-        put("KeyGenerator.RIJNDAEL", "org.bouncycastle.jce.provider.JCEKeyGenerator$Rijndael");
-
-        put("KeyGenerator.SERPENT", "org.bouncycastle.jce.provider.JCEKeyGenerator$Serpent");
-        put("KeyGenerator.SALSA20", "org.bouncycastle.jce.provider.JCEKeyGenerator$Salsa20");
-        put("KeyGenerator.HC128", "org.bouncycastle.jce.provider.JCEKeyGenerator$HC128");
-        put("KeyGenerator.HC256", "org.bouncycastle.jce.provider.JCEKeyGenerator$HC256");
-        put("KeyGenerator.VMPC", "org.bouncycastle.jce.provider.JCEKeyGenerator$VMPC");
-        put("KeyGenerator.VMPC-KSA3", "org.bouncycastle.jce.provider.JCEKeyGenerator$VMPCKSA3");
-
-        put("KeyGenerator.CAST6", "org.bouncycastle.jce.provider.JCEKeyGenerator$CAST6");
-        put("KeyGenerator.TEA", "org.bouncycastle.jce.provider.JCEKeyGenerator$TEA");
-        put("KeyGenerator.XTEA", "org.bouncycastle.jce.provider.JCEKeyGenerator$XTEA");
-
-        put("KeyGenerator.GOST28147", "org.bouncycastle.jce.provider.JCEKeyGenerator$GOST28147");
-        put("Alg.Alias.KeyGenerator.GOST", "GOST28147");
-        put("Alg.Alias.KeyGenerator.GOST-28147", "GOST28147");
-        put("Alg.Alias.KeyGenerator." + CryptoProObjectIdentifiers.gostR28147_cbc, "GOST28147");
+        // BEGIN android-added
+        put("Alg.Alias.KeyGenerator.ARCFOUR", "RC4");
+        // END android-added
+        // BEGIN android-removed
+        // put("Alg.Alias.KeyGenerator.1.2.840.113549.3.4", "RC4");
+        // put("KeyGenerator.RC5", "org.bouncycastle.jce.provider.JCEKeyGenerator$RC5");
+        // put("Alg.Alias.KeyGenerator.RC5-32", "RC5");
+        // put("KeyGenerator.RC5-64", "org.bouncycastle.jce.provider.JCEKeyGenerator$RC564");
+        // put("KeyGenerator.RC6", "org.bouncycastle.jce.provider.JCEKeyGenerator$RC6");
+        // put("KeyGenerator.RIJNDAEL", "org.bouncycastle.jce.provider.JCEKeyGenerator$Rijndael");
+        //
+        // put("KeyGenerator.SERPENT", "org.bouncycastle.jce.provider.JCEKeyGenerator$Serpent");
+        // put("KeyGenerator.SALSA20", "org.bouncycastle.jce.provider.JCEKeyGenerator$Salsa20");
+        // put("KeyGenerator.HC128", "org.bouncycastle.jce.provider.JCEKeyGenerator$HC128");
+        // put("KeyGenerator.HC256", "org.bouncycastle.jce.provider.JCEKeyGenerator$HC256");
+        // put("KeyGenerator.VMPC", "org.bouncycastle.jce.provider.JCEKeyGenerator$VMPC");
+        // put("KeyGenerator.VMPC-KSA3", "org.bouncycastle.jce.provider.JCEKeyGenerator$VMPCKSA3");
+        // END android-removed
+
+        // BEGIN android-removed
+        // put("KeyGenerator.CAST6", "org.bouncycastle.jce.provider.JCEKeyGenerator$CAST6");
+        // put("KeyGenerator.TEA", "org.bouncycastle.jce.provider.JCEKeyGenerator$TEA");
+        // put("KeyGenerator.XTEA", "org.bouncycastle.jce.provider.JCEKeyGenerator$XTEA");
+        //
+        // put("KeyGenerator.GOST28147", "org.bouncycastle.jce.provider.JCEKeyGenerator$GOST28147");
+        // put("Alg.Alias.KeyGenerator.GOST", "GOST28147");
+        // put("Alg.Alias.KeyGenerator.GOST-28147", "GOST28147");
+        // put("Alg.Alias.KeyGenerator." + CryptoProObjectIdentifiers.gostR28147_cbc, "GOST28147");
+        // END android-removed
 
         //
         // key pair generators.
@@ -426,14 +513,18 @@
         put("KeyPairGenerator.RSA", "org.bouncycastle.jce.provider.JDKKeyPairGenerator$RSA");
         put("KeyPairGenerator.DH", "org.bouncycastle.jce.provider.JDKKeyPairGenerator$DH");
         put("KeyPairGenerator.DSA", "org.bouncycastle.jce.provider.JDKKeyPairGenerator$DSA");
-        put("KeyPairGenerator.ELGAMAL", "org.bouncycastle.jce.provider.JDKKeyPairGenerator$ElGamal");
+        // BEGIN android-removed
+        // put("KeyPairGenerator.ELGAMAL", "org.bouncycastle.jce.provider.JDKKeyPairGenerator$ElGamal");
+        // END android-removed
 
         put("Alg.Alias.KeyPairGenerator.1.2.840.113549.1.1.1", "RSA");
         put("Alg.Alias.KeyPairGenerator.DIFFIEHELLMAN", "DH");
         
-        put("KeyPairGenerator.GOST3410", "org.bouncycastle.jce.provider.JDKKeyPairGenerator$GOST3410");
-        put("Alg.Alias.KeyPairGenerator.GOST-3410", "GOST3410");
-        put("Alg.Alias.KeyPairGenerator.GOST-3410-94", "GOST3410");
+        // BEGIN android-removed
+        // put("KeyPairGenerator.GOST3410", "org.bouncycastle.jce.provider.JDKKeyPairGenerator$GOST3410");
+        // put("Alg.Alias.KeyPairGenerator.GOST-3410", "GOST3410");
+        // put("Alg.Alias.KeyPairGenerator.GOST-3410-94", "GOST3410");
+        // END android-removed
 
         //
         // key factories
@@ -441,20 +532,24 @@
         put("KeyFactory.RSA", "org.bouncycastle.jce.provider.JDKKeyFactory$RSA");
         put("KeyFactory.DH", "org.bouncycastle.jce.provider.JDKKeyFactory$DH");
         put("KeyFactory.DSA", "org.bouncycastle.jce.provider.JDKKeyFactory$DSA");
-        put("KeyFactory.ELGAMAL", "org.bouncycastle.jce.provider.JDKKeyFactory$ElGamal");
-        put("KeyFactory.ElGamal", "org.bouncycastle.jce.provider.JDKKeyFactory$ElGamal");
-
-        put("KeyFactory.X.509", "org.bouncycastle.jce.provider.JDKKeyFactory$X509");
+        // BEGIN android-removed
+        // put("KeyFactory.ELGAMAL", "org.bouncycastle.jce.provider.JDKKeyFactory$ElGamal");
+        // put("KeyFactory.ElGamal", "org.bouncycastle.jce.provider.JDKKeyFactory$ElGamal");
+        //
+        // put("KeyFactory.X.509", "org.bouncycastle.jce.provider.JDKKeyFactory$X509");
+        // END android-removed
         
         put("Alg.Alias.KeyFactory.1.2.840.113549.1.1.1", "RSA");
         put("Alg.Alias.KeyFactory.1.2.840.10040.4.1", "DSA");
 
         put("Alg.Alias.KeyFactory.DIFFIEHELLMAN", "DH");
 
-        put("KeyFactory.GOST3410", "org.bouncycastle.jce.provider.JDKKeyFactory$GOST3410");
-        put("Alg.Alias.KeyFactory.GOST-3410", "GOST3410");
-        put("Alg.Alias.KeyFactory.GOST-3410-94", "GOST3410");
-        put("Alg.Alias.KeyFactory." + CryptoProObjectIdentifiers.gostR3410_94, "GOST3410");
+        // BEGIN android-removed
+        // put("KeyFactory.GOST3410", "org.bouncycastle.jce.provider.JDKKeyFactory$GOST3410");
+        // put("Alg.Alias.KeyFactory.GOST-3410", "GOST3410");
+        // put("Alg.Alias.KeyFactory.GOST-3410-94", "GOST3410");
+        // put("Alg.Alias.KeyFactory." + CryptoProObjectIdentifiers.gostR3410_94, "GOST3410");
+        // END android-removed
 
         //
         // Algorithm parameters
@@ -462,16 +557,22 @@
         put("AlgorithmParameters.DES", "org.bouncycastle.jce.provider.JDKAlgorithmParameters$IVAlgorithmParameters");
         put("Alg.Alias.AlgorithmParameters." + OIWObjectIdentifiers.desCBC, "DES");
         put("AlgorithmParameters.DESEDE", "org.bouncycastle.jce.provider.JDKAlgorithmParameters$IVAlgorithmParameters");
-        put("AlgorithmParameters." + PKCSObjectIdentifiers.des_EDE3_CBC, "org.bouncycastle.jce.provider.JDKAlgorithmParameters$IVAlgorithmParameters");
-        put("AlgorithmParameters.RC2", "org.bouncycastle.jce.provider.JDKAlgorithmParameters$RC2AlgorithmParameters");
-        put("AlgorithmParameters.1.2.840.113549.3.2", "org.bouncycastle.jce.provider.JDKAlgorithmParameters$RC2AlgorithmParameters");
-        put("AlgorithmParameters.RC5", "org.bouncycastle.jce.provider.JDKAlgorithmParameters$IVAlgorithmParameters");
-        put("AlgorithmParameters.RC6", "org.bouncycastle.jce.provider.JDKAlgorithmParameters$IVAlgorithmParameters");
+        // BEGIN android-changed
+        put("Alg.Alias.AlgorithmParameters." + PKCSObjectIdentifiers.des_EDE3_CBC, "DESEDE");
+        // END android-changed
+        // BEGIN android-removed
+        // put("AlgorithmParameters.RC2", "org.bouncycastle.jce.provider.JDKAlgorithmParameters$RC2AlgorithmParameters");
+        // put("AlgorithmParameters.1.2.840.113549.3.2", "org.bouncycastle.jce.provider.JDKAlgorithmParameters$RC2AlgorithmParameters");
+        // put("AlgorithmParameters.RC5", "org.bouncycastle.jce.provider.JDKAlgorithmParameters$IVAlgorithmParameters");
+        // put("AlgorithmParameters.RC6", "org.bouncycastle.jce.provider.JDKAlgorithmParameters$IVAlgorithmParameters");
+        // END android-removed
         put("AlgorithmParameters.BLOWFISH", "org.bouncycastle.jce.provider.JDKAlgorithmParameters$IVAlgorithmParameters");
         put("Alg.Alias.AlgorithmParameters.1.3.6.1.4.1.3029.1.2", "BLOWFISH");
-        put("AlgorithmParameters.TWOFISH", "org.bouncycastle.jce.provider.JDKAlgorithmParameters$IVAlgorithmParameters");
-        put("AlgorithmParameters.SKIPJACK", "org.bouncycastle.jce.provider.JDKAlgorithmParameters$IVAlgorithmParameters");
-        put("AlgorithmParameters.RIJNDAEL", "org.bouncycastle.jce.provider.JDKAlgorithmParameters$IVAlgorithmParameters");
+        // BEGIN android-removed
+        // put("AlgorithmParameters.TWOFISH", "org.bouncycastle.jce.provider.JDKAlgorithmParameters$IVAlgorithmParameters");
+        // put("AlgorithmParameters.SKIPJACK", "org.bouncycastle.jce.provider.JDKAlgorithmParameters$IVAlgorithmParameters");
+        // put("AlgorithmParameters.RIJNDAEL", "org.bouncycastle.jce.provider.JDKAlgorithmParameters$IVAlgorithmParameters");
+        // END android-removed
 
         
         //
@@ -479,8 +580,10 @@
         //
         put("SecretKeyFactory.DES", "org.bouncycastle.jce.provider.JCESecretKeyFactory$DES");
         put("SecretKeyFactory.DESEDE", "org.bouncycastle.jce.provider.JCESecretKeyFactory$DESede");
-        put("SecretKeyFactory.PBEWITHMD2ANDDES", "org.bouncycastle.jce.provider.JCESecretKeyFactory$PBEWithMD2AndDES");
-        put("SecretKeyFactory.PBEWITHMD2ANDRC2", "org.bouncycastle.jce.provider.JCESecretKeyFactory$PBEWithMD2AndRC2");
+        // BEGIN android-removed
+        // put("SecretKeyFactory.PBEWITHMD2ANDDES", "org.bouncycastle.jce.provider.JCESecretKeyFactory$PBEWithMD2AndDES");
+        // put("SecretKeyFactory.PBEWITHMD2ANDRC2", "org.bouncycastle.jce.provider.JCESecretKeyFactory$PBEWithMD2AndRC2");
+        // END android-removed
         put("SecretKeyFactory.PBEWITHMD5ANDDES", "org.bouncycastle.jce.provider.JCESecretKeyFactory$PBEWithMD5AndDES");
         put("SecretKeyFactory.PBEWITHMD5ANDRC2", "org.bouncycastle.jce.provider.JCESecretKeyFactory$PBEWithMD5AndRC2");
         put("SecretKeyFactory.PBEWITHSHA1ANDDES", "org.bouncycastle.jce.provider.JCESecretKeyFactory$PBEWithSHA1AndDES");
@@ -492,31 +595,41 @@
         put("SecretKeyFactory.PBEWITHSHAAND128BITRC2-CBC", "org.bouncycastle.jce.provider.JCESecretKeyFactory$PBEWithSHAAnd128BitRC2");
         put("SecretKeyFactory.PBEWITHSHAAND40BITRC2-CBC", "org.bouncycastle.jce.provider.JCESecretKeyFactory$PBEWithSHAAnd40BitRC2");
         put("SecretKeyFactory.PBEWITHSHAANDTWOFISH-CBC", "org.bouncycastle.jce.provider.JCESecretKeyFactory$PBEWithSHAAndTwofish");
-        put("SecretKeyFactory.PBEWITHHMACRIPEMD160", "org.bouncycastle.jce.provider.JCESecretKeyFactory$PBEWithRIPEMD160");
+        // BEGIN android-removed
+        // put("SecretKeyFactory.PBEWITHHMACRIPEMD160", "org.bouncycastle.jce.provider.JCESecretKeyFactory$PBEWithRIPEMD160");
+        // END android-removed
         put("SecretKeyFactory.PBEWITHHMACSHA1", "org.bouncycastle.jce.provider.JCESecretKeyFactory$PBEWithSHA");
-        put("SecretKeyFactory.PBEWITHHMACTIGER", "org.bouncycastle.jce.provider.JCESecretKeyFactory$PBEWithTiger");
+        // BEGIN android-removed
+        // put("SecretKeyFactory.PBEWITHHMACTIGER", "org.bouncycastle.jce.provider.JCESecretKeyFactory$PBEWithTiger");
+        // END android-removed
         
         put("SecretKeyFactory.PBEWITHMD5AND128BITAES-CBC-OPENSSL", "org.bouncycastle.jce.provider.JCESecretKeyFactory$PBEWithMD5And128BitAESCBCOpenSSL");
         put("SecretKeyFactory.PBEWITHMD5AND192BITAES-CBC-OPENSSL", "org.bouncycastle.jce.provider.JCESecretKeyFactory$PBEWithMD5And192BitAESCBCOpenSSL");
         put("SecretKeyFactory.PBEWITHMD5AND256BITAES-CBC-OPENSSL", "org.bouncycastle.jce.provider.JCESecretKeyFactory$PBEWithMD5And256BitAESCBCOpenSSL");
 
-        put("Alg.Alias.SecretKeyFactory.PBE", "PBE/PKCS5");
-
-        put("Alg.Alias.SecretKeyFactory.BROKENPBEWITHMD5ANDDES", "PBE/PKCS5");
-        put("Alg.Alias.SecretKeyFactory.BROKENPBEWITHSHA1ANDDES", "PBE/PKCS5");
-        put("Alg.Alias.SecretKeyFactory.OLDPBEWITHSHAAND3-KEYTRIPLEDES-CBC", "PBE/PKCS12");
-        put("Alg.Alias.SecretKeyFactory.BROKENPBEWITHSHAAND3-KEYTRIPLEDES-CBC", "PBE/PKCS12");
-        put("Alg.Alias.SecretKeyFactory.BROKENPBEWITHSHAAND2-KEYTRIPLEDES-CBC", "PBE/PKCS12");
-        put("Alg.Alias.SecretKeyFactory.OLDPBEWITHSHAANDTWOFISH-CBC", "PBE/PKCS12");
-
-        put("Alg.Alias.SecretKeyFactory.PBEWITHMD2ANDDES-CBC", "PBEWITHMD2ANDDES");
-        put("Alg.Alias.SecretKeyFactory.PBEWITHMD2ANDRC2-CBC", "PBEWITHMD2ANDRC2");
+        // BEGIN android-removed
+        // put("Alg.Alias.SecretKeyFactory.PBE", "PBE/PKCS5");
+        //
+        // put("Alg.Alias.SecretKeyFactory.BROKENPBEWITHMD5ANDDES", "PBE/PKCS5");
+        // put("Alg.Alias.SecretKeyFactory.BROKENPBEWITHSHA1ANDDES", "PBE/PKCS5");
+        // put("Alg.Alias.SecretKeyFactory.OLDPBEWITHSHAAND3-KEYTRIPLEDES-CBC", "PBE/PKCS12");
+        // put("Alg.Alias.SecretKeyFactory.BROKENPBEWITHSHAAND3-KEYTRIPLEDES-CBC", "PBE/PKCS12");
+        // put("Alg.Alias.SecretKeyFactory.BROKENPBEWITHSHAAND2-KEYTRIPLEDES-CBC", "PBE/PKCS12");
+        // put("Alg.Alias.SecretKeyFactory.OLDPBEWITHSHAANDTWOFISH-CBC", "PBE/PKCS12");
+        // END android-removed
+
+        // BEGIN android-removed
+        // put("Alg.Alias.SecretKeyFactory.PBEWITHMD2ANDDES-CBC", "PBEWITHMD2ANDDES");
+        // put("Alg.Alias.SecretKeyFactory.PBEWITHMD2ANDRC2-CBC", "PBEWITHMD2ANDRC2");
+        // END android-removed
         put("Alg.Alias.SecretKeyFactory.PBEWITHMD5ANDDES-CBC", "PBEWITHMD5ANDDES");
         put("Alg.Alias.SecretKeyFactory.PBEWITHMD5ANDRC2-CBC", "PBEWITHMD5ANDRC2");
         put("Alg.Alias.SecretKeyFactory.PBEWITHSHA1ANDDES-CBC", "PBEWITHSHA1ANDDES");
         put("Alg.Alias.SecretKeyFactory.PBEWITHSHA1ANDRC2-CBC", "PBEWITHSHA1ANDRC2");
-        put("Alg.Alias.SecretKeyFactory." + PKCSObjectIdentifiers.pbeWithMD2AndDES_CBC, "PBEWITHMD2ANDDES");
-        put("Alg.Alias.SecretKeyFactory." + PKCSObjectIdentifiers.pbeWithMD2AndRC2_CBC, "PBEWITHMD2ANDRC2");
+        // BEGIN android-removed
+        // put("Alg.Alias.SecretKeyFactory." + PKCSObjectIdentifiers.pbeWithMD2AndDES_CBC, "PBEWITHMD2ANDDES");
+        // put("Alg.Alias.SecretKeyFactory." + PKCSObjectIdentifiers.pbeWithMD2AndRC2_CBC, "PBEWITHMD2ANDRC2");
+        // END android-removed
         put("Alg.Alias.SecretKeyFactory." + PKCSObjectIdentifiers.pbeWithMD5AndDES_CBC, "PBEWITHMD5ANDDES");
         put("Alg.Alias.SecretKeyFactory." + PKCSObjectIdentifiers.pbeWithMD5AndRC2_CBC, "PBEWITHMD5ANDRC2");
         put("Alg.Alias.SecretKeyFactory." + PKCSObjectIdentifiers.pbeWithSHA1AndDES_CBC, "PBEWITHSHA1ANDDES");
@@ -553,6 +666,10 @@
         put("Alg.Alias.SecretKeyFactory." + BCObjectIdentifiers.bc_pbe_sha256_pkcs12_aes128_cbc.getId(), "PBEWITHSHA256AND128BITAES-CBC-BC");
         put("Alg.Alias.SecretKeyFactory." + BCObjectIdentifiers.bc_pbe_sha256_pkcs12_aes192_cbc.getId(), "PBEWITHSHA256AND192BITAES-CBC-BC");
         put("Alg.Alias.SecretKeyFactory." + BCObjectIdentifiers.bc_pbe_sha256_pkcs12_aes256_cbc.getId(), "PBEWITHSHA256AND256BITAES-CBC-BC");
+        // BEGIN android-added
+
+        put("SecretKeyFactory.PBKDF2WithHmacSHA1", "org.bouncycastle.jce.provider.JCESecretKeyFactory$PBKDF2WithHmacSHA1");
+        // END android-added
 
         addMacAlgorithms();
 
@@ -561,16 +678,23 @@
         addSignatureAlgorithms();
 
     // Certification Path API
-        put("CertPathValidator.RFC3281", "org.bouncycastle.jce.provider.PKIXAttrCertPathValidatorSpi");
-        put("CertPathBuilder.RFC3281", "org.bouncycastle.jce.provider.PKIXAttrCertPathBuilderSpi");
-        put("CertPathValidator.RFC3280", "org.bouncycastle.jce.provider.PKIXCertPathValidatorSpi");
-        put("CertPathBuilder.RFC3280", "org.bouncycastle.jce.provider.PKIXCertPathBuilderSpi");
+        // BEGIN android-removed
+        // put("CertPathValidator.RFC3281", "org.bouncycastle.jce.provider.PKIXAttrCertPathValidatorSpi");
+        // put("CertPathBuilder.RFC3281", "org.bouncycastle.jce.provider.PKIXAttrCertPathBuilderSpi");
+        // END android-removed
+        // BEGIN android-changed
+        // Use Alg.Alias so RFC3280 doesn't show up when iterating provider services, only PKIX
+        put("Alg.Alias.CertPathValidator.RFC3280", "PKIX");
+        put("Alg.Alias.CertPathBuilder.RFC3280", "PKIX");
+        // END android-changed
         put("CertPathValidator.PKIX", "org.bouncycastle.jce.provider.PKIXCertPathValidatorSpi");
         put("CertPathBuilder.PKIX", "org.bouncycastle.jce.provider.PKIXCertPathBuilderSpi");
         put("CertStore.Collection", "org.bouncycastle.jce.provider.CertStoreCollectionSpi");
-        put("CertStore.LDAP", "org.bouncycastle.jce.provider.X509LDAPCertStoreSpi");
-        put("CertStore.Multi", "org.bouncycastle.jce.provider.MultiCertStoreSpi");
-        put("Alg.Alias.CertStore.X509LDAP", "LDAP");
+        // BEGIN android-removed
+        // put("CertStore.LDAP", "org.bouncycastle.jce.provider.X509LDAPCertStoreSpi");
+        // put("CertStore.Multi", "org.bouncycastle.jce.provider.MultiCertStoreSpi");
+        // put("Alg.Alias.CertStore.X509LDAP", "LDAP");
+        // END android-removed
     }
 
     private void loadAlgorithms(String packageName, String[] names)
@@ -631,68 +755,72 @@
     //
     private void addMacAlgorithms()
     {
-        put("Mac.DESMAC", "org.bouncycastle.jce.provider.JCEMac$DES");
-        put("Alg.Alias.Mac.DES", "DESMAC");
-        put("Mac.DESMAC/CFB8", "org.bouncycastle.jce.provider.JCEMac$DESCFB8");
-        put("Alg.Alias.Mac.DES/CFB8", "DESMAC/CFB8");
-
-        put("Mac.DESEDEMAC", "org.bouncycastle.jce.provider.JCEMac$DESede");
-        put("Alg.Alias.Mac.DESEDE", "DESEDEMAC");
-        put("Mac.DESEDEMAC/CFB8", "org.bouncycastle.jce.provider.JCEMac$DESedeCFB8");
-        put("Alg.Alias.Mac.DESEDE/CFB8", "DESEDEMAC/CFB8");
-        
-        put("Mac.DESWITHISO9797", "org.bouncycastle.jce.provider.JCEMac$DES9797Alg3");
-        put("Alg.Alias.Mac.DESISO9797MAC", "DESWITHISO9797");
-        
-        put("Mac.DESEDEMAC64", "org.bouncycastle.jce.provider.JCEMac$DESede64");
-        put("Alg.Alias.Mac.DESEDE64", "DESEDEMAC64");
-
-        put("Mac.DESEDEMAC64WITHISO7816-4PADDING", "org.bouncycastle.jce.provider.JCEMac$DESede64with7816d4");
-        put("Alg.Alias.Mac.DESEDE64WITHISO7816-4PADDING", "DESEDEMAC64WITHISO7816-4PADDING");
-        put("Alg.Alias.Mac.DESEDEISO9797ALG1MACWITHISO7816-4PADDING", "DESEDEMAC64WITHISO7816-4PADDING");
-        put("Alg.Alias.Mac.DESEDEISO9797ALG1WITHISO7816-4PADDING", "DESEDEMAC64WITHISO7816-4PADDING");
-
-        put("Mac.ISO9797ALG3MAC", "org.bouncycastle.jce.provider.JCEMac$DES9797Alg3");
-        put("Alg.Alias.Mac.ISO9797ALG3", "ISO9797ALG3MAC");
-        put("Mac.ISO9797ALG3WITHISO7816-4PADDING", "org.bouncycastle.jce.provider.JCEMac$DES9797Alg3with7816d4");
-        put("Alg.Alias.Mac.ISO9797ALG3MACWITHISO7816-4PADDING", "ISO9797ALG3WITHISO7816-4PADDING");
-
-        put("Mac.SKIPJACKMAC", "org.bouncycastle.jce.provider.JCEMac$Skipjack");
-        put("Alg.Alias.Mac.SKIPJACK", "SKIPJACKMAC");
-        put("Mac.SKIPJACKMAC/CFB8", "org.bouncycastle.jce.provider.JCEMac$SkipjackCFB8");
-        put("Alg.Alias.Mac.SKIPJACK/CFB8", "SKIPJACKMAC/CFB8");
-
-        put("Mac.RC2MAC", "org.bouncycastle.jce.provider.JCEMac$RC2");
-        put("Alg.Alias.Mac.RC2", "RC2MAC");
-        put("Mac.RC2MAC/CFB8", "org.bouncycastle.jce.provider.JCEMac$RC2CFB8");
-        put("Alg.Alias.Mac.RC2/CFB8", "RC2MAC/CFB8");
-
-        put("Mac.RC5MAC", "org.bouncycastle.jce.provider.JCEMac$RC5");
-        put("Alg.Alias.Mac.RC5", "RC5MAC");
-        put("Mac.RC5MAC/CFB8", "org.bouncycastle.jce.provider.JCEMac$RC5CFB8");
-        put("Alg.Alias.Mac.RC5/CFB8", "RC5MAC/CFB8");
-
-        put("Mac.GOST28147MAC", "org.bouncycastle.jce.provider.JCEMac$GOST28147");
-        put("Alg.Alias.Mac.GOST28147", "GOST28147MAC");
-
-        put("Mac.VMPCMAC", "org.bouncycastle.jce.provider.JCEMac$VMPC");
-        put("Alg.Alias.Mac.VMPC", "VMPCMAC");
-        put("Alg.Alias.Mac.VMPC-MAC", "VMPCMAC");
-
-        put("Mac.OLDHMACSHA384", "org.bouncycastle.jce.provider.JCEMac$OldSHA384");
-
-        put("Mac.OLDHMACSHA512", "org.bouncycastle.jce.provider.JCEMac$OldSHA512");
-
-        addHMACAlgorithm("MD2", "org.bouncycastle.jce.provider.JCEMac$MD2", "org.bouncycastle.jce.provider.JCEKeyGenerator$MD2HMAC");
-        addHMACAlgorithm("MD4", "org.bouncycastle.jce.provider.JCEMac$MD4", "org.bouncycastle.jce.provider.JCEKeyGenerator$MD4HMAC");
+        // BEGIN android-removed
+        // put("Mac.DESMAC", "org.bouncycastle.jce.provider.JCEMac$DES");
+        // put("Alg.Alias.Mac.DES", "DESMAC");
+        // put("Mac.DESMAC/CFB8", "org.bouncycastle.jce.provider.JCEMac$DESCFB8");
+        // put("Alg.Alias.Mac.DES/CFB8", "DESMAC/CFB8");
+        //
+        // put("Mac.DESEDEMAC", "org.bouncycastle.jce.provider.JCEMac$DESede");
+        // put("Alg.Alias.Mac.DESEDE", "DESEDEMAC");
+        // put("Mac.DESEDEMAC/CFB8", "org.bouncycastle.jce.provider.JCEMac$DESedeCFB8");
+        // put("Alg.Alias.Mac.DESEDE/CFB8", "DESEDEMAC/CFB8");
+        //
+        // put("Mac.DESWITHISO9797", "org.bouncycastle.jce.provider.JCEMac$DES9797Alg3");
+        // put("Alg.Alias.Mac.DESISO9797MAC", "DESWITHISO9797");
+        //
+        // put("Mac.DESEDEMAC64", "org.bouncycastle.jce.provider.JCEMac$DESede64");
+        // put("Alg.Alias.Mac.DESEDE64", "DESEDEMAC64");
+        //
+        // put("Mac.DESEDEMAC64WITHISO7816-4PADDING", "org.bouncycastle.jce.provider.JCEMac$DESede64with7816d4");
+        // put("Alg.Alias.Mac.DESEDE64WITHISO7816-4PADDING", "DESEDEMAC64WITHISO7816-4PADDING");
+        // put("Alg.Alias.Mac.DESEDEISO9797ALG1MACWITHISO7816-4PADDING", "DESEDEMAC64WITHISO7816-4PADDING");
+        // put("Alg.Alias.Mac.DESEDEISO9797ALG1WITHISO7816-4PADDING", "DESEDEMAC64WITHISO7816-4PADDING");
+        //
+        // put("Mac.ISO9797ALG3MAC", "org.bouncycastle.jce.provider.JCEMac$DES9797Alg3");
+        // put("Alg.Alias.Mac.ISO9797ALG3", "ISO9797ALG3MAC");
+        // put("Mac.ISO9797ALG3WITHISO7816-4PADDING", "org.bouncycastle.jce.provider.JCEMac$DES9797Alg3with7816d4");
+        // put("Alg.Alias.Mac.ISO9797ALG3MACWITHISO7816-4PADDING", "ISO9797ALG3WITHISO7816-4PADDING");
+        //
+        // put("Mac.SKIPJACKMAC", "org.bouncycastle.jce.provider.JCEMac$Skipjack");
+        // put("Alg.Alias.Mac.SKIPJACK", "SKIPJACKMAC");
+        // put("Mac.SKIPJACKMAC/CFB8", "org.bouncycastle.jce.provider.JCEMac$SkipjackCFB8");
+        // put("Alg.Alias.Mac.SKIPJACK/CFB8", "SKIPJACKMAC/CFB8");
+        //
+        // put("Mac.RC2MAC", "org.bouncycastle.jce.provider.JCEMac$RC2");
+        // put("Alg.Alias.Mac.RC2", "RC2MAC");
+        // put("Mac.RC2MAC/CFB8", "org.bouncycastle.jce.provider.JCEMac$RC2CFB8");
+        // put("Alg.Alias.Mac.RC2/CFB8", "RC2MAC/CFB8");
+        //
+        // put("Mac.RC5MAC", "org.bouncycastle.jce.provider.JCEMac$RC5");
+        // put("Alg.Alias.Mac.RC5", "RC5MAC");
+        // put("Mac.RC5MAC/CFB8", "org.bouncycastle.jce.provider.JCEMac$RC5CFB8");
+        // put("Alg.Alias.Mac.RC5/CFB8", "RC5MAC/CFB8");
+        //
+        // put("Mac.GOST28147MAC", "org.bouncycastle.jce.provider.JCEMac$GOST28147");
+        // put("Alg.Alias.Mac.GOST28147", "GOST28147MAC");
+        //
+        // put("Mac.VMPCMAC", "org.bouncycastle.jce.provider.JCEMac$VMPC");
+        // put("Alg.Alias.Mac.VMPC", "VMPCMAC");
+        // put("Alg.Alias.Mac.VMPC-MAC", "VMPCMAC");
+        //
+        // put("Mac.OLDHMACSHA384", "org.bouncycastle.jce.provider.JCEMac$OldSHA384");
+        //
+        // put("Mac.OLDHMACSHA512", "org.bouncycastle.jce.provider.JCEMac$OldSHA512");
+        //
+        // addHMACAlgorithm("MD2", "org.bouncycastle.jce.provider.JCEMac$MD2", "org.bouncycastle.jce.provider.JCEKeyGenerator$MD2HMAC");
+        // addHMACAlgorithm("MD4", "org.bouncycastle.jce.provider.JCEMac$MD4", "org.bouncycastle.jce.provider.JCEKeyGenerator$MD4HMAC");
+        // END android-removed
         addHMACAlgorithm("MD5", "org.bouncycastle.jce.provider.JCEMac$MD5", "org.bouncycastle.jce.provider.JCEKeyGenerator$MD5HMAC");
         addHMACAlias("MD5", IANAObjectIdentifiers.hmacMD5);
 
         addHMACAlgorithm("SHA1", "org.bouncycastle.jce.provider.JCEMac$SHA1", "org.bouncycastle.jce.provider.JCEKeyGenerator$HMACSHA1");
         addHMACAlias("SHA1", PKCSObjectIdentifiers.id_hmacWithSHA1);
         addHMACAlias("SHA1", IANAObjectIdentifiers.hmacSHA1);
-        addHMACAlgorithm("SHA224", "org.bouncycastle.jce.provider.JCEMac$SHA224", "org.bouncycastle.jce.provider.JCEKeyGenerator$HMACSHA224");
-        addHMACAlias("SHA224", PKCSObjectIdentifiers.id_hmacWithSHA224);
+        // BEGIN android-removed
+        // addHMACAlgorithm("SHA224", "org.bouncycastle.jce.provider.JCEMac$SHA224", "org.bouncycastle.jce.provider.JCEKeyGenerator$HMACSHA224");
+        // addHMACAlias("SHA224", PKCSObjectIdentifiers.id_hmacWithSHA224);
+        // END android-removed
         addHMACAlgorithm("SHA256", "org.bouncycastle.jce.provider.JCEMac$SHA256", "org.bouncycastle.jce.provider.JCEKeyGenerator$HMACSHA256");
         addHMACAlias("SHA256", PKCSObjectIdentifiers.id_hmacWithSHA256);
         addHMACAlgorithm("SHA384", "org.bouncycastle.jce.provider.JCEMac$SHA384", "org.bouncycastle.jce.provider.JCEKeyGenerator$HMACSHA384");
@@ -700,16 +828,20 @@
         addHMACAlgorithm("SHA512", "org.bouncycastle.jce.provider.JCEMac$SHA512", "org.bouncycastle.jce.provider.JCEKeyGenerator$HMACSHA512");
         addHMACAlias("SHA512", PKCSObjectIdentifiers.id_hmacWithSHA512);
 
-        addHMACAlgorithm("RIPEMD128", "org.bouncycastle.jce.provider.JCEMac$RIPEMD128", "org.bouncycastle.jce.provider.JCEKeyGenerator$RIPEMD128HMAC");
-        addHMACAlgorithm("RIPEMD160", "org.bouncycastle.jce.provider.JCEMac$RIPEMD160", "org.bouncycastle.jce.provider.JCEKeyGenerator$RIPEMD160HMAC");
-        addHMACAlias("RIPEMD160", IANAObjectIdentifiers.hmacRIPEMD160);
-
-        addHMACAlgorithm("TIGER", "org.bouncycastle.jce.provider.JCEMac$Tiger", "org.bouncycastle.jce.provider.JCEKeyGenerator$HMACTIGER");
-        addHMACAlias("TIGER", IANAObjectIdentifiers.hmacTIGER);
+        // BEGIN android-removed
+        // addHMACAlgorithm("RIPEMD128", "org.bouncycastle.jce.provider.JCEMac$RIPEMD128", "org.bouncycastle.jce.provider.JCEKeyGenerator$RIPEMD128HMAC");
+        // addHMACAlgorithm("RIPEMD160", "org.bouncycastle.jce.provider.JCEMac$RIPEMD160", "org.bouncycastle.jce.provider.JCEKeyGenerator$RIPEMD160HMAC");
+        // addHMACAlias("RIPEMD160", IANAObjectIdentifiers.hmacRIPEMD160);
+        //
+        // addHMACAlgorithm("TIGER", "org.bouncycastle.jce.provider.JCEMac$Tiger", "org.bouncycastle.jce.provider.JCEKeyGenerator$HMACTIGER");
+        // addHMACAlias("TIGER", IANAObjectIdentifiers.hmacTIGER);
+        // END android-removed
 
         put("Mac.PBEWITHHMACSHA", "org.bouncycastle.jce.provider.JCEMac$PBEWithSHA");
         put("Mac.PBEWITHHMACSHA1", "org.bouncycastle.jce.provider.JCEMac$PBEWithSHA");
-        put("Mac.PBEWITHHMACRIPEMD160", "org.bouncycastle.jce.provider.JCEMac$PBEWithRIPEMD160");
+        // BEGIN android-removed
+        // put("Mac.PBEWITHHMACRIPEMD160", "org.bouncycastle.jce.provider.JCEMac$PBEWithRIPEMD160");
+        // END android-removed
         put("Alg.Alias.Mac.1.3.14.3.2.26", "PBEWITHHMACSHA");
     }
 
@@ -747,9 +879,11 @@
         put("Alg.Alias.MessageDigest.SHA1", "SHA-1");
         put("Alg.Alias.MessageDigest.SHA", "SHA-1");
         put("Alg.Alias.MessageDigest." + OIWObjectIdentifiers.idSHA1, "SHA-1");
-        put("MessageDigest.SHA-224", "org.bouncycastle.jce.provider.JDKMessageDigest$SHA224");
-        put("Alg.Alias.MessageDigest.SHA224", "SHA-224");
-        put("Alg.Alias.MessageDigest." + NISTObjectIdentifiers.id_sha224, "SHA-224");
+        // BEGIN android-removed
+        // put("MessageDigest.SHA-224", "org.bouncycastle.jce.provider.JDKMessageDigest$SHA224");
+        // put("Alg.Alias.MessageDigest.SHA224", "SHA-224");
+        // put("Alg.Alias.MessageDigest." + NISTObjectIdentifiers.id_sha224, "SHA-224");
+        // END android-removed
         put("MessageDigest.SHA-256", "org.bouncycastle.jce.provider.JDKMessageDigest$SHA256");
         put("Alg.Alias.MessageDigest.SHA256", "SHA-256");
         put("Alg.Alias.MessageDigest." + NISTObjectIdentifiers.id_sha256, "SHA-256");
@@ -760,27 +894,31 @@
         put("Alg.Alias.MessageDigest.SHA512", "SHA-512");
         put("Alg.Alias.MessageDigest." + NISTObjectIdentifiers.id_sha512, "SHA-512");
         
-        put("MessageDigest.MD2", "org.bouncycastle.jce.provider.JDKMessageDigest$MD2");
-        put("Alg.Alias.MessageDigest." + PKCSObjectIdentifiers.md2, "MD2");
-        put("MessageDigest.MD4", "org.bouncycastle.jce.provider.JDKMessageDigest$MD4");
-        put("Alg.Alias.MessageDigest." + PKCSObjectIdentifiers.md4, "MD4");
+        // BEGIN android-removed
+        // put("MessageDigest.MD2", "org.bouncycastle.jce.provider.JDKMessageDigest$MD2");
+        // put("Alg.Alias.MessageDigest." + PKCSObjectIdentifiers.md2, "MD2");
+        // put("MessageDigest.MD4", "org.bouncycastle.jce.provider.JDKMessageDigest$MD4");
+        // put("Alg.Alias.MessageDigest." + PKCSObjectIdentifiers.md4, "MD4");
+        // END android-removed
         put("MessageDigest.MD5", "org.bouncycastle.jce.provider.JDKMessageDigest$MD5");
         put("Alg.Alias.MessageDigest." + PKCSObjectIdentifiers.md5, "MD5");
-        put("MessageDigest.RIPEMD128", "org.bouncycastle.jce.provider.JDKMessageDigest$RIPEMD128");
-        put("Alg.Alias.MessageDigest." + TeleTrusTObjectIdentifiers.ripemd128, "RIPEMD128");
-        put("MessageDigest.RIPEMD160", "org.bouncycastle.jce.provider.JDKMessageDigest$RIPEMD160");
-        put("Alg.Alias.MessageDigest." + TeleTrusTObjectIdentifiers.ripemd160, "RIPEMD160");
-        put("MessageDigest.RIPEMD256", "org.bouncycastle.jce.provider.JDKMessageDigest$RIPEMD256");
-        put("Alg.Alias.MessageDigest." + TeleTrusTObjectIdentifiers.ripemd256, "RIPEMD256");
-        put("MessageDigest.RIPEMD320", "org.bouncycastle.jce.provider.JDKMessageDigest$RIPEMD320");
-        put("MessageDigest.Tiger", "org.bouncycastle.jce.provider.JDKMessageDigest$Tiger");
-        
-        put("MessageDigest.WHIRLPOOL", "org.bouncycastle.jce.provider.JDKMessageDigest$Whirlpool");
-        
-        put("MessageDigest.GOST3411", "org.bouncycastle.jce.provider.JDKMessageDigest$GOST3411");
-        put("Alg.Alias.MessageDigest.GOST", "GOST3411");
-        put("Alg.Alias.MessageDigest.GOST-3411", "GOST3411");
-        put("Alg.Alias.MessageDigest." + CryptoProObjectIdentifiers.gostR3411, "GOST3411");
+        // BEGIN android-removed
+        // put("MessageDigest.RIPEMD128", "org.bouncycastle.jce.provider.JDKMessageDigest$RIPEMD128");
+        // put("Alg.Alias.MessageDigest." + TeleTrusTObjectIdentifiers.ripemd128, "RIPEMD128");
+        // put("MessageDigest.RIPEMD160", "org.bouncycastle.jce.provider.JDKMessageDigest$RIPEMD160");
+        // put("Alg.Alias.MessageDigest." + TeleTrusTObjectIdentifiers.ripemd160, "RIPEMD160");
+        // put("MessageDigest.RIPEMD256", "org.bouncycastle.jce.provider.JDKMessageDigest$RIPEMD256");
+        // put("Alg.Alias.MessageDigest." + TeleTrusTObjectIdentifiers.ripemd256, "RIPEMD256");
+        // put("MessageDigest.RIPEMD320", "org.bouncycastle.jce.provider.JDKMessageDigest$RIPEMD320");
+        // put("MessageDigest.Tiger", "org.bouncycastle.jce.provider.JDKMessageDigest$Tiger");
+        
+        // put("MessageDigest.WHIRLPOOL", "org.bouncycastle.jce.provider.JDKMessageDigest$Whirlpool");
+        
+        // put("MessageDigest.GOST3411", "org.bouncycastle.jce.provider.JDKMessageDigest$GOST3411");
+        // put("Alg.Alias.MessageDigest.GOST", "GOST3411");
+        // put("Alg.Alias.MessageDigest.GOST-3411", "GOST3411");
+        // put("Alg.Alias.MessageDigest." + CryptoProObjectIdentifiers.gostR3411, "GOST3411");
+        // END android-removed
     }
     
     //
@@ -788,55 +926,70 @@
     //
     private void addSignatureAlgorithms()
     {
-        put("Signature.MD2WithRSAEncryption", "org.bouncycastle.jce.provider.JDKDigestSignature$MD2WithRSAEncryption");
-        put("Signature.MD4WithRSAEncryption", "org.bouncycastle.jce.provider.JDKDigestSignature$MD4WithRSAEncryption");
+        // BEGIN android-removed
+        // Dropping MD2
+        // put("Signature.MD2WithRSAEncryption", "org.bouncycastle.jce.provider.JDKDigestSignature$MD2WithRSAEncryption");
+        // put("Signature.MD4WithRSAEncryption", "org.bouncycastle.jce.provider.JDKDigestSignature$MD4WithRSAEncryption");
+        // END android-removed
         put("Signature.MD5WithRSAEncryption", "org.bouncycastle.jce.provider.JDKDigestSignature$MD5WithRSAEncryption");
         put("Signature.SHA1WithRSAEncryption", "org.bouncycastle.jce.provider.JDKDigestSignature$SHA1WithRSAEncryption");
-        put("Signature.SHA224WithRSAEncryption", "org.bouncycastle.jce.provider.JDKDigestSignature$SHA224WithRSAEncryption");
+        // BEGIN android-removed
+        // put("Signature.SHA224WithRSAEncryption", "org.bouncycastle.jce.provider.JDKDigestSignature$SHA224WithRSAEncryption");
+        // END android-removed
         put("Signature.SHA256WithRSAEncryption", "org.bouncycastle.jce.provider.JDKDigestSignature$SHA256WithRSAEncryption");
         put("Signature.SHA384WithRSAEncryption", "org.bouncycastle.jce.provider.JDKDigestSignature$SHA384WithRSAEncryption");
         put("Signature.SHA512WithRSAEncryption", "org.bouncycastle.jce.provider.JDKDigestSignature$SHA512WithRSAEncryption");
-        put("Signature.RIPEMD160WithRSAEncryption", "org.bouncycastle.jce.provider.JDKDigestSignature$RIPEMD160WithRSAEncryption");
-        put("Signature.RIPEMD128WithRSAEncryption", "org.bouncycastle.jce.provider.JDKDigestSignature$RIPEMD128WithRSAEncryption");
-        put("Signature.RIPEMD256WithRSAEncryption", "org.bouncycastle.jce.provider.JDKDigestSignature$RIPEMD256WithRSAEncryption");
-        put("Signature.DSA", "org.bouncycastle.jce.provider.JDKDSASigner$stdDSA");
+        // BEGIN android-removed
+        // put("Signature.RIPEMD160WithRSAEncryption", "org.bouncycastle.jce.provider.JDKDigestSignature$RIPEMD160WithRSAEncryption");
+        // put("Signature.RIPEMD128WithRSAEncryption", "org.bouncycastle.jce.provider.JDKDigestSignature$RIPEMD128WithRSAEncryption");
+        // put("Signature.RIPEMD256WithRSAEncryption", "org.bouncycastle.jce.provider.JDKDigestSignature$RIPEMD256WithRSAEncryption");
+        // END android-removed
+        // BEGIN android-changed
+        put("Signature.SHA1withDSA", "org.bouncycastle.jce.provider.JDKDSASigner$stdDSA");
+        // END android-changed
         put("Signature.NONEWITHDSA", "org.bouncycastle.jce.provider.JDKDSASigner$noneDSA");
-        put("Signature.SHA1withRSA/ISO9796-2", "org.bouncycastle.jce.provider.JDKISOSignature$SHA1WithRSAEncryption");
-        put("Signature.MD5withRSA/ISO9796-2", "org.bouncycastle.jce.provider.JDKISOSignature$MD5WithRSAEncryption");
-        put("Signature.RIPEMD160withRSA/ISO9796-2", "org.bouncycastle.jce.provider.JDKISOSignature$RIPEMD160WithRSAEncryption");
-
-        put("Signature.RSASSA-PSS", "org.bouncycastle.jce.provider.JDKPSSSigner$PSSwithRSA");
-        put("Signature." + PKCSObjectIdentifiers.id_RSASSA_PSS, "org.bouncycastle.jce.provider.JDKPSSSigner$PSSwithRSA");
-        put("Signature.SHA1withRSA/PSS", "org.bouncycastle.jce.provider.JDKPSSSigner$SHA1withRSA");
-        put("Signature.SHA224withRSA/PSS", "org.bouncycastle.jce.provider.JDKPSSSigner$SHA224withRSA");
-        put("Signature.SHA256withRSA/PSS", "org.bouncycastle.jce.provider.JDKPSSSigner$SHA256withRSA");
-        put("Signature.SHA384withRSA/PSS", "org.bouncycastle.jce.provider.JDKPSSSigner$SHA384withRSA");
-        put("Signature.SHA512withRSA/PSS", "org.bouncycastle.jce.provider.JDKPSSSigner$SHA512withRSA");
-
-        put("Signature.RSA", "org.bouncycastle.jce.provider.JDKDigestSignature$noneRSA");
-        put("Signature.RAWRSASSA-PSS", "org.bouncycastle.jce.provider.JDKPSSSigner$nonePSS");
+        // BEGIN android-removed
+        // put("Signature.SHA1withRSA/ISO9796-2", "org.bouncycastle.jce.provider.JDKISOSignature$SHA1WithRSAEncryption");
+        // put("Signature.MD5withRSA/ISO9796-2", "org.bouncycastle.jce.provider.JDKISOSignature$MD5WithRSAEncryption");
+        // put("Signature.RIPEMD160withRSA/ISO9796-2", "org.bouncycastle.jce.provider.JDKISOSignature$RIPEMD160WithRSAEncryption");
+        //
+        // put("Signature.RSASSA-PSS", "org.bouncycastle.jce.provider.JDKPSSSigner$PSSwithRSA");
+        // put("Signature." + PKCSObjectIdentifiers.id_RSASSA_PSS, "org.bouncycastle.jce.provider.JDKPSSSigner$PSSwithRSA");
+        // put("Signature.SHA1withRSA/PSS", "org.bouncycastle.jce.provider.JDKPSSSigner$SHA1withRSA");
+        // put("Signature.SHA224withRSA/PSS", "org.bouncycastle.jce.provider.JDKPSSSigner$SHA224withRSA");
+        // put("Signature.SHA256withRSA/PSS", "org.bouncycastle.jce.provider.JDKPSSSigner$SHA256withRSA");
+        // put("Signature.SHA384withRSA/PSS", "org.bouncycastle.jce.provider.JDKPSSSigner$SHA384withRSA");
+        // put("Signature.SHA512withRSA/PSS", "org.bouncycastle.jce.provider.JDKPSSSigner$SHA512withRSA");
+        //
+        // put("Signature.RSA", "org.bouncycastle.jce.provider.JDKDigestSignature$noneRSA");
+        // put("Signature.RAWRSASSA-PSS", "org.bouncycastle.jce.provider.JDKPSSSigner$nonePSS");
+        // END android-removed
 
         put("Alg.Alias.Signature.RAWDSA", "NONEWITHDSA");
 
-        put("Alg.Alias.Signature.RAWRSA", "RSA");
-        put("Alg.Alias.Signature.NONEWITHRSA", "RSA");
-        put("Alg.Alias.Signature.RAWRSAPSS", "RAWRSASSA-PSS");
-        put("Alg.Alias.Signature.NONEWITHRSAPSS", "RAWRSASSA-PSS");
-        put("Alg.Alias.Signature.NONEWITHRSASSA-PSS", "RAWRSASSA-PSS");
-
-        put("Alg.Alias.Signature.RSAPSS", "RSASSA-PSS");
-
-        put("Alg.Alias.Signature.SHA1withRSAandMGF1", "SHA1withRSA/PSS");
-        put("Alg.Alias.Signature.SHA224withRSAandMGF1", "SHA224withRSA/PSS");
-        put("Alg.Alias.Signature.SHA256withRSAandMGF1", "SHA256withRSA/PSS");
-        put("Alg.Alias.Signature.SHA384withRSAandMGF1", "SHA384withRSA/PSS");
-        put("Alg.Alias.Signature.SHA512withRSAandMGF1", "SHA512withRSA/PSS");
-        
-        put("Alg.Alias.Signature.MD2withRSAEncryption", "MD2WithRSAEncryption");
-        put("Alg.Alias.Signature.MD4withRSAEncryption", "MD4WithRSAEncryption");
+        // BEGIN android-removed
+        // put("Alg.Alias.Signature.RAWRSA", "RSA");
+        // put("Alg.Alias.Signature.NONEWITHRSA", "RSA");
+        // put("Alg.Alias.Signature.RAWRSAPSS", "RAWRSASSA-PSS");
+        // put("Alg.Alias.Signature.NONEWITHRSAPSS", "RAWRSASSA-PSS");
+        // put("Alg.Alias.Signature.NONEWITHRSASSA-PSS", "RAWRSASSA-PSS");
+        //
+        // put("Alg.Alias.Signature.RSAPSS", "RSASSA-PSS");
+        //
+        // put("Alg.Alias.Signature.SHA1withRSAandMGF1", "SHA1withRSA/PSS");
+        // put("Alg.Alias.Signature.SHA224withRSAandMGF1", "SHA224withRSA/PSS");
+        // put("Alg.Alias.Signature.SHA256withRSAandMGF1", "SHA256withRSA/PSS");
+        // put("Alg.Alias.Signature.SHA384withRSAandMGF1", "SHA384withRSA/PSS");
+        // put("Alg.Alias.Signature.SHA512withRSAandMGF1", "SHA512withRSA/PSS");
+        //
+        // put("Alg.Alias.Signature.MD2withRSAEncryption", "MD2WithRSAEncryption");
+        // put("Alg.Alias.Signature.MD4withRSAEncryption", "MD4WithRSAEncryption");
+        // END android-removed
         put("Alg.Alias.Signature.MD5withRSAEncryption", "MD5WithRSAEncryption");
         put("Alg.Alias.Signature.SHA1withRSAEncryption", "SHA1WithRSAEncryption");
-        put("Alg.Alias.Signature.SHA224withRSAEncryption", "SHA224WithRSAEncryption");
+        // BEGIN android-removed
+        // put("Alg.Alias.Signature.SHA224withRSAEncryption", "SHA224WithRSAEncryption");
+        // END android-removed
 
         put("Alg.Alias.Signature.SHA256withRSAEncryption", "SHA256WithRSAEncryption");
         put("Alg.Alias.Signature.SHA384withRSAEncryption", "SHA384WithRSAEncryption");
@@ -850,24 +1003,30 @@
         put("Alg.Alias.Signature.SHA384WITHRSAENCRYPTION", "SHA384WithRSAEncryption");
         put("Alg.Alias.Signature.SHA512WITHRSAENCRYPTION", "SHA512WithRSAEncryption");
 
-        put("Alg.Alias.Signature.RIPEMD160withRSAEncryption", "RIPEMD160WithRSAEncryption");
-
-        put("Alg.Alias.Signature." + PKCSObjectIdentifiers.md2WithRSAEncryption, "MD2WithRSAEncryption");
-        put("Alg.Alias.Signature.MD2WithRSA", "MD2WithRSAEncryption");
-        put("Alg.Alias.Signature.MD2withRSA", "MD2WithRSAEncryption");
-        put("Alg.Alias.Signature.MD2/RSA", "MD2WithRSAEncryption");
+        // BEGIN android-removed
+        // Dropping MD2
+        // put("Alg.Alias.Signature.RIPEMD160withRSAEncryption", "RIPEMD160WithRSAEncryption");
+        // put("Alg.Alias.Signature." + PKCSObjectIdentifiers.md2WithRSAEncryption, "MD2WithRSAEncryption");
+        // put("Alg.Alias.Signature.MD2WithRSA", "MD2WithRSAEncryption");
+        // put("Alg.Alias.Signature.MD2withRSA", "MD2WithRSAEncryption");
+        // put("Alg.Alias.Signature.MD2/RSA", "MD2WithRSAEncryption");
+        // END android-removed
         put("Alg.Alias.Signature.MD5WithRSA", "MD5WithRSAEncryption");
         put("Alg.Alias.Signature.MD5withRSA", "MD5WithRSAEncryption");
         put("Alg.Alias.Signature.MD5/RSA", "MD5WithRSAEncryption");
         put("Alg.Alias.Signature." + PKCSObjectIdentifiers.md5WithRSAEncryption, "MD5WithRSAEncryption");
-        put("Alg.Alias.Signature.MD4WithRSA", "MD4WithRSAEncryption");
-        put("Alg.Alias.Signature.MD4withRSA", "MD4WithRSAEncryption");
-        put("Alg.Alias.Signature.MD4/RSA", "MD4WithRSAEncryption");
-        put("Alg.Alias.Signature." + PKCSObjectIdentifiers.md4WithRSAEncryption, "MD4WithRSAEncryption");
+        // BEGIN android-removed
+        // put("Alg.Alias.Signature.MD4WithRSA", "MD4WithRSAEncryption");
+        // put("Alg.Alias.Signature.MD4withRSA", "MD4WithRSAEncryption");
+        // put("Alg.Alias.Signature.MD4/RSA", "MD4WithRSAEncryption");
+        // put("Alg.Alias.Signature." + PKCSObjectIdentifiers.md4WithRSAEncryption, "MD4WithRSAEncryption");
+        // END android-removed
         put("Alg.Alias.Signature.SHA1WithRSA", "SHA1WithRSAEncryption");
         put("Alg.Alias.Signature.SHA1withRSA", "SHA1WithRSAEncryption");
-        put("Alg.Alias.Signature.SHA224WithRSA", "SHA224WithRSAEncryption");
-        put("Alg.Alias.Signature.SHA224withRSA", "SHA224WithRSAEncryption");
+        // BEGIN android-removed
+        // put("Alg.Alias.Signature.SHA224WithRSA", "SHA224WithRSAEncryption");
+        // put("Alg.Alias.Signature.SHA224withRSA", "SHA224WithRSAEncryption");
+        // END android-removed
         put("Alg.Alias.Signature.SHA256WithRSA", "SHA256WithRSAEncryption");
         put("Alg.Alias.Signature.SHA256withRSA", "SHA256WithRSAEncryption");
         put("Alg.Alias.Signature.SHA384WithRSA", "SHA384WithRSAEncryption");
@@ -877,92 +1036,110 @@
         put("Alg.Alias.Signature.SHA1/RSA", "SHA1WithRSAEncryption");
         put("Alg.Alias.Signature.SHA-1/RSA", "SHA1WithRSAEncryption");
         put("Alg.Alias.Signature." + PKCSObjectIdentifiers.sha1WithRSAEncryption, "SHA1WithRSAEncryption");
-        put("Alg.Alias.Signature." + PKCSObjectIdentifiers.sha224WithRSAEncryption, "SHA224WithRSAEncryption");
+        // BEGIN android-removed
+        // put("Alg.Alias.Signature." + PKCSObjectIdentifiers.sha224WithRSAEncryption, "SHA224WithRSAEncryption");
+        // END android-removed
         put("Alg.Alias.Signature." + PKCSObjectIdentifiers.sha256WithRSAEncryption, "SHA256WithRSAEncryption");
         put("Alg.Alias.Signature." + PKCSObjectIdentifiers.sha384WithRSAEncryption, "SHA384WithRSAEncryption");
         put("Alg.Alias.Signature." + PKCSObjectIdentifiers.sha512WithRSAEncryption, "SHA512WithRSAEncryption");
         put("Alg.Alias.Signature.1.3.14.3.2.26with1.2.840.113549.1.1.1", "SHA1WithRSAEncryption");
         put("Alg.Alias.Signature.1.3.14.3.2.26with1.2.840.113549.1.1.5", "SHA1WithRSAEncryption");
         put("Alg.Alias.Signature.1.2.840.113549.2.5with1.2.840.113549.1.1.1", "MD5WithRSAEncryption");
-        put("Alg.Alias.Signature.RIPEMD160WithRSA", "RIPEMD160WithRSAEncryption");
-        put("Alg.Alias.Signature.RIPEMD160withRSA", "RIPEMD160WithRSAEncryption");
-        put("Alg.Alias.Signature.RIPEMD128WithRSA", "RIPEMD128WithRSAEncryption");
-        put("Alg.Alias.Signature.RIPEMD128withRSA", "RIPEMD128WithRSAEncryption");
-        put("Alg.Alias.Signature.RIPEMD256WithRSA", "RIPEMD256WithRSAEncryption");
-        put("Alg.Alias.Signature.RIPEMD256withRSA", "RIPEMD256WithRSAEncryption");
-        put("Alg.Alias.Signature.RIPEMD-160/RSA", "RIPEMD160WithRSAEncryption");
-        put("Alg.Alias.Signature.RMD160withRSA", "RIPEMD160WithRSAEncryption");
-        put("Alg.Alias.Signature.RMD160/RSA", "RIPEMD160WithRSAEncryption");
-        put("Alg.Alias.Signature.1.3.36.3.3.1.2", "RIPEMD160WithRSAEncryption");
-        put("Alg.Alias.Signature.1.3.36.3.3.1.3", "RIPEMD128WithRSAEncryption");
-        put("Alg.Alias.Signature.1.3.36.3.3.1.4", "RIPEMD256WithRSAEncryption");
+        // BEGIN android-removed
+        // put("Alg.Alias.Signature.RIPEMD160WithRSA", "RIPEMD160WithRSAEncryption");
+        // put("Alg.Alias.Signature.RIPEMD160withRSA", "RIPEMD160WithRSAEncryption");
+        // put("Alg.Alias.Signature.RIPEMD128WithRSA", "RIPEMD128WithRSAEncryption");
+        // put("Alg.Alias.Signature.RIPEMD128withRSA", "RIPEMD128WithRSAEncryption");
+        // put("Alg.Alias.Signature.RIPEMD256WithRSA", "RIPEMD256WithRSAEncryption");
+        // put("Alg.Alias.Signature.RIPEMD256withRSA", "RIPEMD256WithRSAEncryption");
+        // put("Alg.Alias.Signature.RIPEMD-160/RSA", "RIPEMD160WithRSAEncryption");
+        // put("Alg.Alias.Signature.RMD160withRSA", "RIPEMD160WithRSAEncryption");
+        // put("Alg.Alias.Signature.RMD160/RSA", "RIPEMD160WithRSAEncryption");
+        // put("Alg.Alias.Signature.1.3.36.3.3.1.2", "RIPEMD160WithRSAEncryption");
+        // put("Alg.Alias.Signature.1.3.36.3.3.1.3", "RIPEMD128WithRSAEncryption");
+        // put("Alg.Alias.Signature.1.3.36.3.3.1.4", "RIPEMD256WithRSAEncryption");
+        // END android-removed
         put("Alg.Alias.Signature." + OIWObjectIdentifiers.sha1WithRSA, "SHA1WithRSAEncryption");
         
-        put("Alg.Alias.Signature.MD2WITHRSAENCRYPTION", "MD2WithRSAEncryption");
+        // BEGIN android-removed
+        // put("Alg.Alias.Signature.MD2WITHRSAENCRYPTION", "MD2WithRSAEncryption");
+        // END android-removed
         put("Alg.Alias.Signature.MD5WITHRSAENCRYPTION", "MD5WithRSAEncryption");
         put("Alg.Alias.Signature.SHA1WITHRSAENCRYPTION", "SHA1WithRSAEncryption");
-        put("Alg.Alias.Signature.RIPEMD160WITHRSAENCRYPTION", "RIPEMD160WithRSAEncryption");
+        // BEGIN android-removed
+        // put("Alg.Alias.Signature.RIPEMD160WITHRSAENCRYPTION", "RIPEMD160WithRSAEncryption");
+        // END android-removed
 
         put("Alg.Alias.Signature.MD5WITHRSA", "MD5WithRSAEncryption");
         put("Alg.Alias.Signature.SHA1WITHRSA", "SHA1WithRSAEncryption");
-        put("Alg.Alias.Signature.RIPEMD160WITHRSA", "RIPEMD160WithRSAEncryption");
-        put("Alg.Alias.Signature.RMD160WITHRSA", "RIPEMD160WithRSAEncryption");
-        put("Alg.Alias.Signature.RIPEMD160WITHRSA", "RIPEMD160WithRSAEncryption");
-
-        addSignatureAlgorithm("SHA224", "DSA", "org.bouncycastle.jce.provider.JDKDSASigner$dsa224", NISTObjectIdentifiers.dsa_with_sha224);
-        addSignatureAlgorithm("SHA256", "DSA", "org.bouncycastle.jce.provider.JDKDSASigner$dsa256", NISTObjectIdentifiers.dsa_with_sha256);
-        addSignatureAlgorithm("SHA384", "DSA", "org.bouncycastle.jce.provider.JDKDSASigner$dsa384", NISTObjectIdentifiers.dsa_with_sha384);
-        addSignatureAlgorithm("SHA512", "DSA", "org.bouncycastle.jce.provider.JDKDSASigner$dsa512", NISTObjectIdentifiers.dsa_with_sha512);
-
-        put("Alg.Alias.Signature.SHA/DSA", "DSA");
-        put("Alg.Alias.Signature.SHA1withDSA", "DSA");
-        put("Alg.Alias.Signature.SHA1WITHDSA", "DSA");
-        put("Alg.Alias.Signature.1.3.14.3.2.26with1.2.840.10040.4.1", "DSA");
-        put("Alg.Alias.Signature.1.3.14.3.2.26with1.2.840.10040.4.3", "DSA");
-        put("Alg.Alias.Signature.DSAwithSHA1", "DSA");
-        put("Alg.Alias.Signature.DSAWITHSHA1", "DSA");
-        put("Alg.Alias.Signature.SHA1WithDSA", "DSA");
-        put("Alg.Alias.Signature.DSAWithSHA1", "DSA");
-        put("Alg.Alias.Signature.1.2.840.10040.4.3", "DSA");
-        put("Alg.Alias.Signature.MD5WithRSA/ISO9796-2", "MD5withRSA/ISO9796-2");
-        put("Alg.Alias.Signature.SHA1WithRSA/ISO9796-2", "SHA1withRSA/ISO9796-2");
-        put("Alg.Alias.Signature.RIPEMD160WithRSA/ISO9796-2", "RIPEMD160withRSA/ISO9796-2");
-        
-        put("Signature.ECGOST3410", "org.bouncycastle.jce.provider.JDKGOST3410Signer$ecgost3410");
-        put("Alg.Alias.Signature.ECGOST-3410", "ECGOST3410");
-        put("Alg.Alias.Signature.GOST-3410-2001", "ECGOST3410");
-        put("Alg.Alias.Signature.GOST3411withECGOST3410", "ECGOST3410");
-        put("Alg.Alias.Signature.GOST3411WITHECGOST3410", "ECGOST3410");
-        put("Alg.Alias.Signature.GOST3411WithECGOST3410", "ECGOST3410");
-        put("Alg.Alias.Signature." + CryptoProObjectIdentifiers.gostR3411_94_with_gostR3410_2001, "ECGOST3410");
-        
-        put("Signature.GOST3410", "org.bouncycastle.jce.provider.JDKGOST3410Signer$gost3410");
-        put("Alg.Alias.Signature.GOST-3410", "GOST3410");
-        put("Alg.Alias.Signature.GOST-3410-94", "GOST3410");
-        put("Alg.Alias.Signature.GOST3411withGOST3410", "GOST3410");
-        put("Alg.Alias.Signature.GOST3411WITHGOST3410", "GOST3410");
-        put("Alg.Alias.Signature.GOST3411WithGOST3410", "GOST3410");
-        put("Alg.Alias.Signature." + CryptoProObjectIdentifiers.gostR3411_94_with_gostR3410_94, "GOST3410");
+        // BEGIN android-removed
+        // put("Alg.Alias.Signature.RIPEMD160WITHRSA", "RIPEMD160WithRSAEncryption");
+        // put("Alg.Alias.Signature.RMD160WITHRSA", "RIPEMD160WithRSAEncryption");
+        // put("Alg.Alias.Signature.RIPEMD160WITHRSA", "RIPEMD160WithRSAEncryption");
+        // END android-removed
+
+        // BEGIN android-removed
+        // addSignatureAlgorithm("SHA224", "DSA", "org.bouncycastle.jce.provider.JDKDSASigner$dsa224", NISTObjectIdentifiers.dsa_with_sha224);
+        // addSignatureAlgorithm("SHA256", "DSA", "org.bouncycastle.jce.provider.JDKDSASigner$dsa256", NISTObjectIdentifiers.dsa_with_sha256);
+        // addSignatureAlgorithm("SHA384", "DSA", "org.bouncycastle.jce.provider.JDKDSASigner$dsa384", NISTObjectIdentifiers.dsa_with_sha384);
+        // addSignatureAlgorithm("SHA512", "DSA", "org.bouncycastle.jce.provider.JDKDSASigner$dsa512", NISTObjectIdentifiers.dsa_with_sha512);
+        // END android-removed
+
+        // BEGIN android-changed
+        put("Alg.Alias.Signature.SHA/DSA", "SHA1withDSA");
+        put("Alg.Alias.Signature.DSA", "SHA1withDSA");
+        put("Alg.Alias.Signature.SHA1WITHDSA", "SHA1withDSA");
+        put("Alg.Alias.Signature.1.3.14.3.2.26with1.2.840.10040.4.1", "SHA1withDSA");
+        put("Alg.Alias.Signature.1.3.14.3.2.26with1.2.840.10040.4.3", "SHA1withDSA");
+        put("Alg.Alias.Signature.DSAwithSHA1", "SHA1withDSA");
+        put("Alg.Alias.Signature.DSAWITHSHA1", "SHA1withDSA");
+        put("Alg.Alias.Signature.SHA1WithDSA", "SHA1withDSA");
+        put("Alg.Alias.Signature.DSAWithSHA1", "SHA1withDSA");
+        put("Alg.Alias.Signature.1.2.840.10040.4.3", "SHA1withDSA");
+        // END android-changed
+        // BEGIN android-removed
+        // put("Alg.Alias.Signature.MD5WithRSA/ISO9796-2", "MD5withRSA/ISO9796-2");
+        // put("Alg.Alias.Signature.SHA1WithRSA/ISO9796-2", "SHA1withRSA/ISO9796-2");
+        // put("Alg.Alias.Signature.RIPEMD160WithRSA/ISO9796-2", "RIPEMD160withRSA/ISO9796-2");
+        //
+        // put("Signature.ECGOST3410", "org.bouncycastle.jce.provider.JDKGOST3410Signer$ecgost3410");
+        // put("Alg.Alias.Signature.ECGOST-3410", "ECGOST3410");
+        // put("Alg.Alias.Signature.GOST-3410-2001", "ECGOST3410");
+        // put("Alg.Alias.Signature.GOST3411withECGOST3410", "ECGOST3410");
+        // put("Alg.Alias.Signature.GOST3411WITHECGOST3410", "ECGOST3410");
+        // put("Alg.Alias.Signature.GOST3411WithECGOST3410", "ECGOST3410");
+        // put("Alg.Alias.Signature." + CryptoProObjectIdentifiers.gostR3411_94_with_gostR3410_2001, "ECGOST3410");
+        //
+        // put("Signature.GOST3410", "org.bouncycastle.jce.provider.JDKGOST3410Signer$gost3410");
+        // put("Alg.Alias.Signature.GOST-3410", "GOST3410");
+        // put("Alg.Alias.Signature.GOST-3410-94", "GOST3410");
+        // put("Alg.Alias.Signature.GOST3411withGOST3410", "GOST3410");
+        // put("Alg.Alias.Signature.GOST3411WITHGOST3410", "GOST3410");
+        // put("Alg.Alias.Signature.GOST3411WithGOST3410", "GOST3410");
+        // put("Alg.Alias.Signature." + CryptoProObjectIdentifiers.gostR3411_94_with_gostR3410_94, "GOST3410");
+        // END android-removed
     }
 
-    private void addSignatureAlgorithm(
-        String digest,
-        String algorithm,
-        String className,
-        DERObjectIdentifier oid)
-    {
-        String mainName = digest + "WITH" + algorithm;
-        String jdk11Variation1 = digest + "with" + algorithm;
-        String jdk11Variation2 = digest + "With" + algorithm;
-        String alias = digest + "/" + algorithm;
-
-        put("Signature." + mainName, className);
-        put("Alg.Alias.Signature." + jdk11Variation1, mainName);
-        put("Alg.Alias.Signature." + jdk11Variation2, mainName);
-        put("Alg.Alias.Signature." + alias, mainName);
-        put("Alg.Alias.Signature." + oid, mainName);
-        put("Alg.Alias.Signature.OID." + oid, mainName);
-    }
+    // BEGIN android-removed
+    // private void addSignatureAlgorithm(
+    //     String digest,
+    //     String algorithm,
+    //     String className,
+    //     DERObjectIdentifier oid)
+    // {
+    //     String mainName = digest + "WITH" + algorithm;
+    //     String jdk11Variation1 = digest + "with" + algorithm;
+    //     String jdk11Variation2 = digest + "With" + algorithm;
+    //     String alias = digest + "/" + algorithm;
+    //
+    //     put("Signature." + mainName, className);
+    //     put("Alg.Alias.Signature." + jdk11Variation1, mainName);
+    //     put("Alg.Alias.Signature." + jdk11Variation2, mainName);
+    //     put("Alg.Alias.Signature." + alias, mainName);
+    //     put("Alg.Alias.Signature." + oid, mainName);
+    //     put("Alg.Alias.Signature.OID." + oid, mainName);
+    // }
+    // END android-removed
 
     public void setParameter(String parameterName, Object parameter)
     {
diff -Naur bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/CertPathValidatorUtilities.java bcprov-jdk16-145/org/bouncycastle/jce/provider/CertPathValidatorUtilities.java
--- bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/CertPathValidatorUtilities.java	2010-01-11 21:46:14.000000000 +0000
+++ bcprov-jdk16-145/org/bouncycastle/jce/provider/CertPathValidatorUtilities.java	2011-09-01 17:21:06.000000000 +0000
@@ -24,6 +24,7 @@
 import java.security.spec.DSAPublicKeySpec;
 import java.text.ParseException;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Date;
 import java.util.Enumeration;
@@ -35,6 +36,10 @@
 
 import javax.security.auth.x500.X500Principal;
 
+// BEGIN android-added
+import org.apache.harmony.xnet.provider.jsse.IndexedPKIXParameters;
+
+// END android-added
 import org.bouncycastle.asn1.ASN1InputStream;
 import org.bouncycastle.asn1.ASN1Object;
 import org.bouncycastle.asn1.ASN1OctetString;
@@ -59,13 +64,17 @@
 import org.bouncycastle.asn1.x509.PolicyInformation;
 import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;
 import org.bouncycastle.asn1.x509.X509Extensions;
-import org.bouncycastle.jce.X509LDAPCertStoreParameters;
+// BEGIN android-removed
+// import org.bouncycastle.jce.X509LDAPCertStoreParameters;
+// END android-removed
 import org.bouncycastle.jce.exception.ExtCertPathValidatorException;
 import org.bouncycastle.util.Selector;
 import org.bouncycastle.util.StoreException;
 import org.bouncycastle.x509.ExtendedPKIXBuilderParameters;
 import org.bouncycastle.x509.ExtendedPKIXParameters;
-import org.bouncycastle.x509.X509AttributeCertStoreSelector;
+// BEGIN android-removed
+// import org.bouncycastle.x509.X509AttributeCertStoreSelector;
+// END android-removed
 import org.bouncycastle.x509.X509AttributeCertificate;
 import org.bouncycastle.x509.X509CRLStoreSelector;
 import org.bouncycastle.x509.X509CertStoreSelector;
@@ -110,29 +119,32 @@
         "privilegeWithdrawn",
         "aACompromise" };
     
-    /**
-     * Search the given Set of TrustAnchor's for one that is the
-     * issuer of the given X509 certificate. Uses the default provider
-     * for signature verification.
-     *
-     * @param cert the X509 certificate
-     * @param trustAnchors a Set of TrustAnchor's
-     *
-     * @return the <code>TrustAnchor</code> object if found or
-     * <code>null</code> if not.
-     *
-     * @exception AnnotatedException
-     *                if a TrustAnchor was found but the signature verification
-     *                on the given certificate has thrown an exception.
-     */
-    protected static TrustAnchor findTrustAnchor(
-        X509Certificate cert,
-        Set             trustAnchors)
-            throws AnnotatedException
-    {
-        return findTrustAnchor(cert, trustAnchors, null);
-    }
+    // BEGIN android-removed
+    // /**
+    //  * Search the given Set of TrustAnchor's for one that is the
+    //  * issuer of the given X509 certificate. Uses the default provider
+    //  * for signature verification.
+    //  *
+    //  * @param cert the X509 certificate
+    //  * @param trustAnchors a Set of TrustAnchor's
+    //  *
+    //  * @return the <code>TrustAnchor</code> object if found or
+    //  * <code>null</code> if not.
+    //  *
+    //  * @exception AnnotatedException
+    //  *                if a TrustAnchor was found but the signature verification
+    //  *                on the given certificate has thrown an exception.
+    //  */
+    // protected static TrustAnchor findTrustAnchor(
+    //     X509Certificate cert,
+    //     Set             trustAnchors)
+    //         throws AnnotatedException
+    // {
+    //     return findTrustAnchor(cert, trustAnchors, null);
+    // }
+    // END android-removed
     
+    // BEGIN android-changed
     /**
      * Search the given Set of TrustAnchor's for one that is the
      * issuer of the given X509 certificate. Uses the specified
@@ -140,8 +152,7 @@
      * if null.
      *
      * @param cert the X509 certificate
-     * @param trustAnchors a Set of TrustAnchor's
-     * @param sigProvider the provider to use for signature verification
+     * @param params used to find the trust anchors and signature provider
      *
      * @return the <code>TrustAnchor</code> object if found or
      * <code>null</code> if not.
@@ -152,10 +163,21 @@
      */
     protected static TrustAnchor findTrustAnchor(
         X509Certificate cert,
-        Set             trustAnchors,
-        String          sigProvider) 
+        PKIXParameters  params)
             throws AnnotatedException
+    // END android-changed
     {
+        // BEGIN android-changed
+        // If we have a trust anchor index, use it.
+        if (params instanceof IndexedPKIXParameters) {
+            try {
+                IndexedPKIXParameters indexed = (IndexedPKIXParameters) params;
+                return indexed.findTrustAnchor(cert);
+            } catch (CertPathValidatorException e) {
+                throw new AnnotatedException(e.getMessage(), e);
+            }
+        }
+        // END android-changed
         TrustAnchor trust = null;
         PublicKey trustPublicKey = null;
         Exception invalidKeyEx = null;
@@ -172,21 +194,49 @@
             throw new AnnotatedException("Cannot set subject search criteria for trust anchor.", ex);
         }
 
-        Iterator iter = trustAnchors.iterator();
+        // BEGIN android-changed
+        Iterator iter = params.getTrustAnchors().iterator();
+        // END android-changed
+        // BEGIN android-added
+        byte[] certBytes = null;
+        try {
+            certBytes = cert.getEncoded();
+        } catch (Exception e) {
+            // ignore, just continue
+        }
+        // END android-added
         while (iter.hasNext() && trust == null)
         {
             trust = (TrustAnchor) iter.next();
-            if (trust.getTrustedCert() != null)
+            // BEGIN android-changed
+            X509Certificate trustCert = trust.getTrustedCert();
+            // END android-changed
+            // BEGIN android-added
+            // If the trust anchor is identical to the certificate we're
+            // done. Just return the anchor.
+            // There is similar code in PKIXCertPathValidatorSpi.
+            try {
+                byte[] trustBytes = trustCert.getEncoded();
+                if (certBytes != null && Arrays.equals(trustBytes, certBytes)) {
+                    return trust;
+                }
+            } catch (Exception e) {
+                // ignore, continue and verify the certificate
+            }
+            // END android-added
+            // BEGIN android-changed
+            if (trustCert != null)
             {
-                if (certSelectX509.match(trust.getTrustedCert()))
+                if (certSelectX509.match(trustCert))
                 {
-                    trustPublicKey = trust.getTrustedCert().getPublicKey();
+                    trustPublicKey = trustCert.getPublicKey();
                 }
                 else
                 {
                     trust = null;
                 }
             }
+            // END android-changed
             else if (trust.getCAName() != null
                     && trust.getCAPublicKey() != null)
             {
@@ -216,7 +266,9 @@
             {
                 try
                 {
-                    verifyX509Certificate(cert, trustPublicKey, sigProvider);
+                    // BEGIN android-changed
+                    verifyX509Certificate(cert, trustPublicKey, params.getSigProvider());
+                    // END android-changed
                 }
                 catch (Exception ex)
                 {
@@ -248,7 +300,9 @@
             {
                 // look for URI
                 List list = (List) it.next();
-                if (list.get(0).equals(new Integer(GeneralName.uniformResourceIdentifier)))
+                // BEGIN android-changed
+                if (list.get(0).equals(Integer.valueOf(GeneralName.uniformResourceIdentifier)))
+                // END android-changed
                 {
                     // found
                     String temp = (String) list.get(1);
@@ -721,38 +775,40 @@
         {
             try
             {
-                if (location.startsWith("ldap://"))
-                {
-                    // ldap://directory.d-trust.net/CN=D-TRUST
-                    // Qualified CA 2003 1:PN,O=D-Trust GmbH,C=DE
-                    // skip "ldap://"
-                    location = location.substring(7);
-                    // after first / baseDN starts
-                    String base = null;
-                    String url = null;
-                    if (location.indexOf("/") != -1)
-                    {
-                        base = location.substring(location.indexOf("/"));
-                        // URL
-                        url = "ldap://"
-                            + location.substring(0, location.indexOf("/"));
-                    }
-                    else
-                    {
-                        url = "ldap://" + location;
-                    }
-                    // use all purpose parameters
-                    X509LDAPCertStoreParameters params = new X509LDAPCertStoreParameters.Builder(
-                        url, base).build();
-                    pkixParams.addAdditionalStore(X509Store.getInstance(
-                        "CERTIFICATE/LDAP", params, "BC"));
-                    pkixParams.addAdditionalStore(X509Store.getInstance(
-                        "CRL/LDAP", params, "BC"));
-                    pkixParams.addAdditionalStore(X509Store.getInstance(
-                        "ATTRIBUTECERTIFICATE/LDAP", params, "BC"));
-                    pkixParams.addAdditionalStore(X509Store.getInstance(
-                        "CERTIFICATEPAIR/LDAP", params, "BC"));
-                }
+                // BEGIN android-removed
+                // if (location.startsWith("ldap://"))
+                // {
+                //     // ldap://directory.d-trust.net/CN=D-TRUST
+                //     // Qualified CA 2003 1:PN,O=D-Trust GmbH,C=DE
+                //     // skip "ldap://"
+                //     location = location.substring(7);
+                //     // after first / baseDN starts
+                //     String base = null;
+                //     String url = null;
+                //     if (location.indexOf("/") != -1)
+                //     {
+                //         base = location.substring(location.indexOf("/"));
+                //         // URL
+                //         url = "ldap://"
+                //             + location.substring(0, location.indexOf("/"));
+                //     }
+                //     else
+                //     {
+                //         url = "ldap://" + location;
+                //     }
+                //     // use all purpose parameters
+                //     X509LDAPCertStoreParameters params = new X509LDAPCertStoreParameters.Builder(
+                //         url, base).build();
+                //     pkixParams.addAdditionalStore(X509Store.getInstance(
+                //         "CERTIFICATE/LDAP", params, "BC"));
+                //     pkixParams.addAdditionalStore(X509Store.getInstance(
+                //         "CRL/LDAP", params, "BC"));
+                //     pkixParams.addAdditionalStore(X509Store.getInstance(
+                //         "ATTRIBUTECERTIFICATE/LDAP", params, "BC"));
+                //     pkixParams.addAdditionalStore(X509Store.getInstance(
+                //         "CERTIFICATEPAIR/LDAP", params, "BC"));
+                // }
+                // END android-removed
             }
             catch (Exception e)
             {
@@ -819,35 +875,37 @@
         return certs;
     }
 
-    protected static Collection findCertificates(X509AttributeCertStoreSelector certSelect,
-                                                 List certStores)
-    throws AnnotatedException
-    {
-        Set certs = new HashSet();
-        Iterator iter = certStores.iterator();
-
-        while (iter.hasNext())
-        {
-            Object obj = iter.next();
-
-            if (obj instanceof X509Store)
-            {
-                X509Store certStore = (X509Store)obj;
-                try
-                {
-                    certs.addAll(certStore.getMatches(certSelect));
-                }
-                catch (StoreException e)
-                {
-                    throw
-
-                        new AnnotatedException(
-                            "Problem while picking certificates from X.509 store.", e);
-                }
-            }
-        }
-        return certs;
-    }
+    // BEGIN android-removed
+    // protected static Collection findCertificates(X509AttributeCertStoreSelector certSelect,
+    //                                              List certStores)
+    // throws AnnotatedException
+    // {
+    //     Set certs = new HashSet();
+    //     Iterator iter = certStores.iterator();
+    //
+    //     while (iter.hasNext())
+    //     {
+    //         Object obj = iter.next();
+    //
+    //         if (obj instanceof X509Store)
+    //         {
+    //             X509Store certStore = (X509Store)obj;
+    //             try
+    //             {
+    //                 certs.addAll(certStore.getMatches(certSelect));
+    //             }
+    //             catch (StoreException e)
+    //             {
+    //                 throw
+    //
+    //                     new AnnotatedException(
+    //                         "Problem while picking certificates from X.509 store.", e);
+    //             }
+    //         }
+    //     }
+    //     return certs;
+    // }
+    // END android-removed
 
     protected static void addAdditionalStoresFromCRLDistributionPoint(
         CRLDistPoint crldp, ExtendedPKIXParameters pkixParams)
diff -Naur bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/JCEBlockCipher.java bcprov-jdk16-145/org/bouncycastle/jce/provider/JCEBlockCipher.java
--- bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/JCEBlockCipher.java	2010-01-11 21:46:14.000000000 +0000
+++ bcprov-jdk16-145/org/bouncycastle/jce/provider/JCEBlockCipher.java	2011-09-01 17:21:06.000000000 +0000
@@ -7,22 +7,31 @@
 import org.bouncycastle.crypto.InvalidCipherTextException;
 import org.bouncycastle.crypto.engines.AESFastEngine;
 import org.bouncycastle.crypto.engines.BlowfishEngine;
-import org.bouncycastle.crypto.engines.CAST5Engine;
-import org.bouncycastle.crypto.engines.CAST6Engine;
+// BEGIN android-removed
+// import org.bouncycastle.crypto.engines.CAST5Engine;
+// import org.bouncycastle.crypto.engines.CAST6Engine;
+// END android-removed
 import org.bouncycastle.crypto.engines.DESEngine;
 import org.bouncycastle.crypto.engines.DESedeEngine;
-import org.bouncycastle.crypto.engines.GOST28147Engine;
+// BEGIN android-removed
+// import org.bouncycastle.crypto.engines.GOST28147Engine;
+// END android-removed
 import org.bouncycastle.crypto.engines.RC2Engine;
-import org.bouncycastle.crypto.engines.RC532Engine;
-import org.bouncycastle.crypto.engines.RC564Engine;
-import org.bouncycastle.crypto.engines.RC6Engine;
-import org.bouncycastle.crypto.engines.RijndaelEngine;
-import org.bouncycastle.crypto.engines.SEEDEngine;
-import org.bouncycastle.crypto.engines.SerpentEngine;
-import org.bouncycastle.crypto.engines.SkipjackEngine;
-import org.bouncycastle.crypto.engines.TEAEngine;
+// BEGIN android-removed
+// import org.bouncycastle.crypto.engines.RC532Engine;
+// import org.bouncycastle.crypto.engines.RC564Engine;
+// END android-removed
+// import org.bouncycastle.crypto.engines.RC6Engine;
+// import org.bouncycastle.crypto.engines.RijndaelEngine;
+// import org.bouncycastle.crypto.engines.SEEDEngine;
+// import org.bouncycastle.crypto.engines.SerpentEngine;
+// import org.bouncycastle.crypto.engines.SkipjackEngine;
+// import org.bouncycastle.crypto.engines.TEAEngine;
+// END android-removed
 import org.bouncycastle.crypto.engines.TwofishEngine;
-import org.bouncycastle.crypto.engines.XTEAEngine;
+// BEGIN android-removed
+// import org.bouncycastle.crypto.engines.XTEAEngine;
+// END android-removed
 import org.bouncycastle.crypto.modes.AEADBlockCipher;
 import org.bouncycastle.crypto.modes.CBCBlockCipher;
 import org.bouncycastle.crypto.modes.CCMBlockCipher;
@@ -32,8 +41,10 @@
 import org.bouncycastle.crypto.modes.GCMBlockCipher;
 import org.bouncycastle.crypto.modes.GOFBBlockCipher;
 import org.bouncycastle.crypto.modes.OFBBlockCipher;
-import org.bouncycastle.crypto.modes.OpenPGPCFBBlockCipher;
-import org.bouncycastle.crypto.modes.PGPCFBBlockCipher;
+// BEGIN android-removed
+// import org.bouncycastle.crypto.modes.OpenPGPCFBBlockCipher;
+// import org.bouncycastle.crypto.modes.PGPCFBBlockCipher;
+// END android-removed
 import org.bouncycastle.crypto.modes.SICBlockCipher;
 import org.bouncycastle.crypto.paddings.BlockCipherPadding;
 import org.bouncycastle.crypto.paddings.ISO10126d2Padding;
@@ -45,10 +56,12 @@
 import org.bouncycastle.crypto.params.KeyParameter;
 import org.bouncycastle.crypto.params.ParametersWithIV;
 import org.bouncycastle.crypto.params.ParametersWithRandom;
-import org.bouncycastle.crypto.params.ParametersWithSBox;
-import org.bouncycastle.crypto.params.RC2Parameters;
-import org.bouncycastle.crypto.params.RC5Parameters;
-import org.bouncycastle.jce.spec.GOST28147ParameterSpec;
+// BEGIN android-removed
+// import org.bouncycastle.crypto.params.ParametersWithSBox;
+// import org.bouncycastle.crypto.params.RC2Parameters;
+// import org.bouncycastle.crypto.params.RC5Parameters;
+// import org.bouncycastle.jce.spec.GOST28147ParameterSpec;
+// END android-removed
 import org.bouncycastle.util.Strings;
 
 import javax.crypto.BadPaddingException;
@@ -59,8 +72,10 @@
 import javax.crypto.ShortBufferException;
 import javax.crypto.spec.IvParameterSpec;
 import javax.crypto.spec.PBEParameterSpec;
-import javax.crypto.spec.RC2ParameterSpec;
-import javax.crypto.spec.RC5ParameterSpec;
+// BEGIN android-removed
+// import javax.crypto.spec.RC2ParameterSpec;
+// import javax.crypto.spec.RC5ParameterSpec;
+// END android-removed
 import java.security.AlgorithmParameters;
 import java.security.InvalidAlgorithmParameterException;
 import java.security.InvalidKeyException;
@@ -78,11 +93,15 @@
     //
     private Class[]                 availableSpecs =
                                     {
-                                        RC2ParameterSpec.class,
-                                        RC5ParameterSpec.class,
+                                        // BEGIN android-removed
+                                        // RC2ParameterSpec.class,
+                                        // RC5ParameterSpec.class,
+                                        // END android-removed
                                         IvParameterSpec.class,
                                         PBEParameterSpec.class,
-                                        GOST28147ParameterSpec.class
+                                        // BEGIN android-removed
+                                        // GOST28147ParameterSpec.class
+                                        // END android-removed
                                     };
  
     private BlockCipher             baseEngine;
@@ -237,20 +256,22 @@
                         new CFBBlockCipher(baseEngine, 8 * baseEngine.getBlockSize()));
             }
         }
-        else if (modeName.startsWith("PGP"))
-        {
-            boolean inlineIV = modeName.equalsIgnoreCase("PGPCFBwithIV");
-
-            ivLength = baseEngine.getBlockSize();
-            cipher = new BufferedGenericBlockCipher(
-                new PGPCFBBlockCipher(baseEngine, inlineIV));
-        }
-        else if (modeName.equalsIgnoreCase("OpenPGPCFB"))
-        {
-            ivLength = 0;
-            cipher = new BufferedGenericBlockCipher(
-                new OpenPGPCFBBlockCipher(baseEngine));
-        }
+        // BEGIN android-removed
+        // else if (modeName.startsWith("PGP"))
+        // {
+        //     boolean inlineIV = modeName.equalsIgnoreCase("PGPCFBwithIV");
+        //
+        //     ivLength = baseEngine.getBlockSize();
+        //     cipher = new BufferedGenericBlockCipher(
+        //         new PGPCFBBlockCipher(baseEngine, inlineIV));
+        // }
+        // else if (modeName.equalsIgnoreCase("OpenPGPCFB"))
+        // {
+        //     ivLength = 0;
+        //     cipher = new BufferedGenericBlockCipher(
+        //         new OpenPGPCFBBlockCipher(baseEngine));
+        // }
+        // END android-removed
         else if (modeName.startsWith("SIC"))
         {
             ivLength = baseEngine.getBlockSize();
@@ -376,13 +397,15 @@
             throw new InvalidKeyException("Key for algorithm " + key.getAlgorithm() + " not suitable for symmetric enryption.");
         }
         
-        //
-        // for RC5-64 we must have some default parameters
-        //
-        if (params == null && baseEngine.getAlgorithmName().startsWith("RC5-64"))
-        {
-            throw new InvalidAlgorithmParameterException("RC5 requires an RC5ParametersSpec to be passed in.");
-        }
+        // BEGIN android-removed
+        // //
+        // // for RC5-64 we must have some default parameters
+        // //
+        // if (params == null && baseEngine.getAlgorithmName().startsWith("RC5-64"))
+        // {
+        //     throw new InvalidAlgorithmParameterException("RC5 requires an RC5ParametersSpec to be passed in.");
+        // }
+        // END android-removed
 
         //
         // a note on iv's - if ivLength is zero the IV gets ignored (we don't use it).
@@ -448,63 +471,65 @@
                 param = new KeyParameter(key.getEncoded());
             }
         }
-        else if (params instanceof GOST28147ParameterSpec)
-        {
-            GOST28147ParameterSpec    gost28147Param = (GOST28147ParameterSpec)params;
-
-            param = new ParametersWithSBox(
-                       new KeyParameter(key.getEncoded()), ((GOST28147ParameterSpec)params).getSbox());
-
-            if (gost28147Param.getIV() != null && ivLength != 0)
-            {
-                param = new ParametersWithIV(param, gost28147Param.getIV());
-                ivParam = (ParametersWithIV)param;
-            }
-        }
-        else if (params instanceof RC2ParameterSpec)
-        {
-            RC2ParameterSpec    rc2Param = (RC2ParameterSpec)params;
-
-            param = new RC2Parameters(key.getEncoded(), ((RC2ParameterSpec)params).getEffectiveKeyBits());
-
-            if (rc2Param.getIV() != null && ivLength != 0)
-            {
-                param = new ParametersWithIV(param, rc2Param.getIV());
-                ivParam = (ParametersWithIV)param;
-            }
-        }
-        else if (params instanceof RC5ParameterSpec)
-        {
-            RC5ParameterSpec    rc5Param = (RC5ParameterSpec)params;
-
-            param = new RC5Parameters(key.getEncoded(), ((RC5ParameterSpec)params).getRounds());
-            if (baseEngine.getAlgorithmName().startsWith("RC5"))
-            {
-                if (baseEngine.getAlgorithmName().equals("RC5-32"))
-                {
-                    if (rc5Param.getWordSize() != 32)
-                    {
-                        throw new InvalidAlgorithmParameterException("RC5 already set up for a word size of 32 not " + rc5Param.getWordSize() + ".");
-                    }
-                }
-                else if (baseEngine.getAlgorithmName().equals("RC5-64"))
-                {
-                    if (rc5Param.getWordSize() != 64)
-                    {
-                        throw new InvalidAlgorithmParameterException("RC5 already set up for a word size of 64 not " + rc5Param.getWordSize() + ".");
-                    }
-                }
-            }
-            else
-            {
-                throw new InvalidAlgorithmParameterException("RC5 parameters passed to a cipher that is not RC5.");
-            }
-            if ((rc5Param.getIV() != null) && (ivLength != 0))
-            {
-                param = new ParametersWithIV(param, rc5Param.getIV());
-                ivParam = (ParametersWithIV)param;
-            }
-        }
+        // BEGIN android-removed
+        // else if (params instanceof GOST28147ParameterSpec)
+        // {
+        //     GOST28147ParameterSpec    gost28147Param = (GOST28147ParameterSpec)params;
+        //
+        //     param = new ParametersWithSBox(
+        //                new KeyParameter(key.getEncoded()), ((GOST28147ParameterSpec)params).getSbox());
+        //
+        //     if (gost28147Param.getIV() != null && ivLength != 0)
+        //     {
+        //         param = new ParametersWithIV(param, gost28147Param.getIV());
+        //         ivParam = (ParametersWithIV)param;
+        //     }
+        // }
+        // else if (params instanceof RC2ParameterSpec)
+        // {
+        //     RC2ParameterSpec    rc2Param = (RC2ParameterSpec)params;
+        //
+        //     param = new RC2Parameters(key.getEncoded(), ((RC2ParameterSpec)params).getEffectiveKeyBits());
+        //
+        //     if (rc2Param.getIV() != null && ivLength != 0)
+        //     {
+        //         param = new ParametersWithIV(param, rc2Param.getIV());
+        //         ivParam = (ParametersWithIV)param;
+        //     }
+        // }
+        // else if (params instanceof RC5ParameterSpec)
+        // {
+        //     RC5ParameterSpec    rc5Param = (RC5ParameterSpec)params;
+        //
+        //     param = new RC5Parameters(key.getEncoded(), ((RC5ParameterSpec)params).getRounds());
+        //     if (baseEngine.getAlgorithmName().startsWith("RC5"))
+        //     {
+        //         if (baseEngine.getAlgorithmName().equals("RC5-32"))
+        //         {
+        //             if (rc5Param.getWordSize() != 32)
+        //             {
+        //                 throw new InvalidAlgorithmParameterException("RC5 already set up for a word size of 32 not " + rc5Param.getWordSize() + ".");
+        //             }
+        //         }
+        //         else if (baseEngine.getAlgorithmName().equals("RC5-64"))
+        //         {
+        //             if (rc5Param.getWordSize() != 64)
+        //             {
+        //                 throw new InvalidAlgorithmParameterException("RC5 already set up for a word size of 64 not " + rc5Param.getWordSize() + ".");
+        //             }
+        //         }
+        //     }
+        //     else
+        //     {
+        //         throw new InvalidAlgorithmParameterException("RC5 parameters passed to a cipher that is not RC5.");
+        //     }
+        //     if ((rc5Param.getIV() != null) && (ivLength != 0))
+        //     {
+        //         param = new ParametersWithIV(param, rc5Param.getIV());
+        //         ivParam = (ParametersWithIV)param;
+        //     }
+        // }
+        // END android-removed
         else
         {
             throw new InvalidAlgorithmParameterException("unknown parameter type.");
@@ -708,10 +733,21 @@
         int     inputLen,
         byte[]  output,
         int     outputOffset) 
-        throws IllegalBlockSizeException, BadPaddingException
+        throws IllegalBlockSizeException, BadPaddingException, ShortBufferException
     {
+        // BEGIN android-note
+        // added ShortBufferException to the throws statement
+        // END android-note
         int     len = 0;
 
+        // BEGIN android-added
+        int outputLen = cipher.getOutputSize(inputLen);
+
+        if (outputLen + outputOffset > output.length) {
+            throw new ShortBufferException("need at least " + outputLen + " bytes");
+        }
+        // BEGIN android-added
+
         if (inputLen != 0)
         {
                 len = cipher.processBytes(input, inputOffset, inputLen, output, outputOffset);
@@ -753,17 +789,19 @@
         }
     }
 
-    /**
-     * DESCBC
-     */
-    static public class DESCBC
-        extends JCEBlockCipher
-    {
-        public DESCBC()
-        {
-            super(new CBCBlockCipher(new DESEngine()), 64);
-        }
-    }
+    // BEGIN android-removed
+    // /**
+    //  * DESCBC
+    //  */
+    // static public class DESCBC
+    //     extends JCEBlockCipher
+    // {
+    //     public DESCBC()
+    //     {
+    //         super(new CBCBlockCipher(new DESEngine()), 64);
+    //     }
+    // }
+    // END android-removed
 
     /**
      * DESede
@@ -777,52 +815,54 @@
         }
     }
 
-    /**
-     * DESedeCBC
-     */
-    static public class DESedeCBC
-        extends JCEBlockCipher
-    {
-        public DESedeCBC()
-        {
-            super(new CBCBlockCipher(new DESedeEngine()), 64);
-        }
-    }
-
-    /**
-     *  GOST28147
-     */
-    static public class GOST28147
-        extends JCEBlockCipher
-    {
-        public GOST28147()
-        {
-            super(new GOST28147Engine());
-        }
-    }
-    
-    static public class GOST28147cbc
-        extends JCEBlockCipher
-    {
-        public GOST28147cbc()
-        {
-            super(new CBCBlockCipher(new GOST28147Engine()), 64);
-        }
-    }
+    // BEGIN android-removed
+    // /**
+    //  * DESedeCBC
+    //  */
+    // static public class DESedeCBC
+    //     extends JCEBlockCipher
+    // {
+    //     public DESedeCBC()
+    //     {
+    //         super(new CBCBlockCipher(new DESedeEngine()), 64);
+    //     }
+    // }
+    //
+    // /**
+    //  *  GOST28147
+    //  */
+    // static public class GOST28147
+    //     extends JCEBlockCipher
+    // {
+    //     public GOST28147()
+    //     {
+    //         super(new GOST28147Engine());
+    //     }
+    // }
+    //    
+    // static public class GOST28147cbc
+    //     extends JCEBlockCipher
+    // {
+    //     public GOST28147cbc()
+    //     {
+    //         super(new CBCBlockCipher(new GOST28147Engine()), 64);
+    //     }
+    // }
+    //
+    // /**
+    //  * SKIPJACK
+    //  */
+    // static public class Skipjack
+    //     extends JCEBlockCipher
+    // {
+    //     public Skipjack()
+    //     {
+    //         super(new SkipjackEngine());
+    //     }
+    // }
+    // END android-removed
     
     /**
-     * SKIPJACK
-     */
-    static public class Skipjack
-        extends JCEBlockCipher
-    {
-        public Skipjack()
-        {
-            super(new SkipjackEngine());
-        }
-    }
-
-    /**
      * Blowfish
      */
     static public class Blowfish
@@ -833,236 +873,238 @@
             super(new BlowfishEngine());
         }
     }
-
-    /**
-     * Blowfish CBC
-     */
-    static public class BlowfishCBC
-        extends JCEBlockCipher
-    {
-        public BlowfishCBC()
-        {
-            super(new CBCBlockCipher(new BlowfishEngine()), 64);
-        }
-    }
-
-    /**
-     * Twofish
-     */
-    static public class Twofish
-        extends JCEBlockCipher
-    {
-        public Twofish()
-        {
-            super(new TwofishEngine());
-        }
-    }
-
-    /**
-     * RC2
-     */
-    static public class RC2
-        extends JCEBlockCipher
-    {
-        public RC2()
-        {
-            super(new RC2Engine());
-        }
-    }
-
-    /**
-     * RC2CBC
-     */
-    static public class RC2CBC
-        extends JCEBlockCipher
-    {
-        public RC2CBC()
-        {
-            super(new CBCBlockCipher(new RC2Engine()), 64);
-        }
-    }
-
-    /**
-     * RC5
-     */
-    static public class RC5
-        extends JCEBlockCipher
-    {
-        public RC5()
-        {
-            super(new RC532Engine());
-        }
-    }
-
-    /**
-     * RC564
-     */
-    static public class RC564
-        extends JCEBlockCipher
-    {
-        public RC564()
-        {
-            super(new RC564Engine());
-        }
-    }
-
-    /**
-     * RC6
-     */
-    static public class RC6
-        extends JCEBlockCipher
-    {
-        public RC6()
-        {
-            super(new RC6Engine());
-        }
-    }
-
-    /**
-     * AES
-     */
-    static public class AES
-        extends JCEBlockCipher
-    {
-        public AES()
-        {
-            super(new AESFastEngine());
-        }
-    }
-
-    /**
-     * AESCBC
-     */
-    static public class AESCBC
-        extends JCEBlockCipher
-    {
-        public AESCBC()
-        {
-            super(new CBCBlockCipher(new AESFastEngine()), 128);
-        }
-    }
-
-    /**
-     * AESCFB
-     */
-    static public class AESCFB
-        extends JCEBlockCipher
-    {
-        public AESCFB()
-        {
-            super(new CFBBlockCipher(new AESFastEngine(), 128), 128);
-        }
-    }
-
-    /**
-     * AESOFB
-     */
-    static public class AESOFB
-        extends JCEBlockCipher
-    {
-        public AESOFB()
-        {
-            super(new OFBBlockCipher(new AESFastEngine(), 128), 128);
-        }
-    }
-
-    /**
-     * Rijndael
-     */
-    static public class Rijndael
-        extends JCEBlockCipher
-    {
-        public Rijndael()
-        {
-            super(new RijndaelEngine());
-        }
-    }
-
-    /**
-     * Serpent
-     */
-    static public class Serpent
-        extends JCEBlockCipher
-    {
-        public Serpent()
-        {
-            super(new SerpentEngine());
-        }
-    }
-
-
     
-    /**
-     * CAST5
-     */
-    static public class CAST5
-        extends JCEBlockCipher
-    {
-        public CAST5()
-        {
-            super(new CAST5Engine());
-        }
-    }
-
-    /**
-     * CAST5 CBC
-     */
-    static public class CAST5CBC
-        extends JCEBlockCipher
-    {
-        public CAST5CBC()
-        {
-            super(new CBCBlockCipher(new CAST5Engine()), 64);
-        }
-    }
-
-    /**
-     * CAST6
-     */
-    static public class CAST6
-        extends JCEBlockCipher
-    {
-        public CAST6()
-        {
-            super(new CAST6Engine());
-        }
-    }
-
-    /**
-     * TEA
-     */
-    static public class TEA
-        extends JCEBlockCipher
-    {
-        public TEA()
-        {
-            super(new TEAEngine());
-        }
-    }
-
-    /**
-     * XTEA
-     */
-    static public class XTEA
-        extends JCEBlockCipher
-    {
-        public XTEA()
-        {
-            super(new XTEAEngine());
-        }
-    }
-
-    /**
-     * SEED
-     */
-    static public class SEED
-        extends JCEBlockCipher
-    {
-        public SEED()
-        {
-            super(new SEEDEngine());
-        }
-    }
+    // BEGIN android-removed
+    // /**
+    //  * Blowfish CBC
+    //  */
+    // static public class BlowfishCBC
+    //     extends JCEBlockCipher
+    // {
+    //     public BlowfishCBC()
+    //     {
+    //         super(new CBCBlockCipher(new BlowfishEngine()), 64);
+    //     }
+    // }
+    //
+    // /**
+    //  * Twofish
+    //  */
+    // static public class Twofish
+    //     extends JCEBlockCipher
+    // {
+    //     public Twofish()
+    //     {
+    //         super(new TwofishEngine());
+    //     }
+    // }
+    //
+    // /**
+    //  * RC2
+    //  */
+    // static public class RC2
+    //     extends JCEBlockCipher
+    // {
+    //     public RC2()
+    //     {
+    //         super(new RC2Engine());
+    //     }
+    // }
+    //
+    // /**
+    //  * RC2CBC
+    //  */
+    // static public class RC2CBC
+    //     extends JCEBlockCipher
+    // {
+    //     public RC2CBC()
+    //     {
+    //         super(new CBCBlockCipher(new RC2Engine()), 64);
+    //     }
+    // }
+    //
+    // /**
+    //  * RC5
+    //  */
+    // static public class RC5
+    //     extends JCEBlockCipher
+    // {
+    //     public RC5()
+    //     {
+    //         super(new RC532Engine());
+    //     }
+    // }
+    //
+    // /**
+    //  * RC564
+    //  */
+    // static public class RC564
+    //     extends JCEBlockCipher
+    // {
+    //     public RC564()
+    //     {
+    //         super(new RC564Engine());
+    //     }
+    // }
+    //
+    // /**
+    //  * RC6
+    //  */
+    // static public class RC6
+    //     extends JCEBlockCipher
+    // {
+    //     public RC6()
+    //     {
+    //         super(new RC6Engine());
+    //     }
+    // }
+    //
+    // /**
+    //  * AES
+    //  */
+    // static public class AES
+    //     extends JCEBlockCipher
+    // {
+    //     public AES()
+    //     {
+    //         super(new AESFastEngine());
+    //     }
+    // }
+    //
+    // /**
+    //  * AESCBC
+    //  */
+    // static public class AESCBC
+    //     extends JCEBlockCipher
+    // {
+    //     public AESCBC()
+    //     {
+    //         super(new CBCBlockCipher(new AESFastEngine()), 128);
+    //     }
+    // }
+    //
+    // /**
+    //  * AESCFB
+    //  */
+    // static public class AESCFB
+    //     extends JCEBlockCipher
+    // {
+    //     public AESCFB()
+    //     {
+    //         super(new CFBBlockCipher(new AESFastEngine(), 128), 128);
+    //     }
+    // }
+    //
+    // /**
+    //  * AESOFB
+    //  */
+    // static public class AESOFB
+    //     extends JCEBlockCipher
+    // {
+    //     public AESOFB()
+    //     {
+    //         super(new OFBBlockCipher(new AESFastEngine(), 128), 128);
+    //     }
+    // }
+    //
+    // /**
+    //  * Rijndael
+    //  */
+    // static public class Rijndael
+    //     extends JCEBlockCipher
+    // {
+    //     public Rijndael()
+    //     {
+    //         super(new RijndaelEngine());
+    //     }
+    // }
+    //
+    // /**
+    //  * Serpent
+    //  */
+    // static public class Serpent
+    //     extends JCEBlockCipher
+    // {
+    //     public Serpent()
+    //     {
+    //         super(new SerpentEngine());
+    //     }
+    // }
+    //
+    //
+    //
+    // /**
+    //  * CAST5
+    //  */
+    // static public class CAST5
+    //     extends JCEBlockCipher
+    // {
+    //     public CAST5()
+    //     {
+    //         super(new CAST5Engine());
+    //     }
+    // }
+    //
+    // /**
+    //  * CAST5 CBC
+    //  */
+    // static public class CAST5CBC
+    //     extends JCEBlockCipher
+    // {
+    //     public CAST5CBC()
+    //     {
+    //         super(new CBCBlockCipher(new CAST5Engine()), 64);
+    //     }
+    // }
+    //
+    // /**
+    //  * CAST6
+    //  */
+    // static public class CAST6
+    //     extends JCEBlockCipher
+    // {
+    //     public CAST6()
+    //     {
+    //         super(new CAST6Engine());
+    //     }
+    // }
+    // 
+    // /**
+    //  * TEA
+    //  */
+    // static public class TEA
+    //     extends JCEBlockCipher
+    // {
+    //     public TEA()
+    //     {
+    //         super(new TEAEngine());
+    //     }
+    // }
+    //
+    // /**
+    //  * XTEA
+    //  */
+    // static public class XTEA
+    //     extends JCEBlockCipher
+    // {
+    //     public XTEA()
+    //     {
+    //         super(new XTEAEngine());
+    //     }
+    // }
+    // 
+    // /**
+    //  * SEED
+    //  */
+    // static public class SEED
+    //     extends JCEBlockCipher
+    // {
+    //     public SEED()
+    //     {
+    //         super(new SEEDEngine());
+    //     }
+    // }
+    // END android-removed
 
     /**
      * PBEWithMD5AndDES
@@ -1087,7 +1129,7 @@
             super(new CBCBlockCipher(new RC2Engine()));
         }
     }
-
+    
     /**
      * PBEWithSHA1AndDES
      */
@@ -1135,7 +1177,7 @@
             super(new CBCBlockCipher(new DESedeEngine()));
         }
     }
-
+    
     /**
      * PBEWithSHAAnd128BitRC2-CBC
      */
@@ -1159,7 +1201,7 @@
             super(new CBCBlockCipher(new RC2Engine()));
         }
     }
-
+    
     /**
      * PBEWithSHAAndTwofish-CBC
      */
@@ -1171,7 +1213,7 @@
             super(new CBCBlockCipher(new TwofishEngine()));
         }
     }
-
+    
     /**
      * PBEWithAES-CBC
      */
diff -Naur bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/JCEDHKeyAgreement.java bcprov-jdk16-145/org/bouncycastle/jce/provider/JCEDHKeyAgreement.java
--- bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/JCEDHKeyAgreement.java	2010-01-11 21:46:14.000000000 +0000
+++ bcprov-jdk16-145/org/bouncycastle/jce/provider/JCEDHKeyAgreement.java	2011-09-01 17:21:06.000000000 +0000
@@ -37,9 +37,11 @@
 
     static
     {
-        Integer i64 = new Integer(64);
-        Integer i192 = new Integer(192);
-        Integer i128 = new Integer(128);
+        // BEGIN android-changed
+        Integer i64 = Integer.valueOf(64);
+        Integer i192 = Integer.valueOf(192);
+        Integer i128 = Integer.valueOf(128);
+        // END android-changed
 
         algorithms.put("DES", i64);
         algorithms.put("DESEDE", i192);
diff -Naur bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/JCEDigestUtil.java bcprov-jdk16-145/org/bouncycastle/jce/provider/JCEDigestUtil.java
--- bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/JCEDigestUtil.java	2010-01-11 21:46:14.000000000 +0000
+++ bcprov-jdk16-145/org/bouncycastle/jce/provider/JCEDigestUtil.java	2011-09-01 17:21:06.000000000 +0000
@@ -12,7 +12,9 @@
 import org.bouncycastle.crypto.Digest;
 import org.bouncycastle.crypto.digests.MD5Digest;
 import org.bouncycastle.crypto.digests.SHA1Digest;
-import org.bouncycastle.crypto.digests.SHA224Digest;
+// BEGIN android-removed
+// import org.bouncycastle.crypto.digests.SHA224Digest;
+// END android-removed
 import org.bouncycastle.crypto.digests.SHA256Digest;
 import org.bouncycastle.crypto.digests.SHA384Digest;
 import org.bouncycastle.crypto.digests.SHA512Digest;
@@ -22,7 +24,9 @@
 {
     private static Set md5 = new HashSet();
     private static Set sha1 = new HashSet();
-    private static Set sha224 = new HashSet();
+    // BEGIN android-removed
+    // private static Set sha224 = new HashSet();
+    // END android-removed
     private static Set sha256 = new HashSet();
     private static Set sha384 = new HashSet();
     private static Set sha512 = new HashSet();
@@ -38,9 +42,11 @@
         sha1.add("SHA-1");
         sha1.add(OIWObjectIdentifiers.idSHA1.getId());
         
-        sha224.add("SHA224");
-        sha224.add("SHA-224");
-        sha224.add(NISTObjectIdentifiers.id_sha224.getId());
+        // BEGIN android-removed
+        // sha224.add("SHA224");
+        // sha224.add("SHA-224");
+        // sha224.add(NISTObjectIdentifiers.id_sha224.getId());
+        // END android-removed
         
         sha256.add("SHA256");
         sha256.add("SHA-256");
@@ -61,9 +67,11 @@
         oids.put("SHA-1", OIWObjectIdentifiers.idSHA1);
         oids.put(OIWObjectIdentifiers.idSHA1.getId(), OIWObjectIdentifiers.idSHA1);
         
-        oids.put("SHA224", NISTObjectIdentifiers.id_sha224);
-        oids.put("SHA-224", NISTObjectIdentifiers.id_sha224);
-        oids.put(NISTObjectIdentifiers.id_sha224.getId(), NISTObjectIdentifiers.id_sha224);
+        // BEGIN android-removed
+        // oids.put("SHA224", NISTObjectIdentifiers.id_sha224);
+        // oids.put("SHA-224", NISTObjectIdentifiers.id_sha224);
+        // oids.put(NISTObjectIdentifiers.id_sha224.getId(), NISTObjectIdentifiers.id_sha224);
+        // END android-removed
         
         oids.put("SHA256", NISTObjectIdentifiers.id_sha256);
         oids.put("SHA-256", NISTObjectIdentifiers.id_sha256);
@@ -91,10 +99,12 @@
         {
             return new MD5Digest();
         }
-        if (sha224.contains(digestName))
-        {
-            return new SHA224Digest();
-        }
+        // BEGIN android-removed
+        // if (sha224.contains(digestName))
+        // {
+        //     return new SHA224Digest();
+        // }
+        // END android-removed
         if (sha256.contains(digestName))
         {
             return new SHA256Digest();
@@ -116,7 +126,9 @@
         String digest2)
     {
         return (sha1.contains(digest1) && sha1.contains(digest2))
-            || (sha224.contains(digest1) && sha224.contains(digest2))
+            // BEGIN android-removed
+            // || (sha224.contains(digest1) && sha224.contains(digest2))
+            // END android-removed
             || (sha256.contains(digest1) && sha256.contains(digest2))
             || (sha384.contains(digest1) && sha384.contains(digest2))
             || (sha512.contains(digest1) && sha512.contains(digest2))
diff -Naur bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/JCEKeyGenerator.java bcprov-jdk16-145/org/bouncycastle/jce/provider/JCEKeyGenerator.java
--- bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/JCEKeyGenerator.java	2010-01-11 21:46:14.000000000 +0000
+++ bcprov-jdk16-145/org/bouncycastle/jce/provider/JCEKeyGenerator.java	2011-09-01 17:21:06.000000000 +0000
@@ -145,30 +145,32 @@
         }
     }
     
-    /**
-     * generate a desEDE key in the a-b-c format.
-     */
-    public static class DESede3
-        extends JCEKeyGenerator
-    {
-        public DESede3()
-        {
-            super("DESede3", 192, new DESedeKeyGenerator());
-        }
-    }
-
-    /**
-     * SKIPJACK
-     */
-    public static class Skipjack
-        extends JCEKeyGenerator
-    {
-        public Skipjack()
-        {
-            super("SKIPJACK", 80, new CipherKeyGenerator());
-        }
-    }
-
+    // BEGIN android-removed
+    // /**
+    //  * generate a desEDE key in the a-b-c format.
+    //  */
+    // public static class DESede3
+    //     extends JCEKeyGenerator
+    // {
+    //     public DESede3()
+    //     {
+    //         super("DESede3", 192, new DESedeKeyGenerator());
+    //     }
+    // }
+    //
+    // /**
+    //  * SKIPJACK
+    //  */
+    // public static class Skipjack
+    //     extends JCEKeyGenerator
+    // {
+    //     public Skipjack()
+    //     {
+    //         super("SKIPJACK", 80, new CipherKeyGenerator());
+    //     }
+    // }
+    // END android-removed
+    
     /**
      * Blowfish
      */
@@ -180,31 +182,33 @@
             super("Blowfish", 128, new CipherKeyGenerator());
         }
     }
-
-    /**
-     * Twofish
-     */
-    public static class Twofish
-        extends JCEKeyGenerator
-    {
-        public Twofish()
-        {
-            super("Twofish", 256, new CipherKeyGenerator());
-        }
-    }
-
-    /**
-     * RC2
-     */
-    public static class RC2
-        extends JCEKeyGenerator
-    {
-        public RC2()
-        {
-            super("RC2", 128, new CipherKeyGenerator());
-        }
-    }
-
+    
+    // BEGIN android-removed
+    // /**
+    //  * Twofish
+    //  */
+    // public static class Twofish
+    //     extends JCEKeyGenerator
+    // {
+    //     public Twofish()
+    //     {
+    //         super("Twofish", 256, new CipherKeyGenerator());
+    //     }
+    // }
+    //
+    // /**
+    //  * RC2
+    //  */
+    // public static class RC2
+    //     extends JCEKeyGenerator
+    // {
+    //     public RC2()
+    //     {
+    //         super("RC2", 128, new CipherKeyGenerator());
+    //     }
+    // }
+    // END android-removed
+    
     /**
      * RC4
      */
@@ -216,203 +220,207 @@
             super("RC4", 128, new CipherKeyGenerator());
         }
     }
-
-    /**
-     * RC5
-     */
-    public static class RC5
-        extends JCEKeyGenerator
-    {
-        public RC5()
-        {
-            super("RC5", 128, new CipherKeyGenerator());
-        }
-    }
-
-    /**
-     * RC5
-     */
-    public static class RC564
-        extends JCEKeyGenerator
-    {
-        public RC564()
-        {
-            super("RC5-64", 256, new CipherKeyGenerator());
-        }
-    }
-
-    /**
-     * RC6
-     */
-    public static class RC6
-        extends JCEKeyGenerator
-    {
-        public RC6()
-        {
-            super("RC6", 256, new CipherKeyGenerator());
-        }
-    }
-
-    /**
-     * GOST28147
-     */
-    public static class GOST28147
-        extends JCEKeyGenerator
-    {
-        public GOST28147()
-        {
-            super("GOST28147", 256, new CipherKeyGenerator());
-        }
-    }
     
-    /**
-     * Rijndael
-     */
-    public static class Rijndael
-        extends JCEKeyGenerator
-    {
-        public Rijndael()
-        {
-            super("Rijndael", 192, new CipherKeyGenerator());
-        }
-    }
-
-    /**
-     * Serpent
-     */
-    public static class Serpent
-        extends JCEKeyGenerator
-    {
-        public Serpent()
-        {
-            super("Serpent", 192, new CipherKeyGenerator());
-        }
-    }
+    // BEGIN android-removed
+    // /**
+    //  * RC5
+    //  */
+    // public static class RC5
+    //     extends JCEKeyGenerator
+    // {
+    //     public RC5()
+    //     {
+    //         super("RC5", 128, new CipherKeyGenerator());
+    //     }
+    // }
+    //
+    // /**
+    //  * RC5
+    //  */
+    // public static class RC564
+    //     extends JCEKeyGenerator
+    // {
+    //     public RC564()
+    //     {
+    //         super("RC5-64", 256, new CipherKeyGenerator());
+    //     }
+    // }
+    //
+    // /**
+    //  * RC6
+    //  */
+    // public static class RC6
+    //     extends JCEKeyGenerator
+    // {
+    //     public RC6()
+    //     {
+    //         super("RC6", 256, new CipherKeyGenerator());
+    //     }
+    // }
+    //
+    // /**
+    //  * GOST28147
+    //  */
+    // public static class GOST28147
+    //     extends JCEKeyGenerator
+    // {
+    //     public GOST28147()
+    //     {
+    //         super("GOST28147", 256, new CipherKeyGenerator());
+    //     }
+    // }
     
-
-
-    /**
-     * CAST6
-     */
-    public static class CAST6
-        extends JCEKeyGenerator
-    {
-        public CAST6()
-        {
-            super("CAST6", 256, new CipherKeyGenerator());
-        }
-    }
-
-    /**
-     * TEA
-     */
-    public static class TEA
-        extends JCEKeyGenerator
-    {
-        public TEA()
-        {
-            super("TEA", 128, new CipherKeyGenerator());
-        }
-    }
-
-    /**
-     * XTEA
-     */
-    public static class XTEA
-        extends JCEKeyGenerator
-    {
-        public XTEA()
-        {
-            super("XTEA", 128, new CipherKeyGenerator());
-        }
-    }
-
-    /**
-     * Salsa20
-     */
-    public static class Salsa20
-        extends JCEKeyGenerator
-    {
-        public Salsa20()
-        {
-            super("Salsa20", 128, new CipherKeyGenerator());
-        }
-    }
-
-    /**
-     * HC128
-     */
-    public static class HC128
-        extends JCEKeyGenerator
-    {
-        public HC128()
-        {
-            super("HC128", 128, new CipherKeyGenerator());
-        }
-    }
-
-    /**
-     * HC256
-     */
-    public static class HC256
-        extends JCEKeyGenerator
-    {
-        public HC256()
-        {
-            super("HC256", 256, new CipherKeyGenerator());
-        }
-    }
-
-    /**
-     * VMPC
-     */
-    public static class VMPC
-        extends JCEKeyGenerator
-    {
-        public VMPC()
-        {
-            super("VMPC", 128, new CipherKeyGenerator());
-        }
-    }
-
-    /**
-     * VMPC-KSA3
-     */
-    public static class VMPCKSA3
-        extends JCEKeyGenerator
-    {
-        public VMPCKSA3()
-        {
-            super("VMPC-KSA3", 128, new CipherKeyGenerator());
-        }
-    }
+    // /**
+    //  * Rijndael
+    //  */
+    // public static class Rijndael
+    //     extends JCEKeyGenerator
+    // {
+    //     public Rijndael()
+    //     {
+    //         super("Rijndael", 192, new CipherKeyGenerator());
+    //     }
+    // }
+    //
+    // /**
+    //  * Serpent
+    //  */
+    // public static class Serpent
+    //     extends JCEKeyGenerator
+    // {
+    //     public Serpent()
+    //     {
+    //         super("Serpent", 192, new CipherKeyGenerator());
+    //     }
+    // }
+    //
+    //
+    //
+    // /**
+    //  * CAST6
+    //  */
+    // public static class CAST6
+    //     extends JCEKeyGenerator
+    // {
+    //     public CAST6()
+    //     {
+    //         super("CAST6", 256, new CipherKeyGenerator());
+    //     }
+    // }
+    //
+    // /**
+    //  * TEA
+    //  */
+    // public static class TEA
+    //     extends JCEKeyGenerator
+    // {
+    //     public TEA()
+    //     {
+    //         super("TEA", 128, new CipherKeyGenerator());
+    //     }
+    // }
+    //
+    // /**
+    //  * XTEA
+    //  */
+    // public static class XTEA
+    //     extends JCEKeyGenerator
+    // {
+    //     public XTEA()
+    //     {
+    //         super("XTEA", 128, new CipherKeyGenerator());
+    //     }
+    // }
+    //
+    // /**
+    //  * Salsa20
+    //  */
+    // public static class Salsa20
+    //     extends JCEKeyGenerator
+    // {
+    //     public Salsa20()
+    //     {
+    //         super("Salsa20", 128, new CipherKeyGenerator());
+    //     }
+    // }
+    //
+    // /**
+    //  * HC128
+    //  */
+    // public static class HC128
+    //     extends JCEKeyGenerator
+    // {
+    //     public HC128()
+    //     {
+    //         super("HC128", 128, new CipherKeyGenerator());
+    //     }
+    // }
+    //
+    // /**
+    //  * HC256
+    //  */
+    // public static class HC256
+    //     extends JCEKeyGenerator
+    // {
+    //     public HC256()
+    //     {
+    //         super("HC256", 256, new CipherKeyGenerator());
+    //     }
+    // }
+    //
+    // /**
+    //  * VMPC
+    //  */
+    // public static class VMPC
+    //     extends JCEKeyGenerator
+    // {
+    //     public VMPC()
+    //     {
+    //         super("VMPC", 128, new CipherKeyGenerator());
+    //     }
+    // }
+    //
+    // /**
+    //  * VMPC-KSA3
+    //  */
+    // public static class VMPCKSA3
+    //     extends JCEKeyGenerator
+    // {
+    //     public VMPCKSA3()
+    //     {
+    //         super("VMPC-KSA3", 128, new CipherKeyGenerator());
+    //     }
+    // }
+    // END android-removed
 
     // HMAC Related secret keys..
   
-    /**
-     * MD2HMAC
-     */
-    public static class MD2HMAC
-        extends JCEKeyGenerator
-    {
-        public MD2HMAC()
-        {
-            super("HMACMD2", 128, new CipherKeyGenerator());
-        }
-    }
-
-
-    /**
-     * MD4HMAC
-     */
-    public static class MD4HMAC
-        extends JCEKeyGenerator
-    {
-        public MD4HMAC()
-        {
-            super("HMACMD4", 128, new CipherKeyGenerator());
-        }
-    }
+    // BEGIN android-removed
+    // /**
+    //  * MD2HMAC
+    //  */
+    // public static class MD2HMAC
+    //     extends JCEKeyGenerator
+    // {
+    //     public MD2HMAC()
+    //     {
+    //         super("HMACMD2", 128, new CipherKeyGenerator());
+    //     }
+    // }
+    //
+    //
+    // /**
+    //  * MD4HMAC
+    //  */
+    // public static class MD4HMAC
+    //     extends JCEKeyGenerator
+    // {
+    //     public MD4HMAC()
+    //     {
+    //         super("HMACMD4", 128, new CipherKeyGenerator());
+    //     }
+    // }
+    // END android-removed
 
     /**
      * MD5HMAC
@@ -427,29 +435,29 @@
     }
 
 
-    /**
-     * RIPE128HMAC
-     */
-    public static class RIPEMD128HMAC
-        extends JCEKeyGenerator
-    {
-        public RIPEMD128HMAC()
-        {
-            super("HMACRIPEMD128", 128, new CipherKeyGenerator());
-        }
-    }
-
-    /**
-     * RIPE160HMAC
-     */
-    public static class RIPEMD160HMAC
-        extends JCEKeyGenerator
-    {
-        public RIPEMD160HMAC()
-        {
-            super("HMACRIPEMD160", 160, new CipherKeyGenerator());
-        }
-    }
+    // /**
+    //  * RIPE128HMAC
+    //  */
+    // public static class RIPEMD128HMAC
+    //     extends JCEKeyGenerator
+    // {
+    //     public RIPEMD128HMAC()
+    //     {
+    //         super("HMACRIPEMD128", 128, new CipherKeyGenerator());
+    //     }
+    // }
+
+    // /**
+    //  * RIPE160HMAC
+    //  */
+    // public static class RIPEMD160HMAC
+    //     extends JCEKeyGenerator
+    // {
+    //     public RIPEMD160HMAC()
+    //     {
+    //         super("HMACRIPEMD160", 160, new CipherKeyGenerator());
+    //     }
+    // }
 
 
     /**
@@ -464,17 +472,19 @@
         }
     }
 
-    /**
-     * HMACSHA224
-     */
-    public static class HMACSHA224
-        extends JCEKeyGenerator
-    {
-        public HMACSHA224()
-        {
-            super("HMACSHA224", 224, new CipherKeyGenerator());
-        }
-    }
+    // BEGIN android-removed
+    // /**
+    //  * HMACSHA224
+    //  */
+    // public static class HMACSHA224
+    //     extends JCEKeyGenerator
+    // {
+    //     public HMACSHA224()
+    //     {
+    //         super("HMACSHA224", 224, new CipherKeyGenerator());
+    //     }
+    // }
+    // END android-removed
     
     /**
      * HMACSHA256
@@ -512,15 +522,17 @@
         }
     }
     
-    /**
-     * HMACTIGER
-     */
-    public static class HMACTIGER
-        extends JCEKeyGenerator
-    {
-        public HMACTIGER()
-        {
-            super("HMACTIGER", 192, new CipherKeyGenerator());
-        }
-    }
+    // BEGIN android-removed
+    // /**
+    //  * HMACTIGER
+    //  */
+    // public static class HMACTIGER
+    //     extends JCEKeyGenerator
+    // {
+    //     public HMACTIGER()
+    //     {
+    //         super("HMACTIGER", 192, new CipherKeyGenerator());
+    //     }
+    // }
+    // END android-removed
 }
diff -Naur bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/JCEMac.java bcprov-jdk16-145/org/bouncycastle/jce/provider/JCEMac.java
--- bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/JCEMac.java	2010-01-11 21:46:14.000000000 +0000
+++ bcprov-jdk16-145/org/bouncycastle/jce/provider/JCEMac.java	2011-09-01 17:21:06.000000000 +0000
@@ -2,29 +2,43 @@
 
 import org.bouncycastle.crypto.CipherParameters;
 import org.bouncycastle.crypto.Mac;
-import org.bouncycastle.crypto.digests.MD2Digest;
-import org.bouncycastle.crypto.digests.MD4Digest;
+// BEGIN android-removed
+// import org.bouncycastle.crypto.digests.MD2Digest;
+// import org.bouncycastle.crypto.digests.MD4Digest;
+// END android-removed
 import org.bouncycastle.crypto.digests.MD5Digest;
-import org.bouncycastle.crypto.digests.RIPEMD128Digest;
-import org.bouncycastle.crypto.digests.RIPEMD160Digest;
+// BEGIN android-removed
+// import org.bouncycastle.crypto.digests.RIPEMD128Digest;
+// import org.bouncycastle.crypto.digests.RIPEMD160Digest;
+// END android-removed
 import org.bouncycastle.crypto.digests.SHA1Digest;
-import org.bouncycastle.crypto.digests.SHA224Digest;
+// BEGIN android-removed
+// import org.bouncycastle.crypto.digests.SHA224Digest;
+// END android-removed
 import org.bouncycastle.crypto.digests.SHA256Digest;
 import org.bouncycastle.crypto.digests.SHA384Digest;
 import org.bouncycastle.crypto.digests.SHA512Digest;
-import org.bouncycastle.crypto.digests.TigerDigest;
+// BEGIN android-removed
+// import org.bouncycastle.crypto.digests.TigerDigest;
+// END android-removed
 import org.bouncycastle.crypto.engines.DESEngine;
 import org.bouncycastle.crypto.engines.DESedeEngine;
-import org.bouncycastle.crypto.engines.RC2Engine;
-import org.bouncycastle.crypto.engines.RC532Engine;
-import org.bouncycastle.crypto.engines.SkipjackEngine;
+// BEGIN android-removed
+// import org.bouncycastle.crypto.engines.RC2Engine;
+// import org.bouncycastle.crypto.engines.RC532Engine;
+// import org.bouncycastle.crypto.engines.SkipjackEngine;
+// END android-removed
 import org.bouncycastle.crypto.macs.CBCBlockCipherMac;
-import org.bouncycastle.crypto.macs.CFBBlockCipherMac;
-import org.bouncycastle.crypto.macs.GOST28147Mac;
+// BEGIN android-removed
+// import org.bouncycastle.crypto.macs.CFBBlockCipherMac;
+// import org.bouncycastle.crypto.macs.GOST28147Mac;
+// END android-removed
 import org.bouncycastle.crypto.macs.HMac;
-import org.bouncycastle.crypto.macs.ISO9797Alg3Mac;
-import org.bouncycastle.crypto.macs.OldHMac;
-import org.bouncycastle.crypto.macs.VMPCMac;
+// BEGIN android-removed
+// import org.bouncycastle.crypto.macs.ISO9797Alg3Mac;
+// import org.bouncycastle.crypto.macs.OldHMac;
+// import org.bouncycastle.crypto.macs.VMPCMac;
+// END android-removed
 import org.bouncycastle.crypto.paddings.ISO7816d4Padding;
 import org.bouncycastle.crypto.params.KeyParameter;
 import org.bouncycastle.crypto.params.ParametersWithIV;
@@ -146,224 +160,226 @@
      * the classes that extend directly off us.
      */
 
-    /**
-     * DES
-     */
-    public static class DES
-        extends JCEMac
-    {
-        public DES()
-        {
-            super(new CBCBlockCipherMac(new DESEngine()));
-        }
-    }
-
-    /**
-     * DESede
-     */
-    public static class DESede
-        extends JCEMac
-    {
-        public DESede()
-        {
-            super(new CBCBlockCipherMac(new DESedeEngine()));
-        }
-    }
-
-    /**
-     * SKIPJACK
-     */
-    public static class Skipjack
-        extends JCEMac
-    {
-        public Skipjack()
-        {
-            super(new CBCBlockCipherMac(new SkipjackEngine()));
-        }
-    }
-
-    /**
-     * RC2
-     */
-    public static class RC2
-        extends JCEMac
-    {
-        public RC2()
-        {
-            super(new CBCBlockCipherMac(new RC2Engine()));
-        }
-    }
-
-    /**
-     * RC5
-     */
-    public static class RC5
-        extends JCEMac
-    {
-        public RC5()
-        {
-            super(new CBCBlockCipherMac(new RC532Engine()));
-        }
-    }
-
-    /**
-     * GOST28147
-     */
-    public static class GOST28147
-        extends JCEMac
-    {
-        public GOST28147()
-        {
-            super(new GOST28147Mac());
-        }
-    }
-
-    /**
-     * VMPC
-     */
-    public static class VMPC
-        extends JCEMac
-    {
-        public VMPC()
-        {
-            super(new VMPCMac());
-        }
-    }
-
-    /**
-     * DES
-     */
-    public static class DESCFB8
-        extends JCEMac
-    {
-        public DESCFB8()
-        {
-            super(new CFBBlockCipherMac(new DESEngine()));
-        }
-    }
-
-    /**
-     * DESede
-     */
-    public static class DESedeCFB8
-        extends JCEMac
-    {
-        public DESedeCFB8()
-        {
-            super(new CFBBlockCipherMac(new DESedeEngine()));
-        }
-    }
-
-    /**
-     * SKIPJACK
-     */
-    public static class SkipjackCFB8
-        extends JCEMac
-    {
-        public SkipjackCFB8()
-        {
-            super(new CFBBlockCipherMac(new SkipjackEngine()));
-        }
-    }
-
-    /**
-     * RC2CFB8
-     */
-    public static class RC2CFB8
-        extends JCEMac
-    {
-        public RC2CFB8()
-        {
-            super(new CFBBlockCipherMac(new RC2Engine()));
-        }
-    }
-
-    /**
-     * RC5CFB8
-     */
-    public static class RC5CFB8
-        extends JCEMac
-    {
-        public RC5CFB8()
-        {
-            super(new CFBBlockCipherMac(new RC532Engine()));
-        }
-    }
-    
+    // BEGIN android-removed
+    // /**
+    //  * DES
+    //  */
+    // public static class DES
+    //     extends JCEMac
+    // {
+    //     public DES()
+    //     {
+    //         super(new CBCBlockCipherMac(new DESEngine()));
+    //     }
+    // }
+    //
+    // /**
+    //  * DESede
+    //  */
+    // public static class DESede
+    //     extends JCEMac
+    // {
+    //     public DESede()
+    //     {
+    //         super(new CBCBlockCipherMac(new DESedeEngine()));
+    //     }
+    // }
+    //
+    // /**
+    //  * SKIPJACK
+    //  */
+    // public static class Skipjack
+    //     extends JCEMac
+    // {
+    //     public Skipjack()
+    //     {
+    //         super(new CBCBlockCipherMac(new SkipjackEngine()));
+    //     }
+    // }
+    //
+    // /**
+    //  * RC2
+    //  */
+    // public static class RC2
+    //     extends JCEMac
+    // {
+    //     public RC2()
+    //     {
+    //         super(new CBCBlockCipherMac(new RC2Engine()));
+    //     }
+    // }
+    //
+    // /**
+    //  * RC5
+    //  */
+    // public static class RC5
+    //     extends JCEMac
+    // {
+    //     public RC5()
+    //     {
+    //         super(new CBCBlockCipherMac(new RC532Engine()));
+    //     }
+    // }
+    //
+    // /**
+    //  * GOST28147
+    //  */
+    // public static class GOST28147
+    //     extends JCEMac
+    // {
+    //     public GOST28147()
+    //     {
+    //         super(new GOST28147Mac());
+    //     }
+    // }
+    //
+    // /**
+    //  * VMPC
+    //  */
+    // public static class VMPC
+    //     extends JCEMac
+    // {
+    //     public VMPC()
+    //     {
+    //         super(new VMPCMac());
+    //     }
+    // }
+    //
+    // /**
+    //  * DES
+    //  */
+    // public static class DESCFB8
+    //     extends JCEMac
+    // {
+    //     public DESCFB8()
+    //     {
+    //         super(new CFBBlockCipherMac(new DESEngine()));
+    //     }
+    // }
+    //
+    // /**
+    //  * DESede
+    //  */
+    // public static class DESedeCFB8
+    //     extends JCEMac
+    // {
+    //     public DESedeCFB8()
+    //     {
+    //         super(new CFBBlockCipherMac(new DESedeEngine()));
+    //     }
+    // }
+    //
+    // /**
+    //  * SKIPJACK
+    //  */
+    // public static class SkipjackCFB8
+    //     extends JCEMac
+    // {
+    //     public SkipjackCFB8()
+    //     {
+    //         super(new CFBBlockCipherMac(new SkipjackEngine()));
+    //     }
+    // }
+    //
+    // /**
+    //  * RC2CFB8
+    //  */
+    // public static class RC2CFB8
+    //     extends JCEMac
+    // {
+    //     public RC2CFB8()
+    //     {
+    //         super(new CFBBlockCipherMac(new RC2Engine()));
+    //     }
+    // }
+    //
+    // /**
+    //  * RC5CFB8
+    //  */
+    // public static class RC5CFB8
+    //     extends JCEMac
+    // {
+    //     public RC5CFB8()
+    //     {
+    //         super(new CFBBlockCipherMac(new RC532Engine()));
+    //     }
+    // }
+    //
+    //
+    // /**
+    //  * DESede64
+    //  */
+    // public static class DESede64
+    //     extends JCEMac
+    // {
+    //     public DESede64()
+    //     {
+    //         super(new CBCBlockCipherMac(new DESedeEngine(), 64));
+    //     }
+    // }
+    //
+    // /**
+    //  * DESede64with7816-4Padding
+    //  */
+    // public static class DESede64with7816d4
+    //     extends JCEMac
+    // {
+    //     public DESede64with7816d4()
+    //     {
+    //         super(new CBCBlockCipherMac(new DESedeEngine(), 64, new ISO7816d4Padding()));
+    //     }
+    // }
+    //
+    // /**
+    //  * DES9797Alg3with7816-4Padding
+    //  */
+    // public static class DES9797Alg3with7816d4
+    //     extends JCEMac
+    // {
+    //     public DES9797Alg3with7816d4()
+    //     {
+    //         super(new ISO9797Alg3Mac(new DESEngine(), new ISO7816d4Padding()));
+    //     }
+    // }
+    //
+    // /**
+    //  * DES9797Alg3
+    //  */
+    // public static class DES9797Alg3
+    //     extends JCEMac
+    // {
+    //     public DES9797Alg3()
+    //     {
+    //         super(new ISO9797Alg3Mac(new DESEngine()));
+    //     }
+    // }
+    //
+    // /**
+    //  * MD2 HMac
+    //  */
+    // public static class MD2
+    //     extends JCEMac
+    // {
+    //     public MD2()
+    //     {
+    //         super(new HMac(new MD2Digest()));
+    //     }
+    // }
+    //
+    // /**
+    //  * MD4 HMac
+    //  */
+    // public static class MD4
+    //     extends JCEMac
+    // {
+    //     public MD4()
+    //     {
+    //         super(new HMac(new MD4Digest()));
+    //     }
+    // }
+    // END android-removed
     
     /**
-     * DESede64
-     */
-    public static class DESede64
-        extends JCEMac
-    {
-        public DESede64()
-        {
-            super(new CBCBlockCipherMac(new DESedeEngine(), 64));
-        }
-    }
-
-    /**
-     * DESede64with7816-4Padding
-     */
-    public static class DESede64with7816d4
-        extends JCEMac
-    {
-        public DESede64with7816d4()
-        {
-            super(new CBCBlockCipherMac(new DESedeEngine(), 64, new ISO7816d4Padding()));
-        }
-    }
-
-    /**
-     * DES9797Alg3with7816-4Padding
-     */
-    public static class DES9797Alg3with7816d4
-        extends JCEMac
-    {
-        public DES9797Alg3with7816d4()
-        {
-            super(new ISO9797Alg3Mac(new DESEngine(), new ISO7816d4Padding()));
-        }
-    }
-
-    /**
-     * DES9797Alg3
-     */
-    public static class DES9797Alg3
-        extends JCEMac
-    {
-        public DES9797Alg3()
-        {
-            super(new ISO9797Alg3Mac(new DESEngine()));
-        }
-    }
-
-    /**
-     * MD2 HMac
-     */
-    public static class MD2
-        extends JCEMac
-    {
-        public MD2()
-        {
-            super(new HMac(new MD2Digest()));
-        }
-    }
-
-    /**
-     * MD4 HMac
-     */
-    public static class MD4
-        extends JCEMac
-    {
-        public MD4()
-        {
-            super(new HMac(new MD4Digest()));
-        }
-    }
-
-    /**
      * MD5 HMac
      */
     public static class MD5
@@ -374,7 +390,7 @@
             super(new HMac(new MD5Digest()));
         }
     }
-
+    
     /**
      * SHA1 HMac
      */
@@ -386,18 +402,20 @@
             super(new HMac(new SHA1Digest()));
         }
     }
-
-    /**
-     * SHA-224 HMac
-     */
-    public static class SHA224
-        extends JCEMac
-    {
-        public SHA224()
-        {
-            super(new HMac(new SHA224Digest()));
-        }
-    }
+    
+    // BEGIN android-removed
+    // /**
+    //  * SHA-224 HMac
+    //  */
+    // public static class SHA224
+    //     extends JCEMac
+    // {
+    //     public SHA224()
+    //     {
+    //         super(new HMac(new SHA224Digest()));
+    //     }
+    // }
+    // END android-removed
     
     /**
      * SHA-256 HMac
@@ -410,7 +428,7 @@
             super(new HMac(new SHA256Digest()));
         }
     }
-
+    
     /**
      * SHA-384 HMac
      */
@@ -422,15 +440,17 @@
             super(new HMac(new SHA384Digest()));
         }
     }
-
-    public static class OldSHA384
-        extends JCEMac
-    {
-        public OldSHA384()
-        {
-            super(new OldHMac(new SHA384Digest()));
-        }
-    }
+    
+    // BEGIN android-removed
+    // public static class OldSHA384
+    //     extends JCEMac
+    // {
+    //     public OldSHA384()
+    //     {
+    //         super(new OldHMac(new SHA384Digest()));
+    //     }
+    // }
+    // END android-removed
     
     /**
      * SHA-512 HMac
@@ -443,73 +463,75 @@
             super(new HMac(new SHA512Digest()));
         }
     }
-
-    /**
-     * SHA-512 HMac
-     */
-    public static class OldSHA512
-        extends JCEMac
-    {
-        public OldSHA512()
-        {
-            super(new OldHMac(new SHA512Digest()));
-        }
-    }
     
-    /**
-     * RIPEMD128 HMac
-     */
-    public static class RIPEMD128
-        extends JCEMac
-    {
-        public RIPEMD128()
-        {
-            super(new HMac(new RIPEMD128Digest()));
-        }
-    }
-
-    /**
-     * RIPEMD160 HMac
-     */
-    public static class RIPEMD160
-        extends JCEMac
-    {
-        public RIPEMD160()
-        {
-            super(new HMac(new RIPEMD160Digest()));
-        }
-    }
-
-    /**
-     * Tiger HMac
-     */
-    public static class Tiger
-        extends JCEMac
-    {
-        public Tiger()
-        {
-            super(new HMac(new TigerDigest()));
-        }
-    }
-
+    // BEGIN android-removed
+    // /**
+    //  * SHA-512 HMac
+    //  */
+    // public static class OldSHA512
+    //     extends JCEMac
+    // {
+    //     public OldSHA512()
+    //     {
+    //         super(new OldHMac(new SHA512Digest()));
+    //     }
+    // }
     //
-    // PKCS12 states that the same algorithm should be used
-    // for the key generation as is used in the HMAC, so that
-    // is what we do here.
+    // /**
+    //  * RIPEMD128 HMac
+    //  */
+    // public static class RIPEMD128
+    //     extends JCEMac
+    // {
+    //     public RIPEMD128()
+    //     {
+    //        super(new HMac(new RIPEMD128Digest()));
+    //     }
+    // }
     //
-
-    /**
-     * PBEWithHmacRIPEMD160
-     */
-    public static class PBEWithRIPEMD160
-        extends JCEMac
-    {
-        public PBEWithRIPEMD160()
-        {
-            super(new HMac(new RIPEMD160Digest()), PKCS12, RIPEMD160, 160);
-        }
-    }
-
+    // /**
+    //  * RIPEMD160 HMac
+    //  */
+    // public static class RIPEMD160
+    //     extends JCEMac
+    // {
+    //     public RIPEMD160()
+    //     {
+    //        super(new HMac(new RIPEMD160Digest()));
+    //     }
+    // }
+    //
+    // /**
+    //  * Tiger HMac
+    //  */
+    // public static class Tiger
+    //     extends JCEMac
+    // {
+    //     public Tiger()
+    //     {
+    //         super(new HMac(new TigerDigest()));
+    //     }
+    // }
+    //
+    // //
+    // // PKCS12 states that the same algorithm should be used
+    // // for the key generation as is used in the HMAC, so that
+    // // is what we do here.
+    // //
+    //
+    // /**
+    //  * PBEWithHmacRIPEMD160
+    //  */
+    // public static class PBEWithRIPEMD160
+    //     extends JCEMac
+    // {
+    //     public PBEWithRIPEMD160()
+    //     {
+    //         super(new HMac(new RIPEMD160Digest()), PKCS12, RIPEMD160, 160);
+    //     }
+    // }
+    // END android-removed
+    
     /**
      * PBEWithHmacSHA
      */
@@ -521,16 +543,18 @@
             super(new HMac(new SHA1Digest()), PKCS12, SHA1, 160);
         }
     }
-
-    /**
-     * PBEWithHmacTiger
-     */
-    public static class PBEWithTiger
-        extends JCEMac
-    {
-        public PBEWithTiger()
-        {
-            super(new HMac(new TigerDigest()), PKCS12, TIGER, 192);
-        }
-    }
+    
+    // BEGIN android-removed
+    //  /**
+    //   * PBEWithHmacTiger
+    //   */
+    // public static class PBEWithTiger
+    //     extends JCEMac
+    // {
+    //     public PBEWithTiger()
+    //     {
+    //         super(new HMac(new TigerDigest()), PKCS12, TIGER, 192);
+    //     }
+    // }
+    // END android-removed
 }
diff -Naur bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/JCERSACipher.java bcprov-jdk16-145/org/bouncycastle/jce/provider/JCERSACipher.java
--- bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/JCERSACipher.java	2010-01-11 21:46:14.000000000 +0000
+++ bcprov-jdk16-145/org/bouncycastle/jce/provider/JCERSACipher.java	2011-09-01 17:21:06.000000000 +0000
@@ -534,48 +534,50 @@
         }
     }
 
-    static public class PKCS1v1_5Padding
-        extends JCERSACipher
-    {
-        public PKCS1v1_5Padding()
-        {
-            super(new PKCS1Encoding(new RSABlindedEngine()));
-        }
-    }
-
-    static public class PKCS1v1_5Padding_PrivateOnly
-        extends JCERSACipher
-    {
-        public PKCS1v1_5Padding_PrivateOnly()
-        {
-            super(false, true, new PKCS1Encoding(new RSABlindedEngine()));
-        }
-    }
-
-    static public class PKCS1v1_5Padding_PublicOnly
-        extends JCERSACipher
-    {
-        public PKCS1v1_5Padding_PublicOnly()
-        {
-            super(true, false, new PKCS1Encoding(new RSABlindedEngine()));
-        }
-    }
-
-    static public class OAEPPadding
-        extends JCERSACipher
-    {
-        public OAEPPadding()
-        {
-            super(OAEPParameterSpec.DEFAULT);
-        }
-    }
-    
-    static public class ISO9796d1Padding
-        extends JCERSACipher
-    {
-        public ISO9796d1Padding()
-        {
-            super(new ISO9796d1Encoding(new RSABlindedEngine()));
-        }
-    }
+    // BEGIN android-removed
+    // static public class PKCS1v1_5Padding
+    //     extends JCERSACipher
+    // {
+    //     public PKCS1v1_5Padding()
+    //     {
+    //         super(new PKCS1Encoding(new RSABlindedEngine()));
+    //     }
+    // }
+    //
+    // static public class PKCS1v1_5Padding_PrivateOnly
+    //     extends JCERSACipher
+    // {
+    //     public PKCS1v1_5Padding_PrivateOnly()
+    //     {
+    //         super(false, true, new PKCS1Encoding(new RSABlindedEngine()));
+    //     }
+    // }
+    //
+    // static public class PKCS1v1_5Padding_PublicOnly
+    //     extends JCERSACipher
+    // {
+    //     public PKCS1v1_5Padding_PublicOnly()
+    //     {
+    //         super(true, false, new PKCS1Encoding(new RSABlindedEngine()));
+    //     }
+    // }
+    //
+    // static public class OAEPPadding
+    //     extends JCERSACipher
+    // {
+    //     public OAEPPadding()
+    //     {
+    //         super(OAEPParameterSpec.DEFAULT);
+    //     }
+    // }
+    //
+    // static public class ISO9796d1Padding
+    //     extends JCERSACipher
+    // {
+    //     public ISO9796d1Padding()
+    //     {
+    //         super(new ISO9796d1Encoding(new RSABlindedEngine()));
+    //     }
+    // }
+    // END android-removed
 }
diff -Naur bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/JCERSAPrivateCrtKey.java bcprov-jdk16-145/org/bouncycastle/jce/provider/JCERSAPrivateCrtKey.java
--- bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/JCERSAPrivateCrtKey.java	2010-01-11 21:46:14.000000000 +0000
+++ bcprov-jdk16-145/org/bouncycastle/jce/provider/JCERSAPrivateCrtKey.java	2011-09-01 17:21:06.000000000 +0000
@@ -125,7 +125,9 @@
      */
     public byte[] getEncoded()
     {
-        PrivateKeyInfo          info = new PrivateKeyInfo(new AlgorithmIdentifier(PKCSObjectIdentifiers.rsaEncryption, new DERNull()), new RSAPrivateKeyStructure(getModulus(), getPublicExponent(), getPrivateExponent(), getPrimeP(), getPrimeQ(), getPrimeExponentP(), getPrimeExponentQ(), getCrtCoefficient()).getDERObject());
+        // BEGIN android-changed
+        PrivateKeyInfo          info = new PrivateKeyInfo(new AlgorithmIdentifier(PKCSObjectIdentifiers.rsaEncryption, DERNull.INSTANCE), new RSAPrivateKeyStructure(getModulus(), getPublicExponent(), getPrivateExponent(), getPrimeP(), getPrimeQ(), getPrimeExponentP(), getPrimeExponentQ(), getCrtCoefficient()).getDERObject());
+        // END android-changed
 
         return info.getDEREncoded();
     }
diff -Naur bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/JCERSAPrivateKey.java bcprov-jdk16-145/org/bouncycastle/jce/provider/JCERSAPrivateKey.java
--- bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/JCERSAPrivateKey.java	2010-01-11 21:46:14.000000000 +0000
+++ bcprov-jdk16-145/org/bouncycastle/jce/provider/JCERSAPrivateKey.java	2011-09-01 17:21:06.000000000 +0000
@@ -77,7 +77,9 @@
 
     public byte[] getEncoded()
     {
-        PrivateKeyInfo info = new PrivateKeyInfo(new AlgorithmIdentifier(PKCSObjectIdentifiers.rsaEncryption, new DERNull()), new RSAPrivateKeyStructure(getModulus(), ZERO, getPrivateExponent(), ZERO, ZERO, ZERO, ZERO, ZERO).getDERObject());
+        // BEGIN android-changed
+        PrivateKeyInfo info = new PrivateKeyInfo(new AlgorithmIdentifier(PKCSObjectIdentifiers.rsaEncryption, DERNull.INSTANCE), new RSAPrivateKeyStructure(getModulus(), ZERO, getPrivateExponent(), ZERO, ZERO, ZERO, ZERO, ZERO).getDERObject());
+        // END android-changed
 
         return info.getDEREncoded();
     }
diff -Naur bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/JCERSAPublicKey.java bcprov-jdk16-145/org/bouncycastle/jce/provider/JCERSAPublicKey.java
--- bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/JCERSAPublicKey.java	2010-01-11 21:46:14.000000000 +0000
+++ bcprov-jdk16-145/org/bouncycastle/jce/provider/JCERSAPublicKey.java	2011-09-01 17:21:06.000000000 +0000
@@ -90,7 +90,9 @@
 
     public byte[] getEncoded()
     {
-        SubjectPublicKeyInfo    info = new SubjectPublicKeyInfo(new AlgorithmIdentifier(PKCSObjectIdentifiers.rsaEncryption, new DERNull()), new RSAPublicKeyStructure(getModulus(), getPublicExponent()).getDERObject());
+        // BEGIN android-changed
+        SubjectPublicKeyInfo    info = new SubjectPublicKeyInfo(new AlgorithmIdentifier(PKCSObjectIdentifiers.rsaEncryption, DERNull.INSTANCE), new RSAPublicKeyStructure(getModulus(), getPublicExponent()).getDERObject());
+        // END android-changed
 
         return info.getDEREncoded();
     }
diff -Naur bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/JCESecretKeyFactory.java bcprov-jdk16-145/org/bouncycastle/jce/provider/JCESecretKeyFactory.java
--- bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/JCESecretKeyFactory.java	2010-01-11 21:46:14.000000000 +0000
+++ bcprov-jdk16-145/org/bouncycastle/jce/provider/JCESecretKeyFactory.java	2011-09-01 17:21:06.000000000 +0000
@@ -321,29 +321,31 @@
         }
     }
     
-    /**
-     * PBEWithMD2AndDES
-     */
-    static public class PBEWithMD2AndDES
-        extends DESPBEKeyFactory
-    {
-        public PBEWithMD2AndDES()
-        {
-            super("PBEwithMD2andDES", PKCSObjectIdentifiers.pbeWithMD2AndDES_CBC, true, PKCS5S1, MD2, 64, 64);
-        }
-    }
-
-    /**
-     * PBEWithMD2AndRC2
-     */
-    static public class PBEWithMD2AndRC2
-        extends PBEKeyFactory
-    {
-        public PBEWithMD2AndRC2()
-        {
-            super("PBEwithMD2andRC2", PKCSObjectIdentifiers.pbeWithMD2AndRC2_CBC, true, PKCS5S1, MD2, 64, 64);
-        }
-    }
+    // BEGIN android-removed
+    // /**
+    //  * PBEWithMD2AndDES
+    //  */
+    // static public class PBEWithMD2AndDES
+    //     extends DESPBEKeyFactory
+    // {
+    //     public PBEWithMD2AndDES()
+    //     {
+    //         super("PBEwithMD2andDES", PKCSObjectIdentifiers.pbeWithMD2AndDES_CBC, true, PKCS5S1, MD2, 64, 64);
+    //     }
+    // }
+    //
+    // /**
+    //  * PBEWithMD2AndRC2
+    //  */
+    // static public class PBEWithMD2AndRC2
+    //     extends PBEKeyFactory
+    // {
+    //     public PBEWithMD2AndRC2()
+    //     {
+    //         super("PBEwithMD2andRC2", PKCSObjectIdentifiers.pbeWithMD2AndRC2_CBC, true, PKCS5S1, MD2, 64, 64);
+    //     }
+    // }
+    // END android-removed
 
    /**
     * PBEWithMD5AndDES
@@ -477,17 +479,19 @@
        }
    }
    
-   /**
-    * PBEWithHmacRIPEMD160
-    */
-   public static class PBEWithRIPEMD160
-       extends PBEKeyFactory
-   {
-       public PBEWithRIPEMD160()
-       {
-           super("PBEwithHmacRIPEMD160", null, false, PKCS12, RIPEMD160, 160, 0);
-       }
-   }
+   // BEGIN android-removed
+   // /**
+   //  * PBEWithHmacRIPEMD160
+   //  */
+   // public static class PBEWithRIPEMD160
+   //     extends PBEKeyFactory
+   // {
+   //     public PBEWithRIPEMD160()
+   //     {
+   //         super("PBEwithHmacRIPEMD160", null, false, PKCS12, RIPEMD160, 160, 0);
+   //     }
+   // }
+   // END android-removed
 
    /**
     * PBEWithHmacSHA
@@ -501,17 +505,19 @@
        }
    }
 
-   /**
-    * PBEWithHmacTiger
-    */
-   public static class PBEWithTiger
-       extends PBEKeyFactory
-   {
-       public PBEWithTiger()
-       {
-           super("PBEwithHmacTiger", null, false, PKCS12, TIGER, 192, 0);
-       }
-   }
+   // BEGIN android-removed
+   // /**
+   //  * PBEWithHmacTiger
+   //  */
+   // public static class PBEWithTiger
+   //     extends PBEKeyFactory
+   // {
+   //     public PBEWithTiger()
+   //     {
+   //         super("PBEwithHmacTiger", null, false, PKCS12, TIGER, 192, 0);
+   //     }
+   // }
+   // END android-removed
    
    /**
     * PBEWithSHA1And128BitAES-BC
@@ -620,4 +626,56 @@
            super("PBEWithMD5And256BitAES-CBC-OpenSSL", null, true, OPENSSL, MD5, 256, 128);
        }
    }
+    // BEGIN android-added
+    static public class PBKDF2WithHmacSHA1
+        extends JCESecretKeyFactory
+    {
+        public PBKDF2WithHmacSHA1()
+        {
+            super("PBKDF2WithHmacSHA1", PKCSObjectIdentifiers.id_PBKDF2);
+        }
+
+        protected SecretKey engineGenerateSecret(
+            KeySpec keySpec)
+            throws InvalidKeySpecException
+        {
+            if (keySpec instanceof PBEKeySpec)
+            {
+                PBEKeySpec          pbeSpec = (PBEKeySpec)keySpec;
+                
+                if (pbeSpec.getSalt() == null)
+                {
+                    throw new InvalidKeySpecException("missing required salt");
+                }
+
+                if (pbeSpec.getIterationCount() <= 0)
+                {
+                    throw new InvalidKeySpecException("positive iteration count required: "
+                                                      + pbeSpec.getIterationCount());
+                }
+                
+                if (pbeSpec.getKeyLength() <= 0)
+                {
+                    throw new InvalidKeySpecException("positive key length required: "
+                                                      + pbeSpec.getKeyLength());
+                }
+                
+                if (pbeSpec.getPassword().length == 0)
+                {
+                    throw new IllegalArgumentException("password empty");
+                }
+
+                int scheme = PKCS5S2;
+                int digest = SHA1;
+                int keySize = pbeSpec.getKeyLength();
+                int ivSize = -1;
+                CipherParameters param = Util.makePBEMacParameters(pbeSpec, scheme, digest, keySize);
+                
+                return new JCEPBEKey(this.algName, this.algOid, scheme, digest, keySize, ivSize, pbeSpec, param);
+            }
+            
+            throw new InvalidKeySpecException("Invalid KeySpec");
+        }
+    }
+    // END android-added
 }
diff -Naur bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/JCEStreamCipher.java bcprov-jdk16-145/org/bouncycastle/jce/provider/JCEStreamCipher.java
--- bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/JCEStreamCipher.java	2010-01-11 21:46:14.000000000 +0000
+++ bcprov-jdk16-145/org/bouncycastle/jce/provider/JCEStreamCipher.java	2011-09-01 17:21:06.000000000 +0000
@@ -5,17 +5,21 @@
 import org.bouncycastle.crypto.DataLengthException;
 import org.bouncycastle.crypto.StreamBlockCipher;
 import org.bouncycastle.crypto.StreamCipher;
-import org.bouncycastle.crypto.engines.BlowfishEngine;
-import org.bouncycastle.crypto.engines.DESEngine;
-import org.bouncycastle.crypto.engines.DESedeEngine;
-import org.bouncycastle.crypto.engines.HC128Engine;
-import org.bouncycastle.crypto.engines.HC256Engine;
+// BEGIN android-removed
+// import org.bouncycastle.crypto.engines.BlowfishEngine;
+// import org.bouncycastle.crypto.engines.DESEngine;
+// import org.bouncycastle.crypto.engines.DESedeEngine;
+// import org.bouncycastle.crypto.engines.HC128Engine;
+// import org.bouncycastle.crypto.engines.HC256Engine;
+// END android-removed
 import org.bouncycastle.crypto.engines.RC4Engine;
-import org.bouncycastle.crypto.engines.Salsa20Engine;
-import org.bouncycastle.crypto.engines.SkipjackEngine;
-import org.bouncycastle.crypto.engines.TwofishEngine;
-import org.bouncycastle.crypto.engines.VMPCEngine;
-import org.bouncycastle.crypto.engines.VMPCKSA3Engine;
+// BEGIN android-removed
+// import org.bouncycastle.crypto.engines.Salsa20Engine;
+// import org.bouncycastle.crypto.engines.SkipjackEngine;
+// import org.bouncycastle.crypto.engines.TwofishEngine;
+// import org.bouncycastle.crypto.engines.VMPCEngine;
+// import org.bouncycastle.crypto.engines.VMPCKSA3Engine;
+// END android-removed
 import org.bouncycastle.crypto.modes.CFBBlockCipher;
 import org.bouncycastle.crypto.modes.OFBBlockCipher;
 import org.bouncycastle.crypto.params.KeyParameter;
@@ -27,8 +31,10 @@
 import javax.crypto.ShortBufferException;
 import javax.crypto.spec.IvParameterSpec;
 import javax.crypto.spec.PBEParameterSpec;
-import javax.crypto.spec.RC2ParameterSpec;
-import javax.crypto.spec.RC5ParameterSpec;
+// BEGIN android-removed
+// import javax.crypto.spec.RC2ParameterSpec;
+// import javax.crypto.spec.RC5ParameterSpec;
+// END android-removed
 import java.security.AlgorithmParameters;
 import java.security.InvalidAlgorithmParameterException;
 import java.security.InvalidKeyException;
@@ -44,8 +50,10 @@
     //
     private Class[]                 availableSpecs =
                                     {
-                                        RC2ParameterSpec.class,
-                                        RC5ParameterSpec.class,
+                                        // BEGIN android-removed
+                                        // RC2ParameterSpec.class,
+                                        // RC5ParameterSpec.class,
+                                        // END android-removed
                                         IvParameterSpec.class,
                                         PBEParameterSpec.class
                                     };
@@ -374,125 +382,127 @@
      * The ciphers that inherit from us.
      */
 
-    /**
-     * DES
-     */
-    static public class DES_CFB8
-        extends JCEStreamCipher
-    {
-        public DES_CFB8()
-        {
-            super(new CFBBlockCipher(new DESEngine(), 8), 64);
-        }
-    }
-
-    /**
-     * DESede
-     */
-    static public class DESede_CFB8
-        extends JCEStreamCipher
-    {
-        public DESede_CFB8()
-        {
-            super(new CFBBlockCipher(new DESedeEngine(), 8), 64);
-        }
-    }
-
-    /**
-     * SKIPJACK
-     */
-    static public class Skipjack_CFB8
-        extends JCEStreamCipher
-    {
-        public Skipjack_CFB8()
-        {
-            super(new CFBBlockCipher(new SkipjackEngine(), 8), 64);
-        }
-    }
-
-    /**
-     * Blowfish
-     */
-    static public class Blowfish_CFB8
-        extends JCEStreamCipher
-    {
-        public Blowfish_CFB8()
-        {
-            super(new CFBBlockCipher(new BlowfishEngine(), 8), 64);
-        }
-    }
-
-    /**
-     * Twofish
-     */
-    static public class Twofish_CFB8
-        extends JCEStreamCipher
-    {
-        public Twofish_CFB8()
-        {
-            super(new CFBBlockCipher(new TwofishEngine(), 8), 128);
-        }
-    }
-
-    /**
-     * DES
-     */
-    static public class DES_OFB8
-        extends JCEStreamCipher
-    {
-        public DES_OFB8()
-        {
-            super(new OFBBlockCipher(new DESEngine(), 8), 64);
-        }
-    }
-
-    /**
-     * DESede
-     */
-    static public class DESede_OFB8
-        extends JCEStreamCipher
-    {
-        public DESede_OFB8()
-        {
-            super(new OFBBlockCipher(new DESedeEngine(), 8), 64);
-        }
-    }
-
-    /**
-     * SKIPJACK
-     */
-    static public class Skipjack_OFB8
-        extends JCEStreamCipher
-    {
-        public Skipjack_OFB8()
-        {
-            super(new OFBBlockCipher(new SkipjackEngine(), 8), 64);
-        }
-    }
-
-    /**
-     * Blowfish
-     */
-    static public class Blowfish_OFB8
-        extends JCEStreamCipher
-    {
-        public Blowfish_OFB8()
-        {
-            super(new OFBBlockCipher(new BlowfishEngine(), 8), 64);
-        }
-    }
-
-    /**
-     * Twofish
-     */
-    static public class Twofish_OFB8
-        extends JCEStreamCipher
-    {
-        public Twofish_OFB8()
-        {
-            super(new OFBBlockCipher(new TwofishEngine(), 8), 128);
-        }
-    }
+    // BEGIN android-removed
+    // /**
+    //  * DES
+    //  */
+    // static public class DES_CFB8
+    //     extends JCEStreamCipher
+    // {
+    //     public DES_CFB8()
+    //     {
+    //         super(new CFBBlockCipher(new DESEngine(), 8), 64);
+    //     }
+    // }
+    //
+    // /**
+    //  * DESede
+    //  */
+    // static public class DESede_CFB8
+    //     extends JCEStreamCipher
+    // {
+    //     public DESede_CFB8()
+    //     {
+    //         super(new CFBBlockCipher(new DESedeEngine(), 8), 64);
+    //     }
+    // }
+    //
+    // /**
+    //  * SKIPJACK
+    //  */
+    // static public class Skipjack_CFB8
+    //     extends JCEStreamCipher
+    // {
+    //     public Skipjack_CFB8()
+    //     {
+    //         super(new CFBBlockCipher(new SkipjackEngine(), 8), 64);
+    //     }
+    // }
+    //
+    // /**
+    //  * Blowfish
+    //  */
+    // static public class Blowfish_CFB8
+    //     extends JCEStreamCipher
+    // {
+    //     public Blowfish_CFB8()
+    //     {
+    //         super(new CFBBlockCipher(new BlowfishEngine(), 8), 64);
+    //     }
+    // }
+    //
+    // /**
+    //  * Twofish
+    //  */
+    // static public class Twofish_CFB8
+    //     extends JCEStreamCipher
+    // {
+    //     public Twofish_CFB8()
+    //     {
+    //         super(new CFBBlockCipher(new TwofishEngine(), 8), 128);
+    //     }
+    // }
+    //
+    // /**
+    //  * DES
+    //  */
+    // static public class DES_OFB8
+    //     extends JCEStreamCipher
+    // {
+    //     public DES_OFB8()
+    //     {
+    //         super(new OFBBlockCipher(new DESEngine(), 8), 64);
+    //     }
+    // }
+    //
+    // /**
+    //  * DESede
+    //  */
+    // static public class DESede_OFB8
+    //     extends JCEStreamCipher
+    // {
+    //     public DESede_OFB8()
+    //     {
+    //         super(new OFBBlockCipher(new DESedeEngine(), 8), 64);
+    //     }
+    // }
+    //
+    // /**
+    //  * SKIPJACK
+    //  */
+    // static public class Skipjack_OFB8
+    //     extends JCEStreamCipher
+    // {
+    //     public Skipjack_OFB8()
+    //     {
+    //         super(new OFBBlockCipher(new SkipjackEngine(), 8), 64);
+    //     }
+    // }
+    //
+    // /**
+    //  * Blowfish
+    //  */
+    // static public class Blowfish_OFB8
+    //     extends JCEStreamCipher
+    // {
+    //     public Blowfish_OFB8()
+    //     {
+    //         super(new OFBBlockCipher(new BlowfishEngine(), 8), 64);
+    //     }
+    // }
+    //
+    // /**
+    //  * Twofish
+    //  */
+    // static public class Twofish_OFB8
+    //     extends JCEStreamCipher
+    // {
+    //     public Twofish_OFB8()
+    //     {
+    //         super(new OFBBlockCipher(new TwofishEngine(), 8), 128);
+    //     }
+    // }
+    // END android-removed
 
     /**
      * RC4
@@ -517,7 +527,7 @@
             super(new RC4Engine(), 0);
         }
     }
-
+    
     /**
      * PBEWithSHAAnd40BitRC4
      */
@@ -529,64 +539,66 @@
             super(new RC4Engine(), 0);
         }
     }
-
-    /**
-     * Salsa20
-     */
-    static public class Salsa20
-        extends JCEStreamCipher
-    {
-        public Salsa20()
-        {
-            super(new Salsa20Engine(), 8);
-        }
-    }
-
-    /**
-     * HC-128
-     */
-    static public class HC128
-        extends JCEStreamCipher
-    {
-        public HC128()
-        {
-            super(new HC128Engine(), 16);
-        }
-    }
-
-    /**
-     * HC-256
-     */
-    static public class HC256
-        extends JCEStreamCipher
-    {
-        public HC256()
-        {
-            super(new HC256Engine(), 32);
-        }
-    }
-
-    /**
-     * VMPC
-     */
-    static public class VMPC
-        extends JCEStreamCipher
-    {
-        public VMPC()
-        {
-            super(new VMPCEngine(), 16);
-        }
-    }
-
-    /**
-     * VMPC-KSA3
-     */
-    static public class VMPCKSA3
-        extends JCEStreamCipher
-    {
-        public VMPCKSA3()
-        {
-            super(new VMPCKSA3Engine(), 16);
-        }
-    }
+    
+    // BEGIN android-removed
+    // /**
+    //  * Salsa20
+    //  */
+    // static public class Salsa20
+    //     extends JCEStreamCipher
+    // {
+    //     public Salsa20()
+    //     {
+    //         super(new Salsa20Engine(), 8);
+    //     }
+    // }
+    //
+    // /**
+    //  * HC-128
+    //  */
+    // static public class HC128
+    //     extends JCEStreamCipher
+    // {
+    //     public HC128()
+    //     {
+    //         super(new HC128Engine(), 16);
+    //     }
+    // }
+    //
+    // /**
+    //  * HC-256
+    //  */
+    // static public class HC256
+    //     extends JCEStreamCipher
+    // {
+    //     public HC256()
+    //     {
+    //         super(new HC256Engine(), 32);
+    //     }
+    // }
+    //
+    // /**
+    //  * VMPC
+    //  */
+    // static public class VMPC
+    //     extends JCEStreamCipher
+    // {
+    //     public VMPC()
+    //     {
+    //         super(new VMPCEngine(), 16);
+    //     }
+    // }
+    //
+    // /**
+    //  * VMPC-KSA3
+    //  */
+    // static public class VMPCKSA3
+    //     extends JCEStreamCipher
+    // {
+    //     public VMPCKSA3()
+    //     {
+    //         super(new VMPCKSA3Engine(), 16);
+    //     }
+    // }
+    // END android-removed
 }
diff -Naur bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/JDKAlgorithmParameterGenerator.java bcprov-jdk16-145/org/bouncycastle/jce/provider/JDKAlgorithmParameterGenerator.java
--- bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/JDKAlgorithmParameterGenerator.java	2010-01-11 21:46:14.000000000 +0000
+++ bcprov-jdk16-145/org/bouncycastle/jce/provider/JDKAlgorithmParameterGenerator.java	2011-09-01 17:21:06.000000000 +0000
@@ -2,19 +2,25 @@
 
 import org.bouncycastle.crypto.generators.DHParametersGenerator;
 import org.bouncycastle.crypto.generators.DSAParametersGenerator;
-import org.bouncycastle.crypto.generators.ElGamalParametersGenerator;
-import org.bouncycastle.crypto.generators.GOST3410ParametersGenerator;
+// BEGIN android-removed
+// import org.bouncycastle.crypto.generators.ElGamalParametersGenerator;
+// import org.bouncycastle.crypto.generators.GOST3410ParametersGenerator;
+// END android-removed
 import org.bouncycastle.crypto.params.DHParameters;
 import org.bouncycastle.crypto.params.DSAParameters;
-import org.bouncycastle.crypto.params.ElGamalParameters;
-import org.bouncycastle.crypto.params.GOST3410Parameters;
-import org.bouncycastle.jce.spec.GOST3410ParameterSpec;
-import org.bouncycastle.jce.spec.GOST3410PublicKeyParameterSetSpec;
+// BEGIN android-removed
+// import org.bouncycastle.crypto.params.ElGamalParameters;
+// import org.bouncycastle.crypto.params.GOST3410Parameters;
+// import org.bouncycastle.jce.spec.GOST3410ParameterSpec;
+// import org.bouncycastle.jce.spec.GOST3410PublicKeyParameterSetSpec;
+// END android-removed
 
 import javax.crypto.spec.DHGenParameterSpec;
 import javax.crypto.spec.DHParameterSpec;
 import javax.crypto.spec.IvParameterSpec;
-import javax.crypto.spec.RC2ParameterSpec;
+// BEGIN android-removed
+// import javax.crypto.spec.RC2ParameterSpec;
+// END android-removed
 import java.security.AlgorithmParameterGeneratorSpi;
 import java.security.AlgorithmParameters;
 import java.security.InvalidAlgorithmParameterException;
@@ -144,196 +150,198 @@
         }
     }
 
-    public static class GOST3410
-        extends JDKAlgorithmParameterGenerator
-    {
-        protected void engineInit(
-                AlgorithmParameterSpec  genParamSpec,
-                SecureRandom            random)
-        throws InvalidAlgorithmParameterException
-        {
-            throw new InvalidAlgorithmParameterException("No supported AlgorithmParameterSpec for GOST3410 parameter generation.");
-        }
-        
-        protected AlgorithmParameters engineGenerateParameters()
-        {
-            GOST3410ParametersGenerator pGen = new GOST3410ParametersGenerator();
-            
-            if (random != null)
-            {
-                pGen.init(strength, 2, random);
-            }
-            else
-            {
-                pGen.init(strength, 2, new SecureRandom());
-            }
-            
-            GOST3410Parameters p = pGen.generateParameters();
-            
-            AlgorithmParameters params;
-            
-            try
-            {
-                params = AlgorithmParameters.getInstance("GOST3410", "BC");
-                params.init(new GOST3410ParameterSpec(new GOST3410PublicKeyParameterSetSpec(p.getP(), p.getQ(), p.getA())));
-            }
-            catch (Exception e)
-            {
-                throw new RuntimeException(e.getMessage());
-            }
-            
-            return params;
-        }
-    }
-    
-    public static class ElGamal
-        extends JDKAlgorithmParameterGenerator
-    {
-        private int l = 0;
-        
-        protected void engineInit(
-            AlgorithmParameterSpec  genParamSpec,
-            SecureRandom            random)
-            throws InvalidAlgorithmParameterException
-        {
-            if (!(genParamSpec instanceof DHGenParameterSpec))
-            {
-                throw new InvalidAlgorithmParameterException("DH parameter generator requires a DHGenParameterSpec for initialisation");
-            }
-            DHGenParameterSpec  spec = (DHGenParameterSpec)genParamSpec;
-
-            this.strength = spec.getPrimeSize();
-            this.l = spec.getExponentSize();
-            this.random = random;
-        }
-
-        protected AlgorithmParameters engineGenerateParameters()
-        {
-            ElGamalParametersGenerator pGen = new ElGamalParametersGenerator();
-
-            if (random != null)
-            {
-                pGen.init(strength, 20, random);
-            }
-            else
-            {
-                pGen.init(strength, 20, new SecureRandom());
-            }
-
-            ElGamalParameters p = pGen.generateParameters();
-
-            AlgorithmParameters params;
-
-            try
-            {
-                params = AlgorithmParameters.getInstance("ElGamal", "BC");
-                params.init(new DHParameterSpec(p.getP(), p.getG(), l));
-            }
-            catch (Exception e)
-            {
-                throw new RuntimeException(e.getMessage());
-            }
-
-            return params;
-        }
-    }
-
-    public static class DES
-        extends JDKAlgorithmParameterGenerator
-    {
-        protected void engineInit(
-            AlgorithmParameterSpec  genParamSpec,
-            SecureRandom            random)
-            throws InvalidAlgorithmParameterException
-        {
-            throw new InvalidAlgorithmParameterException("No supported AlgorithmParameterSpec for DES parameter generation.");
-        }
-
-        protected AlgorithmParameters engineGenerateParameters()
-        {
-            byte[]  iv = new byte[8];
-
-            if (random == null)
-            {
-                random = new SecureRandom();
-            }
-
-            random.nextBytes(iv);
-
-            AlgorithmParameters params;
-
-            try
-            {
-                params = AlgorithmParameters.getInstance("DES", "BC");
-                params.init(new IvParameterSpec(iv));
-            }
-            catch (Exception e)
-            {
-                throw new RuntimeException(e.getMessage());
-            }
-
-            return params;
-        }
-    }
-
-    public static class RC2
-        extends JDKAlgorithmParameterGenerator
-    {
-        RC2ParameterSpec    spec = null;
-
-        protected void engineInit(
-            AlgorithmParameterSpec  genParamSpec,
-            SecureRandom            random)
-            throws InvalidAlgorithmParameterException
-        {
-            if (genParamSpec instanceof RC2ParameterSpec)
-            {
-                spec = (RC2ParameterSpec)genParamSpec;
-                return;
-            }
-
-            throw new InvalidAlgorithmParameterException("No supported AlgorithmParameterSpec for RC2 parameter generation.");
-        }
-
-        protected AlgorithmParameters engineGenerateParameters()
-        {
-            AlgorithmParameters params;
-
-            if (spec == null)
-            {
-                byte[]  iv = new byte[8];
-
-                if (random == null)
-                {
-                    random = new SecureRandom();
-                }
-
-                random.nextBytes(iv);
-
-                try
-                {
-                    params = AlgorithmParameters.getInstance("RC2", "BC");
-                    params.init(new IvParameterSpec(iv));
-                }
-                catch (Exception e)
-                {
-                    throw new RuntimeException(e.getMessage());
-                }
-            }
-            else
-            {
-                try
-                {
-                    params = AlgorithmParameters.getInstance("RC2", "BC");
-                    params.init(spec);
-                }
-                catch (Exception e)
-                {
-                    throw new RuntimeException(e.getMessage());
-                }
-            }
-
-            return params;
-        }
-    }
+   // BEGIN android-removed
+   // public static class GOST3410
+   //     extends JDKAlgorithmParameterGenerator
+   // {
+   //     protected void engineInit(
+   //             AlgorithmParameterSpec  genParamSpec,
+   //             SecureRandom            random)
+   //     throws InvalidAlgorithmParameterException
+   //     {
+   //         throw new InvalidAlgorithmParameterException("No supported AlgorithmParameterSpec for GOST3410 parameter generation.");
+   //     }
+   //       
+   //     protected AlgorithmParameters engineGenerateParameters()
+   //     {
+   //         GOST3410ParametersGenerator pGen = new GOST3410ParametersGenerator();
+   //           
+   //         if (random != null)
+   //         {
+   //             pGen.init(strength, 2, random);
+   //         }
+   //         else
+   //         {
+   //             pGen.init(strength, 2, new SecureRandom());
+   //         }
+   //           
+   //         GOST3410Parameters p = pGen.generateParameters();
+   //           
+   //         AlgorithmParameters params;
+   //           
+   //         try
+   //         {
+   //             params = AlgorithmParameters.getInstance("GOST3410", "BC");
+   //             params.init(new GOST3410ParameterSpec(new GOST3410PublicKeyParameterSetSpec(p.getP(), p.getQ(), p.getA())));
+   //         }
+   //         catch (Exception e)
+   //         {
+   //             throw new RuntimeException(e.getMessage());
+   //         }
+   //           
+   //         return params;
+   //     }
+   // }
+   //   
+   // public static class ElGamal
+   //     extends JDKAlgorithmParameterGenerator
+   // {
+   //     private int l = 0;
+   //       
+   //     protected void engineInit(
+   //         AlgorithmParameterSpec  genParamSpec,
+   //         SecureRandom            random)
+   //         throws InvalidAlgorithmParameterException
+   //     {
+   //         if (!(genParamSpec instanceof DHGenParameterSpec))
+   //         {
+   //             throw new InvalidAlgorithmParameterException("DH parameter generator requires a DHGenParameterSpec for initialisation");
+   //         }
+   //         DHGenParameterSpec  spec = (DHGenParameterSpec)genParamSpec;
+   //
+   //         this.strength = spec.getPrimeSize();
+   //         this.l = spec.getExponentSize();
+   //         this.random = random;
+   //     }
+   //
+   //     protected AlgorithmParameters engineGenerateParameters()
+   //     {
+   //         ElGamalParametersGenerator pGen = new ElGamalParametersGenerator();
+   //
+   //         if (random != null)
+   //         {
+   //             pGen.init(strength, 20, random);
+   //         }
+   //         else
+   //         {
+   //             pGen.init(strength, 20, new SecureRandom());
+   //         }
+   //
+   //         ElGamalParameters p = pGen.generateParameters();
+   //
+   //         AlgorithmParameters params;
+   //
+   //         try
+   //         {
+   //             params = AlgorithmParameters.getInstance("ElGamal", "BC");
+   //             params.init(new DHParameterSpec(p.getP(), p.getG(), l));
+   //         }
+   //         catch (Exception e)
+   //         {
+   //             throw new RuntimeException(e.getMessage());
+   //         }
+   //
+   //         return params;
+   //     }
+   // }
+   //
+   //  public static class DES
+   //      extends JDKAlgorithmParameterGenerator
+   //  {
+   //      protected void engineInit(
+   //          AlgorithmParameterSpec  genParamSpec,
+   //          SecureRandom            random)
+   //          throws InvalidAlgorithmParameterException
+   //      {
+   //          throw new InvalidAlgorithmParameterException("No supported AlgorithmParameterSpec for DES parameter generation.");
+   //      }
+   //
+   //      protected AlgorithmParameters engineGenerateParameters()
+   //      {
+   //          byte[]  iv = new byte[8];
+   //
+   //          if (random == null)
+   //          {
+   //              random = new SecureRandom();
+   //          }
+   //
+   //          random.nextBytes(iv);
+   //
+   //          AlgorithmParameters params;
+   //
+   //          try
+   //          {
+   //              params = AlgorithmParameters.getInstance("DES", "BC");
+   //              params.init(new IvParameterSpec(iv));
+   //          }
+   //          catch (Exception e)
+   //          {
+   //              throw new RuntimeException(e.getMessage());
+   //          }
+   //
+   //          return params;
+   //      }
+   //  }
+   //
+   //  public static class RC2
+   //      extends JDKAlgorithmParameterGenerator
+   //  {
+   //      RC2ParameterSpec    spec = null;
+   //
+   //      protected void engineInit(
+   //          AlgorithmParameterSpec  genParamSpec,
+   //          SecureRandom            random)
+   //          throws InvalidAlgorithmParameterException
+   //      {
+   //          if (genParamSpec instanceof RC2ParameterSpec)
+   //          {
+   //              spec = (RC2ParameterSpec)genParamSpec;
+   //              return;
+   //          }
+   //
+   //          throw new InvalidAlgorithmParameterException("No supported AlgorithmParameterSpec for RC2 parameter generation.");
+   //      }
+   //
+   //      protected AlgorithmParameters engineGenerateParameters()
+   //      {
+   //          AlgorithmParameters params;
+   //
+   //          if (spec == null)
+   //          {
+   //              byte[]  iv = new byte[8];
+   //
+   //              if (random == null)
+   //              {
+   //                  random = new SecureRandom();
+   //              }
+   //
+   //              random.nextBytes(iv);
+   //
+   //              try
+   //              {
+   //                  params = AlgorithmParameters.getInstance("RC2", "BC");
+   //                  params.init(new IvParameterSpec(iv));
+   //              }
+   //              catch (Exception e)
+   //              {
+   //                  throw new RuntimeException(e.getMessage());
+   //              }
+   //          }
+   //          else
+   //          {
+   //              try
+   //              {
+   //                  params = AlgorithmParameters.getInstance("RC2", "BC");
+   //                  params.init(spec);
+   //              }
+   //              catch (Exception e)
+   //              {
+   //                  throw new RuntimeException(e.getMessage());
+   //              }
+   //          }
+   //
+   //          return params;
+   //      }
+   //  }
+   // END android-removed
 }
diff -Naur bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/JDKAlgorithmParameters.java bcprov-jdk16-145/org/bouncycastle/jce/provider/JDKAlgorithmParameters.java
--- bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/JDKAlgorithmParameters.java	2010-01-11 21:46:14.000000000 +0000
+++ bcprov-jdk16-145/org/bouncycastle/jce/provider/JDKAlgorithmParameters.java	2011-09-01 17:21:06.000000000 +0000
@@ -10,21 +10,27 @@
 import org.bouncycastle.asn1.DERObjectIdentifier;
 import org.bouncycastle.asn1.DEROctetString;
 import org.bouncycastle.asn1.DERSequence;
-import org.bouncycastle.asn1.cryptopro.GOST3410PublicKeyAlgParameters;
-import org.bouncycastle.asn1.oiw.ElGamalParameter;
+// BEGIN android-removed
+// import org.bouncycastle.asn1.cryptopro.GOST3410PublicKeyAlgParameters;
+// import org.bouncycastle.asn1.oiw.ElGamalParameter;
+// END android-removed
 import org.bouncycastle.asn1.pkcs.DHParameter;
 import org.bouncycastle.asn1.pkcs.PKCS12PBEParams;
 import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
-import org.bouncycastle.asn1.pkcs.RC2CBCParameter;
+// BEGIN android-removed
+// import org.bouncycastle.asn1.pkcs.RC2CBCParameter;
+// END android-removed
 import org.bouncycastle.asn1.pkcs.RSAESOAEPparams;
 import org.bouncycastle.asn1.pkcs.RSASSAPSSparams;
 import org.bouncycastle.asn1.pkcs.PBKDF2Params;
 import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
 import org.bouncycastle.asn1.x509.DSAParameter;
-import org.bouncycastle.jce.spec.ElGamalParameterSpec;
-import org.bouncycastle.jce.spec.GOST3410ParameterSpec;
-import org.bouncycastle.jce.spec.GOST3410PublicKeyParameterSetSpec;
-import org.bouncycastle.jce.spec.IESParameterSpec;
+// BEGIN android-removed
+// import org.bouncycastle.jce.spec.ElGamalParameterSpec;
+// import org.bouncycastle.jce.spec.GOST3410ParameterSpec;
+// import org.bouncycastle.jce.spec.GOST3410PublicKeyParameterSetSpec;
+// import org.bouncycastle.jce.spec.IESParameterSpec;
+// END android-removed
 import org.bouncycastle.util.Arrays;
 
 import javax.crypto.spec.DHParameterSpec;
@@ -32,7 +38,9 @@
 import javax.crypto.spec.OAEPParameterSpec;
 import javax.crypto.spec.PBEParameterSpec;
 import javax.crypto.spec.PSource;
-import javax.crypto.spec.RC2ParameterSpec;
+// BEGIN android-removed
+// import javax.crypto.spec.RC2ParameterSpec;
+// END android-removed
 import java.io.IOException;
 import java.security.AlgorithmParametersSpi;
 import java.security.spec.AlgorithmParameterSpec;
@@ -68,13 +76,13 @@
         extends JDKAlgorithmParameters
     {
         private byte[]  iv;
-
+    
         protected byte[] engineGetEncoded() 
             throws IOException
         {
             return engineGetEncoded("ASN.1");
         }
-
+    
         protected byte[] engineGetEncoded(
             String format) 
             throws IOException
@@ -83,15 +91,15 @@
             {
                  return new DEROctetString(engineGetEncoded("RAW")).getEncoded();
             }
-            
+    
             if (format.equals("RAW"))
             {
                 return Arrays.clone(iv);
             }
-
+    
             return null;
         }
-
+    
         protected AlgorithmParameterSpec localEngineGetParameterSpec(
             Class paramSpec) 
             throws InvalidParameterSpecException
@@ -100,10 +108,10 @@
             {
                 return new IvParameterSpec(iv);
             }
-
+    
             throw new InvalidParameterSpecException("unknown parameter spec passed to IV parameters object.");
         }
-
+    
         protected void engineInit(
             AlgorithmParameterSpec paramSpec) 
             throws InvalidParameterSpecException
@@ -112,10 +120,10 @@
             {
                 throw new InvalidParameterSpecException("IvParameterSpec required to initialise a IV parameters algorithm parameters object");
             }
-
+    
             this.iv = ((IvParameterSpec)paramSpec).getIV();
         }
-
+    
         protected void engineInit(
             byte[] params) 
             throws IOException
@@ -127,13 +135,13 @@
                     && params[0] == 0x04 && params[1] == params.length - 2)
             {
                 ASN1OctetString oct = (ASN1OctetString)ASN1Object.fromByteArray(params);
-
+    
                 params = oct.getOctets();
             }
-
+    
             this.iv = Arrays.clone(params);
         }
-
+    
         protected void engineInit(
             byte[] params,
             String format) 
@@ -144,204 +152,206 @@
                 try
                 {
                     ASN1OctetString oct = (ASN1OctetString)ASN1Object.fromByteArray(params);
-
+    
                     engineInit(oct.getOctets());
                 }
                 catch (Exception e)
                 {
                     throw new IOException("Exception decoding: " + e);
                 }
-                
+    
                 return;
             }
-
+    
             if (format.equals("RAW"))
             {
                 engineInit(params);
                 return;
             }
-
+    
             throw new IOException("Unknown parameters format in IV parameters object");
         }
-
+    
         protected String engineToString() 
         {
             return "IV Parameters";
         }
     }
-
-    public static class RC2AlgorithmParameters
-        extends JDKAlgorithmParameters
-    {
-        private static final short[] table = {
-           0xbd, 0x56, 0xea, 0xf2, 0xa2, 0xf1, 0xac, 0x2a, 0xb0, 0x93, 0xd1, 0x9c, 0x1b, 0x33, 0xfd, 0xd0,
-           0x30, 0x04, 0xb6, 0xdc, 0x7d, 0xdf, 0x32, 0x4b, 0xf7, 0xcb, 0x45, 0x9b, 0x31, 0xbb, 0x21, 0x5a,
-           0x41, 0x9f, 0xe1, 0xd9, 0x4a, 0x4d, 0x9e, 0xda, 0xa0, 0x68, 0x2c, 0xc3, 0x27, 0x5f, 0x80, 0x36,
-           0x3e, 0xee, 0xfb, 0x95, 0x1a, 0xfe, 0xce, 0xa8, 0x34, 0xa9, 0x13, 0xf0, 0xa6, 0x3f, 0xd8, 0x0c,
-           0x78, 0x24, 0xaf, 0x23, 0x52, 0xc1, 0x67, 0x17, 0xf5, 0x66, 0x90, 0xe7, 0xe8, 0x07, 0xb8, 0x60,
-           0x48, 0xe6, 0x1e, 0x53, 0xf3, 0x92, 0xa4, 0x72, 0x8c, 0x08, 0x15, 0x6e, 0x86, 0x00, 0x84, 0xfa,
-           0xf4, 0x7f, 0x8a, 0x42, 0x19, 0xf6, 0xdb, 0xcd, 0x14, 0x8d, 0x50, 0x12, 0xba, 0x3c, 0x06, 0x4e,
-           0xec, 0xb3, 0x35, 0x11, 0xa1, 0x88, 0x8e, 0x2b, 0x94, 0x99, 0xb7, 0x71, 0x74, 0xd3, 0xe4, 0xbf,
-           0x3a, 0xde, 0x96, 0x0e, 0xbc, 0x0a, 0xed, 0x77, 0xfc, 0x37, 0x6b, 0x03, 0x79, 0x89, 0x62, 0xc6,
-           0xd7, 0xc0, 0xd2, 0x7c, 0x6a, 0x8b, 0x22, 0xa3, 0x5b, 0x05, 0x5d, 0x02, 0x75, 0xd5, 0x61, 0xe3,
-           0x18, 0x8f, 0x55, 0x51, 0xad, 0x1f, 0x0b, 0x5e, 0x85, 0xe5, 0xc2, 0x57, 0x63, 0xca, 0x3d, 0x6c,
-           0xb4, 0xc5, 0xcc, 0x70, 0xb2, 0x91, 0x59, 0x0d, 0x47, 0x20, 0xc8, 0x4f, 0x58, 0xe0, 0x01, 0xe2,
-           0x16, 0x38, 0xc4, 0x6f, 0x3b, 0x0f, 0x65, 0x46, 0xbe, 0x7e, 0x2d, 0x7b, 0x82, 0xf9, 0x40, 0xb5,
-           0x1d, 0x73, 0xf8, 0xeb, 0x26, 0xc7, 0x87, 0x97, 0x25, 0x54, 0xb1, 0x28, 0xaa, 0x98, 0x9d, 0xa5,
-           0x64, 0x6d, 0x7a, 0xd4, 0x10, 0x81, 0x44, 0xef, 0x49, 0xd6, 0xae, 0x2e, 0xdd, 0x76, 0x5c, 0x2f,
-           0xa7, 0x1c, 0xc9, 0x09, 0x69, 0x9a, 0x83, 0xcf, 0x29, 0x39, 0xb9, 0xe9, 0x4c, 0xff, 0x43, 0xab
-        };
-
-        private static final short[] ekb = {
-           0x5d, 0xbe, 0x9b, 0x8b, 0x11, 0x99, 0x6e, 0x4d, 0x59, 0xf3, 0x85, 0xa6, 0x3f, 0xb7, 0x83, 0xc5,
-           0xe4, 0x73, 0x6b, 0x3a, 0x68, 0x5a, 0xc0, 0x47, 0xa0, 0x64, 0x34, 0x0c, 0xf1, 0xd0, 0x52, 0xa5,
-           0xb9, 0x1e, 0x96, 0x43, 0x41, 0xd8, 0xd4, 0x2c, 0xdb, 0xf8, 0x07, 0x77, 0x2a, 0xca, 0xeb, 0xef,
-           0x10, 0x1c, 0x16, 0x0d, 0x38, 0x72, 0x2f, 0x89, 0xc1, 0xf9, 0x80, 0xc4, 0x6d, 0xae, 0x30, 0x3d,
-           0xce, 0x20, 0x63, 0xfe, 0xe6, 0x1a, 0xc7, 0xb8, 0x50, 0xe8, 0x24, 0x17, 0xfc, 0x25, 0x6f, 0xbb,
-           0x6a, 0xa3, 0x44, 0x53, 0xd9, 0xa2, 0x01, 0xab, 0xbc, 0xb6, 0x1f, 0x98, 0xee, 0x9a, 0xa7, 0x2d,
-           0x4f, 0x9e, 0x8e, 0xac, 0xe0, 0xc6, 0x49, 0x46, 0x29, 0xf4, 0x94, 0x8a, 0xaf, 0xe1, 0x5b, 0xc3,
-           0xb3, 0x7b, 0x57, 0xd1, 0x7c, 0x9c, 0xed, 0x87, 0x40, 0x8c, 0xe2, 0xcb, 0x93, 0x14, 0xc9, 0x61,
-           0x2e, 0xe5, 0xcc, 0xf6, 0x5e, 0xa8, 0x5c, 0xd6, 0x75, 0x8d, 0x62, 0x95, 0x58, 0x69, 0x76, 0xa1,
-           0x4a, 0xb5, 0x55, 0x09, 0x78, 0x33, 0x82, 0xd7, 0xdd, 0x79, 0xf5, 0x1b, 0x0b, 0xde, 0x26, 0x21,
-           0x28, 0x74, 0x04, 0x97, 0x56, 0xdf, 0x3c, 0xf0, 0x37, 0x39, 0xdc, 0xff, 0x06, 0xa4, 0xea, 0x42,
-           0x08, 0xda, 0xb4, 0x71, 0xb0, 0xcf, 0x12, 0x7a, 0x4e, 0xfa, 0x6c, 0x1d, 0x84, 0x00, 0xc8, 0x7f,
-           0x91, 0x45, 0xaa, 0x2b, 0xc2, 0xb1, 0x8f, 0xd5, 0xba, 0xf2, 0xad, 0x19, 0xb2, 0x67, 0x36, 0xf7,
-           0x0f, 0x0a, 0x92, 0x7d, 0xe3, 0x9d, 0xe9, 0x90, 0x3e, 0x23, 0x27, 0x66, 0x13, 0xec, 0x81, 0x15,
-           0xbd, 0x22, 0xbf, 0x9f, 0x7e, 0xa9, 0x51, 0x4b, 0x4c, 0xfb, 0x02, 0xd3, 0x70, 0x86, 0x31, 0xe7,
-           0x3b, 0x05, 0x03, 0x54, 0x60, 0x48, 0x65, 0x18, 0xd2, 0xcd, 0x5f, 0x32, 0x88, 0x0e, 0x35, 0xfd
-        };
-
-        private byte[]  iv;
-        private int     parameterVersion = 58;
-
-        protected byte[] engineGetEncoded() 
-        {
-            return Arrays.clone(iv);
-        }
-
-        protected byte[] engineGetEncoded(
-            String format) 
-            throws IOException
-        {
-            if (isASN1FormatString(format))
-            {
-                if (parameterVersion == -1)
-                {
-                    return new RC2CBCParameter(engineGetEncoded()).getEncoded();
-                }
-                else
-                {
-                    return new RC2CBCParameter(parameterVersion, engineGetEncoded()).getEncoded();
-                }
-            }
-
-            if (format.equals("RAW"))
-            {
-                return engineGetEncoded();
-            }
-
-            return null;
-        }
-
-        protected AlgorithmParameterSpec localEngineGetParameterSpec(
-            Class paramSpec) 
-            throws InvalidParameterSpecException
-        {
-            if (paramSpec == RC2ParameterSpec.class)
-            {
-                if (parameterVersion != -1)
-                {
-                    if (parameterVersion < 256)
-                    {
-                        return new RC2ParameterSpec(ekb[parameterVersion], iv);
-                    }
-                    else
-                    {
-                        return new RC2ParameterSpec(parameterVersion, iv);
-                    }
-                }
-            }
-
-            if (paramSpec == IvParameterSpec.class)
-            {
-                return new IvParameterSpec(iv);
-            }
-
-            throw new InvalidParameterSpecException("unknown parameter spec passed to RC2 parameters object.");
-        }
-
-        protected void engineInit(
-            AlgorithmParameterSpec paramSpec) 
-            throws InvalidParameterSpecException
-        {
-            if (paramSpec instanceof IvParameterSpec)
-            {
-                this.iv = ((IvParameterSpec)paramSpec).getIV();
-            }
-            else if (paramSpec instanceof RC2ParameterSpec)
-            {
-                int effKeyBits = ((RC2ParameterSpec)paramSpec).getEffectiveKeyBits();
-                if (effKeyBits != -1)
-                {
-                    if (effKeyBits < 256)
-                    {
-                        parameterVersion = table[effKeyBits];
-                    }
-                    else
-                    {
-                        parameterVersion = effKeyBits;
-                    }
-                }
-
-                this.iv = ((RC2ParameterSpec)paramSpec).getIV();
-            }
-            else
-            {
-                throw new InvalidParameterSpecException("IvParameterSpec or RC2ParameterSpec required to initialise a RC2 parameters algorithm parameters object");
-            }
-        }
-
-        protected void engineInit(
-            byte[] params) 
-            throws IOException
-        {
-            this.iv = Arrays.clone(params);
-        }
-
-        protected void engineInit(
-            byte[] params,
-            String format) 
-            throws IOException
-        {
-            if (isASN1FormatString(format))
-            {
-                RC2CBCParameter p = RC2CBCParameter.getInstance(ASN1Object.fromByteArray(params));
-
-                if (p.getRC2ParameterVersion() != null)
-                {
-                    parameterVersion = p.getRC2ParameterVersion().intValue();
-                }
-
-                iv = p.getIV();
-
-                return;
-            }
-
-            if (format.equals("RAW"))
-            {
-                engineInit(params);
-                return;
-            }
-
-            throw new IOException("Unknown parameters format in IV parameters object");
-        }
-
-        protected String engineToString() 
-        {
-            return "RC2 Parameters";
-        }
-    }
-
+    
+    // BEGIN android-removed
+    // public static class RC2AlgorithmParameters
+    //     extends JDKAlgorithmParameters
+    // {
+    //     private static final short[] table = {
+    //        0xbd, 0x56, 0xea, 0xf2, 0xa2, 0xf1, 0xac, 0x2a, 0xb0, 0x93, 0xd1, 0x9c, 0x1b, 0x33, 0xfd, 0xd0,
+    //        0x30, 0x04, 0xb6, 0xdc, 0x7d, 0xdf, 0x32, 0x4b, 0xf7, 0xcb, 0x45, 0x9b, 0x31, 0xbb, 0x21, 0x5a,
+    //        0x41, 0x9f, 0xe1, 0xd9, 0x4a, 0x4d, 0x9e, 0xda, 0xa0, 0x68, 0x2c, 0xc3, 0x27, 0x5f, 0x80, 0x36,
+    //        0x3e, 0xee, 0xfb, 0x95, 0x1a, 0xfe, 0xce, 0xa8, 0x34, 0xa9, 0x13, 0xf0, 0xa6, 0x3f, 0xd8, 0x0c,
+    //        0x78, 0x24, 0xaf, 0x23, 0x52, 0xc1, 0x67, 0x17, 0xf5, 0x66, 0x90, 0xe7, 0xe8, 0x07, 0xb8, 0x60,
+    //        0x48, 0xe6, 0x1e, 0x53, 0xf3, 0x92, 0xa4, 0x72, 0x8c, 0x08, 0x15, 0x6e, 0x86, 0x00, 0x84, 0xfa,
+    //        0xf4, 0x7f, 0x8a, 0x42, 0x19, 0xf6, 0xdb, 0xcd, 0x14, 0x8d, 0x50, 0x12, 0xba, 0x3c, 0x06, 0x4e,
+    //        0xec, 0xb3, 0x35, 0x11, 0xa1, 0x88, 0x8e, 0x2b, 0x94, 0x99, 0xb7, 0x71, 0x74, 0xd3, 0xe4, 0xbf,
+    //        0x3a, 0xde, 0x96, 0x0e, 0xbc, 0x0a, 0xed, 0x77, 0xfc, 0x37, 0x6b, 0x03, 0x79, 0x89, 0x62, 0xc6,
+    //        0xd7, 0xc0, 0xd2, 0x7c, 0x6a, 0x8b, 0x22, 0xa3, 0x5b, 0x05, 0x5d, 0x02, 0x75, 0xd5, 0x61, 0xe3,
+    //        0x18, 0x8f, 0x55, 0x51, 0xad, 0x1f, 0x0b, 0x5e, 0x85, 0xe5, 0xc2, 0x57, 0x63, 0xca, 0x3d, 0x6c,
+    //        0xb4, 0xc5, 0xcc, 0x70, 0xb2, 0x91, 0x59, 0x0d, 0x47, 0x20, 0xc8, 0x4f, 0x58, 0xe0, 0x01, 0xe2,
+    //        0x16, 0x38, 0xc4, 0x6f, 0x3b, 0x0f, 0x65, 0x46, 0xbe, 0x7e, 0x2d, 0x7b, 0x82, 0xf9, 0x40, 0xb5,
+    //        0x1d, 0x73, 0xf8, 0xeb, 0x26, 0xc7, 0x87, 0x97, 0x25, 0x54, 0xb1, 0x28, 0xaa, 0x98, 0x9d, 0xa5,
+    //        0x64, 0x6d, 0x7a, 0xd4, 0x10, 0x81, 0x44, 0xef, 0x49, 0xd6, 0xae, 0x2e, 0xdd, 0x76, 0x5c, 0x2f,
+    //        0xa7, 0x1c, 0xc9, 0x09, 0x69, 0x9a, 0x83, 0xcf, 0x29, 0x39, 0xb9, 0xe9, 0x4c, 0xff, 0x43, 0xab
+    //     };
+    //
+    //     private static final short[] ekb = {
+    //        0x5d, 0xbe, 0x9b, 0x8b, 0x11, 0x99, 0x6e, 0x4d, 0x59, 0xf3, 0x85, 0xa6, 0x3f, 0xb7, 0x83, 0xc5,
+    //        0xe4, 0x73, 0x6b, 0x3a, 0x68, 0x5a, 0xc0, 0x47, 0xa0, 0x64, 0x34, 0x0c, 0xf1, 0xd0, 0x52, 0xa5,
+    //        0xb9, 0x1e, 0x96, 0x43, 0x41, 0xd8, 0xd4, 0x2c, 0xdb, 0xf8, 0x07, 0x77, 0x2a, 0xca, 0xeb, 0xef,
+    //        0x10, 0x1c, 0x16, 0x0d, 0x38, 0x72, 0x2f, 0x89, 0xc1, 0xf9, 0x80, 0xc4, 0x6d, 0xae, 0x30, 0x3d,
+    //        0xce, 0x20, 0x63, 0xfe, 0xe6, 0x1a, 0xc7, 0xb8, 0x50, 0xe8, 0x24, 0x17, 0xfc, 0x25, 0x6f, 0xbb,
+    //        0x6a, 0xa3, 0x44, 0x53, 0xd9, 0xa2, 0x01, 0xab, 0xbc, 0xb6, 0x1f, 0x98, 0xee, 0x9a, 0xa7, 0x2d,
+    //        0x4f, 0x9e, 0x8e, 0xac, 0xe0, 0xc6, 0x49, 0x46, 0x29, 0xf4, 0x94, 0x8a, 0xaf, 0xe1, 0x5b, 0xc3,
+    //        0xb3, 0x7b, 0x57, 0xd1, 0x7c, 0x9c, 0xed, 0x87, 0x40, 0x8c, 0xe2, 0xcb, 0x93, 0x14, 0xc9, 0x61,
+    //        0x2e, 0xe5, 0xcc, 0xf6, 0x5e, 0xa8, 0x5c, 0xd6, 0x75, 0x8d, 0x62, 0x95, 0x58, 0x69, 0x76, 0xa1,
+    //        0x4a, 0xb5, 0x55, 0x09, 0x78, 0x33, 0x82, 0xd7, 0xdd, 0x79, 0xf5, 0x1b, 0x0b, 0xde, 0x26, 0x21,
+    //        0x28, 0x74, 0x04, 0x97, 0x56, 0xdf, 0x3c, 0xf0, 0x37, 0x39, 0xdc, 0xff, 0x06, 0xa4, 0xea, 0x42,
+    //        0x08, 0xda, 0xb4, 0x71, 0xb0, 0xcf, 0x12, 0x7a, 0x4e, 0xfa, 0x6c, 0x1d, 0x84, 0x00, 0xc8, 0x7f,
+    //        0x91, 0x45, 0xaa, 0x2b, 0xc2, 0xb1, 0x8f, 0xd5, 0xba, 0xf2, 0xad, 0x19, 0xb2, 0x67, 0x36, 0xf7,
+    //        0x0f, 0x0a, 0x92, 0x7d, 0xe3, 0x9d, 0xe9, 0x90, 0x3e, 0x23, 0x27, 0x66, 0x13, 0xec, 0x81, 0x15,
+    //        0xbd, 0x22, 0xbf, 0x9f, 0x7e, 0xa9, 0x51, 0x4b, 0x4c, 0xfb, 0x02, 0xd3, 0x70, 0x86, 0x31, 0xe7,
+    //        0x3b, 0x05, 0x03, 0x54, 0x60, 0x48, 0x65, 0x18, 0xd2, 0xcd, 0x5f, 0x32, 0x88, 0x0e, 0x35, 0xfd
+    //     };
+    //
+    //     private byte[]  iv;
+    //     private int     parameterVersion = 58;
+    //
+    //     protected byte[] engineGetEncoded() 
+    //     {
+    //         return Arrays.clone(iv);
+    //     }
+    //
+    //     protected byte[] engineGetEncoded(
+    //         String format) 
+    //         throws IOException
+    //     {
+    //         if (isASN1FormatString(format))
+    //         {
+    //             if (parameterVersion == -1)
+    //             {
+    //                 return new RC2CBCParameter(engineGetEncoded()).getEncoded();
+    //             }
+    //             else
+    //             {
+    //                 return new RC2CBCParameter(parameterVersion, engineGetEncoded()).getEncoded();
+    //             }
+    //         }
+    //
+    //         if (format.equals("RAW"))
+    //         {
+    //             return engineGetEncoded();
+    //         }
+    //
+    //         return null;
+    //     }
+    //
+    //     protected AlgorithmParameterSpec localEngineGetParameterSpec(
+    //         Class paramSpec) 
+    //         throws InvalidParameterSpecException
+    //     {
+    //         if (paramSpec == RC2ParameterSpec.class)
+    //         {
+    //             if (parameterVersion != -1)
+    //             {
+    //                 if (parameterVersion < 256)
+    //                 {
+    //                     return new RC2ParameterSpec(ekb[parameterVersion], iv);
+    //                 }
+    //                 else
+    //                 {
+    //                     return new RC2ParameterSpec(parameterVersion, iv);
+    //                 }
+    //             }
+    //         }
+    //
+    //         if (paramSpec == IvParameterSpec.class)
+    //         {
+    //             return new IvParameterSpec(iv);
+    //         }
+    //
+    //         throw new InvalidParameterSpecException("unknown parameter spec passed to RC2 parameters object.");
+    //     }
+    //
+    //     protected void engineInit(
+    //         AlgorithmParameterSpec paramSpec) 
+    //         throws InvalidParameterSpecException
+    //     {
+    //         if (paramSpec instanceof IvParameterSpec)
+    //         {
+    //             this.iv = ((IvParameterSpec)paramSpec).getIV();
+    //         }
+    //         else if (paramSpec instanceof RC2ParameterSpec)
+    //         {
+    //             int effKeyBits = ((RC2ParameterSpec)paramSpec).getEffectiveKeyBits();
+    //             if (effKeyBits != -1)
+    //             {
+    //                 if (effKeyBits < 256)
+    //                 {
+    //                     parameterVersion = table[effKeyBits];
+    //                 }
+    //                 else
+    //                 {
+    //                     parameterVersion = effKeyBits;
+    //                 }
+    //             }
+    //
+    //             this.iv = ((RC2ParameterSpec)paramSpec).getIV();
+    //         }
+    //         else
+    //         {
+    //             throw new InvalidParameterSpecException("IvParameterSpec or RC2ParameterSpec required to initialise a RC2 parameters algorithm parameters object");
+    //         }
+    //     }
+    //
+    //     protected void engineInit(
+    //         byte[] params) 
+    //         throws IOException
+    //     {
+    //         this.iv = Arrays.clone(params);
+    //     }
+    //
+    //     protected void engineInit(
+    //         byte[] params,
+    //         String format) 
+    //         throws IOException
+    //     {
+    //         if (isASN1FormatString(format))
+    //         {
+    //             RC2CBCParameter p = RC2CBCParameter.getInstance(ASN1Object.fromByteArray(params));
+    //
+    //             if (p.getRC2ParameterVersion() != null)
+    //             {
+    //                 parameterVersion = p.getRC2ParameterVersion().intValue();
+    //             }
+    //
+    //             iv = p.getIV();
+    //
+    //             return;
+    //         }
+    //
+    //         if (format.equals("RAW"))
+    //         {
+    //             engineInit(params);
+    //             return;
+    //         }
+    //
+    //         throw new IOException("Unknown parameters format in IV parameters object");
+    //     }
+    //
+    //     protected String engineToString() 
+    //     {
+    //         return "RC2 Parameters";
+    //     }
+    // }
+    // END android-removed
+    
     public static class PBKDF2
         extends JDKAlgorithmParameters
     {
@@ -429,7 +439,7 @@
         extends JDKAlgorithmParameters
     {
         PKCS12PBEParams params;
-
+    
         protected byte[] engineGetEncoded() 
         {
             try
@@ -441,7 +451,7 @@
                 throw new RuntimeException("Oooops! " + e.toString());
             }
         }
-
+    
         protected byte[] engineGetEncoded(
             String format) 
         {
@@ -449,10 +459,10 @@
             {
                 return engineGetEncoded();
             }
-
+    
             return null;
         }
-
+    
         protected AlgorithmParameterSpec localEngineGetParameterSpec(
             Class paramSpec) 
             throws InvalidParameterSpecException
@@ -462,10 +472,10 @@
                 return new PBEParameterSpec(params.getIV(),
                                 params.getIterations().intValue());
             }
-
+    
             throw new InvalidParameterSpecException("unknown parameter spec passed to PKCS12 PBE parameters object.");
         }
-
+    
         protected void engineInit(
             AlgorithmParameterSpec paramSpec) 
             throws InvalidParameterSpecException
@@ -474,20 +484,20 @@
             {
                 throw new InvalidParameterSpecException("PBEParameterSpec required to initialise a PKCS12 PBE parameters algorithm parameters object");
             }
-
+    
             PBEParameterSpec    pbeSpec = (PBEParameterSpec)paramSpec;
-
+    
             this.params = new PKCS12PBEParams(pbeSpec.getSalt(),
                                 pbeSpec.getIterationCount());
         }
-
+    
         protected void engineInit(
             byte[] params) 
             throws IOException
         {
             this.params = PKCS12PBEParams.getInstance(ASN1Object.fromByteArray(params));
         }
-
+    
         protected void engineInit(
             byte[] params,
             String format) 
@@ -498,10 +508,10 @@
                 engineInit(params);
                 return;
             }
-
+    
             throw new IOException("Unknown parameters format in PKCS12 PBE parameters object");
         }
-
+    
         protected String engineToString() 
         {
             return "PKCS12 PBE Parameters";
@@ -725,334 +735,336 @@
         }
     }
     
-    public static class GOST3410
-        extends JDKAlgorithmParameters
-    {
-        GOST3410ParameterSpec     currentSpec;
-        
-        /**
-         * Return the X.509 ASN.1 structure GOST3410Parameter.
-         * <p>
-         * <pre>
-         *  GOST3410Parameter ::= SEQUENCE {
-         *                   prime INTEGER, -- p
-         *                   subprime INTEGER, -- q
-         *                   base INTEGER, -- a}
-         * </pre>
-         */
-        protected byte[] engineGetEncoded()
-        {
-            GOST3410PublicKeyAlgParameters gost3410P = new GOST3410PublicKeyAlgParameters(new DERObjectIdentifier(currentSpec.getPublicKeyParamSetOID()), new DERObjectIdentifier(currentSpec.getDigestParamSetOID()), new DERObjectIdentifier(currentSpec.getEncryptionParamSetOID()));
-
-            try
-            {
-                return gost3410P.getEncoded(ASN1Encodable.DER);
-            }
-            catch (IOException e)
-            {
-                throw new RuntimeException("Error encoding GOST3410Parameters");
-            }
-        }
-        
-        protected byte[] engineGetEncoded(
-                String format)
-        {
-            if (isASN1FormatString(format) || format.equalsIgnoreCase("X.509"))
-            {
-                return engineGetEncoded();
-            }
-            
-            return null;
-        }
-        
-        protected AlgorithmParameterSpec localEngineGetParameterSpec(
-                Class paramSpec)
-        throws InvalidParameterSpecException
-        {
-            if (paramSpec == GOST3410PublicKeyParameterSetSpec.class)
-            {
-                return currentSpec;
-            }
-            
-            throw new InvalidParameterSpecException("unknown parameter spec passed to GOST3410 parameters object.");
-        }
-        
-        protected void engineInit(
-                AlgorithmParameterSpec paramSpec)
-        throws InvalidParameterSpecException
-        {
-            if (!(paramSpec instanceof GOST3410ParameterSpec))
-            {
-                throw new InvalidParameterSpecException("GOST3410ParameterSpec required to initialise a GOST3410 algorithm parameters object");
-            }
-            
-            this.currentSpec = (GOST3410ParameterSpec)paramSpec;
-        }
-        
-        protected void engineInit(
-                byte[] params)
-        throws IOException
-        {
-            try
-            {
-                ASN1Sequence seq = (ASN1Sequence) ASN1Object.fromByteArray(params);
-
-                this.currentSpec = GOST3410ParameterSpec.fromPublicKeyAlg(
-                    new GOST3410PublicKeyAlgParameters(seq));
-            }
-            catch (ClassCastException e)
-            {
-                throw new IOException("Not a valid GOST3410 Parameter encoding.");
-            }
-            catch (ArrayIndexOutOfBoundsException e)
-            {
-                throw new IOException("Not a valid GOST3410 Parameter encoding.");
-            }
-        }
-        
-        protected void engineInit(
-                byte[] params,
-                String format)
-        throws IOException
-        {
-            if (isASN1FormatString(format) || format.equalsIgnoreCase("X.509"))
-            {
-                engineInit(params);
-            }
-            else
-            {
-                throw new IOException("Unknown parameter format " + format);
-            }
-        }
-        
-        protected String engineToString()
-        {
-            return "GOST3410 Parameters";
-        }
-    }
-
-    public static class ElGamal
-        extends JDKAlgorithmParameters
-    {
-        ElGamalParameterSpec     currentSpec;
-
-        /**
-         * Return the X.509 ASN.1 structure ElGamalParameter.
-         * <p>
-         * <pre>
-         *  ElGamalParameter ::= SEQUENCE {
-         *                   prime INTEGER, -- p
-         *                   base INTEGER, -- g}
-         * </pre>
-         */
-        protected byte[] engineGetEncoded() 
-        {
-            ElGamalParameter elP = new ElGamalParameter(currentSpec.getP(), currentSpec.getG());
-
-            try
-            {
-                return elP.getEncoded(ASN1Encodable.DER);
-            }
-            catch (IOException e)
-            {
-                throw new RuntimeException("Error encoding ElGamalParameters");
-            }
-        }
-
-        protected byte[] engineGetEncoded(
-            String format) 
-        {
-            if (isASN1FormatString(format) || format.equalsIgnoreCase("X.509"))
-            {
-                return engineGetEncoded();
-            }
-
-            return null;
-        }
-
-        protected AlgorithmParameterSpec localEngineGetParameterSpec(
-            Class paramSpec) 
-            throws InvalidParameterSpecException
-        {
-            if (paramSpec == ElGamalParameterSpec.class)
-            {
-                return currentSpec;
-            }
-            else if (paramSpec == DHParameterSpec.class)
-            {
-                return new DHParameterSpec(currentSpec.getP(), currentSpec.getG());
-            }
-
-            throw new InvalidParameterSpecException("unknown parameter spec passed to ElGamal parameters object.");
-        }
-
-        protected void engineInit(
-            AlgorithmParameterSpec paramSpec) 
-            throws InvalidParameterSpecException
-        {
-            if (!(paramSpec instanceof ElGamalParameterSpec) && !(paramSpec instanceof DHParameterSpec))
-            {
-                throw new InvalidParameterSpecException("DHParameterSpec required to initialise a ElGamal algorithm parameters object");
-            }
-
-            if (paramSpec instanceof ElGamalParameterSpec)
-            {
-                this.currentSpec = (ElGamalParameterSpec)paramSpec;
-            }
-            else
-            {
-                DHParameterSpec s = (DHParameterSpec)paramSpec;
-                
-                this.currentSpec = new ElGamalParameterSpec(s.getP(), s.getG());
-            }
-        }
-
-        protected void engineInit(
-            byte[] params) 
-            throws IOException
-        {
-            try
-            {
-                ElGamalParameter elP = new ElGamalParameter((ASN1Sequence)ASN1Object.fromByteArray(params));
-
-                currentSpec = new ElGamalParameterSpec(elP.getP(), elP.getG());
-            }
-            catch (ClassCastException e)
-            {
-                throw new IOException("Not a valid ElGamal Parameter encoding.");
-            }
-            catch (ArrayIndexOutOfBoundsException e)
-            {
-                throw new IOException("Not a valid ElGamal Parameter encoding.");
-            }
-        }
-
-        protected void engineInit(
-            byte[] params,
-            String format) 
-            throws IOException
-        {
-            if (isASN1FormatString(format) || format.equalsIgnoreCase("X.509"))
-            {
-                engineInit(params);
-            }
-            else
-            {
-                throw new IOException("Unknown parameter format " + format);
-            }
-        }
-
-        protected String engineToString() 
-        {
-            return "ElGamal Parameters";
-        }
-    }
-
-    public static class IES
-        extends JDKAlgorithmParameters
-    {
-        IESParameterSpec     currentSpec;
-
-        /**
-         * in the absence of a standard way of doing it this will do for
-         * now...
-         */
-        protected byte[] engineGetEncoded() 
-        {
-            try
-            {
-                ASN1EncodableVector v = new ASN1EncodableVector();
-
-                v.add(new DEROctetString(currentSpec.getDerivationV()));
-                v.add(new DEROctetString(currentSpec.getEncodingV()));
-                v.add(new DERInteger(currentSpec.getMacKeySize()));
-
-                return new DERSequence(v).getEncoded(ASN1Encodable.DER);
-            }
-            catch (IOException e)
-            {
-                throw new RuntimeException("Error encoding IESParameters");
-            }
-        }
-
-        protected byte[] engineGetEncoded(
-            String format) 
-        {
-            if (isASN1FormatString(format) || format.equalsIgnoreCase("X.509"))
-            {
-                return engineGetEncoded();
-            }
-
-            return null;
-        }
-
-        protected AlgorithmParameterSpec localEngineGetParameterSpec(
-            Class paramSpec) 
-            throws InvalidParameterSpecException
-        {
-            if (paramSpec == IESParameterSpec.class)
-            {
-                return currentSpec;
-            }
-
-            throw new InvalidParameterSpecException("unknown parameter spec passed to ElGamal parameters object.");
-        }
-
-        protected void engineInit(
-            AlgorithmParameterSpec paramSpec) 
-            throws InvalidParameterSpecException
-        {
-            if (!(paramSpec instanceof IESParameterSpec))
-            {
-                throw new InvalidParameterSpecException("IESParameterSpec required to initialise a IES algorithm parameters object");
-            }
-
-            this.currentSpec = (IESParameterSpec)paramSpec;
-        }
-
-        protected void engineInit(
-            byte[] params) 
-            throws IOException
-        {
-            try
-            {
-                ASN1Sequence s = (ASN1Sequence)ASN1Object.fromByteArray(params);
-
-                this.currentSpec = new IESParameterSpec(
-                                        ((ASN1OctetString)s.getObjectAt(0)).getOctets(),
-                                        ((ASN1OctetString)s.getObjectAt(0)).getOctets(),
-                                        ((DERInteger)s.getObjectAt(0)).getValue().intValue());
-            }
-            catch (ClassCastException e)
-            {
-                throw new IOException("Not a valid IES Parameter encoding.");
-            }
-            catch (ArrayIndexOutOfBoundsException e)
-            {
-                throw new IOException("Not a valid IES Parameter encoding.");
-            }
-        }
-
-        protected void engineInit(
-            byte[] params,
-            String format) 
-            throws IOException
-        {
-            if (isASN1FormatString(format) || format.equalsIgnoreCase("X.509"))
-            {
-                engineInit(params);
-            }
-            else
-            {
-                throw new IOException("Unknown parameter format " + format);
-            }
-        }
-
-        protected String engineToString() 
-        {
-            return "IES Parameters";
-        }
-    }
+    // BEGIN android-removed
+    // public static class GOST3410
+    //     extends JDKAlgorithmParameters
+    // {
+    //     GOST3410ParameterSpec     currentSpec;
+    //
+    //     /**
+    //      * Return the X.509 ASN.1 structure GOST3410Parameter.
+    //      * <p>
+    //      * <pre>
+    //      *  GOST3410Parameter ::= SEQUENCE {
+    //      *                   prime INTEGER, -- p
+    //      *                   subprime INTEGER, -- q
+    //      *                   base INTEGER, -- a}
+    //      * </pre>
+    //      */
+    //     protected byte[] engineGetEncoded()
+    //     {
+    //         GOST3410PublicKeyAlgParameters gost3410P = new GOST3410PublicKeyAlgParameters(new DERObjectIdentifier(currentSpec.getPublicKeyParamSetOID()), new DERObjectIdentifier(currentSpec.getDigestParamSetOID()), new DERObjectIdentifier(currentSpec.getEncryptionParamSetOID()));
+    //
+    //         try
+    //         {
+    //             return gost3410P.getEncoded(ASN1Encodable.DER);
+    //         }
+    //         catch (IOException e)
+    //         {
+    //             throw new RuntimeException("Error encoding GOST3410Parameters");
+    //         }
+    //     }
+    //
+    //     protected byte[] engineGetEncoded(
+    //             String format)
+    //     {
+    //         if (isASN1FormatString(format) || format.equalsIgnoreCase("X.509"))
+    //         {
+    //             return engineGetEncoded();
+    //         }
+    //
+    //         return null;
+    //     }
+    //
+    //     protected AlgorithmParameterSpec localEngineGetParameterSpec(
+    //             Class paramSpec)
+    //     throws InvalidParameterSpecException
+    //     {
+    //         if (paramSpec == GOST3410PublicKeyParameterSetSpec.class)
+    //         {
+    //             return currentSpec;
+    //         }
+    //
+    //         throw new InvalidParameterSpecException("unknown parameter spec passed to GOST3410 parameters object.");
+    //     }
+    //
+    //     protected void engineInit(
+    //             AlgorithmParameterSpec paramSpec)
+    //     throws InvalidParameterSpecException
+    //     {
+    //         if (!(paramSpec instanceof GOST3410ParameterSpec))
+    //         {
+    //             throw new InvalidParameterSpecException("GOST3410ParameterSpec required to initialise a GOST3410 algorithm parameters object");
+    //         }
+    //
+    //         this.currentSpec = (GOST3410ParameterSpec)paramSpec;
+    //     }
+    //
+    //     protected void engineInit(
+    //             byte[] params)
+    //     throws IOException
+    //     {
+    //         try
+    //         {
+    //             ASN1Sequence seq = (ASN1Sequence) ASN1Object.fromByteArray(params);
+    //
+    //             this.currentSpec = GOST3410ParameterSpec.fromPublicKeyAlg(
+    //                 new GOST3410PublicKeyAlgParameters(seq));
+    //         }
+    //         catch (ClassCastException e)
+    //         {
+    //             throw new IOException("Not a valid GOST3410 Parameter encoding.");
+    //         }
+    //         catch (ArrayIndexOutOfBoundsException e)
+    //         {
+    //             throw new IOException("Not a valid GOST3410 Parameter encoding.");
+    //         }
+    //     }
+    //
+    //     protected void engineInit(
+    //             byte[] params,
+    //             String format)
+    //     throws IOException
+    //     {
+    //         if (isASN1FormatString(format) || format.equalsIgnoreCase("X.509"))
+    //         {
+    //             engineInit(params);
+    //         }
+    //         else
+    //         {
+    //             throw new IOException("Unknown parameter format " + format);
+    //         }
+    //     }
+    //
+    //     protected String engineToString()
+    //     {
+    //         return "GOST3410 Parameters";
+    //     }
+    // }
+
+    // public static class ElGamal
+    //     extends JDKAlgorithmParameters
+    // {
+    //     ElGamalParameterSpec     currentSpec;
+    //
+    //     /**
+    //      * Return the X.509 ASN.1 structure ElGamalParameter.
+    //      * <p>
+    //      * <pre>
+    //      *  ElGamalParameter ::= SEQUENCE {
+    //      *                   prime INTEGER, -- p
+    //      *                   base INTEGER, -- g}
+    //      * </pre>
+    //      */
+    //     protected byte[] engineGetEncoded() 
+    //     {
+    //         ElGamalParameter elP = new ElGamalParameter(currentSpec.getP(), currentSpec.getG());
+    //
+    //         try
+    //         {
+    //             return elP.getEncoded(ASN1Encodable.DER);
+    //         }
+    //         catch (IOException e)
+    //         {
+    //             throw new RuntimeException("Error encoding ElGamalParameters");
+    //         }
+    //     }
+    //
+    //     protected byte[] engineGetEncoded(
+    //         String format) 
+    //     {
+    //         if (isASN1FormatString(format) || format.equalsIgnoreCase("X.509"))
+    //         {
+    //             return engineGetEncoded();
+    //         }
+    //
+    //         return null;
+    //     }
+    //
+    //     protected AlgorithmParameterSpec localEngineGetParameterSpec(
+    //         Class paramSpec) 
+    //         throws InvalidParameterSpecException
+    //     {
+    //         if (paramSpec == ElGamalParameterSpec.class)
+    //         {
+    //             return currentSpec;
+    //         }
+    //         else if (paramSpec == DHParameterSpec.class)
+    //         {
+    //             return new DHParameterSpec(currentSpec.getP(), currentSpec.getG());
+    //         }
+    //
+    //         throw new InvalidParameterSpecException("unknown parameter spec passed to ElGamal parameters object.");
+    //     }
+    //
+    //     protected void engineInit(
+    //         AlgorithmParameterSpec paramSpec) 
+    //         throws InvalidParameterSpecException
+    //     {
+    //         if (!(paramSpec instanceof ElGamalParameterSpec) && !(paramSpec instanceof DHParameterSpec))
+    //         {
+    //             throw new InvalidParameterSpecException("DHParameterSpec required to initialise a ElGamal algorithm parameters object");
+    //         }
+    //
+    //         if (paramSpec instanceof ElGamalParameterSpec)
+    //         {
+    //             this.currentSpec = (ElGamalParameterSpec)paramSpec;
+    //         }
+    //         else
+    //         {
+    //             DHParameterSpec s = (DHParameterSpec)paramSpec;
+    //
+    //             this.currentSpec = new ElGamalParameterSpec(s.getP(), s.getG());
+    //         }
+    //     }
+    //
+    //     protected void engineInit(
+    //         byte[] params) 
+    //         throws IOException
+    //     {
+    //         try
+    //         {
+    //             ElGamalParameter elP = new ElGamalParameter((ASN1Sequence)ASN1Object.fromByteArray(params));
+    //
+    //             currentSpec = new ElGamalParameterSpec(elP.getP(), elP.getG());
+    //         }
+    //         catch (ClassCastException e)
+    //         {
+    //             throw new IOException("Not a valid ElGamal Parameter encoding.");
+    //         }
+    //         catch (ArrayIndexOutOfBoundsException e)
+    //         {
+    //             throw new IOException("Not a valid ElGamal Parameter encoding.");
+    //         }
+    //     }
+    //
+    //     protected void engineInit(
+    //         byte[] params,
+    //         String format) 
+    //         throws IOException
+    //     {
+    //         if (isASN1FormatString(format) || format.equalsIgnoreCase("X.509"))
+    //         {
+    //             engineInit(params);
+    //         }
+    //         else
+    //         {
+    //             throw new IOException("Unknown parameter format " + format);
+    //         }
+    //     }
+    //
+    //     protected String engineToString() 
+    //     {
+    //         return "ElGamal Parameters";
+    //     }
+    // }
+    //
+    // public static class IES
+    //     extends JDKAlgorithmParameters
+    // {
+    //     IESParameterSpec     currentSpec;
+    //
+    //     /**
+    //      * in the absence of a standard way of doing it this will do for
+    //      * now...
+    //      */
+    //     protected byte[] engineGetEncoded() 
+    //     {
+    //         try
+    //         {
+    //             ASN1EncodableVector v = new ASN1EncodableVector();
+    //
+    //             v.add(new DEROctetString(currentSpec.getDerivationV()));
+    //             v.add(new DEROctetString(currentSpec.getEncodingV()));
+    //             v.add(new DERInteger(currentSpec.getMacKeySize()));
+    //
+    //             return new DERSequence(v).getEncoded(ASN1Encodable.DER);
+    //         }
+    //         catch (IOException e)
+    //         {
+    //             throw new RuntimeException("Error encoding IESParameters");
+    //         }
+    //     }
+    //
+    //     protected byte[] engineGetEncoded(
+    //         String format) 
+    //     {
+    //         if (isASN1FormatString(format) || format.equalsIgnoreCase("X.509"))
+    //         {
+    //             return engineGetEncoded();
+    //         }
+    //
+    //         return null;
+    //     }
+    //
+    //     protected AlgorithmParameterSpec localEngineGetParameterSpec(
+    //         Class paramSpec) 
+    //         throws InvalidParameterSpecException
+    //     {
+    //         if (paramSpec == IESParameterSpec.class)
+    //         {
+    //             return currentSpec;
+    //         }
+    //
+    //         throw new InvalidParameterSpecException("unknown parameter spec passed to ElGamal parameters object.");
+    //     }
+    //
+    //     protected void engineInit(
+    //         AlgorithmParameterSpec paramSpec) 
+    //         throws InvalidParameterSpecException
+    //     {
+    //         if (!(paramSpec instanceof IESParameterSpec))
+    //         {
+    //             throw new InvalidParameterSpecException("IESParameterSpec required to initialise a IES algorithm parameters object");
+    //         }
+    //
+    //         this.currentSpec = (IESParameterSpec)paramSpec;
+    //     }
+    //
+    //     protected void engineInit(
+    //         byte[] params) 
+    //         throws IOException
+    //     {
+    //         try
+    //         {
+    //             ASN1Sequence s = (ASN1Sequence)ASN1Object.fromByteArray(params);
+    //
+    //             this.currentSpec = new IESParameterSpec(
+    //                                     ((ASN1OctetString)s.getObjectAt(0)).getOctets(),
+    //                                     ((ASN1OctetString)s.getObjectAt(0)).getOctets(),
+    //                                     ((DERInteger)s.getObjectAt(0)).getValue().intValue());
+    //         }
+    //         catch (ClassCastException e)
+    //         {
+    //             throw new IOException("Not a valid IES Parameter encoding.");
+    //         }
+    //         catch (ArrayIndexOutOfBoundsException e)
+    //         {
+    //             throw new IOException("Not a valid IES Parameter encoding.");
+    //         }
+    //     }
+    //
+    //     protected void engineInit(
+    //         byte[] params,
+    //         String format) 
+    //         throws IOException
+    //     {
+    //         if (isASN1FormatString(format) || format.equalsIgnoreCase("X.509"))
+    //         {
+    //             engineInit(params);
+    //         }
+    //         else
+    //         {
+    //             throw new IOException("Unknown parameter format " + format);
+    //         }
+    //     }
+    //
+    //     protected String engineToString() 
+    //     {
+    //         return "IES Parameters";
+    //     }
+    // }
+    // END android-removed
     
     public static class OAEP
         extends JDKAlgorithmParameters
@@ -1066,11 +1078,15 @@
         {
             AlgorithmIdentifier     hashAlgorithm = new AlgorithmIdentifier(
                                                             JCEDigestUtil.getOID(currentSpec.getDigestAlgorithm()),
-                                                            new DERNull());
+                                                            // BEGIN android-changed
+                                                            DERNull.INSTANCE);
+                                                            // END android-changed
             MGF1ParameterSpec       mgfSpec = (MGF1ParameterSpec)currentSpec.getMGFParameters();
             AlgorithmIdentifier     maskGenAlgorithm = new AlgorithmIdentifier(
                                                             PKCSObjectIdentifiers.id_mgf1, 
-                                                            new AlgorithmIdentifier(JCEDigestUtil.getOID(mgfSpec.getDigestAlgorithm()), new DERNull()));
+                                                            // BEGIN android-changed
+                                                            new AlgorithmIdentifier(JCEDigestUtil.getOID(mgfSpec.getDigestAlgorithm()), DERNull.INSTANCE));
+                                                            // END android-changed
             PSource.PSpecified      pSource = (PSource.PSpecified)currentSpec.getPSource();
             AlgorithmIdentifier     pSourceAlgorithm = new AlgorithmIdentifier(
                                                             PKCSObjectIdentifiers.id_pSpecified, new DEROctetString(pSource.getValue()));
@@ -1167,110 +1183,116 @@
         }
     }
     
-    public static class PSS
-        extends JDKAlgorithmParameters
-    {  
-        PSSParameterSpec     currentSpec;
-    
-        /**
-         * Return the PKCS#1 ASN.1 structure RSASSA-PSS-params.
-         */
-        protected byte[] engineGetEncoded() 
-            throws IOException
-        {
-            PSSParameterSpec    pssSpec = currentSpec;
-            AlgorithmIdentifier hashAlgorithm = new AlgorithmIdentifier(
-                                                JCEDigestUtil.getOID(pssSpec.getDigestAlgorithm()),
-                                                new DERNull());
-            MGF1ParameterSpec   mgfSpec = (MGF1ParameterSpec)pssSpec.getMGFParameters();
-            AlgorithmIdentifier maskGenAlgorithm = new AlgorithmIdentifier(
-                                                PKCSObjectIdentifiers.id_mgf1, 
-                                                new AlgorithmIdentifier(JCEDigestUtil.getOID(mgfSpec.getDigestAlgorithm()), new DERNull()));
-            RSASSAPSSparams     pssP = new RSASSAPSSparams(hashAlgorithm, maskGenAlgorithm, new DERInteger(pssSpec.getSaltLength()), new DERInteger(pssSpec.getTrailerField()));
-            
-            return pssP.getEncoded("DER");
-        }
-    
-        protected byte[] engineGetEncoded(
-            String format) 
-            throws IOException
-        {
-            if (format.equalsIgnoreCase("X.509")
-                    || format.equalsIgnoreCase("ASN.1"))
-            {
-                return engineGetEncoded();
-            }
-    
-            return null;
-        }
-    
-        protected AlgorithmParameterSpec localEngineGetParameterSpec(
-            Class paramSpec) 
-            throws InvalidParameterSpecException
-        {
-            if (paramSpec == PSSParameterSpec.class && currentSpec != null)
-            {
-                return currentSpec;
-            }
-    
-            throw new InvalidParameterSpecException("unknown parameter spec passed to PSS parameters object.");
-        }
-    
-        protected void engineInit(
-            AlgorithmParameterSpec paramSpec) 
-            throws InvalidParameterSpecException
-        {
-            if (!(paramSpec instanceof PSSParameterSpec))
-            {
-                throw new InvalidParameterSpecException("PSSParameterSpec required to initialise an PSS algorithm parameters object");
-            }
-    
-            this.currentSpec = (PSSParameterSpec)paramSpec;
-        }
-    
-        protected void engineInit(
-            byte[] params) 
-            throws IOException
-        {
-            try
-            {
-                RSASSAPSSparams pssP = new RSASSAPSSparams((ASN1Sequence)ASN1Object.fromByteArray(params));
-
-                currentSpec = new PSSParameterSpec(
-                                       pssP.getHashAlgorithm().getObjectId().getId(), 
-                                       pssP.getMaskGenAlgorithm().getObjectId().getId(), 
-                                       new MGF1ParameterSpec(AlgorithmIdentifier.getInstance(pssP.getMaskGenAlgorithm().getParameters()).getObjectId().getId()),
-                                       pssP.getSaltLength().getValue().intValue(),
-                                       pssP.getTrailerField().getValue().intValue());
-            }
-            catch (ClassCastException e)
-            {
-                throw new IOException("Not a valid PSS Parameter encoding.");
-            }
-            catch (ArrayIndexOutOfBoundsException e)
-            {
-                throw new IOException("Not a valid PSS Parameter encoding.");
-            }
-        }
-    
-        protected void engineInit(
-            byte[] params,
-            String format) 
-            throws IOException
-        {
-            if (isASN1FormatString(format) || format.equalsIgnoreCase("X.509"))
-            {
-                engineInit(params);
-            }
-            else
-            {
-                throw new IOException("Unknown parameter format " + format);
-            }
-        }
-    
-        protected String engineToString() 
-        {
-            return "PSS Parameters";
-        }
-    }
+    // BEGIN android-removed
+    // public static class PSS
+    //     extends JDKAlgorithmParameters
+    // {  
+    //     PSSParameterSpec     currentSpec;
+    //
+    //     /**
+    //      * Return the PKCS#1 ASN.1 structure RSASSA-PSS-params.
+    //      */
+    //     protected byte[] engineGetEncoded() 
+    //         throws IOException
+    //     {
+    //         PSSParameterSpec    pssSpec = currentSpec;
+    //         AlgorithmIdentifier hashAlgorithm = new AlgorithmIdentifier(
+    //                                             JCEDigestUtil.getOID(pssSpec.getDigestAlgorithm()),
+    //                                             // BEGIN android-changed
+    //                                             DERNull.INSTANCE);
+    //                                             // END android-changed
+    //         MGF1ParameterSpec   mgfSpec = (MGF1ParameterSpec)pssSpec.getMGFParameters();
+    //         AlgorithmIdentifier maskGenAlgorithm = new AlgorithmIdentifier(
+    //                                             PKCSObjectIdentifiers.id_mgf1, 
+    //                                             // BEGIN android-changed
+    //                                             new AlgorithmIdentifier(JCEDigestUtil.getOID(mgfSpec.getDigestAlgorithm()), DERNull.INSTANCE));
+    //                                             // END android-changed
+    //         RSASSAPSSparams     pssP = new RSASSAPSSparams(hashAlgorithm, maskGenAlgorithm, new DERInteger(pssSpec.getSaltLength()), new DERInteger(pssSpec.getTrailerField()));
+    //
+    //         return pssP.getEncoded("DER");
+    //     }
+    //
+    //     protected byte[] engineGetEncoded(
+    //         String format) 
+    //         throws IOException
+    //     {
+    //         if (format.equalsIgnoreCase("X.509")
+    //                 || format.equalsIgnoreCase("ASN.1"))
+    //         {
+    //             return engineGetEncoded();
+    //         }
+    //
+    //         return null;
+    //     }
+    //
+    //     protected AlgorithmParameterSpec localEngineGetParameterSpec(
+    //         Class paramSpec) 
+    //         throws InvalidParameterSpecException
+    //     {
+    //         if (paramSpec == PSSParameterSpec.class && currentSpec != null)
+    //         {
+    //             return currentSpec;
+    //         }
+    //
+    //         throw new InvalidParameterSpecException("unknown parameter spec passed to PSS parameters object.");
+    //     }
+    //
+    //     protected void engineInit(
+    //         AlgorithmParameterSpec paramSpec) 
+    //         throws InvalidParameterSpecException
+    //     {
+    //         if (!(paramSpec instanceof PSSParameterSpec))
+    //         {
+    //             throw new InvalidParameterSpecException("PSSParameterSpec required to initialise an PSS algorithm parameters object");
+    //         }
+    //
+    //         this.currentSpec = (PSSParameterSpec)paramSpec;
+    //     }
+    //
+    //     protected void engineInit(
+    //         byte[] params) 
+    //         throws IOException
+    //     {
+    //         try
+    //         {
+    //             RSASSAPSSparams pssP = new RSASSAPSSparams((ASN1Sequence)ASN1Object.fromByteArray(params));
+    //
+    //             currentSpec = new PSSParameterSpec(
+    //                                    pssP.getHashAlgorithm().getObjectId().getId(), 
+    //                                    pssP.getMaskGenAlgorithm().getObjectId().getId(), 
+    //                                    new MGF1ParameterSpec(AlgorithmIdentifier.getInstance(pssP.getMaskGenAlgorithm().getParameters()).getObjectId().getId()),
+    //                                    pssP.getSaltLength().getValue().intValue(),
+    //                                    pssP.getTrailerField().getValue().intValue());
+    //         }
+    //         catch (ClassCastException e)
+    //         {
+    //             throw new IOException("Not a valid PSS Parameter encoding.");
+    //         }
+    //         catch (ArrayIndexOutOfBoundsException e)
+    //         {
+    //             throw new IOException("Not a valid PSS Parameter encoding.");
+    //         }
+    //     }
+    //
+    //     protected void engineInit(
+    //         byte[] params,
+    //         String format) 
+    //         throws IOException
+    //     {
+    //         if (isASN1FormatString(format) || format.equalsIgnoreCase("X.509"))
+    //         {
+    //             engineInit(params);
+    //         }
+    //         else
+    //         {
+    //             throw new IOException("Unknown parameter format " + format);
+    //         }
+    //     }
+    //
+    //     protected String engineToString() 
+    //     {
+    //         return "PSS Parameters";
+    //     }
+    // }
+    // END android-removed
 }
diff -Naur bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/JDKDSASigner.java bcprov-jdk16-145/org/bouncycastle/jce/provider/JDKDSASigner.java
--- bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/JDKDSASigner.java	2010-01-11 21:46:14.000000000 +0000
+++ bcprov-jdk16-145/org/bouncycastle/jce/provider/JDKDSASigner.java	2011-09-01 17:21:06.000000000 +0000
@@ -22,13 +22,17 @@
 import org.bouncycastle.crypto.DSA;
 import org.bouncycastle.crypto.Digest;
 import org.bouncycastle.crypto.digests.SHA1Digest;
-import org.bouncycastle.crypto.digests.SHA224Digest;
+// BEGIN android-removed
+// import org.bouncycastle.crypto.digests.SHA224Digest;
+// END android-removed
 import org.bouncycastle.crypto.digests.SHA256Digest;
 import org.bouncycastle.crypto.digests.SHA384Digest;
 import org.bouncycastle.crypto.digests.SHA512Digest;
 import org.bouncycastle.crypto.params.ParametersWithRandom;
 import org.bouncycastle.crypto.signers.DSASigner;
-import org.bouncycastle.jce.interfaces.GOST3410Key;
+// BEGIN android-removed
+// import org.bouncycastle.jce.interfaces.GOST3410Key;
+// END android-removed
 import org.bouncycastle.jce.provider.util.NullDigest;
 
 public class JDKDSASigner
@@ -53,11 +57,16 @@
     {
         CipherParameters    param;
 
-        if (publicKey instanceof GOST3410Key)
-        {
-            param = GOST3410Util.generatePublicKeyParameter(publicKey);
-        }
-        else if (publicKey instanceof DSAKey)
+        // BEGIN android-removed
+        // if (publicKey instanceof GOST3410Key)
+        // {
+        //     param = GOST3410Util.generatePublicKeyParameter(publicKey);
+        // }
+        // else if (publicKey instanceof DSAKey)
+        // END android-removed
+        // BEGIN android-added
+        if (publicKey instanceof DSAKey)
+        // END android-added
         {
             param = DSAUtil.generatePublicKeyParameter(publicKey);
         }
@@ -103,14 +112,18 @@
     {
         CipherParameters    param;
 
-        if (privateKey instanceof GOST3410Key)
-        {
-            param = GOST3410Util.generatePrivateKeyParameter(privateKey);
-        }
-        else
-        {
+        // BEGIN android-removed
+        // if (privateKey instanceof GOST3410Key)
+        // {
+        //     param = GOST3410Util.generatePrivateKeyParameter(privateKey);
+        // }
+        // else
+        // {
+        // END android-removed
             param = DSAUtil.generatePrivateKeyParameter(privateKey);
-        }
+        // BEGIN android-removed
+        // }
+        // END android-removed
 
         if (random != null)
         {
@@ -231,42 +244,44 @@
             super(new SHA1Digest(), new DSASigner());
         }
     }
-
-    static public class dsa224
-        extends JDKDSASigner
-    {
-        public dsa224()
-        {
-            super(new SHA224Digest(), new DSASigner());
-        }
-    }
-    
-    static public class dsa256
-        extends JDKDSASigner
-    {
-        public dsa256()
-        {
-            super(new SHA256Digest(), new DSASigner());
-        }
-    }
     
-    static public class dsa384
-        extends JDKDSASigner
-    {
-        public dsa384()
-        {
-            super(new SHA384Digest(), new DSASigner());
-        }
-    }
-    
-    static public class dsa512
-        extends JDKDSASigner
-    {
-        public dsa512()
-        {
-            super(new SHA512Digest(), new DSASigner());
-        }
-    }
+    // BEGIN android-removed
+    // static public class dsa224
+    //     extends JDKDSASigner
+    // {
+    //     public dsa224()
+    //     {
+    //         super(new SHA224Digest(), new DSASigner());
+    //     }
+    // }
+    //
+    // static public class dsa256
+    //     extends JDKDSASigner
+    // {
+    //     public dsa256()
+    //     {
+    //         super(new SHA256Digest(), new DSASigner());
+    //     }
+    // }
+    //
+    // static public class dsa384
+    //     extends JDKDSASigner
+    // {
+    //     public dsa384()
+    //     {
+    //         super(new SHA384Digest(), new DSASigner());
+    //     }
+    // }
+    //
+    // static public class dsa512
+    //     extends JDKDSASigner
+    // {
+    //     public dsa512()
+    //     {
+    //         super(new SHA512Digest(), new DSASigner());
+    //     }
+    // }
+    // END android-removed
 
     static public class noneDSA
         extends JDKDSASigner
diff -Naur bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/JDKDigestSignature.java bcprov-jdk16-145/org/bouncycastle/jce/provider/JDKDigestSignature.java
--- bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/JDKDigestSignature.java	2010-01-11 21:46:14.000000000 +0000
+++ bcprov-jdk16-145/org/bouncycastle/jce/provider/JDKDigestSignature.java	2011-09-01 17:21:06.000000000 +0000
@@ -23,14 +23,20 @@
 import org.bouncycastle.crypto.AsymmetricBlockCipher;
 import org.bouncycastle.crypto.CipherParameters;
 import org.bouncycastle.crypto.Digest;
-import org.bouncycastle.crypto.digests.MD2Digest;
-import org.bouncycastle.crypto.digests.MD4Digest;
+// BEGIN android-removed
+// import org.bouncycastle.crypto.digests.MD2Digest;
+// import org.bouncycastle.crypto.digests.MD4Digest;
+// END android-removed
 import org.bouncycastle.crypto.digests.MD5Digest;
-import org.bouncycastle.crypto.digests.RIPEMD128Digest;
-import org.bouncycastle.crypto.digests.RIPEMD160Digest;
-import org.bouncycastle.crypto.digests.RIPEMD256Digest;
+// BEGIN android-removed
+// import org.bouncycastle.crypto.digests.RIPEMD128Digest;
+// import org.bouncycastle.crypto.digests.RIPEMD160Digest;
+// import org.bouncycastle.crypto.digests.RIPEMD256Digest;
+// END android-removed
 import org.bouncycastle.crypto.digests.SHA1Digest;
-import org.bouncycastle.crypto.digests.SHA224Digest;
+// BEGIN android-removed
+// import org.bouncycastle.crypto.digests.SHA224Digest;
+// END android-removed
 import org.bouncycastle.crypto.digests.SHA256Digest;
 import org.bouncycastle.crypto.digests.SHA384Digest;
 import org.bouncycastle.crypto.digests.SHA512Digest;
@@ -179,13 +185,13 @@
                 }
             }
         }
-        else if (sig.length == expected.length - 2)  // NULL left out
+        else if (expected.length == sig.length - 2)  // NULL left out
         {
             int sigOffset = sig.length - hash.length - 2;
             int expectedOffset = expected.length - hash.length - 2;
 
-            expected[1] -= 2;      // adjust lengths
-            expected[3] -= 2;
+            sig[1] -= 2;      // adjust lengths
+            sig[3] -= 2;
 
             for (int i = 0; i < hash.length; i++)
             {
@@ -195,7 +201,7 @@
                 }
             }
 
-            for (int i = 0; i < sigOffset; i++)
+            for (int i = 0; i < expectedOffset; i++)
             {
                 if (sig[i] != expected[i])  // check header less NULL
                 {
@@ -265,14 +271,16 @@
         }
     }
 
-    static public class SHA224WithRSAEncryption
-        extends JDKDigestSignature
-    {
-        public SHA224WithRSAEncryption()
-        {
-            super(NISTObjectIdentifiers.id_sha224, new SHA224Digest(), new PKCS1Encoding(new RSABlindedEngine()));
-        }
-    }
+    // BEGIN android-removed
+    // static public class SHA224WithRSAEncryption
+    //     extends JDKDigestSignature
+    // {
+    //     public SHA224WithRSAEncryption()
+    //     {
+    //         super(NISTObjectIdentifiers.id_sha224, new SHA224Digest(), new PKCS1Encoding(new RSABlindedEngine()));
+    //     }
+    // }
+    // END android-removed
 
     static public class SHA256WithRSAEncryption
         extends JDKDigestSignature
@@ -301,23 +309,25 @@
         }
     }
 
-    static public class MD2WithRSAEncryption
-        extends JDKDigestSignature
-    {
-        public MD2WithRSAEncryption()
-        {
-            super(PKCSObjectIdentifiers.md2, new MD2Digest(), new PKCS1Encoding(new RSABlindedEngine()));
-        }
-    }
-
-    static public class MD4WithRSAEncryption
-        extends JDKDigestSignature
-    {
-        public MD4WithRSAEncryption()
-        {
-            super(PKCSObjectIdentifiers.md4, new MD4Digest(), new PKCS1Encoding(new RSABlindedEngine()));
-        }
-    }
+    // BEGIN android-removed
+    // static public class MD2WithRSAEncryption
+    //     extends JDKDigestSignature
+    // {
+    //     public MD2WithRSAEncryption()
+    //     {
+    //         super(PKCSObjectIdentifiers.md2, new MD2Digest(), new PKCS1Encoding(new RSABlindedEngine()));
+    //     }
+    // }
+    //
+    // static public class MD4WithRSAEncryption
+    //     extends JDKDigestSignature
+    // {
+    //     public MD4WithRSAEncryption()
+    //     {
+    //         super(PKCSObjectIdentifiers.md4, new MD4Digest(), new PKCS1Encoding(new RSABlindedEngine()));
+    //     }
+    // }
+    // END android-removed
 
     static public class MD5WithRSAEncryption
         extends JDKDigestSignature
@@ -328,39 +338,41 @@
         }
     }
 
-    static public class RIPEMD160WithRSAEncryption
-        extends JDKDigestSignature
-    {
-        public RIPEMD160WithRSAEncryption()
-        {
-            super(TeleTrusTObjectIdentifiers.ripemd160, new RIPEMD160Digest(), new PKCS1Encoding(new RSABlindedEngine()));
-        }
-    }
-
-    static public class RIPEMD128WithRSAEncryption
-        extends JDKDigestSignature
-    {
-        public RIPEMD128WithRSAEncryption()
-        {
-            super(TeleTrusTObjectIdentifiers.ripemd128, new RIPEMD128Digest(), new PKCS1Encoding(new RSABlindedEngine()));
-        }
-    }
-
-    static public class RIPEMD256WithRSAEncryption
-        extends JDKDigestSignature
-    {
-        public RIPEMD256WithRSAEncryption()
-        {
-            super(TeleTrusTObjectIdentifiers.ripemd256, new RIPEMD256Digest(), new PKCS1Encoding(new RSABlindedEngine()));
-        }
-    }
-
-    static public class noneRSA
-        extends JDKDigestSignature
-    {
-        public noneRSA()
-        {
-            super(new NullDigest(), new PKCS1Encoding(new RSABlindedEngine()));
-        }
-    }
+    // BEGIN android-removed
+    // static public class RIPEMD160WithRSAEncryption
+    //     extends JDKDigestSignature
+    // {
+    //     public RIPEMD160WithRSAEncryption()
+    //     {
+    //         super(TeleTrusTObjectIdentifiers.ripemd160, new RIPEMD160Digest(), new PKCS1Encoding(new RSABlindedEngine()));
+    //     }
+    // }
+    //
+    // static public class RIPEMD128WithRSAEncryption
+    //     extends JDKDigestSignature
+    // {
+    //     public RIPEMD128WithRSAEncryption()
+    //     {
+    //         super(TeleTrusTObjectIdentifiers.ripemd128, new RIPEMD128Digest(), new PKCS1Encoding(new RSABlindedEngine()));
+    //     }
+    // }
+    //
+    // static public class RIPEMD256WithRSAEncryption
+    //     extends JDKDigestSignature
+    // {
+    //     public RIPEMD256WithRSAEncryption()
+    //     {
+    //         super(TeleTrusTObjectIdentifiers.ripemd256, new RIPEMD256Digest(), new PKCS1Encoding(new RSABlindedEngine()));
+    //     }
+    // }
+    //
+    // static public class noneRSA
+    //     extends JDKDigestSignature
+    // {
+    //     public noneRSA()
+    //     {
+    //         super(new NullDigest(), new PKCS1Encoding(new RSABlindedEngine()));
+    //     }
+    // }
+    // END android-removed
 }
diff -Naur bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/JDKKeyFactory.java bcprov-jdk16-145/org/bouncycastle/jce/provider/JDKKeyFactory.java
--- bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/JDKKeyFactory.java	2010-01-11 21:46:14.000000000 +0000
+++ bcprov-jdk16-145/org/bouncycastle/jce/provider/JDKKeyFactory.java	2011-09-01 17:21:06.000000000 +0000
@@ -36,17 +36,21 @@
 import org.bouncycastle.asn1.pkcs.RSAPrivateKeyStructure;
 import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;
 import org.bouncycastle.asn1.x9.X9ObjectIdentifiers;
-import org.bouncycastle.jce.interfaces.ElGamalPrivateKey;
-import org.bouncycastle.jce.interfaces.ElGamalPublicKey;
-import org.bouncycastle.jce.spec.ElGamalPrivateKeySpec;
-import org.bouncycastle.jce.spec.ElGamalPublicKeySpec;
-import org.bouncycastle.jce.spec.GOST3410PrivateKeySpec;
-import org.bouncycastle.jce.spec.GOST3410PublicKeySpec;
+// BEGIN android-removed
+// import org.bouncycastle.jce.interfaces.ElGamalPrivateKey;
+// import org.bouncycastle.jce.interfaces.ElGamalPublicKey;
+// import org.bouncycastle.jce.spec.ElGamalPrivateKeySpec;
+// import org.bouncycastle.jce.spec.ElGamalPublicKeySpec;
+// import org.bouncycastle.jce.spec.GOST3410PrivateKeySpec;
+// import org.bouncycastle.jce.spec.GOST3410PublicKeySpec;
+// END android-removed
 
 public abstract class JDKKeyFactory
     extends KeyFactorySpi
 {
-    protected boolean elGamalFactory = false;
+    // BEGIN android-removed
+    // protected boolean elGamalFactory = false;
+    // END android-removed
     
     public JDKKeyFactory()
     {
@@ -162,25 +166,33 @@
         }
         else if (key instanceof DHPublicKey)
         {
-            if (elGamalFactory)
-            {
-                return new JCEElGamalPublicKey((DHPublicKey)key);
-            }
-            else
-            {
+            // BEGIN android-removed
+            // if (elGamalFactory)
+            // {
+            //     return new JCEElGamalPublicKey((DHPublicKey)key);
+            // }
+            // else
+            // {
+            // END android-removed
                 return new JCEDHPublicKey((DHPublicKey)key);
-            }
+            // BEGIN android-removed
+            // }
+            // END android-removed
         }
         else if (key instanceof DHPrivateKey)
         {
-            if (elGamalFactory)
-            {
-                return new JCEElGamalPrivateKey((DHPrivateKey)key);
-            }
-            else
-            {
+            // BEGIN android-removed
+            // if (elGamalFactory)
+            // {
+            //     return new JCEElGamalPrivateKey((DHPrivateKey)key);
+            // }
+            // else
+            // {
+            // END android-removed
                 return new JCEDHPrivateKey((DHPrivateKey)key);
-            }
+            // BEGIN android-removed
+            // }
+            // END android-removed
         }
         else if (key instanceof DSAPublicKey)
         {
@@ -190,14 +202,16 @@
         {
             return new JDKDSAPrivateKey((DSAPrivateKey)key);
         }
-        else if (key instanceof ElGamalPublicKey)
-        {
-            return new JCEElGamalPublicKey((ElGamalPublicKey)key);
-        }
-        else if (key instanceof ElGamalPrivateKey)
-        {
-            return new JCEElGamalPrivateKey((ElGamalPrivateKey)key);
-        }
+        // BEGIN android-removed
+        // else if (key instanceof ElGamalPublicKey)
+        // {
+        //     return new JCEElGamalPublicKey((ElGamalPublicKey)key);
+        // }
+        // else if (key instanceof ElGamalPrivateKey)
+        // {
+        //    return new JCEElGamalPrivateKey((ElGamalPrivateKey)key);
+        // }
+        // END android-removed
 
         throw new InvalidKeyException("key type unknown");
     }
@@ -233,10 +247,12 @@
         {
             return new JCEDHPublicKey(info);
         }
-        else if (algOid.equals(OIWObjectIdentifiers.elGamalAlgorithm))
-        {
-            return new JCEElGamalPublicKey(info);
-        }
+        // BEGIN android-removed
+        // else if (algOid.equals(OIWObjectIdentifiers.elGamalAlgorithm))
+        // {
+        //     return new JCEElGamalPublicKey(info);
+        // }
+        // END android-removed
         else if (algOid.equals(X9ObjectIdentifiers.id_dsa))
         {
             return new JDKDSAPublicKey(info);
@@ -245,18 +261,19 @@
         {
             return new JDKDSAPublicKey(info);
         }
-        else if (algOid.equals(X9ObjectIdentifiers.id_ecPublicKey))
-        {
-            return new JCEECPublicKey(info);
-        }
-        else if (algOid.equals(CryptoProObjectIdentifiers.gostR3410_94))
-        {
-            return new JDKGOST3410PublicKey(info);
-        }
-        else if (algOid.equals(CryptoProObjectIdentifiers.gostR3410_2001))
-        {
-            return new JCEECPublicKey(info);
-        }
+        // BEGIN android-removed
+        // else if (algOid.equals(X9ObjectIdentifiers.id_ecPublicKey))
+        // {
+        //     return new JCEECPublicKey(info);
+        // }
+        // else if (algOid.equals(CryptoProObjectIdentifiers.gostR3410_94))
+        // {
+        //     return new JDKGOST3410PublicKey(info);
+        // }
+        // else if (algOid.equals(CryptoProObjectIdentifiers.gostR3410_2001))
+        // {
+        //     return new JCEECPublicKey(info);
+        // }
         else
         {
             throw new RuntimeException("algorithm identifier " + algOid + " in key not recognised");
@@ -290,26 +307,30 @@
         {
               return new JCEDHPrivateKey(info);
         }
-        else if (algOid.equals(OIWObjectIdentifiers.elGamalAlgorithm))
-        {
-              return new JCEElGamalPrivateKey(info);
-        }
+        // BEGIN android-removed
+        // else if (algOid.equals(OIWObjectIdentifiers.elGamalAlgorithm))
+        // {
+        //       return new JCEElGamalPrivateKey(info);
+        // }
+        // END android-removed
         else if (algOid.equals(X9ObjectIdentifiers.id_dsa))
         {
               return new JDKDSAPrivateKey(info);
         }
-        else if (algOid.equals(X9ObjectIdentifiers.id_ecPublicKey))
-        {
-              return new JCEECPrivateKey(info);
-        }
-        else if (algOid.equals(CryptoProObjectIdentifiers.gostR3410_94))
-        {
-              return new JDKGOST3410PrivateKey(info);
-        }
-        else if (algOid.equals(CryptoProObjectIdentifiers.gostR3410_2001))
-        {
-              return new JCEECPrivateKey(info);
-        }
+        // BEGIN android-removed
+        // else if (algOid.equals(X9ObjectIdentifiers.id_ecPublicKey))
+        // {
+        //       return new JCEECPrivateKey(info);
+        // }
+        // else if (algOid.equals(CryptoProObjectIdentifiers.gostR3410_94))
+        // {
+        //       return new JDKGOST3410PrivateKey(info);
+        // }
+        // else if (algOid.equals(CryptoProObjectIdentifiers.gostR3410_2001))
+        // {
+        //       return new JCEECPrivateKey(info);
+        // }
+        // END android-removed
         else
         {
             throw new RuntimeException("algorithm identifier " + algOid + " in key not recognised");
@@ -440,89 +461,92 @@
         }
     }
 
-    public static class GOST3410
-        extends JDKKeyFactory
-    {
-        public GOST3410()
-        {
-        }
-        
-        protected PrivateKey engineGeneratePrivate(
-                KeySpec    keySpec)
-        throws InvalidKeySpecException
-        {
-            if (keySpec instanceof GOST3410PrivateKeySpec)
-            {
-                return new JDKGOST3410PrivateKey((GOST3410PrivateKeySpec)keySpec);
-            }
-
-            return super.engineGeneratePrivate(keySpec);
-        }
-        
-        protected PublicKey engineGeneratePublic(
-                KeySpec    keySpec)
-        throws InvalidKeySpecException
-        {
-            if (keySpec instanceof GOST3410PublicKeySpec)
-            {
-                return new JDKGOST3410PublicKey((GOST3410PublicKeySpec)keySpec);
-            }
-
-            return super.engineGeneratePublic(keySpec);
-        }
-    }
-    
-    public static class ElGamal
-        extends JDKKeyFactory
-    {
-        public ElGamal()
-        {
-            elGamalFactory = true;
-        }
-
-        protected PrivateKey engineGeneratePrivate(
-            KeySpec    keySpec)
-            throws InvalidKeySpecException
-        {
-            if (keySpec instanceof ElGamalPrivateKeySpec)
-            {
-                return new JCEElGamalPrivateKey((ElGamalPrivateKeySpec)keySpec);
-            }
-            else if (keySpec instanceof DHPrivateKeySpec)
-            {
-                return new JCEElGamalPrivateKey((DHPrivateKeySpec)keySpec);
-            }
-
-            return super.engineGeneratePrivate(keySpec);
-        }
+    // BEGIN android-removed
+    // public static class GOST3410
+    //     extends JDKKeyFactory
+    // {
+    //     public GOST3410()
+    //     {
+    //     }
+    //
+    //     protected PrivateKey engineGeneratePrivate(
+    //             KeySpec    keySpec)
+    //     throws InvalidKeySpecException
+    //     {
+    //         if (keySpec instanceof GOST3410PrivateKeySpec)
+    //         {
+    //             return new JDKGOST3410PrivateKey((GOST3410PrivateKeySpec)keySpec);
+    //         }
+    //
+    //         return super.engineGeneratePrivate(keySpec);
+    //     }
+    //
+    //     protected PublicKey engineGeneratePublic(
+    //             KeySpec    keySpec)
+    //     throws InvalidKeySpecException
+    //     {
+    //         if (keySpec instanceof GOST3410PublicKeySpec)
+    //         {
+    //             return new JDKGOST3410PublicKey((GOST3410PublicKeySpec)keySpec);
+    //         }
+    //
+    //         return super.engineGeneratePublic(keySpec);
+    //     }
+    // }
     
-        protected PublicKey engineGeneratePublic(
-            KeySpec    keySpec)
-            throws InvalidKeySpecException
-        {
-            if (keySpec instanceof ElGamalPublicKeySpec)
-            {
-                return new JCEElGamalPublicKey((ElGamalPublicKeySpec)keySpec);
-            }
-            else if (keySpec instanceof DHPublicKeySpec)
-            {
-                return new JCEElGamalPublicKey((DHPublicKeySpec)keySpec);
-            }
-
-            return super.engineGeneratePublic(keySpec);
-        }
-    }
-
-
-    /**
-     * This isn't really correct, however the class path project API seems to think such
-     * a key factory will exist.
-     */
-    public static class X509
-        extends JDKKeyFactory
-    {
-        public X509()
-        {
-        }
-    }
+    // public static class ElGamal
+    //     extends JDKKeyFactory
+    // {
+    //     public ElGamal()
+    //     {
+    //         elGamalFactory = true;
+    //     }
+    //
+    //     protected PrivateKey engineGeneratePrivate(
+    //         KeySpec    keySpec)
+    //         throws InvalidKeySpecException
+    //     {
+    //         if (keySpec instanceof ElGamalPrivateKeySpec)
+    //         {
+    //             return new JCEElGamalPrivateKey((ElGamalPrivateKeySpec)keySpec);
+    //         }
+    //         else if (keySpec instanceof DHPrivateKeySpec)
+    //         {
+    //             return new JCEElGamalPrivateKey((DHPrivateKeySpec)keySpec);
+    //         }
+    //
+    //         return super.engineGeneratePrivate(keySpec);
+    //     }
+    //
+    //     protected PublicKey engineGeneratePublic(
+    //         KeySpec    keySpec)
+    //         throws InvalidKeySpecException
+    //     {
+    //         if (keySpec instanceof ElGamalPublicKeySpec)
+    //         {
+    //             return new JCEElGamalPublicKey((ElGamalPublicKeySpec)keySpec);
+    //         }
+    //         else if (keySpec instanceof DHPublicKeySpec)
+    //         {
+    //             return new JCEElGamalPublicKey((DHPublicKeySpec)keySpec);
+    //         }
+    //
+    //         return super.engineGeneratePublic(keySpec);
+    //     }
+    // }
+    //
+    //
+    //
+    // /**
+    //  * This isn't really correct, however the class path project API seems to think such
+    //  * a key factory will exist.
+    //  */
+    // public static class X509
+    //     extends JDKKeyFactory
+    // {
+    //     public X509()
+    //     {
+    //     }
+    // }
+    // END android-removed
 }
diff -Naur bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/JDKKeyPairGenerator.java bcprov-jdk16-145/org/bouncycastle/jce/provider/JDKKeyPairGenerator.java
--- bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/JDKKeyPairGenerator.java	2010-01-11 21:46:14.000000000 +0000
+++ bcprov-jdk16-145/org/bouncycastle/jce/provider/JDKKeyPairGenerator.java	2011-09-01 17:21:06.000000000 +0000
@@ -6,9 +6,11 @@
 import org.bouncycastle.crypto.generators.DHParametersGenerator;
 import org.bouncycastle.crypto.generators.DSAKeyPairGenerator;
 import org.bouncycastle.crypto.generators.DSAParametersGenerator;
-import org.bouncycastle.crypto.generators.ElGamalKeyPairGenerator;
-import org.bouncycastle.crypto.generators.ElGamalParametersGenerator;
-import org.bouncycastle.crypto.generators.GOST3410KeyPairGenerator;
+// BEGIN android-removed
+// import org.bouncycastle.crypto.generators.ElGamalKeyPairGenerator;
+// import org.bouncycastle.crypto.generators.ElGamalParametersGenerator;
+// import org.bouncycastle.crypto.generators.GOST3410KeyPairGenerator;
+// END android-removed
 import org.bouncycastle.crypto.generators.RSAKeyPairGenerator;
 import org.bouncycastle.crypto.params.DHKeyGenerationParameters;
 import org.bouncycastle.crypto.params.DHParameters;
@@ -18,20 +20,24 @@
 import org.bouncycastle.crypto.params.DSAParameters;
 import org.bouncycastle.crypto.params.DSAPrivateKeyParameters;
 import org.bouncycastle.crypto.params.DSAPublicKeyParameters;
-import org.bouncycastle.crypto.params.ElGamalKeyGenerationParameters;
-import org.bouncycastle.crypto.params.ElGamalParameters;
-import org.bouncycastle.crypto.params.ElGamalPrivateKeyParameters;
-import org.bouncycastle.crypto.params.ElGamalPublicKeyParameters;
-import org.bouncycastle.crypto.params.GOST3410KeyGenerationParameters;
-import org.bouncycastle.crypto.params.GOST3410Parameters;
-import org.bouncycastle.crypto.params.GOST3410PrivateKeyParameters;
-import org.bouncycastle.crypto.params.GOST3410PublicKeyParameters;
+// BEGIN android-removed
+// import org.bouncycastle.crypto.params.ElGamalKeyGenerationParameters;
+// import org.bouncycastle.crypto.params.ElGamalParameters;
+// import org.bouncycastle.crypto.params.ElGamalPrivateKeyParameters;
+// import org.bouncycastle.crypto.params.ElGamalPublicKeyParameters;
+// import org.bouncycastle.crypto.params.GOST3410KeyGenerationParameters;
+// import org.bouncycastle.crypto.params.GOST3410Parameters;
+// import org.bouncycastle.crypto.params.GOST3410PrivateKeyParameters;
+// import org.bouncycastle.crypto.params.GOST3410PublicKeyParameters;
+// END android-removed
 import org.bouncycastle.crypto.params.RSAKeyGenerationParameters;
 import org.bouncycastle.crypto.params.RSAKeyParameters;
 import org.bouncycastle.crypto.params.RSAPrivateCrtKeyParameters;
-import org.bouncycastle.jce.spec.ElGamalParameterSpec;
-import org.bouncycastle.jce.spec.GOST3410ParameterSpec;
-import org.bouncycastle.jce.spec.GOST3410PublicKeyParameterSetSpec;
+// BEGIN android-removed
+// import org.bouncycastle.jce.spec.ElGamalParameterSpec;
+// import org.bouncycastle.jce.spec.GOST3410ParameterSpec;
+// import org.bouncycastle.jce.spec.GOST3410PublicKeyParameterSetSpec;
+// END android-removed
 
 import java.math.BigInteger;
 import java.security.InvalidAlgorithmParameterException;
@@ -163,7 +169,9 @@
         {
             if (!initialised)
             {
-                Integer paramStrength = new Integer(strength);
+                // BEGIN android-changed
+                Integer paramStrength = Integer.valueOf(strength);
+                // END android-changed
 
                 if (params.containsKey(paramStrength))
                 {
@@ -260,139 +268,143 @@
         }
     }
 
-    public static class ElGamal
-        extends JDKKeyPairGenerator
-    {
-        ElGamalKeyGenerationParameters  param;
-        ElGamalKeyPairGenerator         engine = new ElGamalKeyPairGenerator();
-        int                             strength = 1024;
-        int                             certainty = 20;
-        SecureRandom                    random = new SecureRandom();
-        boolean                         initialised = false;
-
-        public ElGamal()
-        {
-            super("ElGamal");
-        }
-
-        public void initialize(
-            int             strength,
-            SecureRandom    random)
-        {
-            this.strength = strength;
-            this.random = random;
-        }
-
-        public void initialize(
-            AlgorithmParameterSpec  params,
-            SecureRandom            random)
-            throws InvalidAlgorithmParameterException
-        {
-            if (!(params instanceof ElGamalParameterSpec) && !(params instanceof DHParameterSpec))
-            {
-                throw new InvalidAlgorithmParameterException("parameter object not a DHParameterSpec or an ElGamalParameterSpec");
-            }
-            
-            if (params instanceof ElGamalParameterSpec)
-            {
-                ElGamalParameterSpec     elParams = (ElGamalParameterSpec)params;
-
-                param = new ElGamalKeyGenerationParameters(random, new ElGamalParameters(elParams.getP(), elParams.getG()));
-            }
-            else
-            {
-                DHParameterSpec     dhParams = (DHParameterSpec)params;
-
-                param = new ElGamalKeyGenerationParameters(random, new ElGamalParameters(dhParams.getP(), dhParams.getG(), dhParams.getL()));
-            }
-
-            engine.init(param);
-            initialised = true;
-        }
-
-        public KeyPair generateKeyPair()
-        {
-            if (!initialised)
-            {
-                ElGamalParametersGenerator   pGen = new ElGamalParametersGenerator();
-
-                pGen.init(strength, certainty, random);
-                param = new ElGamalKeyGenerationParameters(random, pGen.generateParameters());
-                engine.init(param);
-                initialised = true;
-            }
-
-            AsymmetricCipherKeyPair         pair = engine.generateKeyPair();
-            ElGamalPublicKeyParameters      pub = (ElGamalPublicKeyParameters)pair.getPublic();
-            ElGamalPrivateKeyParameters     priv = (ElGamalPrivateKeyParameters)pair.getPrivate();
-
-            return new KeyPair(new JCEElGamalPublicKey(pub),
-                               new JCEElGamalPrivateKey(priv));
-        }
-    }
-
-    public static class GOST3410
-        extends JDKKeyPairGenerator
-    {
-        GOST3410KeyGenerationParameters param;
-        GOST3410KeyPairGenerator        engine = new GOST3410KeyPairGenerator();
-        GOST3410ParameterSpec           gost3410Params;
-        int                             strength = 1024;
-        SecureRandom                    random = null;
-        boolean                         initialised = false;
-
-        public GOST3410()
-        {
-            super("GOST3410");
-        }
-
-        public void initialize(
-            int             strength,
-            SecureRandom    random)
-        {
-            this.strength = strength;
-            this.random = random;
-        }
-    
-        private void init(
-            GOST3410ParameterSpec gParams,
-            SecureRandom          random)
-        {
-            GOST3410PublicKeyParameterSetSpec spec = gParams.getPublicKeyParameters();
-            
-            param = new GOST3410KeyGenerationParameters(random, new GOST3410Parameters(spec.getP(), spec.getQ(), spec.getA()));
-            
-            engine.init(param);
-            
-            initialised = true;
-            gost3410Params = gParams;
-        }
-        
-        public void initialize(
-            AlgorithmParameterSpec  params,
-            SecureRandom            random)
-            throws InvalidAlgorithmParameterException
-        {
-            if (!(params instanceof GOST3410ParameterSpec))
-            {
-                throw new InvalidAlgorithmParameterException("parameter object not a GOST3410ParameterSpec");
-            }
-            
-            init((GOST3410ParameterSpec)params, random);
-        }
-
-        public KeyPair generateKeyPair()
-        {
-            if (!initialised)
-            {
-                init(new GOST3410ParameterSpec(CryptoProObjectIdentifiers.gostR3410_94_CryptoPro_A.getId()), new SecureRandom());
-            }
-            
-            AsymmetricCipherKeyPair   pair = engine.generateKeyPair();
-            GOST3410PublicKeyParameters  pub = (GOST3410PublicKeyParameters)pair.getPublic();
-            GOST3410PrivateKeyParameters priv = (GOST3410PrivateKeyParameters)pair.getPrivate();
-            
-            return new KeyPair(new JDKGOST3410PublicKey(pub, gost3410Params), new JDKGOST3410PrivateKey(priv, gost3410Params));
-        }
-   }
+    // BEGIN android-removed
+    // public static class ElGamal
+    //     extends JDKKeyPairGenerator
+    // {
+    //     ElGamalKeyGenerationParameters  param;
+    //     ElGamalKeyPairGenerator         engine = new ElGamalKeyPairGenerator();
+    //     int                             strength = 1024;
+    //     int                             certainty = 20;
+    //     SecureRandom                    random = new SecureRandom();
+    //     boolean                         initialised = false;
+    //
+    //     public ElGamal()
+    //     {
+    //         super("ElGamal");
+    //     }
+    //
+    //     public void initialize(
+    //         int             strength,
+    //         SecureRandom    random)
+    //     {
+    //         this.strength = strength;
+    //         this.random = random;
+    //     }
+    //
+    //     public void initialize(
+    //         AlgorithmParameterSpec  params,
+    //         SecureRandom            random)
+    //         throws InvalidAlgorithmParameterException
+    //     {
+    //         if (!(params instanceof ElGamalParameterSpec) && !(params instanceof DHParameterSpec))
+    //         {
+    //             throw new InvalidAlgorithmParameterException("parameter object not a DHParameterSpec or an ElGamalParameterSpec");
+    //         }
+    //
+    //         if (params instanceof ElGamalParameterSpec)
+    //         {
+    //             ElGamalParameterSpec     elParams = (ElGamalParameterSpec)params;
+
+    //             param = new ElGamalKeyGenerationParameters(random, new ElGamalParameters(elParams.getP(), elParams.getG()));
+    //         }
+    //         else
+    //         {
+    //             DHParameterSpec     dhParams = (DHParameterSpec)params;
+    //
+    //             param = new ElGamalKeyGenerationParameters(random, new ElGamalParameters(dhParams.getP(), dhParams.getG(), dhParams.getL()));
+    //         }
+    //
+    //         engine.init(param);
+    //         initialised = true;
+    //     }
+    //
+    //     public KeyPair generateKeyPair()
+    //     {
+    //         if (!initialised)
+    //         {
+    //             ElGamalParametersGenerator   pGen = new ElGamalParametersGenerator();
+    //
+    //             pGen.init(strength, certainty, random);
+    //             param = new ElGamalKeyGenerationParameters(random, pGen.generateParameters());
+    //             engine.init(param);
+    //             initialised = true;
+    //         }
+    //
+    //         AsymmetricCipherKeyPair         pair = engine.generateKeyPair();
+    //         ElGamalPublicKeyParameters      pub = (ElGamalPublicKeyParameters)pair.getPublic();
+    //         ElGamalPrivateKeyParameters     priv = (ElGamalPrivateKeyParameters)pair.getPrivate();
+    //
+    //         return new KeyPair(new JCEElGamalPublicKey(pub),
+    //                            new JCEElGamalPrivateKey(priv));
+    //     }
+    // }
+    // END android-removed
+
+   // BEGIN android-removed
+   //  public static class GOST3410
+   //      extends JDKKeyPairGenerator
+   //  {
+   //      GOST3410KeyGenerationParameters param;
+   //      GOST3410KeyPairGenerator        engine = new GOST3410KeyPairGenerator();
+   //      GOST3410ParameterSpec           gost3410Params;
+   //      int                             strength = 1024;
+   //      SecureRandom                    random = null;
+   //      boolean                         initialised = false;
+   //
+   //      public GOST3410()
+   //      {
+   //          super("GOST3410");
+   //      }
+   //
+   //      public void initialize(
+   //          int             strength,
+   //          SecureRandom    random)
+   //      {
+   //          this.strength = strength;
+   //          this.random = random;
+   //      }
+   //
+   //      private void init(
+   //          GOST3410ParameterSpec gParams,
+   //          SecureRandom          random)
+   //      {
+   //          GOST3410PublicKeyParameterSetSpec spec = gParams.getPublicKeyParameters();
+   //
+   //          param = new GOST3410KeyGenerationParameters(random, new GOST3410Parameters(spec.getP(), spec.getQ(), spec.getA()));
+   //
+   //          engine.init(param);
+   //
+   //          initialised = true;
+   //          gost3410Params = gParams;
+   //      }
+   //
+   //      public void initialize(
+   //          AlgorithmParameterSpec  params,
+   //          SecureRandom            random)
+   //          throws InvalidAlgorithmParameterException
+   //      {
+   //          if (!(params instanceof GOST3410ParameterSpec))
+   //          {
+   //              throw new InvalidAlgorithmParameterException("parameter object not a GOST3410ParameterSpec");
+   //          }
+   //
+   //          init((GOST3410ParameterSpec)params, random);
+   //      }
+   //
+   //      public KeyPair generateKeyPair()
+   //      {
+   //          if (!initialised)
+   //          {
+   //              init(new GOST3410ParameterSpec(CryptoProObjectIdentifiers.gostR3410_94_CryptoPro_A.getId()), new SecureRandom());
+   //          }
+   //         
+   //          AsymmetricCipherKeyPair   pair = engine.generateKeyPair();
+   //          GOST3410PublicKeyParameters  pub = (GOST3410PublicKeyParameters)pair.getPublic();
+   //          GOST3410PrivateKeyParameters priv = (GOST3410PrivateKeyParameters)pair.getPrivate();
+   //
+   //          return new KeyPair(new JDKGOST3410PublicKey(pub, gost3410Params), new JDKGOST3410PrivateKey(priv, gost3410Params));
+   //      }
+   // }
+   // END android-removed
 }
diff -Naur bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/JDKKeyStore.java bcprov-jdk16-145/org/bouncycastle/jce/provider/JDKKeyStore.java
--- bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/JDKKeyStore.java	2010-01-11 21:46:14.000000000 +0000
+++ bcprov-jdk16-145/org/bouncycastle/jce/provider/JDKKeyStore.java	2011-09-01 17:21:06.000000000 +0000
@@ -39,7 +39,12 @@
 import org.bouncycastle.crypto.CipherParameters;
 import org.bouncycastle.crypto.Digest;
 import org.bouncycastle.crypto.PBEParametersGenerator;
-import org.bouncycastle.crypto.digests.SHA1Digest;
+// BEGIN android-added
+import org.bouncycastle.crypto.digests.OpenSSLDigest;
+// END android-added
+// BEGIN android-removed
+// import org.bouncycastle.crypto.digests.SHA1Digest;
+// END android-removed
 import org.bouncycastle.crypto.generators.PKCS12ParametersGenerator;
 import org.bouncycastle.crypto.io.DigestInputStream;
 import org.bouncycastle.crypto.io.DigestOutputStream;
@@ -442,6 +447,7 @@
         }
         catch (Exception e)
         {
+
             throw new IOException("Exception creating key: " + e.toString());
         }
     }
@@ -497,7 +503,13 @@
 
         if (entry == null)
         {
-            throw new KeyStoreException("no such entry as " + alias);
+            // BEGIN android-removed
+            // Only throw if there is a problem removing, not if missing
+            // throw new KeyStoreException("no such entry as " + alias);
+            // END android-removed
+            // BEGIN android-added
+            return;
+            // END android-added
         }
 
         table.remove(alias);
@@ -810,12 +822,16 @@
         //
         // we only do an integrity check if the password is provided.
         //
-        HMac hMac = new HMac(new SHA1Digest());
+        // BEGIN android-changed
+        HMac hMac = new HMac(new OpenSSLDigest.SHA1());
+        // END android-changed
         if (password != null && password.length != 0)
         {
             byte[] passKey = PBEParametersGenerator.PKCS12PasswordToBytes(password);
 
-            PBEParametersGenerator pbeGen = new PKCS12ParametersGenerator(new SHA1Digest());
+            // BEGIN android-changed
+            PBEParametersGenerator pbeGen = new PKCS12ParametersGenerator(new OpenSSLDigest.SHA1());
+            // END android-changed
             pbeGen.init(passKey, salt, iterationCount);
             CipherParameters macParams = pbeGen.generateDerivedMacParameters(hMac.getMacSize());
             Arrays.fill(passKey, (byte)0);
@@ -866,9 +882,11 @@
         dOut.write(salt);
         dOut.writeInt(iterationCount);
 
-        HMac                    hMac = new HMac(new SHA1Digest());
+        // BEGIN android-changed
+        HMac                    hMac = new HMac(new OpenSSLDigest.SHA1());
         MacOutputStream         mOut = new MacOutputStream(dOut, hMac);
-        PBEParametersGenerator  pbeGen = new PKCS12ParametersGenerator(new SHA1Digest());
+        PBEParametersGenerator  pbeGen = new PKCS12ParametersGenerator(new OpenSSLDigest.SHA1());
+        // END android-changed
         byte[]                  passKey = PBEParametersGenerator.PKCS12PasswordToBytes(password);
 
         pbeGen.init(passKey, salt, iterationCount);
@@ -956,7 +974,9 @@
             Cipher cipher = this.makePBECipher(cipherAlg, Cipher.DECRYPT_MODE, password, salt, iterationCount);
             CipherInputStream cIn = new CipherInputStream(dIn, cipher);
 
-            Digest dig = new SHA1Digest();
+            // BEGIN android-changed
+            Digest dig = new OpenSSLDigest.SHA1();
+            // END android-changed
             DigestInputStream  dgIn = new DigestInputStream(cIn, dig);
     
             this.loadStore(dgIn);
@@ -996,8 +1016,9 @@
             cipher = this.makePBECipher(STORE_CIPHER, Cipher.ENCRYPT_MODE, password, salt, iterationCount);
     
             CipherOutputStream  cOut = new CipherOutputStream(dOut, cipher);
-            DigestOutputStream  dgOut = new DigestOutputStream(cOut, new SHA1Digest());
-    
+            // BEGIN android-changed
+            DigestOutputStream  dgOut = new DigestOutputStream(cOut, new OpenSSLDigest.SHA1());
+            // END android-changed
             this.saveStore(dgOut);
     
             Digest  dig = dgOut.getDigest();
@@ -1009,5 +1030,5 @@
     
             cOut.close();
         }
-    }
+    }    
 }
diff -Naur bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/JDKMessageDigest.java bcprov-jdk16-145/org/bouncycastle/jce/provider/JDKMessageDigest.java
--- bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/JDKMessageDigest.java	2010-01-11 21:46:14.000000000 +0000
+++ bcprov-jdk16-145/org/bouncycastle/jce/provider/JDKMessageDigest.java	2011-09-01 17:21:06.000000000 +0000
@@ -57,36 +57,38 @@
         {
             super(new SHA1Digest());
         }
-
+    
         public Object clone()
             throws CloneNotSupportedException
         {
             SHA1 d = (SHA1)super.clone();
             d.digest = new SHA1Digest((SHA1Digest)digest);
-
-            return d;
-        }
-    }
-
-    static public class SHA224
-        extends JDKMessageDigest
-        implements Cloneable
-    {
-        public SHA224()
-        {
-            super(new SHA224Digest());
-        }
-
-        public Object clone()
-            throws CloneNotSupportedException
-        {
-            SHA224 d = (SHA224)super.clone();
-            d.digest = new SHA224Digest((SHA224Digest)digest);
-
+    
             return d;
         }
     }
-
+    
+    // BEGIN android-removed
+    // static public class SHA224
+    //     extends JDKMessageDigest
+    //     implements Cloneable
+    // {
+    //     public SHA224()
+    //     {
+    //         super(new SHA224Digest());
+    //     }
+    //
+    //     public Object clone()
+    //         throws CloneNotSupportedException
+    //     {
+    //         SHA224 d = (SHA224)super.clone();
+    //         d.digest = new SHA224Digest((SHA224Digest)digest);
+    //
+    //         return d;
+    //     }
+    // }
+    // END android-removed
+    
     static public class SHA256
         extends JDKMessageDigest
         implements Cloneable
@@ -95,13 +97,13 @@
         {
             super(new SHA256Digest());
         }
-
+    
         public Object clone()
             throws CloneNotSupportedException
         {
             SHA256 d = (SHA256)super.clone();
             d.digest = new SHA256Digest((SHA256Digest)digest);
-
+    
             return d;
         }
     }
@@ -144,43 +146,45 @@
         }
     }
 
-    static public class MD2
-        extends JDKMessageDigest
-        implements Cloneable
-    {
-        public MD2()
-        {
-            super(new MD2Digest());
-        }
-
-        public Object clone()
-            throws CloneNotSupportedException
-        {
-            MD2 d = (MD2)super.clone();
-            d.digest = new MD2Digest((MD2Digest)digest);
-
-            return d;
-        }
-    }
-
-    static public class MD4
-        extends JDKMessageDigest
-        implements Cloneable
-    {
-        public MD4()
-        {
-            super(new MD4Digest());
-        }
-
-        public Object clone()
-            throws CloneNotSupportedException
-        {
-            MD4 d = (MD4)super.clone();
-            d.digest = new MD4Digest((MD4Digest)digest);
-
-            return d;
-        }
-    }
+    // BEGIN android-removed
+    // static public class MD2
+    //     extends JDKMessageDigest
+    //     implements Cloneable
+    // {
+    //     public MD2()
+    //     {
+    //         super(new MD2Digest());
+    //     }
+    //
+    //     public Object clone()
+    //         throws CloneNotSupportedException
+    //     {
+    //         MD2 d = (MD2)super.clone();
+    //         d.digest = new MD2Digest((MD2Digest)digest);
+    //
+    //         return d;
+    //     }
+    // }
+    //
+    // static public class MD4
+    //     extends JDKMessageDigest
+    //     implements Cloneable
+    // {
+    //     public MD4()
+    //     {
+    //         super(new MD4Digest());
+    //     }
+    //
+    //     public Object clone()
+    //         throws CloneNotSupportedException
+    //     {
+    //         MD4 d = (MD4)super.clone();
+    //         d.digest = new MD4Digest((MD4Digest)digest);
+    //
+    //         return d;
+    //     }
+    // }
+    // END android-removed
 
     static public class MD5
         extends JDKMessageDigest
@@ -190,147 +194,149 @@
         {
             super(new MD5Digest());
         }
-
+   
         public Object clone()
             throws CloneNotSupportedException
         {
             MD5 d = (MD5)super.clone();
             d.digest = new MD5Digest((MD5Digest)digest);
-
-            return d;
-        }
-    }
-
-    static public class RIPEMD128
-        extends JDKMessageDigest
-        implements Cloneable
-    {
-        public RIPEMD128()
-        {
-            super(new RIPEMD128Digest());
-        }
-
-        public Object clone()
-            throws CloneNotSupportedException
-        {
-            RIPEMD128 d = (RIPEMD128)super.clone();
-            d.digest = new RIPEMD128Digest((RIPEMD128Digest)digest);
-
+   
             return d;
         }
     }
 
-    static public class RIPEMD160
-        extends JDKMessageDigest
-        implements Cloneable
-    {
-        public RIPEMD160()
-        {
-            super(new RIPEMD160Digest());
-        }
-
-        public Object clone()
-            throws CloneNotSupportedException
-        {
-            RIPEMD160 d = (RIPEMD160)super.clone();
-            d.digest = new RIPEMD160Digest((RIPEMD160Digest)digest);
-
-            return d;
-        }
-    }
-    
-    static public class RIPEMD256
-        extends JDKMessageDigest
-        implements Cloneable
-    {
-        public RIPEMD256()
-        {
-            super(new RIPEMD256Digest());
-        }
-
-        public Object clone()
-            throws CloneNotSupportedException
-        {
-            RIPEMD256 d = (RIPEMD256)super.clone();
-            d.digest = new RIPEMD256Digest((RIPEMD256Digest)digest);
-
-            return d;
-        }
-    }
-    
-    static public class RIPEMD320
-        extends JDKMessageDigest
-        implements Cloneable
-    {
-        public RIPEMD320()
-        {
-            super(new RIPEMD320Digest());
-        }
-
-        public Object clone()
-            throws CloneNotSupportedException
-        {
-            RIPEMD320 d = (RIPEMD320)super.clone();
-            d.digest = new RIPEMD320Digest((RIPEMD320Digest)digest);
-
-            return d;
-        }
-    }
-    
-    static public class Tiger
-        extends JDKMessageDigest
-        implements Cloneable
-    {
-        public Tiger()
-        {
-            super(new TigerDigest());
-        }
-
-        public Object clone()
-            throws CloneNotSupportedException
-        {
-            Tiger d = (Tiger)super.clone();
-            d.digest = new TigerDigest((TigerDigest)digest);
-
-            return d;
-        }
-    }
-    
-    static public class GOST3411
-        extends JDKMessageDigest
-        implements Cloneable
-    {
-        public GOST3411()
-        {
-            super(new GOST3411Digest());
-        }
-    
-        public Object clone()
-        throws CloneNotSupportedException
-        {
-            GOST3411 d = (GOST3411)super.clone();
-            d.digest = new GOST3411Digest((GOST3411Digest)digest);
-
-            return d;
-        }
-    }
-    
-    static public class Whirlpool
-       extends JDKMessageDigest
-       implements Cloneable
-    {
-        public Whirlpool()
-        {
-            super(new WhirlpoolDigest());
-        }
-        
-        public Object clone()
-        throws CloneNotSupportedException
-        {
-            Whirlpool d = (Whirlpool)super.clone();
-            d.digest = new WhirlpoolDigest((WhirlpoolDigest)digest);
-            
-            return d;
-        }
-    }
+    // BEGIN android-removed
+    // static public class RIPEMD128
+    //     extends JDKMessageDigest
+    //     implements Cloneable
+    // {
+    //     public RIPEMD128()
+    //     {
+    //         super(new RIPEMD128Digest());
+    //     }
+    //
+    //     public Object clone()
+    //         throws CloneNotSupportedException
+    //     {
+    //         RIPEMD128 d = (RIPEMD128)super.clone();
+    //         d.digest = new RIPEMD128Digest((RIPEMD128Digest)digest);
+    //
+    //         return d;
+    //     }
+    // }
+    //
+    // static public class RIPEMD160
+    //     extends JDKMessageDigest
+    //     implements Cloneable
+    // {
+    //     public RIPEMD160()
+    //     {
+    //         super(new RIPEMD160Digest());
+    //     }
+    //
+    //     public Object clone()
+    //         throws CloneNotSupportedException
+    //     {
+    //         RIPEMD160 d = (RIPEMD160)super.clone();
+    //         d.digest = new RIPEMD160Digest((RIPEMD160Digest)digest);
+    //
+    //         return d;
+    //     }
+    // }
+    //   
+    // static public class RIPEMD256
+    //     extends JDKMessageDigest
+    //     implements Cloneable
+    // {
+    //     public RIPEMD256()
+    //     {
+    //         super(new RIPEMD256Digest());
+    //     }
+    //
+    //     public Object clone()
+    //         throws CloneNotSupportedException
+    //     {
+    //         RIPEMD256 d = (RIPEMD256)super.clone();
+    //         d.digest = new RIPEMD256Digest((RIPEMD256Digest)digest);
+    //
+    //         return d;
+    //     }
+    // }
+    //   
+    // static public class RIPEMD320
+    //     extends JDKMessageDigest
+    //     implements Cloneable
+    // {
+    //     public RIPEMD320()
+    //     {
+    //         super(new RIPEMD320Digest());
+    //     }
+    //
+    //     public Object clone()
+    //         throws CloneNotSupportedException
+    //     {
+    //         RIPEMD320 d = (RIPEMD320)super.clone();
+    //         d.digest = new RIPEMD320Digest((RIPEMD320Digest)digest);
+    //
+    //         return d;
+    //     }
+    // }
+    //   
+    // static public class Tiger
+    //     extends JDKMessageDigest
+    //     implements Cloneable
+    // {
+    //     public Tiger()
+    //     {
+    //         super(new TigerDigest());
+    //     }
+    //
+    //     public Object clone()
+    //         throws CloneNotSupportedException
+    //     {
+    //         Tiger d = (Tiger)super.clone();
+    //         d.digest = new TigerDigest((TigerDigest)digest);
+    //
+    //         return d;
+    //     }
+    // }
+    //   
+    // static public class GOST3411
+    //     extends JDKMessageDigest
+    //     implements Cloneable
+    // {
+    //     public GOST3411()
+    //     {
+    //         super(new GOST3411Digest());
+    //     }
+    //   
+    //     public Object clone()
+    //     throws CloneNotSupportedException
+    //     {
+    //         GOST3411 d = (GOST3411)super.clone();
+    //         d.digest = new GOST3411Digest((GOST3411Digest)digest);
+    //
+    //         return d;
+    //     }
+    // }
+    //   
+    // static public class Whirlpool
+    //    extends JDKMessageDigest
+    //    implements Cloneable
+    // {
+    //     public Whirlpool()
+    //     {
+    //         super(new WhirlpoolDigest());
+    //     }
+    //       
+    //     public Object clone()
+    //     throws CloneNotSupportedException
+    //     {
+    //         Whirlpool d = (Whirlpool)super.clone();
+    //         d.digest = new WhirlpoolDigest((WhirlpoolDigest)digest);
+    //           
+    //         return d;
+    //     }
+    // }
+    // END android-removed
 }
diff -Naur bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/JDKPKCS12KeyStore.java bcprov-jdk16-145/org/bouncycastle/jce/provider/JDKPKCS12KeyStore.java
--- bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/JDKPKCS12KeyStore.java	2010-01-11 21:46:14.000000000 +0000
+++ bcprov-jdk16-145/org/bouncycastle/jce/provider/JDKPKCS12KeyStore.java	2011-09-01 17:21:06.000000000 +0000
@@ -255,10 +255,13 @@
             }
         }
 
-        if (c == null && k == null)
-        {
-            throw new KeyStoreException("no such entry as " + alias);
-        }
+        // BEGIN android-removed
+        // Only throw if there is a problem removing, not if missing
+        // if (c == null && k == null)
+        // {
+        //     throw new KeyStoreException("no such entry as " + alias);
+        // }
+        // END android-removed
     }
 
     /**
@@ -433,6 +436,14 @@
     
     public Date engineGetCreationDate(String alias) 
     {
+        // BEGIN android-added
+        if (alias == null) {
+            throw new NullPointerException("alias == null");
+        }
+        if (keys.get(alias) == null && certs.get(alias) == null) {
+            return null;
+        }
+        // END android-added
         return new Date();
     }
 
@@ -491,6 +502,11 @@
         Certificate[]   chain) 
         throws KeyStoreException
     {
+        // BEGIN android-added
+        if (!(key instanceof PrivateKey)) {
+            throw new KeyStoreException("PKCS12 does not support non-PrivateKeys");
+        }
+        // END android-added
         if ((key instanceof PrivateKey) && (chain == null))
         {
             throw new KeyStoreException("no certificate chain for private key");
@@ -502,12 +518,18 @@
         }
 
         keys.put(alias, key);
+        // BEGIN android-added
+        if (chain != null) {
+        // END android-added
         certs.put(alias, chain[0]);
 
         for (int i = 0; i != chain.length; i++)
         {
             chainCerts.put(new CertId(chain[i].getPublicKey()), chain[i]);
         }
+        // BEGIN android-added
+        }
+        // END android-added
     }
 
     public int engineSize() 
@@ -1434,7 +1456,9 @@
         {
             byte[] res = calculatePbeMac(id_SHA1, mSalt, itCount, password, false, data);
 
-            AlgorithmIdentifier     algId = new AlgorithmIdentifier(id_SHA1, new DERNull());
+            // BEGIN android-changed
+            AlgorithmIdentifier     algId = new AlgorithmIdentifier(id_SHA1, DERNull.INSTANCE);
+            // END android-changed
             DigestInfo              dInfo = new DigestInfo(algId, res);
 
             mData = new MacData(dInfo, mSalt, itCount);
@@ -1484,32 +1508,34 @@
         }
     }
 
-    public static class BCPKCS12KeyStore3DES
-        extends JDKPKCS12KeyStore
-    {
-        public BCPKCS12KeyStore3DES()
-        {
-            super(bcProvider, pbeWithSHAAnd3_KeyTripleDES_CBC, pbeWithSHAAnd3_KeyTripleDES_CBC);
-        }
-    }
-
-    public static class DefPKCS12KeyStore
-        extends JDKPKCS12KeyStore
-    {
-        public DefPKCS12KeyStore()
-        {
-            super(null, pbeWithSHAAnd3_KeyTripleDES_CBC, pbewithSHAAnd40BitRC2_CBC);
-        }
-    }
-
-    public static class DefPKCS12KeyStore3DES
-        extends JDKPKCS12KeyStore
-    {
-        public DefPKCS12KeyStore3DES()
-        {
-            super(null, pbeWithSHAAnd3_KeyTripleDES_CBC, pbeWithSHAAnd3_KeyTripleDES_CBC);
-        }
-    }
+    // BEGIN android-removed
+    // public static class BCPKCS12KeyStore3DES
+    //     extends JDKPKCS12KeyStore
+    // {
+    //     public BCPKCS12KeyStore3DES()
+    //     {
+    //         super(bcProvider, pbeWithSHAAnd3_KeyTripleDES_CBC, pbeWithSHAAnd3_KeyTripleDES_CBC);
+    //     }
+    // }
+    //
+    // public static class DefPKCS12KeyStore
+    //     extends JDKPKCS12KeyStore
+    // {
+    //     public DefPKCS12KeyStore()
+    //     {
+    //         super(null, pbeWithSHAAnd3_KeyTripleDES_CBC, pbewithSHAAnd40BitRC2_CBC);
+    //     }
+    // }
+    //
+    // public static class DefPKCS12KeyStore3DES
+    //     extends JDKPKCS12KeyStore
+    // {
+    //     public DefPKCS12KeyStore3DES()
+    //     {
+    //         super(null, pbeWithSHAAnd3_KeyTripleDES_CBC, pbeWithSHAAnd3_KeyTripleDES_CBC);
+    //     }
+    // }
+    // END android-removed
 
     private static class IgnoresCaseHashtable
     {
@@ -1518,7 +1544,7 @@
 
         public void put(String key, Object value)
         {
-            String lower = Strings.toLowerCase(key);
+            String lower = (key == null) ? null : Strings.toLowerCase(key);
             String k = (String)keys.get(lower);
             if (k != null)
             {
@@ -1536,7 +1562,9 @@
 
         public Object remove(String alias)
         {
-            String k = (String)keys.remove(Strings.toLowerCase(alias));
+            // BEGIN android-changed
+            String k = (String)keys.remove(alias == null ? null : Strings.toLowerCase(alias));
+            // END android-changed
             if (k == null)
             {
                 return null;
@@ -1547,7 +1575,9 @@
 
         public Object get(String alias)
         {
-            String k = (String)keys.get(Strings.toLowerCase(alias));
+            // BEGIN android-changed
+            String k = (String)keys.get(alias == null ? null : Strings.toLowerCase(alias));
+            // END android-changed
             if (k == null)
             {
                 return null;
diff -Naur bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/PBE.java bcprov-jdk16-145/org/bouncycastle/jce/provider/PBE.java
--- bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/PBE.java	2010-01-11 21:46:14.000000000 +0000
+++ bcprov-jdk16-145/org/bouncycastle/jce/provider/PBE.java	2011-09-01 17:21:06.000000000 +0000
@@ -7,12 +7,18 @@
 
 import org.bouncycastle.crypto.CipherParameters;
 import org.bouncycastle.crypto.PBEParametersGenerator;
-import org.bouncycastle.crypto.digests.MD2Digest;
+// BEGIN android-removed
+// import org.bouncycastle.crypto.digests.MD2Digest;
+// END android-removed
 import org.bouncycastle.crypto.digests.MD5Digest;
-import org.bouncycastle.crypto.digests.RIPEMD160Digest;
+// BEGIN android-removed
+// import org.bouncycastle.crypto.digests.RIPEMD160Digest;
+// END android-removed
 import org.bouncycastle.crypto.digests.SHA1Digest;
 import org.bouncycastle.crypto.digests.SHA256Digest;
-import org.bouncycastle.crypto.digests.TigerDigest;
+// BEGIN android-removed
+// import org.bouncycastle.crypto.digests.TigerDigest;
+// END android-removed
 import org.bouncycastle.crypto.generators.OpenSSLPBEParametersGenerator;
 import org.bouncycastle.crypto.generators.PKCS12ParametersGenerator;
 import org.bouncycastle.crypto.generators.PKCS5S1ParametersGenerator;
@@ -53,9 +59,11 @@
             {
                 switch (hash)
                 {
-                case MD2:
-                    generator = new PKCS5S1ParametersGenerator(new MD2Digest());
-                    break;
+                // BEGIN android-removed
+                // case MD2:
+                //     generator = new PKCS5S1ParametersGenerator(new MD2Digest());
+                //     break;
+                // END android-removed
                 case MD5:
                     generator = new PKCS5S1ParametersGenerator(new MD5Digest());
                     break;
@@ -74,21 +82,25 @@
             {
                 switch (hash)
                 {
-                case MD2:
-                    generator = new PKCS12ParametersGenerator(new MD2Digest());
-                    break;
+                // BEGIN android-removed
+                // case MD2:
+                //     generator = new PKCS12ParametersGenerator(new MD2Digest());
+                //     break;
+                // END android-removed
                 case MD5:
                     generator = new PKCS12ParametersGenerator(new MD5Digest());
                     break;
                 case SHA1:
                     generator = new PKCS12ParametersGenerator(new SHA1Digest());
                     break;
-                case RIPEMD160:
-                    generator = new PKCS12ParametersGenerator(new RIPEMD160Digest());
-                    break;
-                case TIGER:
-                    generator = new PKCS12ParametersGenerator(new TigerDigest());
-                    break;
+                // BEGIN android-removed
+                // case RIPEMD160:
+                //     generator = new PKCS12ParametersGenerator(new RIPEMD160Digest());
+                //     break;
+                // case TIGER:
+                //     generator = new PKCS12ParametersGenerator(new TigerDigest());
+                //     break;
+                // END android-removed
                 case SHA256:
                     generator = new PKCS12ParametersGenerator(new SHA256Digest());
                     break;
diff -Naur bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/PKCS12BagAttributeCarrierImpl.java bcprov-jdk16-145/org/bouncycastle/jce/provider/PKCS12BagAttributeCarrierImpl.java
--- bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/PKCS12BagAttributeCarrierImpl.java	2010-01-11 21:46:14.000000000 +0000
+++ bcprov-jdk16-145/org/bouncycastle/jce/provider/PKCS12BagAttributeCarrierImpl.java	2011-09-01 17:21:06.000000000 +0000
@@ -1,6 +1,9 @@
 package org.bouncycastle.jce.provider;
 
 import org.bouncycastle.jce.interfaces.PKCS12BagAttributeCarrier;
+// BEGIN android-added
+import org.bouncycastle.asn1.OrderedTable;
+// END android-added
 import org.bouncycastle.asn1.DERObjectIdentifier;
 import org.bouncycastle.asn1.DEREncodable;
 import org.bouncycastle.asn1.ASN1OutputStream;
@@ -17,65 +20,73 @@
 class PKCS12BagAttributeCarrierImpl
     implements PKCS12BagAttributeCarrier
 {
-    private Hashtable pkcs12Attributes;
-    private Vector pkcs12Ordering;
-
-    PKCS12BagAttributeCarrierImpl(Hashtable attributes, Vector ordering)
-    {
-        this.pkcs12Attributes = attributes;
-        this.pkcs12Ordering = ordering;
-    }
+    // BEGIN android-changed
+    private OrderedTable pkcs12 = new OrderedTable();
+    // END android-changed
+
+    // BEGIN android-removed
+    // PKCS12BagAttributeCarrierImpl(Hashtable attributes, Vector ordering)
+    // {
+    //     this.pkcs12Attributes = attributes;
+    //     this.pkcs12Ordering = ordering;
+    // }
+    // END android-removed
 
     public PKCS12BagAttributeCarrierImpl()
     {
-        this(new Hashtable(), new Vector());
+        // BEGIN android-removed
+        // this(new Hashtable(), new Vector());
+        // END android-removed
     }
 
     public void setBagAttribute(
         DERObjectIdentifier oid,
         DEREncodable        attribute)
     {
-        if (pkcs12Attributes.containsKey(oid))
-        {                           // preserve original ordering
-            pkcs12Attributes.put(oid, attribute);
-        }
-        else
-        {
-            pkcs12Attributes.put(oid, attribute);
-            pkcs12Ordering.addElement(oid);
-        }
+        // BEGIN android-changed
+        // preserve original ordering
+        pkcs12.put(oid, attribute);
+        // END android-changed
     }
 
     public DEREncodable getBagAttribute(
         DERObjectIdentifier oid)
     {
-        return (DEREncodable)pkcs12Attributes.get(oid);
+        // BEGIN android-changed
+        return (DEREncodable)pkcs12.get(oid);
+        // END android-changed
     }
 
     public Enumeration getBagAttributeKeys()
     {
-        return pkcs12Ordering.elements();
+        // BEGIN android-changed
+        return pkcs12.getKeys();
+        // END android-changed
     }
 
     int size()
     {
-        return pkcs12Ordering.size();
-    }
-
-    Hashtable getAttributes()
-    {
-        return pkcs12Attributes;
-    }
-
-    Vector getOrdering()
-    {
-        return pkcs12Ordering;
-    }
+        // BEGIN android-changed
+        return pkcs12.size();
+        // END android-changed
+    }
+
+    // BEGIN android-removed
+    // Hashtable getAttributes()
+    // {
+    //     return pkcs12Attributes;
+    // }
+    //
+    // Vector getOrdering()
+    // {
+    //     return pkcs12Ordering;
+    // }
+    // END android-removed
 
     public void writeObject(ObjectOutputStream out)
         throws IOException
     {
-        if (pkcs12Ordering.size() == 0)
+        if (pkcs12.size() == 0)
         {
             out.writeObject(new Hashtable());
             out.writeObject(new Vector());
@@ -92,7 +103,7 @@
                 DERObjectIdentifier    oid = (DERObjectIdentifier)e.nextElement();
 
                 aOut.writeObject(oid);
-                aOut.writeObject(pkcs12Attributes.get(oid));
+                aOut.writeObject(pkcs12.get(oid));
             }
 
             out.writeObject(bOut.toByteArray());
@@ -106,8 +117,11 @@
 
         if (obj instanceof Hashtable)
         {
-            this.pkcs12Attributes = (Hashtable)obj;
-            this.pkcs12Ordering = (Vector)in.readObject();
+            // BEGIN android-changed
+            // we only write out Hashtable/Vector in empty case
+            in.readObject(); // consume empty Vector
+            this.pkcs12 = new OrderedTable();
+            // END android-changed
         }
         else
         {
diff -Naur bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/PKIXCertPath.java bcprov-jdk16-145/org/bouncycastle/jce/provider/PKIXCertPath.java
--- bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/PKIXCertPath.java	2010-01-11 21:46:14.000000000 +0000
+++ bcprov-jdk16-145/org/bouncycastle/jce/provider/PKIXCertPath.java	2011-09-01 17:21:06.000000000 +0000
@@ -33,7 +33,9 @@
 import org.bouncycastle.asn1.pkcs.ContentInfo;
 import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
 import org.bouncycastle.asn1.pkcs.SignedData;
-import org.bouncycastle.openssl.PEMWriter;
+// BEGIN android-removed
+// import org.bouncycastle.openssl.PEMWriter;
+// END android-removed
 
 /**
  * CertPath implementation for X.509 certificates.
@@ -295,27 +297,29 @@
             return toDEREncoded(new ContentInfo(
                     PKCSObjectIdentifiers.signedData, sd));
         }
-        else if (encoding.equalsIgnoreCase("PEM"))
-        {
-            ByteArrayOutputStream bOut = new ByteArrayOutputStream();
-            PEMWriter             pWrt = new PEMWriter(new OutputStreamWriter(bOut));
-
-            try
-            {
-                for (int i = 0; i != certificates.size(); i++)
-                {
-                    pWrt.writeObject(certificates.get(i));
-                }
-            
-                pWrt.close();
-            }
-            catch (Exception e)
-            {
-                throw new CertificateEncodingException("can't encode certificate for PEM encoded path");
-            }
-
-            return bOut.toByteArray();
-        }
+        // BEGIN android-removed
+        // else if (encoding.equalsIgnoreCase("PEM"))
+        // {
+        //     ByteArrayOutputStream bOut = new ByteArrayOutputStream();
+        //     PEMWriter             pWrt = new PEMWriter(new OutputStreamWriter(bOut));
+        //
+        //     try
+        //     {
+        //         for (int i = 0; i != certificates.size(); i++)
+        //         {
+        //             pWrt.writeObject(certificates.get(i));
+        //         }
+        //     
+        //         pWrt.close();
+        //     }
+        //     catch (Exception e)
+        //     {
+        //         throw new CertificateEncodingException("can't encode certificate for PEM encoded path");
+        //     }
+        //
+        //     return bOut.toByteArray();
+        // }
+        // END android-removed
         else
         {
             throw new CertificateEncodingException("unsupported encoding: " + encoding);
diff -Naur bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/PKIXCertPathBuilderSpi.java bcprov-jdk16-145/org/bouncycastle/jce/provider/PKIXCertPathBuilderSpi.java
--- bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/PKIXCertPathBuilderSpi.java	2010-01-11 21:46:14.000000000 +0000
+++ bcprov-jdk16-145/org/bouncycastle/jce/provider/PKIXCertPathBuilderSpi.java	2011-09-01 17:21:06.000000000 +0000
@@ -172,8 +172,9 @@
         try
         {
             // check whether the issuer of <tbvCert> is a TrustAnchor
-            if (CertPathValidatorUtilities.findTrustAnchor(tbvCert, pkixParams.getTrustAnchors(),
-                pkixParams.getSigProvider()) != null)
+            // BEGIN android-changed
+            if (CertPathValidatorUtilities.findTrustAnchor(tbvCert, pkixParams) != null)
+                // END android-changed
             {
                 // exception message from possibly later tried certification
                 // chains
diff -Naur bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/PKIXCertPathValidatorSpi.java bcprov-jdk16-145/org/bouncycastle/jce/provider/PKIXCertPathValidatorSpi.java
--- bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/PKIXCertPathValidatorSpi.java	2010-01-11 21:46:14.000000000 +0000
+++ bcprov-jdk16-145/org/bouncycastle/jce/provider/PKIXCertPathValidatorSpi.java	2011-09-01 17:21:06.000000000 +0000
@@ -1,5 +1,8 @@
 package org.bouncycastle.jce.provider;
 
+// BEGIN android-added
+import java.math.BigInteger;
+// END android-added
 import java.security.InvalidAlgorithmParameterException;
 import java.security.PublicKey;
 import java.security.cert.CertPath;
@@ -13,6 +16,7 @@
 import java.security.cert.TrustAnchor;
 import java.security.cert.X509Certificate;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
@@ -20,9 +24,17 @@
 
 import javax.security.auth.x500.X500Principal;
 
+// BEGIN android-added
+import org.apache.harmony.xnet.provider.jsse.IndexedPKIXParameters;
+
+// END android-added
 import org.bouncycastle.asn1.DEREncodable;
 import org.bouncycastle.asn1.DERObjectIdentifier;
 import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
+// BEGIN android-added
+import org.bouncycastle.crypto.Digest;
+import org.bouncycastle.crypto.digests.OpenSSLDigest;
+// END android-added
 import org.bouncycastle.jce.exception.ExtCertPathValidatorException;
 import org.bouncycastle.x509.ExtendedPKIXParameters;
 
@@ -33,6 +45,55 @@
 public class PKIXCertPathValidatorSpi
         extends CertPathValidatorSpi
 {
+    // BEGIN android-added
+
+    // From http://src.chromium.org/viewvc/chrome/trunk/src/net/base/x509_certificate.cc?revision=78748&view=markup
+    private static final Set<BigInteger> SERIAL_BLACKLIST = new HashSet<BigInteger>(Arrays.asList(
+        // Not a real certificate. For testing only.
+        new BigInteger(1, new byte[] {(byte)0x07,(byte)0x7a,(byte)0x59,(byte)0xbc,(byte)0xd5,(byte)0x34,(byte)0x59,(byte)0x60,(byte)0x1c,(byte)0xa6,(byte)0x90,(byte)0x72,(byte)0x67,(byte)0xa6,(byte)0xdd,(byte)0x1c}),
+
+        new BigInteger(1, new byte[] {(byte)0x04,(byte)0x7e,(byte)0xcb,(byte)0xe9,(byte)0xfc,(byte)0xa5,(byte)0x5f,(byte)0x7b,(byte)0xd0,(byte)0x9e,(byte)0xae,(byte)0x36,(byte)0xe1,(byte)0x0c,(byte)0xae,(byte)0x1e}),
+        new BigInteger(1, new byte[] {(byte)0xd8,(byte)0xf3,(byte)0x5f,(byte)0x4e,(byte)0xb7,(byte)0x87,(byte)0x2b,(byte)0x2d,(byte)0xab,(byte)0x06,(byte)0x92,(byte)0xe3,(byte)0x15,(byte)0x38,(byte)0x2f,(byte)0xb0}),
+        new BigInteger(1, new byte[] {(byte)0xb0,(byte)0xb7,(byte)0x13,(byte)0x3e,(byte)0xd0,(byte)0x96,(byte)0xf9,(byte)0xb5,(byte)0x6f,(byte)0xae,(byte)0x91,(byte)0xc8,(byte)0x74,(byte)0xbd,(byte)0x3a,(byte)0xc0}),
+        new BigInteger(1, new byte[] {(byte)0x92,(byte)0x39,(byte)0xd5,(byte)0x34,(byte)0x8f,(byte)0x40,(byte)0xd1,(byte)0x69,(byte)0x5a,(byte)0x74,(byte)0x54,(byte)0x70,(byte)0xe1,(byte)0xf2,(byte)0x3f,(byte)0x43}),
+        new BigInteger(1, new byte[] {(byte)0xe9,(byte)0x02,(byte)0x8b,(byte)0x95,(byte)0x78,(byte)0xe4,(byte)0x15,(byte)0xdc,(byte)0x1a,(byte)0x71,(byte)0x0a,(byte)0x2b,(byte)0x88,(byte)0x15,(byte)0x44,(byte)0x47}),
+        new BigInteger(1, new byte[] {(byte)0xd7,(byte)0x55,(byte)0x8f,(byte)0xda,(byte)0xf5,(byte)0xf1,(byte)0x10,(byte)0x5b,(byte)0xb2,(byte)0x13,(byte)0x28,(byte)0x2b,(byte)0x70,(byte)0x77,(byte)0x29,(byte)0xa3}),
+        new BigInteger(1, new byte[] {(byte)0xf5,(byte)0xc8,(byte)0x6a,(byte)0xf3,(byte)0x61,(byte)0x62,(byte)0xf1,(byte)0x3a,(byte)0x64,(byte)0xf5,(byte)0x4f,(byte)0x6d,(byte)0xc9,(byte)0x58,(byte)0x7c,(byte)0x06}),
+        new BigInteger(1, new byte[] {(byte)0x39,(byte)0x2a,(byte)0x43,(byte)0x4f,(byte)0x0e,(byte)0x07,(byte)0xdf,(byte)0x1f,(byte)0x8a,(byte)0xa3,(byte)0x05,(byte)0xde,(byte)0x34,(byte)0xe0,(byte)0xc2,(byte)0x29}),
+        new BigInteger(1, new byte[] {(byte)0x3e,(byte)0x75,(byte)0xce,(byte)0xd4,(byte)0x6b,(byte)0x69,(byte)0x30,(byte)0x21,(byte)0x21,(byte)0x88,(byte)0x30,(byte)0xae,(byte)0x86,(byte)0xa8,(byte)0x2a,(byte)0x71})
+    ));
+
+    // From http://src.chromium.org/viewvc/chrome/branches/782/src/net/base/x509_certificate.cc?r1=98750&r2=98749&pathrev=98750
+    private static final byte[][] PUBLIC_KEY_SHA1_BLACKLIST = {
+        // C=NL, O=DigiNotar, CN=DigiNotar Root CA/emailAddress=info@diginotar.nl
+        {(byte)0x41, (byte)0x0f, (byte)0x36, (byte)0x36, (byte)0x32, (byte)0x58, (byte)0xf3, (byte)0x0b, (byte)0x34, (byte)0x7d,
+         (byte)0x12, (byte)0xce, (byte)0x48, (byte)0x63, (byte)0xe4, (byte)0x33, (byte)0x43, (byte)0x78, (byte)0x06, (byte)0xa8},
+        // Subject: CN=DigiNotar Cyber CA
+        // Issuer: CN=GTE CyberTrust Global Root
+        {(byte)0xba, (byte)0x3e, (byte)0x7b, (byte)0xd3, (byte)0x8c, (byte)0xd7, (byte)0xe1, (byte)0xe6, (byte)0xb9, (byte)0xcd,
+         (byte)0x4c, (byte)0x21, (byte)0x99, (byte)0x62, (byte)0xe5, (byte)0x9d, (byte)0x7a, (byte)0x2f, (byte)0x4e, (byte)0x37},
+        // Subject: CN=DigiNotar Services 1024 CA
+        // Issuer: CN=Entrust.net
+        {(byte)0xe2, (byte)0x3b, (byte)0x8d, (byte)0x10, (byte)0x5f, (byte)0x87, (byte)0x71, (byte)0x0a, (byte)0x68, (byte)0xd9,
+         (byte)0x24, (byte)0x80, (byte)0x50, (byte)0xeb, (byte)0xef, (byte)0xc6, (byte)0x27, (byte)0xbe, (byte)0x4c, (byte)0xa6},
+    };
+
+    private static boolean isPublicKeyBlackListed(PublicKey publicKey) {
+        byte[] encoded = publicKey.getEncoded();
+        Digest digest = new OpenSSLDigest.SHA1();
+        digest.update(encoded, 0, encoded.length);
+        byte[] out = new byte[digest.getDigestSize()];
+        digest.doFinal(out, 0);
+
+        for (byte[] sha1 : PUBLIC_KEY_SHA1_BLACKLIST) {
+            if (Arrays.equals(out, sha1)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    // END android-added
 
     public CertPathValidatorResult engineValidate(
             CertPath certPath,
@@ -46,6 +107,18 @@
                     + " instance.");
         }
 
+        // BEGIN android-added
+        IndexedPKIXParameters indexedParams;
+        if (params instanceof IndexedPKIXParameters)
+        {
+            indexedParams = (IndexedPKIXParameters)params;
+        }
+        else
+        {
+            indexedParams = null;
+        }
+
+        // END android-added
         ExtendedPKIXParameters paramsPKIX;
         if (params instanceof ExtendedPKIXParameters)
         {
@@ -75,6 +148,22 @@
         {
             throw new CertPathValidatorException("Certification path is empty.", null, certPath, 0);
         }
+        // BEGIN android-added
+        {
+            X509Certificate cert = (X509Certificate) certs.get(0);
+
+            if (cert != null) {
+                BigInteger serial = cert.getSerialNumber();
+                if (serial != null && SERIAL_BLACKLIST.contains(serial)) {
+                    // emulate CRL exception message in RFC3280CertPathUtilities.checkCRLs
+                    String message = "Certificate revocation of serial 0x" + serial.toString(16);
+                    System.out.println(message);
+                    AnnotatedException e = new AnnotatedException(message);
+                    throw new CertPathValidatorException(e.getMessage(), e, certPath, 0);
+                }
+            }
+        }
+        // END android-added
 
         //
         // (b)
@@ -90,10 +179,15 @@
         // (d)
         // 
         TrustAnchor trust;
+        // BEGIN android-added
+        X509Certificate lastCert = (X509Certificate) certs.get(certs.size() - 1);
+        // END android-added
         try
         {
-            trust = CertPathValidatorUtilities.findTrustAnchor((X509Certificate) certs.get(certs.size() - 1),
-                    paramsPKIX.getTrustAnchors(), paramsPKIX.getSigProvider());
+            // BEGIN android-changed
+            trust = CertPathValidatorUtilities.findTrustAnchor(lastCert,
+                    indexedParams != null ? indexedParams : paramsPKIX);
+            // END android-changed
         }
         catch (AnnotatedException e)
         {
@@ -189,12 +283,25 @@
         X500Principal workingIssuerName;
 
         X509Certificate sign = trust.getTrustedCert();
+        // BEGIN android-added
+        boolean trustAnchorInChain = false;
+        // END android-added
         try
         {
             if (sign != null)
             {
                 workingIssuerName = CertPathValidatorUtilities.getSubjectPrincipal(sign);
                 workingPublicKey = sign.getPublicKey();
+                // BEGIN android-added
+                // There is similar code in CertPathValidatorUtilities.
+                try {
+                    byte[] trustBytes = sign.getEncoded();
+                    byte[] certBytes = lastCert.getEncoded();
+                    trustAnchorInChain = Arrays.equals(trustBytes, certBytes);
+                } catch(Exception e) {
+                    // ignore, continue with trustAnchorInChain being false
+                }
+                // END android-added
             }
             else
             {
@@ -251,6 +358,15 @@
 
         for (index = certs.size() - 1; index >= 0; index--)
         {
+            // BEGIN android-added
+            if (isPublicKeyBlackListed(workingPublicKey)) {
+                // emulate CRL exception message in RFC3280CertPathUtilities.checkCRLs
+                String message = "Certificate revocation of public key " + workingPublicKey;
+                System.out.println(message);
+                AnnotatedException e = new AnnotatedException(message);
+                throw new CertPathValidatorException(e.getMessage(), e, certPath, index);
+            }
+            // END android-added
             // try
             // {
             //
@@ -271,8 +387,10 @@
             // 6.1.3
             //
 
+            // BEGIN android-changed
             RFC3280CertPathUtilities.processCertA(certPath, paramsPKIX, index, workingPublicKey,
-                verificationAlreadyPerformed, workingIssuerName, sign);
+                verificationAlreadyPerformed, workingIssuerName, sign, i, trustAnchorInChain);
+            // END android-changed
 
             RFC3280CertPathUtilities.processCertBC(certPath, index, nameConstraintValidator);
 
@@ -289,11 +407,18 @@
 
             if (i != n)
             {
+                // BEGIN android-added
+                if (!(i == 1 && trustAnchorInChain)) // if not at the root certificate
+                {
+                // END android-added
                 if (cert != null && cert.getVersion() == 1)
                 {
                     throw new CertPathValidatorException("Version 1 certificates can't be used as CA ones.", null,
                             certPath, index);
                 }
+                // BEGIN android-added
+                }
+                // END android-added
 
                 RFC3280CertPathUtilities.prepareNextCertA(certPath, index);
 
@@ -317,7 +442,9 @@
                 inhibitAnyPolicy = RFC3280CertPathUtilities.prepareNextCertJ(certPath, index, inhibitAnyPolicy);
 
                 // (k)
-                RFC3280CertPathUtilities.prepareNextCertK(certPath, index);
+                // BEGIN android-changed
+                RFC3280CertPathUtilities.prepareNextCertK(certPath, index, i, trustAnchorInChain);
+                // END android-changed
 
                 // (l)
                 maxPathLength = RFC3280CertPathUtilities.prepareNextCertL(certPath, index, maxPathLength);
diff -Naur bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/PKIXNameConstraintValidator.java bcprov-jdk16-145/org/bouncycastle/jce/provider/PKIXNameConstraintValidator.java
--- bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/PKIXNameConstraintValidator.java	2010-01-11 21:46:14.000000000 +0000
+++ bcprov-jdk16-145/org/bouncycastle/jce/provider/PKIXNameConstraintValidator.java	2011-09-01 17:21:06.000000000 +0000
@@ -1533,7 +1533,9 @@
         for (Enumeration e = permitted.getObjects(); e.hasMoreElements();)
         {
             GeneralSubtree subtree = GeneralSubtree.getInstance(e.nextElement());
-            Integer tagNo = new Integer(subtree.getBase().getTagNo());
+            // BEGIN android-changed
+            Integer tagNo = Integer.valueOf(subtree.getBase().getTagNo());
+            // END android-changed
             if (subtreesMap.get(tagNo) == null)
             {
                 subtreesMap.put(tagNo, new HashSet());
diff -Naur bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/ProviderUtil.java bcprov-jdk16-145/org/bouncycastle/jce/provider/ProviderUtil.java
--- bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/ProviderUtil.java	2010-01-11 21:46:14.000000000 +0000
+++ bcprov-jdk16-145/org/bouncycastle/jce/provider/ProviderUtil.java	2011-09-01 17:21:06.000000000 +0000
@@ -1,9 +1,13 @@
 package org.bouncycastle.jce.provider;
 
 import org.bouncycastle.jce.ProviderConfigurationPermission;
-import org.bouncycastle.jce.provider.asymmetric.ec.EC5Util;
+// BEGIN android-removed
+// import org.bouncycastle.jce.provider.asymmetric.ec.EC5Util;
+// END android-removed
 import org.bouncycastle.jce.interfaces.ConfigurableProvider;
-import org.bouncycastle.jce.spec.ECParameterSpec;
+// BEGIN android-removed
+// import org.bouncycastle.jce.spec.ECParameterSpec;
+// END android-removed
 
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
@@ -20,68 +24,74 @@
                                                    "BC", ConfigurableProvider.EC_IMPLICITLY_CA);
 
     private static ThreadLocal threadSpec = new ThreadLocal();
-    private static volatile ECParameterSpec ecImplicitCaParams;
+    // BEGIN android-removed
+    // private static volatile ECParameterSpec ecImplicitCaParams;
+    // END android-removed
 
     static void setParameter(String parameterName, Object parameter)
     {
         SecurityManager securityManager = System.getSecurityManager();
 
-        if (parameterName.equals(ConfigurableProvider.THREAD_LOCAL_EC_IMPLICITLY_CA))
-        {
-            ECParameterSpec curveSpec;
-
-            if (securityManager != null)
-            {
-                securityManager.checkPermission(BC_EC_LOCAL_PERMISSION);
-            }
-
-            if (parameter instanceof ECParameterSpec || parameter == null)
-            {
-                curveSpec = (ECParameterSpec)parameter;
-            }
-            else  // assume java.security.spec
-            {
-                curveSpec = EC5Util.convertSpec((java.security.spec.ECParameterSpec)parameter, false);
-            }
-
-            if (curveSpec == null)
-            {
-                threadSpec.remove();
-            }
-            else
-            {
-                threadSpec.set(curveSpec);
-            }
-        }
-        else if (parameterName.equals(ConfigurableProvider.EC_IMPLICITLY_CA))
-        {
-            if (securityManager != null)
-            {
-                securityManager.checkPermission(BC_EC_PERMISSION);
-            }
-
-            if (parameter instanceof ECParameterSpec || parameter == null)
-            {
-                ecImplicitCaParams = (ECParameterSpec)parameter;
-            }
-            else  // assume java.security.spec
-            {
-                ecImplicitCaParams = EC5Util.convertSpec((java.security.spec.ECParameterSpec)parameter, false);
-            }
-        }
+        // BEGIN android-removed
+        // if (parameterName.equals(ConfigurableProvider.THREAD_LOCAL_EC_IMPLICITLY_CA))
+        // {
+        //     ECParameterSpec curveSpec;
+        //
+        //     if (securityManager != null)
+        //     {
+        //         securityManager.checkPermission(BC_EC_LOCAL_PERMISSION);
+        //     }
+        //
+        //     if (parameter instanceof ECParameterSpec || parameter == null)
+        //     {
+        //         curveSpec = (ECParameterSpec)parameter;
+        //     }
+        //     else  // assume java.security.spec
+        //     {
+        //         curveSpec = EC5Util.convertSpec((java.security.spec.ECParameterSpec)parameter, false);
+        //     }
+        //
+        //     if (curveSpec == null)
+        //     {
+        //         threadSpec.remove();
+        //     }
+        //     else
+        //     {
+        //         threadSpec.set(curveSpec);
+        //     }
+        // }
+        // else if (parameterName.equals(ConfigurableProvider.EC_IMPLICITLY_CA))
+        // {
+        //     if (securityManager != null)
+        //     {
+        //         securityManager.checkPermission(BC_EC_PERMISSION);
+        //     }
+        //
+        //     if (parameter instanceof ECParameterSpec || parameter == null)
+        //     {
+        //         ecImplicitCaParams = (ECParameterSpec)parameter;
+        //     }
+        //     else  // assume java.security.spec
+        //     {
+        //         ecImplicitCaParams = EC5Util.convertSpec((java.security.spec.ECParameterSpec)parameter, false);
+        //     }
+        // }
+        // END android-removed
     }
 
-    public static ECParameterSpec getEcImplicitlyCa()
-    {
-        ECParameterSpec spec = (ECParameterSpec)threadSpec.get();
-
-        if (spec != null)
-        {
-            return spec;
-        }
-
-        return ecImplicitCaParams;
-    }
+    // BEGIN android-removed
+    // public static ECParameterSpec getEcImplicitlyCa()
+    // {
+    //     ECParameterSpec spec = (ECParameterSpec)threadSpec.get();
+    //
+    //     if (spec != null)
+    //     {
+    //         return spec;
+    //     }
+    //
+    //     return ecImplicitCaParams;
+    // }
+    // END android-removed
 
     static int getReadLimit(InputStream in)
         throws IOException
diff -Naur bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/RFC3280CertPathUtilities.java bcprov-jdk16-145/org/bouncycastle/jce/provider/RFC3280CertPathUtilities.java
--- bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/RFC3280CertPathUtilities.java	2010-01-11 21:46:14.000000000 +0000
+++ bcprov-jdk16-145/org/bouncycastle/jce/provider/RFC3280CertPathUtilities.java	2011-09-01 17:21:06.000000000 +0000
@@ -1471,7 +1471,11 @@
         PublicKey workingPublicKey,
         boolean verificationAlreadyPerformed,
         X500Principal workingIssuerName,
-        X509Certificate sign)
+        X509Certificate sign,
+        // BEGIN android-added
+        int i, 
+        boolean trustAnchorInChain)
+        // END android-added
         throws ExtCertPathValidatorException
     {
         List certs = certPath.getCertificates();
@@ -1485,8 +1489,15 @@
             {
                 // (a) (1)
                 //
+                // BEGIN android-added
+                if (!(i == 1 && trustAnchorInChain)) // if not at the root certificate
+                {
+                // END android-added
                 CertPathValidatorUtilities.verifyX509Certificate(cert, workingPublicKey,
                     paramsPKIX.getSigProvider());
+                // BEGIN android-added
+                }
+                // END android-added
             }
             catch (GeneralSecurityException e)
             {
@@ -2077,7 +2088,11 @@
 
     protected static void prepareNextCertK(
         CertPath certPath,
-        int index)
+        int index,
+        // BEGIN android-added
+        int i, 
+        boolean trustAnchorInChain)
+        // END android-added
         throws CertPathValidatorException
     {
         List certs = certPath.getCertificates();
@@ -2105,7 +2120,14 @@
         }
         else
         {
+            // BEGIN android-added
+            if (!(i == 1 && trustAnchorInChain)) // if not at the root certificate
+            {
+            // END android-added
             throw new CertPathValidatorException("Intermediate certificate lacks BasicConstraints");
+            // BEGIN android-added
+            }
+            // END android-added
         }
     }
 
diff -Naur bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/WrapCipherSpi.java bcprov-jdk16-145/org/bouncycastle/jce/provider/WrapCipherSpi.java
--- bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/WrapCipherSpi.java	2010-01-11 21:46:14.000000000 +0000
+++ bcprov-jdk16-145/org/bouncycastle/jce/provider/WrapCipherSpi.java	2011-09-01 17:21:06.000000000 +0000
@@ -12,8 +12,10 @@
 import org.bouncycastle.crypto.Wrapper;
 import org.bouncycastle.crypto.engines.DESedeEngine;
 import org.bouncycastle.crypto.engines.DESedeWrapEngine;
-import org.bouncycastle.crypto.engines.RC2WrapEngine;
-import org.bouncycastle.crypto.engines.RFC3211WrapEngine;
+// BEGIN android-removed
+// import org.bouncycastle.crypto.engines.RC2WrapEngine;
+// import org.bouncycastle.crypto.engines.RFC3211WrapEngine;
+// END android-removed
 import org.bouncycastle.crypto.params.KeyParameter;
 import org.bouncycastle.crypto.params.ParametersWithIV;
 
@@ -25,8 +27,10 @@
 import javax.crypto.ShortBufferException;
 import javax.crypto.spec.IvParameterSpec;
 import javax.crypto.spec.PBEParameterSpec;
-import javax.crypto.spec.RC2ParameterSpec;
-import javax.crypto.spec.RC5ParameterSpec;
+// BEGIN android-removed
+// import javax.crypto.spec.RC2ParameterSpec;
+// import javax.crypto.spec.RC5ParameterSpec;
+// END android-removed
 import javax.crypto.spec.SecretKeySpec;
 import java.security.AlgorithmParameters;
 import java.security.InvalidAlgorithmParameterException;
@@ -52,8 +56,10 @@
                                     {
                                         IvParameterSpec.class,
                                         PBEParameterSpec.class,
-                                        RC2ParameterSpec.class,
-                                        RC5ParameterSpec.class
+                                        // BEGIN android-removed
+                                        // RC2ParameterSpec.class,
+                                        // RC5ParameterSpec.class
+                                        // END android-removed
                                     };
 
     protected int                     pbeType = PKCS12;
@@ -265,16 +271,19 @@
         return null;
     }
 
+    // BEGIN android-changed
+    // added ShortBufferException to throws statement
     protected int engineDoFinal(
         byte[]  input,
         int     inputOffset,
         int     inputLen,
         byte[]  output,
         int     outputOffset)
-        throws IllegalBlockSizeException, BadPaddingException
+        throws IllegalBlockSizeException, BadPaddingException, ShortBufferException
     {
         return 0;
     }
+    // END android-changed
 
     protected byte[] engineWrap(
         Key     key)
@@ -307,7 +316,12 @@
         byte[]  wrappedKey,
         String  wrappedKeyAlgorithm,
         int     wrappedKeyType)
-    throws InvalidKeyException
+    // BEGIN android-removed
+    // throws InvalidKeyException
+    // END android-removed
+    // BEGIN android-added
+    throws InvalidKeyException, NoSuchAlgorithmException
+    // END android-added
     {
         byte[] encoded;
         try
@@ -354,15 +368,20 @@
 
                 DERObjectIdentifier  oid = in.getAlgorithmId().getObjectId();
 
-                if (oid.equals(X9ObjectIdentifiers.id_ecPublicKey))
-                {
-                    privKey = new JCEECPrivateKey(in);
-                }
-                else if (oid.equals(CryptoProObjectIdentifiers.gostR3410_94))
-                {
-                    privKey = new JDKGOST3410PrivateKey(in);
-                }
-                else if (oid.equals(X9ObjectIdentifiers.id_dsa))
+                // BEGIN android-removed
+                // if (oid.equals(X9ObjectIdentifiers.id_ecPublicKey))
+                // {
+                //     privKey = new JCEECPrivateKey(in);
+                // }
+                // else if (oid.equals(CryptoProObjectIdentifiers.gostR3410_94))
+                // {
+                //     privKey = new JDKGOST3410PrivateKey(in);
+                // }
+                // else if (oid.equals(X9ObjectIdentifiers.id_dsa))
+                // END android-removed
+                // BEGIN android-added
+                if (oid.equals(X9ObjectIdentifiers.id_dsa))
+                // END android-added
                 {
                     privKey = new JDKDSAPrivateKey(in);
                 }
@@ -405,10 +424,12 @@
             {
                 throw new InvalidKeyException("Unknown key type " + e.getMessage());
             }
-            catch (NoSuchAlgorithmException e)
-            {
-                throw new InvalidKeyException("Unknown key type " + e.getMessage());
-            }
+            // BEGIN android-removed
+            // catch (NoSuchAlgorithmException e)
+            // {
+            //     throw new InvalidKeyException("Unknown key type " + e.getMessage());
+            // }
+            // END android-removed
             catch (InvalidKeySpecException e2)
             {
                 throw new InvalidKeyException("Unknown key type " + e2.getMessage());
@@ -433,21 +454,23 @@
         }
     }
 
-    public static class RC2Wrap
-        extends WrapCipherSpi
-    {
-        public RC2Wrap()
-        {
-            super(new RC2WrapEngine());
-        }
-    }
-
-    public static class RFC3211DESedeWrap
-        extends WrapCipherSpi
-    {
-        public RFC3211DESedeWrap()
-        {
-            super(new RFC3211WrapEngine(new DESedeEngine()), 8);
-        }
-    }
+    // BEGIN android-removed
+    // public static class RC2Wrap
+    //     extends WrapCipherSpi
+    // {
+    //     public RC2Wrap()
+    //     {
+    //         super(new RC2WrapEngine());
+    //     }
+    // }
+    //
+    // public static class RFC3211DESedeWrap
+    //     extends WrapCipherSpi
+    // {
+    //     public RFC3211DESedeWrap()
+    //     {
+    //         super(new RFC3211WrapEngine(new DESedeEngine()), 8);
+    //     }
+    // }
+    // END android-removed
 }
diff -Naur bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/X509CertificateObject.java bcprov-jdk16-145/org/bouncycastle/jce/provider/X509CertificateObject.java
--- bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/X509CertificateObject.java	2010-01-11 21:46:14.000000000 +0000
+++ bcprov-jdk16-145/org/bouncycastle/jce/provider/X509CertificateObject.java	2011-09-01 17:21:06.000000000 +0000
@@ -518,12 +518,20 @@
         return JDKKeyFactory.createPublicKeyFromPublicKeyInfo(c.getSubjectPublicKeyInfo());
     }
 
+    // BEGIN android-changed
+    private byte[] encoded;
+    // END android-changed
     public byte[] getEncoded()
         throws CertificateEncodingException
     {
         try
         {
-            return c.getEncoded(ASN1Encodable.DER);
+            // BEGIN android-changed
+            if (encoded == null) {
+                encoded = c.getEncoded(ASN1Encodable.DER);
+            }
+            return encoded;
+            // END android-changed
         }
         catch (IOException e)
         {
@@ -703,7 +711,7 @@
     {
         Signature   signature;
         String      sigName = X509SignatureUtil.getSignatureName(c.getSignatureAlgorithm());
-        
+
         try
         {
             signature = Signature.getInstance(sigName, "BC");
diff -Naur bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/X509SignatureUtil.java bcprov-jdk16-145/org/bouncycastle/jce/provider/X509SignatureUtil.java
--- bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/X509SignatureUtil.java	2010-01-11 21:46:14.000000000 +0000
+++ bcprov-jdk16-145/org/bouncycastle/jce/provider/X509SignatureUtil.java	2011-09-01 17:21:06.000000000 +0000
@@ -25,7 +25,9 @@
 
 class X509SignatureUtil
 {
-    private static final ASN1Null       derNull = new DERNull();
+    // BEGIN android-changed
+    private static final ASN1Null       derNull = DERNull.INSTANCE;
+    // END android-changed
     
     static void setSignatureParameters(
         Signature signature,
@@ -66,12 +68,14 @@
         
         if (params != null && !derNull.equals(params))
         {
-            if (sigAlgId.getObjectId().equals(PKCSObjectIdentifiers.id_RSASSA_PSS))
-            {
-                RSASSAPSSparams rsaParams = RSASSAPSSparams.getInstance(params);
-                
-                return getDigestAlgName(rsaParams.getHashAlgorithm().getObjectId()) + "withRSAandMGF1";
-            }
+            // BEGIN android-removed
+            // if (sigAlgId.getObjectId().equals(PKCSObjectIdentifiers.id_RSASSA_PSS))
+            // {
+            //     RSASSAPSSparams rsaParams = RSASSAPSSparams.getInstance(params);
+            //
+            //     return getDigestAlgName(rsaParams.getHashAlgorithm().getObjectId()) + "withRSAandMGF1";
+            // }
+            // END android-removed
             if (sigAlgId.getObjectId().equals(X9ObjectIdentifiers.ecdsa_with_SHA2))
             {
                 ASN1Sequence ecDsaParams = ASN1Sequence.getInstance(params);
@@ -98,10 +102,12 @@
         {
             return "SHA1";
         }
-        else if (NISTObjectIdentifiers.id_sha224.equals(digestAlgOID))
-        {
-            return "SHA224";
-        }
+        // BEGIN android-removed
+        // else if (NISTObjectIdentifiers.id_sha224.equals(digestAlgOID))
+        // {
+        //     return "SHA224";
+        // }
+        // END android-removed
         else if (NISTObjectIdentifiers.id_sha256.equals(digestAlgOID))
         {
             return "SHA256";
@@ -114,22 +120,24 @@
         {
             return "SHA512";
         }
-        else if (TeleTrusTObjectIdentifiers.ripemd128.equals(digestAlgOID))
-        {
-            return "RIPEMD128";
-        }
-        else if (TeleTrusTObjectIdentifiers.ripemd160.equals(digestAlgOID))
-        {
-            return "RIPEMD160";
-        }
-        else if (TeleTrusTObjectIdentifiers.ripemd256.equals(digestAlgOID))
-        {
-            return "RIPEMD256";
-        }
-        else if (CryptoProObjectIdentifiers.gostR3411.equals(digestAlgOID))
-        {
-            return "GOST3411";
-        }
+        // BEGIN android-removed
+        // else if (TeleTrusTObjectIdentifiers.ripemd128.equals(digestAlgOID))
+        // {
+        //     return "RIPEMD128";
+        // }
+        // else if (TeleTrusTObjectIdentifiers.ripemd160.equals(digestAlgOID))
+        // {
+        //     return "RIPEMD160";
+        // }
+        // else if (TeleTrusTObjectIdentifiers.ripemd256.equals(digestAlgOID))
+        // {
+        //     return "RIPEMD256";
+        // }
+        // else if (CryptoProObjectIdentifiers.gostR3411.equals(digestAlgOID))
+        // {
+        //     return "GOST3411";
+        // }
+        // END android-removed
         else
         {
             return digestAlgOID.getId();            
diff -Naur bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/symmetric/AES.java bcprov-jdk16-145/org/bouncycastle/jce/provider/symmetric/AES.java
--- bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/symmetric/AES.java	2010-01-11 21:46:14.000000000 +0000
+++ bcprov-jdk16-145/org/bouncycastle/jce/provider/symmetric/AES.java	2011-09-01 17:21:06.000000000 +0000
@@ -5,7 +5,9 @@
 import org.bouncycastle.crypto.engines.AESEngine;
 import org.bouncycastle.crypto.engines.AESFastEngine;
 import org.bouncycastle.crypto.engines.AESWrapEngine;
-import org.bouncycastle.crypto.engines.RFC3211WrapEngine;
+// BEGIN android-removed
+// import org.bouncycastle.crypto.engines.RFC3211WrapEngine;
+// END android-removed
 import org.bouncycastle.crypto.modes.CBCBlockCipher;
 import org.bouncycastle.crypto.modes.CFBBlockCipher;
 import org.bouncycastle.crypto.modes.OFBBlockCipher;
@@ -36,32 +38,34 @@
         }
     }
 
-    public static class CBC
-       extends JCEBlockCipher
-    {
-        public CBC()
-        {
-            super(new CBCBlockCipher(new AESFastEngine()), 128);
-        }
-    }
-
-    static public class CFB
-        extends JCEBlockCipher
-    {
-        public CFB()
-        {
-            super(new BufferedBlockCipher(new CFBBlockCipher(new AESFastEngine(), 128)), 128);
-        }
-    }
-
-    static public class OFB
-        extends JCEBlockCipher
-    {
-        public OFB()
-        {
-            super(new BufferedBlockCipher(new OFBBlockCipher(new AESFastEngine(), 128)), 128);
-        }
-    }
+    // BEGIN android-removed
+    // public static class CBC
+    //    extends JCEBlockCipher
+    // {
+    //     public CBC()
+    //     {
+    //         super(new CBCBlockCipher(new AESFastEngine()), 128);
+    //     }
+    // }
+    //
+    // static public class CFB
+    //     extends JCEBlockCipher
+    // {
+    //     public CFB()
+    //     {
+    //         super(new BufferedBlockCipher(new CFBBlockCipher(new AESFastEngine(), 128)), 128);
+    //     }
+    // }
+    //
+    // static public class OFB
+    //     extends JCEBlockCipher
+    // {
+    //     public OFB()
+    //     {
+    //         super(new BufferedBlockCipher(new OFBBlockCipher(new AESFastEngine(), 128)), 128);
+    //     }
+    // }
+    // END android-removed
 
     static public class Wrap
         extends WrapCipherSpi
@@ -72,14 +76,16 @@
         }
     }
 
-    public static class RFC3211Wrap
-        extends WrapCipherSpi
-    {
-        public RFC3211Wrap()
-        {
-            super(new RFC3211WrapEngine(new AESEngine()), 16);
-        }
-    }
+    // BEGIN android-removed
+    // public static class RFC3211Wrap
+    //     extends WrapCipherSpi
+    // {
+    //     public RFC3211Wrap()
+    //     {
+    //         super(new RFC3211WrapEngine(new AESEngine()), 16);
+    //     }
+    // }
+    // END android-removed
 
     public static class KeyGen
         extends JCEKeyGenerator
@@ -95,70 +101,72 @@
         }
     }
 
-    public static class KeyGen128
-        extends KeyGen
-    {
-        public KeyGen128()
-        {
-            super(128);
-        }
-    }
-
-    public static class KeyGen192
-        extends KeyGen
-    {
-        public KeyGen192()
-        {
-            super(192);
-        }
-    }
-
-    public static class KeyGen256
-        extends KeyGen
-    {
-        public KeyGen256()
-        {
-            super(256);
-        }
-    }
-
-    public static class AlgParamGen
-        extends JDKAlgorithmParameterGenerator
-    {
-        protected void engineInit(
-            AlgorithmParameterSpec genParamSpec,
-            SecureRandom random)
-            throws InvalidAlgorithmParameterException
-        {
-            throw new InvalidAlgorithmParameterException("No supported AlgorithmParameterSpec for AES parameter generation.");
-        }
-
-        protected AlgorithmParameters engineGenerateParameters()
-        {
-            byte[]  iv = new byte[16];
-
-            if (random == null)
-            {
-                random = new SecureRandom();
-            }
-
-            random.nextBytes(iv);
-
-            AlgorithmParameters params;
-
-            try
-            {
-                params = AlgorithmParameters.getInstance("AES", "BC");
-                params.init(new IvParameterSpec(iv));
-            }
-            catch (Exception e)
-            {
-                throw new RuntimeException(e.getMessage());
-            }
-
-            return params;
-        }
-    }
+    // BEGIN android-removed
+    // public static class KeyGen128
+    //     extends KeyGen
+    // {
+    //     public KeyGen128()
+    //     {
+    //         super(128);
+    //     }
+    // }
+    //
+    // public static class KeyGen192
+    //     extends KeyGen
+    // {
+    //     public KeyGen192()
+    //     {
+    //         super(192);
+    //     }
+    // }
+    //
+    // public static class KeyGen256
+    //     extends KeyGen
+    // {
+    //     public KeyGen256()
+    //     {
+    //         super(256);
+    //     }
+    // }
+    //
+    // public static class AlgParamGen
+    //     extends JDKAlgorithmParameterGenerator
+    // {
+    //     protected void engineInit(
+    //         AlgorithmParameterSpec genParamSpec,
+    //         SecureRandom random)
+    //         throws InvalidAlgorithmParameterException
+    //     {
+    //         throw new InvalidAlgorithmParameterException("No supported AlgorithmParameterSpec for AES parameter generation.");
+    //     }
+    //
+    //     protected AlgorithmParameters engineGenerateParameters()
+    //     {
+    //         byte[]  iv = new byte[16];
+    //
+    //         if (random == null)
+    //         {
+    //             random = new SecureRandom();
+    //         }
+    //
+    //         random.nextBytes(iv);
+    //
+    //         AlgorithmParameters params;
+    //
+    //         try
+    //         {
+    //             params = AlgorithmParameters.getInstance("AES", "BC");
+    //             params.init(new IvParameterSpec(iv));
+    //         }
+    //         catch (Exception e)
+    //         {
+    //             throw new RuntimeException(e.getMessage());
+    //         }
+    //
+    //         return params;
+    //     }
+    // }
+    // END android-removed
 
     public static class AlgParams
         extends JDKAlgorithmParameters.IVAlgorithmParameters
diff -Naur bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/symmetric/AESMappings.java bcprov-jdk16-145/org/bouncycastle/jce/provider/symmetric/AESMappings.java
--- bcprov-jdk16-145.orig/org/bouncycastle/jce/provider/symmetric/AESMappings.java	2010-01-11 21:46:14.000000000 +0000
+++ bcprov-jdk16-145/org/bouncycastle/jce/provider/symmetric/AESMappings.java	2011-09-01 17:21:06.000000000 +0000
@@ -26,55 +26,63 @@
         put("Alg.Alias.AlgorithmParameters." + NISTObjectIdentifiers.id_aes192_CBC, "AES");
         put("Alg.Alias.AlgorithmParameters." + NISTObjectIdentifiers.id_aes256_CBC, "AES");
 
-        put("AlgorithmParameterGenerator.AES", "org.bouncycastle.jce.provider.symmetric.AES$AlgParamGen");
-        put("Alg.Alias.AlgorithmParameterGenerator." + wrongAES128, "AES");
-        put("Alg.Alias.AlgorithmParameterGenerator." + wrongAES192, "AES");
-        put("Alg.Alias.AlgorithmParameterGenerator." + wrongAES256, "AES");
-        put("Alg.Alias.AlgorithmParameterGenerator." + NISTObjectIdentifiers.id_aes128_CBC, "AES");
-        put("Alg.Alias.AlgorithmParameterGenerator." + NISTObjectIdentifiers.id_aes192_CBC, "AES");
-        put("Alg.Alias.AlgorithmParameterGenerator." + NISTObjectIdentifiers.id_aes256_CBC, "AES");
+        // BEGIN android-removed
+        // put("AlgorithmParameterGenerator.AES", "org.bouncycastle.jce.provider.symmetric.AES$AlgParamGen");
+        // put("Alg.Alias.AlgorithmParameterGenerator." + wrongAES128, "AES");
+        // put("Alg.Alias.AlgorithmParameterGenerator." + wrongAES192, "AES");
+        // put("Alg.Alias.AlgorithmParameterGenerator." + wrongAES256, "AES");
+        // put("Alg.Alias.AlgorithmParameterGenerator." + NISTObjectIdentifiers.id_aes128_CBC, "AES");
+        // put("Alg.Alias.AlgorithmParameterGenerator." + NISTObjectIdentifiers.id_aes192_CBC, "AES");
+        // put("Alg.Alias.AlgorithmParameterGenerator." + NISTObjectIdentifiers.id_aes256_CBC, "AES");
+        // END android-removed
 
         put("Cipher.AES", "org.bouncycastle.jce.provider.symmetric.AES$ECB");
         put("Alg.Alias.Cipher." + wrongAES128, "AES");
         put("Alg.Alias.Cipher." + wrongAES192, "AES");
         put("Alg.Alias.Cipher." + wrongAES256, "AES");
-        put("Cipher." + NISTObjectIdentifiers.id_aes128_ECB, "org.bouncycastle.jce.provider.symmetric.AES$ECB");
-        put("Cipher." + NISTObjectIdentifiers.id_aes192_ECB, "org.bouncycastle.jce.provider.symmetric.AES$ECB");
-        put("Cipher." + NISTObjectIdentifiers.id_aes256_ECB, "org.bouncycastle.jce.provider.symmetric.AES$ECB");
-        put("Cipher." + NISTObjectIdentifiers.id_aes128_CBC, "org.bouncycastle.jce.provider.symmetric.AES$CBC");
-        put("Cipher." + NISTObjectIdentifiers.id_aes192_CBC, "org.bouncycastle.jce.provider.symmetric.AES$CBC");
-        put("Cipher." + NISTObjectIdentifiers.id_aes256_CBC, "org.bouncycastle.jce.provider.symmetric.AES$CBC");
-        put("Cipher." + NISTObjectIdentifiers.id_aes128_OFB, "org.bouncycastle.jce.provider.symmetric.AES$OFB");
-        put("Cipher." + NISTObjectIdentifiers.id_aes192_OFB, "org.bouncycastle.jce.provider.symmetric.AES$OFB");
-        put("Cipher." + NISTObjectIdentifiers.id_aes256_OFB, "org.bouncycastle.jce.provider.symmetric.AES$OFB");
-        put("Cipher." + NISTObjectIdentifiers.id_aes128_CFB, "org.bouncycastle.jce.provider.symmetric.AES$CFB");
-        put("Cipher." + NISTObjectIdentifiers.id_aes192_CFB, "org.bouncycastle.jce.provider.symmetric.AES$CFB");
-        put("Cipher." + NISTObjectIdentifiers.id_aes256_CFB, "org.bouncycastle.jce.provider.symmetric.AES$CFB");
+        // BEGIN android-changed
+        put("Alg.Alias.Cipher." + NISTObjectIdentifiers.id_aes128_ECB, "AES");
+        put("Alg.Alias.Cipher." + NISTObjectIdentifiers.id_aes192_ECB, "AES");
+        put("Alg.Alias.Cipher." + NISTObjectIdentifiers.id_aes256_ECB, "AES");
+        put("Alg.Alias.Cipher." + NISTObjectIdentifiers.id_aes128_CBC, "AES");
+        put("Alg.Alias.Cipher." + NISTObjectIdentifiers.id_aes192_CBC, "AES");
+        put("Alg.Alias.Cipher." + NISTObjectIdentifiers.id_aes256_CBC, "AES");
+        put("Alg.Alias.Cipher." + NISTObjectIdentifiers.id_aes128_OFB, "AES");
+        put("Alg.Alias.Cipher." + NISTObjectIdentifiers.id_aes192_OFB, "AES");
+        put("Alg.Alias.Cipher." + NISTObjectIdentifiers.id_aes256_OFB, "AES");
+        put("Alg.Alias.Cipher." + NISTObjectIdentifiers.id_aes128_CFB, "AES");
+        put("Alg.Alias.Cipher." + NISTObjectIdentifiers.id_aes192_CFB, "AES");
+        put("Alg.Alias.Cipher." + NISTObjectIdentifiers.id_aes256_CFB, "AES");
+        // END android-changed
         put("Cipher.AESWRAP", "org.bouncycastle.jce.provider.symmetric.AES$Wrap");
         put("Alg.Alias.Cipher." + NISTObjectIdentifiers.id_aes128_wrap, "AESWRAP");
         put("Alg.Alias.Cipher." + NISTObjectIdentifiers.id_aes192_wrap, "AESWRAP");
         put("Alg.Alias.Cipher." + NISTObjectIdentifiers.id_aes256_wrap, "AESWRAP");
-        put("Cipher.AESRFC3211WRAP", "org.bouncycastle.jce.provider.symmetric.AES$RFC3211Wrap");
+        // BEGIN android-removed
+        // put("Cipher.AESRFC3211WRAP", "org.bouncycastle.jce.provider.symmetric.AES$RFC3211Wrap");
+        // END android-removed
 
         put("KeyGenerator.AES", "org.bouncycastle.jce.provider.symmetric.AES$KeyGen");
-        put("KeyGenerator.2.16.840.1.101.3.4.2", "org.bouncycastle.jce.provider.symmetric.AES$KeyGen128");
-        put("KeyGenerator.2.16.840.1.101.3.4.22", "org.bouncycastle.jce.provider.symmetric.AES$KeyGen192");
-        put("KeyGenerator.2.16.840.1.101.3.4.42", "org.bouncycastle.jce.provider.symmetric.AES$KeyGen256");
-        put("KeyGenerator." + NISTObjectIdentifiers.id_aes128_ECB, "org.bouncycastle.jce.provider.symmetric.AES$KeyGen128");
-        put("KeyGenerator." + NISTObjectIdentifiers.id_aes128_CBC, "org.bouncycastle.jce.provider.symmetric.AES$KeyGen128");
-        put("KeyGenerator." + NISTObjectIdentifiers.id_aes128_OFB, "org.bouncycastle.jce.provider.symmetric.AES$KeyGen128");
-        put("KeyGenerator." + NISTObjectIdentifiers.id_aes128_CFB, "org.bouncycastle.jce.provider.symmetric.AES$KeyGen128");
-        put("KeyGenerator." + NISTObjectIdentifiers.id_aes192_ECB, "org.bouncycastle.jce.provider.symmetric.AES$KeyGen192");
-        put("KeyGenerator." + NISTObjectIdentifiers.id_aes192_CBC, "org.bouncycastle.jce.provider.symmetric.AES$KeyGen192");
-        put("KeyGenerator." + NISTObjectIdentifiers.id_aes192_OFB, "org.bouncycastle.jce.provider.symmetric.AES$KeyGen192");
-        put("KeyGenerator." + NISTObjectIdentifiers.id_aes192_CFB, "org.bouncycastle.jce.provider.symmetric.AES$KeyGen192");
-        put("KeyGenerator." + NISTObjectIdentifiers.id_aes256_ECB, "org.bouncycastle.jce.provider.symmetric.AES$KeyGen256");
-        put("KeyGenerator." + NISTObjectIdentifiers.id_aes256_CBC, "org.bouncycastle.jce.provider.symmetric.AES$KeyGen256");
-        put("KeyGenerator." + NISTObjectIdentifiers.id_aes256_OFB, "org.bouncycastle.jce.provider.symmetric.AES$KeyGen256");
-        put("KeyGenerator." + NISTObjectIdentifiers.id_aes256_CFB, "org.bouncycastle.jce.provider.symmetric.AES$KeyGen256");
-        put("KeyGenerator.AESWRAP", "org.bouncycastle.jce.provider.symmetric.AES$KeyGen");
-        put("KeyGenerator." + NISTObjectIdentifiers.id_aes128_wrap, "org.bouncycastle.jce.provider.symmetric.AES$KeyGen128");
-        put("KeyGenerator." + NISTObjectIdentifiers.id_aes192_wrap, "org.bouncycastle.jce.provider.symmetric.AES$KeyGen192");
-        put("KeyGenerator." + NISTObjectIdentifiers.id_aes256_wrap, "org.bouncycastle.jce.provider.symmetric.AES$KeyGen256");
+        // BEGIN android-removed
+        // put("KeyGenerator.2.16.840.1.101.3.4.2", "org.bouncycastle.jce.provider.symmetric.AES$KeyGen128");
+        // put("KeyGenerator.2.16.840.1.101.3.4.22", "org.bouncycastle.jce.provider.symmetric.AES$KeyGen192");
+        // put("KeyGenerator.2.16.840.1.101.3.4.42", "org.bouncycastle.jce.provider.symmetric.AES$KeyGen256");
+        // put("KeyGenerator." + NISTObjectIdentifiers.id_aes128_ECB, "org.bouncycastle.jce.provider.symmetric.AES$KeyGen128");
+        // put("KeyGenerator." + NISTObjectIdentifiers.id_aes128_CBC, "org.bouncycastle.jce.provider.symmetric.AES$KeyGen128");
+        // put("KeyGenerator." + NISTObjectIdentifiers.id_aes128_OFB, "org.bouncycastle.jce.provider.symmetric.AES$KeyGen128");
+        // put("KeyGenerator." + NISTObjectIdentifiers.id_aes128_CFB, "org.bouncycastle.jce.provider.symmetric.AES$KeyGen128");
+        // put("KeyGenerator." + NISTObjectIdentifiers.id_aes192_ECB, "org.bouncycastle.jce.provider.symmetric.AES$KeyGen192");
+        // put("KeyGenerator." + NISTObjectIdentifiers.id_aes192_CBC, "org.bouncycastle.jce.provider.symmetric.AES$KeyGen192");
+        // put("KeyGenerator." + NISTObjectIdentifiers.id_aes192_OFB, "org.bouncycastle.jce.provider.symmetric.AES$KeyGen192");
+        // put("KeyGenerator." + NISTObjectIdentifiers.id_aes192_CFB, "org.bouncycastle.jce.provider.symmetric.AES$KeyGen192");
+        // put("KeyGenerator." + NISTObjectIdentifiers.id_aes256_ECB, "org.bouncycastle.jce.provider.symmetric.AES$KeyGen256");
+        // put("KeyGenerator." + NISTObjectIdentifiers.id_aes256_CBC, "org.bouncycastle.jce.provider.symmetric.AES$KeyGen256");
+        // put("KeyGenerator." + NISTObjectIdentifiers.id_aes256_OFB, "org.bouncycastle.jce.provider.symmetric.AES$KeyGen256");
+        // put("KeyGenerator." + NISTObjectIdentifiers.id_aes256_CFB, "org.bouncycastle.jce.provider.symmetric.AES$KeyGen256");
+        // put("KeyGenerator.AESWRAP", "org.bouncycastle.jce.provider.symmetric.AES$KeyGen");
+        // put("KeyGenerator." + NISTObjectIdentifiers.id_aes128_wrap, "org.bouncycastle.jce.provider.symmetric.AES$KeyGen128");
+        // put("KeyGenerator." + NISTObjectIdentifiers.id_aes192_wrap, "org.bouncycastle.jce.provider.symmetric.AES$KeyGen192");
+        // put("KeyGenerator." + NISTObjectIdentifiers.id_aes256_wrap, "org.bouncycastle.jce.provider.symmetric.AES$KeyGen256");
+        // END android-removed
     }
 }
diff -Naur bcprov-jdk16-145.orig/org/bouncycastle/x509/X509Util.java bcprov-jdk16-145/org/bouncycastle/x509/X509Util.java
--- bcprov-jdk16-145.orig/org/bouncycastle/x509/X509Util.java	2010-01-11 21:46:14.000000000 +0000
+++ bcprov-jdk16-145/org/bouncycastle/x509/X509Util.java	2011-09-01 17:21:06.000000000 +0000
@@ -43,8 +43,10 @@
     
     static
     {   
-        algorithms.put("MD2WITHRSAENCRYPTION", PKCSObjectIdentifiers.md2WithRSAEncryption);
-        algorithms.put("MD2WITHRSA", PKCSObjectIdentifiers.md2WithRSAEncryption);
+        // BEGIN android-removed
+        // algorithms.put("MD2WITHRSAENCRYPTION", PKCSObjectIdentifiers.md2WithRSAEncryption);
+        // algorithms.put("MD2WITHRSA", PKCSObjectIdentifiers.md2WithRSAEncryption);
+        // END android-removed
         algorithms.put("MD5WITHRSAENCRYPTION", PKCSObjectIdentifiers.md5WithRSAEncryption);
         algorithms.put("MD5WITHRSA", PKCSObjectIdentifiers.md5WithRSAEncryption);
         algorithms.put("SHA1WITHRSAENCRYPTION", PKCSObjectIdentifiers.sha1WithRSAEncryption);
@@ -106,19 +108,29 @@
         //
         // explicit params
         //
-        AlgorithmIdentifier sha1AlgId = new AlgorithmIdentifier(OIWObjectIdentifiers.idSHA1, new DERNull());
+        // BEGIN android-changed
+        AlgorithmIdentifier sha1AlgId = new AlgorithmIdentifier(OIWObjectIdentifiers.idSHA1, DERNull.INSTANCE);
+        // END android-changed
         params.put("SHA1WITHRSAANDMGF1", creatPSSParams(sha1AlgId, 20));
 
-        AlgorithmIdentifier sha224AlgId = new AlgorithmIdentifier(NISTObjectIdentifiers.id_sha224, new DERNull());
+        // BEGIN android-changed
+        AlgorithmIdentifier sha224AlgId = new AlgorithmIdentifier(NISTObjectIdentifiers.id_sha224, DERNull.INSTANCE);
+        // END android-changed
         params.put("SHA224WITHRSAANDMGF1", creatPSSParams(sha224AlgId, 28));
 
-        AlgorithmIdentifier sha256AlgId = new AlgorithmIdentifier(NISTObjectIdentifiers.id_sha256, new DERNull());
+        // BEGIN android-changed
+        AlgorithmIdentifier sha256AlgId = new AlgorithmIdentifier(NISTObjectIdentifiers.id_sha256, DERNull.INSTANCE);
+        // END android-changed
         params.put("SHA256WITHRSAANDMGF1", creatPSSParams(sha256AlgId, 32));
 
-        AlgorithmIdentifier sha384AlgId = new AlgorithmIdentifier(NISTObjectIdentifiers.id_sha384, new DERNull());
+        // BEGIN android-changed
+        AlgorithmIdentifier sha384AlgId = new AlgorithmIdentifier(NISTObjectIdentifiers.id_sha384, DERNull.INSTANCE);
+        // END android-changed
         params.put("SHA384WITHRSAANDMGF1", creatPSSParams(sha384AlgId, 48));
 
-        AlgorithmIdentifier sha512AlgId = new AlgorithmIdentifier(NISTObjectIdentifiers.id_sha512, new DERNull());
+        // BEGIN android-changed
+        AlgorithmIdentifier sha512AlgId = new AlgorithmIdentifier(NISTObjectIdentifiers.id_sha512, DERNull.INSTANCE);
+        // END android-changed
         params.put("SHA512WITHRSAANDMGF1", creatPSSParams(sha512AlgId, 64));
     }
 
@@ -161,7 +173,9 @@
         }
         else
         {
-            return new AlgorithmIdentifier(sigOid, new DERNull());
+            // BEGIN android-changed
+            return new AlgorithmIdentifier(sigOid, DERNull.INSTANCE);
+            // END android-changed
         }
     }
     
diff -Naur bcprov-jdk16-145.orig/org/bouncycastle/x509/extension/X509ExtensionUtil.java bcprov-jdk16-145/org/bouncycastle/x509/extension/X509ExtensionUtil.java
--- bcprov-jdk16-145.orig/org/bouncycastle/x509/extension/X509ExtensionUtil.java	2010-01-11 21:46:14.000000000 +0000
+++ bcprov-jdk16-145/org/bouncycastle/x509/extension/X509ExtensionUtil.java	2011-09-01 17:21:06.000000000 +0000
@@ -62,7 +62,9 @@
             {
                 GeneralName genName = GeneralName.getInstance(it.nextElement());
                 List list = new ArrayList();
-                list.add(new Integer(genName.getTagNo()));
+                // BEGIN android-changed
+                list.add(Integer.valueOf(genName.getTagNo()));
+                // END android-changed
                 switch (genName.getTagNo())
                 {
                 case GeneralName.ediPartyName:
