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-03 18:19:15.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-03 18:19:15.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-03 18:19:15.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-03 18:19:15.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-03 18:19:15.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-03 18:19:15.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-03 18:19:15.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-03 18:19:15.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-03 18:19:15.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-03 18:19:15.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-03 18:19:15.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-03 18:19:15.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-03 18:19:15.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-03 18:19:15.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-03 18:19:15.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-03 18:19:15.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-03 18:19:15.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-03 18:19:15.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-03 18:19:15.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-03 18:19:15.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-03 18:19:15.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-03 18:19:15.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-03 18:19:15.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-03 18:19:15.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-03 18:19:15.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-03 18:19:15.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-03 18:19:15.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-03 18:19:15.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-03 18:19:15.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-03 18:19:15.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-03 18:19:15.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-03 18:19:15.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-03 18:19:15.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-03 18:19:15.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-03 18:19:15.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-03 18:19:15.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-03 18:19:15.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-03 18:19:15.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-03 18:19:15.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-03 18:19:15.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-03 18:19:15.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-03 18:19:15.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-03 18:19:15.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-03 18:19:15.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-03 18:19:15.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-03 18:19:15.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-03 18:19:15.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-03 18:19:15.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-03 18:19:15.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-03 18:19:15.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-03 18:19:15.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-03 18:19:15.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-03 18:19:15.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-03 18:19:15.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-03 18:19:15.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-03 18:19:15.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-03 18:19:15.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,63 @@
 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},
+        // Subject: CN=DigiNotar PKIoverheid CA Organisatie - G2
+        // Issuer: CN=Staat der Nederlanden Organisatie CA - G2
+        {(byte)0x7b, (byte)0x2e, (byte)0x16, (byte)0xbc, (byte)0x39, (byte)0xbc, (byte)0xd7, (byte)0x2b, (byte)0x45, (byte)0x6e,
+         (byte)0x9f, (byte)0x05, (byte)0x5d, (byte)0x1d, (byte)0xe6, (byte)0x15, (byte)0xb7, (byte)0x49, (byte)0x45, (byte)0xdb},
+        // Subject: CN=DigiNotar PKIoverheid CA Overheid en Bedrijven
+        // Issuer: CN=Staat der Nederlanden Overheid CA
+        {(byte)0xe8, (byte)0xf9, (byte)0x12, (byte)0x00, (byte)0xc6, (byte)0x5c, (byte)0xee, (byte)0x16, (byte)0xe0, (byte)0x39,
+         (byte)0xb9, (byte)0xf8, (byte)0x83, (byte)0x84, (byte)0x16, (byte)0x61, (byte)0x63, (byte)0x5f, (byte)0x81, (byte)0xc5},
+    };
+
+    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 +115,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 +156,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 +187,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 +291,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 +366,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 +395,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 +415,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 +450,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-03 18:19:15.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-03 18:19:15.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-03 18:19:15.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-03 18:19:15.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-03 18:19:15.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-03 18:19:15.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-03 18:19:15.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-03 18:19:15.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-03 18:19:15.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-03 18:19:15.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: