1diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/asn1/ASN1Null.java bcprov-jdk15on-147/org/bouncycastle/asn1/ASN1Null.java
2--- bcprov-jdk15on-147.orig/org/bouncycastle/asn1/ASN1Null.java	2012-03-22 15:11:48.000000000 +0000
3+++ bcprov-jdk15on-147/org/bouncycastle/asn1/ASN1Null.java	2012-09-19 21:17:12.000000000 +0000
4@@ -8,9 +8,11 @@
5 public abstract class ASN1Null
6     extends ASN1Primitive
7 {
8-    public ASN1Null()
9+    // BEGIN android-changed
10+    /*package*/ ASN1Null()
11     {
12     }
13+    // END android-changed
14 
15     public static ASN1Null getInstance(Object o)
16     {
17diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/asn1/DERBoolean.java bcprov-jdk15on-147/org/bouncycastle/asn1/DERBoolean.java
18--- bcprov-jdk15on-147.orig/org/bouncycastle/asn1/DERBoolean.java	2012-03-22 15:11:48.000000000 +0000
19+++ bcprov-jdk15on-147/org/bouncycastle/asn1/DERBoolean.java	2012-09-19 21:17:12.000000000 +0000
20@@ -10,7 +10,9 @@
21     private static final byte[] TRUE_VALUE = new byte[] { (byte)0xff };
22     private static final byte[] FALSE_VALUE = new byte[] { 0 };
23 
24-    private byte[]         value;
25+    // BEGIN android-changed
26+    final private byte[]         value;
27+    // END android-changed
28 
29     public static final ASN1Boolean FALSE = new ASN1Boolean(false);
30     public static final ASN1Boolean TRUE  = new ASN1Boolean(true);
31@@ -46,6 +48,17 @@
32         return (value ? TRUE : FALSE);
33     }
34 
35+    // BEGIN android-added
36+    /**
37+     * return a DERBoolean from the passed in array.
38+     */
39+    public static DERBoolean getInstance(
40+        byte[] octets)
41+    {
42+        return (octets[0] != 0) ? TRUE : FALSE;
43+    }
44+
45+    // END android-added
46     /**
47      * return a Boolean from a tagged object.
48      *
49@@ -71,7 +84,9 @@
50         }
51     }
52     
53-    DERBoolean(
54+    // BEGIN android-changed
55+    protected DERBoolean(
56+    // END android-changed
57         byte[]       value)
58     {
59         if (value.length != 1)
60@@ -93,8 +108,10 @@
61         }
62     }
63 
64-    public DERBoolean(
65+    // BEGIN android-changed
66+    protected DERBoolean(
67         boolean     value)
68+    // END android-changed
69     {
70         this.value = (value) ? TRUE_VALUE : FALSE_VALUE;
71     }
72diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/asn1/DERNull.java bcprov-jdk15on-147/org/bouncycastle/asn1/DERNull.java
73--- bcprov-jdk15on-147.orig/org/bouncycastle/asn1/DERNull.java	2012-03-22 15:11:48.000000000 +0000
74+++ bcprov-jdk15on-147/org/bouncycastle/asn1/DERNull.java	2012-09-19 21:17:12.000000000 +0000
75@@ -12,7 +12,9 @@
76 
77     private static final byte[]  zeroBytes = new byte[0];
78 
79-    public DERNull()
80+    // BEGIN android-changed
81+    protected DERNull()
82+    // END android-changed
83     {
84     }
85 
86diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/asn1/DERObjectIdentifier.java bcprov-jdk15on-147/org/bouncycastle/asn1/DERObjectIdentifier.java
87--- bcprov-jdk15on-147.orig/org/bouncycastle/asn1/DERObjectIdentifier.java	2012-03-22 15:11:48.000000000 +0000
88+++ bcprov-jdk15on-147/org/bouncycastle/asn1/DERObjectIdentifier.java	2012-09-19 21:17:12.000000000 +0000
89@@ -117,7 +117,13 @@
90             }
91         }
92 
93-        this.identifier = objId.toString();
94+        // BEGIN android-changed
95+        /*
96+         * Intern the identifier so there aren't hundreds of duplicates
97+         * (in practice).
98+         */
99+        this.identifier = objId.toString().intern();
100+        // END android-changed
101     }
102 
103     public DERObjectIdentifier(
104@@ -128,7 +134,13 @@
105             throw new IllegalArgumentException("string " + identifier + " not an OID");
106         }
107 
108-        this.identifier = identifier;
109+        // BEGIN android-changed
110+        /*
111+         * Intern the identifier so there aren't hundreds of duplicates
112+         * (in practice).
113+         */
114+        this.identifier = identifier.intern();
115+        // END android-changed
116     }
117 
118     public String getId()
119diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/asn1/DERPrintableString.java bcprov-jdk15on-147/org/bouncycastle/asn1/DERPrintableString.java
120--- bcprov-jdk15on-147.orig/org/bouncycastle/asn1/DERPrintableString.java	2012-03-22 15:11:48.000000000 +0000
121+++ bcprov-jdk15on-147/org/bouncycastle/asn1/DERPrintableString.java	2012-09-19 21:17:12.000000000 +0000
122@@ -12,7 +12,9 @@
123     extends ASN1Primitive
124     implements ASN1String
125 {
126-    private byte[]  string;
127+    // BEGIN android-changed
128+    private final byte[]  string;
129+    // END android-changed
130 
131     /**
132      * return a printable string from the passed in object.
133diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/asn1/cms/ContentInfo.java bcprov-jdk15on-147/org/bouncycastle/asn1/cms/ContentInfo.java
134--- bcprov-jdk15on-147.orig/org/bouncycastle/asn1/cms/ContentInfo.java	2012-03-22 15:11:48.000000000 +0000
135+++ bcprov-jdk15on-147/org/bouncycastle/asn1/cms/ContentInfo.java	2012-09-19 21:17:12.000000000 +0000
136@@ -12,7 +12,9 @@
137 
138 public class ContentInfo
139     extends ASN1Object
140-    implements CMSObjectIdentifiers
141+    // BEGIN android-removed
142+    // implements CMSObjectIdentifiers
143+    // END android-removed
144 {
145     private ASN1ObjectIdentifier contentType;
146     private ASN1Encodable        content;
147diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/asn1/pkcs/EncryptedPrivateKeyInfo.java bcprov-jdk15on-147/org/bouncycastle/asn1/pkcs/EncryptedPrivateKeyInfo.java
148--- bcprov-jdk15on-147.orig/org/bouncycastle/asn1/pkcs/EncryptedPrivateKeyInfo.java	2012-03-22 15:11:48.000000000 +0000
149+++ bcprov-jdk15on-147/org/bouncycastle/asn1/pkcs/EncryptedPrivateKeyInfo.java	2012-09-19 21:17:12.000000000 +0000
150@@ -37,10 +37,13 @@
151     public static EncryptedPrivateKeyInfo getInstance(
152         Object  obj)
153     {
154-        if (obj instanceof EncryptedData)
155+        // BEGIN android-changed
156+        //     fix copy and paste error in instanceof call
157+        if (obj instanceof EncryptedPrivateKeyInfo)
158         {
159             return (EncryptedPrivateKeyInfo)obj;
160         }
161+        // END android-changed
162         else if (obj != null)
163         { 
164             return new EncryptedPrivateKeyInfo(ASN1Sequence.getInstance(obj));
165diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/asn1/pkcs/PKCSObjectIdentifiers.java bcprov-jdk15on-147/org/bouncycastle/asn1/pkcs/PKCSObjectIdentifiers.java
166--- bcprov-jdk15on-147.orig/org/bouncycastle/asn1/pkcs/PKCSObjectIdentifiers.java	2012-03-22 15:11:48.000000000 +0000
167+++ bcprov-jdk15on-147/org/bouncycastle/asn1/pkcs/PKCSObjectIdentifiers.java	2012-09-19 21:17:12.000000000 +0000
168@@ -10,8 +10,10 @@
169     //
170     static final ASN1ObjectIdentifier    pkcs_1                    = new ASN1ObjectIdentifier("1.2.840.113549.1.1");
171     static final ASN1ObjectIdentifier    rsaEncryption             = pkcs_1.branch("1");
172-    static final ASN1ObjectIdentifier    md2WithRSAEncryption      = pkcs_1.branch("2");
173-    static final ASN1ObjectIdentifier    md4WithRSAEncryption      = pkcs_1.branch("3");
174+    // BEGIN android-removed
175+    // static final ASN1ObjectIdentifier    md2WithRSAEncryption      = pkcs_1.branch("2");
176+    // static final ASN1ObjectIdentifier    md4WithRSAEncryption      = pkcs_1.branch("3");
177+    // END android-removed
178     static final ASN1ObjectIdentifier    md5WithRSAEncryption      = pkcs_1.branch("4");
179     static final ASN1ObjectIdentifier    sha1WithRSAEncryption     = pkcs_1.branch("5");
180     static final ASN1ObjectIdentifier    srsaOAEPEncryptionSET     = pkcs_1.branch("6");
181@@ -22,7 +24,9 @@
182     static final ASN1ObjectIdentifier    sha256WithRSAEncryption   = pkcs_1.branch("11");
183     static final ASN1ObjectIdentifier    sha384WithRSAEncryption   = pkcs_1.branch("12");
184     static final ASN1ObjectIdentifier    sha512WithRSAEncryption   = pkcs_1.branch("13");
185-    static final ASN1ObjectIdentifier    sha224WithRSAEncryption   = pkcs_1.branch("14");
186+    // BEGIN android-removed
187+    // static final ASN1ObjectIdentifier    sha224WithRSAEncryption   = pkcs_1.branch("14");
188+    // END android-removed
189 
190     //
191     // pkcs-3 OBJECT IDENTIFIER ::= {
192@@ -65,13 +69,17 @@
193     // md2 OBJECT IDENTIFIER ::=
194     //      {iso(1) member-body(2) US(840) rsadsi(113549) digestAlgorithm(2) 2}
195     //
196-    static final ASN1ObjectIdentifier    md2                    = digestAlgorithm.branch("2");
197+    // BEGIN android-removed
198+    // static final ASN1ObjectIdentifier    md2                    = digestAlgorithm.branch("2");
199+    // END android-removed
200 
201     //
202     // md4 OBJECT IDENTIFIER ::=
203     //      {iso(1) member-body(2) US(840) rsadsi(113549) digestAlgorithm(2) 4}
204     //
205-    static final ASN1ObjectIdentifier    md4 = digestAlgorithm.branch("4");
206+    // BEGIN android-removed
207+    // static final ASN1ObjectIdentifier    md4 = digestAlgorithm.branch("4");
208+    // END android-removed
209 
210     //
211     // md5 OBJECT IDENTIFIER ::=
212@@ -80,7 +88,9 @@
213     static final ASN1ObjectIdentifier    md5                     = digestAlgorithm.branch("5");
214 
215     static final ASN1ObjectIdentifier    id_hmacWithSHA1         = digestAlgorithm.branch("7");
216-    static final ASN1ObjectIdentifier    id_hmacWithSHA224       = digestAlgorithm.branch("8");
217+    // BEGIN android-removed
218+    // static final ASN1ObjectIdentifier    id_hmacWithSHA224       = digestAlgorithm.branch("8");
219+    // END android-removed
220     static final ASN1ObjectIdentifier    id_hmacWithSHA256       = digestAlgorithm.branch("9");
221     static final ASN1ObjectIdentifier    id_hmacWithSHA384       = digestAlgorithm.branch("10");
222     static final ASN1ObjectIdentifier    id_hmacWithSHA512       = digestAlgorithm.branch("11");
223diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/asn1/pkcs/RSAESOAEPparams.java bcprov-jdk15on-147/org/bouncycastle/asn1/pkcs/RSAESOAEPparams.java
224--- bcprov-jdk15on-147.orig/org/bouncycastle/asn1/pkcs/RSAESOAEPparams.java	2012-03-22 15:11:48.000000000 +0000
225+++ bcprov-jdk15on-147/org/bouncycastle/asn1/pkcs/RSAESOAEPparams.java	2012-09-19 21:17:12.000000000 +0000
226@@ -19,7 +19,9 @@
227     private AlgorithmIdentifier maskGenAlgorithm;
228     private AlgorithmIdentifier pSourceAlgorithm;
229     
230-    public final static AlgorithmIdentifier DEFAULT_HASH_ALGORITHM = new AlgorithmIdentifier(OIWObjectIdentifiers.idSHA1, new DERNull());
231+    // BEGIN android-changed
232+    public final static AlgorithmIdentifier DEFAULT_HASH_ALGORITHM = new AlgorithmIdentifier(OIWObjectIdentifiers.idSHA1, DERNull.INSTANCE);
233+    // END android-changed
234     public final static AlgorithmIdentifier DEFAULT_MASK_GEN_FUNCTION = new AlgorithmIdentifier(PKCSObjectIdentifiers.id_mgf1, DEFAULT_HASH_ALGORITHM);
235     public final static AlgorithmIdentifier DEFAULT_P_SOURCE_ALGORITHM = new AlgorithmIdentifier(PKCSObjectIdentifiers.id_pSpecified, new DEROctetString(new byte[0]));
236     
237diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/asn1/pkcs/RSASSAPSSparams.java bcprov-jdk15on-147/org/bouncycastle/asn1/pkcs/RSASSAPSSparams.java
238--- bcprov-jdk15on-147.orig/org/bouncycastle/asn1/pkcs/RSASSAPSSparams.java	2012-03-22 15:11:48.000000000 +0000
239+++ bcprov-jdk15on-147/org/bouncycastle/asn1/pkcs/RSASSAPSSparams.java	2012-09-19 21:17:12.000000000 +0000
240@@ -22,7 +22,9 @@
241     private ASN1Integer          saltLength;
242     private ASN1Integer          trailerField;
243     
244-    public final static AlgorithmIdentifier DEFAULT_HASH_ALGORITHM = new AlgorithmIdentifier(OIWObjectIdentifiers.idSHA1, new DERNull());
245+    // BEGIN android-changed
246+    public final static AlgorithmIdentifier DEFAULT_HASH_ALGORITHM = new AlgorithmIdentifier(OIWObjectIdentifiers.idSHA1, DERNull.INSTANCE);
247+    // END android-changed
248     public final static AlgorithmIdentifier DEFAULT_MASK_GEN_FUNCTION = new AlgorithmIdentifier(PKCSObjectIdentifiers.id_mgf1, DEFAULT_HASH_ALGORITHM);
249     public final static ASN1Integer          DEFAULT_SALT_LENGTH = new ASN1Integer(20);
250     public final static ASN1Integer          DEFAULT_TRAILER_FIELD = new ASN1Integer(1);
251diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/asn1/util/ASN1Dump.java bcprov-jdk15on-147/org/bouncycastle/asn1/util/ASN1Dump.java
252--- bcprov-jdk15on-147.orig/org/bouncycastle/asn1/util/ASN1Dump.java	2012-03-22 15:11:48.000000000 +0000
253+++ bcprov-jdk15on-147/org/bouncycastle/asn1/util/ASN1Dump.java	2012-09-19 21:17:12.000000000 +0000
254@@ -78,7 +78,9 @@
255             {
256                 Object  o = e.nextElement();
257 
258-                if (o == null || o.equals(new DERNull()))
259+                // BEGIN android-changed
260+                if (o == null || o.equals(DERNull.INSTANCE))
261+                // END android-changed
262                 {
263                     buf.append(tab);
264                     buf.append("NULL");
265diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/asn1/x509/AttCertIssuer.java bcprov-jdk15on-147/org/bouncycastle/asn1/x509/AttCertIssuer.java
266--- bcprov-jdk15on-147.orig/org/bouncycastle/asn1/x509/AttCertIssuer.java	2012-03-22 15:11:48.000000000 +0000
267+++ bcprov-jdk15on-147/org/bouncycastle/asn1/x509/AttCertIssuer.java	2012-09-19 21:17:12.000000000 +0000
268@@ -46,7 +46,7 @@
269         ASN1TaggedObject obj,
270         boolean          explicit)
271     {
272-        return getInstance(obj.getObject()); // must be explictly tagged
273+        return getInstance(obj.getObject()); // must be explicitly tagged
274     }
275 
276     /**
277diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/asn1/x509/AuthorityKeyIdentifier.java bcprov-jdk15on-147/org/bouncycastle/asn1/x509/AuthorityKeyIdentifier.java
278--- bcprov-jdk15on-147.orig/org/bouncycastle/asn1/x509/AuthorityKeyIdentifier.java	2012-03-22 15:11:48.000000000 +0000
279+++ bcprov-jdk15on-147/org/bouncycastle/asn1/x509/AuthorityKeyIdentifier.java	2012-09-19 21:17:12.000000000 +0000
280@@ -14,7 +14,9 @@
281 import org.bouncycastle.asn1.DERSequence;
282 import org.bouncycastle.asn1.DERTaggedObject;
283 import org.bouncycastle.crypto.Digest;
284-import org.bouncycastle.crypto.digests.SHA1Digest;
285+// BEGIN android-changed
286+import org.bouncycastle.crypto.digests.AndroidDigestFactory;
287+// END android-changed
288 
289 /**
290  * The AuthorityKeyIdentifier object.
291@@ -101,7 +103,9 @@
292     public AuthorityKeyIdentifier(
293         SubjectPublicKeyInfo    spki)
294     {
295-        Digest  digest = new SHA1Digest();
296+        // BEGIN android-changed
297+        Digest  digest = AndroidDigestFactory.getSHA1();
298+        // END android-changed
299         byte[]  resBuf = new byte[digest.getDigestSize()];
300 
301         byte[] bytes = spki.getPublicKeyData().getBytes();
302@@ -119,7 +123,9 @@
303         GeneralNames            name,
304         BigInteger              serialNumber)
305     {
306-        Digest  digest = new SHA1Digest();
307+        // BEGIN android-changed
308+        Digest  digest = AndroidDigestFactory.getSHA1();
309+        // END android-changed
310         byte[]  resBuf = new byte[digest.getDigestSize()];
311 
312         byte[] bytes = spki.getPublicKeyData().getBytes();
313diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/asn1/x509/BasicConstraints.java bcprov-jdk15on-147/org/bouncycastle/asn1/x509/BasicConstraints.java
314--- bcprov-jdk15on-147.orig/org/bouncycastle/asn1/x509/BasicConstraints.java	2012-03-22 15:11:48.000000000 +0000
315+++ bcprov-jdk15on-147/org/bouncycastle/asn1/x509/BasicConstraints.java	2012-09-19 21:17:12.000000000 +0000
316@@ -14,7 +14,9 @@
317 public class BasicConstraints
318     extends ASN1Object
319 {
320-    DERBoolean  cA = new DERBoolean(false);
321+    // BEGIN android-changed
322+    DERBoolean  cA = DERBoolean.FALSE;
323+    // END android-changed
324     ASN1Integer  pathLenConstraint = null;
325 
326     public static BasicConstraints getInstance(
327@@ -81,7 +83,9 @@
328     {
329         if (cA)
330         {
331-            this.cA = new DERBoolean(true);
332+            // BEGIN android-changed
333+            this.cA = DERBoolean.TRUE;
334+            // END android-changed
335         }
336         else
337         {
338@@ -98,7 +102,9 @@
339     public BasicConstraints(
340         int     pathLenConstraint)
341     {
342-        this.cA = new DERBoolean(true);
343+        // BEGIN android-changed
344+        this.cA = DERBoolean.TRUE;
345+        // END android-changed
346         this.pathLenConstraint = new ASN1Integer(pathLenConstraint);
347     }
348 
349diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/asn1/x509/CRLReason.java bcprov-jdk15on-147/org/bouncycastle/asn1/x509/CRLReason.java
350--- bcprov-jdk15on-147.orig/org/bouncycastle/asn1/x509/CRLReason.java	2012-03-22 15:11:48.000000000 +0000
351+++ bcprov-jdk15on-147/org/bouncycastle/asn1/x509/CRLReason.java	2012-09-19 21:17:12.000000000 +0000
352@@ -138,7 +138,9 @@
353 
354     public static CRLReason lookup(int value)
355     {
356-        Integer idx = new Integer(value);
357+        // BEGIN android-changed
358+        Integer idx = Integer.valueOf(value);
359+        // END android-changed
360 
361         if (!table.containsKey(idx))
362         {
363diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/asn1/x509/IssuingDistributionPoint.java bcprov-jdk15on-147/org/bouncycastle/asn1/x509/IssuingDistributionPoint.java
364--- bcprov-jdk15on-147.orig/org/bouncycastle/asn1/x509/IssuingDistributionPoint.java	2012-03-22 15:11:48.000000000 +0000
365+++ bcprov-jdk15on-147/org/bouncycastle/asn1/x509/IssuingDistributionPoint.java	2012-09-19 21:17:12.000000000 +0000
366@@ -96,11 +96,15 @@
367         }
368         if (onlyContainsUserCerts)
369         {
370-            vec.add(new DERTaggedObject(false, 1, new DERBoolean(true)));
371+            // BEGIN android-changed
372+            vec.add(new DERTaggedObject(false, 1, DERBoolean.TRUE));
373+            // END android-changed
374         }
375         if (onlyContainsCACerts)
376         {
377-            vec.add(new DERTaggedObject(false, 2, new DERBoolean(true)));
378+            // BEGIN android-changed
379+            vec.add(new DERTaggedObject(false, 2, DERBoolean.TRUE));
380+            // END android-changed
381         }
382         if (onlySomeReasons != null)
383         {
384@@ -108,11 +112,15 @@
385         }
386         if (indirectCRL)
387         {
388-            vec.add(new DERTaggedObject(false, 4, new DERBoolean(true)));
389+            // BEGIN android-changed
390+            vec.add(new DERTaggedObject(false, 4, DERBoolean.TRUE));
391+            // END android-changed
392         }
393         if (onlyContainsAttributeCerts)
394         {
395-            vec.add(new DERTaggedObject(false, 5, new DERBoolean(true)));
396+            // BEGIN android-changed
397+            vec.add(new DERTaggedObject(false, 5, DERBoolean.TRUE));
398+            // END android-changed
399         }
400 
401         seq = new DERSequence(vec);
402diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/asn1/x509/SubjectKeyIdentifier.java bcprov-jdk15on-147/org/bouncycastle/asn1/x509/SubjectKeyIdentifier.java
403--- bcprov-jdk15on-147.orig/org/bouncycastle/asn1/x509/SubjectKeyIdentifier.java	2012-03-22 15:11:48.000000000 +0000
404+++ bcprov-jdk15on-147/org/bouncycastle/asn1/x509/SubjectKeyIdentifier.java	2012-09-19 21:17:12.000000000 +0000
405@@ -6,7 +6,9 @@
406 import org.bouncycastle.asn1.ASN1TaggedObject;
407 import org.bouncycastle.asn1.DEROctetString;
408 import org.bouncycastle.crypto.Digest;
409-import org.bouncycastle.crypto.digests.SHA1Digest;
410+// BEGIN android-changed
411+import org.bouncycastle.crypto.digests.AndroidDigestFactory;
412+// END android-changed
413 
414 /**
415  * The SubjectKeyIdentifier object.
416@@ -119,7 +121,9 @@
417 
418     private static byte[] getDigest(SubjectPublicKeyInfo spki)
419     {
420-        Digest digest = new SHA1Digest();
421+        // BEGIN android-changed
422+        Digest digest = AndroidDigestFactory.getSHA1();
423+        // END android-changed
424         byte[]  resBuf = new byte[digest.getDigestSize()];
425 
426         byte[] bytes = spki.getPublicKeyData().getBytes();
427diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/asn1/x509/X509Extensions.java bcprov-jdk15on-147/org/bouncycastle/asn1/x509/X509Extensions.java
428--- bcprov-jdk15on-147.orig/org/bouncycastle/asn1/x509/X509Extensions.java	2012-03-22 15:11:48.000000000 +0000
429+++ bcprov-jdk15on-147/org/bouncycastle/asn1/x509/X509Extensions.java	2012-09-19 21:17:12.000000000 +0000
430@@ -408,7 +408,9 @@
431 
432             if (ext.isCritical())
433             {
434-                v.add(new DERBoolean(true));
435+                // BEGIN android-changed
436+                v.add(DERBoolean.TRUE);
437+                // END android-changed
438             }
439 
440             v.add(ext.getValue());
441diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/asn1/x509/X509Name.java bcprov-jdk15on-147/org/bouncycastle/asn1/x509/X509Name.java
442--- bcprov-jdk15on-147.orig/org/bouncycastle/asn1/x509/X509Name.java	2012-03-22 15:11:48.000000000 +0000
443+++ bcprov-jdk15on-147/org/bouncycastle/asn1/x509/X509Name.java	2012-09-19 21:17:12.000000000 +0000
444@@ -255,8 +255,10 @@
445      */
446     public static final Hashtable SymbolLookUp = DefaultLookUp;
447 
448-    private static final Boolean TRUE = new Boolean(true); // for J2ME compatibility
449-    private static final Boolean FALSE = new Boolean(false);
450+    // BEGIN android-changed
451+    private static final Boolean TRUE = Boolean.TRUE;
452+    private static final Boolean FALSE = Boolean.FALSE;
453+    // END android-changed
454 
455     static
456     {
457@@ -445,7 +447,9 @@
458                            throw new IllegalArgumentException("cannot encode value");
459                        }
460                    }
461-                   added.addElement((i != 0) ? TRUE : FALSE);  // to allow earlier JDK compatibility
462+                   // BEGIN android-changed
463+                   added.addElement(Boolean.valueOf(i != 0));
464+                   // END android-changed
465             }
466         }
467     }
468@@ -702,7 +706,9 @@
469 
470             if (index == -1)
471             {
472-                throw new IllegalArgumentException("badly formated directory string");
473+                // BEGIN android-changed
474+                throw new IllegalArgumentException("badly formatted directory string");
475+                // END android-changed
476             }
477 
478             String              name = token.substring(0, index);
479diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/asn1/x509/X509NameTokenizer.java bcprov-jdk15on-147/org/bouncycastle/asn1/x509/X509NameTokenizer.java
480--- bcprov-jdk15on-147.orig/org/bouncycastle/asn1/x509/X509NameTokenizer.java	2012-03-22 15:11:48.000000000 +0000
481+++ bcprov-jdk15on-147/org/bouncycastle/asn1/x509/X509NameTokenizer.java	2012-09-19 21:17:12.000000000 +0000
482@@ -58,6 +58,17 @@
483                 }
484                 else
485                 {
486+                    // BEGIN android-added
487+                    // copied from a newer version of BouncyCastle
488+                    if (c == '#' && buf.charAt(buf.length() - 1) == '=')
489+                    {
490+                        buf.append('\\');
491+                    }
492+                    else if (c == '+' && seperator != '+')
493+                    {
494+                        buf.append('\\');
495+                    }
496+                    // END android-added
497                     buf.append(c);
498                 }
499                 escaped = false;
500diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/crypto/PBEParametersGenerator.java bcprov-jdk15on-147/org/bouncycastle/crypto/PBEParametersGenerator.java
501--- bcprov-jdk15on-147.orig/org/bouncycastle/crypto/PBEParametersGenerator.java	2012-03-22 15:11:48.000000000 +0000
502+++ bcprov-jdk15on-147/org/bouncycastle/crypto/PBEParametersGenerator.java	2012-09-19 21:17:12.000000000 +0000
503@@ -136,7 +136,8 @@
504     public static byte[] PKCS12PasswordToBytes(
505         char[]  password)
506     {
507-        if (password.length > 0)
508+        // BEGIN android-changed
509+        if (password != null && password.length > 0)
510         {
511                                        // +1 for extra 2 pad bytes.
512             byte[]  bytes = new byte[(password.length + 1) * 2];
513@@ -153,5 +154,6 @@
514         {
515             return new byte[0];
516         }
517+        // END android-changed
518     }
519 }
520diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/crypto/digests/AndroidDigestFactory.java bcprov-jdk15on-147/org/bouncycastle/crypto/digests/AndroidDigestFactory.java
521--- bcprov-jdk15on-147.orig/org/bouncycastle/crypto/digests/AndroidDigestFactory.java	1970-01-01 00:00:00.000000000 +0000
522+++ bcprov-jdk15on-147/org/bouncycastle/crypto/digests/AndroidDigestFactory.java	2012-09-19 21:17:12.000000000 +0000
523@@ -0,0 +1,78 @@
524+/*
525+ * Copyright (C) 2012 The Android Open Source Project
526+ *
527+ * Licensed under the Apache License, Version 2.0 (the "License");
528+ * you may not use this file except in compliance with the License.
529+ * You may obtain a copy of the License at
530+ *
531+ *      http://www.apache.org/licenses/LICENSE-2.0
532+ *
533+ * Unless required by applicable law or agreed to in writing, software
534+ * distributed under the License is distributed on an "AS IS" BASIS,
535+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
536+ * See the License for the specific language governing permissions and
537+ * limitations under the License.
538+ */
539+
540+package org.bouncycastle.crypto.digests;
541+
542+import org.bouncycastle.crypto.Digest;
543+
544+/**
545+ * Level of indirection to let us select OpenSSLDigest implementations
546+ * for libcore but fallback to BouncyCastle ones on the RI.
547+ */
548+public final class AndroidDigestFactory {
549+    private static final String OpenSSLFactoryClassName
550+            = AndroidDigestFactory.class.getName() + "OpenSSL";
551+    private static final String BouncyCastleFactoryClassName
552+            = AndroidDigestFactory.class.getName() + "BouncyCastle";
553+
554+    private static final AndroidDigestFactoryInterface FACTORY;
555+    static {
556+        Class factoryImplementationClass;
557+        try {
558+            factoryImplementationClass = Class.forName(OpenSSLFactoryClassName);
559+        } catch (ClassNotFoundException e1) {
560+            try {
561+                factoryImplementationClass = Class.forName(BouncyCastleFactoryClassName);
562+            } catch (ClassNotFoundException e2) {
563+                throw new AssertionError("Failed to find AndroidDigestFactoryInterface "
564+                                         + "implementation. Looked for "
565+                                         + OpenSSLFactoryClassName + " and "
566+                                         + BouncyCastleFactoryClassName);
567+            }
568+        }
569+        if (!AndroidDigestFactoryInterface.class.isAssignableFrom(factoryImplementationClass)) {
570+            throw new AssertionError(factoryImplementationClass
571+                                     + "does not implement AndroidDigestFactoryInterface");
572+        }
573+        try {
574+            FACTORY = (AndroidDigestFactoryInterface) factoryImplementationClass.newInstance();
575+        } catch (InstantiationException e) {
576+            throw new AssertionError(e);
577+        } catch (IllegalAccessException e) {
578+            throw new AssertionError(e);
579+        }
580+    }
581+
582+    public static Digest getMD5() {
583+        return FACTORY.getMD5();
584+    }
585+
586+    public static Digest getSHA1() {
587+        return FACTORY.getSHA1();
588+    }
589+
590+    public static Digest getSHA256() {
591+        return FACTORY.getSHA256();
592+    }
593+
594+    public static Digest getSHA384() {
595+        return FACTORY.getSHA384();
596+    }
597+
598+    public static Digest getSHA512() {
599+        return FACTORY.getSHA512();
600+    }
601+}
602diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/crypto/digests/AndroidDigestFactoryBouncyCastle.java bcprov-jdk15on-147/org/bouncycastle/crypto/digests/AndroidDigestFactoryBouncyCastle.java
603--- bcprov-jdk15on-147.orig/org/bouncycastle/crypto/digests/AndroidDigestFactoryBouncyCastle.java	1970-01-01 00:00:00.000000000 +0000
604+++ bcprov-jdk15on-147/org/bouncycastle/crypto/digests/AndroidDigestFactoryBouncyCastle.java	2012-09-19 21:17:12.000000000 +0000
605@@ -0,0 +1,37 @@
606+/*
607+ * Copyright (C) 2012 The Android Open Source Project
608+ *
609+ * Licensed under the Apache License, Version 2.0 (the "License");
610+ * you may not use this file except in compliance with the License.
611+ * You may obtain a copy of the License at
612+ *
613+ *      http://www.apache.org/licenses/LICENSE-2.0
614+ *
615+ * Unless required by applicable law or agreed to in writing, software
616+ * distributed under the License is distributed on an "AS IS" BASIS,
617+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
618+ * See the License for the specific language governing permissions and
619+ * limitations under the License.
620+ */
621+
622+package org.bouncycastle.crypto.digests;
623+
624+import org.bouncycastle.crypto.Digest;
625+
626+public class AndroidDigestFactoryBouncyCastle implements AndroidDigestFactoryInterface {
627+    public Digest getMD5() {
628+        return new MD5Digest();
629+    }
630+    public Digest getSHA1() {
631+        return new SHA1Digest();
632+    }
633+    public Digest getSHA256() {
634+        return new SHA256Digest();
635+    }
636+    public Digest getSHA384() {
637+        return new SHA384Digest();
638+    }
639+    public Digest getSHA512() {
640+        return new SHA512Digest();
641+    }
642+}
643diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/crypto/digests/AndroidDigestFactoryInterface.java bcprov-jdk15on-147/org/bouncycastle/crypto/digests/AndroidDigestFactoryInterface.java
644--- bcprov-jdk15on-147.orig/org/bouncycastle/crypto/digests/AndroidDigestFactoryInterface.java	1970-01-01 00:00:00.000000000 +0000
645+++ bcprov-jdk15on-147/org/bouncycastle/crypto/digests/AndroidDigestFactoryInterface.java	2012-09-19 21:17:12.000000000 +0000
646@@ -0,0 +1,27 @@
647+/*
648+ * Copyright (C) 2012 The Android Open Source Project
649+ *
650+ * Licensed under the Apache License, Version 2.0 (the "License");
651+ * you may not use this file except in compliance with the License.
652+ * You may obtain a copy of the License at
653+ *
654+ *      http://www.apache.org/licenses/LICENSE-2.0
655+ *
656+ * Unless required by applicable law or agreed to in writing, software
657+ * distributed under the License is distributed on an "AS IS" BASIS,
658+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
659+ * See the License for the specific language governing permissions and
660+ * limitations under the License.
661+ */
662+
663+package org.bouncycastle.crypto.digests;
664+
665+import org.bouncycastle.crypto.Digest;
666+
667+interface AndroidDigestFactoryInterface {
668+    public Digest getMD5();
669+    public Digest getSHA1();
670+    public Digest getSHA256();
671+    public Digest getSHA384();
672+    public Digest getSHA512();
673+}
674diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/crypto/digests/AndroidDigestFactoryOpenSSL.java bcprov-jdk15on-147/org/bouncycastle/crypto/digests/AndroidDigestFactoryOpenSSL.java
675--- bcprov-jdk15on-147.orig/org/bouncycastle/crypto/digests/AndroidDigestFactoryOpenSSL.java	1970-01-01 00:00:00.000000000 +0000
676+++ bcprov-jdk15on-147/org/bouncycastle/crypto/digests/AndroidDigestFactoryOpenSSL.java	2012-09-19 21:17:12.000000000 +0000
677@@ -0,0 +1,37 @@
678+/*
679+ * Copyright (C) 2012 The Android Open Source Project
680+ *
681+ * Licensed under the Apache License, Version 2.0 (the "License");
682+ * you may not use this file except in compliance with the License.
683+ * You may obtain a copy of the License at
684+ *
685+ *      http://www.apache.org/licenses/LICENSE-2.0
686+ *
687+ * Unless required by applicable law or agreed to in writing, software
688+ * distributed under the License is distributed on an "AS IS" BASIS,
689+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
690+ * See the License for the specific language governing permissions and
691+ * limitations under the License.
692+ */
693+
694+package org.bouncycastle.crypto.digests;
695+
696+import org.bouncycastle.crypto.Digest;
697+
698+public class AndroidDigestFactoryOpenSSL implements AndroidDigestFactoryInterface {
699+    public Digest getMD5() {
700+        return new OpenSSLDigest.MD5();
701+    }
702+    public Digest getSHA1() {
703+        return new OpenSSLDigest.SHA1();
704+    }
705+    public Digest getSHA256() {
706+        return new OpenSSLDigest.SHA256();
707+    }
708+    public Digest getSHA384() {
709+        return new OpenSSLDigest.SHA384();
710+    }
711+    public Digest getSHA512() {
712+        return new OpenSSLDigest.SHA512();
713+    }
714+}
715diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/crypto/digests/OpenSSLDigest.java bcprov-jdk15on-147/org/bouncycastle/crypto/digests/OpenSSLDigest.java
716--- bcprov-jdk15on-147.orig/org/bouncycastle/crypto/digests/OpenSSLDigest.java	1970-01-01 00:00:00.000000000 +0000
717+++ bcprov-jdk15on-147/org/bouncycastle/crypto/digests/OpenSSLDigest.java	2012-09-19 21:17:12.000000000 +0000
718@@ -0,0 +1,159 @@
719+/*
720+ * Copyright (C) 2008 The Android Open Source Project
721+ *
722+ * Licensed under the Apache License, Version 2.0 (the "License");
723+ * you may not use this file except in compliance with the License.
724+ * You may obtain a copy of the License at
725+ *
726+ *      http://www.apache.org/licenses/LICENSE-2.0
727+ *
728+ * Unless required by applicable law or agreed to in writing, software
729+ * distributed under the License is distributed on an "AS IS" BASIS,
730+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
731+ * See the License for the specific language governing permissions and
732+ * limitations under the License.
733+ */
734+
735+package org.bouncycastle.crypto.digests;
736+
737+import org.apache.harmony.xnet.provider.jsse.NativeCrypto;
738+import org.bouncycastle.crypto.ExtendedDigest;
739+
740+/**
741+ * Implements the BouncyCastle Digest interface using OpenSSL's EVP API.
742+ */
743+public class OpenSSLDigest implements ExtendedDigest {
744+
745+    /**
746+     * Holds the standard name of the hashing algorithm, e.g. "SHA-1";
747+     */
748+    private final String algorithm;
749+
750+    /**
751+     * Holds the EVP_MD for the hashing algorithm, e.g. EVP_get_digestbyname("sha1");
752+     */
753+    private final int evp_md;
754+
755+    /**
756+     * Holds the output size of the message digest.
757+     */
758+    private final int size;
759+
760+    /**
761+     * Holds the block size of the message digest.
762+     */
763+    private final int blockSize;
764+
765+    /**
766+     * Holds a pointer to the native message digest context. It is
767+     * lazily initialized to avoid having to reallocate on reset when
768+     * its unlikely to be reused.
769+     */
770+    private int ctx;
771+
772+    /**
773+     * Holds a dummy buffer for writing single bytes to the digest.
774+     */
775+    private final byte[] singleByte = new byte[1];
776+
777+    /**
778+     * Creates a new OpenSSLMessageDigest instance for the given algorithm
779+     * name.
780+     */
781+    private OpenSSLDigest(String algorithm, int evp_md, int size, int blockSize) {
782+        this.algorithm = algorithm;
783+        this.evp_md = evp_md;
784+        this.size = size;
785+        this.blockSize = blockSize;
786+    }
787+
788+    public String getAlgorithmName() {
789+        return algorithm;
790+    }
791+
792+    public int getDigestSize() {
793+        return size;
794+    }
795+
796+    public int getByteLength() {
797+        return blockSize;
798+    }
799+
800+    public void reset() {
801+        free();
802+    }
803+
804+    public void update(byte in) {
805+        singleByte[0] = in;
806+        update(singleByte, 0, 1);
807+    }
808+
809+    public void update(byte[] in, int inOff, int len) {
810+        NativeCrypto.EVP_DigestUpdate(getCtx(), in, inOff, len);
811+    }
812+
813+    public int doFinal(byte[] out, int outOff) {
814+        int i = NativeCrypto.EVP_DigestFinal(getCtx(), out, outOff);
815+        ctx = 0; // EVP_DigestFinal frees the context as a side effect
816+        reset();
817+        return i;
818+    }
819+
820+    private int getCtx() {
821+        if (ctx == 0) {
822+            ctx = NativeCrypto.EVP_DigestInit(evp_md);
823+        }
824+        return ctx;
825+    }
826+
827+    private void free() {
828+        if (ctx != 0) {
829+            NativeCrypto.EVP_MD_CTX_destroy(ctx);
830+            ctx = 0;
831+        }
832+    }
833+
834+    @Override
835+    protected void finalize() throws Throwable {
836+        try {
837+            free();
838+        } finally {
839+            super.finalize();
840+        }
841+    }
842+
843+    public static class MD5 extends OpenSSLDigest {
844+        private static final int EVP_MD = NativeCrypto.EVP_get_digestbyname("md5");
845+        private static final int SIZE = NativeCrypto.EVP_MD_size(EVP_MD);
846+        private static final int BLOCK_SIZE = NativeCrypto.EVP_MD_block_size(EVP_MD);
847+        public MD5() { super("MD5", EVP_MD, SIZE, BLOCK_SIZE); }
848+    }
849+
850+    public static class SHA1 extends OpenSSLDigest {
851+        private static final int EVP_MD = NativeCrypto.EVP_get_digestbyname("sha1");
852+        private static final int SIZE = NativeCrypto.EVP_MD_size(EVP_MD);
853+        private static final int BLOCK_SIZE = NativeCrypto.EVP_MD_block_size(EVP_MD);
854+        public SHA1() { super("SHA-1", EVP_MD, SIZE, BLOCK_SIZE); }
855+    }
856+
857+    public static class SHA256 extends OpenSSLDigest {
858+        private static final int EVP_MD = NativeCrypto.EVP_get_digestbyname("sha256");
859+        private static final int SIZE = NativeCrypto.EVP_MD_size(EVP_MD);
860+        private static final int BLOCK_SIZE = NativeCrypto.EVP_MD_block_size(EVP_MD);
861+        public SHA256() { super("SHA-256", EVP_MD, SIZE, BLOCK_SIZE); }
862+    }
863+
864+    public static class SHA384 extends OpenSSLDigest {
865+        private static final int EVP_MD = NativeCrypto.EVP_get_digestbyname("sha384");
866+        private static final int SIZE = NativeCrypto.EVP_MD_size(EVP_MD);
867+        private static final int BLOCK_SIZE = NativeCrypto.EVP_MD_block_size(EVP_MD);
868+        public SHA384() { super("SHA-384", EVP_MD, SIZE, BLOCK_SIZE); }
869+    }
870+
871+    public static class SHA512 extends OpenSSLDigest {
872+        private static final int EVP_MD = NativeCrypto.EVP_get_digestbyname("sha512");
873+        private static final int SIZE = NativeCrypto.EVP_MD_size(EVP_MD);
874+        private static final int BLOCK_SIZE = NativeCrypto.EVP_MD_block_size(EVP_MD);
875+        public SHA512() { super("SHA-512", EVP_MD, SIZE, BLOCK_SIZE); }
876+    }
877+}
878diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/crypto/encodings/OAEPEncoding.java bcprov-jdk15on-147/org/bouncycastle/crypto/encodings/OAEPEncoding.java
879--- bcprov-jdk15on-147.orig/org/bouncycastle/crypto/encodings/OAEPEncoding.java	2012-03-22 15:11:48.000000000 +0000
880+++ bcprov-jdk15on-147/org/bouncycastle/crypto/encodings/OAEPEncoding.java	2012-09-19 21:17:12.000000000 +0000
881@@ -4,7 +4,9 @@
882 import org.bouncycastle.crypto.CipherParameters;
883 import org.bouncycastle.crypto.Digest;
884 import org.bouncycastle.crypto.InvalidCipherTextException;
885-import org.bouncycastle.crypto.digests.SHA1Digest;
886+// BEGIN android-changed
887+import org.bouncycastle.crypto.digests.AndroidDigestFactory;
888+// END android-changed
889 import org.bouncycastle.crypto.params.ParametersWithRandom;
890 
891 import java.security.SecureRandom;
892@@ -26,7 +28,9 @@
893     public OAEPEncoding(
894         AsymmetricBlockCipher   cipher)
895     {
896-        this(cipher, new SHA1Digest(), null);
897+        // BEGIN android-changed
898+        this(cipher, AndroidDigestFactory.getSHA1(), null);
899+        // END android-changed
900     }
901     
902     public OAEPEncoding(
903diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/crypto/encodings/PKCS1Encoding.java bcprov-jdk15on-147/org/bouncycastle/crypto/encodings/PKCS1Encoding.java
904--- bcprov-jdk15on-147.orig/org/bouncycastle/crypto/encodings/PKCS1Encoding.java	2012-03-22 15:11:48.000000000 +0000
905+++ bcprov-jdk15on-147/org/bouncycastle/crypto/encodings/PKCS1Encoding.java	2012-09-19 21:17:12.000000000 +0000
906@@ -206,6 +206,12 @@
907         {
908             throw new InvalidCipherTextException("unknown block type");
909         }
910+        // BEGIN android-added
911+        if ((type == 1 && forPrivateKey) || (type == 2 && !forPrivateKey))
912+        {
913+            throw new InvalidCipherTextException("invalid block type " + type);
914+        }
915+        // END android-added
916 
917         if (useStrictLength && block.length != engine.getOutputBlockSize())
918         {
919diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/crypto/engines/DESedeWrapEngine.java bcprov-jdk15on-147/org/bouncycastle/crypto/engines/DESedeWrapEngine.java
920--- bcprov-jdk15on-147.orig/org/bouncycastle/crypto/engines/DESedeWrapEngine.java	2012-03-22 15:11:48.000000000 +0000
921+++ bcprov-jdk15on-147/org/bouncycastle/crypto/engines/DESedeWrapEngine.java	2012-09-19 21:17:12.000000000 +0000
922@@ -6,7 +6,9 @@
923 import org.bouncycastle.crypto.Digest;
924 import org.bouncycastle.crypto.InvalidCipherTextException;
925 import org.bouncycastle.crypto.Wrapper;
926-import org.bouncycastle.crypto.digests.SHA1Digest;
927+// BEGIN android-changed
928+import org.bouncycastle.crypto.digests.AndroidDigestFactory;
929+// END android-changed
930 import org.bouncycastle.crypto.modes.CBCBlockCipher;
931 import org.bouncycastle.crypto.params.KeyParameter;
932 import org.bouncycastle.crypto.params.ParametersWithIV;
933@@ -52,7 +54,9 @@
934     //
935     // checksum digest
936     //
937-    Digest  sha1 = new SHA1Digest();
938+    // BEGIN android-changed
939+    Digest  sha1 = AndroidDigestFactory.getSHA1();
940+    // END android-changed
941     byte[]  digest = new byte[20];
942 
943    /**
944diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/crypto/generators/DHParametersHelper.java bcprov-jdk15on-147/org/bouncycastle/crypto/generators/DHParametersHelper.java
945--- bcprov-jdk15on-147.orig/org/bouncycastle/crypto/generators/DHParametersHelper.java	2012-03-22 15:11:48.000000000 +0000
946+++ bcprov-jdk15on-147/org/bouncycastle/crypto/generators/DHParametersHelper.java	2012-09-19 21:17:12.000000000 +0000
947@@ -3,10 +3,17 @@
948 import java.math.BigInteger;
949 import java.security.SecureRandom;
950 
951+// BEGIN android-added
952+import java.util.logging.Logger;
953+// END android-added
954 import org.bouncycastle.util.BigIntegers;
955 
956 class DHParametersHelper
957 {
958+    // BEGIN android-added
959+    private static final Logger logger = Logger.getLogger(DHParametersHelper.class.getName());
960+    // END android-added
961+
962     private static final BigInteger ONE = BigInteger.valueOf(1);
963     private static final BigInteger TWO = BigInteger.valueOf(2);
964 
965@@ -17,11 +24,19 @@
966      */
967     static BigInteger[] generateSafePrimes(int size, int certainty, SecureRandom random)
968     {
969+        // BEGIN android-added
970+        logger.info("Generating safe primes. This may take a long time.");
971+        long start = System.currentTimeMillis();
972+        int tries = 0;
973+        // END android-added
974         BigInteger p, q;
975         int qLength = size - 1;
976 
977         for (;;)
978         {
979+            // BEGIN android-added
980+            tries++;
981+            // END android-added
982             q = new BigInteger(qLength, 2, random);
983 
984             // p <- 2q + 1
985@@ -32,6 +47,11 @@
986                 break;
987             }
988         }
989+        // BEGIN android-added
990+        long end = System.currentTimeMillis();
991+        long duration = end - start;
992+        logger.info("Generated safe primes: " + tries + " tries took " + duration + "ms");
993+        // END android-added
994 
995         return new BigInteger[] { p, q };
996     }
997diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/crypto/generators/DSAParametersGenerator.java bcprov-jdk15on-147/org/bouncycastle/crypto/generators/DSAParametersGenerator.java
998--- bcprov-jdk15on-147.orig/org/bouncycastle/crypto/generators/DSAParametersGenerator.java	2012-03-22 15:11:48.000000000 +0000
999+++ bcprov-jdk15on-147/org/bouncycastle/crypto/generators/DSAParametersGenerator.java	2012-09-19 21:17:12.000000000 +0000
1000@@ -1,8 +1,9 @@
1001 package org.bouncycastle.crypto.generators;
1002 
1003 import org.bouncycastle.crypto.Digest;
1004-import org.bouncycastle.crypto.digests.SHA1Digest;
1005-import org.bouncycastle.crypto.digests.SHA256Digest;
1006+// BEGIN android-changed
1007+import org.bouncycastle.crypto.digests.AndroidDigestFactory;
1008+// END android-changed
1009 import org.bouncycastle.crypto.params.DSAParameters;
1010 import org.bouncycastle.crypto.params.DSAValidationParameters;
1011 import org.bouncycastle.util.Arrays;
1012@@ -75,7 +76,9 @@
1013         byte[]          part1 = new byte[20];
1014         byte[]          part2 = new byte[20];
1015         byte[]          u = new byte[20];
1016-        SHA1Digest      sha1 = new SHA1Digest();
1017+        // BEGIN android-changed
1018+        Digest          sha1 = AndroidDigestFactory.getSHA1();
1019+        // END android-changed
1020         int             n = (L - 1) / 160;
1021         byte[]          w = new byte[L / 8];
1022 
1023@@ -166,7 +169,9 @@
1024     {
1025 // A.1.1.2 Generation of the Probable Primes p and q Using an Approved Hash Function
1026         // FIXME This should be configurable (digest size in bits must be >= N)
1027-        Digest d = new SHA256Digest();
1028+        // BEGIN android-changed
1029+        Digest d = AndroidDigestFactory.getSHA256();
1030+        // END android-changed
1031         int outlen = d.getDigestSize() * 8;
1032 
1033 // 1. Check that the (L, N) pair is in the list of acceptable (L, N pairs) (see Section 4.2). If
1034diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/crypto/generators/OpenSSLPBEParametersGenerator.java bcprov-jdk15on-147/org/bouncycastle/crypto/generators/OpenSSLPBEParametersGenerator.java
1035--- bcprov-jdk15on-147.orig/org/bouncycastle/crypto/generators/OpenSSLPBEParametersGenerator.java	2012-03-22 15:11:48.000000000 +0000
1036+++ bcprov-jdk15on-147/org/bouncycastle/crypto/generators/OpenSSLPBEParametersGenerator.java	2012-09-19 21:17:12.000000000 +0000
1037@@ -3,7 +3,9 @@
1038 import org.bouncycastle.crypto.CipherParameters;
1039 import org.bouncycastle.crypto.Digest;
1040 import org.bouncycastle.crypto.PBEParametersGenerator;
1041-import org.bouncycastle.crypto.digests.MD5Digest;
1042+// BEGIN android-changed
1043+import org.bouncycastle.crypto.digests.AndroidDigestFactory;
1044+// END android-changed
1045 import org.bouncycastle.crypto.params.KeyParameter;
1046 import org.bouncycastle.crypto.params.ParametersWithIV;
1047 
1048@@ -17,7 +19,9 @@
1049 public class OpenSSLPBEParametersGenerator
1050     extends PBEParametersGenerator
1051 {
1052-    private Digest  digest = new MD5Digest();
1053+    // BEGIN android-changed
1054+    private Digest  digest = AndroidDigestFactory.getMD5();
1055+    // END android-changed
1056 
1057     /**
1058      * Construct a OpenSSL Parameters generator. 
1059diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/crypto/generators/PKCS5S2ParametersGenerator.java bcprov-jdk15on-147/org/bouncycastle/crypto/generators/PKCS5S2ParametersGenerator.java
1060--- bcprov-jdk15on-147.orig/org/bouncycastle/crypto/generators/PKCS5S2ParametersGenerator.java	2012-03-22 15:11:48.000000000 +0000
1061+++ bcprov-jdk15on-147/org/bouncycastle/crypto/generators/PKCS5S2ParametersGenerator.java	2012-09-19 21:17:12.000000000 +0000
1062@@ -4,7 +4,9 @@
1063 import org.bouncycastle.crypto.Digest;
1064 import org.bouncycastle.crypto.Mac;
1065 import org.bouncycastle.crypto.PBEParametersGenerator;
1066-import org.bouncycastle.crypto.digests.SHA1Digest;
1067+// BEGIN android-changed
1068+import org.bouncycastle.crypto.digests.AndroidDigestFactory;
1069+// END android-changed
1070 import org.bouncycastle.crypto.macs.HMac;
1071 import org.bouncycastle.crypto.params.KeyParameter;
1072 import org.bouncycastle.crypto.params.ParametersWithIV;
1073@@ -27,7 +29,9 @@
1074      */
1075     public PKCS5S2ParametersGenerator()
1076     {
1077-    	this(new SHA1Digest());
1078+        // BEGIN android-changed
1079+    	this(AndroidDigestFactory.getSHA1());
1080+        // END android-changed
1081     }
1082 
1083     public PKCS5S2ParametersGenerator(Digest digest)
1084diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/crypto/macs/HMac.java bcprov-jdk15on-147/org/bouncycastle/crypto/macs/HMac.java
1085--- bcprov-jdk15on-147.orig/org/bouncycastle/crypto/macs/HMac.java	2012-03-22 15:11:48.000000000 +0000
1086+++ bcprov-jdk15on-147/org/bouncycastle/crypto/macs/HMac.java	2012-09-19 21:17:12.000000000 +0000
1087@@ -32,23 +32,31 @@
1088     {
1089         blockLengths = new Hashtable();
1090         
1091-        blockLengths.put("GOST3411", new Integer(32));
1092-        
1093-        blockLengths.put("MD2", new Integer(16));
1094-        blockLengths.put("MD4", new Integer(64));
1095-        blockLengths.put("MD5", new Integer(64));
1096-        
1097-        blockLengths.put("RIPEMD128", new Integer(64));
1098-        blockLengths.put("RIPEMD160", new Integer(64));
1099-        
1100-        blockLengths.put("SHA-1", new Integer(64));
1101-        blockLengths.put("SHA-224", new Integer(64));
1102-        blockLengths.put("SHA-256", new Integer(64));
1103-        blockLengths.put("SHA-384", new Integer(128));
1104-        blockLengths.put("SHA-512", new Integer(128));
1105-        
1106-        blockLengths.put("Tiger", new Integer(64));
1107-        blockLengths.put("Whirlpool", new Integer(64));
1108+        // BEGIN android-removed
1109+        // blockLengths.put("GOST3411", Integer.valueOf(32));
1110+        //
1111+        // blockLengths.put("MD2", Integer.valueOf(16));
1112+        // blockLengths.put("MD4", Integer.valueOf(64));
1113+        // END android-removed
1114+        blockLengths.put("MD5", Integer.valueOf(64));
1115+        
1116+        // BEGIN android-removed
1117+        // blockLengths.put("RIPEMD128", Integer.valueOf(64));
1118+        // blockLengths.put("RIPEMD160", Integer.valueOf(64));
1119+        // END android-removed
1120+        
1121+        blockLengths.put("SHA-1", Integer.valueOf(64));
1122+        // BEGIN android-removed
1123+        // blockLengths.put("SHA-224", Integer.valueOf(64));
1124+        // END android-removed
1125+        blockLengths.put("SHA-256", Integer.valueOf(64));
1126+        blockLengths.put("SHA-384", Integer.valueOf(128));
1127+        blockLengths.put("SHA-512", Integer.valueOf(128));
1128+        
1129+        // BEGIN android-removed
1130+        // blockLengths.put("Tiger", Integer.valueOf(64));
1131+        // blockLengths.put("Whirlpool", Integer.valueOf(64));
1132+        // END android-removed
1133     }
1134     
1135     private static int getByteLength(
1136diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/crypto/signers/RSADigestSigner.java bcprov-jdk15on-147/org/bouncycastle/crypto/signers/RSADigestSigner.java
1137--- bcprov-jdk15on-147.orig/org/bouncycastle/crypto/signers/RSADigestSigner.java	2012-03-22 15:11:48.000000000 +0000
1138+++ bcprov-jdk15on-147/org/bouncycastle/crypto/signers/RSADigestSigner.java	2012-09-19 21:17:12.000000000 +0000
1139@@ -39,18 +39,24 @@
1140      */
1141     static
1142     {
1143-        oidMap.put("RIPEMD128", TeleTrusTObjectIdentifiers.ripemd128);
1144-        oidMap.put("RIPEMD160", TeleTrusTObjectIdentifiers.ripemd160);
1145-        oidMap.put("RIPEMD256", TeleTrusTObjectIdentifiers.ripemd256);
1146+        // BEGIN android-removed
1147+        // oidMap.put("RIPEMD128", TeleTrusTObjectIdentifiers.ripemd128);
1148+        // oidMap.put("RIPEMD160", TeleTrusTObjectIdentifiers.ripemd160);
1149+        // oidMap.put("RIPEMD256", TeleTrusTObjectIdentifiers.ripemd256);
1150+        // END android-removed
1151 
1152         oidMap.put("SHA-1", X509ObjectIdentifiers.id_SHA1);
1153-        oidMap.put("SHA-224", NISTObjectIdentifiers.id_sha224);
1154+        // BEGIN android-removed
1155+        // oidMap.put("SHA-224", NISTObjectIdentifiers.id_sha224);
1156+        // END android-removed
1157         oidMap.put("SHA-256", NISTObjectIdentifiers.id_sha256);
1158         oidMap.put("SHA-384", NISTObjectIdentifiers.id_sha384);
1159         oidMap.put("SHA-512", NISTObjectIdentifiers.id_sha512);
1160 
1161-        oidMap.put("MD2", PKCSObjectIdentifiers.md2);
1162-        oidMap.put("MD4", PKCSObjectIdentifiers.md4);
1163+        // BEGIN android-removed
1164+        // oidMap.put("MD2", PKCSObjectIdentifiers.md2);
1165+        // oidMap.put("MD4", PKCSObjectIdentifiers.md4);
1166+        // END android-removed
1167         oidMap.put("MD5", PKCSObjectIdentifiers.md5);
1168     }
1169 
1170diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/crypto/util/PrivateKeyFactory.java bcprov-jdk15on-147/org/bouncycastle/crypto/util/PrivateKeyFactory.java
1171--- bcprov-jdk15on-147.orig/org/bouncycastle/crypto/util/PrivateKeyFactory.java	2012-03-22 15:11:48.000000000 +0000
1172+++ bcprov-jdk15on-147/org/bouncycastle/crypto/util/PrivateKeyFactory.java	2012-09-19 21:17:12.000000000 +0000
1173@@ -11,7 +11,9 @@
1174 import org.bouncycastle.asn1.ASN1Sequence;
1175 import org.bouncycastle.asn1.DERInteger;
1176 import org.bouncycastle.asn1.nist.NISTNamedCurves;
1177-import org.bouncycastle.asn1.oiw.ElGamalParameter;
1178+// BEGIN android-removed
1179+// import org.bouncycastle.asn1.oiw.ElGamalParameter;
1180+// END android-removed
1181 import org.bouncycastle.asn1.oiw.OIWObjectIdentifiers;
1182 import org.bouncycastle.asn1.pkcs.DHParameter;
1183 import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
1184@@ -19,7 +21,9 @@
1185 import org.bouncycastle.asn1.pkcs.RSAPrivateKey;
1186 import org.bouncycastle.asn1.sec.ECPrivateKey;
1187 import org.bouncycastle.asn1.sec.SECNamedCurves;
1188-import org.bouncycastle.asn1.teletrust.TeleTrusTNamedCurves;
1189+// BEGIN android-removed
1190+// import org.bouncycastle.asn1.teletrust.TeleTrusTNamedCurves;
1191+// END android-removed
1192 import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
1193 import org.bouncycastle.asn1.x509.DSAParameter;
1194 import org.bouncycastle.asn1.x9.X962NamedCurves;
1195@@ -33,8 +37,10 @@
1196 import org.bouncycastle.crypto.params.DSAPrivateKeyParameters;
1197 import org.bouncycastle.crypto.params.ECDomainParameters;
1198 import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
1199-import org.bouncycastle.crypto.params.ElGamalParameters;
1200-import org.bouncycastle.crypto.params.ElGamalPrivateKeyParameters;
1201+// BEGIN android-removed
1202+// import org.bouncycastle.crypto.params.ElGamalParameters;
1203+// import org.bouncycastle.crypto.params.ElGamalPrivateKeyParameters;
1204+// END android-removed
1205 import org.bouncycastle.crypto.params.RSAPrivateCrtKeyParameters;
1206 
1207 /**
1208@@ -100,14 +106,16 @@
1209 
1210             return new DHPrivateKeyParameters(derX.getValue(), dhParams);
1211         }
1212-        else if (algId.getAlgorithm().equals(OIWObjectIdentifiers.elGamalAlgorithm))
1213-        {
1214-            ElGamalParameter params = new ElGamalParameter((ASN1Sequence)algId.getParameters());
1215-            DERInteger derX = (DERInteger)keyInfo.parsePrivateKey();
1216-
1217-            return new ElGamalPrivateKeyParameters(derX.getValue(), new ElGamalParameters(
1218-                params.getP(), params.getG()));
1219-        }
1220+        // BEGIN android-removed
1221+        // else if (algId.getAlgorithm().equals(OIWObjectIdentifiers.elGamalAlgorithm))
1222+        // {
1223+        //     ElGamalParameter params = new ElGamalParameter((ASN1Sequence)algId.getParameters());
1224+        //     DERInteger derX = (DERInteger)keyInfo.parsePrivateKey();
1225+        //
1226+        //     return new ElGamalPrivateKeyParameters(derX.getValue(), new ElGamalParameters(
1227+        //         params.getP(), params.getG()));
1228+        // }
1229+        // END android-removed
1230         else if (algId.getAlgorithm().equals(X9ObjectIdentifiers.id_dsa))
1231         {
1232             DERInteger derX = (DERInteger)keyInfo.parsePrivateKey();
1233@@ -140,10 +148,12 @@
1234                     {
1235                         x9 = NISTNamedCurves.getByOID(oid);
1236 
1237-                        if (x9 == null)
1238-                        {
1239-                            x9 = TeleTrusTNamedCurves.getByOID(oid);
1240-                        }
1241+                        // BEGIN android-removed
1242+                        // if (x9 == null)
1243+                        // {
1244+                        //     x9 = TeleTrusTNamedCurves.getByOID(oid);
1245+                        // }
1246+                        // END android-removed
1247                     }
1248                 }
1249             }
1250diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/crypto/util/PublicKeyFactory.java bcprov-jdk15on-147/org/bouncycastle/crypto/util/PublicKeyFactory.java
1251--- bcprov-jdk15on-147.orig/org/bouncycastle/crypto/util/PublicKeyFactory.java	2012-03-22 15:11:48.000000000 +0000
1252+++ bcprov-jdk15on-147/org/bouncycastle/crypto/util/PublicKeyFactory.java	2012-09-19 21:17:12.000000000 +0000
1253@@ -13,13 +13,17 @@
1254 import org.bouncycastle.asn1.DERInteger;
1255 import org.bouncycastle.asn1.DEROctetString;
1256 import org.bouncycastle.asn1.nist.NISTNamedCurves;
1257-import org.bouncycastle.asn1.oiw.ElGamalParameter;
1258+// BEGIN android-removed
1259+// import org.bouncycastle.asn1.oiw.ElGamalParameter;
1260+// END android-removed
1261 import org.bouncycastle.asn1.oiw.OIWObjectIdentifiers;
1262 import org.bouncycastle.asn1.pkcs.DHParameter;
1263 import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
1264 import org.bouncycastle.asn1.pkcs.RSAPublicKey;
1265 import org.bouncycastle.asn1.sec.SECNamedCurves;
1266-import org.bouncycastle.asn1.teletrust.TeleTrusTNamedCurves;
1267+// BEGIN android-removed
1268+// import org.bouncycastle.asn1.teletrust.TeleTrusTNamedCurves;
1269+// END android-removed
1270 import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
1271 import org.bouncycastle.asn1.x509.DSAParameter;
1272 import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;
1273@@ -40,8 +44,10 @@
1274 import org.bouncycastle.crypto.params.DSAPublicKeyParameters;
1275 import org.bouncycastle.crypto.params.ECDomainParameters;
1276 import org.bouncycastle.crypto.params.ECPublicKeyParameters;
1277-import org.bouncycastle.crypto.params.ElGamalParameters;
1278-import org.bouncycastle.crypto.params.ElGamalPublicKeyParameters;
1279+// BEGIN android-removed
1280+// import org.bouncycastle.crypto.params.ElGamalParameters;
1281+// import org.bouncycastle.crypto.params.ElGamalPublicKeyParameters;
1282+// END android-removed
1283 import org.bouncycastle.crypto.params.RSAKeyParameters;
1284 
1285 /**
1286@@ -135,14 +141,16 @@
1287 
1288             return new DHPublicKeyParameters(derY.getValue(), dhParams);
1289         }
1290-        else if (algId.getAlgorithm().equals(OIWObjectIdentifiers.elGamalAlgorithm))
1291-        {
1292-            ElGamalParameter params = new ElGamalParameter((ASN1Sequence)algId.getParameters());
1293-            DERInteger derY = (DERInteger)keyInfo.parsePublicKey();
1294-
1295-            return new ElGamalPublicKeyParameters(derY.getValue(), new ElGamalParameters(
1296-                params.getP(), params.getG()));
1297-        }
1298+        // BEGIN android-removed
1299+        // else if (algId.getAlgorithm().equals(OIWObjectIdentifiers.elGamalAlgorithm))
1300+        // {
1301+        //     ElGamalParameter params = new ElGamalParameter((ASN1Sequence)algId.getParameters());
1302+        //     DERInteger derY = (DERInteger)keyInfo.parsePublicKey();
1303+        //
1304+        //     return new ElGamalPublicKeyParameters(derY.getValue(), new ElGamalParameters(
1305+        //         params.getP(), params.getG()));
1306+        // }
1307+        // END android-removed
1308         else if (algId.getAlgorithm().equals(X9ObjectIdentifiers.id_dsa)
1309             || algId.getAlgorithm().equals(OIWObjectIdentifiers.dsaWithSHA1))
1310         {
1311@@ -177,10 +185,12 @@
1312                     {
1313                         x9 = NISTNamedCurves.getByOID(oid);
1314 
1315-                        if (x9 == null)
1316-                        {
1317-                            x9 = TeleTrusTNamedCurves.getByOID(oid);
1318-                        }
1319+                        // BEGIN android-removed
1320+                        // if (x9 == null)
1321+                        // {
1322+                        //     x9 = TeleTrusTNamedCurves.getByOID(oid);
1323+                        // }
1324+                        // END android-removed
1325                     }
1326                 }
1327             }
1328diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/asymmetric/DSA.java bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/asymmetric/DSA.java
1329--- bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/asymmetric/DSA.java	2012-03-22 15:11:48.000000000 +0000
1330+++ bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/asymmetric/DSA.java	2012-09-19 21:17:12.000000000 +0000
1331@@ -27,26 +27,34 @@
1332             provider.addAlgorithm("KeyPairGenerator.DSA", PREFIX + "KeyPairGeneratorSpi");
1333             provider.addAlgorithm("KeyFactory.DSA", PREFIX + "KeyFactorySpi");
1334 
1335-            provider.addAlgorithm("Signature.DSA", PREFIX + "DSASigner$stdDSA");
1336+            // BEGIN android-changed
1337+            provider.addAlgorithm("Signature.SHA1withDSA", PREFIX + "DSASigner$stdDSA");
1338+            // END android-changed
1339             provider.addAlgorithm("Signature.NONEWITHDSA", PREFIX + "DSASigner$noneDSA");
1340 
1341             provider.addAlgorithm("Alg.Alias.Signature.RAWDSA", "NONEWITHDSA");
1342 
1343-            addSignatureAlgorithm(provider, "SHA224", "DSA", PREFIX + "DSASigner$dsa224", NISTObjectIdentifiers.dsa_with_sha224);
1344-            addSignatureAlgorithm(provider, "SHA256", "DSA", PREFIX + "DSASigner$dsa256", NISTObjectIdentifiers.dsa_with_sha256);
1345-            addSignatureAlgorithm(provider, "SHA384", "DSA", PREFIX + "DSASigner$dsa384", NISTObjectIdentifiers.dsa_with_sha384);
1346-            addSignatureAlgorithm(provider, "SHA512", "DSA", PREFIX + "DSASigner$dsa512", NISTObjectIdentifiers.dsa_with_sha512);
1347-
1348-            provider.addAlgorithm("Alg.Alias.Signature.SHA/DSA", "DSA");
1349-            provider.addAlgorithm("Alg.Alias.Signature.SHA1withDSA", "DSA");
1350-            provider.addAlgorithm("Alg.Alias.Signature.SHA1WITHDSA", "DSA");
1351-            provider.addAlgorithm("Alg.Alias.Signature.1.3.14.3.2.26with1.2.840.10040.4.1", "DSA");
1352-            provider.addAlgorithm("Alg.Alias.Signature.1.3.14.3.2.26with1.2.840.10040.4.3", "DSA");
1353-            provider.addAlgorithm("Alg.Alias.Signature.DSAwithSHA1", "DSA");
1354-            provider.addAlgorithm("Alg.Alias.Signature.DSAWITHSHA1", "DSA");
1355-            provider.addAlgorithm("Alg.Alias.Signature.SHA1WithDSA", "DSA");
1356-            provider.addAlgorithm("Alg.Alias.Signature.DSAWithSHA1", "DSA");
1357-            provider.addAlgorithm("Alg.Alias.Signature.1.2.840.10040.4.3", "DSA");
1358+            // BEGIN android-removed
1359+            // addSignatureAlgorithm(provider, "SHA224", "DSA", PREFIX + "DSASigner$dsa224", NISTObjectIdentifiers.dsa_with_sha224);
1360+            // addSignatureAlgorithm(provider, "SHA256", "DSA", PREFIX + "DSASigner$dsa256", NISTObjectIdentifiers.dsa_with_sha256);
1361+            // addSignatureAlgorithm(provider, "SHA384", "DSA", PREFIX + "DSASigner$dsa384", NISTObjectIdentifiers.dsa_with_sha384);
1362+            // addSignatureAlgorithm(provider, "SHA512", "DSA", PREFIX + "DSASigner$dsa512", NISTObjectIdentifiers.dsa_with_sha512);
1363+            // END android-removed
1364+
1365+            // BEGIN android-added
1366+            provider.addAlgorithm("Alg.Alias.Signature.DSA", "SHA1withDSA");
1367+            // END android-added
1368+            // BEGIN android-changed
1369+            provider.addAlgorithm("Alg.Alias.Signature.SHA/DSA", "SHA1withDSA");
1370+            provider.addAlgorithm("Alg.Alias.Signature.SHA1WITHDSA", "SHA1withDSA");
1371+            provider.addAlgorithm("Alg.Alias.Signature.1.3.14.3.2.26with1.2.840.10040.4.1", "SHA1withDSA");
1372+            provider.addAlgorithm("Alg.Alias.Signature.1.3.14.3.2.26with1.2.840.10040.4.3", "SHA1withDSA");
1373+            provider.addAlgorithm("Alg.Alias.Signature.DSAwithSHA1", "SHA1withDSA");
1374+            provider.addAlgorithm("Alg.Alias.Signature.DSAWITHSHA1", "SHA1withDSA");
1375+            provider.addAlgorithm("Alg.Alias.Signature.SHA1WithDSA", "SHA1withDSA");
1376+            provider.addAlgorithm("Alg.Alias.Signature.DSAWithSHA1", "SHA1withDSA");
1377+            provider.addAlgorithm("Alg.Alias.Signature.1.2.840.10040.4.3", "SHA1withDSA");
1378+            // END android-changed
1379 
1380             AsymmetricKeyInfoConverter keyFact = new KeyFactorySpi();
1381 
1382diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/asymmetric/EC.java bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/asymmetric/EC.java
1383--- bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/asymmetric/EC.java	2012-03-22 15:11:48.000000000 +0000
1384+++ bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/asymmetric/EC.java	2012-09-19 21:17:12.000000000 +0000
1385@@ -1,7 +1,9 @@
1386 package org.bouncycastle.jcajce.provider.asymmetric;
1387 
1388-import org.bouncycastle.asn1.eac.EACObjectIdentifiers;
1389-import org.bouncycastle.asn1.teletrust.TeleTrusTObjectIdentifiers;
1390+// BEGIN android-removed
1391+// import org.bouncycastle.asn1.eac.EACObjectIdentifiers;
1392+// import org.bouncycastle.asn1.teletrust.TeleTrusTObjectIdentifiers;
1393+// END android-removed
1394 import org.bouncycastle.asn1.x9.X9ObjectIdentifiers;
1395 import org.bouncycastle.jcajce.provider.asymmetric.ec.KeyFactorySpi;
1396 import org.bouncycastle.jcajce.provider.config.ConfigurableProvider;
1397@@ -21,33 +23,43 @@
1398         public void configure(ConfigurableProvider provider)
1399         {
1400             provider.addAlgorithm("KeyAgreement.ECDH", PREFIX + "KeyAgreementSpi$DH");
1401-            provider.addAlgorithm("KeyAgreement.ECDHC", PREFIX + "KeyAgreementSpi$DHC");
1402-            provider.addAlgorithm("KeyAgreement.ECMQV", PREFIX + "KeyAgreementSpi$MQV");
1403-            provider.addAlgorithm("KeyAgreement." + X9ObjectIdentifiers.dhSinglePass_stdDH_sha1kdf_scheme, PREFIX + "KeyAgreementSpi$DHwithSHA1KDF");
1404-            provider.addAlgorithm("KeyAgreement." + X9ObjectIdentifiers.mqvSinglePass_sha1kdf_scheme, PREFIX + "KeyAgreementSpi$MQVwithSHA1KDF");
1405+            // BEGIN android-removed
1406+            // provider.addAlgorithm("KeyAgreement.ECDHC", PREFIX + "KeyAgreementSpi$DHC");
1407+            // provider.addAlgorithm("KeyAgreement.ECMQV", PREFIX + "KeyAgreementSpi$MQV");
1408+            // provider.addAlgorithm("KeyAgreement." + X9ObjectIdentifiers.dhSinglePass_stdDH_sha1kdf_scheme, PREFIX + "KeyAgreementSpi$DHwithSHA1KDF");
1409+            // provider.addAlgorithm("KeyAgreement." + X9ObjectIdentifiers.mqvSinglePass_sha1kdf_scheme, PREFIX + "KeyAgreementSpi$MQVwithSHA1KDF");
1410+            // END android-removed
1411 
1412             registerOid(provider, X9ObjectIdentifiers.id_ecPublicKey, "EC", new KeyFactorySpi.EC());
1413             // TODO Should this be an alias for ECDH?
1414             registerOid(provider, X9ObjectIdentifiers.dhSinglePass_stdDH_sha1kdf_scheme, "EC", new KeyFactorySpi.EC());
1415-            registerOid(provider, X9ObjectIdentifiers.mqvSinglePass_sha1kdf_scheme, "ECMQV", new KeyFactorySpi.ECMQV());
1416-
1417-            registerOidAlgorithmParameters(provider, X9ObjectIdentifiers.id_ecPublicKey, "EC");
1418-            // TODO Should this be an alias for ECDH?
1419-            registerOidAlgorithmParameters(provider, X9ObjectIdentifiers.dhSinglePass_stdDH_sha1kdf_scheme, "EC");
1420-            registerOidAlgorithmParameters(provider, X9ObjectIdentifiers.mqvSinglePass_sha1kdf_scheme, "EC");
1421+            // BEGIN android-removed
1422+            // registerOid(provider, X9ObjectIdentifiers.mqvSinglePass_sha1kdf_scheme, "ECMQV", new KeyFactorySpi.ECMQV());
1423+            // END android-removed
1424+
1425+            // BEGIN android-removed
1426+            // registerOidAlgorithmParameters(provider, X9ObjectIdentifiers.id_ecPublicKey, "EC");
1427+            // // TODO Should this be an alias for ECDH?
1428+            // registerOidAlgorithmParameters(provider, X9ObjectIdentifiers.dhSinglePass_stdDH_sha1kdf_scheme, "EC");
1429+            // registerOidAlgorithmParameters(provider, X9ObjectIdentifiers.mqvSinglePass_sha1kdf_scheme, "EC");
1430+            // END android-removed
1431 
1432             provider.addAlgorithm("KeyFactory.EC", PREFIX + "KeyFactorySpi$EC");
1433-            provider.addAlgorithm("KeyFactory.ECDSA", PREFIX + "KeyFactorySpi$ECDSA");
1434-            provider.addAlgorithm("KeyFactory.ECDH", PREFIX + "KeyFactorySpi$ECDH");
1435-            provider.addAlgorithm("KeyFactory.ECDHC", PREFIX + "KeyFactorySpi$ECDHC");
1436-            provider.addAlgorithm("KeyFactory.ECMQV", PREFIX + "KeyFactorySpi$ECMQV");
1437+            // BEGIN android-removed
1438+            // provider.addAlgorithm("KeyFactory.ECDSA", PREFIX + "KeyFactorySpi$ECDSA");
1439+            // provider.addAlgorithm("KeyFactory.ECDH", PREFIX + "KeyFactorySpi$ECDH");
1440+            // provider.addAlgorithm("KeyFactory.ECDHC", PREFIX + "KeyFactorySpi$ECDHC");
1441+            // provider.addAlgorithm("KeyFactory.ECMQV", PREFIX + "KeyFactorySpi$ECMQV");
1442+            // END android-removed
1443 
1444             provider.addAlgorithm("KeyPairGenerator.EC", PREFIX + "KeyPairGeneratorSpi$EC");
1445-            provider.addAlgorithm("KeyPairGenerator.ECDSA", PREFIX + "KeyPairGeneratorSpi$ECDSA");
1446-            provider.addAlgorithm("KeyPairGenerator.ECDH", PREFIX + "KeyPairGeneratorSpi$ECDH");
1447-            provider.addAlgorithm("KeyPairGenerator.ECDHC", PREFIX + "KeyPairGeneratorSpi$ECDHC");
1448-            provider.addAlgorithm("KeyPairGenerator.ECIES", PREFIX + "KeyPairGeneratorSpi$ECDH");
1449-            provider.addAlgorithm("KeyPairGenerator.ECMQV", PREFIX + "KeyPairGeneratorSpi$ECMQV");
1450+            // BEGIN android-removed
1451+            // provider.addAlgorithm("KeyPairGenerator.ECDSA", PREFIX + "KeyPairGeneratorSpi$ECDSA");
1452+            // provider.addAlgorithm("KeyPairGenerator.ECDH", PREFIX + "KeyPairGeneratorSpi$ECDH");
1453+            // provider.addAlgorithm("KeyPairGenerator.ECDHC", PREFIX + "KeyPairGeneratorSpi$ECDHC");
1454+            // provider.addAlgorithm("KeyPairGenerator.ECIES", PREFIX + "KeyPairGeneratorSpi$ECDH");
1455+            // provider.addAlgorithm("KeyPairGenerator.ECMQV", PREFIX + "KeyPairGeneratorSpi$ECMQV");
1456+            // END android-removed
1457 
1458             provider.addAlgorithm("Signature.ECDSA", PREFIX + "SignatureSpi$ecDSA");
1459             provider.addAlgorithm("Signature.NONEwithECDSA", PREFIX + "SignatureSpi$ecDSAnone");
1460@@ -59,23 +71,29 @@
1461             provider.addAlgorithm("Alg.Alias.Signature.SHA1WithECDSA", "ECDSA");
1462             provider.addAlgorithm("Alg.Alias.Signature.ECDSAWithSHA1", "ECDSA");
1463             provider.addAlgorithm("Alg.Alias.Signature.1.2.840.10045.4.1", "ECDSA");
1464-            provider.addAlgorithm("Alg.Alias.Signature." + TeleTrusTObjectIdentifiers.ecSignWithSha1, "ECDSA");
1465-
1466-            addSignatureAlgorithm(provider, "SHA224", "ECDSA", PREFIX + "SignatureSpi$ecDSA224", X9ObjectIdentifiers.ecdsa_with_SHA224);
1467+            // BEGIN android-removed
1468+            // provider.addAlgorithm("Alg.Alias.Signature." + TeleTrusTObjectIdentifiers.ecSignWithSha1, "ECDSA");
1469+            // END android-removed
1470+
1471+            // BEGIN android-removed
1472+            // addSignatureAlgorithm(provider, "SHA224", "ECDSA", PREFIX + "SignatureSpi$ecDSA224", X9ObjectIdentifiers.ecdsa_with_SHA224);
1473+            // END android-removed
1474             addSignatureAlgorithm(provider, "SHA256", "ECDSA", PREFIX + "SignatureSpi$ecDSA256", X9ObjectIdentifiers.ecdsa_with_SHA256);
1475             addSignatureAlgorithm(provider, "SHA384", "ECDSA", PREFIX + "SignatureSpi$ecDSA384", X9ObjectIdentifiers.ecdsa_with_SHA384);
1476             addSignatureAlgorithm(provider, "SHA512", "ECDSA", PREFIX + "SignatureSpi$ecDSA512", X9ObjectIdentifiers.ecdsa_with_SHA512);
1477-            addSignatureAlgorithm(provider, "RIPEMD160", "ECDSA", PREFIX + "SignatureSpi$ecDSARipeMD160",TeleTrusTObjectIdentifiers.ecSignWithRipemd160);
1478-
1479-            provider.addAlgorithm("Signature.SHA1WITHECNR", PREFIX + "SignatureSpi$ecNR");
1480-            provider.addAlgorithm("Signature.SHA224WITHECNR", PREFIX + "SignatureSpi$ecNR224");
1481-            provider.addAlgorithm("Signature.SHA256WITHECNR", PREFIX + "SignatureSpi$ecNR256");
1482-            provider.addAlgorithm("Signature.SHA384WITHECNR", PREFIX + "SignatureSpi$ecNR384");
1483-            provider.addAlgorithm("Signature.SHA512WITHECNR", PREFIX + "SignatureSpi$ecNR512");
1484-
1485-            addSignatureAlgorithm(provider, "SHA1", "CVC-ECDSA", PREFIX + "SignatureSpi$ecCVCDSA", EACObjectIdentifiers.id_TA_ECDSA_SHA_1);
1486-            addSignatureAlgorithm(provider, "SHA224", "CVC-ECDSA", PREFIX + "SignatureSpi$ecCVCDSA224", EACObjectIdentifiers.id_TA_ECDSA_SHA_224);
1487-            addSignatureAlgorithm(provider, "SHA256", "CVC-ECDSA", PREFIX + "SignatureSpi$ecCVCDSA256", EACObjectIdentifiers.id_TA_ECDSA_SHA_256);
1488+            // BEGIN android-removed
1489+            // addSignatureAlgorithm(provider, "RIPEMD160", "ECDSA", PREFIX + "SignatureSpi$ecDSARipeMD160",TeleTrusTObjectIdentifiers.ecSignWithRipemd160);
1490+            //
1491+            // provider.addAlgorithm("Signature.SHA1WITHECNR", PREFIX + "SignatureSpi$ecNR");
1492+            // provider.addAlgorithm("Signature.SHA224WITHECNR", PREFIX + "SignatureSpi$ecNR224");
1493+            // provider.addAlgorithm("Signature.SHA256WITHECNR", PREFIX + "SignatureSpi$ecNR256");
1494+            // provider.addAlgorithm("Signature.SHA384WITHECNR", PREFIX + "SignatureSpi$ecNR384");
1495+            // provider.addAlgorithm("Signature.SHA512WITHECNR", PREFIX + "SignatureSpi$ecNR512");
1496+            //
1497+            // addSignatureAlgorithm(provider, "SHA1", "CVC-ECDSA", PREFIX + "SignatureSpi$ecCVCDSA", EACObjectIdentifiers.id_TA_ECDSA_SHA_1);
1498+            // addSignatureAlgorithm(provider, "SHA224", "CVC-ECDSA", PREFIX + "SignatureSpi$ecCVCDSA224", EACObjectIdentifiers.id_TA_ECDSA_SHA_224);
1499+            // addSignatureAlgorithm(provider, "SHA256", "CVC-ECDSA", PREFIX + "SignatureSpi$ecCVCDSA256", EACObjectIdentifiers.id_TA_ECDSA_SHA_256);
1500+            // END android-removed
1501         }
1502     }
1503 }
1504diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/asymmetric/RSA.java bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/asymmetric/RSA.java
1505--- bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/asymmetric/RSA.java	2012-03-22 15:11:48.000000000 +0000
1506+++ bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/asymmetric/RSA.java	2012-11-01 06:02:09.000000000 +0000
1507@@ -3,7 +3,9 @@
1508 import org.bouncycastle.asn1.ASN1ObjectIdentifier;
1509 import org.bouncycastle.asn1.oiw.OIWObjectIdentifiers;
1510 import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
1511-import org.bouncycastle.asn1.teletrust.TeleTrusTObjectIdentifiers;
1512+// BEGIN android-removed
1513+// import org.bouncycastle.asn1.teletrust.TeleTrusTObjectIdentifiers;
1514+// END android-removed
1515 import org.bouncycastle.asn1.x509.X509ObjectIdentifiers;
1516 import org.bouncycastle.jcajce.provider.asymmetric.rsa.KeyFactorySpi;
1517 import org.bouncycastle.jcajce.provider.config.ConfigurableProvider;
1518@@ -24,41 +26,49 @@
1519         public void configure(ConfigurableProvider provider)
1520         {
1521             provider.addAlgorithm("AlgorithmParameters.OAEP", PREFIX + "AlgorithmParametersSpi$OAEP");
1522-            provider.addAlgorithm("AlgorithmParameters.PSS", PREFIX + "AlgorithmParametersSpi$PSS");
1523-
1524-            provider.addAlgorithm("Alg.Alias.AlgorithmParameters.RSAPSS", "PSS");
1525-            provider.addAlgorithm("Alg.Alias.AlgorithmParameters.RSASSA-PSS", "PSS");
1526-
1527-            provider.addAlgorithm("Alg.Alias.AlgorithmParameters.SHA224withRSA/PSS", "PSS");
1528-            provider.addAlgorithm("Alg.Alias.AlgorithmParameters.SHA256withRSA/PSS", "PSS");
1529-            provider.addAlgorithm("Alg.Alias.AlgorithmParameters.SHA384withRSA/PSS", "PSS");
1530-            provider.addAlgorithm("Alg.Alias.AlgorithmParameters.SHA512withRSA/PSS", "PSS");
1531-
1532-            provider.addAlgorithm("Alg.Alias.AlgorithmParameters.SHA224WITHRSAANDMGF1", "PSS");
1533-            provider.addAlgorithm("Alg.Alias.AlgorithmParameters.SHA256WITHRSAANDMGF1", "PSS");
1534-            provider.addAlgorithm("Alg.Alias.AlgorithmParameters.SHA384WITHRSAANDMGF1", "PSS");
1535-            provider.addAlgorithm("Alg.Alias.AlgorithmParameters.SHA512WITHRSAANDMGF1", "PSS");
1536-            provider.addAlgorithm("Alg.Alias.AlgorithmParameters.RAWRSAPSS", "PSS");
1537-            provider.addAlgorithm("Alg.Alias.AlgorithmParameters.NONEWITHRSAPSS", "PSS");
1538-            provider.addAlgorithm("Alg.Alias.AlgorithmParameters.NONEWITHRSASSA-PSS", "PSS");
1539-            provider.addAlgorithm("Alg.Alias.AlgorithmParameters.NONEWITHRSAANDMGF1", "PSS");
1540+            // BEGIN android-removed
1541+            // provider.addAlgorithm("AlgorithmParameters.PSS", PREFIX + "AlgorithmParametersSpi$PSS");
1542+            //
1543+            // provider.addAlgorithm("Alg.Alias.AlgorithmParameters.RSAPSS", "PSS");
1544+            // provider.addAlgorithm("Alg.Alias.AlgorithmParameters.RSASSA-PSS", "PSS");
1545+            //
1546+            // provider.addAlgorithm("Alg.Alias.AlgorithmParameters.SHA224withRSA/PSS", "PSS");
1547+            // provider.addAlgorithm("Alg.Alias.AlgorithmParameters.SHA256withRSA/PSS", "PSS");
1548+            // provider.addAlgorithm("Alg.Alias.AlgorithmParameters.SHA384withRSA/PSS", "PSS");
1549+            // provider.addAlgorithm("Alg.Alias.AlgorithmParameters.SHA512withRSA/PSS", "PSS");
1550+            //
1551+            // provider.addAlgorithm("Alg.Alias.AlgorithmParameters.SHA224WITHRSAANDMGF1", "PSS");
1552+            // provider.addAlgorithm("Alg.Alias.AlgorithmParameters.SHA256WITHRSAANDMGF1", "PSS");
1553+            // provider.addAlgorithm("Alg.Alias.AlgorithmParameters.SHA384WITHRSAANDMGF1", "PSS");
1554+            // provider.addAlgorithm("Alg.Alias.AlgorithmParameters.SHA512WITHRSAANDMGF1", "PSS");
1555+            // provider.addAlgorithm("Alg.Alias.AlgorithmParameters.RAWRSAPSS", "PSS");
1556+            // provider.addAlgorithm("Alg.Alias.AlgorithmParameters.NONEWITHRSAPSS", "PSS");
1557+            // provider.addAlgorithm("Alg.Alias.AlgorithmParameters.NONEWITHRSASSA-PSS", "PSS");
1558+            // provider.addAlgorithm("Alg.Alias.AlgorithmParameters.NONEWITHRSAANDMGF1", "PSS");
1559+            // END android-removed
1560 
1561             provider.addAlgorithm("Cipher.RSA", PREFIX + "CipherSpi$NoPadding");
1562-            provider.addAlgorithm("Cipher.RSA/RAW", PREFIX + "CipherSpi$NoPadding");
1563-            provider.addAlgorithm("Cipher.RSA/PKCS1", PREFIX + "CipherSpi$PKCS1v1_5Padding");
1564-            provider.addAlgorithm("Cipher.1.2.840.113549.1.1.1", PREFIX + "CipherSpi$PKCS1v1_5Padding");
1565-            provider.addAlgorithm("Cipher.2.5.8.1.1", PREFIX + "CipherSpi$PKCS1v1_5Padding");
1566-            provider.addAlgorithm("Cipher.RSA/1", PREFIX + "CipherSpi$PKCS1v1_5Padding_PrivateOnly");
1567-            provider.addAlgorithm("Cipher.RSA/2", PREFIX + "CipherSpi$PKCS1v1_5Padding_PublicOnly");
1568-            provider.addAlgorithm("Cipher.RSA/OAEP", PREFIX + "CipherSpi$OAEPPadding");
1569-            provider.addAlgorithm("Cipher." + PKCSObjectIdentifiers.id_RSAES_OAEP, PREFIX + "CipherSpi$OAEPPadding");
1570-            provider.addAlgorithm("Cipher.RSA/ISO9796-1", PREFIX + "CipherSpi$ISO9796d1Padding");
1571+            // BEGIN android-changed
1572+            provider.addAlgorithm("Alg.Alias.Cipher.RSA/RAW", "RSA");
1573+            // END android-changed
1574+            // BEGIN android-removed
1575+            // provider.addAlgorithm("Cipher.RSA/PKCS1", PREFIX + "CipherSpi$PKCS1v1_5Padding");
1576+            // provider.addAlgorithm("Cipher.1.2.840.113549.1.1.1", PREFIX + "CipherSpi$PKCS1v1_5Padding");
1577+            // provider.addAlgorithm("Cipher.2.5.8.1.1", PREFIX + "CipherSpi$PKCS1v1_5Padding");
1578+            // provider.addAlgorithm("Cipher.RSA/1", PREFIX + "CipherSpi$PKCS1v1_5Padding_PrivateOnly");
1579+            // provider.addAlgorithm("Cipher.RSA/2", PREFIX + "CipherSpi$PKCS1v1_5Padding_PublicOnly");
1580+            // provider.addAlgorithm("Cipher.RSA/OAEP", PREFIX + "CipherSpi$OAEPPadding");
1581+            // provider.addAlgorithm("Cipher." + PKCSObjectIdentifiers.id_RSAES_OAEP, PREFIX + "CipherSpi$OAEPPadding");
1582+            // provider.addAlgorithm("Cipher.RSA/ISO9796-1", PREFIX + "CipherSpi$ISO9796d1Padding");
1583+            // END android-removed
1584 
1585             provider.addAlgorithm("Alg.Alias.Cipher.RSA//RAW", "RSA");
1586             provider.addAlgorithm("Alg.Alias.Cipher.RSA//NOPADDING", "RSA");
1587-            provider.addAlgorithm("Alg.Alias.Cipher.RSA//PKCS1PADDING", "RSA/PKCS1");
1588-            provider.addAlgorithm("Alg.Alias.Cipher.RSA//OAEPPADDING", "RSA/OAEP");
1589-            provider.addAlgorithm("Alg.Alias.Cipher.RSA//ISO9796-1PADDING", "RSA/ISO9796-1");
1590+            // BEGIN android-removed
1591+            // provider.addAlgorithm("Alg.Alias.Cipher.RSA//PKCS1PADDING", "RSA/PKCS1");
1592+            // provider.addAlgorithm("Alg.Alias.Cipher.RSA//OAEPPADDING", "RSA/OAEP");
1593+            // provider.addAlgorithm("Alg.Alias.Cipher.RSA//ISO9796-1PADDING", "RSA/ISO9796-1");
1594+            // END android-removed
1595 
1596             provider.addAlgorithm("KeyFactory.RSA", PREFIX + "KeyFactorySpi");
1597             provider.addAlgorithm("KeyPairGenerator.RSA", PREFIX + "KeyPairGeneratorSpi");
1598@@ -68,101 +78,117 @@
1599             registerOid(provider, PKCSObjectIdentifiers.rsaEncryption, "RSA", keyFact);
1600             registerOid(provider, X509ObjectIdentifiers.id_ea_rsa, "RSA", keyFact);
1601             registerOid(provider, PKCSObjectIdentifiers.id_RSAES_OAEP, "RSA", keyFact);
1602-            registerOid(provider, PKCSObjectIdentifiers.id_RSASSA_PSS, "RSA", keyFact);
1603-
1604-            registerOidAlgorithmParameters(provider, PKCSObjectIdentifiers.rsaEncryption, "RSA");
1605-            registerOidAlgorithmParameters(provider, X509ObjectIdentifiers.id_ea_rsa, "RSA");
1606-            registerOidAlgorithmParameters(provider, PKCSObjectIdentifiers.id_RSAES_OAEP, "OAEP");
1607-            registerOidAlgorithmParameters(provider, PKCSObjectIdentifiers.id_RSASSA_PSS, "PSS");
1608-
1609-
1610-            provider.addAlgorithm("Signature.RSASSA-PSS", PREFIX + "PSSSignatureSpi$PSSwithRSA");
1611-            provider.addAlgorithm("Signature." + PKCSObjectIdentifiers.id_RSASSA_PSS, PREFIX + "PSSSignatureSpi$PSSwithRSA");
1612-            provider.addAlgorithm("Signature.OID." + PKCSObjectIdentifiers.id_RSASSA_PSS, PREFIX + "PSSSignatureSpi$PSSwithRSA");
1613-
1614-            provider.addAlgorithm("Signature.SHA224withRSA/PSS", PREFIX + "PSSSignatureSpi$SHA224withRSA");
1615-            provider.addAlgorithm("Signature.SHA256withRSA/PSS", PREFIX + "PSSSignatureSpi$SHA256withRSA");
1616-            provider.addAlgorithm("Signature.SHA384withRSA/PSS", PREFIX + "PSSSignatureSpi$SHA384withRSA");
1617-            provider.addAlgorithm("Signature.SHA512withRSA/PSS", PREFIX + "PSSSignatureSpi$SHA512withRSA");
1618-
1619-            provider.addAlgorithm("Signature.RSA", PREFIX + "DigestSignatureSpi$noneRSA");
1620-            provider.addAlgorithm("Signature.RAWRSASSA-PSS", PREFIX + "PSSSignatureSpi$nonePSS");
1621-
1622-            provider.addAlgorithm("Alg.Alias.Signature.RAWRSA", "RSA");
1623-            provider.addAlgorithm("Alg.Alias.Signature.NONEWITHRSA", "RSA");
1624-            provider.addAlgorithm("Alg.Alias.Signature.RAWRSAPSS", "RAWRSASSA-PSS");
1625-            provider.addAlgorithm("Alg.Alias.Signature.NONEWITHRSAPSS", "RAWRSASSA-PSS");
1626-            provider.addAlgorithm("Alg.Alias.Signature.NONEWITHRSASSA-PSS", "RAWRSASSA-PSS");
1627-            provider.addAlgorithm("Alg.Alias.Signature.NONEWITHRSAANDMGF1", "RAWRSASSA-PSS");
1628-            provider.addAlgorithm("Alg.Alias.Signature.RSAPSS", "RSASSA-PSS");
1629-
1630-
1631-            provider.addAlgorithm("Alg.Alias.Signature.SHA224withRSAandMGF1", "SHA224withRSA/PSS");
1632-            provider.addAlgorithm("Alg.Alias.Signature.SHA256withRSAandMGF1", "SHA256withRSA/PSS");
1633-            provider.addAlgorithm("Alg.Alias.Signature.SHA384withRSAandMGF1", "SHA384withRSA/PSS");
1634-            provider.addAlgorithm("Alg.Alias.Signature.SHA512withRSAandMGF1", "SHA512withRSA/PSS");
1635-            provider.addAlgorithm("Alg.Alias.Signature.SHA224WITHRSAANDMGF1", "SHA224withRSA/PSS");
1636-            provider.addAlgorithm("Alg.Alias.Signature.SHA256WITHRSAANDMGF1", "SHA256withRSA/PSS");
1637-            provider.addAlgorithm("Alg.Alias.Signature.SHA384WITHRSAANDMGF1", "SHA384withRSA/PSS");
1638-            provider.addAlgorithm("Alg.Alias.Signature.SHA512WITHRSAANDMGF1", "SHA512withRSA/PSS");
1639-
1640-            if (provider.hasAlgorithm("MessageDigest", "MD2"))
1641-            {
1642-                addDigestSignature(provider, "MD2", PREFIX + "DigestSignatureSpi$MD2", PKCSObjectIdentifiers.md2WithRSAEncryption);
1643-            }
1644-
1645-            if (provider.hasAlgorithm("MessageDigest", "MD2"))
1646-            {
1647-                addDigestSignature(provider, "MD4", PREFIX + "DigestSignatureSpi$MD4", PKCSObjectIdentifiers.md4WithRSAEncryption);
1648-            }
1649-
1650-            if (provider.hasAlgorithm("MessageDigest", "MD2"))
1651+            // BEGIN android-removed
1652+            // registerOid(provider, PKCSObjectIdentifiers.id_RSASSA_PSS, "RSA", keyFact);
1653+            //
1654+            // registerOidAlgorithmParameters(provider, PKCSObjectIdentifiers.rsaEncryption, "RSA");
1655+            // registerOidAlgorithmParameters(provider, X509ObjectIdentifiers.id_ea_rsa, "RSA");
1656+            // registerOidAlgorithmParameters(provider, PKCSObjectIdentifiers.id_RSAES_OAEP, "OAEP");
1657+            // registerOidAlgorithmParameters(provider, PKCSObjectIdentifiers.id_RSASSA_PSS, "PSS");
1658+            //
1659+            //
1660+            // provider.addAlgorithm("Signature.RSASSA-PSS", PREFIX + "PSSSignatureSpi$PSSwithRSA");
1661+            // provider.addAlgorithm("Signature." + PKCSObjectIdentifiers.id_RSASSA_PSS, PREFIX + "PSSSignatureSpi$PSSwithRSA");
1662+            // provider.addAlgorithm("Signature.OID." + PKCSObjectIdentifiers.id_RSASSA_PSS, PREFIX + "PSSSignatureSpi$PSSwithRSA");
1663+            //
1664+            // provider.addAlgorithm("Signature.SHA224withRSA/PSS", PREFIX + "PSSSignatureSpi$SHA224withRSA");
1665+            // provider.addAlgorithm("Signature.SHA256withRSA/PSS", PREFIX + "PSSSignatureSpi$SHA256withRSA");
1666+            // provider.addAlgorithm("Signature.SHA384withRSA/PSS", PREFIX + "PSSSignatureSpi$SHA384withRSA");
1667+            // provider.addAlgorithm("Signature.SHA512withRSA/PSS", PREFIX + "PSSSignatureSpi$SHA512withRSA");
1668+            //
1669+            // provider.addAlgorithm("Signature.RSA", PREFIX + "DigestSignatureSpi$noneRSA");
1670+            // provider.addAlgorithm("Signature.RAWRSASSA-PSS", PREFIX + "PSSSignatureSpi$nonePSS");
1671+            //
1672+            // provider.addAlgorithm("Alg.Alias.Signature.RAWRSA", "RSA");
1673+            // provider.addAlgorithm("Alg.Alias.Signature.NONEWITHRSA", "RSA");
1674+            // provider.addAlgorithm("Alg.Alias.Signature.RAWRSAPSS", "RAWRSASSA-PSS");
1675+            // provider.addAlgorithm("Alg.Alias.Signature.NONEWITHRSAPSS", "RAWRSASSA-PSS");
1676+            // provider.addAlgorithm("Alg.Alias.Signature.NONEWITHRSASSA-PSS", "RAWRSASSA-PSS");
1677+            // provider.addAlgorithm("Alg.Alias.Signature.NONEWITHRSAANDMGF1", "RAWRSASSA-PSS");
1678+            // provider.addAlgorithm("Alg.Alias.Signature.RSAPSS", "RSASSA-PSS");
1679+            //
1680+            //
1681+            // provider.addAlgorithm("Alg.Alias.Signature.SHA224withRSAandMGF1", "SHA224withRSA/PSS");
1682+            // provider.addAlgorithm("Alg.Alias.Signature.SHA256withRSAandMGF1", "SHA256withRSA/PSS");
1683+            // provider.addAlgorithm("Alg.Alias.Signature.SHA384withRSAandMGF1", "SHA384withRSA/PSS");
1684+            // provider.addAlgorithm("Alg.Alias.Signature.SHA512withRSAandMGF1", "SHA512withRSA/PSS");
1685+            // provider.addAlgorithm("Alg.Alias.Signature.SHA224WITHRSAANDMGF1", "SHA224withRSA/PSS");
1686+            // provider.addAlgorithm("Alg.Alias.Signature.SHA256WITHRSAANDMGF1", "SHA256withRSA/PSS");
1687+            // provider.addAlgorithm("Alg.Alias.Signature.SHA384WITHRSAANDMGF1", "SHA384withRSA/PSS");
1688+            // provider.addAlgorithm("Alg.Alias.Signature.SHA512WITHRSAANDMGF1", "SHA512withRSA/PSS");
1689+            //
1690+            // if (provider.hasAlgorithm("MessageDigest", "MD2"))
1691+            // {
1692+            //     addDigestSignature(provider, "MD2", PREFIX + "DigestSignatureSpi$MD2", PKCSObjectIdentifiers.md2WithRSAEncryption);
1693+            // }
1694+            //
1695+            // // BEGIN android-changed
1696+            // if (provider.hasAlgorithm("MessageDigest", "MD4"))
1697+            // // END android-changed
1698+            // {
1699+            //     addDigestSignature(provider, "MD4", PREFIX + "DigestSignatureSpi$MD4", PKCSObjectIdentifiers.md4WithRSAEncryption);
1700+            // }
1701+            // END android-removed
1702+
1703+            // BEGIN android-changed
1704+            if (provider.hasAlgorithm("MessageDigest", "MD5"))
1705+            // END android-changed
1706             {
1707                 addDigestSignature(provider, "MD5", PREFIX + "DigestSignatureSpi$MD5", PKCSObjectIdentifiers.md5WithRSAEncryption);
1708-                provider.addAlgorithm("Signature.MD5withRSA/ISO9796-2", PREFIX + "ISOSignatureSpi$MD5WithRSAEncryption");
1709-                provider.addAlgorithm("Alg.Alias.Signature.MD5WithRSA/ISO9796-2", "MD5withRSA/ISO9796-2");
1710+                // BEGIN android-removed
1711+                // provider.addAlgorithm("Signature.MD5withRSA/ISO9796-2", PREFIX + "ISOSignatureSpi$MD5WithRSAEncryption");
1712+                // provider.addAlgorithm("Alg.Alias.Signature.MD5WithRSA/ISO9796-2", "MD5withRSA/ISO9796-2");
1713+                // END android-removed
1714             }
1715 
1716             if (provider.hasAlgorithm("MessageDigest", "SHA1"))
1717             {
1718-                provider.addAlgorithm("Alg.Alias.AlgorithmParameters.SHA1withRSA/PSS", "PSS");
1719-                provider.addAlgorithm("Alg.Alias.AlgorithmParameters.SHA1WITHRSAANDMGF1", "PSS");
1720-                provider.addAlgorithm("Signature.SHA1withRSA/PSS", PREFIX + "PSSSignatureSpi$SHA1withRSA");
1721-                provider.addAlgorithm("Alg.Alias.Signature.SHA1withRSAandMGF1", "SHA1withRSA/PSS");
1722-                provider.addAlgorithm("Alg.Alias.Signature.SHA1WITHRSAANDMGF1", "SHA1withRSA/PSS");
1723+                // BEGIN android-removed
1724+                // provider.addAlgorithm("Alg.Alias.AlgorithmParameters.SHA1withRSA/PSS", "PSS");
1725+                // provider.addAlgorithm("Alg.Alias.AlgorithmParameters.SHA1WITHRSAANDMGF1", "PSS");
1726+                // provider.addAlgorithm("Signature.SHA1withRSA/PSS", PREFIX + "PSSSignatureSpi$SHA1withRSA");
1727+                // provider.addAlgorithm("Alg.Alias.Signature.SHA1withRSAandMGF1", "SHA1withRSA/PSS");
1728+                // provider.addAlgorithm("Alg.Alias.Signature.SHA1WITHRSAANDMGF1", "SHA1withRSA/PSS");
1729+                // END android-removed
1730 
1731                 addDigestSignature(provider, "SHA1", PREFIX + "DigestSignatureSpi$SHA1", PKCSObjectIdentifiers.sha1WithRSAEncryption);
1732 
1733-                provider.addAlgorithm("Alg.Alias.Signature.SHA1WithRSA/ISO9796-2", "SHA1withRSA/ISO9796-2");
1734-                provider.addAlgorithm("Signature.SHA1withRSA/ISO9796-2", PREFIX + "ISOSignatureSpi$SHA1WithRSAEncryption");
1735+                // BEGIN android-removed
1736+                // provider.addAlgorithm("Alg.Alias.Signature.SHA1WithRSA/ISO9796-2", "SHA1withRSA/ISO9796-2");
1737+                // provider.addAlgorithm("Signature.SHA1withRSA/ISO9796-2", PREFIX + "ISOSignatureSpi$SHA1WithRSAEncryption");
1738+                // END android-removed
1739                 provider.addAlgorithm("Alg.Alias.Signature." + OIWObjectIdentifiers.sha1WithRSA, "SHA1WITHRSA");
1740                 provider.addAlgorithm("Alg.Alias.Signature.OID." + OIWObjectIdentifiers.sha1WithRSA, "SHA1WITHRSA");
1741             }
1742 
1743-            addDigestSignature(provider, "SHA224", PREFIX + "DigestSignatureSpi$SHA224", PKCSObjectIdentifiers.sha224WithRSAEncryption);
1744+            // BEGIN android-removed
1745+            // addDigestSignature(provider, "SHA224", PREFIX + "DigestSignatureSpi$SHA224", PKCSObjectIdentifiers.sha224WithRSAEncryption);
1746+            // END android-removed
1747             addDigestSignature(provider, "SHA256", PREFIX + "DigestSignatureSpi$SHA256", PKCSObjectIdentifiers.sha256WithRSAEncryption);
1748             addDigestSignature(provider, "SHA384", PREFIX + "DigestSignatureSpi$SHA384", PKCSObjectIdentifiers.sha384WithRSAEncryption);
1749             addDigestSignature(provider, "SHA512", PREFIX + "DigestSignatureSpi$SHA512", PKCSObjectIdentifiers.sha512WithRSAEncryption);
1750 
1751-            if (provider.hasAlgorithm("MessageDigest", "RIPEMD128"))
1752-            {
1753-                addDigestSignature(provider, "RIPEMD128", PREFIX + "DigestSignatureSpi$RIPEMD128", TeleTrusTObjectIdentifiers.rsaSignatureWithripemd128);
1754-                addDigestSignature(provider, "RMD128", PREFIX + "DigestSignatureSpi$RIPEMD128", null);
1755-            }
1756-
1757-            if (provider.hasAlgorithm("MessageDigest", "RIPEMD160"))
1758-            {
1759-                addDigestSignature(provider, "RIPEMD160", PREFIX + "DigestSignatureSpi$RIPEMD160", TeleTrusTObjectIdentifiers.rsaSignatureWithripemd160);
1760-                addDigestSignature(provider, "RMD160", PREFIX + "DigestSignatureSpi$RIPEMD160", null);
1761-                provider.addAlgorithm("Alg.Alias.Signature.RIPEMD160WithRSA/ISO9796-2", "RIPEMD160withRSA/ISO9796-2");
1762-                provider.addAlgorithm("Signature.RIPEMD160withRSA/ISO9796-2", PREFIX + "ISOSignatureSpi$RIPEMD160WithRSAEncryption");
1763-            }
1764-
1765-            if (provider.hasAlgorithm("MessageDigest", "RIPEMD256"))
1766-            {
1767-                addDigestSignature(provider, "RIPEMD256", PREFIX + "DigestSignatureSpi$RIPEMD256", TeleTrusTObjectIdentifiers.rsaSignatureWithripemd256);
1768-                addDigestSignature(provider, "RMD256", PREFIX + "DigestSignatureSpi$RIPEMD256", null);
1769-            }
1770+            // BEGIN android-removed
1771+            // if (provider.hasAlgorithm("MessageDigest", "RIPEMD128"))
1772+            // {
1773+            //     addDigestSignature(provider, "RIPEMD128", PREFIX + "DigestSignatureSpi$RIPEMD128", TeleTrusTObjectIdentifiers.rsaSignatureWithripemd128);
1774+            //     addDigestSignature(provider, "RMD128", PREFIX + "DigestSignatureSpi$RIPEMD128", null);
1775+            // }
1776+            //
1777+            // if (provider.hasAlgorithm("MessageDigest", "RIPEMD160"))
1778+            // {
1779+            //     addDigestSignature(provider, "RIPEMD160", PREFIX + "DigestSignatureSpi$RIPEMD160", TeleTrusTObjectIdentifiers.rsaSignatureWithripemd160);
1780+            //     addDigestSignature(provider, "RMD160", PREFIX + "DigestSignatureSpi$RIPEMD160", null);
1781+            //     provider.addAlgorithm("Alg.Alias.Signature.RIPEMD160WithRSA/ISO9796-2", "RIPEMD160withRSA/ISO9796-2");
1782+            //     provider.addAlgorithm("Signature.RIPEMD160withRSA/ISO9796-2", PREFIX + "ISOSignatureSpi$RIPEMD160WithRSAEncryption");
1783+            // }
1784+            //
1785+            // if (provider.hasAlgorithm("MessageDigest", "RIPEMD256"))
1786+            // {
1787+            //     addDigestSignature(provider, "RIPEMD256", PREFIX + "DigestSignatureSpi$RIPEMD256", TeleTrusTObjectIdentifiers.rsaSignatureWithripemd256);
1788+            //     addDigestSignature(provider, "RMD256", PREFIX + "DigestSignatureSpi$RIPEMD256", null);
1789+            // }
1790+            // END android-removed
1791         }
1792 
1793         private void addDigestSignature(
1794diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/asymmetric/X509.java bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/asymmetric/X509.java
1795--- bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/asymmetric/X509.java	2012-03-22 15:11:48.000000000 +0000
1796+++ bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/asymmetric/X509.java	2012-09-19 21:17:12.000000000 +0000
1797@@ -18,8 +18,10 @@
1798 
1799         public void configure(ConfigurableProvider provider)
1800         {
1801-            provider.addAlgorithm("KeyFactory.X.509", "org.bouncycastle.jcajce.provider.asymmetric.x509.KeyFactory");
1802-            provider.addAlgorithm("Alg.Alias.KeyFactory.X509", "X.509");
1803+            // BEGIN android-removed
1804+            // provider.addAlgorithm("KeyFactory.X.509", "org.bouncycastle.jcajce.provider.asymmetric.x509.KeyFactory");
1805+            // provider.addAlgorithm("Alg.Alias.KeyFactory.X509", "X.509");
1806+            // END android-removed
1807 
1808             //
1809             // certificate factories.
1810diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/asymmetric/dh/KeyAgreementSpi.java bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/asymmetric/dh/KeyAgreementSpi.java
1811--- bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/asymmetric/dh/KeyAgreementSpi.java	2012-03-22 15:11:48.000000000 +0000
1812+++ bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/asymmetric/dh/KeyAgreementSpi.java	2012-09-19 21:17:12.000000000 +0000
1813@@ -35,10 +35,12 @@
1814 
1815     static
1816     {
1817-        Integer i64 = new Integer(64);
1818-        Integer i192 = new Integer(192);
1819-        Integer i128 = new Integer(128);
1820-        Integer i256 = new Integer(256);
1821+        // BEGIN android-changed
1822+        Integer i64 = Integer.valueOf(64);
1823+        Integer i192 = Integer.valueOf(192);
1824+        Integer i128 = Integer.valueOf(128);
1825+        Integer i256 = Integer.valueOf(256);
1826+        // END android-changed
1827 
1828         algorithms.put("DES", i64);
1829         algorithms.put("DESEDE", i192);
1830diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/asymmetric/dh/KeyPairGeneratorSpi.java bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/asymmetric/dh/KeyPairGeneratorSpi.java
1831--- bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/asymmetric/dh/KeyPairGeneratorSpi.java	2012-03-22 15:11:48.000000000 +0000
1832+++ bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/asymmetric/dh/KeyPairGeneratorSpi.java	2012-09-19 21:17:12.000000000 +0000
1833@@ -63,7 +63,9 @@
1834     {
1835         if (!initialised)
1836         {
1837-            Integer paramStrength = new Integer(strength);
1838+            // BEGIN android-changed
1839+            Integer paramStrength = Integer.valueOf(strength);
1840+            // END android-changed
1841 
1842             if (params.containsKey(paramStrength))
1843             {
1844diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/asymmetric/dsa/DSASigner.java bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/asymmetric/dsa/DSASigner.java
1845--- bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/asymmetric/dsa/DSASigner.java	2012-03-22 15:11:48.000000000 +0000
1846+++ bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/asymmetric/dsa/DSASigner.java	2012-09-19 21:17:12.000000000 +0000
1847@@ -23,11 +23,16 @@
1848 import org.bouncycastle.crypto.DSA;
1849 import org.bouncycastle.crypto.Digest;
1850 import org.bouncycastle.crypto.digests.NullDigest;
1851-import org.bouncycastle.crypto.digests.SHA1Digest;
1852-import org.bouncycastle.crypto.digests.SHA224Digest;
1853-import org.bouncycastle.crypto.digests.SHA256Digest;
1854-import org.bouncycastle.crypto.digests.SHA384Digest;
1855-import org.bouncycastle.crypto.digests.SHA512Digest;
1856+// BEGIN android-added
1857+import org.bouncycastle.crypto.digests.AndroidDigestFactory;
1858+// END android-added
1859+// BEGIN android-removed
1860+// import org.bouncycastle.crypto.digests.SHA1Digest;
1861+// import org.bouncycastle.crypto.digests.SHA224Digest;
1862+// import org.bouncycastle.crypto.digests.SHA256Digest;
1863+// import org.bouncycastle.crypto.digests.SHA384Digest;
1864+// import org.bouncycastle.crypto.digests.SHA512Digest;
1865+// END android-removed
1866 import org.bouncycastle.crypto.params.ParametersWithRandom;
1867 
1868 public class DSASigner
1869@@ -228,45 +233,49 @@
1870     {
1871         public stdDSA()
1872         {
1873-            super(new SHA1Digest(), new org.bouncycastle.crypto.signers.DSASigner());
1874+            // BEGIN android-changed
1875+            super(AndroidDigestFactory.getSHA1(), new org.bouncycastle.crypto.signers.DSASigner());
1876+            // END android-changed
1877         }
1878     }
1879 
1880-    static public class dsa224
1881-        extends DSASigner
1882-    {
1883-        public dsa224()
1884-        {
1885-            super(new SHA224Digest(), new org.bouncycastle.crypto.signers.DSASigner());
1886-        }
1887-    }
1888-    
1889-    static public class dsa256
1890-        extends DSASigner
1891-    {
1892-        public dsa256()
1893-        {
1894-            super(new SHA256Digest(), new org.bouncycastle.crypto.signers.DSASigner());
1895-        }
1896-    }
1897-    
1898-    static public class dsa384
1899-        extends DSASigner
1900-    {
1901-        public dsa384()
1902-        {
1903-            super(new SHA384Digest(), new org.bouncycastle.crypto.signers.DSASigner());
1904-        }
1905-    }
1906-    
1907-    static public class dsa512
1908-        extends DSASigner
1909-    {
1910-        public dsa512()
1911-        {
1912-            super(new SHA512Digest(), new org.bouncycastle.crypto.signers.DSASigner());
1913-        }
1914-    }
1915+    // BEGIN android-removed
1916+    // static public class dsa224
1917+    //     extends DSASigner
1918+    // {
1919+    //     public dsa224()
1920+    //     {
1921+    //         super(new SHA224Digest(), new org.bouncycastle.crypto.signers.DSASigner());
1922+    //     }
1923+    // }
1924+    //
1925+    // static public class dsa256
1926+    //     extends DSASigner
1927+    // {
1928+    //     public dsa256()
1929+    //     {
1930+    //         super(new SHA256Digest(), new org.bouncycastle.crypto.signers.DSASigner());
1931+    //     }
1932+    // }
1933+    //
1934+    // static public class dsa384
1935+    //     extends DSASigner
1936+    // {
1937+    //     public dsa384()
1938+    //     {
1939+    //         super(new SHA384Digest(), new org.bouncycastle.crypto.signers.DSASigner());
1940+    //     }
1941+    // }
1942+    //
1943+    // static public class dsa512
1944+    //     extends DSASigner
1945+    // {
1946+    //     public dsa512()
1947+    //     {
1948+    //         super(new SHA512Digest(), new org.bouncycastle.crypto.signers.DSASigner());
1949+    //     }
1950+    // }
1951+    // END android-removed
1952 
1953     static public class noneDSA
1954         extends DSASigner
1955diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/asymmetric/ec/BCECPrivateKey.java bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/asymmetric/ec/BCECPrivateKey.java
1956--- bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/asymmetric/ec/BCECPrivateKey.java	2012-03-22 15:11:48.000000000 +0000
1957+++ bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/asymmetric/ec/BCECPrivateKey.java	2012-09-19 21:17:12.000000000 +0000
1958@@ -19,8 +19,10 @@
1959 import org.bouncycastle.asn1.DERInteger;
1960 import org.bouncycastle.asn1.DERNull;
1961 import org.bouncycastle.asn1.DERObjectIdentifier;
1962-import org.bouncycastle.asn1.cryptopro.CryptoProObjectIdentifiers;
1963-import org.bouncycastle.asn1.cryptopro.ECGOST3410NamedCurves;
1964+// BEGIN android-removed
1965+// import org.bouncycastle.asn1.cryptopro.CryptoProObjectIdentifiers;
1966+// import org.bouncycastle.asn1.cryptopro.ECGOST3410NamedCurves;
1967+// END android-removed
1968 import org.bouncycastle.asn1.pkcs.PrivateKeyInfo;
1969 import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
1970 import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;
1971@@ -222,21 +224,23 @@
1972             ASN1ObjectIdentifier oid = ASN1ObjectIdentifier.getInstance(params.getParameters());
1973             X9ECParameters ecP = ECUtil.getNamedCurveByOid(oid);
1974 
1975-            if (ecP == null) // GOST Curve
1976-            {
1977-                ECDomainParameters gParam = ECGOST3410NamedCurves.getByOID(oid);
1978-                EllipticCurve ellipticCurve = EC5Util.convertCurve(gParam.getCurve(), gParam.getSeed());
1979-
1980-                ecSpec = new ECNamedCurveSpec(
1981-                        ECGOST3410NamedCurves.getName(oid),
1982-                        ellipticCurve,
1983-                        new ECPoint(
1984-                                gParam.getG().getX().toBigInteger(),
1985-                                gParam.getG().getY().toBigInteger()),
1986-                        gParam.getN(),
1987-                        gParam.getH());
1988-            }
1989-            else
1990+            // BEGIN android-removed
1991+            // if (ecP == null) // GOST Curve
1992+            // {
1993+            //     ECDomainParameters gParam = ECGOST3410NamedCurves.getByOID(oid);
1994+            //     EllipticCurve ellipticCurve = EC5Util.convertCurve(gParam.getCurve(), gParam.getSeed());
1995+            //
1996+            //     ecSpec = new ECNamedCurveSpec(
1997+            //             ECGOST3410NamedCurves.getName(oid),
1998+            //             ellipticCurve,
1999+            //             new ECPoint(
2000+            //                     gParam.getG().getX().toBigInteger(),
2001+            //                     gParam.getG().getY().toBigInteger()),
2002+            //             gParam.getN(),
2003+            //             gParam.getH());
2004+            // }
2005+            // else
2006+            // END android-removed
2007             {
2008                 EllipticCurve ellipticCurve = EC5Util.convertCurve(ecP.getCurve(), ecP.getSeed());
2009 
2010@@ -350,11 +354,13 @@
2011 
2012         try
2013         {
2014-            if (algorithm.equals("ECGOST3410"))
2015-            {
2016-                info = new PrivateKeyInfo(new AlgorithmIdentifier(CryptoProObjectIdentifiers.gostR3410_2001, params.toASN1Primitive()), keyStructure.toASN1Primitive());
2017-            }
2018-            else
2019+            // BEGIN android-removed
2020+            // if (algorithm.equals("ECGOST3410"))
2021+            // {
2022+            //     info = new PrivateKeyInfo(new AlgorithmIdentifier(CryptoProObjectIdentifiers.gostR3410_2001, params.toASN1Primitive()), keyStructure.toASN1Primitive());
2023+            // }
2024+            // else
2025+            // END android-removed
2026             {
2027 
2028                 info = new PrivateKeyInfo(new AlgorithmIdentifier(X9ObjectIdentifiers.id_ecPublicKey, params.toASN1Primitive()), keyStructure.toASN1Primitive());
2029diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/asymmetric/ec/ECUtil.java bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/asymmetric/ec/ECUtil.java
2030--- bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/asymmetric/ec/ECUtil.java	2012-03-22 15:11:48.000000000 +0000
2031+++ bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/asymmetric/ec/ECUtil.java	2012-09-19 21:17:12.000000000 +0000
2032@@ -5,10 +5,14 @@
2033 import java.security.PublicKey;
2034 
2035 import org.bouncycastle.asn1.ASN1ObjectIdentifier;
2036-import org.bouncycastle.asn1.cryptopro.ECGOST3410NamedCurves;
2037+// BEGIN android-removed
2038+// import org.bouncycastle.asn1.cryptopro.ECGOST3410NamedCurves;
2039+// END android-removed
2040 import org.bouncycastle.asn1.nist.NISTNamedCurves;
2041 import org.bouncycastle.asn1.sec.SECNamedCurves;
2042-import org.bouncycastle.asn1.teletrust.TeleTrusTNamedCurves;
2043+// BEGIN android-removed
2044+// import org.bouncycastle.asn1.teletrust.TeleTrusTNamedCurves;
2045+// END android-removed
2046 import org.bouncycastle.asn1.x9.X962NamedCurves;
2047 import org.bouncycastle.asn1.x9.X9ECParameters;
2048 import org.bouncycastle.crypto.params.AsymmetricKeyParameter;
2049@@ -166,14 +170,16 @@
2050             {
2051                 oid = NISTNamedCurves.getOID(name);
2052             }
2053-            if (oid == null)
2054-            {
2055-                oid = TeleTrusTNamedCurves.getOID(name);
2056-            }
2057-            if (oid == null)
2058-            {
2059-                oid = ECGOST3410NamedCurves.getOID(name);
2060-            }
2061+            // BEGIN android-removed
2062+            // if (oid == null)
2063+            // {
2064+            //     oid = TeleTrusTNamedCurves.getOID(name);
2065+            // }
2066+            // if (oid == null)
2067+            // {
2068+            //     oid = ECGOST3410NamedCurves.getOID(name);
2069+            // }
2070+            // END android-removed
2071         }
2072 
2073         return oid;
2074@@ -191,10 +197,12 @@
2075             {
2076                 params = NISTNamedCurves.getByOID(oid);
2077             }
2078-            if (params == null)
2079-            {
2080-                params = TeleTrusTNamedCurves.getByOID(oid);
2081-            }
2082+            // BEGIN android-removed
2083+            // if (params == null)
2084+            // {
2085+            //     params = TeleTrusTNamedCurves.getByOID(oid);
2086+            // }
2087+            // END android-removed
2088         }
2089 
2090         return params;
2091@@ -212,14 +220,16 @@
2092             {
2093                 name = NISTNamedCurves.getName(oid);
2094             }
2095-            if (name == null)
2096-            {
2097-                name = TeleTrusTNamedCurves.getName(oid);
2098-            }
2099-            if (name == null)
2100-            {
2101-                name = ECGOST3410NamedCurves.getName(oid);
2102-            }
2103+            // BEGIN android-removed
2104+            // if (name == null)
2105+            // {
2106+            //     name = TeleTrusTNamedCurves.getName(oid);
2107+            // }
2108+            // if (name == null)
2109+            // {
2110+            //     name = ECGOST3410NamedCurves.getName(oid);
2111+            // }
2112+            // END android-removed
2113         }
2114 
2115         return name;
2116diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/asymmetric/ec/KeyAgreementSpi.java bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/asymmetric/ec/KeyAgreementSpi.java
2117--- bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/asymmetric/ec/KeyAgreementSpi.java	2012-03-22 15:11:48.000000000 +0000
2118+++ bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/asymmetric/ec/KeyAgreementSpi.java	2012-09-19 21:17:12.000000000 +0000
2119@@ -23,20 +23,26 @@
2120 import org.bouncycastle.crypto.CipherParameters;
2121 import org.bouncycastle.crypto.DerivationFunction;
2122 import org.bouncycastle.crypto.agreement.ECDHBasicAgreement;
2123-import org.bouncycastle.crypto.agreement.ECDHCBasicAgreement;
2124-import org.bouncycastle.crypto.agreement.ECMQVBasicAgreement;
2125-import org.bouncycastle.crypto.agreement.kdf.DHKDFParameters;
2126-import org.bouncycastle.crypto.agreement.kdf.ECDHKEKGenerator;
2127+// BEGIN android-removed
2128+// import org.bouncycastle.crypto.agreement.ECDHCBasicAgreement;
2129+// import org.bouncycastle.crypto.agreement.ECMQVBasicAgreement;
2130+// import org.bouncycastle.crypto.agreement.kdf.DHKDFParameters;
2131+// import org.bouncycastle.crypto.agreement.kdf.ECDHKEKGenerator;
2132+// END android-removed
2133 import org.bouncycastle.crypto.digests.SHA1Digest;
2134 import org.bouncycastle.crypto.params.ECDomainParameters;
2135 import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
2136 import org.bouncycastle.crypto.params.ECPublicKeyParameters;
2137-import org.bouncycastle.crypto.params.MQVPrivateParameters;
2138-import org.bouncycastle.crypto.params.MQVPublicParameters;
2139+// BEGIN android-removed
2140+// import org.bouncycastle.crypto.params.MQVPrivateParameters;
2141+// import org.bouncycastle.crypto.params.MQVPublicParameters;
2142+// END android-removed
2143 import org.bouncycastle.jce.interfaces.ECPrivateKey;
2144 import org.bouncycastle.jce.interfaces.ECPublicKey;
2145-import org.bouncycastle.jce.interfaces.MQVPrivateKey;
2146-import org.bouncycastle.jce.interfaces.MQVPublicKey;
2147+// BEGIN android-removed
2148+// import org.bouncycastle.jce.interfaces.MQVPrivateKey;
2149+// import org.bouncycastle.jce.interfaces.MQVPublicKey;
2150+// END android-removed
2151 
2152 /**
2153  * Diffie-Hellman key agreement using elliptic curve keys, ala IEEE P1363
2154@@ -52,9 +58,11 @@
2155 
2156     static
2157     {
2158-        Integer i128 = new Integer(128);
2159-        Integer i192 = new Integer(192);
2160-        Integer i256 = new Integer(256);
2161+        // BEGIN android-changed
2162+        Integer i128 = Integer.valueOf(128);
2163+        Integer i192 = Integer.valueOf(192);
2164+        Integer i256 = Integer.valueOf(256);
2165+        // END android-changed
2166 
2167         algorithms.put(NISTObjectIdentifiers.id_aes128_CBC.getId(), i128);
2168         algorithms.put(NISTObjectIdentifiers.id_aes192_CBC.getId(), i192);
2169@@ -69,7 +77,9 @@
2170     private BigInteger             result;
2171     private ECDomainParameters     parameters;
2172     private BasicAgreement         agreement;
2173-    private DerivationFunction     kdf;
2174+    // BEGIN android-removed
2175+    // private DerivationFunction     kdf;
2176+    // END android-removed
2177 
2178     private byte[] bigIntToBytes(
2179         BigInteger    r)
2180@@ -84,7 +94,9 @@
2181     {
2182         this.kaAlgorithm = kaAlgorithm;
2183         this.agreement = agreement;
2184-        this.kdf = kdf;
2185+        // BEGIN android-removed
2186+        // this.kdf = kdf;
2187+        // END android-removed
2188     }
2189 
2190     protected Key engineDoPhase(
2191@@ -103,25 +115,27 @@
2192         }
2193 
2194         CipherParameters pubKey;        
2195-        if (agreement instanceof ECMQVBasicAgreement)
2196-        {
2197-            if (!(key instanceof MQVPublicKey))
2198-            {
2199-                throw new InvalidKeyException(kaAlgorithm + " key agreement requires "
2200-                    + getSimpleName(MQVPublicKey.class) + " for doPhase");
2201-            }
2202-
2203-            MQVPublicKey mqvPubKey = (MQVPublicKey)key;
2204-            ECPublicKeyParameters staticKey = (ECPublicKeyParameters)
2205-                ECUtil.generatePublicKeyParameter(mqvPubKey.getStaticKey());
2206-            ECPublicKeyParameters ephemKey = (ECPublicKeyParameters)
2207-                ECUtil.generatePublicKeyParameter(mqvPubKey.getEphemeralKey());
2208-
2209-            pubKey = new MQVPublicParameters(staticKey, ephemKey);
2210-
2211-            // TODO Validate that all the keys are using the same parameters?
2212-        }
2213-        else
2214+        // BEGIN android-removed
2215+        // if (agreement instanceof ECMQVBasicAgreement)
2216+        // {
2217+        //     if (!(key instanceof MQVPublicKey))
2218+        //     {
2219+        //         throw new InvalidKeyException(kaAlgorithm + " key agreement requires "
2220+        //             + getSimpleName(MQVPublicKey.class) + " for doPhase");
2221+        //     }
2222+        //
2223+        //     MQVPublicKey mqvPubKey = (MQVPublicKey)key;
2224+        //     ECPublicKeyParameters staticKey = (ECPublicKeyParameters)
2225+        //         ECUtil.generatePublicKeyParameter(mqvPubKey.getStaticKey());
2226+        //     ECPublicKeyParameters ephemKey = (ECPublicKeyParameters)
2227+        //         ECUtil.generatePublicKeyParameter(mqvPubKey.getEphemeralKey());
2228+        //
2229+        //     pubKey = new MQVPublicParameters(staticKey, ephemKey);
2230+        //
2231+        //     // TODO Validate that all the keys are using the same parameters?
2232+        // }
2233+        // else
2234+        // END android-removed
2235         {
2236             if (!(key instanceof ECPublicKey))
2237             {
2238@@ -142,11 +156,13 @@
2239     protected byte[] engineGenerateSecret()
2240         throws IllegalStateException
2241     {
2242-        if (kdf != null)
2243-        {
2244-            throw new UnsupportedOperationException(
2245-                "KDF can only be used when algorithm is known");
2246-        }
2247+        // BEGIN android-removed
2248+        // if (kdf != null)
2249+        // {
2250+        //     throw new UnsupportedOperationException(
2251+        //         "KDF can only be used when algorithm is known");
2252+        // }
2253+        // END android-removed
2254 
2255         return bigIntToBytes(result);
2256     }
2257@@ -174,23 +190,25 @@
2258     {
2259         byte[] secret = bigIntToBytes(result);
2260 
2261-        if (kdf != null)
2262-        {
2263-            if (!algorithms.containsKey(algorithm))
2264-            {
2265-                throw new NoSuchAlgorithmException("unknown algorithm encountered: " + algorithm);
2266-            }
2267-            
2268-            int    keySize = ((Integer)algorithms.get(algorithm)).intValue();
2269-
2270-            DHKDFParameters params = new DHKDFParameters(new DERObjectIdentifier(algorithm), keySize, secret);
2271-
2272-            byte[] keyBytes = new byte[keySize / 8];
2273-            kdf.init(params);
2274-            kdf.generateBytes(keyBytes, 0, keyBytes.length);
2275-            secret = keyBytes;
2276-        }
2277-        else
2278+        // BEGIN android-removed
2279+        // if (kdf != null)
2280+        // {
2281+        //     if (!algorithms.containsKey(algorithm))
2282+        //     {
2283+        //         throw new NoSuchAlgorithmException("unknown algorithm encountered: " + algorithm);
2284+        //     }
2285+        //  
2286+        //     int    keySize = ((Integer)algorithms.get(algorithm)).intValue();
2287+        //
2288+        //     DHKDFParameters params = new DHKDFParameters(new DERObjectIdentifier(algorithm), keySize, secret);
2289+        //
2290+        //     byte[] keyBytes = new byte[keySize / 8];
2291+        //     kdf.init(params);
2292+        //     kdf.generateBytes(keyBytes, 0, keyBytes.length);
2293+        //     secret = keyBytes;
2294+        // }
2295+        // else
2296+        // END android-removed
2297         {
2298             // TODO Should we be ensuring the key is the right length?
2299         }
2300@@ -218,35 +236,37 @@
2301     private void initFromKey(Key key)
2302         throws InvalidKeyException
2303     {
2304-        if (agreement instanceof ECMQVBasicAgreement)
2305-        {
2306-            if (!(key instanceof MQVPrivateKey))
2307-            {
2308-                throw new InvalidKeyException(kaAlgorithm + " key agreement requires "
2309-                    + getSimpleName(MQVPrivateKey.class) + " for initialisation");
2310-            }
2311-
2312-            MQVPrivateKey mqvPrivKey = (MQVPrivateKey)key;
2313-            ECPrivateKeyParameters staticPrivKey = (ECPrivateKeyParameters)
2314-                ECUtil.generatePrivateKeyParameter(mqvPrivKey.getStaticPrivateKey());
2315-            ECPrivateKeyParameters ephemPrivKey = (ECPrivateKeyParameters)
2316-                ECUtil.generatePrivateKeyParameter(mqvPrivKey.getEphemeralPrivateKey());
2317-
2318-            ECPublicKeyParameters ephemPubKey = null;
2319-            if (mqvPrivKey.getEphemeralPublicKey() != null)
2320-            {
2321-                ephemPubKey = (ECPublicKeyParameters)
2322-                    ECUtil.generatePublicKeyParameter(mqvPrivKey.getEphemeralPublicKey());
2323-            }
2324-
2325-            MQVPrivateParameters localParams = new MQVPrivateParameters(staticPrivKey, ephemPrivKey, ephemPubKey);
2326-            this.parameters = staticPrivKey.getParameters();
2327-
2328-            // TODO Validate that all the keys are using the same parameters?
2329-
2330-            agreement.init(localParams);
2331-        }
2332-        else
2333+        // BEGIN android-removed
2334+        // if (agreement instanceof ECMQVBasicAgreement)
2335+        // {
2336+        //     if (!(key instanceof MQVPrivateKey))
2337+        //     {
2338+        //         throw new InvalidKeyException(kaAlgorithm + " key agreement requires "
2339+        //             + getSimpleName(MQVPrivateKey.class) + " for initialisation");
2340+        //     }
2341+        //
2342+        //     MQVPrivateKey mqvPrivKey = (MQVPrivateKey)key;
2343+        //     ECPrivateKeyParameters staticPrivKey = (ECPrivateKeyParameters)
2344+        //         ECUtil.generatePrivateKeyParameter(mqvPrivKey.getStaticPrivateKey());
2345+        //     ECPrivateKeyParameters ephemPrivKey = (ECPrivateKeyParameters)
2346+        //         ECUtil.generatePrivateKeyParameter(mqvPrivKey.getEphemeralPrivateKey());
2347+        //
2348+        //     ECPublicKeyParameters ephemPubKey = null;
2349+        //     if (mqvPrivKey.getEphemeralPublicKey() != null)
2350+        //     {
2351+        //         ephemPubKey = (ECPublicKeyParameters)
2352+        //             ECUtil.generatePublicKeyParameter(mqvPrivKey.getEphemeralPublicKey());
2353+        //     }
2354+        //
2355+        //     MQVPrivateParameters localParams = new MQVPrivateParameters(staticPrivKey, ephemPrivKey, ephemPubKey);
2356+        //     this.parameters = staticPrivKey.getParameters();
2357+        //
2358+        //     // TODO Validate that all the keys are using the same parameters?
2359+        //
2360+        //     agreement.init(localParams);
2361+        // }
2362+        // else
2363+        // END android-removed
2364         {
2365             if (!(key instanceof ECPrivateKey))
2366             {
2367@@ -277,39 +297,41 @@
2368         }
2369     }
2370 
2371-    public static class DHC
2372-        extends KeyAgreementSpi
2373-    {
2374-        public DHC()
2375-        {
2376-            super("ECDHC", new ECDHCBasicAgreement(), null);
2377-        }
2378-    }
2379-
2380-    public static class MQV
2381-        extends KeyAgreementSpi
2382-    {
2383-        public MQV()
2384-        {
2385-            super("ECMQV", new ECMQVBasicAgreement(), null);
2386-        }
2387-    }
2388-
2389-    public static class DHwithSHA1KDF
2390-        extends KeyAgreementSpi
2391-    {
2392-        public DHwithSHA1KDF()
2393-        {
2394-            super("ECDHwithSHA1KDF", new ECDHBasicAgreement(), new ECDHKEKGenerator(new SHA1Digest()));
2395-        }
2396-    }
2397-
2398-    public static class MQVwithSHA1KDF
2399-        extends KeyAgreementSpi
2400-    {
2401-        public MQVwithSHA1KDF()
2402-        {
2403-            super("ECMQVwithSHA1KDF", new ECMQVBasicAgreement(), new ECDHKEKGenerator(new SHA1Digest()));
2404-        }
2405-    }
2406+    // BEGIN android-removed
2407+    // public static class DHC
2408+    //     extends KeyAgreementSpi
2409+    // {
2410+    //     public DHC()
2411+    //     {
2412+    //         super("ECDHC", new ECDHCBasicAgreement(), null);
2413+    //     }
2414+    // }
2415+    //
2416+    // public static class MQV
2417+    //     extends KeyAgreementSpi
2418+    // {
2419+    //     public MQV()
2420+    //     {
2421+    //         super("ECMQV", new ECMQVBasicAgreement(), null);
2422+    //     }
2423+    // }
2424+    //
2425+    // public static class DHwithSHA1KDF
2426+    //     extends KeyAgreementSpi
2427+    // {
2428+    //     public DHwithSHA1KDF()
2429+    //     {
2430+    //         super("ECDHwithSHA1KDF", new ECDHBasicAgreement(), new ECDHKEKGenerator(new SHA1Digest()));
2431+    //     }
2432+    // }
2433+    //
2434+    // public static class MQVwithSHA1KDF
2435+    //     extends KeyAgreementSpi
2436+    // {
2437+    //     public MQVwithSHA1KDF()
2438+    //     {
2439+    //         super("ECMQVwithSHA1KDF", new ECMQVBasicAgreement(), new ECDHKEKGenerator(new SHA1Digest()));
2440+    //     }
2441+    // }
2442+    // END android-removed
2443 }
2444diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/asymmetric/ec/KeyFactorySpi.java bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/asymmetric/ec/KeyFactorySpi.java
2445--- bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/asymmetric/ec/KeyFactorySpi.java	2012-03-22 15:11:48.000000000 +0000
2446+++ bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/asymmetric/ec/KeyFactorySpi.java	2012-09-19 21:17:12.000000000 +0000
2447@@ -200,14 +200,16 @@
2448         }
2449     }
2450 
2451-    public static class ECGOST3410
2452-        extends KeyFactorySpi
2453-    {
2454-        public ECGOST3410()
2455-        {
2456-            super("ECGOST3410", BouncyCastleProvider.CONFIGURATION);
2457-        }
2458-    }
2459+    // BEGIN android-removed
2460+    // public static class ECGOST3410
2461+    //     extends KeyFactorySpi
2462+    // {
2463+    //     public ECGOST3410()
2464+    //     {
2465+    //         super("ECGOST3410", BouncyCastleProvider.CONFIGURATION);
2466+    //     }
2467+    // }
2468+    // END android-removed
2469 
2470     public static class ECDH
2471         extends KeyFactorySpi
2472diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/asymmetric/ec/KeyPairGeneratorSpi.java bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/asymmetric/ec/KeyPairGeneratorSpi.java
2473--- bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/asymmetric/ec/KeyPairGeneratorSpi.java	2012-03-22 15:11:48.000000000 +0000
2474+++ bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/asymmetric/ec/KeyPairGeneratorSpi.java	2012-09-19 21:17:12.000000000 +0000
2475@@ -12,7 +12,9 @@
2476 import org.bouncycastle.asn1.ASN1ObjectIdentifier;
2477 import org.bouncycastle.asn1.nist.NISTNamedCurves;
2478 import org.bouncycastle.asn1.sec.SECNamedCurves;
2479-import org.bouncycastle.asn1.teletrust.TeleTrusTNamedCurves;
2480+// BEGIN android-removed
2481+// import org.bouncycastle.asn1.teletrust.TeleTrusTNamedCurves;
2482+// END android-removed
2483 import org.bouncycastle.asn1.x9.X962NamedCurves;
2484 import org.bouncycastle.asn1.x9.X9ECParameters;
2485 import org.bouncycastle.crypto.AsymmetricCipherKeyPair;
2486@@ -55,13 +57,15 @@
2487         static {
2488             ecParameters = new Hashtable();
2489 
2490-            ecParameters.put(new Integer(192), new ECGenParameterSpec("prime192v1")); // a.k.a P-192
2491-            ecParameters.put(new Integer(239), new ECGenParameterSpec("prime239v1"));
2492-            ecParameters.put(new Integer(256), new ECGenParameterSpec("prime256v1")); // a.k.a P-256
2493-
2494-            ecParameters.put(new Integer(224), new ECGenParameterSpec("P-224"));
2495-            ecParameters.put(new Integer(384), new ECGenParameterSpec("P-384"));
2496-            ecParameters.put(new Integer(521), new ECGenParameterSpec("P-521"));
2497+            // BEGIN android-changed
2498+            ecParameters.put(Integer.valueOf(192), new ECGenParameterSpec("prime192v1")); // a.k.a P-192
2499+            ecParameters.put(Integer.valueOf(239), new ECGenParameterSpec("prime239v1"));
2500+            ecParameters.put(Integer.valueOf(256), new ECGenParameterSpec("prime256v1")); // a.k.a P-256
2501+
2502+            ecParameters.put(Integer.valueOf(224), new ECGenParameterSpec("P-224"));
2503+            ecParameters.put(Integer.valueOf(384), new ECGenParameterSpec("P-384"));
2504+            ecParameters.put(Integer.valueOf(521), new ECGenParameterSpec("P-521"));
2505+            // END android-changed
2506         }
2507 
2508         public EC()
2509@@ -85,8 +89,16 @@
2510             SecureRandom    random)
2511         {
2512             this.strength = strength;
2513+            // BEGIN android-added
2514+            if (random != null) {
2515+            // END android-added
2516             this.random = random;
2517-            ECGenParameterSpec ecParams = (ECGenParameterSpec)ecParameters.get(new Integer(strength));
2518+            // BEGIN android-added
2519+            }
2520+            // END android-added
2521+            // BEGIN android-changed
2522+            ECGenParameterSpec ecParams = (ECGenParameterSpec)ecParameters.get(Integer.valueOf(strength));
2523+            // END android-changed
2524 
2525             if (ecParams != null)
2526             {
2527@@ -110,6 +122,11 @@
2528             SecureRandom            random)
2529             throws InvalidAlgorithmParameterException
2530         {
2531+            // BEGIN android-added
2532+            if (random == null) {
2533+                random = this.random;
2534+            }
2535+            // END android-added
2536             if (params instanceof ECParameterSpec)
2537             {
2538                 ECParameterSpec p = (ECParameterSpec)params;
2539@@ -154,10 +171,12 @@
2540                     {
2541                         ecP = NISTNamedCurves.getByName(curveName);
2542                     }
2543-                    if (ecP == null)
2544-                    {
2545-                        ecP = TeleTrusTNamedCurves.getByName(curveName);
2546-                    }
2547+                    // BEGIN android-removed
2548+                    // if (ecP == null)
2549+                    // {
2550+                    //     ecP = TeleTrusTNamedCurves.getByName(curveName);
2551+                    // }
2552+                    // END android-removed
2553                     if (ecP == null)
2554                     {
2555                         // See if it's actually an OID string (SunJSSE ServerHandshaker setupEphemeralECDHKeys bug)
2556@@ -173,10 +192,12 @@
2557                             {
2558                                 ecP = NISTNamedCurves.getByOID(oid);
2559                             }
2560-                            if (ecP == null)
2561-                            {
2562-                                ecP = TeleTrusTNamedCurves.getByOID(oid);
2563-                            }
2564+                            // BEGIN android-removed
2565+                            // if (ecP == null)
2566+                            // {
2567+                            //     ecP = TeleTrusTNamedCurves.getByOID(oid);
2568+                            // }
2569+                            // END android-removed
2570                             if (ecP == null)
2571                             {
2572                                 throw new InvalidAlgorithmParameterException("unknown curve OID: " + curveName);
2573@@ -231,7 +252,15 @@
2574         {
2575             if (!initialised)
2576             {
2577-                throw new IllegalStateException("EC Key Pair Generator not initialised");
2578+                // BEGIN android-removed
2579+                // throw new IllegalStateException("EC Key Pair Generator not initialised");
2580+                // END android-removed
2581+                // BEGIN android-added
2582+                /*
2583+                 * KeyPairGenerator documentation says that a default initialization must be provided
2584+                 */
2585+                initialize(192, random);
2586+                // END android-added
2587             }
2588 
2589             AsymmetricCipherKeyPair     pair = engine.generateKeyPair();
2590diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/asymmetric/ec/SignatureSpi.java bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/asymmetric/ec/SignatureSpi.java
2591--- bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/asymmetric/ec/SignatureSpi.java	2012-03-22 15:11:48.000000000 +0000
2592+++ bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/asymmetric/ec/SignatureSpi.java	2012-09-19 21:17:12.000000000 +0000
2593@@ -18,15 +18,22 @@
2594 import org.bouncycastle.crypto.DSA;
2595 import org.bouncycastle.crypto.Digest;
2596 import org.bouncycastle.crypto.digests.NullDigest;
2597-import org.bouncycastle.crypto.digests.RIPEMD160Digest;
2598-import org.bouncycastle.crypto.digests.SHA1Digest;
2599-import org.bouncycastle.crypto.digests.SHA224Digest;
2600-import org.bouncycastle.crypto.digests.SHA256Digest;
2601-import org.bouncycastle.crypto.digests.SHA384Digest;
2602-import org.bouncycastle.crypto.digests.SHA512Digest;
2603+// BEGIN android-added
2604+import org.bouncycastle.crypto.digests.AndroidDigestFactory;
2605+// END android-added
2606+// BEGIN android-removed
2607+// import org.bouncycastle.crypto.digests.RIPEMD160Digest;
2608+// import org.bouncycastle.crypto.digests.SHA1Digest;
2609+// import org.bouncycastle.crypto.digests.SHA224Digest;
2610+// import org.bouncycastle.crypto.digests.SHA256Digest;
2611+// import org.bouncycastle.crypto.digests.SHA384Digest;
2612+// import org.bouncycastle.crypto.digests.SHA512Digest;
2613+// END android-removed
2614 import org.bouncycastle.crypto.params.ParametersWithRandom;
2615 import org.bouncycastle.crypto.signers.ECDSASigner;
2616-import org.bouncycastle.crypto.signers.ECNRSigner;
2617+// BEGIN android-removed
2618+// import org.bouncycastle.crypto.signers.ECNRSigner;
2619+// END android-removed
2620 import org.bouncycastle.jcajce.provider.asymmetric.util.DSABase;
2621 import org.bouncycastle.jcajce.provider.asymmetric.util.DSAEncoder;
2622 import org.bouncycastle.jce.interfaces.ECKey;
2623@@ -108,7 +115,9 @@
2624     {
2625         public ecDSA()
2626         {
2627-            super(new SHA1Digest(), new ECDSASigner(), new StdDSAEncoder());
2628+            // BEGIN android-changed
2629+            super(AndroidDigestFactory.getSHA1(), new ECDSASigner(), new StdDSAEncoder());
2630+            // END android-changed
2631         }
2632     }
2633 
2634@@ -121,21 +130,25 @@
2635         }
2636     }
2637 
2638-    static public class ecDSA224
2639-        extends SignatureSpi
2640-    {
2641-        public ecDSA224()
2642-        {
2643-            super(new SHA224Digest(), new ECDSASigner(), new StdDSAEncoder());
2644-        }
2645-    }
2646+    // BEGIN android-removed
2647+    // static public class ecDSA224
2648+    //     extends SignatureSpi
2649+    // {
2650+    //     public ecDSA224()
2651+    //     {
2652+    //         super(new SHA224Digest(), new ECDSASigner(), new StdDSAEncoder());
2653+    //     }
2654+    // }
2655+    // END android-removed
2656 
2657     static public class ecDSA256
2658         extends SignatureSpi
2659     {
2660         public ecDSA256()
2661         {
2662-            super(new SHA256Digest(), new ECDSASigner(), new StdDSAEncoder());
2663+            // BEGIN android-changed
2664+            super(AndroidDigestFactory.getSHA256(), new ECDSASigner(), new StdDSAEncoder());
2665+            // END android-changed
2666         }
2667     }
2668 
2669@@ -144,7 +157,9 @@
2670     {
2671         public ecDSA384()
2672         {
2673-            super(new SHA384Digest(), new ECDSASigner(), new StdDSAEncoder());
2674+            // BEGIN android-changed
2675+            super(AndroidDigestFactory.getSHA384(), new ECDSASigner(), new StdDSAEncoder());
2676+            // END android-changed
2677         }
2678     }
2679 
2680@@ -153,90 +168,94 @@
2681     {
2682         public ecDSA512()
2683         {
2684-            super(new SHA512Digest(), new ECDSASigner(), new StdDSAEncoder());
2685-        }
2686-    }
2687-
2688-    static public class ecDSARipeMD160
2689-        extends SignatureSpi
2690-    {
2691-        public ecDSARipeMD160()
2692-        {
2693-            super(new RIPEMD160Digest(), new ECDSASigner(), new StdDSAEncoder());
2694-        }
2695-    }
2696-
2697-    static public class ecNR
2698-        extends SignatureSpi
2699-    {
2700-        public ecNR()
2701-        {
2702-            super(new SHA1Digest(), new ECNRSigner(), new StdDSAEncoder());
2703-        }
2704-    }
2705-
2706-    static public class ecNR224
2707-        extends SignatureSpi
2708-    {
2709-        public ecNR224()
2710-        {
2711-            super(new SHA224Digest(), new ECNRSigner(), new StdDSAEncoder());
2712-        }
2713-    }
2714-
2715-    static public class ecNR256
2716-        extends SignatureSpi
2717-    {
2718-        public ecNR256()
2719-        {
2720-            super(new SHA256Digest(), new ECNRSigner(), new StdDSAEncoder());
2721-        }
2722-    }
2723-
2724-    static public class ecNR384
2725-        extends SignatureSpi
2726-    {
2727-        public ecNR384()
2728-        {
2729-            super(new SHA384Digest(), new ECNRSigner(), new StdDSAEncoder());
2730-        }
2731-    }
2732-
2733-    static public class ecNR512
2734-        extends SignatureSpi
2735-    {
2736-        public ecNR512()
2737-        {
2738-            super(new SHA512Digest(), new ECNRSigner(), new StdDSAEncoder());
2739-        }
2740-    }
2741-
2742-    static public class ecCVCDSA
2743-        extends SignatureSpi
2744-    {
2745-        public ecCVCDSA()
2746-        {
2747-            super(new SHA1Digest(), new ECDSASigner(), new CVCDSAEncoder());
2748-        }
2749-    }
2750-
2751-    static public class ecCVCDSA224
2752-        extends SignatureSpi
2753-    {
2754-        public ecCVCDSA224()
2755-        {
2756-            super(new SHA224Digest(), new ECDSASigner(), new CVCDSAEncoder());
2757-        }
2758-    }
2759-
2760-    static public class ecCVCDSA256
2761-        extends SignatureSpi
2762-    {
2763-        public ecCVCDSA256()
2764-        {
2765-            super(new SHA256Digest(), new ECDSASigner(), new CVCDSAEncoder());
2766-        }
2767-    }
2768+            // BEGIN android-changed
2769+            super(AndroidDigestFactory.getSHA512(), new ECDSASigner(), new StdDSAEncoder());
2770+            // END android-changed
2771+        }
2772+    }
2773+
2774+    // BEGIN android-removed
2775+    // static public class ecDSARipeMD160
2776+    //     extends SignatureSpi
2777+    // {
2778+    //     public ecDSARipeMD160()
2779+    //     {
2780+    //         super(new RIPEMD160Digest(), new ECDSASigner(), new StdDSAEncoder());
2781+    //     }
2782+    // }
2783+    //
2784+    // static public class ecNR
2785+    //     extends SignatureSpi
2786+    // {
2787+    //     public ecNR()
2788+    //     {
2789+    //         super(new SHA1Digest(), new ECNRSigner(), new StdDSAEncoder());
2790+    //     }
2791+    // }
2792+    //
2793+    // static public class ecNR224
2794+    //     extends SignatureSpi
2795+    // {
2796+    //     public ecNR224()
2797+    //     {
2798+    //         super(new SHA224Digest(), new ECNRSigner(), new StdDSAEncoder());
2799+    //     }
2800+    // }
2801+    //
2802+    // static public class ecNR256
2803+    //     extends SignatureSpi
2804+    // {
2805+    //     public ecNR256()
2806+    //     {
2807+    //         super(new SHA256Digest(), new ECNRSigner(), new StdDSAEncoder());
2808+    //     }
2809+    // }
2810+    //
2811+    // static public class ecNR384
2812+    //     extends SignatureSpi
2813+    // {
2814+    //     public ecNR384()
2815+    //     {
2816+    //         super(new SHA384Digest(), new ECNRSigner(), new StdDSAEncoder());
2817+    //     }
2818+    // }
2819+    //
2820+    // static public class ecNR512
2821+    //     extends SignatureSpi
2822+    // {
2823+    //     public ecNR512()
2824+    //     {
2825+    //         super(new SHA512Digest(), new ECNRSigner(), new StdDSAEncoder());
2826+    //     }
2827+    // }
2828+    //
2829+    // static public class ecCVCDSA
2830+    //     extends SignatureSpi
2831+    // {
2832+    //     public ecCVCDSA()
2833+    //     {
2834+    //         super(new SHA1Digest(), new ECDSASigner(), new CVCDSAEncoder());
2835+    //     }
2836+    // }
2837+    //
2838+    // static public class ecCVCDSA224
2839+    //     extends SignatureSpi
2840+    // {
2841+    //     public ecCVCDSA224()
2842+    //     {
2843+    //         super(new SHA224Digest(), new ECDSASigner(), new CVCDSAEncoder());
2844+    //     }
2845+    // }
2846+    //
2847+    // static public class ecCVCDSA256
2848+    //     extends SignatureSpi
2849+    // {
2850+    //     public ecCVCDSA256()
2851+    //     {
2852+    //         super(new SHA256Digest(), new ECDSASigner(), new CVCDSAEncoder());
2853+    //     }
2854+    // }
2855+    // END android-removed
2856 
2857     private static class StdDSAEncoder
2858         implements DSAEncoder
2859@@ -330,4 +349,4 @@
2860             return sig;
2861         }
2862     }
2863-}
2864\ No newline at end of file
2865+}
2866diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/asymmetric/rsa/AlgorithmParametersSpi.java bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/asymmetric/rsa/AlgorithmParametersSpi.java
2867--- bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/asymmetric/rsa/AlgorithmParametersSpi.java	2012-03-22 15:11:48.000000000 +0000
2868+++ bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/asymmetric/rsa/AlgorithmParametersSpi.java	2012-09-19 21:17:12.000000000 +0000
2869@@ -55,11 +55,15 @@
2870         {
2871             AlgorithmIdentifier hashAlgorithm = new AlgorithmIdentifier(
2872                                                             DigestFactory.getOID(currentSpec.getDigestAlgorithm()),
2873-                                                            new DERNull());
2874+                                                            // BEGIN android-changed
2875+                                                            DERNull.INSTANCE);
2876+                                                            // END android-changed
2877             MGF1ParameterSpec mgfSpec = (MGF1ParameterSpec)currentSpec.getMGFParameters();
2878             AlgorithmIdentifier maskGenAlgorithm = new AlgorithmIdentifier(
2879                                                             PKCSObjectIdentifiers.id_mgf1,
2880-                                                            new AlgorithmIdentifier(DigestFactory.getOID(mgfSpec.getDigestAlgorithm()), new DERNull()));
2881+                                                            // BEGIN android-changed
2882+                                                            new AlgorithmIdentifier(DigestFactory.getOID(mgfSpec.getDigestAlgorithm()), DERNull.INSTANCE));
2883+                                                            // END android-changed
2884             PSource.PSpecified      pSource = (PSource.PSpecified)currentSpec.getPSource();
2885             AlgorithmIdentifier pSourceAlgorithm = new AlgorithmIdentifier(
2886                                                             PKCSObjectIdentifiers.id_pSpecified, new DEROctetString(pSource.getValue()));
2887@@ -170,11 +174,15 @@
2888             PSSParameterSpec pssSpec = currentSpec;
2889             AlgorithmIdentifier hashAlgorithm = new AlgorithmIdentifier(
2890                                                 DigestFactory.getOID(pssSpec.getDigestAlgorithm()),
2891-                                                new DERNull());
2892+                                                // BEGIN android-changed
2893+                                                DERNull.INSTANCE);
2894+                                                // END android-changed
2895             MGF1ParameterSpec mgfSpec = (MGF1ParameterSpec)pssSpec.getMGFParameters();
2896             AlgorithmIdentifier maskGenAlgorithm = new AlgorithmIdentifier(
2897                                                 PKCSObjectIdentifiers.id_mgf1,
2898-                                                new AlgorithmIdentifier(DigestFactory.getOID(mgfSpec.getDigestAlgorithm()), new DERNull()));
2899+                                                // BEGIN android-changed
2900+                                                new AlgorithmIdentifier(DigestFactory.getOID(mgfSpec.getDigestAlgorithm()), DERNull.INSTANCE));
2901+                                                // END android-changed
2902             RSASSAPSSparams pssP = new RSASSAPSSparams(hashAlgorithm, maskGenAlgorithm, new ASN1Integer(pssSpec.getSaltLength()), new ASN1Integer(pssSpec.getTrailerField()));
2903             
2904             return pssP.getEncoded("DER");
2905diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/asymmetric/rsa/BCRSAPrivateCrtKey.java bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/asymmetric/rsa/BCRSAPrivateCrtKey.java
2906--- bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/asymmetric/rsa/BCRSAPrivateCrtKey.java	2012-03-22 15:11:48.000000000 +0000
2907+++ bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/asymmetric/rsa/BCRSAPrivateCrtKey.java	2012-09-19 21:17:12.000000000 +0000
2908@@ -127,7 +127,9 @@
2909      */
2910     public byte[] getEncoded()
2911     {
2912-        return KeyUtil.getEncodedPrivateKeyInfo(new AlgorithmIdentifier(PKCSObjectIdentifiers.rsaEncryption, new DERNull()), new RSAPrivateKey(getModulus(), getPublicExponent(), getPrivateExponent(), getPrimeP(), getPrimeQ(), getPrimeExponentP(), getPrimeExponentQ(), getCrtCoefficient()));
2913+        // BEGIN android-changed
2914+        return KeyUtil.getEncodedPrivateKeyInfo(new AlgorithmIdentifier(PKCSObjectIdentifiers.rsaEncryption, DERNull.INSTANCE), new RSAPrivateKey(getModulus(), getPublicExponent(), getPrivateExponent(), getPrimeP(), getPrimeQ(), getPrimeExponentP(), getPrimeExponentQ(), getCrtCoefficient()));
2915+        // END android-changed
2916     }
2917 
2918     /**
2919diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/asymmetric/rsa/BCRSAPrivateKey.java bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/asymmetric/rsa/BCRSAPrivateKey.java
2920--- bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/asymmetric/rsa/BCRSAPrivateKey.java	2012-03-22 15:11:48.000000000 +0000
2921+++ bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/asymmetric/rsa/BCRSAPrivateKey.java	2012-09-19 21:17:12.000000000 +0000
2922@@ -78,7 +78,9 @@
2923 
2924     public byte[] getEncoded()
2925     {
2926-        return KeyUtil.getEncodedPrivateKeyInfo(new AlgorithmIdentifier(PKCSObjectIdentifiers.rsaEncryption, new DERNull()), new org.bouncycastle.asn1.pkcs.RSAPrivateKey(getModulus(), ZERO, getPrivateExponent(), ZERO, ZERO, ZERO, ZERO, ZERO));
2927+        // BEGIN android-changed
2928+        return KeyUtil.getEncodedPrivateKeyInfo(new AlgorithmIdentifier(PKCSObjectIdentifiers.rsaEncryption, DERNull.INSTANCE), new org.bouncycastle.asn1.pkcs.RSAPrivateKey(getModulus(), ZERO, getPrivateExponent(), ZERO, ZERO, ZERO, ZERO, ZERO));
2929+        // END android-changed
2930     }
2931 
2932     public boolean equals(Object o)
2933diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/asymmetric/rsa/BCRSAPublicKey.java bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/asymmetric/rsa/BCRSAPublicKey.java
2934--- bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/asymmetric/rsa/BCRSAPublicKey.java	2012-03-22 15:11:48.000000000 +0000
2935+++ bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/asymmetric/rsa/BCRSAPublicKey.java	2012-09-19 21:17:12.000000000 +0000
2936@@ -89,7 +89,9 @@
2937 
2938     public byte[] getEncoded()
2939     {
2940-        return KeyUtil.getEncodedSubjectPublicKeyInfo(new AlgorithmIdentifier(PKCSObjectIdentifiers.rsaEncryption, new DERNull()), new org.bouncycastle.asn1.pkcs.RSAPublicKey(getModulus(), getPublicExponent()));
2941+        // BEGIN android-changed
2942+        return KeyUtil.getEncodedSubjectPublicKeyInfo(new AlgorithmIdentifier(PKCSObjectIdentifiers.rsaEncryption, DERNull.INSTANCE), new org.bouncycastle.asn1.pkcs.RSAPublicKey(getModulus(), getPublicExponent()));
2943+        // END android-changed
2944     }
2945 
2946     public int hashCode()
2947diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/asymmetric/rsa/CipherSpi.java bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/asymmetric/rsa/CipherSpi.java
2948--- bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/asymmetric/rsa/CipherSpi.java	2012-03-22 15:11:48.000000000 +0000
2949+++ bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/asymmetric/rsa/CipherSpi.java	2012-09-19 21:17:12.000000000 +0000
2950@@ -26,7 +26,9 @@
2951 import org.bouncycastle.crypto.CipherParameters;
2952 import org.bouncycastle.crypto.Digest;
2953 import org.bouncycastle.crypto.InvalidCipherTextException;
2954-import org.bouncycastle.crypto.encodings.ISO9796d1Encoding;
2955+// BEGIN android-removed
2956+// import org.bouncycastle.crypto.encodings.ISO9796d1Encoding;
2957+// END android-removed
2958 import org.bouncycastle.crypto.encodings.OAEPEncoding;
2959 import org.bouncycastle.crypto.encodings.PKCS1Encoding;
2960 import org.bouncycastle.crypto.engines.RSABlindedEngine;
2961@@ -197,10 +199,12 @@
2962         {
2963             cipher = new PKCS1Encoding(new RSABlindedEngine());
2964         }
2965-        else if (pad.equals("ISO9796-1PADDING"))
2966-        {
2967-            cipher = new ISO9796d1Encoding(new RSABlindedEngine());
2968-        }
2969+        // BEGIN android-removed
2970+        // else if (pad.equals("ISO9796-1PADDING"))
2971+        // {
2972+        //     cipher = new ISO9796d1Encoding(new RSABlindedEngine());
2973+        // }
2974+        // END android-removed
2975         else if (pad.equals("OAEPWITHMD5ANDMGF1PADDING"))
2976         {
2977             initFromSpec(new OAEPParameterSpec("MD5", "MGF1", new MGF1ParameterSpec("MD5"), PSource.PSpecified.DEFAULT));
2978@@ -213,10 +217,12 @@
2979         {
2980             initFromSpec(OAEPParameterSpec.DEFAULT);
2981         }
2982-        else if (pad.equals("OAEPWITHSHA224ANDMGF1PADDING") || pad.equals("OAEPWITHSHA-224ANDMGF1PADDING"))
2983-        {
2984-            initFromSpec(new OAEPParameterSpec("SHA-224", "MGF1", new MGF1ParameterSpec("SHA-224"), PSource.PSpecified.DEFAULT));
2985-        }
2986+        // BEGIN android-removed
2987+        // else if (pad.equals("OAEPWITHSHA224ANDMGF1PADDING") || pad.equals("OAEPWITHSHA-224ANDMGF1PADDING"))
2988+        // {
2989+        //     initFromSpec(new OAEPParameterSpec("SHA-224", "MGF1", new MGF1ParameterSpec("SHA-224"), PSource.PSpecified.DEFAULT));
2990+        // }
2991+        // END android-removed
2992         else if (pad.equals("OAEPWITHSHA256ANDMGF1PADDING") || pad.equals("OAEPWITHSHA-256ANDMGF1PADDING"))
2993         {
2994             initFromSpec(new OAEPParameterSpec("SHA-256", "MGF1", MGF1ParameterSpec.SHA256, PSource.PSpecified.DEFAULT));
2995@@ -534,48 +540,50 @@
2996         }
2997     }
2998 
2999-    static public class PKCS1v1_5Padding
3000-        extends CipherSpi
3001-    {
3002-        public PKCS1v1_5Padding()
3003-        {
3004-            super(new PKCS1Encoding(new RSABlindedEngine()));
3005-        }
3006-    }
3007-
3008-    static public class PKCS1v1_5Padding_PrivateOnly
3009-        extends CipherSpi
3010-    {
3011-        public PKCS1v1_5Padding_PrivateOnly()
3012-        {
3013-            super(false, true, new PKCS1Encoding(new RSABlindedEngine()));
3014-        }
3015-    }
3016-
3017-    static public class PKCS1v1_5Padding_PublicOnly
3018-        extends CipherSpi
3019-    {
3020-        public PKCS1v1_5Padding_PublicOnly()
3021-        {
3022-            super(true, false, new PKCS1Encoding(new RSABlindedEngine()));
3023-        }
3024-    }
3025-
3026-    static public class OAEPPadding
3027-        extends CipherSpi
3028-    {
3029-        public OAEPPadding()
3030-        {
3031-            super(OAEPParameterSpec.DEFAULT);
3032-        }
3033-    }
3034-    
3035-    static public class ISO9796d1Padding
3036-        extends CipherSpi
3037-    {
3038-        public ISO9796d1Padding()
3039-        {
3040-            super(new ISO9796d1Encoding(new RSABlindedEngine()));
3041-        }
3042-    }
3043+    // BEGIN android-removed
3044+    // static public class PKCS1v1_5Padding
3045+    //     extends CipherSpi
3046+    // {
3047+    //     public PKCS1v1_5Padding()
3048+    //     {
3049+    //         super(new PKCS1Encoding(new RSABlindedEngine()));
3050+    //     }
3051+    // }
3052+    //
3053+    // static public class PKCS1v1_5Padding_PrivateOnly
3054+    //     extends CipherSpi
3055+    // {
3056+    //     public PKCS1v1_5Padding_PrivateOnly()
3057+    //     {
3058+    //         super(false, true, new PKCS1Encoding(new RSABlindedEngine()));
3059+    //     }
3060+    // }
3061+    //
3062+    // static public class PKCS1v1_5Padding_PublicOnly
3063+    //     extends CipherSpi
3064+    // {
3065+    //     public PKCS1v1_5Padding_PublicOnly()
3066+    //     {
3067+    //         super(true, false, new PKCS1Encoding(new RSABlindedEngine()));
3068+    //     }
3069+    // }
3070+    //
3071+    // static public class OAEPPadding
3072+    //     extends CipherSpi
3073+    // {
3074+    //     public OAEPPadding()
3075+    //     {
3076+    //         super(OAEPParameterSpec.DEFAULT);
3077+    //     }
3078+    // }
3079+    //
3080+    // static public class ISO9796d1Padding
3081+    //     extends CipherSpi
3082+    // {
3083+    //     public ISO9796d1Padding()
3084+    //     {
3085+    //         super(new ISO9796d1Encoding(new RSABlindedEngine()));
3086+    //     }
3087+    // }
3088+    // END android-removed
3089 }
3090diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/asymmetric/rsa/DigestSignatureSpi.java bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/asymmetric/rsa/DigestSignatureSpi.java
3091--- bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/asymmetric/rsa/DigestSignatureSpi.java	2012-03-22 15:11:48.000000000 +0000
3092+++ bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/asymmetric/rsa/DigestSignatureSpi.java	2012-09-19 21:17:12.000000000 +0000
3093@@ -17,24 +17,31 @@
3094 import org.bouncycastle.asn1.nist.NISTObjectIdentifiers;
3095 import org.bouncycastle.asn1.oiw.OIWObjectIdentifiers;
3096 import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
3097-import org.bouncycastle.asn1.teletrust.TeleTrusTObjectIdentifiers;
3098+// BEGIN android-removed
3099+// import org.bouncycastle.asn1.teletrust.TeleTrusTObjectIdentifiers;
3100+// END android-removed
3101 import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
3102 import org.bouncycastle.asn1.x509.DigestInfo;
3103 import org.bouncycastle.crypto.AsymmetricBlockCipher;
3104 import org.bouncycastle.crypto.CipherParameters;
3105 import org.bouncycastle.crypto.Digest;
3106-import org.bouncycastle.crypto.digests.MD2Digest;
3107-import org.bouncycastle.crypto.digests.MD4Digest;
3108-import org.bouncycastle.crypto.digests.MD5Digest;
3109-import org.bouncycastle.crypto.digests.NullDigest;
3110-import org.bouncycastle.crypto.digests.RIPEMD128Digest;
3111-import org.bouncycastle.crypto.digests.RIPEMD160Digest;
3112-import org.bouncycastle.crypto.digests.RIPEMD256Digest;
3113-import org.bouncycastle.crypto.digests.SHA1Digest;
3114-import org.bouncycastle.crypto.digests.SHA224Digest;
3115-import org.bouncycastle.crypto.digests.SHA256Digest;
3116-import org.bouncycastle.crypto.digests.SHA384Digest;
3117-import org.bouncycastle.crypto.digests.SHA512Digest;
3118+// BEGIN android-removed
3119+// import org.bouncycastle.crypto.digests.MD2Digest;
3120+// import org.bouncycastle.crypto.digests.MD4Digest;
3121+// import org.bouncycastle.crypto.digests.MD5Digest;
3122+// import org.bouncycastle.crypto.digests.NullDigest;
3123+// import org.bouncycastle.crypto.digests.RIPEMD128Digest;
3124+// import org.bouncycastle.crypto.digests.RIPEMD160Digest;
3125+// import org.bouncycastle.crypto.digests.RIPEMD256Digest;
3126+// import org.bouncycastle.crypto.digests.SHA1Digest;
3127+// import org.bouncycastle.crypto.digests.SHA224Digest;
3128+// import org.bouncycastle.crypto.digests.SHA256Digest;
3129+// import org.bouncycastle.crypto.digests.SHA384Digest;
3130+// import org.bouncycastle.crypto.digests.SHA512Digest;
3131+// END android-removed
3132+// BEGIN android-added
3133+import org.bouncycastle.crypto.digests.AndroidDigestFactory;
3134+// END android-added
3135 import org.bouncycastle.crypto.encodings.PKCS1Encoding;
3136 import org.bouncycastle.crypto.engines.RSABlindedEngine;
3137 
3138@@ -261,25 +268,31 @@
3139     {
3140         public SHA1()
3141         {
3142-            super(OIWObjectIdentifiers.idSHA1, new SHA1Digest(), new PKCS1Encoding(new RSABlindedEngine()));
3143+            // BEGIN android-changed
3144+            super(OIWObjectIdentifiers.idSHA1, AndroidDigestFactory.getSHA1(), new PKCS1Encoding(new RSABlindedEngine()));
3145+            // END android-changed
3146         }
3147     }
3148 
3149-    static public class SHA224
3150-        extends DigestSignatureSpi
3151-    {
3152-        public SHA224()
3153-        {
3154-            super(NISTObjectIdentifiers.id_sha224, new SHA224Digest(), new PKCS1Encoding(new RSABlindedEngine()));
3155-        }
3156-    }
3157+    // BEGIN android-removed
3158+    // static public class SHA224
3159+    //     extends DigestSignatureSpi
3160+    // {
3161+    //     public SHA224()
3162+    //     {
3163+    //         super(NISTObjectIdentifiers.id_sha224, new SHA224Digest(), new PKCS1Encoding(new RSABlindedEngine()));
3164+    //     }
3165+    // }
3166+    // END android-removed
3167 
3168     static public class SHA256
3169         extends DigestSignatureSpi
3170     {
3171         public SHA256()
3172         {
3173-            super(NISTObjectIdentifiers.id_sha256, new SHA256Digest(), new PKCS1Encoding(new RSABlindedEngine()));
3174+            // BEGIN android-changed
3175+            super(NISTObjectIdentifiers.id_sha256, AndroidDigestFactory.getSHA256(), new PKCS1Encoding(new RSABlindedEngine()));
3176+            // END android-changed
3177         }
3178     }
3179 
3180@@ -288,7 +301,9 @@
3181     {
3182         public SHA384()
3183         {
3184-            super(NISTObjectIdentifiers.id_sha384, new SHA384Digest(), new PKCS1Encoding(new RSABlindedEngine()));
3185+            // BEGIN android-changed
3186+            super(NISTObjectIdentifiers.id_sha384, AndroidDigestFactory.getSHA384(), new PKCS1Encoding(new RSABlindedEngine()));
3187+            // END android-changed
3188         }
3189     }
3190 
3191@@ -297,70 +312,78 @@
3192     {
3193         public SHA512()
3194         {
3195-            super(NISTObjectIdentifiers.id_sha512, new SHA512Digest(), new PKCS1Encoding(new RSABlindedEngine()));
3196-        }
3197-    }
3198-
3199-    static public class MD2
3200-        extends DigestSignatureSpi
3201-    {
3202-        public MD2()
3203-        {
3204-            super(PKCSObjectIdentifiers.md2, new MD2Digest(), new PKCS1Encoding(new RSABlindedEngine()));
3205+            // BEGIN android-changed
3206+            super(NISTObjectIdentifiers.id_sha512, AndroidDigestFactory.getSHA512(), new PKCS1Encoding(new RSABlindedEngine()));
3207+            // END android-changed
3208         }
3209     }
3210 
3211-    static public class MD4
3212-        extends DigestSignatureSpi
3213-    {
3214-        public MD4()
3215-        {
3216-            super(PKCSObjectIdentifiers.md4, new MD4Digest(), new PKCS1Encoding(new RSABlindedEngine()));
3217-        }
3218-    }
3219+    // BEGIN android-removed
3220+    // static public class MD2
3221+    //     extends DigestSignatureSpi
3222+    // {
3223+    //     public MD2()
3224+    //     {
3225+    //         super(PKCSObjectIdentifiers.md2, new MD2Digest(), new PKCS1Encoding(new RSABlindedEngine()));
3226+    //     }
3227+    // }
3228+    //
3229+    // static public class MD4
3230+    //     extends DigestSignatureSpi
3231+    // {
3232+    //     public MD4()
3233+    //     {
3234+    //         super(PKCSObjectIdentifiers.md4, new MD4Digest(), new PKCS1Encoding(new RSABlindedEngine()));
3235+    //     }
3236+    // }
3237+    // END android-removed
3238 
3239     static public class MD5
3240         extends DigestSignatureSpi
3241     {
3242         public MD5()
3243         {
3244-            super(PKCSObjectIdentifiers.md5, new MD5Digest(), new PKCS1Encoding(new RSABlindedEngine()));
3245+            // BEGIN android-changed
3246+            super(PKCSObjectIdentifiers.md5, AndroidDigestFactory.getMD5(), new PKCS1Encoding(new RSABlindedEngine()));
3247+            // END android-changed
3248         }
3249     }
3250 
3251-    static public class RIPEMD160
3252-        extends DigestSignatureSpi
3253-    {
3254-        public RIPEMD160()
3255-        {
3256-            super(TeleTrusTObjectIdentifiers.ripemd160, new RIPEMD160Digest(), new PKCS1Encoding(new RSABlindedEngine()));
3257-        }
3258-    }
3259-
3260-    static public class RIPEMD128
3261-        extends DigestSignatureSpi
3262-    {
3263-        public RIPEMD128()
3264-        {
3265-            super(TeleTrusTObjectIdentifiers.ripemd128, new RIPEMD128Digest(), new PKCS1Encoding(new RSABlindedEngine()));
3266-        }
3267-    }
3268-
3269-    static public class RIPEMD256
3270-        extends DigestSignatureSpi
3271-    {
3272-        public RIPEMD256()
3273-        {
3274-            super(TeleTrusTObjectIdentifiers.ripemd256, new RIPEMD256Digest(), new PKCS1Encoding(new RSABlindedEngine()));
3275-        }
3276-    }
3277-
3278-    static public class noneRSA
3279-        extends DigestSignatureSpi
3280-    {
3281-        public noneRSA()
3282-        {
3283-            super(new NullDigest(), new PKCS1Encoding(new RSABlindedEngine()));
3284-        }
3285-    }
3286+    // BEGIN android-removed
3287+    // static public class RIPEMD160
3288+    //     extends DigestSignatureSpi
3289+    // {
3290+    //     public RIPEMD160()
3291+    //     {
3292+    //         super(TeleTrusTObjectIdentifiers.ripemd160, new RIPEMD160Digest(), new PKCS1Encoding(new RSABlindedEngine()));
3293+    //     }
3294+    // }
3295+    //
3296+    // static public class RIPEMD128
3297+    //     extends DigestSignatureSpi
3298+    // {
3299+    //     public RIPEMD128()
3300+    //     {
3301+    //         super(TeleTrusTObjectIdentifiers.ripemd128, new RIPEMD128Digest(), new PKCS1Encoding(new RSABlindedEngine()));
3302+    //     }
3303+    // }
3304+    //
3305+    // static public class RIPEMD256
3306+    //     extends DigestSignatureSpi
3307+    // {
3308+    //     public RIPEMD256()
3309+    //     {
3310+    //         super(TeleTrusTObjectIdentifiers.ripemd256, new RIPEMD256Digest(), new PKCS1Encoding(new RSABlindedEngine()));
3311+    //     }
3312+    // }
3313+    //
3314+    // static public class noneRSA
3315+    //     extends DigestSignatureSpi
3316+    // {
3317+    //     public noneRSA()
3318+    //     {
3319+    //         super(new NullDigest(), new PKCS1Encoding(new RSABlindedEngine()));
3320+    //     }
3321+    // }
3322+    // END android-removed
3323 }
3324diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/asymmetric/util/BaseCipherSpi.java bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/asymmetric/util/BaseCipherSpi.java
3325--- bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/asymmetric/util/BaseCipherSpi.java	2012-03-22 15:11:48.000000000 +0000
3326+++ bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/asymmetric/util/BaseCipherSpi.java	2012-09-19 21:17:12.000000000 +0000
3327@@ -18,8 +18,10 @@
3328 import javax.crypto.NoSuchPaddingException;
3329 import javax.crypto.spec.IvParameterSpec;
3330 import javax.crypto.spec.PBEParameterSpec;
3331-import javax.crypto.spec.RC2ParameterSpec;
3332-import javax.crypto.spec.RC5ParameterSpec;
3333+// BEGIN android-removed
3334+// import javax.crypto.spec.RC2ParameterSpec;
3335+// import javax.crypto.spec.RC5ParameterSpec;
3336+// END android-removed
3337 import javax.crypto.spec.SecretKeySpec;
3338 
3339 import org.bouncycastle.asn1.pkcs.PrivateKeyInfo;
3340@@ -37,8 +39,10 @@
3341                                     {
3342                                         IvParameterSpec.class,
3343                                         PBEParameterSpec.class,
3344-                                        RC2ParameterSpec.class,
3345-                                        RC5ParameterSpec.class
3346+                                        // BEGIN android-removed
3347+                                        // RC2ParameterSpec.class,
3348+                                        // RC5ParameterSpec.class
3349+                                        // END android-removed
3350                                     };
3351 
3352 
3353diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/asymmetric/util/BaseKeyFactorySpi.java bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/asymmetric/util/BaseKeyFactorySpi.java
3354--- bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/asymmetric/util/BaseKeyFactorySpi.java	2012-03-22 15:11:48.000000000 +0000
3355+++ bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/asymmetric/util/BaseKeyFactorySpi.java	2012-09-19 21:17:12.000000000 +0000
3356@@ -27,7 +27,9 @@
3357             {
3358                 return generatePrivate(PrivateKeyInfo.getInstance(((PKCS8EncodedKeySpec)keySpec).getEncoded()));
3359             }
3360-            catch (IOException e)
3361+            // BEGIN android-changed
3362+            catch (Exception e)
3363+            // END android-changed
3364             {
3365                 throw new InvalidKeySpecException("encoded key spec not recognised");
3366             }
3367@@ -48,7 +50,9 @@
3368             {
3369                 return generatePublic(SubjectPublicKeyInfo.getInstance(((X509EncodedKeySpec)keySpec).getEncoded()));
3370             }
3371-            catch (IOException e)
3372+            // BEGIN android-changed
3373+            catch (Exception e)
3374+            // END android-changed
3375             {
3376                 throw new InvalidKeySpecException("encoded key spec not recognised");
3377             }
3378diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/asymmetric/x509/PKIXCertPath.java bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/asymmetric/x509/PKIXCertPath.java
3379--- bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/asymmetric/x509/PKIXCertPath.java	2012-03-22 15:11:48.000000000 +0000
3380+++ bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/asymmetric/x509/PKIXCertPath.java	2012-09-19 21:17:12.000000000 +0000
3381@@ -36,7 +36,9 @@
3382 import org.bouncycastle.asn1.pkcs.SignedData;
3383 import org.bouncycastle.jce.provider.BouncyCastleProvider;
3384 import org.bouncycastle.util.io.pem.PemObject;
3385-import org.bouncycastle.util.io.pem.PemWriter;
3386+// BEGIN android-removed
3387+// import org.bouncycastle.util.io.pem.PemWriter;
3388+// END android-removed
3389 
3390 /**
3391  * CertPath implementation for X.509 certificates.
3392@@ -298,27 +300,29 @@
3393             return toDEREncoded(new ContentInfo(
3394                     PKCSObjectIdentifiers.signedData, sd));
3395         }
3396-        else if (encoding.equalsIgnoreCase("PEM"))
3397-        {
3398-            ByteArrayOutputStream bOut = new ByteArrayOutputStream();
3399-            PemWriter pWrt = new PemWriter(new OutputStreamWriter(bOut));
3400-
3401-            try
3402-            {
3403-                for (int i = 0; i != certificates.size(); i++)
3404-                {
3405-                    pWrt.writeObject(new PemObject("CERTIFICATE", ((X509Certificate)certificates.get(i)).getEncoded()));
3406-                }
3407-            
3408-                pWrt.close();
3409-            }
3410-            catch (Exception e)
3411-            {
3412-                throw new CertificateEncodingException("can't encode certificate for PEM encoded path");
3413-            }
3414-
3415-            return bOut.toByteArray();
3416-        }
3417+        // BEGIN android-removed
3418+        // else if (encoding.equalsIgnoreCase("PEM"))
3419+        // {
3420+        //     ByteArrayOutputStream bOut = new ByteArrayOutputStream();
3421+        //     PemWriter pWrt = new PemWriter(new OutputStreamWriter(bOut));
3422+        //
3423+        //     try
3424+        //     {
3425+        //         for (int i = 0; i != certificates.size(); i++)
3426+        //         {
3427+        //             pWrt.writeObject(new PemObject("CERTIFICATE", ((X509Certificate)certificates.get(i)).getEncoded()));
3428+        //         }
3429+        //
3430+        //         pWrt.close();
3431+        //     }
3432+        //     catch (Exception e)
3433+        //     {
3434+        //         throw new CertificateEncodingException("can't encode certificate for PEM encoded path");
3435+        //     }
3436+        //
3437+        //     return bOut.toByteArray();
3438+        // }
3439+        // END android-removed
3440         else
3441         {
3442             throw new CertificateEncodingException("unsupported encoding: " + encoding);
3443diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/symmetric/AES.java bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/symmetric/AES.java
3444--- bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/symmetric/AES.java	2012-03-22 15:11:48.000000000 +0000
3445+++ bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/symmetric/AES.java	2012-09-19 21:17:12.000000000 +0000
3446@@ -1,31 +1,43 @@
3447 package org.bouncycastle.jcajce.provider.symmetric;
3448 
3449-import java.security.AlgorithmParameters;
3450-import java.security.InvalidAlgorithmParameterException;
3451+// BEGIN android-removed
3452+// import java.security.AlgorithmParameters;
3453+// import java.security.InvalidAlgorithmParameterException;
3454+// END android-removed
3455 import java.security.SecureRandom;
3456-import java.security.spec.AlgorithmParameterSpec;
3457-
3458-import javax.crypto.spec.IvParameterSpec;
3459+// BEGIN android-removed
3460+// import java.security.spec.AlgorithmParameterSpec;
3461+//
3462+// import javax.crypto.spec.IvParameterSpec;
3463+// END android-removed
3464 
3465 import org.bouncycastle.asn1.nist.NISTObjectIdentifiers;
3466 import org.bouncycastle.crypto.BufferedBlockCipher;
3467 import org.bouncycastle.crypto.CipherKeyGenerator;
3468 import org.bouncycastle.crypto.engines.AESFastEngine;
3469 import org.bouncycastle.crypto.engines.AESWrapEngine;
3470-import org.bouncycastle.crypto.engines.RFC3211WrapEngine;
3471-import org.bouncycastle.crypto.macs.CMac;
3472+// BEGIN android-removed
3473+// import org.bouncycastle.crypto.engines.RFC3211WrapEngine;
3474+// import org.bouncycastle.crypto.macs.CMac;
3475+// END android-removed
3476 import org.bouncycastle.crypto.modes.CBCBlockCipher;
3477 import org.bouncycastle.crypto.modes.CFBBlockCipher;
3478 import org.bouncycastle.crypto.modes.OFBBlockCipher;
3479 import org.bouncycastle.jcajce.provider.config.ConfigurableProvider;
3480-import org.bouncycastle.jcajce.provider.symmetric.util.BaseAlgorithmParameterGenerator;
3481+// BEGIN android-removed
3482+// import org.bouncycastle.jcajce.provider.symmetric.util.BaseAlgorithmParameterGenerator;
3483+// END android-removed
3484 import org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher;
3485 import org.bouncycastle.jcajce.provider.symmetric.util.BaseKeyGenerator;
3486-import org.bouncycastle.jcajce.provider.symmetric.util.BaseMac;
3487+// BEGIN android-removed
3488+// import org.bouncycastle.jcajce.provider.symmetric.util.BaseMac;
3489+// END android-removed
3490 import org.bouncycastle.jcajce.provider.symmetric.util.BaseWrapCipher;
3491 import org.bouncycastle.jcajce.provider.symmetric.util.IvAlgorithmParameters;
3492 import org.bouncycastle.jcajce.provider.util.AlgorithmProvider;
3493-import org.bouncycastle.jce.provider.BouncyCastleProvider;
3494+// BEGIN android-removed
3495+// import org.bouncycastle.jce.provider.BouncyCastleProvider;
3496+// END android-removed
3497 
3498 public final class AES
3499 {
3500@@ -69,15 +81,17 @@
3501         }
3502     }
3503 
3504-    public static class AESCMAC
3505-        extends BaseMac
3506-    {
3507-        public AESCMAC()
3508-        {
3509-            super(new CMac(new AESFastEngine()));
3510-        }
3511-    }
3512-
3513+    // BEGIN android-removed
3514+    // public static class AESCMAC
3515+    //     extends BaseMac
3516+    // {
3517+    //     public AESCMAC()
3518+    //     {
3519+    //         super(new CMac(new AESFastEngine()));
3520+    //     }
3521+    // }
3522+    // END android-removed
3523+    
3524     static public class Wrap
3525         extends BaseWrapCipher
3526     {
3527@@ -86,15 +100,17 @@
3528             super(new AESWrapEngine());
3529         }
3530     }
3531-
3532-    public static class RFC3211Wrap
3533-        extends BaseWrapCipher
3534-    {
3535-        public RFC3211Wrap()
3536-        {
3537-            super(new RFC3211WrapEngine(new AESFastEngine()), 16);
3538-        }
3539-    }
3540+    
3541+    // BEGIN android-removed
3542+    // public static class RFC3211Wrap
3543+    //     extends BaseWrapCipher
3544+    // {
3545+    //     public RFC3211Wrap()
3546+    //     {
3547+    //         super(new RFC3211WrapEngine(new AESFastEngine()), 16);
3548+    //     }
3549+    // }
3550+    // END android-removed
3551 
3552     public static class KeyGen
3553         extends BaseKeyGenerator
3554@@ -110,70 +126,72 @@
3555         }
3556     }
3557 
3558-    public static class KeyGen128
3559-        extends KeyGen
3560-    {
3561-        public KeyGen128()
3562-        {
3563-            super(128);
3564-        }
3565-    }
3566-
3567-    public static class KeyGen192
3568-        extends KeyGen
3569-    {
3570-        public KeyGen192()
3571-        {
3572-            super(192);
3573-        }
3574-    }
3575-
3576-    public static class KeyGen256
3577-        extends KeyGen
3578-    {
3579-        public KeyGen256()
3580-        {
3581-            super(256);
3582-        }
3583-    }
3584-
3585-    public static class AlgParamGen
3586-        extends BaseAlgorithmParameterGenerator
3587-    {
3588-        protected void engineInit(
3589-            AlgorithmParameterSpec genParamSpec,
3590-            SecureRandom random)
3591-            throws InvalidAlgorithmParameterException
3592-        {
3593-            throw new InvalidAlgorithmParameterException("No supported AlgorithmParameterSpec for AES parameter generation.");
3594-        }
3595-
3596-        protected AlgorithmParameters engineGenerateParameters()
3597-        {
3598-            byte[]  iv = new byte[16];
3599-
3600-            if (random == null)
3601-            {
3602-                random = new SecureRandom();
3603-            }
3604-
3605-            random.nextBytes(iv);
3606-
3607-            AlgorithmParameters params;
3608-
3609-            try
3610-            {
3611-                params = AlgorithmParameters.getInstance("AES", BouncyCastleProvider.PROVIDER_NAME);
3612-                params.init(new IvParameterSpec(iv));
3613-            }
3614-            catch (Exception e)
3615-            {
3616-                throw new RuntimeException(e.getMessage());
3617-            }
3618-
3619-            return params;
3620-        }
3621-    }
3622+    // BEGIN android-removed
3623+    // public static class KeyGen128
3624+    //     extends KeyGen
3625+    // {
3626+    //     public KeyGen128()
3627+    //     {
3628+    //         super(128);
3629+    //     }
3630+    // }
3631+    //
3632+    // public static class KeyGen192
3633+    //     extends KeyGen
3634+    // {
3635+    //     public KeyGen192()
3636+    //     {
3637+    //         super(192);
3638+    //     }
3639+    // }
3640+    //
3641+    // public static class KeyGen256
3642+    //     extends KeyGen
3643+    // {
3644+    //     public KeyGen256()
3645+    //     {
3646+    //         super(256);
3647+    //     }
3648+    // }
3649+    //
3650+    // public static class AlgParamGen
3651+    //     extends BaseAlgorithmParameterGenerator
3652+    // {
3653+    //     protected void engineInit(
3654+    //         AlgorithmParameterSpec genParamSpec,
3655+    //         SecureRandom random)
3656+    //         throws InvalidAlgorithmParameterException
3657+    //     {
3658+    //         throw new InvalidAlgorithmParameterException("No supported AlgorithmParameterSpec for AES parameter generation.");
3659+    //     }
3660+    //
3661+    //     protected AlgorithmParameters engineGenerateParameters()
3662+    //     {
3663+    //         byte[]  iv = new byte[16];
3664+    //
3665+    //         if (random == null)
3666+    //         {
3667+    //             random = new SecureRandom();
3668+    //         }
3669+    //
3670+    //         random.nextBytes(iv);
3671+    //
3672+    //         AlgorithmParameters params;
3673+    //
3674+    //         try
3675+    //         {
3676+    //             params = AlgorithmParameters.getInstance("AES", BouncyCastleProvider.PROVIDER_NAME);
3677+    //             params.init(new IvParameterSpec(iv));
3678+    //         }
3679+    //         catch (Exception e)
3680+    //         {
3681+    //             throw new RuntimeException(e.getMessage());
3682+    //         }
3683+    //
3684+    //         return params;
3685+    //     }
3686+    // }
3687+    // END android-removed
3688 
3689     public static class AlgParams
3690         extends IvAlgorithmParameters
3691@@ -212,58 +230,66 @@
3692             provider.addAlgorithm("Alg.Alias.AlgorithmParameters." + NISTObjectIdentifiers.id_aes192_CBC, "AES");
3693             provider.addAlgorithm("Alg.Alias.AlgorithmParameters." + NISTObjectIdentifiers.id_aes256_CBC, "AES");
3694 
3695-            provider.addAlgorithm("AlgorithmParameterGenerator.AES", PREFIX + "$AlgParamGen");
3696-            provider.addAlgorithm("Alg.Alias.AlgorithmParameterGenerator." + wrongAES128, "AES");
3697-            provider.addAlgorithm("Alg.Alias.AlgorithmParameterGenerator." + wrongAES192, "AES");
3698-            provider.addAlgorithm("Alg.Alias.AlgorithmParameterGenerator." + wrongAES256, "AES");
3699-            provider.addAlgorithm("Alg.Alias.AlgorithmParameterGenerator." + NISTObjectIdentifiers.id_aes128_CBC, "AES");
3700-            provider.addAlgorithm("Alg.Alias.AlgorithmParameterGenerator." + NISTObjectIdentifiers.id_aes192_CBC, "AES");
3701-            provider.addAlgorithm("Alg.Alias.AlgorithmParameterGenerator." + NISTObjectIdentifiers.id_aes256_CBC, "AES");
3702+            // BEGIN android-removed
3703+            // provider.addAlgorithm("AlgorithmParameterGenerator.AES", PREFIX + "$AlgParamGen");
3704+            // provider.addAlgorithm("Alg.Alias.AlgorithmParameterGenerator." + wrongAES128, "AES");
3705+            // provider.addAlgorithm("Alg.Alias.AlgorithmParameterGenerator." + wrongAES192, "AES");
3706+            // provider.addAlgorithm("Alg.Alias.AlgorithmParameterGenerator." + wrongAES256, "AES");
3707+            // provider.addAlgorithm("Alg.Alias.AlgorithmParameterGenerator." + NISTObjectIdentifiers.id_aes128_CBC, "AES");
3708+            // provider.addAlgorithm("Alg.Alias.AlgorithmParameterGenerator." + NISTObjectIdentifiers.id_aes192_CBC, "AES");
3709+            // provider.addAlgorithm("Alg.Alias.AlgorithmParameterGenerator." + NISTObjectIdentifiers.id_aes256_CBC, "AES");
3710+            // END android-removed
3711 
3712             provider.addAlgorithm("Cipher.AES", PREFIX + "$ECB");
3713             provider.addAlgorithm("Alg.Alias.Cipher." + wrongAES128, "AES");
3714             provider.addAlgorithm("Alg.Alias.Cipher." + wrongAES192, "AES");
3715             provider.addAlgorithm("Alg.Alias.Cipher." + wrongAES256, "AES");
3716-            provider.addAlgorithm("Cipher." + NISTObjectIdentifiers.id_aes128_ECB, PREFIX + "$ECB");
3717-            provider.addAlgorithm("Cipher." + NISTObjectIdentifiers.id_aes192_ECB, PREFIX + "$ECB");
3718-            provider.addAlgorithm("Cipher." + NISTObjectIdentifiers.id_aes256_ECB, PREFIX + "$ECB");
3719-            provider.addAlgorithm("Cipher." + NISTObjectIdentifiers.id_aes128_CBC, PREFIX + "$CBC");
3720-            provider.addAlgorithm("Cipher." + NISTObjectIdentifiers.id_aes192_CBC, PREFIX + "$CBC");
3721-            provider.addAlgorithm("Cipher." + NISTObjectIdentifiers.id_aes256_CBC, PREFIX + "$CBC");
3722-            provider.addAlgorithm("Cipher." + NISTObjectIdentifiers.id_aes128_OFB, PREFIX + "$OFB");
3723-            provider.addAlgorithm("Cipher." + NISTObjectIdentifiers.id_aes192_OFB, PREFIX + "$OFB");
3724-            provider.addAlgorithm("Cipher." + NISTObjectIdentifiers.id_aes256_OFB, PREFIX + "$OFB");
3725-            provider.addAlgorithm("Cipher." + NISTObjectIdentifiers.id_aes128_CFB, PREFIX + "$CFB");
3726-            provider.addAlgorithm("Cipher." + NISTObjectIdentifiers.id_aes192_CFB, PREFIX + "$CFB");
3727-            provider.addAlgorithm("Cipher." + NISTObjectIdentifiers.id_aes256_CFB, PREFIX + "$CFB");
3728+            // BEGIN android-removed
3729+            // provider.addAlgorithm("Cipher." + NISTObjectIdentifiers.id_aes128_ECB, PREFIX + "$ECB");
3730+            // provider.addAlgorithm("Cipher." + NISTObjectIdentifiers.id_aes192_ECB, PREFIX + "$ECB");
3731+            // provider.addAlgorithm("Cipher." + NISTObjectIdentifiers.id_aes256_ECB, PREFIX + "$ECB");
3732+            // provider.addAlgorithm("Cipher." + NISTObjectIdentifiers.id_aes128_CBC, PREFIX + "$CBC");
3733+            // provider.addAlgorithm("Cipher." + NISTObjectIdentifiers.id_aes192_CBC, PREFIX + "$CBC");
3734+            // provider.addAlgorithm("Cipher." + NISTObjectIdentifiers.id_aes256_CBC, PREFIX + "$CBC");
3735+            // provider.addAlgorithm("Cipher." + NISTObjectIdentifiers.id_aes128_OFB, PREFIX + "$OFB");
3736+            // provider.addAlgorithm("Cipher." + NISTObjectIdentifiers.id_aes192_OFB, PREFIX + "$OFB");
3737+            // provider.addAlgorithm("Cipher." + NISTObjectIdentifiers.id_aes256_OFB, PREFIX + "$OFB");
3738+            // provider.addAlgorithm("Cipher." + NISTObjectIdentifiers.id_aes128_CFB, PREFIX + "$CFB");
3739+            // provider.addAlgorithm("Cipher." + NISTObjectIdentifiers.id_aes192_CFB, PREFIX + "$CFB");
3740+            // provider.addAlgorithm("Cipher." + NISTObjectIdentifiers.id_aes256_CFB, PREFIX + "$CFB");
3741+            // END android-removed
3742             provider.addAlgorithm("Cipher.AESWRAP", PREFIX + "$Wrap");
3743             provider.addAlgorithm("Alg.Alias.Cipher." + NISTObjectIdentifiers.id_aes128_wrap, "AESWRAP");
3744             provider.addAlgorithm("Alg.Alias.Cipher." + NISTObjectIdentifiers.id_aes192_wrap, "AESWRAP");
3745             provider.addAlgorithm("Alg.Alias.Cipher." + NISTObjectIdentifiers.id_aes256_wrap, "AESWRAP");
3746-            provider.addAlgorithm("Cipher.AESRFC3211WRAP", PREFIX + "$RFC3211Wrap");
3747+            // BEGIN android-removed
3748+            // provider.addAlgorithm("Cipher.AESRFC3211WRAP", PREFIX + "$RFC3211Wrap");
3749+            // END android-removed
3750 
3751             provider.addAlgorithm("KeyGenerator.AES", PREFIX + "$KeyGen");
3752-            provider.addAlgorithm("KeyGenerator." + wrongAES128, PREFIX + "$KeyGen128");
3753-            provider.addAlgorithm("KeyGenerator." + wrongAES192, PREFIX + "$KeyGen192");
3754-            provider.addAlgorithm("KeyGenerator." + wrongAES256, PREFIX + "$KeyGen256");
3755-            provider.addAlgorithm("KeyGenerator." + NISTObjectIdentifiers.id_aes128_ECB, PREFIX + "$KeyGen128");
3756-            provider.addAlgorithm("KeyGenerator." + NISTObjectIdentifiers.id_aes128_CBC, PREFIX + "$KeyGen128");
3757-            provider.addAlgorithm("KeyGenerator." + NISTObjectIdentifiers.id_aes128_OFB, PREFIX + "$KeyGen128");
3758-            provider.addAlgorithm("KeyGenerator." + NISTObjectIdentifiers.id_aes128_CFB, PREFIX + "$KeyGen128");
3759-            provider.addAlgorithm("KeyGenerator." + NISTObjectIdentifiers.id_aes192_ECB, PREFIX + "$KeyGen192");
3760-            provider.addAlgorithm("KeyGenerator." + NISTObjectIdentifiers.id_aes192_CBC, PREFIX + "$KeyGen192");
3761-            provider.addAlgorithm("KeyGenerator." + NISTObjectIdentifiers.id_aes192_OFB, PREFIX + "$KeyGen192");
3762-            provider.addAlgorithm("KeyGenerator." + NISTObjectIdentifiers.id_aes192_CFB, PREFIX + "$KeyGen192");
3763-            provider.addAlgorithm("KeyGenerator." + NISTObjectIdentifiers.id_aes256_ECB, PREFIX + "$KeyGen256");
3764-            provider.addAlgorithm("KeyGenerator." + NISTObjectIdentifiers.id_aes256_CBC, PREFIX + "$KeyGen256");
3765-            provider.addAlgorithm("KeyGenerator." + NISTObjectIdentifiers.id_aes256_OFB, PREFIX + "$KeyGen256");
3766-            provider.addAlgorithm("KeyGenerator." + NISTObjectIdentifiers.id_aes256_CFB, PREFIX + "$KeyGen256");
3767-            provider.addAlgorithm("KeyGenerator.AESWRAP", PREFIX + "$KeyGen");
3768-            provider.addAlgorithm("KeyGenerator." + NISTObjectIdentifiers.id_aes128_wrap, PREFIX + "$KeyGen128");
3769-            provider.addAlgorithm("KeyGenerator." + NISTObjectIdentifiers.id_aes192_wrap, PREFIX + "$KeyGen192");
3770-            provider.addAlgorithm("KeyGenerator." + NISTObjectIdentifiers.id_aes256_wrap, PREFIX + "$KeyGen256");
3771-
3772-            provider.addAlgorithm("Mac.AESCMAC", PREFIX + "$AESCMAC");
3773+            // BEGIN android-removed
3774+            // provider.addAlgorithm("KeyGenerator." + wrongAES128, PREFIX + "$KeyGen128");
3775+            // provider.addAlgorithm("KeyGenerator." + wrongAES192, PREFIX + "$KeyGen192");
3776+            // provider.addAlgorithm("KeyGenerator." + wrongAES256, PREFIX + "$KeyGen256");
3777+            // provider.addAlgorithm("KeyGenerator." + NISTObjectIdentifiers.id_aes128_ECB, PREFIX + "$KeyGen128");
3778+            // provider.addAlgorithm("KeyGenerator." + NISTObjectIdentifiers.id_aes128_CBC, PREFIX + "$KeyGen128");
3779+            // provider.addAlgorithm("KeyGenerator." + NISTObjectIdentifiers.id_aes128_OFB, PREFIX + "$KeyGen128");
3780+            // provider.addAlgorithm("KeyGenerator." + NISTObjectIdentifiers.id_aes128_CFB, PREFIX + "$KeyGen128");
3781+            // provider.addAlgorithm("KeyGenerator." + NISTObjectIdentifiers.id_aes192_ECB, PREFIX + "$KeyGen192");
3782+            // provider.addAlgorithm("KeyGenerator." + NISTObjectIdentifiers.id_aes192_CBC, PREFIX + "$KeyGen192");
3783+            // provider.addAlgorithm("KeyGenerator." + NISTObjectIdentifiers.id_aes192_OFB, PREFIX + "$KeyGen192");
3784+            // provider.addAlgorithm("KeyGenerator." + NISTObjectIdentifiers.id_aes192_CFB, PREFIX + "$KeyGen192");
3785+            // provider.addAlgorithm("KeyGenerator." + NISTObjectIdentifiers.id_aes256_ECB, PREFIX + "$KeyGen256");
3786+            // provider.addAlgorithm("KeyGenerator." + NISTObjectIdentifiers.id_aes256_CBC, PREFIX + "$KeyGen256");
3787+            // provider.addAlgorithm("KeyGenerator." + NISTObjectIdentifiers.id_aes256_OFB, PREFIX + "$KeyGen256");
3788+            // provider.addAlgorithm("KeyGenerator." + NISTObjectIdentifiers.id_aes256_CFB, PREFIX + "$KeyGen256");
3789+            // provider.addAlgorithm("KeyGenerator.AESWRAP", PREFIX + "$KeyGen");
3790+            // provider.addAlgorithm("KeyGenerator." + NISTObjectIdentifiers.id_aes128_wrap, PREFIX + "$KeyGen128");
3791+            // provider.addAlgorithm("KeyGenerator." + NISTObjectIdentifiers.id_aes192_wrap, PREFIX + "$KeyGen192");
3792+            // provider.addAlgorithm("KeyGenerator." + NISTObjectIdentifiers.id_aes256_wrap, PREFIX + "$KeyGen256");
3793+            //
3794+            // provider.addAlgorithm("Mac.AESCMAC", PREFIX + "$AESCMAC");
3795+            // END android-removed
3796         }
3797     }
3798 }
3799diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/symmetric/ARC4.java bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/symmetric/ARC4.java
3800--- bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/symmetric/ARC4.java	2012-03-22 15:11:48.000000000 +0000
3801+++ bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/symmetric/ARC4.java	2012-09-19 21:17:12.000000000 +0000
3802@@ -27,7 +27,9 @@
3803     {
3804         public KeyGen()
3805         {
3806-            super("RC4", 128, new CipherKeyGenerator());
3807+            // BEGIN android-changed
3808+            super("ARC4", 128, new CipherKeyGenerator());
3809+            // END android-changed
3810         }
3811     }
3812 
3813diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/symmetric/Blowfish.java bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/symmetric/Blowfish.java
3814--- bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/symmetric/Blowfish.java	2012-03-22 15:11:48.000000000 +0000
3815+++ bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/symmetric/Blowfish.java	2012-09-19 21:17:12.000000000 +0000
3816@@ -64,7 +64,9 @@
3817         {
3818 
3819             provider.addAlgorithm("Cipher.BLOWFISH", PREFIX + "$ECB");
3820-            provider.addAlgorithm("Cipher.1.3.6.1.4.1.3029.1.2", PREFIX + "$CBC");
3821+            // BEGIN android-removed
3822+            // provider.addAlgorithm("Cipher.1.3.6.1.4.1.3029.1.2", PREFIX + "$CBC");
3823+            // END android-removed
3824             provider.addAlgorithm("KeyGenerator.BLOWFISH", PREFIX + "$KeyGen");
3825             provider.addAlgorithm("Alg.Alias.KeyGenerator.1.3.6.1.4.1.3029.1.2", "BLOWFISH");
3826             provider.addAlgorithm("AlgorithmParameters.BLOWFISH", PREFIX + "$AlgParams");
3827diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/symmetric/DES.java bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/symmetric/DES.java
3828--- bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/symmetric/DES.java	2012-03-22 15:11:48.000000000 +0000
3829+++ bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/symmetric/DES.java	2012-09-19 21:17:12.000000000 +0000
3830@@ -16,11 +16,15 @@
3831 import org.bouncycastle.asn1.oiw.OIWObjectIdentifiers;
3832 import org.bouncycastle.crypto.KeyGenerationParameters;
3833 import org.bouncycastle.crypto.engines.DESEngine;
3834-import org.bouncycastle.crypto.engines.RFC3211WrapEngine;
3835+// BEGIN android-removed
3836+// import org.bouncycastle.crypto.engines.RFC3211WrapEngine;
3837+// END android-removed
3838 import org.bouncycastle.crypto.generators.DESKeyGenerator;
3839 import org.bouncycastle.crypto.macs.CBCBlockCipherMac;
3840-import org.bouncycastle.crypto.macs.CFBBlockCipherMac;
3841-import org.bouncycastle.crypto.macs.CMac;
3842+// BEGIN android-removed
3843+// import org.bouncycastle.crypto.macs.CFBBlockCipherMac;
3844+// import org.bouncycastle.crypto.macs.CMac;
3845+// END android-removed
3846 import org.bouncycastle.crypto.modes.CBCBlockCipher;
3847 import org.bouncycastle.crypto.paddings.ISO7816d4Padding;
3848 import org.bouncycastle.jcajce.provider.config.ConfigurableProvider;
3849@@ -48,115 +52,117 @@
3850         }
3851     }
3852 
3853-    static public class CBC
3854-        extends BaseBlockCipher
3855-    {
3856-        public CBC()
3857-        {
3858-            super(new CBCBlockCipher(new DESEngine()), 64);
3859-        }
3860-    }
3861-
3862-    /**
3863-     * DES   CFB8
3864-     */
3865-    public static class DESCFB8
3866-        extends BaseMac
3867-    {
3868-        public DESCFB8()
3869-        {
3870-            super(new CFBBlockCipherMac(new DESEngine()));
3871-        }
3872-    }
3873-
3874-    /**
3875-     * DES64
3876-     */
3877-    public static class DES64
3878-        extends BaseMac
3879-    {
3880-        public DES64()
3881-        {
3882-            super(new CBCBlockCipherMac(new DESEngine(), 64));
3883-        }
3884-    }
3885-
3886-    /**
3887-     * DES64with7816-4Padding
3888-     */
3889-    public static class DES64with7816d4
3890-        extends BaseMac
3891-    {
3892-        public DES64with7816d4()
3893-        {
3894-            super(new CBCBlockCipherMac(new DESEngine(), 64, new ISO7816d4Padding()));
3895-        }
3896-    }
3897-    
3898-    public static class CBCMAC
3899-        extends BaseMac
3900-    {
3901-        public CBCMAC()
3902-        {
3903-            super(new CBCBlockCipherMac(new DESEngine()));
3904-        }
3905-    }
3906-
3907-    static public class CMAC
3908-        extends BaseMac
3909-    {
3910-        public CMAC()
3911-        {
3912-            super(new CMac(new DESEngine()));
3913-        }
3914-    }
3915-
3916-    public static class RFC3211
3917-        extends BaseWrapCipher
3918-    {
3919-        public RFC3211()
3920-        {
3921-            super(new RFC3211WrapEngine(new DESEngine()), 8);
3922-        }
3923-    }
3924-
3925-    public static class AlgParamGen
3926-        extends BaseAlgorithmParameterGenerator
3927-    {
3928-        protected void engineInit(
3929-            AlgorithmParameterSpec genParamSpec,
3930-            SecureRandom            random)
3931-            throws InvalidAlgorithmParameterException
3932-        {
3933-            throw new InvalidAlgorithmParameterException("No supported AlgorithmParameterSpec for DES parameter generation.");
3934-        }
3935-
3936-        protected AlgorithmParameters engineGenerateParameters()
3937-        {
3938-            byte[]  iv = new byte[8];
3939-
3940-            if (random == null)
3941-            {
3942-                random = new SecureRandom();
3943-            }
3944-
3945-            random.nextBytes(iv);
3946-
3947-            AlgorithmParameters params;
3948-
3949-            try
3950-            {
3951-                params = AlgorithmParameters.getInstance("DES", BouncyCastleProvider.PROVIDER_NAME);
3952-                params.init(new IvParameterSpec(iv));
3953-            }
3954-            catch (Exception e)
3955-            {
3956-                throw new RuntimeException(e.getMessage());
3957-            }
3958-
3959-            return params;
3960-        }
3961-    }
3962+    // BEGIN android-removed
3963+    // static public class CBC
3964+    //     extends BaseBlockCipher
3965+    // {
3966+    //     public CBC()
3967+    //     {
3968+    //         super(new CBCBlockCipher(new DESEngine()), 64);
3969+    //     }
3970+    // }
3971+    //
3972+    // /**
3973+    //  * DES   CFB8
3974+    //  */
3975+    // public static class DESCFB8
3976+    //     extends BaseMac
3977+    // {
3978+    //     public DESCFB8()
3979+    //     {
3980+    //         super(new CFBBlockCipherMac(new DESEngine()));
3981+    //     }
3982+    // }
3983+    //
3984+    // /**
3985+    //  * DES64
3986+    //  */
3987+    // public static class DES64
3988+    //     extends BaseMac
3989+    // {
3990+    //     public DES64()
3991+    //     {
3992+    //         super(new CBCBlockCipherMac(new DESEngine(), 64));
3993+    //     }
3994+    // }
3995+    //
3996+    // /**
3997+    //  * DES64with7816-4Padding
3998+    //  */
3999+    // public static class DES64with7816d4
4000+    //     extends BaseMac
4001+    // {
4002+    //     public DES64with7816d4()
4003+    //     {
4004+    //         super(new CBCBlockCipherMac(new DESEngine(), 64, new ISO7816d4Padding()));
4005+    //     }
4006+    // }
4007+    //
4008+    // public static class CBCMAC
4009+    //     extends BaseMac
4010+    // {
4011+    //     public CBCMAC()
4012+    //     {
4013+    //         super(new CBCBlockCipherMac(new DESEngine()));
4014+    //     }
4015+    // }
4016+    //
4017+    // static public class CMAC
4018+    //     extends BaseMac
4019+    // {
4020+    //     public CMAC()
4021+    //     {
4022+    //         super(new CMac(new DESEngine()));
4023+    //     }
4024+    // }
4025+    //
4026+    // public static class RFC3211
4027+    //     extends BaseWrapCipher
4028+    // {
4029+    //     public RFC3211()
4030+    //     {
4031+    //         super(new RFC3211WrapEngine(new DESEngine()), 8);
4032+    //     }
4033+    // }
4034+    //
4035+    // public static class AlgParamGen
4036+    //     extends BaseAlgorithmParameterGenerator
4037+    // {
4038+    //     protected void engineInit(
4039+    //         AlgorithmParameterSpec genParamSpec,
4040+    //         SecureRandom            random)
4041+    //         throws InvalidAlgorithmParameterException
4042+    //     {
4043+    //         throw new InvalidAlgorithmParameterException("No supported AlgorithmParameterSpec for DES parameter generation.");
4044+    //     }
4045+    //
4046+    //     protected AlgorithmParameters engineGenerateParameters()
4047+    //     {
4048+    //         byte[]  iv = new byte[8];
4049+    //
4050+    //         if (random == null)
4051+    //         {
4052+    //             random = new SecureRandom();
4053+    //         }
4054+    //
4055+    //         random.nextBytes(iv);
4056+    //
4057+    //         AlgorithmParameters params;
4058+    //
4059+    //         try
4060+    //         {
4061+    //             params = AlgorithmParameters.getInstance("DES", BouncyCastleProvider.PROVIDER_NAME);
4062+    //             params.init(new IvParameterSpec(iv));
4063+    //         }
4064+    //         catch (Exception e)
4065+    //         {
4066+    //             throw new RuntimeException(e.getMessage());
4067+    //         }
4068+    //
4069+    //         return params;
4070+    //     }
4071+    // }
4072+    // END android-removed
4073 
4074   /**
4075      * DES - the default for this is to generate a key in
4076@@ -263,36 +269,42 @@
4077         {
4078 
4079             provider.addAlgorithm("Cipher.DES", PREFIX + "$ECB");
4080-            provider.addAlgorithm("Cipher." + OIWObjectIdentifiers.desCBC, PREFIX + "$CBC");
4081-
4082-            addAlias(provider, OIWObjectIdentifiers.desCBC, "DES");
4083-
4084-            provider.addAlgorithm("Cipher.DESRFC3211WRAP", PREFIX + "$RFC3211");
4085+            // BEGIN android-removed
4086+            // provider.addAlgorithm("Cipher." + OIWObjectIdentifiers.desCBC, PREFIX + "$CBC");
4087+            //
4088+            // addAlias(provider, OIWObjectIdentifiers.desCBC, "DES");
4089+            //
4090+            // provider.addAlgorithm("Cipher.DESRFC3211WRAP", PREFIX + "$RFC3211");
4091+            // END android-removed
4092 
4093             provider.addAlgorithm("KeyGenerator.DES", PREFIX + "$KeyGenerator");
4094 
4095             provider.addAlgorithm("SecretKeyFactory.DES", PREFIX + "$KeyFactory");
4096 
4097-            provider.addAlgorithm("Mac.DESCMAC", PREFIX + "$CMAC");
4098-            provider.addAlgorithm("Mac.DESMAC", PREFIX + "$CBCMAC");
4099-            provider.addAlgorithm("Alg.Alias.Mac.DES", "DESMAC");
4100-
4101-            provider.addAlgorithm("Mac.DESMAC/CFB8", PREFIX + "$DESCFB8");
4102-            provider.addAlgorithm("Alg.Alias.Mac.DES/CFB8", "DESMAC/CFB8");
4103-
4104-            provider.addAlgorithm("Mac.DESMAC64", PREFIX + "$DES64");
4105-            provider.addAlgorithm("Alg.Alias.Mac.DES64", "DESMAC64");
4106-
4107-            provider.addAlgorithm("Mac.DESMAC64WITHISO7816-4PADDING", PREFIX + "$DES64with7816d4");
4108-            provider.addAlgorithm("Alg.Alias.Mac.DES64WITHISO7816-4PADDING", "DESMAC64WITHISO7816-4PADDING");
4109-            provider.addAlgorithm("Alg.Alias.Mac.DESISO9797ALG1MACWITHISO7816-4PADDING", "DESMAC64WITHISO7816-4PADDING");
4110-            provider.addAlgorithm("Alg.Alias.Mac.DESISO9797ALG1WITHISO7816-4PADDING", "DESMAC64WITHISO7816-4PADDING");
4111+            // BEGIN android-removed
4112+            // provider.addAlgorithm("Mac.DESCMAC", PREFIX + "$CMAC");
4113+            // provider.addAlgorithm("Mac.DESMAC", PREFIX + "$CBCMAC");
4114+            // provider.addAlgorithm("Alg.Alias.Mac.DES", "DESMAC");
4115+            //
4116+            // provider.addAlgorithm("Mac.DESMAC/CFB8", PREFIX + "$DESCFB8");
4117+            // provider.addAlgorithm("Alg.Alias.Mac.DES/CFB8", "DESMAC/CFB8");
4118+            //
4119+            // provider.addAlgorithm("Mac.DESMAC64", PREFIX + "$DES64");
4120+            // provider.addAlgorithm("Alg.Alias.Mac.DES64", "DESMAC64");
4121+            //
4122+            // provider.addAlgorithm("Mac.DESMAC64WITHISO7816-4PADDING", PREFIX + "$DES64with7816d4");
4123+            // provider.addAlgorithm("Alg.Alias.Mac.DES64WITHISO7816-4PADDING", "DESMAC64WITHISO7816-4PADDING");
4124+            // provider.addAlgorithm("Alg.Alias.Mac.DESISO9797ALG1MACWITHISO7816-4PADDING", "DESMAC64WITHISO7816-4PADDING");
4125+            // provider.addAlgorithm("Alg.Alias.Mac.DESISO9797ALG1WITHISO7816-4PADDING", "DESMAC64WITHISO7816-4PADDING");
4126+            // END android-removed
4127 
4128             provider.addAlgorithm("AlgorithmParameters.DES", PACKAGE + ".util.IvAlgorithmParameters");
4129             provider.addAlgorithm("Alg.Alias.AlgorithmParameters." + OIWObjectIdentifiers.desCBC, "DES");
4130 
4131-            provider.addAlgorithm("AlgorithmParameterGenerator.DES",  PREFIX + "$AlgParamGen");
4132-            provider.addAlgorithm("Alg.Alias.AlgorithmParameterGenerator." + OIWObjectIdentifiers.desCBC, "DES");
4133+            // BEGIN android-removed
4134+            // provider.addAlgorithm("AlgorithmParameterGenerator.DES",  PREFIX + "$AlgParamGen");
4135+            // provider.addAlgorithm("Alg.Alias.AlgorithmParameterGenerator." + OIWObjectIdentifiers.desCBC, "DES");
4136+            // END android-removed
4137         }
4138 
4139         private void addAlias(ConfigurableProvider provider, ASN1ObjectIdentifier oid, String name)
4140diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/symmetric/DESede.java bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/symmetric/DESede.java
4141--- bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/symmetric/DESede.java	2012-03-22 15:11:48.000000000 +0000
4142+++ bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/symmetric/DESede.java	2012-09-19 21:17:12.000000000 +0000
4143@@ -1,30 +1,42 @@
4144 package org.bouncycastle.jcajce.provider.symmetric;
4145 
4146-import java.security.AlgorithmParameters;
4147-import java.security.InvalidAlgorithmParameterException;
4148+// BEGIN android-removed
4149+// import java.security.AlgorithmParameters;
4150+// import java.security.InvalidAlgorithmParameterException;
4151+// END android-removed
4152 import java.security.SecureRandom;
4153-import java.security.spec.AlgorithmParameterSpec;
4154+// BEGIN android-removed
4155+// import java.security.spec.AlgorithmParameterSpec;
4156+// END android-removed
4157 import java.security.spec.InvalidKeySpecException;
4158 import java.security.spec.KeySpec;
4159 
4160 import javax.crypto.SecretKey;
4161 import javax.crypto.spec.DESedeKeySpec;
4162-import javax.crypto.spec.IvParameterSpec;
4163+// BEGIN android-removed
4164+// import javax.crypto.spec.IvParameterSpec;
4165+// END android-removed
4166 import javax.crypto.spec.SecretKeySpec;
4167 
4168 import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
4169 import org.bouncycastle.crypto.KeyGenerationParameters;
4170 import org.bouncycastle.crypto.engines.DESedeEngine;
4171 import org.bouncycastle.crypto.engines.DESedeWrapEngine;
4172-import org.bouncycastle.crypto.engines.RFC3211WrapEngine;
4173+// BEGIN android-removed
4174+// import org.bouncycastle.crypto.engines.RFC3211WrapEngine;
4175+// END android-removed
4176 import org.bouncycastle.crypto.generators.DESedeKeyGenerator;
4177 import org.bouncycastle.crypto.macs.CBCBlockCipherMac;
4178-import org.bouncycastle.crypto.macs.CFBBlockCipherMac;
4179-import org.bouncycastle.crypto.macs.CMac;
4180+// BEGIN android-removed
4181+// import org.bouncycastle.crypto.macs.CFBBlockCipherMac;
4182+// import org.bouncycastle.crypto.macs.CMac;
4183+// END android-removed
4184 import org.bouncycastle.crypto.modes.CBCBlockCipher;
4185 import org.bouncycastle.crypto.paddings.ISO7816d4Padding;
4186 import org.bouncycastle.jcajce.provider.config.ConfigurableProvider;
4187-import org.bouncycastle.jcajce.provider.symmetric.util.BaseAlgorithmParameterGenerator;
4188+// BEGIN android-removed
4189+// import org.bouncycastle.jcajce.provider.symmetric.util.BaseAlgorithmParameterGenerator;
4190+// END android-removed
4191 import org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher;
4192 import org.bouncycastle.jcajce.provider.symmetric.util.BaseKeyGenerator;
4193 import org.bouncycastle.jcajce.provider.symmetric.util.BaseMac;
4194@@ -57,17 +69,19 @@
4195         }
4196     }
4197 
4198-    /**
4199-     * DESede   CFB8
4200-     */
4201-    public static class DESedeCFB8
4202-        extends BaseMac
4203-    {
4204-        public DESedeCFB8()
4205-        {
4206-            super(new CFBBlockCipherMac(new DESedeEngine()));
4207-        }
4208-    }
4209+    // BEGIN android-removed
4210+    // /**
4211+    //  * DESede   CFB8
4212+    //  */
4213+    // public static class DESedeCFB8
4214+    //     extends BaseMac
4215+    // {
4216+    //     public DESedeCFB8()
4217+    //     {
4218+    //         super(new CFBBlockCipherMac(new DESedeEngine()));
4219+    //     }
4220+    // }
4221+    // END android-removed
4222 
4223     /**
4224      * DESede64
4225@@ -102,15 +116,17 @@
4226         }
4227     }
4228 
4229-    static public class CMAC
4230-        extends BaseMac
4231-    {
4232-        public CMAC()
4233-        {
4234-            super(new CMac(new DESedeEngine()));
4235-        }
4236-    }
4237-
4238+    // BEGIN android-removed
4239+    // static public class CMAC
4240+    //     extends BaseMac
4241+    // {
4242+    //     public CMAC()
4243+    //     {
4244+    //         super(new CMac(new DESedeEngine()));
4245+    //     }
4246+    // }
4247+    // END android-removed
4248+    
4249     public static class Wrap
4250         extends BaseWrapCipher
4251     {
4252@@ -119,15 +135,17 @@
4253             super(new DESedeWrapEngine());
4254         }
4255     }
4256-
4257-    public static class RFC3211
4258-        extends BaseWrapCipher
4259-    {
4260-        public RFC3211()
4261-        {
4262-            super(new RFC3211WrapEngine(new DESedeEngine()), 8);
4263-        }
4264-    }
4265+    
4266+    // BEGIN android-removed
4267+    // public static class RFC3211
4268+    //     extends BaseWrapCipher
4269+    // {
4270+    //     public RFC3211()
4271+    //     {
4272+    //         super(new RFC3211WrapEngine(new DESedeEngine()), 8);
4273+    //     }
4274+    // }
4275+    // END android-removed
4276 
4277   /**
4278      * DESede - the default for this is to generate a key in
4279@@ -217,43 +235,45 @@
4280         }
4281     }
4282 
4283-    public static class AlgParamGen
4284-        extends BaseAlgorithmParameterGenerator
4285-    {
4286-        protected void engineInit(
4287-            AlgorithmParameterSpec genParamSpec,
4288-            SecureRandom            random)
4289-            throws InvalidAlgorithmParameterException
4290-        {
4291-            throw new InvalidAlgorithmParameterException("No supported AlgorithmParameterSpec for DES parameter generation.");
4292-        }
4293-
4294-        protected AlgorithmParameters engineGenerateParameters()
4295-        {
4296-            byte[]  iv = new byte[8];
4297-
4298-            if (random == null)
4299-            {
4300-                random = new SecureRandom();
4301-            }
4302-
4303-            random.nextBytes(iv);
4304-
4305-            AlgorithmParameters params;
4306-
4307-            try
4308-            {
4309-                params = AlgorithmParameters.getInstance("DES", BouncyCastleProvider.PROVIDER_NAME);
4310-                params.init(new IvParameterSpec(iv));
4311-            }
4312-            catch (Exception e)
4313-            {
4314-                throw new RuntimeException(e.getMessage());
4315-            }
4316-
4317-            return params;
4318-        }
4319-    }
4320+    // BEGIN android-removed
4321+    // public static class AlgParamGen
4322+    //     extends BaseAlgorithmParameterGenerator
4323+    // {
4324+    //     protected void engineInit(
4325+    //         AlgorithmParameterSpec genParamSpec,
4326+    //         SecureRandom            random)
4327+    //         throws InvalidAlgorithmParameterException
4328+    //     {
4329+    //         throw new InvalidAlgorithmParameterException("No supported AlgorithmParameterSpec for DES parameter generation.");
4330+    //     }
4331+    //
4332+    //     protected AlgorithmParameters engineGenerateParameters()
4333+    //     {
4334+    //         byte[]  iv = new byte[8];
4335+    //
4336+    //         if (random == null)
4337+    //         {
4338+    //             random = new SecureRandom();
4339+    //         }
4340+    //
4341+    //         random.nextBytes(iv);
4342+    //
4343+    //         AlgorithmParameters params;
4344+    //
4345+    //         try
4346+    //         {
4347+    //             params = AlgorithmParameters.getInstance("DES", BouncyCastleProvider.PROVIDER_NAME);
4348+    //             params.init(new IvParameterSpec(iv));
4349+    //         }
4350+    //         catch (Exception e)
4351+    //         {
4352+    //             throw new RuntimeException(e.getMessage());
4353+    //         }
4354+    //
4355+    //         return params;
4356+    //     }
4357+    // }
4358+    // END android-removed
4359 
4360     static public class KeyFactory
4361         extends BaseSecretKeyFactory
4362@@ -337,18 +357,28 @@
4363         public void configure(ConfigurableProvider provider)
4364         {
4365             provider.addAlgorithm("Cipher.DESEDE", PREFIX + "$ECB");
4366-            provider.addAlgorithm("Cipher." + PKCSObjectIdentifiers.des_EDE3_CBC, PREFIX + "$CBC");
4367+            // BEGIN android-removed
4368+            // provider.addAlgorithm("Cipher." + PKCSObjectIdentifiers.des_EDE3_CBC, PREFIX + "$CBC");
4369+            // END android-removed
4370             provider.addAlgorithm("Cipher.DESEDEWRAP", PREFIX + "$Wrap");
4371-            provider.addAlgorithm("Cipher." + PKCSObjectIdentifiers.id_alg_CMS3DESwrap, PREFIX + "$Wrap");
4372-            provider.addAlgorithm("Cipher.DESEDERFC3211WRAP", PREFIX + "$RFC3211");
4373+            // BEGIN android-changed
4374+            provider.addAlgorithm("Alg.Alias.Cipher." + PKCSObjectIdentifiers.id_alg_CMS3DESwrap, "DESEDEWRAP");
4375+            // END android-changed
4376+            // BEGIN android-removed
4377+            // provider.addAlgorithm("Cipher.DESEDERFC3211WRAP", PREFIX + "$RFC3211");
4378+            // END android-removed
4379 
4380             if (provider.hasAlgorithm("MessageDigest", "SHA-1"))
4381             {
4382                 provider.addAlgorithm("Cipher.PBEWITHSHAAND3-KEYTRIPLEDES-CBC", PREFIX + "$PBEWithSHAAndDES3Key");
4383-                provider.addAlgorithm("Cipher.BROKENPBEWITHSHAAND3-KEYTRIPLEDES-CBC", PREFIX + "$BrokePBEWithSHAAndDES3Key");
4384-                provider.addAlgorithm("Cipher.OLDPBEWITHSHAAND3-KEYTRIPLEDES-CBC", PREFIX + "$OldPBEWithSHAAndDES3Key");
4385+                // BEGIN android-removed
4386+                // provider.addAlgorithm("Cipher.BROKENPBEWITHSHAAND3-KEYTRIPLEDES-CBC", PREFIX + "$BrokePBEWithSHAAndDES3Key");
4387+                // provider.addAlgorithm("Cipher.OLDPBEWITHSHAAND3-KEYTRIPLEDES-CBC", PREFIX + "$OldPBEWithSHAAndDES3Key");
4388+                // END android-removed
4389                 provider.addAlgorithm("Cipher.PBEWITHSHAAND2-KEYTRIPLEDES-CBC", PREFIX + "$PBEWithSHAAndDES2Key");
4390-                provider.addAlgorithm("Cipher.BROKENPBEWITHSHAAND2-KEYTRIPLEDES-CBC", PREFIX + "$BrokePBEWithSHAAndDES2Key");
4391+                // BEGIN android-removed
4392+                // provider.addAlgorithm("Cipher.BROKENPBEWITHSHAAND2-KEYTRIPLEDES-CBC", PREFIX + "$BrokePBEWithSHAAndDES2Key");
4393+                // END android-removed
4394                 provider.addAlgorithm("Alg.Alias.Cipher." + PKCSObjectIdentifiers.pbeWithSHAAnd3_KeyTripleDES_CBC, "PBEWITHSHAAND3-KEYTRIPLEDES-CBC");
4395                 provider.addAlgorithm("Alg.Alias.Cipher." + PKCSObjectIdentifiers.pbeWithSHAAnd2_KeyTripleDES_CBC, "PBEWITHSHAAND2-KEYTRIPLEDES-CBC");
4396                 provider.addAlgorithm("Alg.Alias.Cipher.PBEWITHSHA1ANDDESEDE", "PBEWITHSHAAND3-KEYTRIPLEDES-CBC");
4397@@ -357,31 +387,37 @@
4398             }
4399 
4400             provider.addAlgorithm("KeyGenerator.DESEDE", PREFIX + "$KeyGenerator");
4401-            provider.addAlgorithm("KeyGenerator." + PKCSObjectIdentifiers.des_EDE3_CBC, PREFIX + "$KeyGenerator3");
4402-            provider.addAlgorithm("KeyGenerator.DESEDEWRAP", PREFIX + "$KeyGenerator");
4403+            // BEGIN android-removed
4404+            // provider.addAlgorithm("KeyGenerator." + PKCSObjectIdentifiers.des_EDE3_CBC, PREFIX + "$KeyGenerator3");
4405+            // provider.addAlgorithm("KeyGenerator.DESEDEWRAP", PREFIX + "$KeyGenerator");
4406+            // END android-removed
4407 
4408             provider.addAlgorithm("SecretKeyFactory.DESEDE", PREFIX + "$KeyFactory");
4409 
4410-            provider.addAlgorithm("Mac.DESEDECMAC", PREFIX + "$CMAC");
4411-            provider.addAlgorithm("Mac.DESEDEMAC", PREFIX + "$CBCMAC");
4412-            provider.addAlgorithm("Alg.Alias.Mac.DESEDE", "DESEDEMAC");
4413-
4414-            provider.addAlgorithm("Mac.DESEDEMAC/CFB8", PREFIX + "$DESedeCFB8");
4415-            provider.addAlgorithm("Alg.Alias.Mac.DESEDE/CFB8", "DESEDEMAC/CFB8");
4416-
4417-            provider.addAlgorithm("Mac.DESEDEMAC64", PREFIX + "$DESede64");
4418-            provider.addAlgorithm("Alg.Alias.Mac.DESEDE64", "DESEDEMAC64");
4419-
4420-            provider.addAlgorithm("Mac.DESEDEMAC64WITHISO7816-4PADDING", PREFIX + "$DESede64with7816d4");
4421-            provider.addAlgorithm("Alg.Alias.Mac.DESEDE64WITHISO7816-4PADDING", "DESEDEMAC64WITHISO7816-4PADDING");
4422-            provider.addAlgorithm("Alg.Alias.Mac.DESEDEISO9797ALG1MACWITHISO7816-4PADDING", "DESEDEMAC64WITHISO7816-4PADDING");
4423-            provider.addAlgorithm("Alg.Alias.Mac.DESEDEISO9797ALG1WITHISO7816-4PADDING", "DESEDEMAC64WITHISO7816-4PADDING");
4424+            // BEGIN android-removed
4425+            // provider.addAlgorithm("Mac.DESEDECMAC", PREFIX + "$CMAC");
4426+            // provider.addAlgorithm("Mac.DESEDEMAC", PREFIX + "$CBCMAC");
4427+            // provider.addAlgorithm("Alg.Alias.Mac.DESEDE", "DESEDEMAC");
4428+            //
4429+            // provider.addAlgorithm("Mac.DESEDEMAC/CFB8", PREFIX + "$DESedeCFB8");
4430+            // provider.addAlgorithm("Alg.Alias.Mac.DESEDE/CFB8", "DESEDEMAC/CFB8");
4431+            //
4432+            // provider.addAlgorithm("Mac.DESEDEMAC64", PREFIX + "$DESede64");
4433+            // provider.addAlgorithm("Alg.Alias.Mac.DESEDE64", "DESEDEMAC64");
4434+            //
4435+            // provider.addAlgorithm("Mac.DESEDEMAC64WITHISO7816-4PADDING", PREFIX + "$DESede64with7816d4");
4436+            // provider.addAlgorithm("Alg.Alias.Mac.DESEDE64WITHISO7816-4PADDING", "DESEDEMAC64WITHISO7816-4PADDING");
4437+            // provider.addAlgorithm("Alg.Alias.Mac.DESEDEISO9797ALG1MACWITHISO7816-4PADDING", "DESEDEMAC64WITHISO7816-4PADDING");
4438+            // provider.addAlgorithm("Alg.Alias.Mac.DESEDEISO9797ALG1WITHISO7816-4PADDING", "DESEDEMAC64WITHISO7816-4PADDING");
4439+            // END android-removed
4440 
4441             provider.addAlgorithm("AlgorithmParameters.DESEDE", PACKAGE + ".util.IvAlgorithmParameters");
4442             provider.addAlgorithm("Alg.Alias.AlgorithmParameters." + PKCSObjectIdentifiers.des_EDE3_CBC, "DESEDE");
4443 
4444-            provider.addAlgorithm("AlgorithmParameterGenerator.DESEDE",  PREFIX + "$AlgParamGen");
4445-            provider.addAlgorithm("Alg.Alias.AlgorithmParameterGenerator." + PKCSObjectIdentifiers.des_EDE3_CBC, "DESEDE");
4446+            // BEGIN android-removed
4447+            // provider.addAlgorithm("AlgorithmParameterGenerator.DESEDE",  PREFIX + "$AlgParamGen");
4448+            // provider.addAlgorithm("Alg.Alias.AlgorithmParameterGenerator." + PKCSObjectIdentifiers.des_EDE3_CBC, "DESEDE");
4449+            // END android-removed
4450         }
4451     }
4452 }
4453diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/symmetric/util/BaseAlgorithmParameters.java bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/symmetric/util/BaseAlgorithmParameters.java
4454--- bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/symmetric/util/BaseAlgorithmParameters.java	2012-03-22 15:11:48.000000000 +0000
4455+++ bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/symmetric/util/BaseAlgorithmParameters.java	2012-09-19 21:17:12.000000000 +0000
4456@@ -7,13 +7,17 @@
4457 
4458 import javax.crypto.spec.IvParameterSpec;
4459 import javax.crypto.spec.PBEParameterSpec;
4460-import javax.crypto.spec.RC2ParameterSpec;
4461+// BEGIN android-removed
4462+// import javax.crypto.spec.RC2ParameterSpec;
4463+// END android-removed
4464 
4465 import org.bouncycastle.asn1.ASN1Encoding;
4466 import org.bouncycastle.asn1.ASN1Primitive;
4467 import org.bouncycastle.asn1.pkcs.PBKDF2Params;
4468 import org.bouncycastle.asn1.pkcs.PKCS12PBEParams;
4469-import org.bouncycastle.asn1.pkcs.RC2CBCParameter;
4470+// BEGIN android-removed
4471+// import org.bouncycastle.asn1.pkcs.RC2CBCParameter;
4472+// END android-removed
4473 import org.bouncycastle.util.Arrays;
4474 
4475 public abstract class BaseAlgorithmParameters
4476@@ -39,177 +43,179 @@
4477     protected abstract AlgorithmParameterSpec localEngineGetParameterSpec(Class paramSpec)
4478         throws InvalidParameterSpecException;
4479 
4480-    public static class RC2AlgorithmParameters
4481-        extends BaseAlgorithmParameters
4482-    {
4483-        private static final short[] table = {
4484-           0xbd, 0x56, 0xea, 0xf2, 0xa2, 0xf1, 0xac, 0x2a, 0xb0, 0x93, 0xd1, 0x9c, 0x1b, 0x33, 0xfd, 0xd0,
4485-           0x30, 0x04, 0xb6, 0xdc, 0x7d, 0xdf, 0x32, 0x4b, 0xf7, 0xcb, 0x45, 0x9b, 0x31, 0xbb, 0x21, 0x5a,
4486-           0x41, 0x9f, 0xe1, 0xd9, 0x4a, 0x4d, 0x9e, 0xda, 0xa0, 0x68, 0x2c, 0xc3, 0x27, 0x5f, 0x80, 0x36,
4487-           0x3e, 0xee, 0xfb, 0x95, 0x1a, 0xfe, 0xce, 0xa8, 0x34, 0xa9, 0x13, 0xf0, 0xa6, 0x3f, 0xd8, 0x0c,
4488-           0x78, 0x24, 0xaf, 0x23, 0x52, 0xc1, 0x67, 0x17, 0xf5, 0x66, 0x90, 0xe7, 0xe8, 0x07, 0xb8, 0x60,
4489-           0x48, 0xe6, 0x1e, 0x53, 0xf3, 0x92, 0xa4, 0x72, 0x8c, 0x08, 0x15, 0x6e, 0x86, 0x00, 0x84, 0xfa,
4490-           0xf4, 0x7f, 0x8a, 0x42, 0x19, 0xf6, 0xdb, 0xcd, 0x14, 0x8d, 0x50, 0x12, 0xba, 0x3c, 0x06, 0x4e,
4491-           0xec, 0xb3, 0x35, 0x11, 0xa1, 0x88, 0x8e, 0x2b, 0x94, 0x99, 0xb7, 0x71, 0x74, 0xd3, 0xe4, 0xbf,
4492-           0x3a, 0xde, 0x96, 0x0e, 0xbc, 0x0a, 0xed, 0x77, 0xfc, 0x37, 0x6b, 0x03, 0x79, 0x89, 0x62, 0xc6,
4493-           0xd7, 0xc0, 0xd2, 0x7c, 0x6a, 0x8b, 0x22, 0xa3, 0x5b, 0x05, 0x5d, 0x02, 0x75, 0xd5, 0x61, 0xe3,
4494-           0x18, 0x8f, 0x55, 0x51, 0xad, 0x1f, 0x0b, 0x5e, 0x85, 0xe5, 0xc2, 0x57, 0x63, 0xca, 0x3d, 0x6c,
4495-           0xb4, 0xc5, 0xcc, 0x70, 0xb2, 0x91, 0x59, 0x0d, 0x47, 0x20, 0xc8, 0x4f, 0x58, 0xe0, 0x01, 0xe2,
4496-           0x16, 0x38, 0xc4, 0x6f, 0x3b, 0x0f, 0x65, 0x46, 0xbe, 0x7e, 0x2d, 0x7b, 0x82, 0xf9, 0x40, 0xb5,
4497-           0x1d, 0x73, 0xf8, 0xeb, 0x26, 0xc7, 0x87, 0x97, 0x25, 0x54, 0xb1, 0x28, 0xaa, 0x98, 0x9d, 0xa5,
4498-           0x64, 0x6d, 0x7a, 0xd4, 0x10, 0x81, 0x44, 0xef, 0x49, 0xd6, 0xae, 0x2e, 0xdd, 0x76, 0x5c, 0x2f,
4499-           0xa7, 0x1c, 0xc9, 0x09, 0x69, 0x9a, 0x83, 0xcf, 0x29, 0x39, 0xb9, 0xe9, 0x4c, 0xff, 0x43, 0xab
4500-        };
4501-
4502-        private static final short[] ekb = {
4503-           0x5d, 0xbe, 0x9b, 0x8b, 0x11, 0x99, 0x6e, 0x4d, 0x59, 0xf3, 0x85, 0xa6, 0x3f, 0xb7, 0x83, 0xc5,
4504-           0xe4, 0x73, 0x6b, 0x3a, 0x68, 0x5a, 0xc0, 0x47, 0xa0, 0x64, 0x34, 0x0c, 0xf1, 0xd0, 0x52, 0xa5,
4505-           0xb9, 0x1e, 0x96, 0x43, 0x41, 0xd8, 0xd4, 0x2c, 0xdb, 0xf8, 0x07, 0x77, 0x2a, 0xca, 0xeb, 0xef,
4506-           0x10, 0x1c, 0x16, 0x0d, 0x38, 0x72, 0x2f, 0x89, 0xc1, 0xf9, 0x80, 0xc4, 0x6d, 0xae, 0x30, 0x3d,
4507-           0xce, 0x20, 0x63, 0xfe, 0xe6, 0x1a, 0xc7, 0xb8, 0x50, 0xe8, 0x24, 0x17, 0xfc, 0x25, 0x6f, 0xbb,
4508-           0x6a, 0xa3, 0x44, 0x53, 0xd9, 0xa2, 0x01, 0xab, 0xbc, 0xb6, 0x1f, 0x98, 0xee, 0x9a, 0xa7, 0x2d,
4509-           0x4f, 0x9e, 0x8e, 0xac, 0xe0, 0xc6, 0x49, 0x46, 0x29, 0xf4, 0x94, 0x8a, 0xaf, 0xe1, 0x5b, 0xc3,
4510-           0xb3, 0x7b, 0x57, 0xd1, 0x7c, 0x9c, 0xed, 0x87, 0x40, 0x8c, 0xe2, 0xcb, 0x93, 0x14, 0xc9, 0x61,
4511-           0x2e, 0xe5, 0xcc, 0xf6, 0x5e, 0xa8, 0x5c, 0xd6, 0x75, 0x8d, 0x62, 0x95, 0x58, 0x69, 0x76, 0xa1,
4512-           0x4a, 0xb5, 0x55, 0x09, 0x78, 0x33, 0x82, 0xd7, 0xdd, 0x79, 0xf5, 0x1b, 0x0b, 0xde, 0x26, 0x21,
4513-           0x28, 0x74, 0x04, 0x97, 0x56, 0xdf, 0x3c, 0xf0, 0x37, 0x39, 0xdc, 0xff, 0x06, 0xa4, 0xea, 0x42,
4514-           0x08, 0xda, 0xb4, 0x71, 0xb0, 0xcf, 0x12, 0x7a, 0x4e, 0xfa, 0x6c, 0x1d, 0x84, 0x00, 0xc8, 0x7f,
4515-           0x91, 0x45, 0xaa, 0x2b, 0xc2, 0xb1, 0x8f, 0xd5, 0xba, 0xf2, 0xad, 0x19, 0xb2, 0x67, 0x36, 0xf7,
4516-           0x0f, 0x0a, 0x92, 0x7d, 0xe3, 0x9d, 0xe9, 0x90, 0x3e, 0x23, 0x27, 0x66, 0x13, 0xec, 0x81, 0x15,
4517-           0xbd, 0x22, 0xbf, 0x9f, 0x7e, 0xa9, 0x51, 0x4b, 0x4c, 0xfb, 0x02, 0xd3, 0x70, 0x86, 0x31, 0xe7,
4518-           0x3b, 0x05, 0x03, 0x54, 0x60, 0x48, 0x65, 0x18, 0xd2, 0xcd, 0x5f, 0x32, 0x88, 0x0e, 0x35, 0xfd
4519-        };
4520-
4521-        private byte[]  iv;
4522-        private int     parameterVersion = 58;
4523-
4524-        protected byte[] engineGetEncoded() 
4525-        {
4526-            return Arrays.clone(iv);
4527-        }
4528-
4529-        protected byte[] engineGetEncoded(
4530-            String format) 
4531-            throws IOException
4532-        {
4533-            if (this.isASN1FormatString(format))
4534-            {
4535-                if (parameterVersion == -1)
4536-                {
4537-                    return new RC2CBCParameter(engineGetEncoded()).getEncoded();
4538-                }
4539-                else
4540-                {
4541-                    return new RC2CBCParameter(parameterVersion, engineGetEncoded()).getEncoded();
4542-                }
4543-            }
4544-
4545-            if (format.equals("RAW"))
4546-            {
4547-                return engineGetEncoded();
4548-            }
4549-
4550-            return null;
4551-        }
4552-
4553-        protected AlgorithmParameterSpec localEngineGetParameterSpec(
4554-            Class paramSpec) 
4555-            throws InvalidParameterSpecException
4556-        {
4557-            if (paramSpec == RC2ParameterSpec.class)
4558-            {
4559-                if (parameterVersion != -1)
4560-                {
4561-                    if (parameterVersion < 256)
4562-                    {
4563-                        return new RC2ParameterSpec(ekb[parameterVersion], iv);
4564-                    }
4565-                    else
4566-                    {
4567-                        return new RC2ParameterSpec(parameterVersion, iv);
4568-                    }
4569-                }
4570-            }
4571-
4572-            if (paramSpec == IvParameterSpec.class)
4573-            {
4574-                return new IvParameterSpec(iv);
4575-            }
4576-
4577-            throw new InvalidParameterSpecException("unknown parameter spec passed to RC2 parameters object.");
4578-        }
4579-
4580-        protected void engineInit(
4581-            AlgorithmParameterSpec paramSpec) 
4582-            throws InvalidParameterSpecException
4583-        {
4584-            if (paramSpec instanceof IvParameterSpec)
4585-            {
4586-                this.iv = ((IvParameterSpec)paramSpec).getIV();
4587-            }
4588-            else if (paramSpec instanceof RC2ParameterSpec)
4589-            {
4590-                int effKeyBits = ((RC2ParameterSpec)paramSpec).getEffectiveKeyBits();
4591-                if (effKeyBits != -1)
4592-                {
4593-                    if (effKeyBits < 256)
4594-                    {
4595-                        parameterVersion = table[effKeyBits];
4596-                    }
4597-                    else
4598-                    {
4599-                        parameterVersion = effKeyBits;
4600-                    }
4601-                }
4602-
4603-                this.iv = ((RC2ParameterSpec)paramSpec).getIV();
4604-            }
4605-            else
4606-            {
4607-                throw new InvalidParameterSpecException("IvParameterSpec or RC2ParameterSpec required to initialise a RC2 parameters algorithm parameters object");
4608-            }
4609-        }
4610-
4611-        protected void engineInit(
4612-            byte[] params) 
4613-            throws IOException
4614-        {
4615-            this.iv = Arrays.clone(params);
4616-        }
4617-
4618-        protected void engineInit(
4619-            byte[] params,
4620-            String format) 
4621-            throws IOException
4622-        {
4623-            if (this.isASN1FormatString(format))
4624-            {
4625-                RC2CBCParameter p = RC2CBCParameter.getInstance(ASN1Primitive.fromByteArray(params));
4626-
4627-                if (p.getRC2ParameterVersion() != null)
4628-                {
4629-                    parameterVersion = p.getRC2ParameterVersion().intValue();
4630-                }
4631-
4632-                iv = p.getIV();
4633-
4634-                return;
4635-            }
4636-
4637-            if (format.equals("RAW"))
4638-            {
4639-                engineInit(params);
4640-                return;
4641-            }
4642-
4643-            throw new IOException("Unknown parameters format in IV parameters object");
4644-        }
4645-
4646-        protected String engineToString() 
4647-        {
4648-            return "RC2 Parameters";
4649-        }
4650-    }
4651+    // BEGIN android-removed
4652+    // public static class RC2AlgorithmParameters
4653+    //     extends BaseAlgorithmParameters
4654+    // {
4655+    //     private static final short[] table = {
4656+    //        0xbd, 0x56, 0xea, 0xf2, 0xa2, 0xf1, 0xac, 0x2a, 0xb0, 0x93, 0xd1, 0x9c, 0x1b, 0x33, 0xfd, 0xd0,
4657+    //        0x30, 0x04, 0xb6, 0xdc, 0x7d, 0xdf, 0x32, 0x4b, 0xf7, 0xcb, 0x45, 0x9b, 0x31, 0xbb, 0x21, 0x5a,
4658+    //        0x41, 0x9f, 0xe1, 0xd9, 0x4a, 0x4d, 0x9e, 0xda, 0xa0, 0x68, 0x2c, 0xc3, 0x27, 0x5f, 0x80, 0x36,
4659+    //        0x3e, 0xee, 0xfb, 0x95, 0x1a, 0xfe, 0xce, 0xa8, 0x34, 0xa9, 0x13, 0xf0, 0xa6, 0x3f, 0xd8, 0x0c,
4660+    //        0x78, 0x24, 0xaf, 0x23, 0x52, 0xc1, 0x67, 0x17, 0xf5, 0x66, 0x90, 0xe7, 0xe8, 0x07, 0xb8, 0x60,
4661+    //        0x48, 0xe6, 0x1e, 0x53, 0xf3, 0x92, 0xa4, 0x72, 0x8c, 0x08, 0x15, 0x6e, 0x86, 0x00, 0x84, 0xfa,
4662+    //        0xf4, 0x7f, 0x8a, 0x42, 0x19, 0xf6, 0xdb, 0xcd, 0x14, 0x8d, 0x50, 0x12, 0xba, 0x3c, 0x06, 0x4e,
4663+    //        0xec, 0xb3, 0x35, 0x11, 0xa1, 0x88, 0x8e, 0x2b, 0x94, 0x99, 0xb7, 0x71, 0x74, 0xd3, 0xe4, 0xbf,
4664+    //        0x3a, 0xde, 0x96, 0x0e, 0xbc, 0x0a, 0xed, 0x77, 0xfc, 0x37, 0x6b, 0x03, 0x79, 0x89, 0x62, 0xc6,
4665+    //        0xd7, 0xc0, 0xd2, 0x7c, 0x6a, 0x8b, 0x22, 0xa3, 0x5b, 0x05, 0x5d, 0x02, 0x75, 0xd5, 0x61, 0xe3,
4666+    //        0x18, 0x8f, 0x55, 0x51, 0xad, 0x1f, 0x0b, 0x5e, 0x85, 0xe5, 0xc2, 0x57, 0x63, 0xca, 0x3d, 0x6c,
4667+    //        0xb4, 0xc5, 0xcc, 0x70, 0xb2, 0x91, 0x59, 0x0d, 0x47, 0x20, 0xc8, 0x4f, 0x58, 0xe0, 0x01, 0xe2,
4668+    //        0x16, 0x38, 0xc4, 0x6f, 0x3b, 0x0f, 0x65, 0x46, 0xbe, 0x7e, 0x2d, 0x7b, 0x82, 0xf9, 0x40, 0xb5,
4669+    //        0x1d, 0x73, 0xf8, 0xeb, 0x26, 0xc7, 0x87, 0x97, 0x25, 0x54, 0xb1, 0x28, 0xaa, 0x98, 0x9d, 0xa5,
4670+    //        0x64, 0x6d, 0x7a, 0xd4, 0x10, 0x81, 0x44, 0xef, 0x49, 0xd6, 0xae, 0x2e, 0xdd, 0x76, 0x5c, 0x2f,
4671+    //        0xa7, 0x1c, 0xc9, 0x09, 0x69, 0x9a, 0x83, 0xcf, 0x29, 0x39, 0xb9, 0xe9, 0x4c, 0xff, 0x43, 0xab
4672+    //     };
4673+    //
4674+    //     private static final short[] ekb = {
4675+    //        0x5d, 0xbe, 0x9b, 0x8b, 0x11, 0x99, 0x6e, 0x4d, 0x59, 0xf3, 0x85, 0xa6, 0x3f, 0xb7, 0x83, 0xc5,
4676+    //        0xe4, 0x73, 0x6b, 0x3a, 0x68, 0x5a, 0xc0, 0x47, 0xa0, 0x64, 0x34, 0x0c, 0xf1, 0xd0, 0x52, 0xa5,
4677+    //        0xb9, 0x1e, 0x96, 0x43, 0x41, 0xd8, 0xd4, 0x2c, 0xdb, 0xf8, 0x07, 0x77, 0x2a, 0xca, 0xeb, 0xef,
4678+    //        0x10, 0x1c, 0x16, 0x0d, 0x38, 0x72, 0x2f, 0x89, 0xc1, 0xf9, 0x80, 0xc4, 0x6d, 0xae, 0x30, 0x3d,
4679+    //        0xce, 0x20, 0x63, 0xfe, 0xe6, 0x1a, 0xc7, 0xb8, 0x50, 0xe8, 0x24, 0x17, 0xfc, 0x25, 0x6f, 0xbb,
4680+    //        0x6a, 0xa3, 0x44, 0x53, 0xd9, 0xa2, 0x01, 0xab, 0xbc, 0xb6, 0x1f, 0x98, 0xee, 0x9a, 0xa7, 0x2d,
4681+    //        0x4f, 0x9e, 0x8e, 0xac, 0xe0, 0xc6, 0x49, 0x46, 0x29, 0xf4, 0x94, 0x8a, 0xaf, 0xe1, 0x5b, 0xc3,
4682+    //        0xb3, 0x7b, 0x57, 0xd1, 0x7c, 0x9c, 0xed, 0x87, 0x40, 0x8c, 0xe2, 0xcb, 0x93, 0x14, 0xc9, 0x61,
4683+    //        0x2e, 0xe5, 0xcc, 0xf6, 0x5e, 0xa8, 0x5c, 0xd6, 0x75, 0x8d, 0x62, 0x95, 0x58, 0x69, 0x76, 0xa1,
4684+    //        0x4a, 0xb5, 0x55, 0x09, 0x78, 0x33, 0x82, 0xd7, 0xdd, 0x79, 0xf5, 0x1b, 0x0b, 0xde, 0x26, 0x21,
4685+    //        0x28, 0x74, 0x04, 0x97, 0x56, 0xdf, 0x3c, 0xf0, 0x37, 0x39, 0xdc, 0xff, 0x06, 0xa4, 0xea, 0x42,
4686+    //        0x08, 0xda, 0xb4, 0x71, 0xb0, 0xcf, 0x12, 0x7a, 0x4e, 0xfa, 0x6c, 0x1d, 0x84, 0x00, 0xc8, 0x7f,
4687+    //        0x91, 0x45, 0xaa, 0x2b, 0xc2, 0xb1, 0x8f, 0xd5, 0xba, 0xf2, 0xad, 0x19, 0xb2, 0x67, 0x36, 0xf7,
4688+    //        0x0f, 0x0a, 0x92, 0x7d, 0xe3, 0x9d, 0xe9, 0x90, 0x3e, 0x23, 0x27, 0x66, 0x13, 0xec, 0x81, 0x15,
4689+    //        0xbd, 0x22, 0xbf, 0x9f, 0x7e, 0xa9, 0x51, 0x4b, 0x4c, 0xfb, 0x02, 0xd3, 0x70, 0x86, 0x31, 0xe7,
4690+    //        0x3b, 0x05, 0x03, 0x54, 0x60, 0x48, 0x65, 0x18, 0xd2, 0xcd, 0x5f, 0x32, 0x88, 0x0e, 0x35, 0xfd
4691+    //     };
4692+    //
4693+    //     private byte[]  iv;
4694+    //     private int     parameterVersion = 58;
4695+    //
4696+    //     protected byte[] engineGetEncoded() 
4697+    //     {
4698+    //         return Arrays.clone(iv);
4699+    //     }
4700+    //
4701+    //     protected byte[] engineGetEncoded(
4702+    //         String format) 
4703+    //         throws IOException
4704+    //     {
4705+    //         if (this.isASN1FormatString(format))
4706+    //         {
4707+    //             if (parameterVersion == -1)
4708+    //             {
4709+    //                 return new RC2CBCParameter(engineGetEncoded()).getEncoded();
4710+    //             }
4711+    //             else
4712+    //             {
4713+    //                 return new RC2CBCParameter(parameterVersion, engineGetEncoded()).getEncoded();
4714+    //             }
4715+    //         }
4716+    //
4717+    //         if (format.equals("RAW"))
4718+    //         {
4719+    //             return engineGetEncoded();
4720+    //         }
4721+    //
4722+    //         return null;
4723+    //     }
4724+    //
4725+    //     protected AlgorithmParameterSpec localEngineGetParameterSpec(
4726+    //         Class paramSpec) 
4727+    //         throws InvalidParameterSpecException
4728+    //     {
4729+    //         if (paramSpec == RC2ParameterSpec.class)
4730+    //         {
4731+    //             if (parameterVersion != -1)
4732+    //             {
4733+    //                 if (parameterVersion < 256)
4734+    //                 {
4735+    //                     return new RC2ParameterSpec(ekb[parameterVersion], iv);
4736+    //                 }
4737+    //                 else
4738+    //                 {
4739+    //                     return new RC2ParameterSpec(parameterVersion, iv);
4740+    //                 }
4741+    //             }
4742+    //         }
4743+    //
4744+    //         if (paramSpec == IvParameterSpec.class)
4745+    //         {
4746+    //             return new IvParameterSpec(iv);
4747+    //         }
4748+    //
4749+    //         throw new InvalidParameterSpecException("unknown parameter spec passed to RC2 parameters object.");
4750+    //     }
4751+    //
4752+    //     protected void engineInit(
4753+    //         AlgorithmParameterSpec paramSpec) 
4754+    //         throws InvalidParameterSpecException
4755+    //     {
4756+    //         if (paramSpec instanceof IvParameterSpec)
4757+    //         {
4758+    //             this.iv = ((IvParameterSpec)paramSpec).getIV();
4759+    //         }
4760+    //         else if (paramSpec instanceof RC2ParameterSpec)
4761+    //         {
4762+    //             int effKeyBits = ((RC2ParameterSpec)paramSpec).getEffectiveKeyBits();
4763+    //             if (effKeyBits != -1)
4764+    //             {
4765+    //                 if (effKeyBits < 256)
4766+    //                 {
4767+    //                     parameterVersion = table[effKeyBits];
4768+    //                 }
4769+    //                 else
4770+    //                 {
4771+    //                     parameterVersion = effKeyBits;
4772+    //                 }
4773+    //             }
4774+    //
4775+    //             this.iv = ((RC2ParameterSpec)paramSpec).getIV();
4776+    //         }
4777+    //         else
4778+    //         {
4779+    //             throw new InvalidParameterSpecException("IvParameterSpec or RC2ParameterSpec required to initialise a RC2 parameters algorithm parameters object");
4780+    //         }
4781+    //     }
4782+    //
4783+    //     protected void engineInit(
4784+    //         byte[] params) 
4785+    //         throws IOException
4786+    //     {
4787+    //         this.iv = Arrays.clone(params);
4788+    //     }
4789+    //
4790+    //     protected void engineInit(
4791+    //         byte[] params,
4792+    //         String format) 
4793+    //         throws IOException
4794+    //     {
4795+    //         if (this.isASN1FormatString(format))
4796+    //         {
4797+    //             RC2CBCParameter p = RC2CBCParameter.getInstance(ASN1Primitive.fromByteArray(params));
4798+    //
4799+    //             if (p.getRC2ParameterVersion() != null)
4800+    //             {
4801+    //                 parameterVersion = p.getRC2ParameterVersion().intValue();
4802+    //             }
4803+    //
4804+    //             iv = p.getIV();
4805+    //
4806+    //             return;
4807+    //         }
4808+    //
4809+    //         if (format.equals("RAW"))
4810+    //         {
4811+    //             engineInit(params);
4812+    //             return;
4813+    //         }
4814+    //
4815+    //         throw new IOException("Unknown parameters format in IV parameters object");
4816+    //     }
4817+    //
4818+    //     protected String engineToString() 
4819+    //     {
4820+    //         return "RC2 Parameters";
4821+    //     }
4822+    // }
4823+    // END android-removed
4824 
4825     public static class PBKDF2
4826         extends BaseAlgorithmParameters
4827diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/symmetric/util/BaseBlockCipher.java bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/symmetric/util/BaseBlockCipher.java
4828--- bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/symmetric/util/BaseBlockCipher.java	2012-03-22 15:11:48.000000000 +0000
4829+++ bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/symmetric/util/BaseBlockCipher.java	2012-09-19 21:17:12.000000000 +0000
4830@@ -17,8 +17,10 @@
4831 import javax.crypto.ShortBufferException;
4832 import javax.crypto.spec.IvParameterSpec;
4833 import javax.crypto.spec.PBEParameterSpec;
4834-import javax.crypto.spec.RC2ParameterSpec;
4835-import javax.crypto.spec.RC5ParameterSpec;
4836+// BEGIN android-removed
4837+// import javax.crypto.spec.RC2ParameterSpec;
4838+// import javax.crypto.spec.RC5ParameterSpec;
4839+// END android-removed
4840 
4841 import org.bouncycastle.crypto.BufferedBlockCipher;
4842 import org.bouncycastle.crypto.CipherParameters;
4843@@ -29,12 +31,18 @@
4844 import org.bouncycastle.crypto.modes.CCMBlockCipher;
4845 import org.bouncycastle.crypto.modes.CFBBlockCipher;
4846 import org.bouncycastle.crypto.modes.CTSBlockCipher;
4847-import org.bouncycastle.crypto.modes.EAXBlockCipher;
4848+// BEGIN android-removed
4849+// import org.bouncycastle.crypto.modes.EAXBlockCipher;
4850+// END android-removed
4851 import org.bouncycastle.crypto.modes.GCMBlockCipher;
4852-import org.bouncycastle.crypto.modes.GOFBBlockCipher;
4853+// BEGIN android-removed
4854+// import org.bouncycastle.crypto.modes.GOFBBlockCipher;
4855+// END android-removed
4856 import org.bouncycastle.crypto.modes.OFBBlockCipher;
4857-import org.bouncycastle.crypto.modes.OpenPGPCFBBlockCipher;
4858-import org.bouncycastle.crypto.modes.PGPCFBBlockCipher;
4859+// BEGIN android-removed
4860+// import org.bouncycastle.crypto.modes.OpenPGPCFBBlockCipher;
4861+// import org.bouncycastle.crypto.modes.PGPCFBBlockCipher;
4862+// END android-removed
4863 import org.bouncycastle.crypto.modes.SICBlockCipher;
4864 import org.bouncycastle.crypto.paddings.BlockCipherPadding;
4865 import org.bouncycastle.crypto.paddings.ISO10126d2Padding;
4866@@ -46,11 +54,17 @@
4867 import org.bouncycastle.crypto.params.KeyParameter;
4868 import org.bouncycastle.crypto.params.ParametersWithIV;
4869 import org.bouncycastle.crypto.params.ParametersWithRandom;
4870-import org.bouncycastle.crypto.params.ParametersWithSBox;
4871+// BEGIN android-removed
4872+// import org.bouncycastle.crypto.params.ParametersWithSBox;
4873+// END android-removed
4874 import org.bouncycastle.crypto.params.RC2Parameters;
4875-import org.bouncycastle.crypto.params.RC5Parameters;
4876+// BEGIN android-removed
4877+// import org.bouncycastle.crypto.params.RC5Parameters;
4878+// END android-removed
4879 import org.bouncycastle.jce.provider.BouncyCastleProvider;
4880-import org.bouncycastle.jce.spec.GOST28147ParameterSpec;
4881+// BEGIN android-removed
4882+// import org.bouncycastle.jce.spec.GOST28147ParameterSpec;
4883+// END android-removed
4884 import org.bouncycastle.jce.spec.RepeatedSecretKeySpec;
4885 import org.bouncycastle.util.Strings;
4886 
4887@@ -63,11 +77,15 @@
4888     //
4889     private Class[]                 availableSpecs =
4890                                     {
4891-                                        RC2ParameterSpec.class,
4892-                                        RC5ParameterSpec.class,
4893+                                        // BEGIN android-removed
4894+                                        // RC2ParameterSpec.class,
4895+                                        // RC5ParameterSpec.class,
4896+                                        // END android-removed
4897                                         IvParameterSpec.class,
4898                                         PBEParameterSpec.class,
4899-                                        GOST28147ParameterSpec.class
4900+                                        // BEGIN android-removed
4901+                                        // GOST28147ParameterSpec.class
4902+                                        // END android-removed
4903                                     };
4904 
4905     private org.bouncycastle.crypto.BlockCipher baseEngine;
4906@@ -222,20 +240,22 @@
4907                         new CFBBlockCipher(baseEngine, 8 * baseEngine.getBlockSize()));
4908             }
4909         }
4910-        else if (modeName.startsWith("PGP"))
4911-        {
4912-            boolean inlineIV = modeName.equalsIgnoreCase("PGPCFBwithIV");
4913-
4914-            ivLength = baseEngine.getBlockSize();
4915-            cipher = new BufferedGenericBlockCipher(
4916-                new PGPCFBBlockCipher(baseEngine, inlineIV));
4917-        }
4918-        else if (modeName.equalsIgnoreCase("OpenPGPCFB"))
4919-        {
4920-            ivLength = 0;
4921-            cipher = new BufferedGenericBlockCipher(
4922-                new OpenPGPCFBBlockCipher(baseEngine));
4923-        }
4924+        // BEGIN android-removed
4925+        // else if (modeName.startsWith("PGP"))
4926+        // {
4927+        //     boolean inlineIV = modeName.equalsIgnoreCase("PGPCFBwithIV");
4928+
4929+        //     ivLength = baseEngine.getBlockSize();
4930+        //     cipher = new BufferedGenericBlockCipher(
4931+        //         new PGPCFBBlockCipher(baseEngine, inlineIV));
4932+        // }
4933+        // else if (modeName.equalsIgnoreCase("OpenPGPCFB"))
4934+        // {
4935+        //     ivLength = 0;
4936+        //     cipher = new BufferedGenericBlockCipher(
4937+        //         new OpenPGPCFBBlockCipher(baseEngine));
4938+        // }
4939+        // END android-removed
4940         else if (modeName.startsWith("SIC"))
4941         {
4942             ivLength = baseEngine.getBlockSize();
4943@@ -252,12 +272,14 @@
4944             cipher = new BufferedGenericBlockCipher(new BufferedBlockCipher(
4945                         new SICBlockCipher(baseEngine)));
4946         }
4947-        else if (modeName.startsWith("GOFB"))
4948-        {
4949-            ivLength = baseEngine.getBlockSize();
4950-            cipher = new BufferedGenericBlockCipher(new BufferedBlockCipher(
4951-                        new GOFBBlockCipher(baseEngine)));
4952-        }
4953+        // BEGIN android-removed
4954+        // else if (modeName.startsWith("GOFB"))
4955+        // {
4956+        //     ivLength = baseEngine.getBlockSize();
4957+        //     cipher = new BufferedGenericBlockCipher(new BufferedBlockCipher(
4958+        //                 new GOFBBlockCipher(baseEngine)));
4959+        // }
4960+        // END android-removed
4961         else if (modeName.startsWith("CTS"))
4962         {
4963             ivLength = baseEngine.getBlockSize();
4964@@ -268,11 +290,13 @@
4965             ivLength = baseEngine.getBlockSize();
4966             cipher = new AEADGenericBlockCipher(new CCMBlockCipher(baseEngine));
4967         }
4968-        else if (modeName.startsWith("EAX"))
4969-        {
4970-            ivLength = baseEngine.getBlockSize();
4971-            cipher = new AEADGenericBlockCipher(new EAXBlockCipher(baseEngine));
4972-        }
4973+        // BEGIN android-removed
4974+        // else if (modeName.startsWith("EAX"))
4975+        // {
4976+        //     ivLength = baseEngine.getBlockSize();
4977+        //     cipher = new AEADGenericBlockCipher(new EAXBlockCipher(baseEngine));
4978+        // }
4979+        // END android-removed
4980         else if (modeName.startsWith("GCM"))
4981         {
4982             ivLength = baseEngine.getBlockSize();
4983@@ -441,63 +465,65 @@
4984                 param = new KeyParameter(key.getEncoded());
4985             }
4986         }
4987-        else if (params instanceof GOST28147ParameterSpec)
4988-        {
4989-            GOST28147ParameterSpec    gost28147Param = (GOST28147ParameterSpec)params;
4990-
4991-            param = new ParametersWithSBox(
4992-                       new KeyParameter(key.getEncoded()), ((GOST28147ParameterSpec)params).getSbox());
4993-
4994-            if (gost28147Param.getIV() != null && ivLength != 0)
4995-            {
4996-                param = new ParametersWithIV(param, gost28147Param.getIV());
4997-                ivParam = (ParametersWithIV)param;
4998-            }
4999-        }
5000-        else if (params instanceof RC2ParameterSpec)
5001-        {
5002-            RC2ParameterSpec    rc2Param = (RC2ParameterSpec)params;
5003-
5004-            param = new RC2Parameters(key.getEncoded(), ((RC2ParameterSpec)params).getEffectiveKeyBits());
5005-
5006-            if (rc2Param.getIV() != null && ivLength != 0)
5007-            {
5008-                param = new ParametersWithIV(param, rc2Param.getIV());
5009-                ivParam = (ParametersWithIV)param;
5010-            }
5011-        }
5012-        else if (params instanceof RC5ParameterSpec)
5013-        {
5014-            RC5ParameterSpec    rc5Param = (RC5ParameterSpec)params;
5015-
5016-            param = new RC5Parameters(key.getEncoded(), ((RC5ParameterSpec)params).getRounds());
5017-            if (baseEngine.getAlgorithmName().startsWith("RC5"))
5018-            {
5019-                if (baseEngine.getAlgorithmName().equals("RC5-32"))
5020-                {
5021-                    if (rc5Param.getWordSize() != 32)
5022-                    {
5023-                        throw new InvalidAlgorithmParameterException("RC5 already set up for a word size of 32 not " + rc5Param.getWordSize() + ".");
5024-                    }
5025-                }
5026-                else if (baseEngine.getAlgorithmName().equals("RC5-64"))
5027-                {
5028-                    if (rc5Param.getWordSize() != 64)
5029-                    {
5030-                        throw new InvalidAlgorithmParameterException("RC5 already set up for a word size of 64 not " + rc5Param.getWordSize() + ".");
5031-                    }
5032-                }
5033-            }
5034-            else
5035-            {
5036-                throw new InvalidAlgorithmParameterException("RC5 parameters passed to a cipher that is not RC5.");
5037-            }
5038-            if ((rc5Param.getIV() != null) && (ivLength != 0))
5039-            {
5040-                param = new ParametersWithIV(param, rc5Param.getIV());
5041-                ivParam = (ParametersWithIV)param;
5042-            }
5043-        }
5044+        // BEGIN android-removed
5045+        // else if (params instanceof GOST28147ParameterSpec)
5046+        // {
5047+        //     GOST28147ParameterSpec    gost28147Param = (GOST28147ParameterSpec)params;
5048+        //
5049+        //     param = new ParametersWithSBox(
5050+        //                new KeyParameter(key.getEncoded()), ((GOST28147ParameterSpec)params).getSbox());
5051+        //
5052+        //     if (gost28147Param.getIV() != null && ivLength != 0)
5053+        //     {
5054+        //         param = new ParametersWithIV(param, gost28147Param.getIV());
5055+        //         ivParam = (ParametersWithIV)param;
5056+        //     }
5057+        // }
5058+        // else if (params instanceof RC2ParameterSpec)
5059+        // {
5060+        //     RC2ParameterSpec    rc2Param = (RC2ParameterSpec)params;
5061+        //
5062+        //     param = new RC2Parameters(key.getEncoded(), ((RC2ParameterSpec)params).getEffectiveKeyBits());
5063+        //
5064+        //     if (rc2Param.getIV() != null && ivLength != 0)
5065+        //     {
5066+        //         param = new ParametersWithIV(param, rc2Param.getIV());
5067+        //         ivParam = (ParametersWithIV)param;
5068+        //     }
5069+        // }
5070+        // else if (params instanceof RC5ParameterSpec)
5071+        // {
5072+        //     RC5ParameterSpec    rc5Param = (RC5ParameterSpec)params;
5073+        //
5074+        //     param = new RC5Parameters(key.getEncoded(), ((RC5ParameterSpec)params).getRounds());
5075+        //     if (baseEngine.getAlgorithmName().startsWith("RC5"))
5076+        //     {
5077+        //         if (baseEngine.getAlgorithmName().equals("RC5-32"))
5078+        //         {
5079+        //             if (rc5Param.getWordSize() != 32)
5080+        //             {
5081+        //                 throw new InvalidAlgorithmParameterException("RC5 already set up for a word size of 32 not " + rc5Param.getWordSize() + ".");
5082+        //             }
5083+        //         }
5084+        //         else if (baseEngine.getAlgorithmName().equals("RC5-64"))
5085+        //         {
5086+        //             if (rc5Param.getWordSize() != 64)
5087+        //             {
5088+        //                 throw new InvalidAlgorithmParameterException("RC5 already set up for a word size of 64 not " + rc5Param.getWordSize() + ".");
5089+        //             }
5090+        //         }
5091+        //     }
5092+        //     else
5093+        //     {
5094+        //         throw new InvalidAlgorithmParameterException("RC5 parameters passed to a cipher that is not RC5.");
5095+        //     }
5096+        //     if ((rc5Param.getIV() != null) && (ivLength != 0))
5097+        //     {
5098+        //         param = new ParametersWithIV(param, rc5Param.getIV());
5099+        //         ivParam = (ParametersWithIV)param;
5100+        //     }
5101+        // }
5102+        // END android-removed
5103         else
5104         {
5105             throw new InvalidAlgorithmParameterException("unknown parameter type.");
5106@@ -701,10 +727,20 @@
5107         int     inputLen,
5108         byte[]  output,
5109         int     outputOffset) 
5110-        throws IllegalBlockSizeException, BadPaddingException
5111+        throws IllegalBlockSizeException, BadPaddingException, ShortBufferException
5112     {
5113+        // BEGIN android-note
5114+        // added ShortBufferException to the throws statement
5115+        // END android-note
5116         int     len = 0;
5117 
5118+        // BEGIN android-added
5119+        int outputLen = cipher.getOutputSize(inputLen);
5120+
5121+        if (outputLen + outputOffset > output.length) {
5122+            throw new ShortBufferException("need at least " + outputLen + " bytes");
5123+        }
5124+        // BEGIN android-added
5125         if (inputLen != 0)
5126         {
5127                 len = cipher.processBytes(input, inputOffset, inputLen, output, outputOffset);
5128diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/symmetric/util/BaseKeyGenerator.java bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/symmetric/util/BaseKeyGenerator.java
5129--- bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/symmetric/util/BaseKeyGenerator.java	2012-03-22 15:11:48.000000000 +0000
5130+++ bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/symmetric/util/BaseKeyGenerator.java	2012-09-19 21:17:12.000000000 +0000
5131@@ -56,6 +56,11 @@
5132     {
5133         try
5134         {
5135+            // BEGIN android-added
5136+            if (random == null) {
5137+                random = new SecureRandom();
5138+            }
5139+            // END android-added
5140             engine.init(new KeyGenerationParameters(random, keySize));
5141             uninitialised = false;
5142         }
5143diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/symmetric/util/BaseMac.java bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/symmetric/util/BaseMac.java
5144--- bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/symmetric/util/BaseMac.java	2012-03-22 15:11:48.000000000 +0000
5145+++ bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/symmetric/util/BaseMac.java	2012-09-19 21:17:12.000000000 +0000
5146@@ -11,25 +11,34 @@
5147 
5148 import org.bouncycastle.crypto.CipherParameters;
5149 import org.bouncycastle.crypto.Mac;
5150-import org.bouncycastle.crypto.digests.MD2Digest;
5151-import org.bouncycastle.crypto.digests.MD4Digest;
5152-import org.bouncycastle.crypto.digests.MD5Digest;
5153-import org.bouncycastle.crypto.digests.RIPEMD128Digest;
5154-import org.bouncycastle.crypto.digests.RIPEMD160Digest;
5155-import org.bouncycastle.crypto.digests.SHA1Digest;
5156-import org.bouncycastle.crypto.digests.SHA224Digest;
5157-import org.bouncycastle.crypto.digests.SHA256Digest;
5158-import org.bouncycastle.crypto.digests.SHA384Digest;
5159-import org.bouncycastle.crypto.digests.SHA512Digest;
5160-import org.bouncycastle.crypto.digests.TigerDigest;
5161+// BEGIN android-removed
5162+// import org.bouncycastle.crypto.digests.MD2Digest;
5163+// import org.bouncycastle.crypto.digests.MD4Digest;
5164+// import org.bouncycastle.crypto.digests.MD5Digest;
5165+// import org.bouncycastle.crypto.digests.RIPEMD128Digest;
5166+// import org.bouncycastle.crypto.digests.RIPEMD160Digest;
5167+// import org.bouncycastle.crypto.digests.SHA1Digest;
5168+// import org.bouncycastle.crypto.digests.SHA224Digest;
5169+// import org.bouncycastle.crypto.digests.SHA256Digest;
5170+// import org.bouncycastle.crypto.digests.SHA384Digest;
5171+// import org.bouncycastle.crypto.digests.SHA512Digest;
5172+// import org.bouncycastle.crypto.digests.TigerDigest;
5173+// END android-removed
5174+// BEGIN android-added
5175+import org.bouncycastle.crypto.digests.AndroidDigestFactory;
5176+// END android-added
5177 import org.bouncycastle.crypto.engines.DESEngine;
5178 import org.bouncycastle.crypto.engines.RC2Engine;
5179 import org.bouncycastle.crypto.macs.CBCBlockCipherMac;
5180-import org.bouncycastle.crypto.macs.CFBBlockCipherMac;
5181-import org.bouncycastle.crypto.macs.GOST28147Mac;
5182+// BEGIN android-removed
5183+// import org.bouncycastle.crypto.macs.CFBBlockCipherMac;
5184+// import org.bouncycastle.crypto.macs.GOST28147Mac;
5185+// END android-removed
5186 import org.bouncycastle.crypto.macs.HMac;
5187-import org.bouncycastle.crypto.macs.ISO9797Alg3Mac;
5188-import org.bouncycastle.crypto.macs.OldHMac;
5189+// BEGIN android-removed
5190+// import org.bouncycastle.crypto.macs.ISO9797Alg3Mac;
5191+// import org.bouncycastle.crypto.macs.OldHMac;
5192+// END android-removed
5193 import org.bouncycastle.crypto.paddings.ISO7816d4Padding;
5194 import org.bouncycastle.crypto.params.KeyParameter;
5195 import org.bouncycastle.crypto.params.ParametersWithIV;
5196@@ -179,91 +188,93 @@
5197         }
5198     }
5199 
5200-    /**
5201-     * GOST28147
5202-     */
5203-    public static class GOST28147
5204-        extends BaseMac
5205-    {
5206-        public GOST28147()
5207-        {
5208-            super(new GOST28147Mac());
5209-        }
5210-    }
5211-
5212-    
5213-
5214-    /**
5215-     * DES
5216-     */
5217-    public static class DESCFB8
5218-        extends BaseMac
5219-    {
5220-        public DESCFB8()
5221-        {
5222-            super(new CFBBlockCipherMac(new DESEngine()));
5223-        }
5224-    }
5225-
5226-    /**
5227-     * RC2CFB8
5228-     */
5229-    public static class RC2CFB8
5230-        extends BaseMac
5231-    {
5232-        public RC2CFB8()
5233-        {
5234-            super(new CFBBlockCipherMac(new RC2Engine()));
5235-        }
5236-    }
5237-
5238-    /**
5239-     * DES9797Alg3with7816-4Padding
5240-     */
5241-    public static class DES9797Alg3with7816d4
5242-        extends BaseMac
5243-    {
5244-        public DES9797Alg3with7816d4()
5245-        {
5246-            super(new ISO9797Alg3Mac(new DESEngine(), new ISO7816d4Padding()));
5247-        }
5248-    }
5249-
5250-    /**
5251-     * DES9797Alg3
5252-     */
5253-    public static class DES9797Alg3
5254-        extends BaseMac
5255-    {
5256-        public DES9797Alg3()
5257-        {
5258-            super(new ISO9797Alg3Mac(new DESEngine()));
5259-        }
5260-    }
5261-
5262-    /**
5263-     * MD2 HMac
5264-     */
5265-    public static class MD2
5266-        extends BaseMac
5267-    {
5268-        public MD2()
5269-        {
5270-            super(new HMac(new MD2Digest()));
5271-        }
5272-    }
5273-
5274-    /**
5275-     * MD4 HMac
5276-     */
5277-    public static class MD4
5278-        extends BaseMac
5279-    {
5280-        public MD4()
5281-        {
5282-            super(new HMac(new MD4Digest()));
5283-        }
5284-    }
5285+    // BEGIN android-removed
5286+    // /**
5287+    //  * GOST28147
5288+    //  */
5289+    // public static class GOST28147
5290+    //     extends BaseMac
5291+    // {
5292+    //     public GOST28147()
5293+    //     {
5294+    //         super(new GOST28147Mac());
5295+    //     }
5296+    // }
5297+    //
5298+    //
5299+    //
5300+    // /**
5301+    //  * DES
5302+    //  */
5303+    // public static class DESCFB8
5304+    //     extends BaseMac
5305+    // {
5306+    //     public DESCFB8()
5307+    //     {
5308+    //         super(new CFBBlockCipherMac(new DESEngine()));
5309+    //     }
5310+    // }
5311+    //
5312+    // /**
5313+    //  * RC2CFB8
5314+    //  */
5315+    // public static class RC2CFB8
5316+    //     extends BaseMac
5317+    // {
5318+    //     public RC2CFB8()
5319+    //     {
5320+    //         super(new CFBBlockCipherMac(new RC2Engine()));
5321+    //     }
5322+    // }
5323+    //
5324+    // /**
5325+    //  * DES9797Alg3with7816-4Padding
5326+    //  */
5327+    // public static class DES9797Alg3with7816d4
5328+    //     extends BaseMac
5329+    // {
5330+    //     public DES9797Alg3with7816d4()
5331+    //     {
5332+    //         super(new ISO9797Alg3Mac(new DESEngine(), new ISO7816d4Padding()));
5333+    //     }
5334+    // }
5335+    //
5336+    // /**
5337+    //  * DES9797Alg3
5338+    //  */
5339+    // public static class DES9797Alg3
5340+    //     extends BaseMac
5341+    // {
5342+    //     public DES9797Alg3()
5343+    //     {
5344+    //         super(new ISO9797Alg3Mac(new DESEngine()));
5345+    //     }
5346+    // }
5347+    //
5348+    // /**
5349+    //  * MD2 HMac
5350+    //  */
5351+    // public static class MD2
5352+    //     extends BaseMac
5353+    // {
5354+    //     public MD2()
5355+    //     {
5356+    //         super(new HMac(new MD2Digest()));
5357+    //     }
5358+    // }
5359+    //
5360+    // /**
5361+    //  * MD4 HMac
5362+    //  */
5363+    // public static class MD4
5364+    //     extends BaseMac
5365+    // {
5366+    //     public MD4()
5367+    //     {
5368+    //         super(new HMac(new MD4Digest()));
5369+    //     }
5370+    // }
5371+    // END android-removed
5372 
5373     /**
5374      * MD5 HMac
5375@@ -273,7 +284,9 @@
5376     {
5377         public MD5()
5378         {
5379-            super(new HMac(new MD5Digest()));
5380+            // BEGIN android-changed
5381+            super(new HMac(AndroidDigestFactory.getMD5()));
5382+            // END android-changed
5383         }
5384     }
5385 
5386@@ -285,21 +298,25 @@
5387     {
5388         public SHA1()
5389         {
5390-            super(new HMac(new SHA1Digest()));
5391+            // BEGIN android-changed
5392+            super(new HMac(AndroidDigestFactory.getSHA1()));
5393+            // END android-changed
5394         }
5395     }
5396 
5397-    /**
5398-     * SHA-224 HMac
5399-     */
5400-    public static class SHA224
5401-        extends BaseMac
5402-    {
5403-        public SHA224()
5404-        {
5405-            super(new HMac(new SHA224Digest()));
5406-        }
5407-    }
5408+    // BEGIN android-removed
5409+    // /**
5410+    //  * SHA-224 HMac
5411+    //  */
5412+    // public static class SHA224
5413+    //     extends BaseMac
5414+    // {
5415+    //     public SHA224()
5416+    //     {
5417+    //         super(new HMac(new SHA224Digest()));
5418+    //     }
5419+    // }
5420+    // END android-removed
5421     
5422     /**
5423      * SHA-256 HMac
5424@@ -309,7 +326,7 @@
5425     {
5426         public SHA256()
5427         {
5428-            super(new HMac(new SHA256Digest()));
5429+            super(new HMac(AndroidDigestFactory.getSHA256()));
5430         }
5431     }
5432 
5433@@ -321,18 +338,20 @@
5434     {
5435         public SHA384()
5436         {
5437-            super(new HMac(new SHA384Digest()));
5438+            super(new HMac(AndroidDigestFactory.getSHA384()));
5439         }
5440     }
5441 
5442-    public static class OldSHA384
5443-        extends BaseMac
5444-    {
5445-        public OldSHA384()
5446-        {
5447-            super(new OldHMac(new SHA384Digest()));
5448-        }
5449-    }
5450+    // BEGIN android-removed
5451+    // public static class OldSHA384
5452+    //     extends BaseMac
5453+    // {
5454+    //     public OldSHA384()
5455+    //     {
5456+    //         super(new OldHMac(new SHA384Digest()));
5457+    //     }
5458+    // }
5459+    // END android-removed
5460     
5461     /**
5462      * SHA-512 HMac
5463@@ -342,75 +361,77 @@
5464     {
5465         public SHA512()
5466         {
5467-            super(new HMac(new SHA512Digest()));
5468-        }
5469-    }
5470-
5471-    /**
5472-     * SHA-512 HMac
5473-     */
5474-    public static class OldSHA512
5475-        extends BaseMac
5476-    {
5477-        public OldSHA512()
5478-        {
5479-            super(new OldHMac(new SHA512Digest()));
5480-        }
5481-    }
5482-    
5483-    /**
5484-     * RIPEMD128 HMac
5485-     */
5486-    public static class RIPEMD128
5487-        extends BaseMac
5488-    {
5489-        public RIPEMD128()
5490-        {
5491-            super(new HMac(new RIPEMD128Digest()));
5492-        }
5493-    }
5494-
5495-    /**
5496-     * RIPEMD160 HMac
5497-     */
5498-    public static class RIPEMD160
5499-        extends BaseMac
5500-    {
5501-        public RIPEMD160()
5502-        {
5503-            super(new HMac(new RIPEMD160Digest()));
5504-        }
5505-    }
5506-
5507-    /**
5508-     * Tiger HMac
5509-     */
5510-    public static class Tiger
5511-        extends BaseMac
5512-    {
5513-        public Tiger()
5514-        {
5515-            super(new HMac(new TigerDigest()));
5516+            super(new HMac(AndroidDigestFactory.getSHA512()));
5517         }
5518     }
5519 
5520+    // BEGIN android-removed
5521+    // /**
5522+    //  * SHA-512 HMac
5523+    //  */
5524+    // public static class OldSHA512
5525+    //     extends BaseMac
5526+    // {
5527+    //     public OldSHA512()
5528+    //     {
5529+    //         super(new OldHMac(new SHA512Digest()));
5530+    //     }
5531+    // }
5532+    //    
5533+    // /**
5534+    //  * RIPEMD128 HMac
5535+    //  */
5536+    // public static class RIPEMD128
5537+    //     extends BaseMac
5538+    // {
5539+    //     public RIPEMD128()
5540+    //     {
5541+    //         super(new HMac(new RIPEMD128Digest()));
5542+    //     }
5543+    // }
5544     //
5545-    // PKCS12 states that the same algorithm should be used
5546-    // for the key generation as is used in the HMAC, so that
5547-    // is what we do here.
5548+    // /**
5549+    //  * RIPEMD160 HMac
5550+    //  */
5551+    // public static class RIPEMD160
5552+    //     extends BaseMac
5553+    // {
5554+    //     public RIPEMD160()
5555+    //     {
5556+    //         super(new HMac(new RIPEMD160Digest()));
5557+    //     }
5558+    // }
5559     //
5560-
5561-    /**
5562-     * PBEWithHmacRIPEMD160
5563-     */
5564-    public static class PBEWithRIPEMD160
5565-        extends BaseMac
5566-    {
5567-        public PBEWithRIPEMD160()
5568-        {
5569-            super(new HMac(new RIPEMD160Digest()), PKCS12, RIPEMD160, 160);
5570-        }
5571-    }
5572+    // /**
5573+    //  * Tiger HMac
5574+    //  */
5575+    // public static class Tiger
5576+    //     extends BaseMac
5577+    // {
5578+    //     public Tiger()
5579+    //     {
5580+    //         super(new HMac(new TigerDigest()));
5581+    //     }
5582+    // }
5583+    //
5584+    // //
5585+    // // PKCS12 states that the same algorithm should be used
5586+    // // for the key generation as is used in the HMAC, so that
5587+    // // is what we do here.
5588+    // //
5589+    //
5590+    // /**
5591+    //  * PBEWithHmacRIPEMD160
5592+    //  */
5593+    // public static class PBEWithRIPEMD160
5594+    //     extends BaseMac
5595+    // {
5596+    //     public PBEWithRIPEMD160()
5597+    //     {
5598+    //         super(new HMac(new RIPEMD160Digest()), PKCS12, RIPEMD160, 160);
5599+    //     }
5600+    // }
5601+    // END android-removed
5602 
5603     /**
5604      * PBEWithHmacSHA
5605@@ -420,19 +441,23 @@
5606     {
5607         public PBEWithSHA()
5608         {
5609-            super(new HMac(new SHA1Digest()), PKCS12, SHA1, 160);
5610+            // BEGIN android-changed
5611+            super(new HMac(AndroidDigestFactory.getSHA1()), PKCS12, SHA1, 160);
5612+            // END android-changed
5613         }
5614     }
5615 
5616-    /**
5617-     * PBEWithHmacTiger
5618-     */
5619-    public static class PBEWithTiger
5620-        extends BaseMac
5621-    {
5622-        public PBEWithTiger()
5623-        {
5624-            super(new HMac(new TigerDigest()), PKCS12, TIGER, 192);
5625-        }
5626-    }
5627+    // BEGIN android-removed
5628+    // /**
5629+    //  * PBEWithHmacTiger
5630+    //  */
5631+    // public static class PBEWithTiger
5632+    //     extends BaseMac
5633+    // {
5634+    //     public PBEWithTiger()
5635+    //     {
5636+    //         super(new HMac(new TigerDigest()), PKCS12, TIGER, 192);
5637+    //     }
5638+    // }
5639+    // END android-removed
5640 }
5641diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/symmetric/util/BaseStreamCipher.java bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/symmetric/util/BaseStreamCipher.java
5642--- bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/symmetric/util/BaseStreamCipher.java	2012-03-22 15:11:48.000000000 +0000
5643+++ bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/symmetric/util/BaseStreamCipher.java	2012-09-19 21:17:12.000000000 +0000
5644@@ -13,8 +13,10 @@
5645 import javax.crypto.ShortBufferException;
5646 import javax.crypto.spec.IvParameterSpec;
5647 import javax.crypto.spec.PBEParameterSpec;
5648-import javax.crypto.spec.RC2ParameterSpec;
5649-import javax.crypto.spec.RC5ParameterSpec;
5650+// BEGIN android-removed
5651+// import javax.crypto.spec.RC2ParameterSpec;
5652+// import javax.crypto.spec.RC5ParameterSpec;
5653+// END android-removed
5654 
5655 import org.bouncycastle.crypto.BlockCipher;
5656 import org.bouncycastle.crypto.CipherParameters;
5657@@ -34,8 +36,10 @@
5658     //
5659     private Class[]                 availableSpecs =
5660                                     {
5661-                                        RC2ParameterSpec.class,
5662-                                        RC5ParameterSpec.class,
5663+                                        // BEGIN android-removed
5664+                                        // RC2ParameterSpec.class,
5665+                                        // RC5ParameterSpec.class,
5666+                                        // END android-removed
5667                                         IvParameterSpec.class,
5668                                         PBEParameterSpec.class
5669                                     };
5670diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/symmetric/util/BaseWrapCipher.java bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/symmetric/util/BaseWrapCipher.java
5671--- bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/symmetric/util/BaseWrapCipher.java	2012-03-22 15:11:48.000000000 +0000
5672+++ bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/symmetric/util/BaseWrapCipher.java	2012-09-19 21:17:12.000000000 +0000
5673@@ -22,8 +22,10 @@
5674 import javax.crypto.ShortBufferException;
5675 import javax.crypto.spec.IvParameterSpec;
5676 import javax.crypto.spec.PBEParameterSpec;
5677-import javax.crypto.spec.RC2ParameterSpec;
5678-import javax.crypto.spec.RC5ParameterSpec;
5679+// BEGIN android-removed
5680+// import javax.crypto.spec.RC2ParameterSpec;
5681+// import javax.crypto.spec.RC5ParameterSpec;
5682+// END android-removed
5683 import javax.crypto.spec.SecretKeySpec;
5684 
5685 import org.bouncycastle.asn1.pkcs.PrivateKeyInfo;
5686@@ -45,8 +47,10 @@
5687                                     {
5688                                         IvParameterSpec.class,
5689                                         PBEParameterSpec.class,
5690-                                        RC2ParameterSpec.class,
5691-                                        RC5ParameterSpec.class
5692+                                        // BEGIN android-removed
5693+                                        // RC2ParameterSpec.class,
5694+                                        // RC5ParameterSpec.class
5695+                                        // END android-removed
5696                                     };
5697 
5698     protected int                     pbeType = PKCS12;
5699@@ -258,16 +262,19 @@
5700         return null;
5701     }
5702 
5703+    // BEGIN android-changed
5704+    // added ShortBufferException to throws statement
5705     protected int engineDoFinal(
5706         byte[]  input,
5707         int     inputOffset,
5708         int     inputLen,
5709         byte[]  output,
5710         int     outputOffset)
5711-        throws IllegalBlockSizeException, BadPaddingException
5712+        throws IllegalBlockSizeException, BadPaddingException, ShortBufferException
5713     {
5714         return 0;
5715     }
5716+    // END android-changed
5717 
5718     protected byte[] engineWrap(
5719         Key     key)
5720@@ -300,7 +307,12 @@
5721         byte[]  wrappedKey,
5722         String  wrappedKeyAlgorithm,
5723         int     wrappedKeyType)
5724-    throws InvalidKeyException
5725+    // BEGIN android-removed
5726+    // throws InvalidKeyException
5727+    // END android-removed
5728+    // BEGIN android-added
5729+    throws InvalidKeyException, NoSuchAlgorithmException
5730+    // END android-added
5731     {
5732         byte[] encoded;
5733         try
5734@@ -376,10 +388,12 @@
5735             {
5736                 throw new InvalidKeyException("Unknown key type " + e.getMessage());
5737             }
5738-            catch (NoSuchAlgorithmException e)
5739-            {
5740-                throw new InvalidKeyException("Unknown key type " + e.getMessage());
5741-            }
5742+            // BEGIN android-removed
5743+            // catch (NoSuchAlgorithmException e)
5744+            // {
5745+            //     throw new InvalidKeyException("Unknown key type " + e.getMessage());
5746+            // }
5747+            // END android-removed
5748             catch (InvalidKeySpecException e2)
5749             {
5750                 throw new InvalidKeyException("Unknown key type " + e2.getMessage());
5751diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/symmetric/util/PBE.java bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/symmetric/util/PBE.java
5752--- bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/symmetric/util/PBE.java	2012-03-22 15:11:48.000000000 +0000
5753+++ bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/symmetric/util/PBE.java	2012-09-19 21:17:12.000000000 +0000
5754@@ -7,12 +7,17 @@
5755 
5756 import org.bouncycastle.crypto.CipherParameters;
5757 import org.bouncycastle.crypto.PBEParametersGenerator;
5758-import org.bouncycastle.crypto.digests.MD2Digest;
5759-import org.bouncycastle.crypto.digests.MD5Digest;
5760-import org.bouncycastle.crypto.digests.RIPEMD160Digest;
5761-import org.bouncycastle.crypto.digests.SHA1Digest;
5762-import org.bouncycastle.crypto.digests.SHA256Digest;
5763-import org.bouncycastle.crypto.digests.TigerDigest;
5764+// BEGIN android-removed
5765+// import org.bouncycastle.crypto.digests.MD2Digest;
5766+// import org.bouncycastle.crypto.digests.MD5Digest;
5767+// import org.bouncycastle.crypto.digests.RIPEMD160Digest;
5768+// import org.bouncycastle.crypto.digests.SHA1Digest;
5769+// import org.bouncycastle.crypto.digests.SHA256Digest;
5770+// import org.bouncycastle.crypto.digests.TigerDigest;
5771+// END android-removed
5772+// BEGIN android-added
5773+import org.bouncycastle.crypto.digests.AndroidDigestFactory;
5774+// END android-added
5775 import org.bouncycastle.crypto.generators.OpenSSLPBEParametersGenerator;
5776 import org.bouncycastle.crypto.generators.PKCS12ParametersGenerator;
5777 import org.bouncycastle.crypto.generators.PKCS5S1ParametersGenerator;
5778@@ -28,10 +33,14 @@
5779     //
5780     static final int        MD5         = 0;
5781     static final int        SHA1        = 1;
5782-    static final int        RIPEMD160   = 2;
5783-    static final int        TIGER       = 3;
5784+    // BEGIN android-removed
5785+    // static final int        RIPEMD160   = 2;
5786+    // static final int        TIGER       = 3;
5787+    // END android-removed
5788     static final int        SHA256      = 4;
5789-    static final int        MD2         = 5;
5790+    // BEGIN android-removed
5791+    // static final int        MD2         = 5;
5792+    // END android-removed
5793 
5794     static final int        PKCS5S1     = 0;
5795     static final int        PKCS5S2     = 1;
5796@@ -53,14 +62,20 @@
5797             {
5798                 switch (hash)
5799                 {
5800-                case MD2:
5801-                    generator = new PKCS5S1ParametersGenerator(new MD2Digest());
5802-                    break;
5803+                // BEGIN android-removed
5804+                // case MD2:
5805+                //     generator = new PKCS5S1ParametersGenerator(new MD2Digest());
5806+                //     break;
5807+                // END android-removed
5808                 case MD5:
5809-                    generator = new PKCS5S1ParametersGenerator(new MD5Digest());
5810+                    // BEGIN android-changed
5811+                    generator = new PKCS5S1ParametersGenerator(AndroidDigestFactory.getMD5());
5812+                    // END android-changed
5813                     break;
5814                 case SHA1:
5815-                    generator = new PKCS5S1ParametersGenerator(new SHA1Digest());
5816+                    // BEGIN android-changed
5817+                    generator = new PKCS5S1ParametersGenerator(AndroidDigestFactory.getSHA1());
5818+                    // END android-changed
5819                     break;
5820                 default:
5821                     throw new IllegalStateException("PKCS5 scheme 1 only supports MD2, MD5 and SHA1.");
5822@@ -74,23 +89,33 @@
5823             {
5824                 switch (hash)
5825                 {
5826-                case MD2:
5827-                    generator = new PKCS12ParametersGenerator(new MD2Digest());
5828-                    break;
5829+                // BEGIN android-removed
5830+                // case MD2:
5831+                //     generator = new PKCS12ParametersGenerator(new MD2Digest());
5832+                //     break;
5833+                // END android-removed
5834                 case MD5:
5835-                    generator = new PKCS12ParametersGenerator(new MD5Digest());
5836+                    // BEGIN android-changed
5837+                    generator = new PKCS12ParametersGenerator(AndroidDigestFactory.getMD5());
5838+                    // END android-changed
5839                     break;
5840                 case SHA1:
5841-                    generator = new PKCS12ParametersGenerator(new SHA1Digest());
5842-                    break;
5843-                case RIPEMD160:
5844-                    generator = new PKCS12ParametersGenerator(new RIPEMD160Digest());
5845-                    break;
5846-                case TIGER:
5847-                    generator = new PKCS12ParametersGenerator(new TigerDigest());
5848+                    // BEGIN android-changed
5849+                    generator = new PKCS12ParametersGenerator(AndroidDigestFactory.getSHA1());
5850+                    // END android-changed
5851                     break;
5852+                // BEGIN android-removed
5853+                // case RIPEMD160:
5854+                //     generator = new PKCS12ParametersGenerator(new RIPEMD160Digest());
5855+                //     break;
5856+                // case TIGER:
5857+                //     generator = new PKCS12ParametersGenerator(new TigerDigest());
5858+                //     break;
5859+                // END android-removed
5860                 case SHA256:
5861-                    generator = new PKCS12ParametersGenerator(new SHA256Digest());
5862+                    // BEGIN android-changed
5863+                    generator = new PKCS12ParametersGenerator(AndroidDigestFactory.getSHA256());
5864+                    // END android-changed
5865                     break;
5866                 default:
5867                     throw new IllegalStateException("unknown digest scheme for PBE encryption.");
5868diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/util/DigestFactory.java bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/util/DigestFactory.java
5869--- bcprov-jdk15on-147.orig/org/bouncycastle/jcajce/provider/util/DigestFactory.java	2012-03-22 15:11:48.000000000 +0000
5870+++ bcprov-jdk15on-147/org/bouncycastle/jcajce/provider/util/DigestFactory.java	2012-09-19 21:17:12.000000000 +0000
5871@@ -10,19 +10,26 @@
5872 import org.bouncycastle.asn1.oiw.OIWObjectIdentifiers;
5873 import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
5874 import org.bouncycastle.crypto.Digest;
5875-import org.bouncycastle.crypto.digests.MD5Digest;
5876-import org.bouncycastle.crypto.digests.SHA1Digest;
5877-import org.bouncycastle.crypto.digests.SHA224Digest;
5878-import org.bouncycastle.crypto.digests.SHA256Digest;
5879-import org.bouncycastle.crypto.digests.SHA384Digest;
5880-import org.bouncycastle.crypto.digests.SHA512Digest;
5881+// BEGIN android-removed
5882+// import org.bouncycastle.crypto.digests.MD5Digest;
5883+// import org.bouncycastle.crypto.digests.SHA1Digest;
5884+// import org.bouncycastle.crypto.digests.SHA224Digest;
5885+// import org.bouncycastle.crypto.digests.SHA256Digest;
5886+// import org.bouncycastle.crypto.digests.SHA384Digest;
5887+// import org.bouncycastle.crypto.digests.SHA512Digest;
5888+// END android-removed
5889+// BEGIN android-added
5890+import org.bouncycastle.crypto.digests.AndroidDigestFactory;
5891+// END android-added
5892 import org.bouncycastle.util.Strings;
5893 
5894 public class DigestFactory
5895 {
5896     private static Set md5 = new HashSet();
5897     private static Set sha1 = new HashSet();
5898-    private static Set sha224 = new HashSet();
5899+    // BEGIN android-removed
5900+    // private static Set sha224 = new HashSet();
5901+    // END android-removed
5902     private static Set sha256 = new HashSet();
5903     private static Set sha384 = new HashSet();
5904     private static Set sha512 = new HashSet();
5905@@ -38,9 +45,11 @@
5906         sha1.add("SHA-1");
5907         sha1.add(OIWObjectIdentifiers.idSHA1.getId());
5908         
5909-        sha224.add("SHA224");
5910-        sha224.add("SHA-224");
5911-        sha224.add(NISTObjectIdentifiers.id_sha224.getId());
5912+        // BEGIN android-removed
5913+        // sha224.add("SHA224");
5914+        // sha224.add("SHA-224");
5915+        // sha224.add(NISTObjectIdentifiers.id_sha224.getId());
5916+        // END android-removed
5917         
5918         sha256.add("SHA256");
5919         sha256.add("SHA-256");
5920@@ -61,9 +70,11 @@
5921         oids.put("SHA-1", OIWObjectIdentifiers.idSHA1);
5922         oids.put(OIWObjectIdentifiers.idSHA1.getId(), OIWObjectIdentifiers.idSHA1);
5923         
5924-        oids.put("SHA224", NISTObjectIdentifiers.id_sha224);
5925-        oids.put("SHA-224", NISTObjectIdentifiers.id_sha224);
5926-        oids.put(NISTObjectIdentifiers.id_sha224.getId(), NISTObjectIdentifiers.id_sha224);
5927+        // BEGIN android-removed
5928+        // oids.put("SHA224", NISTObjectIdentifiers.id_sha224);
5929+        // oids.put("SHA-224", NISTObjectIdentifiers.id_sha224);
5930+        // oids.put(NISTObjectIdentifiers.id_sha224.getId(), NISTObjectIdentifiers.id_sha224);
5931+        // END android-removed
5932         
5933         oids.put("SHA256", NISTObjectIdentifiers.id_sha256);
5934         oids.put("SHA-256", NISTObjectIdentifiers.id_sha256);
5935@@ -85,27 +96,39 @@
5936         
5937         if (sha1.contains(digestName))
5938         {
5939-            return new SHA1Digest();
5940+            // BEGIN android-changed
5941+            return AndroidDigestFactory.getSHA1();
5942+            // END android-changed
5943         }
5944         if (md5.contains(digestName))
5945         {
5946-            return new MD5Digest();
5947-        }
5948-        if (sha224.contains(digestName))
5949-        {
5950-            return new SHA224Digest();
5951-        }
5952+            // BEGIN android-changed
5953+            return AndroidDigestFactory.getMD5();
5954+            // END android-changed
5955+        }
5956+        // BEGIN android-removed
5957+        // if (sha224.contains(digestName))
5958+        // {
5959+        //     return new SHA224Digest();
5960+        // }
5961+        // END android-removed
5962         if (sha256.contains(digestName))
5963         {
5964-            return new SHA256Digest();
5965+            // BEGIN android-changed
5966+            return AndroidDigestFactory.getSHA256();
5967+            // END android-changed
5968         }
5969         if (sha384.contains(digestName))
5970         {
5971-            return new SHA384Digest();
5972+            // BEGIN android-changed
5973+            return AndroidDigestFactory.getSHA384();
5974+            // END android-changed
5975         }
5976         if (sha512.contains(digestName))
5977         {
5978-            return new SHA512Digest();
5979+            // BEGIN android-changed
5980+            return AndroidDigestFactory.getSHA512();
5981+            // END android-changed
5982         }
5983         
5984         return null;
5985@@ -116,7 +139,9 @@
5986         String digest2)
5987     {
5988         return (sha1.contains(digest1) && sha1.contains(digest2))
5989-            || (sha224.contains(digest1) && sha224.contains(digest2))
5990+            // BEGIN android-removed
5991+            // || (sha224.contains(digest1) && sha224.contains(digest2))
5992+            // END android-removed
5993             || (sha256.contains(digest1) && sha256.contains(digest2))
5994             || (sha384.contains(digest1) && sha384.contains(digest2))
5995             || (sha512.contains(digest1) && sha512.contains(digest2))
5996diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/jce/ECNamedCurveTable.java bcprov-jdk15on-147/org/bouncycastle/jce/ECNamedCurveTable.java
5997--- bcprov-jdk15on-147.orig/org/bouncycastle/jce/ECNamedCurveTable.java	2012-03-22 15:11:48.000000000 +0000
5998+++ bcprov-jdk15on-147/org/bouncycastle/jce/ECNamedCurveTable.java	2012-09-19 21:17:12.000000000 +0000
5999@@ -6,7 +6,9 @@
6000 import org.bouncycastle.asn1.ASN1ObjectIdentifier;
6001 import org.bouncycastle.asn1.nist.NISTNamedCurves;
6002 import org.bouncycastle.asn1.sec.SECNamedCurves;
6003-import org.bouncycastle.asn1.teletrust.TeleTrusTNamedCurves;
6004+// BEGIN android-removed
6005+// import org.bouncycastle.asn1.teletrust.TeleTrusTNamedCurves;
6006+// END android-removed
6007 import org.bouncycastle.asn1.x9.X962NamedCurves;
6008 import org.bouncycastle.asn1.x9.X9ECParameters;
6009 import org.bouncycastle.jce.spec.ECNamedCurveParameterSpec;
6010@@ -55,21 +57,23 @@
6011             }
6012         }
6013 
6014-        if (ecP == null)
6015-        {
6016-            ecP = TeleTrusTNamedCurves.getByName(name);
6017-            if (ecP == null)
6018-            {
6019-                try
6020-                {
6021-                    ecP = TeleTrusTNamedCurves.getByOID(new ASN1ObjectIdentifier(name));
6022-                }
6023-                catch (IllegalArgumentException e)
6024-                {
6025-                    // ignore - not an oid
6026-                }
6027-            }
6028-        }
6029+        // BEGIN android-removed
6030+        // if (ecP == null)
6031+        // {
6032+        //     ecP = TeleTrusTNamedCurves.getByName(name);
6033+        //     if (ecP == null)
6034+        //     {
6035+        //         try
6036+        //         {
6037+        //             ecP = TeleTrusTNamedCurves.getByOID(new ASN1ObjectIdentifier(name));
6038+        //         }
6039+        //         catch (IllegalArgumentException e)
6040+        //         {
6041+        //             // ignore - not an oid
6042+        //         }
6043+        //     }
6044+        // }
6045+        // END android-removed
6046 
6047         if (ecP == null)
6048         {
6049@@ -102,7 +106,9 @@
6050         addEnumeration(v, X962NamedCurves.getNames());
6051         addEnumeration(v, SECNamedCurves.getNames());
6052         addEnumeration(v, NISTNamedCurves.getNames());
6053-        addEnumeration(v, TeleTrusTNamedCurves.getNames());
6054+        // BEGIN android-removed
6055+        // addEnumeration(v, TeleTrusTNamedCurves.getNames());
6056+        // END android-removed
6057 
6058         return v.elements();
6059     }
6060diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/jce/PKCS10CertificationRequest.java bcprov-jdk15on-147/org/bouncycastle/jce/PKCS10CertificationRequest.java
6061--- bcprov-jdk15on-147.orig/org/bouncycastle/jce/PKCS10CertificationRequest.java	2012-03-22 15:11:48.000000000 +0000
6062+++ bcprov-jdk15on-147/org/bouncycastle/jce/PKCS10CertificationRequest.java	2012-09-19 21:17:12.000000000 +0000
6063@@ -30,14 +30,18 @@
6064 import org.bouncycastle.asn1.DERBitString;
6065 import org.bouncycastle.asn1.DERNull;
6066 import org.bouncycastle.asn1.DERObjectIdentifier;
6067-import org.bouncycastle.asn1.cryptopro.CryptoProObjectIdentifiers;
6068+// BEGIN android-removed
6069+// import org.bouncycastle.asn1.cryptopro.CryptoProObjectIdentifiers;
6070+// END android-removed
6071 import org.bouncycastle.asn1.nist.NISTObjectIdentifiers;
6072 import org.bouncycastle.asn1.oiw.OIWObjectIdentifiers;
6073 import org.bouncycastle.asn1.pkcs.CertificationRequest;
6074 import org.bouncycastle.asn1.pkcs.CertificationRequestInfo;
6075 import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
6076 import org.bouncycastle.asn1.pkcs.RSASSAPSSparams;
6077-import org.bouncycastle.asn1.teletrust.TeleTrusTObjectIdentifiers;
6078+// BEGIN android-removed
6079+// import org.bouncycastle.asn1.teletrust.TeleTrusTObjectIdentifiers;
6080+// END android-removed
6081 import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
6082 import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;
6083 import org.bouncycastle.asn1.x509.X509Name;
6084@@ -81,15 +85,20 @@
6085 
6086     static
6087     {
6088-        algorithms.put("MD2WITHRSAENCRYPTION", new DERObjectIdentifier("1.2.840.113549.1.1.2"));
6089-        algorithms.put("MD2WITHRSA", new DERObjectIdentifier("1.2.840.113549.1.1.2"));
6090+        // BEGIN android-removed
6091+        // Dropping MD2
6092+        // algorithms.put("MD2WITHRSAENCRYPTION", new DERObjectIdentifier("1.2.840.113549.1.1.2"));
6093+        // algorithms.put("MD2WITHRSA", new DERObjectIdentifier("1.2.840.113549.1.1.2"));
6094+        // END android-removed
6095         algorithms.put("MD5WITHRSAENCRYPTION", new DERObjectIdentifier("1.2.840.113549.1.1.4"));
6096         algorithms.put("MD5WITHRSA", new DERObjectIdentifier("1.2.840.113549.1.1.4"));
6097         algorithms.put("RSAWITHMD5", new DERObjectIdentifier("1.2.840.113549.1.1.4"));
6098         algorithms.put("SHA1WITHRSAENCRYPTION", new DERObjectIdentifier("1.2.840.113549.1.1.5"));
6099         algorithms.put("SHA1WITHRSA", new DERObjectIdentifier("1.2.840.113549.1.1.5"));
6100-        algorithms.put("SHA224WITHRSAENCRYPTION", PKCSObjectIdentifiers.sha224WithRSAEncryption);
6101-        algorithms.put("SHA224WITHRSA", PKCSObjectIdentifiers.sha224WithRSAEncryption);
6102+        // BEGIN android-removed
6103+        // algorithms.put("SHA224WITHRSAENCRYPTION", PKCSObjectIdentifiers.sha224WithRSAEncryption);
6104+        // algorithms.put("SHA224WITHRSA", PKCSObjectIdentifiers.sha224WithRSAEncryption);
6105+        // END android-removed
6106         algorithms.put("SHA256WITHRSAENCRYPTION", PKCSObjectIdentifiers.sha256WithRSAEncryption);
6107         algorithms.put("SHA256WITHRSA", PKCSObjectIdentifiers.sha256WithRSAEncryption);
6108         algorithms.put("SHA384WITHRSAENCRYPTION", PKCSObjectIdentifiers.sha384WithRSAEncryption);
6109@@ -97,57 +106,78 @@
6110         algorithms.put("SHA512WITHRSAENCRYPTION", PKCSObjectIdentifiers.sha512WithRSAEncryption);
6111         algorithms.put("SHA512WITHRSA", PKCSObjectIdentifiers.sha512WithRSAEncryption);
6112         algorithms.put("SHA1WITHRSAANDMGF1", PKCSObjectIdentifiers.id_RSASSA_PSS);
6113-        algorithms.put("SHA224WITHRSAANDMGF1", PKCSObjectIdentifiers.id_RSASSA_PSS);
6114+        // BEGIN android-removed
6115+        // algorithms.put("SHA224WITHRSAANDMGF1", PKCSObjectIdentifiers.id_RSASSA_PSS);
6116+        // END android-removed
6117         algorithms.put("SHA256WITHRSAANDMGF1", PKCSObjectIdentifiers.id_RSASSA_PSS);
6118         algorithms.put("SHA384WITHRSAANDMGF1", PKCSObjectIdentifiers.id_RSASSA_PSS);
6119         algorithms.put("SHA512WITHRSAANDMGF1", PKCSObjectIdentifiers.id_RSASSA_PSS);
6120         algorithms.put("RSAWITHSHA1", new DERObjectIdentifier("1.2.840.113549.1.1.5"));
6121-        algorithms.put("RIPEMD128WITHRSAENCRYPTION", TeleTrusTObjectIdentifiers.rsaSignatureWithripemd128);
6122-        algorithms.put("RIPEMD128WITHRSA", TeleTrusTObjectIdentifiers.rsaSignatureWithripemd128);
6123-        algorithms.put("RIPEMD160WITHRSAENCRYPTION", TeleTrusTObjectIdentifiers.rsaSignatureWithripemd160);
6124-        algorithms.put("RIPEMD160WITHRSA", TeleTrusTObjectIdentifiers.rsaSignatureWithripemd160);
6125-        algorithms.put("RIPEMD256WITHRSAENCRYPTION", TeleTrusTObjectIdentifiers.rsaSignatureWithripemd256);
6126-        algorithms.put("RIPEMD256WITHRSA", TeleTrusTObjectIdentifiers.rsaSignatureWithripemd256);
6127+        // BEGIN android-removed
6128+        // algorithms.put("RIPEMD128WITHRSAENCRYPTION", TeleTrusTObjectIdentifiers.rsaSignatureWithripemd128);
6129+        // algorithms.put("RIPEMD128WITHRSA", TeleTrusTObjectIdentifiers.rsaSignatureWithripemd128);
6130+        // algorithms.put("RIPEMD160WITHRSAENCRYPTION", TeleTrusTObjectIdentifiers.rsaSignatureWithripemd160);
6131+        // algorithms.put("RIPEMD160WITHRSA", TeleTrusTObjectIdentifiers.rsaSignatureWithripemd160);
6132+        // algorithms.put("RIPEMD256WITHRSAENCRYPTION", TeleTrusTObjectIdentifiers.rsaSignatureWithripemd256);
6133+        // algorithms.put("RIPEMD256WITHRSA", TeleTrusTObjectIdentifiers.rsaSignatureWithripemd256);
6134+        // END android-removed
6135         algorithms.put("SHA1WITHDSA", new DERObjectIdentifier("1.2.840.10040.4.3"));
6136         algorithms.put("DSAWITHSHA1", new DERObjectIdentifier("1.2.840.10040.4.3"));
6137-        algorithms.put("SHA224WITHDSA", NISTObjectIdentifiers.dsa_with_sha224);
6138+        // BEGIN android-removed
6139+        // algorithms.put("SHA224WITHDSA", NISTObjectIdentifiers.dsa_with_sha224);
6140+        // END android-removed
6141         algorithms.put("SHA256WITHDSA", NISTObjectIdentifiers.dsa_with_sha256);
6142         algorithms.put("SHA384WITHDSA", NISTObjectIdentifiers.dsa_with_sha384);
6143         algorithms.put("SHA512WITHDSA", NISTObjectIdentifiers.dsa_with_sha512);
6144         algorithms.put("SHA1WITHECDSA", X9ObjectIdentifiers.ecdsa_with_SHA1);
6145-        algorithms.put("SHA224WITHECDSA", X9ObjectIdentifiers.ecdsa_with_SHA224);
6146+        // BEGIN android-removed
6147+        // algorithms.put("SHA224WITHECDSA", X9ObjectIdentifiers.ecdsa_with_SHA224);
6148+        // END android-removed
6149         algorithms.put("SHA256WITHECDSA", X9ObjectIdentifiers.ecdsa_with_SHA256);
6150         algorithms.put("SHA384WITHECDSA", X9ObjectIdentifiers.ecdsa_with_SHA384);
6151         algorithms.put("SHA512WITHECDSA", X9ObjectIdentifiers.ecdsa_with_SHA512);
6152         algorithms.put("ECDSAWITHSHA1", X9ObjectIdentifiers.ecdsa_with_SHA1);
6153-        algorithms.put("GOST3411WITHGOST3410", CryptoProObjectIdentifiers.gostR3411_94_with_gostR3410_94);
6154-        algorithms.put("GOST3410WITHGOST3411", CryptoProObjectIdentifiers.gostR3411_94_with_gostR3410_94);
6155-        algorithms.put("GOST3411WITHECGOST3410", CryptoProObjectIdentifiers.gostR3411_94_with_gostR3410_2001);
6156-        algorithms.put("GOST3411WITHECGOST3410-2001", CryptoProObjectIdentifiers.gostR3411_94_with_gostR3410_2001);
6157-        algorithms.put("GOST3411WITHGOST3410-2001", CryptoProObjectIdentifiers.gostR3411_94_with_gostR3410_2001);
6158+        // BEGIN android-removed
6159+        // algorithms.put("GOST3411WITHGOST3410", CryptoProObjectIdentifiers.gostR3411_94_with_gostR3410_94);
6160+        // algorithms.put("GOST3410WITHGOST3411", CryptoProObjectIdentifiers.gostR3411_94_with_gostR3410_94);
6161+        // algorithms.put("GOST3411WITHECGOST3410", CryptoProObjectIdentifiers.gostR3411_94_with_gostR3410_2001);
6162+        // algorithms.put("GOST3411WITHECGOST3410-2001", CryptoProObjectIdentifiers.gostR3411_94_with_gostR3410_2001);
6163+        // algorithms.put("GOST3411WITHGOST3410-2001", CryptoProObjectIdentifiers.gostR3411_94_with_gostR3410_2001);
6164+        // END android-removed
6165 
6166         //
6167         // reverse mappings
6168         //
6169         oids.put(new DERObjectIdentifier("1.2.840.113549.1.1.5"), "SHA1WITHRSA");
6170-        oids.put(PKCSObjectIdentifiers.sha224WithRSAEncryption, "SHA224WITHRSA");
6171+        // BEGIN android-removed
6172+        // oids.put(PKCSObjectIdentifiers.sha224WithRSAEncryption, "SHA224WITHRSA");
6173+        // END android-removed
6174         oids.put(PKCSObjectIdentifiers.sha256WithRSAEncryption, "SHA256WITHRSA");
6175         oids.put(PKCSObjectIdentifiers.sha384WithRSAEncryption, "SHA384WITHRSA");
6176         oids.put(PKCSObjectIdentifiers.sha512WithRSAEncryption, "SHA512WITHRSA");
6177-        oids.put(CryptoProObjectIdentifiers.gostR3411_94_with_gostR3410_94, "GOST3411WITHGOST3410");
6178-        oids.put(CryptoProObjectIdentifiers.gostR3411_94_with_gostR3410_2001, "GOST3411WITHECGOST3410");
6179+        // BEGIN android-removed
6180+        // oids.put(CryptoProObjectIdentifiers.gostR3411_94_with_gostR3410_94, "GOST3411WITHGOST3410");
6181+        // oids.put(CryptoProObjectIdentifiers.gostR3411_94_with_gostR3410_2001, "GOST3411WITHECGOST3410");
6182+        // END android-removed
6183         
6184         oids.put(new DERObjectIdentifier("1.2.840.113549.1.1.4"), "MD5WITHRSA");
6185-        oids.put(new DERObjectIdentifier("1.2.840.113549.1.1.2"), "MD2WITHRSA");
6186+        // BEGIN android-removed
6187+        // Dropping MD2
6188+        // oids.put(new DERObjectIdentifier("1.2.840.113549.1.1.2"), "MD2WITHRSA");
6189+        // END android-removed
6190         oids.put(new DERObjectIdentifier("1.2.840.10040.4.3"), "SHA1WITHDSA");
6191         oids.put(X9ObjectIdentifiers.ecdsa_with_SHA1, "SHA1WITHECDSA");
6192-        oids.put(X9ObjectIdentifiers.ecdsa_with_SHA224, "SHA224WITHECDSA");
6193+        // BEGIN android-removed
6194+        // oids.put(X9ObjectIdentifiers.ecdsa_with_SHA224, "SHA224WITHECDSA");
6195+        // END android-removed
6196         oids.put(X9ObjectIdentifiers.ecdsa_with_SHA256, "SHA256WITHECDSA");
6197         oids.put(X9ObjectIdentifiers.ecdsa_with_SHA384, "SHA384WITHECDSA");
6198         oids.put(X9ObjectIdentifiers.ecdsa_with_SHA512, "SHA512WITHECDSA");
6199         oids.put(OIWObjectIdentifiers.sha1WithRSA, "SHA1WITHRSA");
6200         oids.put(OIWObjectIdentifiers.dsaWithSHA1, "SHA1WITHDSA");
6201-        oids.put(NISTObjectIdentifiers.dsa_with_sha224, "SHA224WITHDSA");
6202+        // BEGIN android-removed
6203+        // oids.put(NISTObjectIdentifiers.dsa_with_sha224, "SHA224WITHDSA");
6204+        // END android-removed
6205         oids.put(NISTObjectIdentifiers.dsa_with_sha256, "SHA256WITHDSA");
6206         
6207         //
6208@@ -161,35 +191,53 @@
6209         // The parameters field SHALL be NULL for RSA based signature algorithms.
6210         //
6211         noParams.add(X9ObjectIdentifiers.ecdsa_with_SHA1);
6212-        noParams.add(X9ObjectIdentifiers.ecdsa_with_SHA224);
6213+        // BEGIN android-removed
6214+        // noParams.add(X9ObjectIdentifiers.ecdsa_with_SHA224);
6215+        // END android-removed
6216         noParams.add(X9ObjectIdentifiers.ecdsa_with_SHA256);
6217         noParams.add(X9ObjectIdentifiers.ecdsa_with_SHA384);
6218         noParams.add(X9ObjectIdentifiers.ecdsa_with_SHA512);
6219         noParams.add(X9ObjectIdentifiers.id_dsa_with_sha1);
6220-        noParams.add(NISTObjectIdentifiers.dsa_with_sha224);
6221+        // BEGIN android-removed
6222+        // noParams.add(NISTObjectIdentifiers.dsa_with_sha224);
6223+        // END android-removed
6224         noParams.add(NISTObjectIdentifiers.dsa_with_sha256);
6225 
6226         //
6227         // RFC 4491
6228         //
6229-        noParams.add(CryptoProObjectIdentifiers.gostR3411_94_with_gostR3410_94);
6230-        noParams.add(CryptoProObjectIdentifiers.gostR3411_94_with_gostR3410_2001);
6231+        // BEGIN android-removed
6232+        // noParams.add(CryptoProObjectIdentifiers.gostR3411_94_with_gostR3410_94);
6233+        // noParams.add(CryptoProObjectIdentifiers.gostR3411_94_with_gostR3410_2001);
6234+        // END android-removed
6235         //
6236         // explicit params
6237         //
6238-        AlgorithmIdentifier sha1AlgId = new AlgorithmIdentifier(OIWObjectIdentifiers.idSHA1, new DERNull());
6239+        // BEGIN android-changed
6240+        AlgorithmIdentifier sha1AlgId = new AlgorithmIdentifier(OIWObjectIdentifiers.idSHA1, DERNull.INSTANCE);
6241+        // END android-changed
6242         params.put("SHA1WITHRSAANDMGF1", creatPSSParams(sha1AlgId, 20));
6243 
6244-        AlgorithmIdentifier sha224AlgId = new AlgorithmIdentifier(NISTObjectIdentifiers.id_sha224, new DERNull());
6245-        params.put("SHA224WITHRSAANDMGF1", creatPSSParams(sha224AlgId, 28));
6246-
6247-        AlgorithmIdentifier sha256AlgId = new AlgorithmIdentifier(NISTObjectIdentifiers.id_sha256, new DERNull());
6248+        // BEGIN android-removed
6249+        // // BEGIN android-changed
6250+        // AlgorithmIdentifier sha224AlgId = new AlgorithmIdentifier(NISTObjectIdentifiers.id_sha224, DERNull.INSTANCE);
6251+        // // END android-changed
6252+        // params.put("SHA224WITHRSAANDMGF1", creatPSSParams(sha224AlgId, 28));
6253+        // END android-removed
6254+
6255+        // BEGIN android-changed
6256+        AlgorithmIdentifier sha256AlgId = new AlgorithmIdentifier(NISTObjectIdentifiers.id_sha256, DERNull.INSTANCE);
6257+        // END android-changed
6258         params.put("SHA256WITHRSAANDMGF1", creatPSSParams(sha256AlgId, 32));
6259 
6260-        AlgorithmIdentifier sha384AlgId = new AlgorithmIdentifier(NISTObjectIdentifiers.id_sha384, new DERNull());
6261+        // BEGIN android-changed
6262+        AlgorithmIdentifier sha384AlgId = new AlgorithmIdentifier(NISTObjectIdentifiers.id_sha384, DERNull.INSTANCE);
6263+        // END android-changed
6264         params.put("SHA384WITHRSAANDMGF1", creatPSSParams(sha384AlgId, 48));
6265 
6266-        AlgorithmIdentifier sha512AlgId = new AlgorithmIdentifier(NISTObjectIdentifiers.id_sha512, new DERNull());
6267+        // BEGIN android-changed
6268+        AlgorithmIdentifier sha512AlgId = new AlgorithmIdentifier(NISTObjectIdentifiers.id_sha512, DERNull.INSTANCE);
6269+        // END android-changed
6270         params.put("SHA512WITHRSAANDMGF1", creatPSSParams(sha512AlgId, 64));
6271     }
6272 
6273@@ -595,10 +643,12 @@
6274         {
6275             return "SHA1";
6276         }
6277-        else if (NISTObjectIdentifiers.id_sha224.equals(digestAlgOID))
6278-        {
6279-            return "SHA224";
6280-        }
6281+        // BEGIN android-removed
6282+        // else if (NISTObjectIdentifiers.id_sha224.equals(digestAlgOID))
6283+        // {
6284+        //     return "SHA224";
6285+        // }
6286+        // END android-removed
6287         else if (NISTObjectIdentifiers.id_sha256.equals(digestAlgOID))
6288         {
6289             return "SHA256";
6290@@ -611,22 +661,24 @@
6291         {
6292             return "SHA512";
6293         }
6294-        else if (TeleTrusTObjectIdentifiers.ripemd128.equals(digestAlgOID))
6295-        {
6296-            return "RIPEMD128";
6297-        }
6298-        else if (TeleTrusTObjectIdentifiers.ripemd160.equals(digestAlgOID))
6299-        {
6300-            return "RIPEMD160";
6301-        }
6302-        else if (TeleTrusTObjectIdentifiers.ripemd256.equals(digestAlgOID))
6303-        {
6304-            return "RIPEMD256";
6305-        }
6306-        else if (CryptoProObjectIdentifiers.gostR3411.equals(digestAlgOID))
6307-        {
6308-            return "GOST3411";
6309-        }
6310+        // BEGIN android-removed
6311+        // else if (TeleTrusTObjectIdentifiers.ripemd128.equals(digestAlgOID))
6312+        // {
6313+        //     return "RIPEMD128";
6314+        // }
6315+        // else if (TeleTrusTObjectIdentifiers.ripemd160.equals(digestAlgOID))
6316+        // {
6317+        //     return "RIPEMD160";
6318+        // }
6319+        // else if (TeleTrusTObjectIdentifiers.ripemd256.equals(digestAlgOID))
6320+        // {
6321+        //     return "RIPEMD256";
6322+        // }
6323+        // else if (CryptoProObjectIdentifiers.gostR3411.equals(digestAlgOID))
6324+        // {
6325+        //     return "GOST3411";
6326+        // }
6327+        // END android-removed
6328         else
6329         {
6330             return digestAlgOID.getId();            
6331diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/jce/provider/BouncyCastleProvider.java bcprov-jdk15on-147/org/bouncycastle/jce/provider/BouncyCastleProvider.java
6332--- bcprov-jdk15on-147.orig/org/bouncycastle/jce/provider/BouncyCastleProvider.java	2012-03-22 15:11:48.000000000 +0000
6333+++ bcprov-jdk15on-147/org/bouncycastle/jce/provider/BouncyCastleProvider.java	2012-09-19 21:17:12.000000000 +0000
6334@@ -48,7 +48,10 @@
6335 {
6336     private static String info = "BouncyCastle Security Provider v1.47";
6337 
6338-    public static String PROVIDER_NAME = "BC";
6339+    // BEGIN android-changed
6340+    //     this constant should be final
6341+    public static final String PROVIDER_NAME = "BC";
6342+    // END android-changed
6343 
6344     public static final ProviderConfiguration CONFIGURATION = new BouncyCastleProviderConfiguration();
6345 
6346@@ -61,8 +64,13 @@
6347     private static final String SYMMETRIC_CIPHER_PACKAGE = "org.bouncycastle.jcajce.provider.symmetric.";
6348     private static final String[] SYMMETRIC_CIPHERS =
6349     {
6350-        "AES", "ARC4", "Blowfish", "Camellia", "CAST5", "CAST6", "DES", "DESede", "GOST28147", "Grainv1", "Grain128", "HC128", "HC256", "IDEA",
6351-        "Noekeon", "RC2", "RC5", "RC6", "Rijndael", "Salsa20", "SEED", "Serpent", "Skipjack", "TEA", "Twofish", "VMPC", "VMPCKSA3", "XTEA"
6352+        // BEGIN android-removed
6353+        // "AES", "ARC4", "Blowfish", "Camellia", "CAST5", "CAST6", "DES", "DESede", "GOST28147", "Grainv1", "Grain128", "HC128", "HC256", "IDEA",
6354+        // "Noekeon", "RC2", "RC5", "RC6", "Rijndael", "Salsa20", "SEED", "Serpent", "Skipjack", "TEA", "Twofish", "VMPC", "VMPCKSA3", "XTEA"
6355+        // END android-removed
6356+        // BEGIN android-added
6357+        "AES", "ARC4", "Blowfish", "DES", "DESede",
6358+        // END android-added
6359     };
6360 
6361      /*
6362@@ -79,7 +87,12 @@
6363 
6364     private static final String[] ASYMMETRIC_CIPHERS =
6365     {
6366-        "DSA", "DH", "EC", "RSA", "GOST", "ECGOST", "ElGamal"
6367+        // BEGIN android-removed
6368+        // "DSA", "DH", "EC", "RSA", "GOST", "ECGOST", "ElGamal"
6369+        // END android-removed
6370+        // BEGIN android-added
6371+        "DSA", "DH", "EC", "RSA",
6372+        // END android-added
6373     };
6374 
6375     /*
6376@@ -88,7 +101,12 @@
6377     private static final String DIGEST_PACKAGE = "org.bouncycastle.jcajce.provider.digest.";
6378     private static final String[] DIGESTS =
6379     {
6380-        "GOST3411", "MD2", "MD4", "MD5", "SHA1", "RIPEMD128", "RIPEMD160", "RIPEMD256", "RIPEMD320", "SHA224", "SHA256", "SHA384", "SHA512", "Tiger", "Whirlpool"
6381+        // BEGIN android-removed
6382+        // "GOST3411", "MD2", "MD4", "MD5", "SHA1", "RIPEMD128", "RIPEMD160", "RIPEMD256", "RIPEMD320", "SHA224", "SHA256", "SHA384", "SHA512", "Tiger", "Whirlpool"
6383+        // END android-removed
6384+        // BEGIN android-added
6385+        "MD5", "SHA1", "SHA256", "SHA384", "SHA512",
6386+        // END android-added
6387     };
6388 
6389     /**
6390@@ -120,26 +138,28 @@
6391 
6392         loadAlgorithms(ASYMMETRIC_CIPHER_PACKAGE, ASYMMETRIC_CIPHERS);
6393 
6394-        //
6395-        // X509Store
6396-        //
6397-        put("X509Store.CERTIFICATE/COLLECTION", "org.bouncycastle.jce.provider.X509StoreCertCollection");
6398-        put("X509Store.ATTRIBUTECERTIFICATE/COLLECTION", "org.bouncycastle.jce.provider.X509StoreAttrCertCollection");
6399-        put("X509Store.CRL/COLLECTION", "org.bouncycastle.jce.provider.X509StoreCRLCollection");
6400-        put("X509Store.CERTIFICATEPAIR/COLLECTION", "org.bouncycastle.jce.provider.X509StoreCertPairCollection");
6401-
6402-        put("X509Store.CERTIFICATE/LDAP", "org.bouncycastle.jce.provider.X509StoreLDAPCerts");
6403-        put("X509Store.CRL/LDAP", "org.bouncycastle.jce.provider.X509StoreLDAPCRLs");
6404-        put("X509Store.ATTRIBUTECERTIFICATE/LDAP", "org.bouncycastle.jce.provider.X509StoreLDAPAttrCerts");
6405-        put("X509Store.CERTIFICATEPAIR/LDAP", "org.bouncycastle.jce.provider.X509StoreLDAPCertPairs");
6406-        
6407-        //
6408-        // X509StreamParser
6409-        //
6410-        put("X509StreamParser.CERTIFICATE", "org.bouncycastle.jce.provider.X509CertParser");
6411-        put("X509StreamParser.ATTRIBUTECERTIFICATE", "org.bouncycastle.jce.provider.X509AttrCertParser");
6412-        put("X509StreamParser.CRL", "org.bouncycastle.jce.provider.X509CRLParser");
6413-        put("X509StreamParser.CERTIFICATEPAIR", "org.bouncycastle.jce.provider.X509CertPairParser");
6414+        // BEGIN android-removed
6415+        // //
6416+        // // X509Store
6417+        // //
6418+        // put("X509Store.CERTIFICATE/COLLECTION", "org.bouncycastle.jce.provider.X509StoreCertCollection");
6419+        // put("X509Store.ATTRIBUTECERTIFICATE/COLLECTION", "org.bouncycastle.jce.provider.X509StoreAttrCertCollection");
6420+        // put("X509Store.CRL/COLLECTION", "org.bouncycastle.jce.provider.X509StoreCRLCollection");
6421+        // put("X509Store.CERTIFICATEPAIR/COLLECTION", "org.bouncycastle.jce.provider.X509StoreCertPairCollection");
6422+        //
6423+        // put("X509Store.CERTIFICATE/LDAP", "org.bouncycastle.jce.provider.X509StoreLDAPCerts");
6424+        // put("X509Store.CRL/LDAP", "org.bouncycastle.jce.provider.X509StoreLDAPCRLs");
6425+        // put("X509Store.ATTRIBUTECERTIFICATE/LDAP", "org.bouncycastle.jce.provider.X509StoreLDAPAttrCerts");
6426+        // put("X509Store.CERTIFICATEPAIR/LDAP", "org.bouncycastle.jce.provider.X509StoreLDAPCertPairs");
6427+        //
6428+        // //
6429+        // // X509StreamParser
6430+        // //
6431+        // put("X509StreamParser.CERTIFICATE", "org.bouncycastle.jce.provider.X509CertParser");
6432+        // put("X509StreamParser.ATTRIBUTECERTIFICATE", "org.bouncycastle.jce.provider.X509AttrCertParser");
6433+        // put("X509StreamParser.CRL", "org.bouncycastle.jce.provider.X509CRLParser");
6434+        // put("X509StreamParser.CERTIFICATEPAIR", "org.bouncycastle.jce.provider.X509CertPairParser");
6435+        // END android-removed
6436 
6437 
6438         //
6439@@ -148,14 +168,24 @@
6440         put("KeyStore.BKS", "org.bouncycastle.jce.provider.JDKKeyStore");
6441         put("KeyStore.BouncyCastle", "org.bouncycastle.jce.provider.JDKKeyStore$BouncyCastleStore");
6442         put("KeyStore.PKCS12", "org.bouncycastle.jce.provider.JDKPKCS12KeyStore$BCPKCS12KeyStore");
6443-        put("KeyStore.BCPKCS12", "org.bouncycastle.jce.provider.JDKPKCS12KeyStore$BCPKCS12KeyStore");
6444-        put("KeyStore.PKCS12-DEF", "org.bouncycastle.jce.provider.JDKPKCS12KeyStore$DefPKCS12KeyStore");
6445-
6446-        put("KeyStore.PKCS12-3DES-40RC2", "org.bouncycastle.jce.provider.JDKPKCS12KeyStore$BCPKCS12KeyStore");
6447-        put("KeyStore.PKCS12-3DES-3DES", "org.bouncycastle.jce.provider.JDKPKCS12KeyStore$BCPKCS12KeyStore3DES");
6448-
6449-        put("KeyStore.PKCS12-DEF-3DES-40RC2", "org.bouncycastle.jce.provider.JDKPKCS12KeyStore$DefPKCS12KeyStore");
6450-        put("KeyStore.PKCS12-DEF-3DES-3DES", "org.bouncycastle.jce.provider.JDKPKCS12KeyStore$DefPKCS12KeyStore3DES");
6451+        // BEGIN android-changed
6452+        put("Alg.Alias.KeyStore.BCPKCS12", "PKCS12");
6453+        // END android-changed
6454+        // BEGIN android-removed
6455+        // put("KeyStore.PKCS12-DEF", "org.bouncycastle.jce.provider.JDKPKCS12KeyStore$DefPKCS12KeyStore");
6456+        // END android-removed
6457+
6458+        // BEGIN android-changed
6459+        put("Alg.Alias.KeyStore.PKCS12-3DES-40RC2", "PKCS12");
6460+        // END android-changed
6461+        // BEGIN android-removed
6462+        // put("KeyStore.PKCS12-3DES-3DES", "org.bouncycastle.jce.provider.JDKPKCS12KeyStore$BCPKCS12KeyStore3DES");
6463+        // END android-removed
6464+
6465+        // BEGIN android-removed
6466+        // put("KeyStore.PKCS12-DEF-3DES-40RC2", "org.bouncycastle.jce.provider.JDKPKCS12KeyStore$DefPKCS12KeyStore");
6467+        // put("KeyStore.PKCS12-DEF-3DES-3DES", "org.bouncycastle.jce.provider.JDKPKCS12KeyStore$DefPKCS12KeyStore3DES");
6468+        // END android-removed
6469 
6470         put("Alg.Alias.KeyStore.UBER", "BouncyCastle");
6471         put("Alg.Alias.KeyStore.BOUNCYCASTLE", "BouncyCastle");
6472@@ -164,29 +194,41 @@
6473         //
6474         // algorithm parameters
6475         //
6476-        put("AlgorithmParameters.IES", "org.bouncycastle.jce.provider.JDKAlgorithmParameters$IES");
6477+        // BEGIN android-removed
6478+        // put("AlgorithmParameters.IES", "org.bouncycastle.jce.provider.JDKAlgorithmParameters$IES");
6479+        // END android-removed
6480         put("AlgorithmParameters.PKCS12PBE", "org.bouncycastle.jce.provider.JDKAlgorithmParameters$PKCS12PBE");
6481 
6482-        put("AlgorithmParameters." + PKCSObjectIdentifiers.id_PBKDF2, "org.bouncycastle.jce.provider.JDKAlgorithmParameters$PBKDF2");
6483+        // BEGIN android-removed
6484+        // put("AlgorithmParameters." + PKCSObjectIdentifiers.id_PBKDF2, "org.bouncycastle.jce.provider.JDKAlgorithmParameters$PBKDF2");
6485+        // END android-removed
6486 
6487 
6488         put("Alg.Alias.AlgorithmParameters.PBEWITHSHA1ANDRC2", "PKCS12PBE");
6489-        put("Alg.Alias.AlgorithmParameters.PBEWITHSHAAND3-KEYTRIPLEDES", "PKCS12PBE");
6490-        put("Alg.Alias.AlgorithmParameters.PBEWITHSHAAND2-KEYTRIPLEDES", "PKCS12PBE");
6491-        put("Alg.Alias.AlgorithmParameters.PBEWITHSHAANDRC2", "PKCS12PBE");
6492-        put("Alg.Alias.AlgorithmParameters.PBEWITHSHAANDRC4", "PKCS12PBE");
6493+        // BEGIN android-removed
6494+        // put("Alg.Alias.AlgorithmParameters.PBEWITHSHAAND3-KEYTRIPLEDES", "PKCS12PBE");
6495+        // put("Alg.Alias.AlgorithmParameters.PBEWITHSHAAND2-KEYTRIPLEDES", "PKCS12PBE");
6496+        // put("Alg.Alias.AlgorithmParameters.PBEWITHSHAANDRC2", "PKCS12PBE");
6497+        // put("Alg.Alias.AlgorithmParameters.PBEWITHSHAANDRC4", "PKCS12PBE");
6498+        // END android-removed
6499         put("Alg.Alias.AlgorithmParameters.PBEWITHSHAANDTWOFISH", "PKCS12PBE");
6500-        put("Alg.Alias.AlgorithmParameters.PBEWITHSHA1ANDRC2-CBC", "PKCS12PBE");
6501+        // BEGIN android-removed
6502+        // put("Alg.Alias.AlgorithmParameters.PBEWITHSHA1ANDRC2-CBC", "PKCS12PBE");
6503+        // END android-removed
6504         put("Alg.Alias.AlgorithmParameters.PBEWITHSHAAND3-KEYTRIPLEDES-CBC", "PKCS12PBE");
6505         put("Alg.Alias.AlgorithmParameters.PBEWITHSHAAND2-KEYTRIPLEDES-CBC", "PKCS12PBE");
6506-        put("Alg.Alias.AlgorithmParameters.PBEWITHSHAANDDES3KEY-CBC", "PKCS12PBE");
6507-        put("Alg.Alias.AlgorithmParameters.PBEWITHSHAANDDES2KEY-CBC", "PKCS12PBE");
6508+        // BEGIN android-removed
6509+        // put("Alg.Alias.AlgorithmParameters.PBEWITHSHAANDDES3KEY-CBC", "PKCS12PBE");
6510+        // put("Alg.Alias.AlgorithmParameters.PBEWITHSHAANDDES2KEY-CBC", "PKCS12PBE");
6511+        // END android-removed
6512         put("Alg.Alias.AlgorithmParameters.PBEWITHSHAAND40BITRC2-CBC", "PKCS12PBE");
6513         put("Alg.Alias.AlgorithmParameters.PBEWITHSHAAND40BITRC4", "PKCS12PBE");
6514         put("Alg.Alias.AlgorithmParameters.PBEWITHSHAAND128BITRC2-CBC", "PKCS12PBE");
6515         put("Alg.Alias.AlgorithmParameters.PBEWITHSHAAND128BITRC4", "PKCS12PBE");
6516         put("Alg.Alias.AlgorithmParameters.PBEWITHSHAANDTWOFISH", "PKCS12PBE");
6517-        put("Alg.Alias.AlgorithmParameters.PBEWITHSHAANDTWOFISH-CBC", "PKCS12PBE");
6518+        // BEGIN android-removed
6519+        // put("Alg.Alias.AlgorithmParameters.PBEWITHSHAANDTWOFISH-CBC", "PKCS12PBE");
6520+        // END android-removed
6521         put("Alg.Alias.AlgorithmParameters.1.2.840.113549.1.12.1.1", "PKCS12PBE");
6522         put("Alg.Alias.AlgorithmParameters.1.2.840.113549.1.12.1.2", "PKCS12PBE");
6523         put("Alg.Alias.AlgorithmParameters.1.2.840.113549.1.12.1.3", "PKCS12PBE");
6524@@ -217,12 +259,14 @@
6525         put("Alg.Alias.AlgorithmParameters.PBEWITHSHA-256AND128BITAES-CBC-BC","PKCS12PBE");
6526         put("Alg.Alias.AlgorithmParameters.PBEWITHSHA-256AND192BITAES-CBC-BC","PKCS12PBE");
6527         put("Alg.Alias.AlgorithmParameters.PBEWITHSHA-256AND256BITAES-CBC-BC","PKCS12PBE");
6528-
6529-        put("AlgorithmParameters.SHA1WITHECDSA", "org.bouncycastle.jce.provider.JDKECDSAAlgParameters$SigAlgParameters");
6530-        put("AlgorithmParameters.SHA224WITHECDSA", "org.bouncycastle.jce.provider.JDKECDSAAlgParameters$SigAlgParameters");
6531-        put("AlgorithmParameters.SHA256WITHECDSA", "org.bouncycastle.jce.provider.JDKECDSAAlgParameters$SigAlgParameters");
6532-        put("AlgorithmParameters.SHA384WITHECDSA", "org.bouncycastle.jce.provider.JDKECDSAAlgParameters$SigAlgParameters");
6533-        put("AlgorithmParameters.SHA512WITHECDSA", "org.bouncycastle.jce.provider.JDKECDSAAlgParameters$SigAlgParameters");
6534+        
6535+        // BEGIN android-removed
6536+        // put("AlgorithmParameters.SHA1WITHECDSA", "org.bouncycastle.jce.provider.JDKECDSAAlgParameters$SigAlgParameters");
6537+        // put("AlgorithmParameters.SHA224WITHECDSA", "org.bouncycastle.jce.provider.JDKECDSAAlgParameters$SigAlgParameters");
6538+        // put("AlgorithmParameters.SHA256WITHECDSA", "org.bouncycastle.jce.provider.JDKECDSAAlgParameters$SigAlgParameters");
6539+        // put("AlgorithmParameters.SHA384WITHECDSA", "org.bouncycastle.jce.provider.JDKECDSAAlgParameters$SigAlgParameters");
6540+        // put("AlgorithmParameters.SHA512WITHECDSA", "org.bouncycastle.jce.provider.JDKECDSAAlgParameters$SigAlgParameters");
6541+        // END android-removed
6542         
6543         //
6544         // key agreement
6545@@ -235,16 +279,22 @@
6546         put("Alg.Alias.Cipher.PBEWithSHAAnd3KeyTripleDES",  "PBEWITHSHAAND3-KEYTRIPLEDES-CBC");
6547         
6548 
6549-        put("Cipher.ECIES", "org.bouncycastle.jce.provider.JCEIESCipher$ECIES");
6550-        put("Cipher.BrokenECIES", "org.bouncycastle.jce.provider.JCEIESCipher$BrokenECIES");
6551-        put("Cipher.IES", "org.bouncycastle.jce.provider.JCEIESCipher$IES");
6552-        put("Cipher.BrokenIES", "org.bouncycastle.jce.provider.JCEIESCipher$BrokenIES");
6553+        // BEGIN android-removed
6554+        // put("Cipher.ECIES", "org.bouncycastle.jce.provider.JCEIESCipher$ECIES");
6555+        // put("Cipher.BrokenECIES", "org.bouncycastle.jce.provider.JCEIESCipher$BrokenECIES");
6556+        // put("Cipher.IES", "org.bouncycastle.jce.provider.JCEIESCipher$IES");
6557+        // put("Cipher.BrokenIES", "org.bouncycastle.jce.provider.JCEIESCipher$BrokenIES");
6558+        // END android-removed
6559 
6560         put("Cipher.PBEWITHMD5ANDDES", "org.bouncycastle.jce.provider.JCEBlockCipher$PBEWithMD5AndDES");
6561-        put("Cipher.BROKENPBEWITHMD5ANDDES", "org.bouncycastle.jce.provider.BrokenJCEBlockCipher$BrokePBEWithMD5AndDES");
6562+        // BEGIN android-removed
6563+        // put("Cipher.BROKENPBEWITHMD5ANDDES", "org.bouncycastle.jce.provider.BrokenJCEBlockCipher$BrokePBEWithMD5AndDES");
6564+        // END android-removed
6565         put("Cipher.PBEWITHMD5ANDRC2", "org.bouncycastle.jce.provider.JCEBlockCipher$PBEWithMD5AndRC2");
6566         put("Cipher.PBEWITHSHA1ANDDES", "org.bouncycastle.jce.provider.JCEBlockCipher$PBEWithSHA1AndDES");
6567-        put("Cipher.BROKENPBEWITHSHA1ANDDES", "org.bouncycastle.jce.provider.BrokenJCEBlockCipher$BrokePBEWithSHA1AndDES");
6568+        // BEGIN android-removed
6569+        // put("Cipher.BROKENPBEWITHSHA1ANDDES", "org.bouncycastle.jce.provider.BrokenJCEBlockCipher$BrokePBEWithSHA1AndDES");
6570+        // END android-removed
6571         put("Cipher.PBEWITHSHA1ANDRC2", "org.bouncycastle.jce.provider.JCEBlockCipher$PBEWithSHA1AndRC2");
6572 
6573         put("Cipher.PBEWITHSHAAND128BITRC2-CBC", "org.bouncycastle.jce.provider.JCEBlockCipher$PBEWithSHAAnd128BitRC2");
6574@@ -286,10 +336,12 @@
6575         put("Cipher.PBEWITHMD5AND256BITAES-CBC-OPENSSL", "org.bouncycastle.jce.provider.JCEBlockCipher$PBEWithAESCBC");
6576         
6577         put("Cipher.PBEWITHSHAANDTWOFISH-CBC", "org.bouncycastle.jce.provider.JCEBlockCipher$PBEWithSHAAndTwofish");
6578-        put("Cipher.OLDPBEWITHSHAANDTWOFISH-CBC", "org.bouncycastle.jce.provider.BrokenJCEBlockCipher$OldPBEWithSHAAndTwofish");
6579-
6580-        put("Alg.Alias.Cipher." + PKCSObjectIdentifiers.pbeWithMD2AndDES_CBC, "PBEWITHMD2ANDDES");
6581-        put("Alg.Alias.Cipher." + PKCSObjectIdentifiers.pbeWithMD2AndRC2_CBC, "PBEWITHMD2ANDRC2");
6582+        // BEGIN android-removed
6583+        // put("Cipher.OLDPBEWITHSHAANDTWOFISH-CBC", "org.bouncycastle.jce.provider.BrokenJCEBlockCipher$OldPBEWithSHAAndTwofish");
6584+        //
6585+        // put("Alg.Alias.Cipher." + PKCSObjectIdentifiers.pbeWithMD2AndDES_CBC, "PBEWITHMD2ANDDES");
6586+        // put("Alg.Alias.Cipher." + PKCSObjectIdentifiers.pbeWithMD2AndRC2_CBC, "PBEWITHMD2ANDRC2");
6587+        // END android-removed
6588         put("Alg.Alias.Cipher." + PKCSObjectIdentifiers.pbeWithMD5AndDES_CBC, "PBEWITHMD5ANDDES");
6589         put("Alg.Alias.Cipher." + PKCSObjectIdentifiers.pbeWithMD5AndRC2_CBC, "PBEWITHMD5ANDDES");
6590         put("Alg.Alias.Cipher." + PKCSObjectIdentifiers.pbeWithSHA1AndDES_CBC, "PBEWITHSHA1ANDDES");
6591@@ -326,16 +378,20 @@
6592         //
6593         // secret key factories.
6594         //
6595-        put("SecretKeyFactory.PBEWITHMD2ANDDES", "org.bouncycastle.jce.provider.JCESecretKeyFactory$PBEWithMD2AndDES");
6596-
6597-        put("Alg.Alias.SecretKeyFactory." + PKCSObjectIdentifiers.pbeWithMD2AndDES_CBC, "PBEWITHMD2ANDDES");
6598-        put("Alg.Alias.SecretKeyFactory." + PKCSObjectIdentifiers.pbeWithMD2AndRC2_CBC, "PBEWITHMD2ANDRC2");
6599+        // BEGIN android-removed
6600+        // put("SecretKeyFactory.PBEWITHMD2ANDDES", "org.bouncycastle.jce.provider.JCESecretKeyFactory$PBEWithMD2AndDES");
6601+        //
6602+        // put("Alg.Alias.SecretKeyFactory." + PKCSObjectIdentifiers.pbeWithMD2AndDES_CBC, "PBEWITHMD2ANDDES");
6603+        // put("Alg.Alias.SecretKeyFactory." + PKCSObjectIdentifiers.pbeWithMD2AndRC2_CBC, "PBEWITHMD2ANDRC2");
6604+        // END android-removed
6605         put("Alg.Alias.SecretKeyFactory." + PKCSObjectIdentifiers.pbeWithMD5AndDES_CBC, "PBEWITHMD5ANDDES");
6606         put("Alg.Alias.SecretKeyFactory." + PKCSObjectIdentifiers.pbeWithMD5AndRC2_CBC, "PBEWITHMD5ANDDES");
6607         put("Alg.Alias.SecretKeyFactory." + PKCSObjectIdentifiers.pbeWithSHA1AndDES_CBC, "PBEWITHSHA1ANDDES");
6608         put("Alg.Alias.SecretKeyFactory." + PKCSObjectIdentifiers.pbeWithSHA1AndRC2_CBC, "PBEWITHSHA1ANDRC2");
6609 
6610-        put("SecretKeyFactory.PBEWITHMD2ANDRC2", "org.bouncycastle.jce.provider.JCESecretKeyFactory$PBEWithMD2AndRC2");
6611+        // BEGIN android-removed
6612+        // put("SecretKeyFactory.PBEWITHMD2ANDRC2", "org.bouncycastle.jce.provider.JCESecretKeyFactory$PBEWithMD2AndRC2");
6613+        // END android-removed
6614         put("SecretKeyFactory.PBEWITHMD5ANDDES", "org.bouncycastle.jce.provider.JCESecretKeyFactory$PBEWithMD5AndDES");
6615         put("SecretKeyFactory.PBEWITHMD5ANDRC2", "org.bouncycastle.jce.provider.JCESecretKeyFactory$PBEWithMD5AndRC2");
6616         put("SecretKeyFactory.PBEWITHSHA1ANDDES", "org.bouncycastle.jce.provider.JCESecretKeyFactory$PBEWithSHA1AndDES");
6617@@ -347,31 +403,39 @@
6618         put("SecretKeyFactory.PBEWITHSHAAND128BITRC2-CBC", "org.bouncycastle.jce.provider.JCESecretKeyFactory$PBEWithSHAAnd128BitRC2");
6619         put("SecretKeyFactory.PBEWITHSHAAND40BITRC2-CBC", "org.bouncycastle.jce.provider.JCESecretKeyFactory$PBEWithSHAAnd40BitRC2");
6620         put("SecretKeyFactory.PBEWITHSHAANDTWOFISH-CBC", "org.bouncycastle.jce.provider.JCESecretKeyFactory$PBEWithSHAAndTwofish");
6621-        put("SecretKeyFactory.PBEWITHHMACRIPEMD160", "org.bouncycastle.jce.provider.JCESecretKeyFactory$PBEWithRIPEMD160");
6622+        // BEGIN android-removed
6623+        // put("SecretKeyFactory.PBEWITHHMACRIPEMD160", "org.bouncycastle.jce.provider.JCESecretKeyFactory$PBEWithRIPEMD160");
6624+        // END android-removed
6625         put("SecretKeyFactory.PBEWITHHMACSHA1", "org.bouncycastle.jce.provider.JCESecretKeyFactory$PBEWithSHA");
6626-        put("SecretKeyFactory.PBEWITHHMACTIGER", "org.bouncycastle.jce.provider.JCESecretKeyFactory$PBEWithTiger");
6627+        // BEGIN android-removed
6628+        // put("SecretKeyFactory.PBEWITHHMACTIGER", "org.bouncycastle.jce.provider.JCESecretKeyFactory$PBEWithTiger");
6629+        // END android-removed
6630         
6631         put("SecretKeyFactory.PBEWITHMD5AND128BITAES-CBC-OPENSSL", "org.bouncycastle.jce.provider.JCESecretKeyFactory$PBEWithMD5And128BitAESCBCOpenSSL");
6632         put("SecretKeyFactory.PBEWITHMD5AND192BITAES-CBC-OPENSSL", "org.bouncycastle.jce.provider.JCESecretKeyFactory$PBEWithMD5And192BitAESCBCOpenSSL");
6633         put("SecretKeyFactory.PBEWITHMD5AND256BITAES-CBC-OPENSSL", "org.bouncycastle.jce.provider.JCESecretKeyFactory$PBEWithMD5And256BitAESCBCOpenSSL");
6634 
6635-        put("Alg.Alias.SecretKeyFactory.PBE", "PBE/PKCS5");
6636-
6637-        put("Alg.Alias.SecretKeyFactory.BROKENPBEWITHMD5ANDDES", "PBE/PKCS5");
6638-        put("Alg.Alias.SecretKeyFactory.BROKENPBEWITHSHA1ANDDES", "PBE/PKCS5");
6639-        put("Alg.Alias.SecretKeyFactory.OLDPBEWITHSHAAND3-KEYTRIPLEDES-CBC", "PBE/PKCS12");
6640-        put("Alg.Alias.SecretKeyFactory.BROKENPBEWITHSHAAND3-KEYTRIPLEDES-CBC", "PBE/PKCS12");
6641-        put("Alg.Alias.SecretKeyFactory.BROKENPBEWITHSHAAND2-KEYTRIPLEDES-CBC", "PBE/PKCS12");
6642-        put("Alg.Alias.SecretKeyFactory.OLDPBEWITHSHAANDTWOFISH-CBC", "PBE/PKCS12");
6643-
6644-        put("Alg.Alias.SecretKeyFactory.PBEWITHMD2ANDDES-CBC", "PBEWITHMD2ANDDES");
6645-        put("Alg.Alias.SecretKeyFactory.PBEWITHMD2ANDRC2-CBC", "PBEWITHMD2ANDRC2");
6646+        // BEGIN android-removed
6647+        // put("Alg.Alias.SecretKeyFactory.PBE", "PBE/PKCS5");
6648+        //
6649+        // put("Alg.Alias.SecretKeyFactory.BROKENPBEWITHMD5ANDDES", "PBE/PKCS5");
6650+        // put("Alg.Alias.SecretKeyFactory.BROKENPBEWITHSHA1ANDDES", "PBE/PKCS5");
6651+        // put("Alg.Alias.SecretKeyFactory.OLDPBEWITHSHAAND3-KEYTRIPLEDES-CBC", "PBE/PKCS12");
6652+        // put("Alg.Alias.SecretKeyFactory.BROKENPBEWITHSHAAND3-KEYTRIPLEDES-CBC", "PBE/PKCS12");
6653+        // put("Alg.Alias.SecretKeyFactory.BROKENPBEWITHSHAAND2-KEYTRIPLEDES-CBC", "PBE/PKCS12");
6654+        // put("Alg.Alias.SecretKeyFactory.OLDPBEWITHSHAANDTWOFISH-CBC", "PBE/PKCS12");
6655+        //
6656+        // put("Alg.Alias.SecretKeyFactory.PBEWITHMD2ANDDES-CBC", "PBEWITHMD2ANDDES");
6657+        // put("Alg.Alias.SecretKeyFactory.PBEWITHMD2ANDRC2-CBC", "PBEWITHMD2ANDRC2");
6658+        // END android-removed
6659         put("Alg.Alias.SecretKeyFactory.PBEWITHMD5ANDDES-CBC", "PBEWITHMD5ANDDES");
6660         put("Alg.Alias.SecretKeyFactory.PBEWITHMD5ANDRC2-CBC", "PBEWITHMD5ANDRC2");
6661         put("Alg.Alias.SecretKeyFactory.PBEWITHSHA1ANDDES-CBC", "PBEWITHSHA1ANDDES");
6662         put("Alg.Alias.SecretKeyFactory.PBEWITHSHA1ANDRC2-CBC", "PBEWITHSHA1ANDRC2");
6663-        put("Alg.Alias.SecretKeyFactory." + PKCSObjectIdentifiers.pbeWithMD2AndDES_CBC, "PBEWITHMD2ANDDES");
6664-        put("Alg.Alias.SecretKeyFactory." + PKCSObjectIdentifiers.pbeWithMD2AndRC2_CBC, "PBEWITHMD2ANDRC2");
6665+        // BEGIN android-removed
6666+        // put("Alg.Alias.SecretKeyFactory." + PKCSObjectIdentifiers.pbeWithMD2AndDES_CBC, "PBEWITHMD2ANDDES");
6667+        // put("Alg.Alias.SecretKeyFactory." + PKCSObjectIdentifiers.pbeWithMD2AndRC2_CBC, "PBEWITHMD2ANDRC2");
6668+        // END android-removed
6669         put("Alg.Alias.SecretKeyFactory." + PKCSObjectIdentifiers.pbeWithMD5AndDES_CBC, "PBEWITHMD5ANDDES");
6670         put("Alg.Alias.SecretKeyFactory." + PKCSObjectIdentifiers.pbeWithMD5AndRC2_CBC, "PBEWITHMD5ANDRC2");
6671         put("Alg.Alias.SecretKeyFactory." + PKCSObjectIdentifiers.pbeWithSHA1AndDES_CBC, "PBEWITHSHA1ANDDES");
6672@@ -408,20 +472,31 @@
6673         put("Alg.Alias.SecretKeyFactory." + BCObjectIdentifiers.bc_pbe_sha256_pkcs12_aes128_cbc.getId(), "PBEWITHSHA256AND128BITAES-CBC-BC");
6674         put("Alg.Alias.SecretKeyFactory." + BCObjectIdentifiers.bc_pbe_sha256_pkcs12_aes192_cbc.getId(), "PBEWITHSHA256AND192BITAES-CBC-BC");
6675         put("Alg.Alias.SecretKeyFactory." + BCObjectIdentifiers.bc_pbe_sha256_pkcs12_aes256_cbc.getId(), "PBEWITHSHA256AND256BITAES-CBC-BC");
6676+        // BEGIN android-added
6677+
6678+        put("SecretKeyFactory.PBKDF2WithHmacSHA1", "org.bouncycastle.jce.provider.JCESecretKeyFactory$PBKDF2WithHmacSHA1");
6679+        // END android-added
6680 
6681         addMacAlgorithms();
6682 
6683     // Certification Path API
6684-        put("CertPathValidator.RFC3281", "org.bouncycastle.jce.provider.PKIXAttrCertPathValidatorSpi");
6685-        put("CertPathBuilder.RFC3281", "org.bouncycastle.jce.provider.PKIXAttrCertPathBuilderSpi");
6686-        put("CertPathValidator.RFC3280", "org.bouncycastle.jce.provider.PKIXCertPathValidatorSpi");
6687-        put("CertPathBuilder.RFC3280", "org.bouncycastle.jce.provider.PKIXCertPathBuilderSpi");
6688+        // BEGIN android-removed
6689+        // put("CertPathValidator.RFC3281", "org.bouncycastle.jce.provider.PKIXAttrCertPathValidatorSpi");
6690+        // put("CertPathBuilder.RFC3281", "org.bouncycastle.jce.provider.PKIXAttrCertPathBuilderSpi");
6691+        // END android-removed
6692+        // BEGIN android-changed
6693+        // Use Alg.Alias so RFC3280 doesn't show up when iterating provider services, only PKIX
6694+        put("Alg.Alias.CertPathValidator.RFC3280", "PKIX");
6695+        put("Alg.Alias.CertPathBuilder.RFC3280", "PKIX");
6696+        // END android-changed
6697         put("CertPathValidator.PKIX", "org.bouncycastle.jce.provider.PKIXCertPathValidatorSpi");
6698         put("CertPathBuilder.PKIX", "org.bouncycastle.jce.provider.PKIXCertPathBuilderSpi");
6699         put("CertStore.Collection", "org.bouncycastle.jce.provider.CertStoreCollectionSpi");
6700-        put("CertStore.LDAP", "org.bouncycastle.jce.provider.X509LDAPCertStoreSpi");
6701-        put("CertStore.Multi", "org.bouncycastle.jce.provider.MultiCertStoreSpi");
6702-        put("Alg.Alias.CertStore.X509LDAP", "LDAP");
6703+        // BEGIN android-removed
6704+        // put("CertStore.LDAP", "org.bouncycastle.jce.provider.X509LDAPCertStoreSpi");
6705+        // put("CertStore.Multi", "org.bouncycastle.jce.provider.MultiCertStoreSpi");
6706+        // put("Alg.Alias.CertStore.X509LDAP", "LDAP");
6707+        // END android-removed
6708     }
6709 
6710     private void loadAlgorithms(String packageName, String[] names)
6711@@ -469,21 +544,25 @@
6712     private void addMacAlgorithms()
6713     {
6714 
6715-        put("Mac.DESWITHISO9797", "org.bouncycastle.jce.provider.JCEMac$DES9797Alg3");
6716-        put("Alg.Alias.Mac.DESISO9797MAC", "DESWITHISO9797");
6717-
6718-        put("Mac.ISO9797ALG3MAC", "org.bouncycastle.jce.provider.JCEMac$DES9797Alg3");
6719-        put("Alg.Alias.Mac.ISO9797ALG3", "ISO9797ALG3MAC");
6720-        put("Mac.ISO9797ALG3WITHISO7816-4PADDING", "org.bouncycastle.jce.provider.JCEMac$DES9797Alg3with7816d4");
6721-        put("Alg.Alias.Mac.ISO9797ALG3MACWITHISO7816-4PADDING", "ISO9797ALG3WITHISO7816-4PADDING");
6722-
6723-        put("Mac.OLDHMACSHA384", "org.bouncycastle.jce.provider.JCEMac$OldSHA384");
6724-
6725-        put("Mac.OLDHMACSHA512", "org.bouncycastle.jce.provider.JCEMac$OldSHA512");
6726+        // BEGIN android-removed
6727+        // put("Mac.DESWITHISO9797", "org.bouncycastle.jce.provider.JCEMac$DES9797Alg3");
6728+        // put("Alg.Alias.Mac.DESISO9797MAC", "DESWITHISO9797");
6729+        //
6730+        // put("Mac.ISO9797ALG3MAC", "org.bouncycastle.jce.provider.JCEMac$DES9797Alg3");
6731+        // put("Alg.Alias.Mac.ISO9797ALG3", "ISO9797ALG3MAC");
6732+        // put("Mac.ISO9797ALG3WITHISO7816-4PADDING", "org.bouncycastle.jce.provider.JCEMac$DES9797Alg3with7816d4");
6733+        // put("Alg.Alias.Mac.ISO9797ALG3MACWITHISO7816-4PADDING", "ISO9797ALG3WITHISO7816-4PADDING");
6734+        //
6735+        // put("Mac.OLDHMACSHA384", "org.bouncycastle.jce.provider.JCEMac$OldSHA384");
6736+        //
6737+        // put("Mac.OLDHMACSHA512", "org.bouncycastle.jce.provider.JCEMac$OldSHA512");
6738+        // END android-removed
6739 
6740         put("Mac.PBEWITHHMACSHA", "org.bouncycastle.jce.provider.JCEMac$PBEWithSHA");
6741         put("Mac.PBEWITHHMACSHA1", "org.bouncycastle.jce.provider.JCEMac$PBEWithSHA");
6742-        put("Mac.PBEWITHHMACRIPEMD160", "org.bouncycastle.jce.provider.JCEMac$PBEWithRIPEMD160");
6743+        // BEGIN android-removed
6744+        // put("Mac.PBEWITHHMACRIPEMD160", "org.bouncycastle.jce.provider.JCEMac$PBEWithRIPEMD160");
6745+        // END android-removed
6746         put("Alg.Alias.Mac.1.3.14.3.2.26", "PBEWITHHMACSHA");
6747     }
6748 
6749diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/jce/provider/CertBlacklist.java bcprov-jdk15on-147/org/bouncycastle/jce/provider/CertBlacklist.java
6750--- bcprov-jdk15on-147.orig/org/bouncycastle/jce/provider/CertBlacklist.java	1970-01-01 00:00:00.000000000 +0000
6751+++ bcprov-jdk15on-147/org/bouncycastle/jce/provider/CertBlacklist.java	2012-09-19 21:17:12.000000000 +0000
6752@@ -0,0 +1,216 @@
6753+/*
6754+ * Copyright (C) 2012 The Android Open Source Project
6755+ *
6756+ * Licensed under the Apache License, Version 2.0 (the "License");
6757+ * you may not use this file except in compliance with the License.
6758+ * You may obtain a copy of the License at
6759+ *
6760+ *      http://www.apache.org/licenses/LICENSE-2.0
6761+ *
6762+ * Unless required by applicable law or agreed to in writing, software
6763+ * distributed under the License is distributed on an "AS IS" BASIS,
6764+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
6765+ * See the License for the specific language governing permissions and
6766+ * limitations under the License.
6767+ */
6768+
6769+package org.bouncycastle.jce.provider;
6770+
6771+import java.io.Closeable;
6772+import java.io.ByteArrayOutputStream;
6773+import java.io.FileNotFoundException;
6774+import java.io.IOException;
6775+import java.io.RandomAccessFile;
6776+import java.math.BigInteger;
6777+import java.security.PublicKey;
6778+import java.util.Arrays;
6779+import java.util.Collections;
6780+import java.util.HashSet;
6781+import java.util.Set;
6782+import java.util.logging.Level;
6783+import java.util.logging.Logger;
6784+import org.bouncycastle.crypto.Digest;
6785+import org.bouncycastle.crypto.digests.AndroidDigestFactory;
6786+import org.bouncycastle.util.encoders.Hex;
6787+
6788+public class CertBlacklist {
6789+
6790+    private static final String ANDROID_DATA = System.getenv("ANDROID_DATA");
6791+    private static final String BLACKLIST_ROOT = ANDROID_DATA + "/misc/keychain/";
6792+    public static final String DEFAULT_PUBKEY_BLACKLIST_PATH = BLACKLIST_ROOT + "pubkey_blacklist.txt";
6793+    public static final String DEFAULT_SERIAL_BLACKLIST_PATH = BLACKLIST_ROOT + "serial_blacklist.txt";
6794+
6795+    private static final Logger logger = Logger.getLogger(CertBlacklist.class.getName());
6796+
6797+    // public for testing
6798+    public final Set<BigInteger> serialBlacklist;
6799+    public final Set<byte[]> pubkeyBlacklist;
6800+
6801+    public CertBlacklist() {
6802+        this(DEFAULT_PUBKEY_BLACKLIST_PATH, DEFAULT_SERIAL_BLACKLIST_PATH);
6803+    }
6804+
6805+    /** Test only interface, not for public use */
6806+    public CertBlacklist(String pubkeyBlacklistPath, String serialBlacklistPath) {
6807+        serialBlacklist = readSerialBlackList(serialBlacklistPath);
6808+        pubkeyBlacklist = readPublicKeyBlackList(pubkeyBlacklistPath);
6809+    }
6810+
6811+    private static boolean isHex(String value) {
6812+        try {
6813+            new BigInteger(value, 16);
6814+            return true;
6815+        } catch (NumberFormatException e) {
6816+            logger.log(Level.WARNING, "Could not parse hex value " + value, e);
6817+            return false;
6818+        }
6819+    }
6820+
6821+    private static boolean isPubkeyHash(String value) {
6822+        if (value.length() != 40) {
6823+            logger.log(Level.WARNING, "Invalid pubkey hash length: " + value.length());
6824+            return false;
6825+        }
6826+        return isHex(value);
6827+    }
6828+
6829+    private static String readBlacklist(String path) {
6830+        try {
6831+            return readFileAsString(path);
6832+        } catch (FileNotFoundException ignored) {
6833+        } catch (IOException e) {
6834+            logger.log(Level.WARNING, "Could not read blacklist", e);
6835+        }
6836+        return "";
6837+    }
6838+
6839+    // From IoUtils.readFileAsString
6840+    private static String readFileAsString(String path) throws IOException {
6841+        return readFileAsBytes(path).toString("UTF-8");
6842+    }
6843+
6844+    // Based on IoUtils.readFileAsBytes
6845+    private static ByteArrayOutputStream readFileAsBytes(String path) throws IOException {
6846+        RandomAccessFile f = null;
6847+        try {
6848+            f = new RandomAccessFile(path, "r");
6849+            ByteArrayOutputStream bytes = new ByteArrayOutputStream((int) f.length());
6850+            byte[] buffer = new byte[8192];
6851+            while (true) {
6852+                int byteCount = f.read(buffer);
6853+                if (byteCount == -1) {
6854+                    return bytes;
6855+                }
6856+                bytes.write(buffer, 0, byteCount);
6857+            }
6858+        } finally {
6859+            closeQuietly(f);
6860+        }
6861+    }
6862+
6863+    // Base on IoUtils.closeQuietly
6864+    private static void closeQuietly(Closeable closeable) {
6865+        if (closeable != null) {
6866+            try {
6867+                closeable.close();
6868+            } catch (RuntimeException rethrown) {
6869+                throw rethrown;
6870+            } catch (Exception ignored) {
6871+            }
6872+        }
6873+    }
6874+
6875+    private static final Set<BigInteger> readSerialBlackList(String path) {
6876+
6877+        // start out with a base set of known bad values
6878+        Set<BigInteger> bl = new HashSet<BigInteger>(Arrays.asList(
6879+            // From http://src.chromium.org/viewvc/chrome/trunk/src/net/base/x509_certificate.cc?revision=78748&view=markup
6880+            // Not a real certificate. For testing only.
6881+            new BigInteger("077a59bcd53459601ca6907267a6dd1c", 16),
6882+            new BigInteger("047ecbe9fca55f7bd09eae36e10cae1e", 16),
6883+            new BigInteger("d8f35f4eb7872b2dab0692e315382fb0", 16),
6884+            new BigInteger("b0b7133ed096f9b56fae91c874bd3ac0", 16),
6885+            new BigInteger("9239d5348f40d1695a745470e1f23f43", 16),
6886+            new BigInteger("e9028b9578e415dc1a710a2b88154447", 16),
6887+            new BigInteger("d7558fdaf5f1105bb213282b707729a3", 16),
6888+            new BigInteger("f5c86af36162f13a64f54f6dc9587c06", 16),
6889+            new BigInteger("392a434f0e07df1f8aa305de34e0c229", 16),
6890+            new BigInteger("3e75ced46b693021218830ae86a82a71", 16)
6891+        ));
6892+
6893+        // attempt to augment it with values taken from gservices
6894+        String serialBlacklist = readBlacklist(path);
6895+        if (!serialBlacklist.equals("")) {
6896+            for(String value : serialBlacklist.split(",")) {
6897+                try {
6898+                    bl.add(new BigInteger(value, 16));
6899+                } catch (NumberFormatException e) {
6900+                    logger.log(Level.WARNING, "Tried to blacklist invalid serial number " + value, e);
6901+                }
6902+            }
6903+        }
6904+
6905+        // whether that succeeds or fails, send it on its merry way
6906+        return Collections.unmodifiableSet(bl);
6907+    }
6908+
6909+    private static final Set<byte[]> readPublicKeyBlackList(String path) {
6910+
6911+        // start out with a base set of known bad values
6912+        Set<byte[]> bl = new HashSet<byte[]>(Arrays.asList(
6913+            // From http://src.chromium.org/viewvc/chrome/branches/782/src/net/base/x509_certificate.cc?r1=98750&r2=98749&pathrev=98750
6914+            // C=NL, O=DigiNotar, CN=DigiNotar Root CA/emailAddress=info@diginotar.nl
6915+            "410f36363258f30b347d12ce4863e433437806a8".getBytes(),
6916+            // Subject: CN=DigiNotar Cyber CA
6917+            // Issuer: CN=GTE CyberTrust Global Root
6918+            "ba3e7bd38cd7e1e6b9cd4c219962e59d7a2f4e37".getBytes(),
6919+            // Subject: CN=DigiNotar Services 1024 CA
6920+            // Issuer: CN=Entrust.net
6921+            "e23b8d105f87710a68d9248050ebefc627be4ca6".getBytes(),
6922+            // Subject: CN=DigiNotar PKIoverheid CA Organisatie - G2
6923+            // Issuer: CN=Staat der Nederlanden Organisatie CA - G2
6924+            "7b2e16bc39bcd72b456e9f055d1de615b74945db".getBytes(),
6925+            // Subject: CN=DigiNotar PKIoverheid CA Overheid en Bedrijven
6926+            // Issuer: CN=Staat der Nederlanden Overheid CA
6927+            "e8f91200c65cee16e039b9f883841661635f81c5".getBytes(),
6928+            // From http://src.chromium.org/viewvc/chrome?view=rev&revision=108479
6929+            // Subject: O=Digicert Sdn. Bhd.
6930+            // Issuer: CN=GTE CyberTrust Global Root
6931+            "0129bcd5b448ae8d2496d1c3e19723919088e152".getBytes()
6932+        ));
6933+
6934+        // attempt to augment it with values taken from gservices
6935+        String pubkeyBlacklist = readBlacklist(path);
6936+        if (!pubkeyBlacklist.equals("")) {
6937+            for (String value : pubkeyBlacklist.split(",")) {
6938+                value = value.trim();
6939+                if (isPubkeyHash(value)) {
6940+                    bl.add(value.getBytes());
6941+                } else {
6942+                    logger.log(Level.WARNING, "Tried to blacklist invalid pubkey " + value);
6943+                }
6944+            }
6945+        }
6946+
6947+        return bl;
6948+    }
6949+
6950+    public boolean isPublicKeyBlackListed(PublicKey publicKey) {
6951+        byte[] encoded = publicKey.getEncoded();
6952+        Digest digest = AndroidDigestFactory.getSHA1();
6953+        digest.update(encoded, 0, encoded.length);
6954+        byte[] out = new byte[digest.getDigestSize()];
6955+        digest.doFinal(out, 0);
6956+        for (byte[] blacklisted : pubkeyBlacklist) {
6957+            if (Arrays.equals(blacklisted, Hex.encode(out))) {
6958+                return true;
6959+            }
6960+        }
6961+        return false;
6962+    }
6963+
6964+    public boolean isSerialNumberBlackListed(BigInteger serial) {
6965+        return serialBlacklist.contains(serial);
6966+    }
6967+
6968+}
6969diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/jce/provider/CertPathValidatorUtilities.java bcprov-jdk15on-147/org/bouncycastle/jce/provider/CertPathValidatorUtilities.java
6970--- bcprov-jdk15on-147.orig/org/bouncycastle/jce/provider/CertPathValidatorUtilities.java	2012-03-22 15:11:48.000000000 +0000
6971+++ bcprov-jdk15on-147/org/bouncycastle/jce/provider/CertPathValidatorUtilities.java	2012-09-19 21:17:12.000000000 +0000
6972@@ -61,13 +61,17 @@
6973 import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;
6974 import org.bouncycastle.asn1.x509.X509Extension;
6975 import org.bouncycastle.asn1.x509.X509Extensions;
6976-import org.bouncycastle.jce.X509LDAPCertStoreParameters;
6977+// BEGIN android-removed
6978+// import org.bouncycastle.jce.X509LDAPCertStoreParameters;
6979+// END android-removed
6980 import org.bouncycastle.jce.exception.ExtCertPathValidatorException;
6981 import org.bouncycastle.util.Selector;
6982 import org.bouncycastle.util.StoreException;
6983 import org.bouncycastle.x509.ExtendedPKIXBuilderParameters;
6984 import org.bouncycastle.x509.ExtendedPKIXParameters;
6985-import org.bouncycastle.x509.X509AttributeCertStoreSelector;
6986+// BEGIN android-removed
6987+// import org.bouncycastle.x509.X509AttributeCertStoreSelector;
6988+// END android-removed
6989 import org.bouncycastle.x509.X509AttributeCertificate;
6990 import org.bouncycastle.x509.X509CRLStoreSelector;
6991 import org.bouncycastle.x509.X509CertStoreSelector;
6992@@ -247,7 +251,9 @@
6993             {
6994                 // look for URI
6995                 List list = (List)it.next();
6996-                if (list.get(0).equals(new Integer(GeneralName.uniformResourceIdentifier)))
6997+                // BEGIN android-changed
6998+                if (list.get(0).equals(Integer.valueOf(GeneralName.uniformResourceIdentifier)))
6999+                // END android-changed
7000                 {
7001                     // found
7002                     String temp = (String)list.get(1);
7003@@ -655,38 +661,40 @@
7004         {
7005             try
7006             {
7007-                if (location.startsWith("ldap://"))
7008-                {
7009-                    // ldap://directory.d-trust.net/CN=D-TRUST
7010-                    // Qualified CA 2003 1:PN,O=D-Trust GmbH,C=DE
7011-                    // skip "ldap://"
7012-                    location = location.substring(7);
7013-                    // after first / baseDN starts
7014-                    String base = null;
7015-                    String url = null;
7016-                    if (location.indexOf("/") != -1)
7017-                    {
7018-                        base = location.substring(location.indexOf("/"));
7019-                        // URL
7020-                        url = "ldap://"
7021-                            + location.substring(0, location.indexOf("/"));
7022-                    }
7023-                    else
7024-                    {
7025-                        url = "ldap://" + location;
7026-                    }
7027-                    // use all purpose parameters
7028-                    X509LDAPCertStoreParameters params = new X509LDAPCertStoreParameters.Builder(
7029-                        url, base).build();
7030-                    pkixParams.addAdditionalStore(X509Store.getInstance(
7031-                        "CERTIFICATE/LDAP", params, BouncyCastleProvider.PROVIDER_NAME));
7032-                    pkixParams.addAdditionalStore(X509Store.getInstance(
7033-                        "CRL/LDAP", params, BouncyCastleProvider.PROVIDER_NAME));
7034-                    pkixParams.addAdditionalStore(X509Store.getInstance(
7035-                        "ATTRIBUTECERTIFICATE/LDAP", params, BouncyCastleProvider.PROVIDER_NAME));
7036-                    pkixParams.addAdditionalStore(X509Store.getInstance(
7037-                        "CERTIFICATEPAIR/LDAP", params, BouncyCastleProvider.PROVIDER_NAME));
7038-                }
7039+                // BEGIN android-removed
7040+                // if (location.startsWith("ldap://"))
7041+                // {
7042+                //     // ldap://directory.d-trust.net/CN=D-TRUST
7043+                //     // Qualified CA 2003 1:PN,O=D-Trust GmbH,C=DE
7044+                //     // skip "ldap://"
7045+                //     location = location.substring(7);
7046+                //     // after first / baseDN starts
7047+                //     String base = null;
7048+                //     String url = null;
7049+                //     if (location.indexOf("/") != -1)
7050+                //     {
7051+                //         base = location.substring(location.indexOf("/"));
7052+                //         // URL
7053+                //         url = "ldap://"
7054+                //             + location.substring(0, location.indexOf("/"));
7055+                //     }
7056+                //     else
7057+                //     {
7058+                //         url = "ldap://" + location;
7059+                //     }
7060+                //     // use all purpose parameters
7061+                //     X509LDAPCertStoreParameters params = new X509LDAPCertStoreParameters.Builder(
7062+                //         url, base).build();
7063+                //     pkixParams.addAdditionalStore(X509Store.getInstance(
7064+                //         "CERTIFICATE/LDAP", params, BouncyCastleProvider.PROVIDER_NAME));
7065+                //     pkixParams.addAdditionalStore(X509Store.getInstance(
7066+                //         "CRL/LDAP", params, BouncyCastleProvider.PROVIDER_NAME));
7067+                //     pkixParams.addAdditionalStore(X509Store.getInstance(
7068+                //         "ATTRIBUTECERTIFICATE/LDAP", params, BouncyCastleProvider.PROVIDER_NAME));
7069+                //     pkixParams.addAdditionalStore(X509Store.getInstance(
7070+                //         "CERTIFICATEPAIR/LDAP", params, BouncyCastleProvider.PROVIDER_NAME));
7071+                // }
7072+                // END android-removed
7073             }
7074             catch (Exception e)
7075             {
7076@@ -751,33 +759,35 @@
7077         return certs;
7078     }
7079 
7080-    protected static Collection findCertificates(X509AttributeCertStoreSelector certSelect,
7081-                                                 List certStores)
7082-        throws AnnotatedException
7083-    {
7084-        Set certs = new HashSet();
7085-        Iterator iter = certStores.iterator();
7086-
7087-        while (iter.hasNext())
7088-        {
7089-            Object obj = iter.next();
7090-
7091-            if (obj instanceof X509Store)
7092-            {
7093-                X509Store certStore = (X509Store)obj;
7094-                try
7095-                {
7096-                    certs.addAll(certStore.getMatches(certSelect));
7097-                }
7098-                catch (StoreException e)
7099-                {
7100-                    throw new AnnotatedException(
7101-                            "Problem while picking certificates from X.509 store.", e);
7102-                }
7103-            }
7104-        }
7105-        return certs;
7106-    }
7107+    // BEGIN android-removed
7108+    // protected static Collection findCertificates(X509AttributeCertStoreSelector certSelect,
7109+    //                                              List certStores)
7110+    //     throws AnnotatedException
7111+    // {
7112+    //     Set certs = new HashSet();
7113+    //     Iterator iter = certStores.iterator();
7114+    //
7115+    //     while (iter.hasNext())
7116+    //     {
7117+    //         Object obj = iter.next();
7118+    //
7119+    //         if (obj instanceof X509Store)
7120+    //         {
7121+    //             X509Store certStore = (X509Store)obj;
7122+    //             try
7123+    //             {
7124+    //                 certs.addAll(certStore.getMatches(certSelect));
7125+    //             }
7126+    //             catch (StoreException e)
7127+    //             {
7128+    //                 throw new AnnotatedException(
7129+    //                         "Problem while picking certificates from X.509 store.", e);
7130+    //             }
7131+    //         }
7132+    //     }
7133+    //     return certs;
7134+    // }
7135+    // END android-removed
7136 
7137     protected static void addAdditionalStoresFromCRLDistributionPoint(
7138         CRLDistPoint crldp, ExtendedPKIXParameters pkixParams)
7139diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/jce/provider/JCEBlockCipher.java bcprov-jdk15on-147/org/bouncycastle/jce/provider/JCEBlockCipher.java
7140--- bcprov-jdk15on-147.orig/org/bouncycastle/jce/provider/JCEBlockCipher.java	2012-03-22 15:11:48.000000000 +0000
7141+++ bcprov-jdk15on-147/org/bouncycastle/jce/provider/JCEBlockCipher.java	2012-09-19 21:17:12.000000000 +0000
7142@@ -18,8 +18,10 @@
7143 import javax.crypto.ShortBufferException;
7144 import javax.crypto.spec.IvParameterSpec;
7145 import javax.crypto.spec.PBEParameterSpec;
7146-import javax.crypto.spec.RC2ParameterSpec;
7147-import javax.crypto.spec.RC5ParameterSpec;
7148+// BEGIN android-removed
7149+// import javax.crypto.spec.RC2ParameterSpec;
7150+// import javax.crypto.spec.RC5ParameterSpec;
7151+// END android-removed
7152 
7153 import org.bouncycastle.crypto.BlockCipher;
7154 import org.bouncycastle.crypto.BufferedBlockCipher;
7155@@ -28,7 +30,9 @@
7156 import org.bouncycastle.crypto.InvalidCipherTextException;
7157 import org.bouncycastle.crypto.engines.AESFastEngine;
7158 import org.bouncycastle.crypto.engines.DESEngine;
7159-import org.bouncycastle.crypto.engines.GOST28147Engine;
7160+// BEGIN android-removed
7161+// import org.bouncycastle.crypto.engines.GOST28147Engine;
7162+// END android-removed
7163 import org.bouncycastle.crypto.engines.RC2Engine;
7164 import org.bouncycastle.crypto.engines.TwofishEngine;
7165 import org.bouncycastle.crypto.modes.AEADBlockCipher;
7166@@ -36,12 +40,18 @@
7167 import org.bouncycastle.crypto.modes.CCMBlockCipher;
7168 import org.bouncycastle.crypto.modes.CFBBlockCipher;
7169 import org.bouncycastle.crypto.modes.CTSBlockCipher;
7170-import org.bouncycastle.crypto.modes.EAXBlockCipher;
7171+// BEGIN android-removed
7172+// import org.bouncycastle.crypto.modes.EAXBlockCipher;
7173+// END android-removed
7174 import org.bouncycastle.crypto.modes.GCMBlockCipher;
7175-import org.bouncycastle.crypto.modes.GOFBBlockCipher;
7176+// BEGIN android-removed
7177+// import org.bouncycastle.crypto.modes.GOFBBlockCipher;
7178+// END android-removed
7179 import org.bouncycastle.crypto.modes.OFBBlockCipher;
7180-import org.bouncycastle.crypto.modes.OpenPGPCFBBlockCipher;
7181-import org.bouncycastle.crypto.modes.PGPCFBBlockCipher;
7182+// BEGIN android-removed
7183+// import org.bouncycastle.crypto.modes.OpenPGPCFBBlockCipher;
7184+// import org.bouncycastle.crypto.modes.PGPCFBBlockCipher;
7185+// END android-removed
7186 import org.bouncycastle.crypto.modes.SICBlockCipher;
7187 import org.bouncycastle.crypto.paddings.BlockCipherPadding;
7188 import org.bouncycastle.crypto.paddings.ISO10126d2Padding;
7189@@ -53,12 +63,16 @@
7190 import org.bouncycastle.crypto.params.KeyParameter;
7191 import org.bouncycastle.crypto.params.ParametersWithIV;
7192 import org.bouncycastle.crypto.params.ParametersWithRandom;
7193-import org.bouncycastle.crypto.params.ParametersWithSBox;
7194-import org.bouncycastle.crypto.params.RC2Parameters;
7195-import org.bouncycastle.crypto.params.RC5Parameters;
7196+// BEGIN android-removed
7197+// import org.bouncycastle.crypto.params.ParametersWithSBox;
7198+// import org.bouncycastle.crypto.params.RC2Parameters;
7199+// import org.bouncycastle.crypto.params.RC5Parameters;
7200+// END android-removed
7201 import org.bouncycastle.jcajce.provider.symmetric.util.BCPBEKey;
7202 import org.bouncycastle.jcajce.provider.symmetric.util.PBE;
7203-import org.bouncycastle.jce.spec.GOST28147ParameterSpec;
7204+// BEGIN android-removed
7205+// import org.bouncycastle.jce.spec.GOST28147ParameterSpec;
7206+// END android-removed
7207 import org.bouncycastle.jce.spec.RepeatedSecretKeySpec;
7208 import org.bouncycastle.util.Strings;
7209 
7210@@ -71,11 +85,15 @@
7211     //
7212     private Class[]                 availableSpecs =
7213                                     {
7214-                                        RC2ParameterSpec.class,
7215-                                        RC5ParameterSpec.class,
7216+                                        // BEGIN android-removed
7217+                                        // RC2ParameterSpec.class,
7218+                                        // RC5ParameterSpec.class,
7219+                                        // END android-removed
7220                                         IvParameterSpec.class,
7221                                         PBEParameterSpec.class,
7222-                                        GOST28147ParameterSpec.class
7223+                                        // BEGIN android-removed
7224+                                        // GOST28147ParameterSpec.class
7225+                                        // END android-removed
7226                                     };
7227  
7228     private BlockCipher             baseEngine;
7229@@ -232,20 +250,22 @@
7230                         new CFBBlockCipher(baseEngine, 8 * baseEngine.getBlockSize()));
7231             }
7232         }
7233-        else if (modeName.startsWith("PGP"))
7234-        {
7235-            boolean inlineIV = modeName.equalsIgnoreCase("PGPCFBwithIV");
7236-
7237-            ivLength = baseEngine.getBlockSize();
7238-            cipher = new BufferedGenericBlockCipher(
7239-                new PGPCFBBlockCipher(baseEngine, inlineIV));
7240-        }
7241-        else if (modeName.equalsIgnoreCase("OpenPGPCFB"))
7242-        {
7243-            ivLength = 0;
7244-            cipher = new BufferedGenericBlockCipher(
7245-                new OpenPGPCFBBlockCipher(baseEngine));
7246-        }
7247+        // BEGIN android-removed
7248+        // else if (modeName.startsWith("PGP"))
7249+        // {
7250+        //     boolean inlineIV = modeName.equalsIgnoreCase("PGPCFBwithIV");
7251+        //
7252+        //     ivLength = baseEngine.getBlockSize();
7253+        //     cipher = new BufferedGenericBlockCipher(
7254+        //         new PGPCFBBlockCipher(baseEngine, inlineIV));
7255+        // }
7256+        // else if (modeName.equalsIgnoreCase("OpenPGPCFB"))
7257+        // {
7258+        //     ivLength = 0;
7259+        //     cipher = new BufferedGenericBlockCipher(
7260+        //         new OpenPGPCFBBlockCipher(baseEngine));
7261+        // }
7262+        // END android-removed
7263         else if (modeName.startsWith("SIC"))
7264         {
7265             ivLength = baseEngine.getBlockSize();
7266@@ -262,12 +282,14 @@
7267             cipher = new BufferedGenericBlockCipher(new BufferedBlockCipher(
7268                         new SICBlockCipher(baseEngine)));
7269         }
7270-        else if (modeName.startsWith("GOFB"))
7271-        {
7272-            ivLength = baseEngine.getBlockSize();
7273-            cipher = new BufferedGenericBlockCipher(new BufferedBlockCipher(
7274-                        new GOFBBlockCipher(baseEngine)));
7275-        }
7276+        // BEGIN android-removed
7277+        // else if (modeName.startsWith("GOFB"))
7278+        // {
7279+        //     ivLength = baseEngine.getBlockSize();
7280+        //     cipher = new BufferedGenericBlockCipher(new BufferedBlockCipher(
7281+        //                 new GOFBBlockCipher(baseEngine)));
7282+        // }
7283+        // END android-removed
7284         else if (modeName.startsWith("CTS"))
7285         {
7286             ivLength = baseEngine.getBlockSize();
7287@@ -278,11 +300,13 @@
7288             ivLength = baseEngine.getBlockSize();
7289             cipher = new AEADGenericBlockCipher(new CCMBlockCipher(baseEngine));
7290         }
7291-        else if (modeName.startsWith("EAX"))
7292-        {
7293-            ivLength = baseEngine.getBlockSize();
7294-            cipher = new AEADGenericBlockCipher(new EAXBlockCipher(baseEngine));
7295-        }
7296+        // BEGIN android-removed
7297+        // else if (modeName.startsWith("EAX"))
7298+        // {
7299+        //     ivLength = baseEngine.getBlockSize();
7300+        //     cipher = new AEADGenericBlockCipher(new EAXBlockCipher(baseEngine));
7301+        // }
7302+        // END android-removed
7303         else if (modeName.startsWith("GCM"))
7304         {
7305             ivLength = baseEngine.getBlockSize();
7306@@ -371,13 +395,15 @@
7307             throw new InvalidKeyException("Key for algorithm " + key.getAlgorithm() + " not suitable for symmetric enryption.");
7308         }
7309         
7310-        //
7311-        // for RC5-64 we must have some default parameters
7312-        //
7313-        if (params == null && baseEngine.getAlgorithmName().startsWith("RC5-64"))
7314-        {
7315-            throw new InvalidAlgorithmParameterException("RC5 requires an RC5ParametersSpec to be passed in.");
7316-        }
7317+        // BEGIN android-removed
7318+        // //
7319+        // // for RC5-64 we must have some default parameters
7320+        // //
7321+        // if (params == null && baseEngine.getAlgorithmName().startsWith("RC5-64"))
7322+        // {
7323+        //     throw new InvalidAlgorithmParameterException("RC5 requires an RC5ParametersSpec to be passed in.");
7324+        // }
7325+        // END android-removed
7326 
7327         //
7328         // a note on iv's - if ivLength is zero the IV gets ignored (we don't use it).
7329@@ -451,63 +477,65 @@
7330                 param = new KeyParameter(key.getEncoded());
7331             }
7332         }
7333-        else if (params instanceof GOST28147ParameterSpec)
7334-        {
7335-            GOST28147ParameterSpec    gost28147Param = (GOST28147ParameterSpec)params;
7336-
7337-            param = new ParametersWithSBox(
7338-                       new KeyParameter(key.getEncoded()), ((GOST28147ParameterSpec)params).getSbox());
7339-
7340-            if (gost28147Param.getIV() != null && ivLength != 0)
7341-            {
7342-                param = new ParametersWithIV(param, gost28147Param.getIV());
7343-                ivParam = (ParametersWithIV)param;
7344-            }
7345-        }
7346-        else if (params instanceof RC2ParameterSpec)
7347-        {
7348-            RC2ParameterSpec    rc2Param = (RC2ParameterSpec)params;
7349-
7350-            param = new RC2Parameters(key.getEncoded(), ((RC2ParameterSpec)params).getEffectiveKeyBits());
7351-
7352-            if (rc2Param.getIV() != null && ivLength != 0)
7353-            {
7354-                param = new ParametersWithIV(param, rc2Param.getIV());
7355-                ivParam = (ParametersWithIV)param;
7356-            }
7357-        }
7358-        else if (params instanceof RC5ParameterSpec)
7359-        {
7360-            RC5ParameterSpec    rc5Param = (RC5ParameterSpec)params;
7361-
7362-            param = new RC5Parameters(key.getEncoded(), ((RC5ParameterSpec)params).getRounds());
7363-            if (baseEngine.getAlgorithmName().startsWith("RC5"))
7364-            {
7365-                if (baseEngine.getAlgorithmName().equals("RC5-32"))
7366-                {
7367-                    if (rc5Param.getWordSize() != 32)
7368-                    {
7369-                        throw new InvalidAlgorithmParameterException("RC5 already set up for a word size of 32 not " + rc5Param.getWordSize() + ".");
7370-                    }
7371-                }
7372-                else if (baseEngine.getAlgorithmName().equals("RC5-64"))
7373-                {
7374-                    if (rc5Param.getWordSize() != 64)
7375-                    {
7376-                        throw new InvalidAlgorithmParameterException("RC5 already set up for a word size of 64 not " + rc5Param.getWordSize() + ".");
7377-                    }
7378-                }
7379-            }
7380-            else
7381-            {
7382-                throw new InvalidAlgorithmParameterException("RC5 parameters passed to a cipher that is not RC5.");
7383-            }
7384-            if ((rc5Param.getIV() != null) && (ivLength != 0))
7385-            {
7386-                param = new ParametersWithIV(param, rc5Param.getIV());
7387-                ivParam = (ParametersWithIV)param;
7388-            }
7389-        }
7390+        // BEGIN android-removed
7391+        // else if (params instanceof GOST28147ParameterSpec)
7392+        // {
7393+        //     GOST28147ParameterSpec    gost28147Param = (GOST28147ParameterSpec)params;
7394+        //
7395+        //     param = new ParametersWithSBox(
7396+        //                new KeyParameter(key.getEncoded()), ((GOST28147ParameterSpec)params).getSbox());
7397+        //
7398+        //     if (gost28147Param.getIV() != null && ivLength != 0)
7399+        //     {
7400+        //         param = new ParametersWithIV(param, gost28147Param.getIV());
7401+        //         ivParam = (ParametersWithIV)param;
7402+        //     }
7403+        // }
7404+        // else if (params instanceof RC2ParameterSpec)
7405+        // {
7406+        //     RC2ParameterSpec    rc2Param = (RC2ParameterSpec)params;
7407+        //
7408+        //     param = new RC2Parameters(key.getEncoded(), ((RC2ParameterSpec)params).getEffectiveKeyBits());
7409+        //
7410+        //     if (rc2Param.getIV() != null && ivLength != 0)
7411+        //     {
7412+        //         param = new ParametersWithIV(param, rc2Param.getIV());
7413+        //         ivParam = (ParametersWithIV)param;
7414+        //     }
7415+        // }
7416+        // else if (params instanceof RC5ParameterSpec)
7417+        // {
7418+        //     RC5ParameterSpec    rc5Param = (RC5ParameterSpec)params;
7419+        //
7420+        //     param = new RC5Parameters(key.getEncoded(), ((RC5ParameterSpec)params).getRounds());
7421+        //     if (baseEngine.getAlgorithmName().startsWith("RC5"))
7422+        //     {
7423+        //         if (baseEngine.getAlgorithmName().equals("RC5-32"))
7424+        //         {
7425+        //             if (rc5Param.getWordSize() != 32)
7426+        //             {
7427+        //                 throw new InvalidAlgorithmParameterException("RC5 already set up for a word size of 32 not " + rc5Param.getWordSize() + ".");
7428+        //             }
7429+        //         }
7430+        //         else if (baseEngine.getAlgorithmName().equals("RC5-64"))
7431+        //         {
7432+        //             if (rc5Param.getWordSize() != 64)
7433+        //             {
7434+        //                 throw new InvalidAlgorithmParameterException("RC5 already set up for a word size of 64 not " + rc5Param.getWordSize() + ".");
7435+        //             }
7436+        //         }
7437+        //     }
7438+        //     else
7439+        //     {
7440+        //         throw new InvalidAlgorithmParameterException("RC5 parameters passed to a cipher that is not RC5.");
7441+        //     }
7442+        //     if ((rc5Param.getIV() != null) && (ivLength != 0))
7443+        //     {
7444+        //         param = new ParametersWithIV(param, rc5Param.getIV());
7445+        //         ivParam = (ParametersWithIV)param;
7446+        //     }
7447+        // }
7448+        // END android-removed
7449         else
7450         {
7451             throw new InvalidAlgorithmParameterException("unknown parameter type.");
7452@@ -711,10 +739,21 @@
7453         int     inputLen,
7454         byte[]  output,
7455         int     outputOffset) 
7456-        throws IllegalBlockSizeException, BadPaddingException
7457+        throws IllegalBlockSizeException, BadPaddingException, ShortBufferException
7458     {
7459+        // BEGIN android-note
7460+        // added ShortBufferException to the throws statement
7461+        // END android-note
7462         int     len = 0;
7463 
7464+        // BEGIN android-added
7465+        int outputLen = cipher.getOutputSize(inputLen);
7466+
7467+        if (outputLen + outputOffset > output.length) {
7468+            throw new ShortBufferException("need at least " + outputLen + " bytes");
7469+        }
7470+        // BEGIN android-added
7471+
7472         if (inputLen != 0)
7473         {
7474                 len = cipher.processBytes(input, inputOffset, inputLen, output, outputOffset);
7475@@ -756,62 +795,64 @@
7476         }
7477     }
7478 
7479-    /**
7480-     * DESCBC
7481-     */
7482-    static public class DESCBC
7483-        extends JCEBlockCipher
7484-    {
7485-        public DESCBC()
7486-        {
7487-            super(new CBCBlockCipher(new DESEngine()), 64);
7488-        }
7489-    }
7490-
7491-    /**
7492-     *  GOST28147
7493-     */
7494-    static public class GOST28147
7495-        extends JCEBlockCipher
7496-    {
7497-        public GOST28147()
7498-        {
7499-            super(new GOST28147Engine());
7500-        }
7501-    }
7502-    
7503-    static public class GOST28147cbc
7504-        extends JCEBlockCipher
7505-    {
7506-        public GOST28147cbc()
7507-        {
7508-            super(new CBCBlockCipher(new GOST28147Engine()), 64);
7509-        }
7510-    }
7511-
7512-    /**
7513-     * RC2
7514-     */
7515-    static public class RC2
7516-        extends JCEBlockCipher
7517-    {
7518-        public RC2()
7519-        {
7520-            super(new RC2Engine());
7521-        }
7522-    }
7523-
7524-    /**
7525-     * RC2CBC
7526-     */
7527-    static public class RC2CBC
7528-        extends JCEBlockCipher
7529-    {
7530-        public RC2CBC()
7531-        {
7532-            super(new CBCBlockCipher(new RC2Engine()), 64);
7533-        }
7534-    }
7535+    // BEGIN android-removed
7536+    // /**
7537+    //  * DESCBC
7538+    //  */
7539+    // static public class DESCBC
7540+    //     extends JCEBlockCipher
7541+    // {
7542+    //     public DESCBC()
7543+    //     {
7544+    //         super(new CBCBlockCipher(new DESEngine()), 64);
7545+    //     }
7546+    // }
7547+    //
7548+    // /**
7549+    //  *  GOST28147
7550+    //  */
7551+    // static public class GOST28147
7552+    //     extends JCEBlockCipher
7553+    // {
7554+    //     public GOST28147()
7555+    //     {
7556+    //         super(new GOST28147Engine());
7557+    //     }
7558+    // }
7559+    //
7560+    // static public class GOST28147cbc
7561+    //     extends JCEBlockCipher
7562+    // {
7563+    //     public GOST28147cbc()
7564+    //     {
7565+    //         super(new CBCBlockCipher(new GOST28147Engine()), 64);
7566+    //     }
7567+    // }
7568+    //
7569+    // /**
7570+    //  * RC2
7571+    //  */
7572+    // static public class RC2
7573+    //     extends JCEBlockCipher
7574+    // {
7575+    //     public RC2()
7576+    //     {
7577+    //         super(new RC2Engine());
7578+    //     }
7579+    // }
7580+    //
7581+    // /**
7582+    //  * RC2CBC
7583+    //  */
7584+    // static public class RC2CBC
7585+    //     extends JCEBlockCipher
7586+    // {
7587+    //     public RC2CBC()
7588+    //     {
7589+    //         super(new CBCBlockCipher(new RC2Engine()), 64);
7590+    //     }
7591+    // }
7592+    // END android-removed
7593 
7594     /**
7595      * PBEWithMD5AndDES
7596diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/jce/provider/JCEECPrivateKey.java bcprov-jdk15on-147/org/bouncycastle/jce/provider/JCEECPrivateKey.java
7597--- bcprov-jdk15on-147.orig/org/bouncycastle/jce/provider/JCEECPrivateKey.java	2012-03-22 15:11:48.000000000 +0000
7598+++ bcprov-jdk15on-147/org/bouncycastle/jce/provider/JCEECPrivateKey.java	2012-09-19 21:17:12.000000000 +0000
7599@@ -20,8 +20,10 @@
7600 import org.bouncycastle.asn1.DERInteger;
7601 import org.bouncycastle.asn1.DERNull;
7602 import org.bouncycastle.asn1.DERObjectIdentifier;
7603-import org.bouncycastle.asn1.cryptopro.CryptoProObjectIdentifiers;
7604-import org.bouncycastle.asn1.cryptopro.ECGOST3410NamedCurves;
7605+// BEGIN android-removed
7606+// import org.bouncycastle.asn1.cryptopro.CryptoProObjectIdentifiers;
7607+// import org.bouncycastle.asn1.cryptopro.ECGOST3410NamedCurves;
7608+// END android-removed
7609 import org.bouncycastle.asn1.pkcs.PrivateKeyInfo;
7610 import org.bouncycastle.asn1.sec.ECPrivateKeyStructure;
7611 import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
7612@@ -203,21 +205,23 @@
7613             ASN1ObjectIdentifier oid = ASN1ObjectIdentifier.getInstance(params.getParameters());
7614             X9ECParameters ecP = ECUtil.getNamedCurveByOid(oid);
7615 
7616-            if (ecP == null) // GOST Curve
7617-            {
7618-                ECDomainParameters gParam = ECGOST3410NamedCurves.getByOID(oid);
7619-                EllipticCurve ellipticCurve = EC5Util.convertCurve(gParam.getCurve(), gParam.getSeed());
7620-
7621-                ecSpec = new ECNamedCurveSpec(
7622-                        ECGOST3410NamedCurves.getName(oid),
7623-                        ellipticCurve,
7624-                        new ECPoint(
7625-                                gParam.getG().getX().toBigInteger(),
7626-                                gParam.getG().getY().toBigInteger()),
7627-                        gParam.getN(),
7628-                        gParam.getH());
7629-            }
7630-            else
7631+            // BEGIN android-removed
7632+            // if (ecP == null) // GOST Curve
7633+            // {
7634+            //     ECDomainParameters gParam = ECGOST3410NamedCurves.getByOID(oid);
7635+            //     EllipticCurve ellipticCurve = EC5Util.convertCurve(gParam.getCurve(), gParam.getSeed());
7636+            //
7637+            //     ecSpec = new ECNamedCurveSpec(
7638+            //             ECGOST3410NamedCurves.getName(oid),
7639+            //             ellipticCurve,
7640+            //             new ECPoint(
7641+            //                     gParam.getG().getX().toBigInteger(),
7642+            //                     gParam.getG().getY().toBigInteger()),
7643+            //             gParam.getN(),
7644+            //             gParam.getH());
7645+            // }
7646+            // else
7647+            // END android-removed
7648             {
7649                 EllipticCurve ellipticCurve = EC5Util.convertCurve(ecP.getCurve(), ecP.getSeed());
7650 
7651@@ -331,11 +335,13 @@
7652 
7653         try
7654         {
7655-            if (algorithm.equals("ECGOST3410"))
7656-            {
7657-                info = new PrivateKeyInfo(new AlgorithmIdentifier(CryptoProObjectIdentifiers.gostR3410_2001, params.toASN1Primitive()), keyStructure.toASN1Primitive());
7658-            }
7659-            else
7660+            // BEGIN android-removed
7661+            // if (algorithm.equals("ECGOST3410"))
7662+            // {
7663+            //     info = new PrivateKeyInfo(new AlgorithmIdentifier(CryptoProObjectIdentifiers.gostR3410_2001, params.toASN1Primitive()), keyStructure.toASN1Primitive());
7664+            // }
7665+            // else
7666+            // END android-removed
7667             {
7668 
7669                 info = new PrivateKeyInfo(new AlgorithmIdentifier(X9ObjectIdentifiers.id_ecPublicKey, params.toASN1Primitive()), keyStructure.toASN1Primitive());
7670diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/jce/provider/JCEECPublicKey.java bcprov-jdk15on-147/org/bouncycastle/jce/provider/JCEECPublicKey.java
7671--- bcprov-jdk15on-147.orig/org/bouncycastle/jce/provider/JCEECPublicKey.java	2012-03-22 15:11:48.000000000 +0000
7672+++ bcprov-jdk15on-147/org/bouncycastle/jce/provider/JCEECPublicKey.java	2012-09-19 21:17:12.000000000 +0000
7673@@ -18,9 +18,11 @@
7674 import org.bouncycastle.asn1.DERBitString;
7675 import org.bouncycastle.asn1.DERNull;
7676 import org.bouncycastle.asn1.DEROctetString;
7677-import org.bouncycastle.asn1.cryptopro.CryptoProObjectIdentifiers;
7678-import org.bouncycastle.asn1.cryptopro.ECGOST3410NamedCurves;
7679-import org.bouncycastle.asn1.cryptopro.GOST3410PublicKeyAlgParameters;
7680+// BEGIN android-removed
7681+// import org.bouncycastle.asn1.cryptopro.CryptoProObjectIdentifiers;
7682+// import org.bouncycastle.asn1.cryptopro.ECGOST3410NamedCurves;
7683+// import org.bouncycastle.asn1.cryptopro.GOST3410PublicKeyAlgParameters;
7684+// END android-removed
7685 import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
7686 import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;
7687 import org.bouncycastle.asn1.x9.X962Parameters;
7688@@ -33,9 +35,13 @@
7689 import org.bouncycastle.jcajce.provider.asymmetric.ec.EC5Util;
7690 import org.bouncycastle.jcajce.provider.asymmetric.ec.ECUtil;
7691 import org.bouncycastle.jcajce.provider.asymmetric.util.KeyUtil;
7692-import org.bouncycastle.jce.ECGOST3410NamedCurveTable;
7693+// BEGIN android-removed
7694+// import org.bouncycastle.jce.ECGOST3410NamedCurveTable;
7695+// END android-removed
7696 import org.bouncycastle.jce.interfaces.ECPointEncoder;
7697-import org.bouncycastle.jce.spec.ECNamedCurveParameterSpec;
7698+// BEGIN android-removed
7699+// import org.bouncycastle.jce.spec.ECNamedCurveParameterSpec;
7700+// END android-removed
7701 import org.bouncycastle.jce.spec.ECNamedCurveSpec;
7702 import org.bouncycastle.math.ec.ECCurve;
7703 
7704@@ -46,7 +52,9 @@
7705     private org.bouncycastle.math.ec.ECPoint q;
7706     private ECParameterSpec         ecSpec;
7707     private boolean                 withCompression;
7708-    private GOST3410PublicKeyAlgParameters       gostParams;
7709+    // BEGIN android-removed
7710+    // private GOST3410PublicKeyAlgParameters       gostParams;
7711+    // END android-removed
7712 
7713     public JCEECPublicKey(
7714         String              algorithm,
7715@@ -56,7 +64,9 @@
7716         this.q = key.q;
7717         this.ecSpec = key.ecSpec;
7718         this.withCompression = key.withCompression;
7719-        this.gostParams = key.gostParams;
7720+        // BEGIN android-removed
7721+        // this.gostParams = key.gostParams;
7722+        // END android-removed
7723     }
7724     
7725     public JCEECPublicKey(
7726@@ -179,54 +189,56 @@
7727 
7728     private void populateFromPubKeyInfo(SubjectPublicKeyInfo info)
7729     {
7730-        if (info.getAlgorithmId().getObjectId().equals(CryptoProObjectIdentifiers.gostR3410_2001))
7731-        {
7732-            DERBitString bits = info.getPublicKeyData();
7733-            ASN1OctetString key;
7734-            this.algorithm = "ECGOST3410";
7735-
7736-            try
7737-            {
7738-                key = (ASN1OctetString) ASN1Primitive.fromByteArray(bits.getBytes());
7739-            }
7740-            catch (IOException ex)
7741-            {
7742-                throw new IllegalArgumentException("error recovering public key");
7743-            }
7744-
7745-            byte[]          keyEnc = key.getOctets();
7746-            byte[]          x = new byte[32];
7747-            byte[]          y = new byte[32];
7748-
7749-            for (int i = 0; i != x.length; i++)
7750-            {
7751-                x[i] = keyEnc[32 - 1 - i];
7752-            }
7753-
7754-            for (int i = 0; i != y.length; i++)
7755-            {
7756-                y[i] = keyEnc[64 - 1 - i];
7757-            }
7758-
7759-            gostParams = new GOST3410PublicKeyAlgParameters((ASN1Sequence)info.getAlgorithmId().getParameters());
7760-
7761-            ECNamedCurveParameterSpec spec = ECGOST3410NamedCurveTable.getParameterSpec(ECGOST3410NamedCurves.getName(gostParams.getPublicKeyParamSet()));
7762-
7763-            ECCurve curve = spec.getCurve();
7764-            EllipticCurve ellipticCurve = EC5Util.convertCurve(curve, spec.getSeed());
7765-
7766-            this.q = curve.createPoint(new BigInteger(1, x), new BigInteger(1, y), false);
7767-
7768-            ecSpec = new ECNamedCurveSpec(
7769-                    ECGOST3410NamedCurves.getName(gostParams.getPublicKeyParamSet()),
7770-                    ellipticCurve,
7771-                    new ECPoint(
7772-                            spec.getG().getX().toBigInteger(),
7773-                            spec.getG().getY().toBigInteger()),
7774-                            spec.getN(), spec.getH());
7775-
7776-        }
7777-        else
7778+        // BEGIN android-removed
7779+        // if (info.getAlgorithmId().getObjectId().equals(CryptoProObjectIdentifiers.gostR3410_2001))
7780+        // {
7781+        //     DERBitString bits = info.getPublicKeyData();
7782+        //     ASN1OctetString key;
7783+        //     this.algorithm = "ECGOST3410";
7784+        //
7785+        //     try
7786+        //     {
7787+        //         key = (ASN1OctetString) ASN1Primitive.fromByteArray(bits.getBytes());
7788+        //     }
7789+        //     catch (IOException ex)
7790+        //     {
7791+        //         throw new IllegalArgumentException("error recovering public key");
7792+        //     }
7793+        //
7794+        //     byte[]          keyEnc = key.getOctets();
7795+        //     byte[]          x = new byte[32];
7796+        //     byte[]          y = new byte[32];
7797+        //
7798+        //     for (int i = 0; i != x.length; i++)
7799+        //     {
7800+        //         x[i] = keyEnc[32 - 1 - i];
7801+        //     }
7802+        //
7803+        //     for (int i = 0; i != y.length; i++)
7804+        //     {
7805+        //         y[i] = keyEnc[64 - 1 - i];
7806+        //     }
7807+        //
7808+        //     gostParams = new GOST3410PublicKeyAlgParameters((ASN1Sequence)info.getAlgorithmId().getParameters());
7809+        //
7810+        //     ECNamedCurveParameterSpec spec = ECGOST3410NamedCurveTable.getParameterSpec(ECGOST3410NamedCurves.getName(gostParams.getPublicKeyParamSet()));
7811+        //
7812+        //     ECCurve curve = spec.getCurve();
7813+        //     EllipticCurve ellipticCurve = EC5Util.convertCurve(curve, spec.getSeed());
7814+        //
7815+        //     this.q = curve.createPoint(new BigInteger(1, x), new BigInteger(1, y), false);
7816+        //
7817+        //     ecSpec = new ECNamedCurveSpec(
7818+        //             ECGOST3410NamedCurves.getName(gostParams.getPublicKeyParamSet()),
7819+        //             ellipticCurve,
7820+        //             new ECPoint(
7821+        //                     spec.getG().getX().toBigInteger(),
7822+        //                     spec.getG().getY().toBigInteger()),
7823+        //                     spec.getN(), spec.getH());
7824+        //
7825+        // }
7826+        // else
7827+        // END android-removed
7828         {
7829             X962Parameters params = new X962Parameters((ASN1Primitive)info.getAlgorithmId().getParameters());
7830             ECCurve                 curve;
7831@@ -315,45 +327,47 @@
7832         ASN1Encodable        params;
7833         SubjectPublicKeyInfo info;
7834 
7835-        if (algorithm.equals("ECGOST3410"))
7836-        {
7837-            if (gostParams != null)
7838-            {
7839-                params = gostParams;
7840-            }
7841-            else
7842-            {
7843-                if (ecSpec instanceof ECNamedCurveSpec)
7844-                {
7845-                    params = new GOST3410PublicKeyAlgParameters(
7846-                                   ECGOST3410NamedCurves.getOID(((ECNamedCurveSpec)ecSpec).getName()),
7847-                                   CryptoProObjectIdentifiers.gostR3411_94_CryptoProParamSet);
7848-                }
7849-                else
7850-                {   // strictly speaking this may not be applicable...
7851-                    ECCurve curve = EC5Util.convertCurve(ecSpec.getCurve());
7852-
7853-                    X9ECParameters ecP = new X9ECParameters(
7854-                        curve,
7855-                        EC5Util.convertPoint(curve, ecSpec.getGenerator(), withCompression),
7856-                        ecSpec.getOrder(),
7857-                        BigInteger.valueOf(ecSpec.getCofactor()),
7858-                        ecSpec.getCurve().getSeed());
7859-
7860-                    params = new X962Parameters(ecP);
7861-                }
7862-            }
7863-
7864-            BigInteger      bX = this.q.getX().toBigInteger();
7865-            BigInteger      bY = this.q.getY().toBigInteger();
7866-            byte[]          encKey = new byte[64];
7867-
7868-            extractBytes(encKey, 0, bX);
7869-            extractBytes(encKey, 32, bY);
7870-
7871-            info = new SubjectPublicKeyInfo(new AlgorithmIdentifier(CryptoProObjectIdentifiers.gostR3410_2001, params), new DEROctetString(encKey));
7872-        }
7873-        else
7874+        // BEGIN android-removed
7875+        // if (algorithm.equals("ECGOST3410"))
7876+        // {
7877+        //     if (gostParams != null)
7878+        //     {
7879+        //         params = gostParams;
7880+        //     }
7881+        //     else
7882+        //     {
7883+        //         if (ecSpec instanceof ECNamedCurveSpec)
7884+        //         {
7885+        //             params = new GOST3410PublicKeyAlgParameters(
7886+        //                            ECGOST3410NamedCurves.getOID(((ECNamedCurveSpec)ecSpec).getName()),
7887+        //                            CryptoProObjectIdentifiers.gostR3411_94_CryptoProParamSet);
7888+        //         }
7889+        //         else
7890+        //         {   // strictly speaking this may not be applicable...
7891+        //             ECCurve curve = EC5Util.convertCurve(ecSpec.getCurve());
7892+        //
7893+        //             X9ECParameters ecP = new X9ECParameters(
7894+        //                 curve,
7895+        //                 EC5Util.convertPoint(curve, ecSpec.getGenerator(), withCompression),
7896+        //                 ecSpec.getOrder(),
7897+        //                 BigInteger.valueOf(ecSpec.getCofactor()),
7898+        //                 ecSpec.getCurve().getSeed());
7899+        //
7900+        //             params = new X962Parameters(ecP);
7901+        //         }
7902+        //     }
7903+        //
7904+        //     BigInteger      bX = this.q.getX().toBigInteger();
7905+        //     BigInteger      bY = this.q.getY().toBigInteger();
7906+        //     byte[]          encKey = new byte[64];
7907+        //
7908+        //     extractBytes(encKey, 0, bX);
7909+        //     extractBytes(encKey, 32, bY);
7910+        //
7911+        //     info = new SubjectPublicKeyInfo(new AlgorithmIdentifier(CryptoProObjectIdentifiers.gostR3410_2001, params), new DEROctetString(encKey));
7912+        // }
7913+        // else
7914+        // END android-removed
7915         {
7916             if (ecSpec instanceof ECNamedCurveSpec)
7917             {
7918diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/jce/provider/JCEMac.java bcprov-jdk15on-147/org/bouncycastle/jce/provider/JCEMac.java
7919--- bcprov-jdk15on-147.orig/org/bouncycastle/jce/provider/JCEMac.java	2012-03-22 15:11:48.000000000 +0000
7920+++ bcprov-jdk15on-147/org/bouncycastle/jce/provider/JCEMac.java	2012-09-19 21:17:12.000000000 +0000
7921@@ -11,24 +11,35 @@
7922 
7923 import org.bouncycastle.crypto.CipherParameters;
7924 import org.bouncycastle.crypto.Mac;
7925-import org.bouncycastle.crypto.digests.MD2Digest;
7926-import org.bouncycastle.crypto.digests.MD4Digest;
7927-import org.bouncycastle.crypto.digests.MD5Digest;
7928-import org.bouncycastle.crypto.digests.RIPEMD128Digest;
7929-import org.bouncycastle.crypto.digests.RIPEMD160Digest;
7930-import org.bouncycastle.crypto.digests.SHA1Digest;
7931-import org.bouncycastle.crypto.digests.SHA224Digest;
7932-import org.bouncycastle.crypto.digests.SHA256Digest;
7933-import org.bouncycastle.crypto.digests.SHA384Digest;
7934-import org.bouncycastle.crypto.digests.SHA512Digest;
7935-import org.bouncycastle.crypto.digests.TigerDigest;
7936+// BEGIN android-removed
7937+// import org.bouncycastle.crypto.digests.MD2Digest;
7938+// import org.bouncycastle.crypto.digests.MD4Digest;
7939+// import org.bouncycastle.crypto.digests.MD5Digest;
7940+// import org.bouncycastle.crypto.digests.RIPEMD128Digest;
7941+// import org.bouncycastle.crypto.digests.RIPEMD160Digest;
7942+// import org.bouncycastle.crypto.digests.SHA1Digest;
7943+// import org.bouncycastle.crypto.digests.SHA224Digest;
7944+// import org.bouncycastle.crypto.digests.SHA256Digest;
7945+// import org.bouncycastle.crypto.digests.SHA384Digest;
7946+// import org.bouncycastle.crypto.digests.SHA512Digest;
7947+// import org.bouncycastle.crypto.digests.TigerDigest;
7948+// END android-removed
7949+// BEGIN android-added
7950+import org.bouncycastle.crypto.digests.AndroidDigestFactory;
7951+// END android-added
7952 import org.bouncycastle.crypto.engines.DESEngine;
7953-import org.bouncycastle.crypto.engines.RC2Engine;
7954+// BEGIN android-removed
7955+// import org.bouncycastle.crypto.engines.RC2Engine;
7956+// END android-removed
7957 import org.bouncycastle.crypto.macs.CBCBlockCipherMac;
7958-import org.bouncycastle.crypto.macs.CFBBlockCipherMac;
7959+// BEGIN android-removed
7960+// import org.bouncycastle.crypto.macs.CFBBlockCipherMac;
7961+// END android-removed
7962 import org.bouncycastle.crypto.macs.HMac;
7963-import org.bouncycastle.crypto.macs.ISO9797Alg3Mac;
7964-import org.bouncycastle.crypto.macs.OldHMac;
7965+// BEGIN android-removed
7966+// import org.bouncycastle.crypto.macs.ISO9797Alg3Mac;
7967+// import org.bouncycastle.crypto.macs.OldHMac;
7968+// END android-removed
7969 import org.bouncycastle.crypto.paddings.ISO7816d4Padding;
7970 import org.bouncycastle.crypto.params.KeyParameter;
7971 import org.bouncycastle.crypto.params.ParametersWithIV;
7972@@ -144,109 +155,111 @@
7973      * the classes that extend directly off us.
7974      */
7975 
7976-    /**
7977-     * DES
7978-     */
7979-    public static class DES
7980-        extends JCEMac
7981-    {
7982-        public DES()
7983-        {
7984-            super(new CBCBlockCipherMac(new DESEngine()));
7985-        }
7986-    }
7987-
7988-    /**
7989-     * DES 64 bit MAC
7990-     */
7991-    public static class DES64
7992-        extends JCEMac
7993-    {
7994-        public DES64()
7995-        {
7996-            super(new CBCBlockCipherMac(new DESEngine(), 64));
7997-        }
7998-    }
7999-
8000-    /**
8001-     * RC2
8002-     */
8003-    public static class RC2
8004-        extends JCEMac
8005-    {
8006-        public RC2()
8007-        {
8008-            super(new CBCBlockCipherMac(new RC2Engine()));
8009-        }
8010-    }
8011-
8012-
8013-    
8014-
8015-    /**
8016-     * DES
8017-     */
8018-    public static class DESCFB8
8019-        extends JCEMac
8020-    {
8021-        public DESCFB8()
8022-        {
8023-            super(new CFBBlockCipherMac(new DESEngine()));
8024-        }
8025-    }
8026-
8027-    /**
8028-     * RC2CFB8
8029-     */
8030-
8031-
8032-    /**
8033-     * DES9797Alg3with7816-4Padding
8034-     */
8035-    public static class DES9797Alg3with7816d4
8036-        extends JCEMac
8037-    {
8038-        public DES9797Alg3with7816d4()
8039-        {
8040-            super(new ISO9797Alg3Mac(new DESEngine(), new ISO7816d4Padding()));
8041-        }
8042-    }
8043-
8044-    /**
8045-     * DES9797Alg3
8046-     */
8047-    public static class DES9797Alg3
8048-        extends JCEMac
8049-    {
8050-        public DES9797Alg3()
8051-        {
8052-            super(new ISO9797Alg3Mac(new DESEngine()));
8053-        }
8054-    }
8055-
8056-    /**
8057-     * MD2 HMac
8058-     */
8059-    public static class MD2
8060-        extends JCEMac
8061-    {
8062-        public MD2()
8063-        {
8064-            super(new HMac(new MD2Digest()));
8065-        }
8066-    }
8067-
8068-    /**
8069-     * MD4 HMac
8070-     */
8071-    public static class MD4
8072-        extends JCEMac
8073-    {
8074-        public MD4()
8075-        {
8076-            super(new HMac(new MD4Digest()));
8077-        }
8078-    }
8079+    // BEGIN android-removed
8080+    // /**
8081+    //  * DES
8082+    //  */
8083+    // public static class DES
8084+    //     extends JCEMac
8085+    // {
8086+    //     public DES()
8087+    //     {
8088+    //         super(new CBCBlockCipherMac(new DESEngine()));
8089+    //     }
8090+    // }
8091+    //
8092+    // /**
8093+    //  * DES 64 bit MAC
8094+    //  */
8095+    // public static class DES64
8096+    //     extends JCEMac
8097+    // {
8098+    //     public DES64()
8099+    //     {
8100+    //         super(new CBCBlockCipherMac(new DESEngine(), 64));
8101+    //     }
8102+    // }
8103+    //
8104+    // /**
8105+    //  * RC2
8106+    //  */
8107+    // public static class RC2
8108+    //     extends JCEMac
8109+    // {
8110+    //     public RC2()
8111+    //     {
8112+    //         super(new CBCBlockCipherMac(new RC2Engine()));
8113+    //     }
8114+    // }
8115+    //
8116+    //
8117+    //
8118+    //
8119+    // /**
8120+    //  * DES
8121+    //  */
8122+    // public static class DESCFB8
8123+    //     extends JCEMac
8124+    // {
8125+    //     public DESCFB8()
8126+    //     {
8127+    //         super(new CFBBlockCipherMac(new DESEngine()));
8128+    //     }
8129+    // }
8130+    //
8131+    // /**
8132+    //  * RC2CFB8
8133+    //  */
8134+    //
8135+    //
8136+    // /**
8137+    //  * DES9797Alg3with7816-4Padding
8138+    //  */
8139+    // public static class DES9797Alg3with7816d4
8140+    //     extends JCEMac
8141+    // {
8142+    //     public DES9797Alg3with7816d4()
8143+    //     {
8144+    //         super(new ISO9797Alg3Mac(new DESEngine(), new ISO7816d4Padding()));
8145+    //     }
8146+    // }
8147+    //
8148+    // /**
8149+    //  * DES9797Alg3
8150+    //  */
8151+    // public static class DES9797Alg3
8152+    //     extends JCEMac
8153+    // {
8154+    //     public DES9797Alg3()
8155+    //     {
8156+    //         super(new ISO9797Alg3Mac(new DESEngine()));
8157+    //     }
8158+    // }
8159+    //
8160+    // /**
8161+    //  * MD2 HMac
8162+    //  */
8163+    // public static class MD2
8164+    //     extends JCEMac
8165+    // {
8166+    //     public MD2()
8167+    //     {
8168+    //         super(new HMac(new MD2Digest()));
8169+    //     }
8170+    // }
8171+    //
8172+    // /**
8173+    //  * MD4 HMac
8174+    //  */
8175+    // public static class MD4
8176+    //     extends JCEMac
8177+    // {
8178+    //     public MD4()
8179+    //     {
8180+    //         super(new HMac(new MD4Digest()));
8181+    //     }
8182+    // }
8183+    // END android-removed
8184 
8185     /**
8186      * MD5 HMac
8187@@ -256,7 +269,9 @@
8188     {
8189         public MD5()
8190         {
8191-            super(new HMac(new MD5Digest()));
8192+            // BEGIN android-changed
8193+            super(new HMac(AndroidDigestFactory.getMD5()));
8194+            // END android-changed
8195         }
8196     }
8197 
8198@@ -268,21 +283,25 @@
8199     {
8200         public SHA1()
8201         {
8202-            super(new HMac(new SHA1Digest()));
8203+            // BEGIN android-changed
8204+            super(new HMac(AndroidDigestFactory.getSHA1()));
8205+            // END android-changed
8206         }
8207     }
8208 
8209-    /**
8210-     * SHA-224 HMac
8211-     */
8212-    public static class SHA224
8213-        extends JCEMac
8214-    {
8215-        public SHA224()
8216-        {
8217-            super(new HMac(new SHA224Digest()));
8218-        }
8219-    }
8220+    // BEGIN android-removed
8221+    // /**
8222+    //  * SHA-224 HMac
8223+    //  */
8224+    // public static class SHA224
8225+    //     extends JCEMac
8226+    // {
8227+    //     public SHA224()
8228+    //     {
8229+    //         super(new HMac(new SHA224Digest()));
8230+    //     }
8231+    // }
8232+    // END android-removed
8233     
8234     /**
8235      * SHA-256 HMac
8236@@ -292,7 +311,9 @@
8237     {
8238         public SHA256()
8239         {
8240-            super(new HMac(new SHA256Digest()));
8241+            // BEGIN android-changed
8242+            super(new HMac(AndroidDigestFactory.getSHA256()));
8243+            // END android-changed
8244         }
8245     }
8246 
8247@@ -304,18 +325,22 @@
8248     {
8249         public SHA384()
8250         {
8251-            super(new HMac(new SHA384Digest()));
8252+            // BEGIN android-changed
8253+            super(new HMac(AndroidDigestFactory.getSHA384()));
8254+            // END android-changed
8255         }
8256     }
8257 
8258-    public static class OldSHA384
8259-        extends JCEMac
8260-    {
8261-        public OldSHA384()
8262-        {
8263-            super(new OldHMac(new SHA384Digest()));
8264-        }
8265-    }
8266+    // BEGIN android-removed
8267+    // public static class OldSHA384
8268+    //     extends JCEMac
8269+    // {
8270+    //     public OldSHA384()
8271+    //     {
8272+    //         super(new OldHMac(new SHA384Digest()));
8273+    //     }
8274+    // }
8275+    // END android-removed
8276     
8277     /**
8278      * SHA-512 HMac
8279@@ -325,75 +350,80 @@
8280     {
8281         public SHA512()
8282         {
8283-            super(new HMac(new SHA512Digest()));
8284+            // BEGIN android-changed
8285+            super(new HMac(AndroidDigestFactory.getSHA512()));
8286+            // END android-changed
8287         }
8288     }
8289 
8290-    /**
8291-     * SHA-512 HMac
8292-     */
8293-    public static class OldSHA512
8294-        extends JCEMac
8295-    {
8296-        public OldSHA512()
8297-        {
8298-            super(new OldHMac(new SHA512Digest()));
8299-        }
8300-    }
8301     
8302-    /**
8303-     * RIPEMD128 HMac
8304-     */
8305-    public static class RIPEMD128
8306-        extends JCEMac
8307-    {
8308-        public RIPEMD128()
8309-        {
8310-            super(new HMac(new RIPEMD128Digest()));
8311-        }
8312-    }
8313-
8314-    /**
8315-     * RIPEMD160 HMac
8316-     */
8317-    public static class RIPEMD160
8318-        extends JCEMac
8319-    {
8320-        public RIPEMD160()
8321-        {
8322-            super(new HMac(new RIPEMD160Digest()));
8323-        }
8324-    }
8325-
8326-    /**
8327-     * Tiger HMac
8328-     */
8329-    public static class Tiger
8330-        extends JCEMac
8331-    {
8332-        public Tiger()
8333-        {
8334-            super(new HMac(new TigerDigest()));
8335-        }
8336-    }
8337-
8338+    // BEGIN android-removed
8339+    // /**
8340+    //  * SHA-512 HMac
8341+    //  */
8342+    // public static class OldSHA512
8343+    //     extends JCEMac
8344+    // {
8345+    //     public OldSHA512()
8346+    //     {
8347+    //         super(new OldHMac(new SHA512Digest()));
8348+    //     }
8349+    // }
8350     //
8351-    // PKCS12 states that the same algorithm should be used
8352-    // for the key generation as is used in the HMAC, so that
8353-    // is what we do here.
8354+    // /**
8355+    //  * RIPEMD128 HMac
8356+    //  */
8357+    // public static class RIPEMD128
8358+    //     extends JCEMac
8359+    // {
8360+    //     public RIPEMD128()
8361+    //     {
8362+    //        super(new HMac(new RIPEMD128Digest()));
8363+    //     }
8364+    // }
8365     //
8366-
8367-    /**
8368-     * PBEWithHmacRIPEMD160
8369-     */
8370-    public static class PBEWithRIPEMD160
8371-        extends JCEMac
8372-    {
8373-        public PBEWithRIPEMD160()
8374-        {
8375-            super(new HMac(new RIPEMD160Digest()), PKCS12, RIPEMD160, 160);
8376-        }
8377-    }
8378+    // /**
8379+    //  * RIPEMD160 HMac
8380+    //  */
8381+    // public static class RIPEMD160
8382+    //     extends JCEMac
8383+    // {
8384+    //     public RIPEMD160()
8385+    //     {
8386+    //        super(new HMac(new RIPEMD160Digest()));
8387+    //     }
8388+    // }
8389+    //
8390+    // /**
8391+    //  * Tiger HMac
8392+    //  */
8393+    // public static class Tiger
8394+    //     extends JCEMac
8395+    // {
8396+    //     public Tiger()
8397+    //     {
8398+    //         super(new HMac(new TigerDigest()));
8399+    //     }
8400+    // }
8401+    //
8402+    // //
8403+    // // PKCS12 states that the same algorithm should be used
8404+    // // for the key generation as is used in the HMAC, so that
8405+    // // is what we do here.
8406+    // //
8407+    //
8408+    // /**
8409+    //  * PBEWithHmacRIPEMD160
8410+    //  */
8411+    // public static class PBEWithRIPEMD160
8412+    //     extends JCEMac
8413+    // {
8414+    //     public PBEWithRIPEMD160()
8415+    //     {
8416+    //         super(new HMac(new RIPEMD160Digest()), PKCS12, RIPEMD160, 160);
8417+    //     }
8418+    // }
8419+    // END android-removed
8420 
8421     /**
8422      * PBEWithHmacSHA
8423@@ -403,19 +433,23 @@
8424     {
8425         public PBEWithSHA()
8426         {
8427-            super(new HMac(new SHA1Digest()), PKCS12, SHA1, 160);
8428+            // BEGIN android-changed
8429+            super(new HMac(AndroidDigestFactory.getSHA1()), PKCS12, SHA1, 160);
8430+            // END android-changed
8431         }
8432     }
8433 
8434-    /**
8435-     * PBEWithHmacTiger
8436-     */
8437-    public static class PBEWithTiger
8438-        extends JCEMac
8439-    {
8440-        public PBEWithTiger()
8441-        {
8442-            super(new HMac(new TigerDigest()), PKCS12, TIGER, 192);
8443-        }
8444-    }
8445+    // BEGIN android-removed
8446+    //  /**
8447+    //   * PBEWithHmacTiger
8448+    //   */
8449+    // public static class PBEWithTiger
8450+    //     extends JCEMac
8451+    // {
8452+    //     public PBEWithTiger()
8453+    //     {
8454+    //         super(new HMac(new TigerDigest()), PKCS12, TIGER, 192);
8455+    //     }
8456+    // }
8457+    // END android-removed
8458 }
8459diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/jce/provider/JCERSAPrivateCrtKey.java bcprov-jdk15on-147/org/bouncycastle/jce/provider/JCERSAPrivateCrtKey.java
8460--- bcprov-jdk15on-147.orig/org/bouncycastle/jce/provider/JCERSAPrivateCrtKey.java	2012-03-22 15:11:48.000000000 +0000
8461+++ bcprov-jdk15on-147/org/bouncycastle/jce/provider/JCERSAPrivateCrtKey.java	2012-09-19 21:17:12.000000000 +0000
8462@@ -127,7 +127,9 @@
8463      */
8464     public byte[] getEncoded()
8465     {
8466-        return KeyUtil.getEncodedPrivateKeyInfo(new AlgorithmIdentifier(PKCSObjectIdentifiers.rsaEncryption, new DERNull()), new RSAPrivateKey(getModulus(), getPublicExponent(), getPrivateExponent(), getPrimeP(), getPrimeQ(), getPrimeExponentP(), getPrimeExponentQ(), getCrtCoefficient()));
8467+        // BEGIN android-changed
8468+        return KeyUtil.getEncodedPrivateKeyInfo(new AlgorithmIdentifier(PKCSObjectIdentifiers.rsaEncryption, DERNull.INSTANCE), new RSAPrivateKey(getModulus(), getPublicExponent(), getPrivateExponent(), getPrimeP(), getPrimeQ(), getPrimeExponentP(), getPrimeExponentQ(), getCrtCoefficient()));
8469+        // END android-changed
8470     }
8471 
8472     /**
8473diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/jce/provider/JCERSAPrivateKey.java bcprov-jdk15on-147/org/bouncycastle/jce/provider/JCERSAPrivateKey.java
8474--- bcprov-jdk15on-147.orig/org/bouncycastle/jce/provider/JCERSAPrivateKey.java	2012-03-22 15:11:48.000000000 +0000
8475+++ bcprov-jdk15on-147/org/bouncycastle/jce/provider/JCERSAPrivateKey.java	2012-09-19 21:17:12.000000000 +0000
8476@@ -78,7 +78,9 @@
8477 
8478     public byte[] getEncoded()
8479     {
8480-        return KeyUtil.getEncodedPrivateKeyInfo(new AlgorithmIdentifier(PKCSObjectIdentifiers.rsaEncryption, new DERNull()), new org.bouncycastle.asn1.pkcs.RSAPrivateKey(getModulus(), ZERO, getPrivateExponent(), ZERO, ZERO, ZERO, ZERO, ZERO));
8481+        // BEGIN android-changed
8482+        return KeyUtil.getEncodedPrivateKeyInfo(new AlgorithmIdentifier(PKCSObjectIdentifiers.rsaEncryption, DERNull.INSTANCE), new org.bouncycastle.asn1.pkcs.RSAPrivateKey(getModulus(), ZERO, getPrivateExponent(), ZERO, ZERO, ZERO, ZERO, ZERO));
8483+        // END android-changed
8484     }
8485 
8486     public boolean equals(Object o)
8487diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/jce/provider/JCERSAPublicKey.java bcprov-jdk15on-147/org/bouncycastle/jce/provider/JCERSAPublicKey.java
8488--- bcprov-jdk15on-147.orig/org/bouncycastle/jce/provider/JCERSAPublicKey.java	2012-03-22 15:11:48.000000000 +0000
8489+++ bcprov-jdk15on-147/org/bouncycastle/jce/provider/JCERSAPublicKey.java	2012-09-19 21:17:12.000000000 +0000
8490@@ -91,7 +91,9 @@
8491 
8492     public byte[] getEncoded()
8493     {
8494-        return KeyUtil.getEncodedSubjectPublicKeyInfo(new AlgorithmIdentifier(PKCSObjectIdentifiers.rsaEncryption, new DERNull()), new RSAPublicKeyStructure(getModulus(), getPublicExponent()));
8495+        // BEGIN android-changed
8496+        return KeyUtil.getEncodedSubjectPublicKeyInfo(new AlgorithmIdentifier(PKCSObjectIdentifiers.rsaEncryption, DERNull.INSTANCE), new RSAPublicKeyStructure(getModulus(), getPublicExponent()));
8497+        // END android-changed
8498     }
8499 
8500     public int hashCode()
8501diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/jce/provider/JCESecretKeyFactory.java bcprov-jdk15on-147/org/bouncycastle/jce/provider/JCESecretKeyFactory.java
8502--- bcprov-jdk15on-147.orig/org/bouncycastle/jce/provider/JCESecretKeyFactory.java	2012-03-22 15:11:48.000000000 +0000
8503+++ bcprov-jdk15on-147/org/bouncycastle/jce/provider/JCESecretKeyFactory.java	2012-09-19 21:17:12.000000000 +0000
8504@@ -252,29 +252,31 @@
8505         }
8506     }
8507 
8508-    /**
8509-     * PBEWithMD2AndDES
8510-     */
8511-    static public class PBEWithMD2AndDES
8512-        extends DESPBEKeyFactory
8513-    {
8514-        public PBEWithMD2AndDES()
8515-        {
8516-            super("PBEwithMD2andDES", PKCSObjectIdentifiers.pbeWithMD2AndDES_CBC, true, PKCS5S1, MD2, 64, 64);
8517-        }
8518-    }
8519-
8520-    /**
8521-     * PBEWithMD2AndRC2
8522-     */
8523-    static public class PBEWithMD2AndRC2
8524-        extends PBEKeyFactory
8525-    {
8526-        public PBEWithMD2AndRC2()
8527-        {
8528-            super("PBEwithMD2andRC2", PKCSObjectIdentifiers.pbeWithMD2AndRC2_CBC, true, PKCS5S1, MD2, 64, 64);
8529-        }
8530-    }
8531+    // BEGIN android-removed
8532+    // /**
8533+    //  * PBEWithMD2AndDES
8534+    //  */
8535+    // static public class PBEWithMD2AndDES
8536+    //     extends DESPBEKeyFactory
8537+    // {
8538+    //     public PBEWithMD2AndDES()
8539+    //     {
8540+    //         super("PBEwithMD2andDES", PKCSObjectIdentifiers.pbeWithMD2AndDES_CBC, true, PKCS5S1, MD2, 64, 64);
8541+    //     }
8542+    // }
8543+    //
8544+    // /**
8545+    //  * PBEWithMD2AndRC2
8546+    //  */
8547+    // static public class PBEWithMD2AndRC2
8548+    //     extends PBEKeyFactory
8549+    // {
8550+    //     public PBEWithMD2AndRC2()
8551+    //     {
8552+    //         super("PBEwithMD2andRC2", PKCSObjectIdentifiers.pbeWithMD2AndRC2_CBC, true, PKCS5S1, MD2, 64, 64);
8553+    //     }
8554+    // }
8555+    // END android-removed
8556 
8557    /**
8558     * PBEWithMD5AndDES
8559@@ -408,17 +410,19 @@
8560        }
8561    }
8562    
8563-   /**
8564-    * PBEWithHmacRIPEMD160
8565-    */
8566-   public static class PBEWithRIPEMD160
8567-       extends PBEKeyFactory
8568-   {
8569-       public PBEWithRIPEMD160()
8570-       {
8571-           super("PBEwithHmacRIPEMD160", null, false, PKCS12, RIPEMD160, 160, 0);
8572-       }
8573-   }
8574+   // BEGIN android-removed
8575+   // /**
8576+   //  * PBEWithHmacRIPEMD160
8577+   //  */
8578+   // public static class PBEWithRIPEMD160
8579+   //     extends PBEKeyFactory
8580+   // {
8581+   //     public PBEWithRIPEMD160()
8582+   //     {
8583+   //         super("PBEwithHmacRIPEMD160", null, false, PKCS12, RIPEMD160, 160, 0);
8584+   //     }
8585+   // }
8586+   // END android-removed
8587 
8588    /**
8589     * PBEWithHmacSHA
8590@@ -432,17 +436,19 @@
8591        }
8592    }
8593 
8594-   /**
8595-    * PBEWithHmacTiger
8596-    */
8597-   public static class PBEWithTiger
8598-       extends PBEKeyFactory
8599-   {
8600-       public PBEWithTiger()
8601-       {
8602-           super("PBEwithHmacTiger", null, false, PKCS12, TIGER, 192, 0);
8603-       }
8604-   }
8605+   // BEGIN android-removed
8606+   // /**
8607+   //  * PBEWithHmacTiger
8608+   //  */
8609+   // public static class PBEWithTiger
8610+   //     extends PBEKeyFactory
8611+   // {
8612+   //     public PBEWithTiger()
8613+   //     {
8614+   //         super("PBEwithHmacTiger", null, false, PKCS12, TIGER, 192, 0);
8615+   //     }
8616+   // }
8617+   // END android-removed
8618    
8619    /**
8620     * PBEWithSHA1And128BitAES-BC
8621@@ -551,4 +557,56 @@
8622            super("PBEWithMD5And256BitAES-CBC-OpenSSL", null, true, OPENSSL, MD5, 256, 128);
8623        }
8624    }
8625+    // BEGIN android-added
8626+    static public class PBKDF2WithHmacSHA1
8627+        extends JCESecretKeyFactory
8628+    {
8629+        public PBKDF2WithHmacSHA1()
8630+        {
8631+            super("PBKDF2WithHmacSHA1", PKCSObjectIdentifiers.id_PBKDF2);
8632+        }
8633+
8634+        protected SecretKey engineGenerateSecret(
8635+            KeySpec keySpec)
8636+            throws InvalidKeySpecException
8637+        {
8638+            if (keySpec instanceof PBEKeySpec)
8639+            {
8640+                PBEKeySpec          pbeSpec = (PBEKeySpec)keySpec;
8641+                
8642+                if (pbeSpec.getSalt() == null)
8643+                {
8644+                    throw new InvalidKeySpecException("missing required salt");
8645+                }
8646+
8647+                if (pbeSpec.getIterationCount() <= 0)
8648+                {
8649+                    throw new InvalidKeySpecException("positive iteration count required: "
8650+                                                      + pbeSpec.getIterationCount());
8651+                }
8652+                
8653+                if (pbeSpec.getKeyLength() <= 0)
8654+                {
8655+                    throw new InvalidKeySpecException("positive key length required: "
8656+                                                      + pbeSpec.getKeyLength());
8657+                }
8658+                
8659+                if (pbeSpec.getPassword().length == 0)
8660+                {
8661+                    throw new IllegalArgumentException("password empty");
8662+                }
8663+
8664+                int scheme = PKCS5S2;
8665+                int digest = SHA1;
8666+                int keySize = pbeSpec.getKeyLength();
8667+                int ivSize = -1;
8668+                CipherParameters param = Util.makePBEMacParameters(pbeSpec, scheme, digest, keySize);
8669+                
8670+                return new BCPBEKey(this.algName, this.algOid, scheme, digest, keySize, ivSize, pbeSpec, param);
8671+            }
8672+            
8673+            throw new InvalidKeySpecException("Invalid KeySpec");
8674+        }
8675+    }
8676+    // END android-added
8677 }
8678diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/jce/provider/JCEStreamCipher.java bcprov-jdk15on-147/org/bouncycastle/jce/provider/JCEStreamCipher.java
8679--- bcprov-jdk15on-147.orig/org/bouncycastle/jce/provider/JCEStreamCipher.java	2012-03-22 15:11:48.000000000 +0000
8680+++ bcprov-jdk15on-147/org/bouncycastle/jce/provider/JCEStreamCipher.java	2012-09-19 21:17:12.000000000 +0000
8681@@ -14,20 +14,26 @@
8682 import javax.crypto.ShortBufferException;
8683 import javax.crypto.spec.IvParameterSpec;
8684 import javax.crypto.spec.PBEParameterSpec;
8685-import javax.crypto.spec.RC2ParameterSpec;
8686-import javax.crypto.spec.RC5ParameterSpec;
8687+// BEGIN android-removed
8688+// import javax.crypto.spec.RC2ParameterSpec;
8689+// import javax.crypto.spec.RC5ParameterSpec;
8690+// END android-removed
8691 
8692 import org.bouncycastle.crypto.BlockCipher;
8693 import org.bouncycastle.crypto.CipherParameters;
8694 import org.bouncycastle.crypto.DataLengthException;
8695 import org.bouncycastle.crypto.StreamBlockCipher;
8696 import org.bouncycastle.crypto.StreamCipher;
8697-import org.bouncycastle.crypto.engines.BlowfishEngine;
8698-import org.bouncycastle.crypto.engines.DESEngine;
8699-import org.bouncycastle.crypto.engines.DESedeEngine;
8700+// BEGIN android-removed
8701+// import org.bouncycastle.crypto.engines.BlowfishEngine;
8702+// import org.bouncycastle.crypto.engines.DESEngine;
8703+// import org.bouncycastle.crypto.engines.DESedeEngine;
8704+// END android-removed
8705 import org.bouncycastle.crypto.engines.RC4Engine;
8706-import org.bouncycastle.crypto.engines.SkipjackEngine;
8707-import org.bouncycastle.crypto.engines.TwofishEngine;
8708+// BEGIN android-removed
8709+// import org.bouncycastle.crypto.engines.SkipjackEngine;
8710+// import org.bouncycastle.crypto.engines.TwofishEngine;
8711+// END android-removed
8712 import org.bouncycastle.crypto.modes.CFBBlockCipher;
8713 import org.bouncycastle.crypto.modes.OFBBlockCipher;
8714 import org.bouncycastle.crypto.params.KeyParameter;
8715@@ -44,8 +50,10 @@
8716     //
8717     private Class[]                 availableSpecs =
8718                                     {
8719-                                        RC2ParameterSpec.class,
8720-                                        RC5ParameterSpec.class,
8721+                                        // BEGIN android-removed
8722+                                        // RC2ParameterSpec.class,
8723+                                        // RC5ParameterSpec.class,
8724+                                        // END android-removed
8725                                         IvParameterSpec.class,
8726                                         PBEParameterSpec.class
8727                                     };
8728@@ -376,125 +384,127 @@
8729      * The ciphers that inherit from us.
8730      */
8731 
8732-    /**
8733-     * DES
8734-     */
8735-    static public class DES_CFB8
8736-        extends JCEStreamCipher
8737-    {
8738-        public DES_CFB8()
8739-        {
8740-            super(new CFBBlockCipher(new DESEngine(), 8), 64);
8741-        }
8742-    }
8743-
8744-    /**
8745-     * DESede
8746-     */
8747-    static public class DESede_CFB8
8748-        extends JCEStreamCipher
8749-    {
8750-        public DESede_CFB8()
8751-        {
8752-            super(new CFBBlockCipher(new DESedeEngine(), 8), 64);
8753-        }
8754-    }
8755-
8756-    /**
8757-     * SKIPJACK
8758-     */
8759-    static public class Skipjack_CFB8
8760-        extends JCEStreamCipher
8761-    {
8762-        public Skipjack_CFB8()
8763-        {
8764-            super(new CFBBlockCipher(new SkipjackEngine(), 8), 64);
8765-        }
8766-    }
8767-
8768-    /**
8769-     * Blowfish
8770-     */
8771-    static public class Blowfish_CFB8
8772-        extends JCEStreamCipher
8773-    {
8774-        public Blowfish_CFB8()
8775-        {
8776-            super(new CFBBlockCipher(new BlowfishEngine(), 8), 64);
8777-        }
8778-    }
8779-
8780-    /**
8781-     * Twofish
8782-     */
8783-    static public class Twofish_CFB8
8784-        extends JCEStreamCipher
8785-    {
8786-        public Twofish_CFB8()
8787-        {
8788-            super(new CFBBlockCipher(new TwofishEngine(), 8), 128);
8789-        }
8790-    }
8791-
8792-    /**
8793-     * DES
8794-     */
8795-    static public class DES_OFB8
8796-        extends JCEStreamCipher
8797-    {
8798-        public DES_OFB8()
8799-        {
8800-            super(new OFBBlockCipher(new DESEngine(), 8), 64);
8801-        }
8802-    }
8803-
8804-    /**
8805-     * DESede
8806-     */
8807-    static public class DESede_OFB8
8808-        extends JCEStreamCipher
8809-    {
8810-        public DESede_OFB8()
8811-        {
8812-            super(new OFBBlockCipher(new DESedeEngine(), 8), 64);
8813-        }
8814-    }
8815-
8816-    /**
8817-     * SKIPJACK
8818-     */
8819-    static public class Skipjack_OFB8
8820-        extends JCEStreamCipher
8821-    {
8822-        public Skipjack_OFB8()
8823-        {
8824-            super(new OFBBlockCipher(new SkipjackEngine(), 8), 64);
8825-        }
8826-    }
8827-
8828-    /**
8829-     * Blowfish
8830-     */
8831-    static public class Blowfish_OFB8
8832-        extends JCEStreamCipher
8833-    {
8834-        public Blowfish_OFB8()
8835-        {
8836-            super(new OFBBlockCipher(new BlowfishEngine(), 8), 64);
8837-        }
8838-    }
8839-
8840-    /**
8841-     * Twofish
8842-     */
8843-    static public class Twofish_OFB8
8844-        extends JCEStreamCipher
8845-    {
8846-        public Twofish_OFB8()
8847-        {
8848-            super(new OFBBlockCipher(new TwofishEngine(), 8), 128);
8849-        }
8850-    }
8851+    // BEGIN android-removed
8852+    // /**
8853+    //  * DES
8854+    //  */
8855+    // static public class DES_CFB8
8856+    //     extends JCEStreamCipher
8857+    // {
8858+    //     public DES_CFB8()
8859+    //     {
8860+    //         super(new CFBBlockCipher(new DESEngine(), 8), 64);
8861+    //     }
8862+    // }
8863+    //
8864+    // /**
8865+    //  * DESede
8866+    //  */
8867+    // static public class DESede_CFB8
8868+    //     extends JCEStreamCipher
8869+    // {
8870+    //     public DESede_CFB8()
8871+    //     {
8872+    //         super(new CFBBlockCipher(new DESedeEngine(), 8), 64);
8873+    //     }
8874+    // }
8875+    //
8876+    // /**
8877+    //  * SKIPJACK
8878+    //  */
8879+    // static public class Skipjack_CFB8
8880+    //     extends JCEStreamCipher
8881+    // {
8882+    //     public Skipjack_CFB8()
8883+    //     {
8884+    //         super(new CFBBlockCipher(new SkipjackEngine(), 8), 64);
8885+    //     }
8886+    // }
8887+    //
8888+    // /**
8889+    //  * Blowfish
8890+    //  */
8891+    // static public class Blowfish_CFB8
8892+    //     extends JCEStreamCipher
8893+    // {
8894+    //     public Blowfish_CFB8()
8895+    //     {
8896+    //         super(new CFBBlockCipher(new BlowfishEngine(), 8), 64);
8897+    //     }
8898+    // }
8899+    //
8900+    // /**
8901+    //  * Twofish
8902+    //  */
8903+    // static public class Twofish_CFB8
8904+    //     extends JCEStreamCipher
8905+    // {
8906+    //     public Twofish_CFB8()
8907+    //     {
8908+    //         super(new CFBBlockCipher(new TwofishEngine(), 8), 128);
8909+    //     }
8910+    // }
8911+    //
8912+    // /**
8913+    //  * DES
8914+    //  */
8915+    // static public class DES_OFB8
8916+    //     extends JCEStreamCipher
8917+    // {
8918+    //     public DES_OFB8()
8919+    //     {
8920+    //         super(new OFBBlockCipher(new DESEngine(), 8), 64);
8921+    //     }
8922+    // }
8923+    //
8924+    // /**
8925+    //  * DESede
8926+    //  */
8927+    // static public class DESede_OFB8
8928+    //     extends JCEStreamCipher
8929+    // {
8930+    //     public DESede_OFB8()
8931+    //     {
8932+    //         super(new OFBBlockCipher(new DESedeEngine(), 8), 64);
8933+    //     }
8934+    // }
8935+    //
8936+    // /**
8937+    //  * SKIPJACK
8938+    //  */
8939+    // static public class Skipjack_OFB8
8940+    //     extends JCEStreamCipher
8941+    // {
8942+    //     public Skipjack_OFB8()
8943+    //     {
8944+    //         super(new OFBBlockCipher(new SkipjackEngine(), 8), 64);
8945+    //     }
8946+    // }
8947+    //
8948+    // /**
8949+    //  * Blowfish
8950+    //  */
8951+    // static public class Blowfish_OFB8
8952+    //     extends JCEStreamCipher
8953+    // {
8954+    //     public Blowfish_OFB8()
8955+    //     {
8956+    //         super(new OFBBlockCipher(new BlowfishEngine(), 8), 64);
8957+    //     }
8958+    // }
8959+    //
8960+    // /**
8961+    //  * Twofish
8962+    //  */
8963+    // static public class Twofish_OFB8
8964+    //     extends JCEStreamCipher
8965+    // {
8966+    //     public Twofish_OFB8()
8967+    //     {
8968+    //         super(new OFBBlockCipher(new TwofishEngine(), 8), 128);
8969+    //     }
8970+    // }
8971+    // END android-removed
8972 
8973     /**
8974      * PBEWithSHAAnd128BitRC4
8975diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/jce/provider/JDKAlgorithmParameters.java bcprov-jdk15on-147/org/bouncycastle/jce/provider/JDKAlgorithmParameters.java
8976--- bcprov-jdk15on-147.orig/org/bouncycastle/jce/provider/JDKAlgorithmParameters.java	2012-03-22 15:11:48.000000000 +0000
8977+++ bcprov-jdk15on-147/org/bouncycastle/jce/provider/JDKAlgorithmParameters.java	2012-09-19 21:17:12.000000000 +0000
8978@@ -17,7 +17,9 @@
8979 import org.bouncycastle.asn1.DERSequence;
8980 import org.bouncycastle.asn1.pkcs.PBKDF2Params;
8981 import org.bouncycastle.asn1.pkcs.PKCS12PBEParams;
8982-import org.bouncycastle.jce.spec.IESParameterSpec;
8983+// BEGIN android-removed
8984+// import org.bouncycastle.jce.spec.IESParameterSpec;
8985+// END android-removed
8986 
8987 public abstract class JDKAlgorithmParameters
8988     extends AlgorithmParametersSpi
8989@@ -208,109 +210,111 @@
8990         }
8991     }
8992 
8993-    public static class IES
8994-        extends JDKAlgorithmParameters
8995-    {
8996-        IESParameterSpec     currentSpec;
8997-
8998-        /**
8999-         * in the absence of a standard way of doing it this will do for
9000-         * now...
9001-         */
9002-        protected byte[] engineGetEncoded() 
9003-        {
9004-            try
9005-            {
9006-                ASN1EncodableVector v = new ASN1EncodableVector();
9007-
9008-                v.add(new DEROctetString(currentSpec.getDerivationV()));
9009-                v.add(new DEROctetString(currentSpec.getEncodingV()));
9010-                v.add(new DERInteger(currentSpec.getMacKeySize()));
9011-
9012-                return new DERSequence(v).getEncoded(ASN1Encoding.DER);
9013-            }
9014-            catch (IOException e)
9015-            {
9016-                throw new RuntimeException("Error encoding IESParameters");
9017-            }
9018-        }
9019-
9020-        protected byte[] engineGetEncoded(
9021-            String format) 
9022-        {
9023-            if (isASN1FormatString(format) || format.equalsIgnoreCase("X.509"))
9024-            {
9025-                return engineGetEncoded();
9026-            }
9027-
9028-            return null;
9029-        }
9030-
9031-        protected AlgorithmParameterSpec localEngineGetParameterSpec(
9032-            Class paramSpec) 
9033-            throws InvalidParameterSpecException
9034-        {
9035-            if (paramSpec == IESParameterSpec.class)
9036-            {
9037-                return currentSpec;
9038-            }
9039-
9040-            throw new InvalidParameterSpecException("unknown parameter spec passed to ElGamal parameters object.");
9041-        }
9042-
9043-        protected void engineInit(
9044-            AlgorithmParameterSpec paramSpec) 
9045-            throws InvalidParameterSpecException
9046-        {
9047-            if (!(paramSpec instanceof IESParameterSpec))
9048-            {
9049-                throw new InvalidParameterSpecException("IESParameterSpec required to initialise a IES algorithm parameters object");
9050-            }
9051-
9052-            this.currentSpec = (IESParameterSpec)paramSpec;
9053-        }
9054-
9055-        protected void engineInit(
9056-            byte[] params) 
9057-            throws IOException
9058-        {
9059-            try
9060-            {
9061-                ASN1Sequence s = (ASN1Sequence)ASN1Primitive.fromByteArray(params);
9062-
9063-                this.currentSpec = new IESParameterSpec(
9064-                                        ((ASN1OctetString)s.getObjectAt(0)).getOctets(),
9065-                                        ((ASN1OctetString)s.getObjectAt(0)).getOctets(),
9066-                                        ((DERInteger)s.getObjectAt(0)).getValue().intValue());
9067-            }
9068-            catch (ClassCastException e)
9069-            {
9070-                throw new IOException("Not a valid IES Parameter encoding.");
9071-            }
9072-            catch (ArrayIndexOutOfBoundsException e)
9073-            {
9074-                throw new IOException("Not a valid IES Parameter encoding.");
9075-            }
9076-        }
9077-
9078-        protected void engineInit(
9079-            byte[] params,
9080-            String format) 
9081-            throws IOException
9082-        {
9083-            if (isASN1FormatString(format) || format.equalsIgnoreCase("X.509"))
9084-            {
9085-                engineInit(params);
9086-            }
9087-            else
9088-            {
9089-                throw new IOException("Unknown parameter format " + format);
9090-            }
9091-        }
9092-
9093-        protected String engineToString() 
9094-        {
9095-            return "IES Parameters";
9096-        }
9097-    }
9098+    // BEGIN android-removed
9099+    // public static class IES
9100+    //     extends JDKAlgorithmParameters
9101+    // {
9102+    //     IESParameterSpec     currentSpec;
9103+    //
9104+    //     /**
9105+    //      * in the absence of a standard way of doing it this will do for
9106+    //      * now...
9107+    //      */
9108+    //     protected byte[] engineGetEncoded() 
9109+    //     {
9110+    //         try
9111+    //         {
9112+    //             ASN1EncodableVector v = new ASN1EncodableVector();
9113+    //
9114+    //             v.add(new DEROctetString(currentSpec.getDerivationV()));
9115+    //             v.add(new DEROctetString(currentSpec.getEncodingV()));
9116+    //             v.add(new DERInteger(currentSpec.getMacKeySize()));
9117+    //
9118+    //             return new DERSequence(v).getEncoded(ASN1Encoding.DER);
9119+    //         }
9120+    //         catch (IOException e)
9121+    //         {
9122+    //             throw new RuntimeException("Error encoding IESParameters");
9123+    //         }
9124+    //     }
9125+    //
9126+    //     protected byte[] engineGetEncoded(
9127+    //         String format) 
9128+    //     {
9129+    //         if (isASN1FormatString(format) || format.equalsIgnoreCase("X.509"))
9130+    //         {
9131+    //             return engineGetEncoded();
9132+    //         }
9133+    //
9134+    //         return null;
9135+    //     }
9136+    //
9137+    //     protected AlgorithmParameterSpec localEngineGetParameterSpec(
9138+    //         Class paramSpec) 
9139+    //         throws InvalidParameterSpecException
9140+    //     {
9141+    //         if (paramSpec == IESParameterSpec.class)
9142+    //         {
9143+    //             return currentSpec;
9144+    //         }
9145+    //
9146+    //         throw new InvalidParameterSpecException("unknown parameter spec passed to ElGamal parameters object.");
9147+    //     }
9148+    //
9149+    //     protected void engineInit(
9150+    //         AlgorithmParameterSpec paramSpec) 
9151+    //         throws InvalidParameterSpecException
9152+    //     {
9153+    //         if (!(paramSpec instanceof IESParameterSpec))
9154+    //         {
9155+    //             throw new InvalidParameterSpecException("IESParameterSpec required to initialise a IES algorithm parameters object");
9156+    //         }
9157+    //
9158+    //         this.currentSpec = (IESParameterSpec)paramSpec;
9159+    //     }
9160+    //
9161+    //     protected void engineInit(
9162+    //         byte[] params) 
9163+    //         throws IOException
9164+    //     {
9165+    //         try
9166+    //         {
9167+    //             ASN1Sequence s = (ASN1Sequence)ASN1Primitive.fromByteArray(params);
9168+    //
9169+    //             this.currentSpec = new IESParameterSpec(
9170+    //                                     ((ASN1OctetString)s.getObjectAt(0)).getOctets(),
9171+    //                                     ((ASN1OctetString)s.getObjectAt(0)).getOctets(),
9172+    //                                     ((DERInteger)s.getObjectAt(0)).getValue().intValue());
9173+    //         }
9174+    //         catch (ClassCastException e)
9175+    //         {
9176+    //             throw new IOException("Not a valid IES Parameter encoding.");
9177+    //         }
9178+    //         catch (ArrayIndexOutOfBoundsException e)
9179+    //         {
9180+    //             throw new IOException("Not a valid IES Parameter encoding.");
9181+    //         }
9182+    //     }
9183+    //
9184+    //     protected void engineInit(
9185+    //         byte[] params,
9186+    //         String format) 
9187+    //         throws IOException
9188+    //     {
9189+    //         if (isASN1FormatString(format) || format.equalsIgnoreCase("X.509"))
9190+    //         {
9191+    //             engineInit(params);
9192+    //         }
9193+    //         else
9194+    //         {
9195+    //             throw new IOException("Unknown parameter format " + format);
9196+    //         }
9197+    //     }
9198+    //
9199+    //     protected String engineToString() 
9200+    //     {
9201+    //         return "IES Parameters";
9202+    //     }
9203+    // }
9204+    // END android-removed
9205 }
9206diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/jce/provider/JDKKeyStore.java bcprov-jdk15on-147/org/bouncycastle/jce/provider/JDKKeyStore.java
9207--- bcprov-jdk15on-147.orig/org/bouncycastle/jce/provider/JDKKeyStore.java	2012-03-22 15:11:48.000000000 +0000
9208+++ bcprov-jdk15on-147/org/bouncycastle/jce/provider/JDKKeyStore.java	2012-09-19 21:17:12.000000000 +0000
9209@@ -39,7 +39,12 @@
9210 import org.bouncycastle.crypto.CipherParameters;
9211 import org.bouncycastle.crypto.Digest;
9212 import org.bouncycastle.crypto.PBEParametersGenerator;
9213-import org.bouncycastle.crypto.digests.SHA1Digest;
9214+// BEGIN android-added
9215+import org.bouncycastle.crypto.digests.AndroidDigestFactory;
9216+// END android-added
9217+// BEGIN android-removed
9218+// import org.bouncycastle.crypto.digests.SHA1Digest;
9219+// END android-removed
9220 import org.bouncycastle.crypto.generators.PKCS12ParametersGenerator;
9221 import org.bouncycastle.crypto.io.DigestInputStream;
9222 import org.bouncycastle.crypto.io.DigestOutputStream;
9223@@ -498,7 +503,13 @@
9224 
9225         if (entry == null)
9226         {
9227-            throw new KeyStoreException("no such entry as " + alias);
9228+            // BEGIN android-removed
9229+            // Only throw if there is a problem removing, not if missing
9230+            // throw new KeyStoreException("no such entry as " + alias);
9231+            // END android-removed
9232+            // BEGIN android-added
9233+            return;
9234+            // END android-added
9235         }
9236 
9237         table.remove(alias);
9238@@ -817,12 +828,16 @@
9239         //
9240         // we only do an integrity check if the password is provided.
9241         //
9242-        HMac hMac = new HMac(new SHA1Digest());
9243+        // BEGIN android-changed
9244+        HMac hMac = new HMac(AndroidDigestFactory.getSHA1());
9245+        // END android-changed
9246         if (password != null && password.length != 0)
9247         {
9248             byte[] passKey = PBEParametersGenerator.PKCS12PasswordToBytes(password);
9249 
9250-            PBEParametersGenerator pbeGen = new PKCS12ParametersGenerator(new SHA1Digest());
9251+            // BEGIN android-changed
9252+            PBEParametersGenerator pbeGen = new PKCS12ParametersGenerator(AndroidDigestFactory.getSHA1());
9253+            // END android-changed
9254             pbeGen.init(passKey, salt, iterationCount);
9255 
9256             CipherParameters macParams;
9257@@ -884,9 +899,11 @@
9258         dOut.write(salt);
9259         dOut.writeInt(iterationCount);
9260 
9261-        HMac                    hMac = new HMac(new SHA1Digest());
9262+        // BEGIN android-changed
9263+        HMac                    hMac = new HMac(AndroidDigestFactory.getSHA1());
9264         MacOutputStream         mOut = new MacOutputStream(hMac);
9265-        PBEParametersGenerator  pbeGen = new PKCS12ParametersGenerator(new SHA1Digest());
9266+        PBEParametersGenerator  pbeGen = new PKCS12ParametersGenerator(AndroidDigestFactory.getSHA1());
9267+        // END android-changed
9268         byte[]                  passKey = PBEParametersGenerator.PKCS12PasswordToBytes(password);
9269 
9270         pbeGen.init(passKey, salt, iterationCount);
9271@@ -974,7 +991,9 @@
9272             Cipher cipher = this.makePBECipher(cipherAlg, Cipher.DECRYPT_MODE, password, salt, iterationCount);
9273             CipherInputStream cIn = new CipherInputStream(dIn, cipher);
9274 
9275-            Digest dig = new SHA1Digest();
9276+            // BEGIN android-changed
9277+            Digest dig = AndroidDigestFactory.getSHA1();
9278+            // END android-changed
9279             DigestInputStream  dgIn = new DigestInputStream(cIn, dig);
9280     
9281             this.loadStore(dgIn);
9282@@ -1013,7 +1032,9 @@
9283             cipher = this.makePBECipher(STORE_CIPHER, Cipher.ENCRYPT_MODE, password, salt, iterationCount);
9284     
9285             CipherOutputStream  cOut = new CipherOutputStream(dOut, cipher);
9286-            DigestOutputStream  dgOut = new DigestOutputStream(new SHA1Digest());
9287+            // BEGIN android-changed
9288+            DigestOutputStream  dgOut = new DigestOutputStream(AndroidDigestFactory.getSHA1());
9289+            // END android-changed
9290     
9291             this.saveStore(new TeeOutputStream(cOut, dgOut));
9292     
9293diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/jce/provider/JDKPKCS12KeyStore.java bcprov-jdk15on-147/org/bouncycastle/jce/provider/JDKPKCS12KeyStore.java
9294--- bcprov-jdk15on-147.orig/org/bouncycastle/jce/provider/JDKPKCS12KeyStore.java	2012-03-22 15:11:48.000000000 +0000
9295+++ bcprov-jdk15on-147/org/bouncycastle/jce/provider/JDKPKCS12KeyStore.java	2012-09-19 21:17:12.000000000 +0000
9296@@ -261,10 +261,13 @@
9297             }
9298         }
9299 
9300-        if (c == null && k == null)
9301-        {
9302-            throw new KeyStoreException("no such entry as " + alias);
9303-        }
9304+        // BEGIN android-removed
9305+        // Only throw if there is a problem removing, not if missing
9306+        // if (c == null && k == null)
9307+        // {
9308+        //     throw new KeyStoreException("no such entry as " + alias);
9309+        // }
9310+        // END android-removed
9311     }
9312 
9313     /**
9314@@ -439,6 +442,14 @@
9315     
9316     public Date engineGetCreationDate(String alias) 
9317     {
9318+        // BEGIN android-added
9319+        if (alias == null) {
9320+            throw new NullPointerException("alias == null");
9321+        }
9322+        if (keys.get(alias) == null && certs.get(alias) == null) {
9323+            return null;
9324+        }
9325+        // END android-added
9326         return new Date();
9327     }
9328 
9329@@ -497,6 +508,11 @@
9330         Certificate[]   chain) 
9331         throws KeyStoreException
9332     {
9333+        // BEGIN android-added
9334+        if (!(key instanceof PrivateKey)) {
9335+            throw new KeyStoreException("PKCS12 does not support non-PrivateKeys");
9336+        }
9337+        // END android-added
9338         if ((key instanceof PrivateKey) && (chain == null))
9339         {
9340             throw new KeyStoreException("no certificate chain for private key");
9341@@ -508,12 +524,18 @@
9342         }
9343 
9344         keys.put(alias, key);
9345+        // BEGIN android-added
9346+        if (chain != null) {
9347+        // END android-added
9348         certs.put(alias, chain[0]);
9349 
9350         for (int i = 0; i != chain.length; i++)
9351         {
9352             chainCerts.put(new CertId(chain[i].getPublicKey()), chain[i]);
9353         }
9354+        // BEGIN android-added
9355+        }
9356+        // END android-added
9357     }
9358 
9359     public int engineSize() 
9360@@ -1489,7 +1511,9 @@
9361         {
9362             byte[] res = calculatePbeMac(id_SHA1, mSalt, itCount, password, false, data);
9363 
9364-            AlgorithmIdentifier     algId = new AlgorithmIdentifier(id_SHA1, new DERNull());
9365+            // BEGIN android-changed
9366+            AlgorithmIdentifier     algId = new AlgorithmIdentifier(id_SHA1, DERNull.INSTANCE);
9367+            // END android-changed
9368             DigestInfo              dInfo = new DigestInfo(algId, res);
9369 
9370             mData = new MacData(dInfo, mSalt, itCount);
9371@@ -1546,32 +1570,34 @@
9372         }
9373     }
9374 
9375-    public static class BCPKCS12KeyStore3DES
9376-        extends JDKPKCS12KeyStore
9377-    {
9378-        public BCPKCS12KeyStore3DES()
9379-        {
9380-            super(bcProvider, pbeWithSHAAnd3_KeyTripleDES_CBC, pbeWithSHAAnd3_KeyTripleDES_CBC);
9381-        }
9382-    }
9383-
9384-    public static class DefPKCS12KeyStore
9385-        extends JDKPKCS12KeyStore
9386-    {
9387-        public DefPKCS12KeyStore()
9388-        {
9389-            super(null, pbeWithSHAAnd3_KeyTripleDES_CBC, pbeWithSHAAnd40BitRC2_CBC);
9390-        }
9391-    }
9392-
9393-    public static class DefPKCS12KeyStore3DES
9394-        extends JDKPKCS12KeyStore
9395-    {
9396-        public DefPKCS12KeyStore3DES()
9397-        {
9398-            super(null, pbeWithSHAAnd3_KeyTripleDES_CBC, pbeWithSHAAnd3_KeyTripleDES_CBC);
9399-        }
9400-    }
9401+    // BEGIN android-removed
9402+    // public static class BCPKCS12KeyStore3DES
9403+    //     extends JDKPKCS12KeyStore
9404+    // {
9405+    //     public BCPKCS12KeyStore3DES()
9406+    //     {
9407+    //         super(bcProvider, pbeWithSHAAnd3_KeyTripleDES_CBC, pbeWithSHAAnd3_KeyTripleDES_CBC);
9408+    //     }
9409+    // }
9410+    //
9411+    // public static class DefPKCS12KeyStore
9412+    //     extends JDKPKCS12KeyStore
9413+    // {
9414+    //     public DefPKCS12KeyStore()
9415+    //     {
9416+    //         super(null, pbeWithSHAAnd3_KeyTripleDES_CBC, pbeWithSHAAnd40BitRC2_CBC);
9417+    //     }
9418+    // }
9419+    //
9420+    // public static class DefPKCS12KeyStore3DES
9421+    //     extends JDKPKCS12KeyStore
9422+    // {
9423+    //     public DefPKCS12KeyStore3DES()
9424+    //     {
9425+    //         super(null, pbeWithSHAAnd3_KeyTripleDES_CBC, pbeWithSHAAnd3_KeyTripleDES_CBC);
9426+    //     }
9427+    // }
9428+    // END android-removed
9429 
9430     private static class IgnoresCaseHashtable
9431     {
9432@@ -1580,7 +1606,9 @@
9433 
9434         public void put(String key, Object value)
9435         {
9436-            String lower = Strings.toLowerCase(key);
9437+            // BEGIN android-changed
9438+            String lower = (key == null) ? null : Strings.toLowerCase(key);
9439+            // END android-changed
9440             String k = (String)keys.get(lower);
9441             if (k != null)
9442             {
9443@@ -1598,7 +1626,9 @@
9444 
9445         public Object remove(String alias)
9446         {
9447-            String k = (String)keys.remove(Strings.toLowerCase(alias));
9448+            // BEGIN android-changed
9449+            String k = (String)keys.remove(alias == null ? null : Strings.toLowerCase(alias));
9450+            // END android-changed
9451             if (k == null)
9452             {
9453                 return null;
9454@@ -1609,7 +1639,9 @@
9455 
9456         public Object get(String alias)
9457         {
9458-            String k = (String)keys.get(Strings.toLowerCase(alias));
9459+            // BEGIN android-changed
9460+            String k = (String)keys.get(alias == null ? null : Strings.toLowerCase(alias));
9461+            // END android-changed
9462             if (k == null)
9463             {
9464                 return null;
9465diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/jce/provider/PKIXCertPathValidatorSpi.java bcprov-jdk15on-147/org/bouncycastle/jce/provider/PKIXCertPathValidatorSpi.java
9466--- bcprov-jdk15on-147.orig/org/bouncycastle/jce/provider/PKIXCertPathValidatorSpi.java	2012-03-22 15:11:48.000000000 +0000
9467+++ bcprov-jdk15on-147/org/bouncycastle/jce/provider/PKIXCertPathValidatorSpi.java	2012-09-19 21:17:12.000000000 +0000
9468@@ -1,5 +1,8 @@
9469 package org.bouncycastle.jce.provider;
9470 
9471+// BEGIN android-added
9472+import java.math.BigInteger;
9473+// END android-added
9474 import java.security.InvalidAlgorithmParameterException;
9475 import java.security.PublicKey;
9476 import java.security.cert.CertPath;
9477@@ -33,6 +36,9 @@
9478 public class PKIXCertPathValidatorSpi
9479         extends CertPathValidatorSpi
9480 {
9481+    // BEGIN android-added
9482+    private final static CertBlacklist blacklist = new CertBlacklist();
9483+    // END android-added
9484 
9485     public CertPathValidatorResult engineValidate(
9486             CertPath certPath,
9487@@ -75,6 +81,22 @@
9488         {
9489             throw new CertPathValidatorException("Certification path is empty.", null, certPath, 0);
9490         }
9491+        // BEGIN android-added
9492+        {
9493+            X509Certificate cert = (X509Certificate) certs.get(0);
9494+
9495+            if (cert != null) {
9496+                BigInteger serial = cert.getSerialNumber();
9497+                if (blacklist.isSerialNumberBlackListed(serial)) {
9498+                    // emulate CRL exception message in RFC3280CertPathUtilities.checkCRLs
9499+                    String message = "Certificate revocation of serial 0x" + serial.toString(16);
9500+                    System.out.println(message);
9501+                    AnnotatedException e = new AnnotatedException(message);
9502+                    throw new CertPathValidatorException(e.getMessage(), e, certPath, 0);
9503+                }
9504+            }
9505+        }
9506+        // END android-added
9507 
9508         //
9509         // (b)
9510@@ -251,6 +273,15 @@
9511 
9512         for (index = certs.size() - 1; index >= 0; index--)
9513         {
9514+            // BEGIN android-added
9515+            if (blacklist.isPublicKeyBlackListed(workingPublicKey)) {
9516+                // emulate CRL exception message in RFC3280CertPathUtilities.checkCRLs
9517+                String message = "Certificate revocation of public key " + workingPublicKey;
9518+                System.out.println(message);
9519+                AnnotatedException e = new AnnotatedException(message);
9520+                throw new CertPathValidatorException(e.getMessage(), e, certPath, index);
9521+            }
9522+            // END android-added
9523             // try
9524             // {
9525             //
9526diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/jce/provider/PKIXNameConstraintValidator.java bcprov-jdk15on-147/org/bouncycastle/jce/provider/PKIXNameConstraintValidator.java
9527--- bcprov-jdk15on-147.orig/org/bouncycastle/jce/provider/PKIXNameConstraintValidator.java	2012-03-22 15:11:48.000000000 +0000
9528+++ bcprov-jdk15on-147/org/bouncycastle/jce/provider/PKIXNameConstraintValidator.java	2012-09-19 21:17:12.000000000 +0000
9529@@ -1533,7 +1533,9 @@
9530         for (Enumeration e = permitted.getObjects(); e.hasMoreElements();)
9531         {
9532             GeneralSubtree subtree = GeneralSubtree.getInstance(e.nextElement());
9533-            Integer tagNo = new Integer(subtree.getBase().getTagNo());
9534+            // BEGIN android-changed
9535+            Integer tagNo = Integer.valueOf(subtree.getBase().getTagNo());
9536+            // END android-changed
9537             if (subtreesMap.get(tagNo) == null)
9538             {
9539                 subtreesMap.put(tagNo, new HashSet());
9540diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/jce/provider/X509CertificateObject.java bcprov-jdk15on-147/org/bouncycastle/jce/provider/X509CertificateObject.java
9541--- bcprov-jdk15on-147.orig/org/bouncycastle/jce/provider/X509CertificateObject.java	2012-03-22 15:11:48.000000000 +0000
9542+++ bcprov-jdk15on-147/org/bouncycastle/jce/provider/X509CertificateObject.java	2012-09-19 21:17:12.000000000 +0000
9543@@ -544,12 +544,20 @@
9544         }
9545     }
9546 
9547+    // BEGIN android-changed
9548+    private byte[] encoded;
9549+    // END android-changed
9550     public byte[] getEncoded()
9551         throws CertificateEncodingException
9552     {
9553         try
9554         {
9555-            return c.getEncoded(ASN1Encoding.DER);
9556+            // BEGIN android-changed
9557+            if (encoded == null) {
9558+                encoded = c.getEncoded(ASN1Encoding.DER);
9559+            }
9560+            return encoded;
9561+            // END android-changed
9562         }
9563         catch (IOException e)
9564         {
9565diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/jce/provider/X509SignatureUtil.java bcprov-jdk15on-147/org/bouncycastle/jce/provider/X509SignatureUtil.java
9566--- bcprov-jdk15on-147.orig/org/bouncycastle/jce/provider/X509SignatureUtil.java	2012-03-22 15:11:48.000000000 +0000
9567+++ bcprov-jdk15on-147/org/bouncycastle/jce/provider/X509SignatureUtil.java	2012-09-19 21:17:12.000000000 +0000
9568@@ -14,7 +14,9 @@
9569 import org.bouncycastle.asn1.ASN1Sequence;
9570 import org.bouncycastle.asn1.DERNull;
9571 import org.bouncycastle.asn1.DERObjectIdentifier;
9572-import org.bouncycastle.asn1.cryptopro.CryptoProObjectIdentifiers;
9573+// BEGIN android-removed
9574+// import org.bouncycastle.asn1.cryptopro.CryptoProObjectIdentifiers;
9575+// END android-removed
9576 import org.bouncycastle.asn1.nist.NISTObjectIdentifiers;
9577 import org.bouncycastle.asn1.oiw.OIWObjectIdentifiers;
9578 import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
9579@@ -25,7 +27,9 @@
9580 
9581 class X509SignatureUtil
9582 {
9583-    private static final ASN1Null       derNull = new DERNull();
9584+    // BEGIN android-changed
9585+    private static final ASN1Null       derNull = DERNull.INSTANCE;
9586+    // END android-changed
9587     
9588     static void setSignatureParameters(
9589         Signature signature,
9590@@ -66,12 +70,14 @@
9591         
9592         if (params != null && !derNull.equals(params))
9593         {
9594-            if (sigAlgId.getObjectId().equals(PKCSObjectIdentifiers.id_RSASSA_PSS))
9595-            {
9596-                RSASSAPSSparams rsaParams = RSASSAPSSparams.getInstance(params);
9597-                
9598-                return getDigestAlgName(rsaParams.getHashAlgorithm().getObjectId()) + "withRSAandMGF1";
9599-            }
9600+            // BEGIN android-removed
9601+            // if (sigAlgId.getObjectId().equals(PKCSObjectIdentifiers.id_RSASSA_PSS))
9602+            // {
9603+            //     RSASSAPSSparams rsaParams = RSASSAPSSparams.getInstance(params);
9604+            //
9605+            //     return getDigestAlgName(rsaParams.getHashAlgorithm().getObjectId()) + "withRSAandMGF1";
9606+            // }
9607+            // END android-removed
9608             if (sigAlgId.getObjectId().equals(X9ObjectIdentifiers.ecdsa_with_SHA2))
9609             {
9610                 ASN1Sequence ecDsaParams = ASN1Sequence.getInstance(params);
9611@@ -98,10 +104,12 @@
9612         {
9613             return "SHA1";
9614         }
9615-        else if (NISTObjectIdentifiers.id_sha224.equals(digestAlgOID))
9616-        {
9617-            return "SHA224";
9618-        }
9619+        // BEGIN android-removed
9620+        // else if (NISTObjectIdentifiers.id_sha224.equals(digestAlgOID))
9621+        // {
9622+        //     return "SHA224";
9623+        // }
9624+        // END android-removed
9625         else if (NISTObjectIdentifiers.id_sha256.equals(digestAlgOID))
9626         {
9627             return "SHA256";
9628@@ -114,22 +122,24 @@
9629         {
9630             return "SHA512";
9631         }
9632-        else if (TeleTrusTObjectIdentifiers.ripemd128.equals(digestAlgOID))
9633-        {
9634-            return "RIPEMD128";
9635-        }
9636-        else if (TeleTrusTObjectIdentifiers.ripemd160.equals(digestAlgOID))
9637-        {
9638-            return "RIPEMD160";
9639-        }
9640-        else if (TeleTrusTObjectIdentifiers.ripemd256.equals(digestAlgOID))
9641-        {
9642-            return "RIPEMD256";
9643-        }
9644-        else if (CryptoProObjectIdentifiers.gostR3411.equals(digestAlgOID))
9645-        {
9646-            return "GOST3411";
9647-        }
9648+        // BEGIN android-removed
9649+        // else if (TeleTrusTObjectIdentifiers.ripemd128.equals(digestAlgOID))
9650+        // {
9651+        //     return "RIPEMD128";
9652+        // }
9653+        // else if (TeleTrusTObjectIdentifiers.ripemd160.equals(digestAlgOID))
9654+        // {
9655+        //     return "RIPEMD160";
9656+        // }
9657+        // else if (TeleTrusTObjectIdentifiers.ripemd256.equals(digestAlgOID))
9658+        // {
9659+        //     return "RIPEMD256";
9660+        // }
9661+        // else if (CryptoProObjectIdentifiers.gostR3411.equals(digestAlgOID))
9662+        // {
9663+        //     return "GOST3411";
9664+        // }
9665+        // END android-removed
9666         else
9667         {
9668             return digestAlgOID.getId();            
9669diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/x509/X509Util.java bcprov-jdk15on-147/org/bouncycastle/x509/X509Util.java
9670--- bcprov-jdk15on-147.orig/org/bouncycastle/x509/X509Util.java	2012-03-22 15:11:48.000000000 +0000
9671+++ bcprov-jdk15on-147/org/bouncycastle/x509/X509Util.java	2012-09-19 21:17:12.000000000 +0000
9672@@ -25,12 +25,16 @@
9673 import org.bouncycastle.asn1.ASN1Integer;
9674 import org.bouncycastle.asn1.DERNull;
9675 import org.bouncycastle.asn1.DERObjectIdentifier;
9676-import org.bouncycastle.asn1.cryptopro.CryptoProObjectIdentifiers;
9677+// BEGIN android-removed
9678+// import org.bouncycastle.asn1.cryptopro.CryptoProObjectIdentifiers;
9679+// END android-removed
9680 import org.bouncycastle.asn1.nist.NISTObjectIdentifiers;
9681 import org.bouncycastle.asn1.oiw.OIWObjectIdentifiers;
9682 import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
9683 import org.bouncycastle.asn1.pkcs.RSASSAPSSparams;
9684-import org.bouncycastle.asn1.teletrust.TeleTrusTObjectIdentifiers;
9685+// BEGIN android-removed
9686+// import org.bouncycastle.asn1.teletrust.TeleTrusTObjectIdentifiers;
9687+// END android-removed
9688 import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
9689 import org.bouncycastle.asn1.x9.X9ObjectIdentifiers;
9690 import org.bouncycastle.jce.X509Principal;
9691@@ -44,14 +48,18 @@
9692     
9693     static
9694     {   
9695-        algorithms.put("MD2WITHRSAENCRYPTION", PKCSObjectIdentifiers.md2WithRSAEncryption);
9696-        algorithms.put("MD2WITHRSA", PKCSObjectIdentifiers.md2WithRSAEncryption);
9697+        // BEGIN android-removed
9698+        // algorithms.put("MD2WITHRSAENCRYPTION", PKCSObjectIdentifiers.md2WithRSAEncryption);
9699+        // algorithms.put("MD2WITHRSA", PKCSObjectIdentifiers.md2WithRSAEncryption);
9700+        // END android-removed
9701         algorithms.put("MD5WITHRSAENCRYPTION", PKCSObjectIdentifiers.md5WithRSAEncryption);
9702         algorithms.put("MD5WITHRSA", PKCSObjectIdentifiers.md5WithRSAEncryption);
9703         algorithms.put("SHA1WITHRSAENCRYPTION", PKCSObjectIdentifiers.sha1WithRSAEncryption);
9704         algorithms.put("SHA1WITHRSA", PKCSObjectIdentifiers.sha1WithRSAEncryption);
9705-        algorithms.put("SHA224WITHRSAENCRYPTION", PKCSObjectIdentifiers.sha224WithRSAEncryption);
9706-        algorithms.put("SHA224WITHRSA", PKCSObjectIdentifiers.sha224WithRSAEncryption);
9707+        // BEGIN android-removed
9708+        // algorithms.put("SHA224WITHRSAENCRYPTION", PKCSObjectIdentifiers.sha224WithRSAEncryption);
9709+        // algorithms.put("SHA224WITHRSA", PKCSObjectIdentifiers.sha224WithRSAEncryption);
9710+        // END android-removed
9711         algorithms.put("SHA256WITHRSAENCRYPTION", PKCSObjectIdentifiers.sha256WithRSAEncryption);
9712         algorithms.put("SHA256WITHRSA", PKCSObjectIdentifiers.sha256WithRSAEncryption);
9713         algorithms.put("SHA384WITHRSAENCRYPTION", PKCSObjectIdentifiers.sha384WithRSAEncryption);
9714@@ -59,45 +67,59 @@
9715         algorithms.put("SHA512WITHRSAENCRYPTION", PKCSObjectIdentifiers.sha512WithRSAEncryption);
9716         algorithms.put("SHA512WITHRSA", PKCSObjectIdentifiers.sha512WithRSAEncryption);
9717         algorithms.put("SHA1WITHRSAANDMGF1", PKCSObjectIdentifiers.id_RSASSA_PSS);
9718-        algorithms.put("SHA224WITHRSAANDMGF1", PKCSObjectIdentifiers.id_RSASSA_PSS);
9719+        // BEGIN android-removed
9720+        // algorithms.put("SHA224WITHRSAANDMGF1", PKCSObjectIdentifiers.id_RSASSA_PSS);
9721+        // END android-removed
9722         algorithms.put("SHA256WITHRSAANDMGF1", PKCSObjectIdentifiers.id_RSASSA_PSS);
9723         algorithms.put("SHA384WITHRSAANDMGF1", PKCSObjectIdentifiers.id_RSASSA_PSS);
9724         algorithms.put("SHA512WITHRSAANDMGF1", PKCSObjectIdentifiers.id_RSASSA_PSS);
9725-        algorithms.put("RIPEMD160WITHRSAENCRYPTION", TeleTrusTObjectIdentifiers.rsaSignatureWithripemd160);
9726-        algorithms.put("RIPEMD160WITHRSA", TeleTrusTObjectIdentifiers.rsaSignatureWithripemd160);
9727-        algorithms.put("RIPEMD128WITHRSAENCRYPTION", TeleTrusTObjectIdentifiers.rsaSignatureWithripemd128);
9728-        algorithms.put("RIPEMD128WITHRSA", TeleTrusTObjectIdentifiers.rsaSignatureWithripemd128);
9729-        algorithms.put("RIPEMD256WITHRSAENCRYPTION", TeleTrusTObjectIdentifiers.rsaSignatureWithripemd256);
9730-        algorithms.put("RIPEMD256WITHRSA", TeleTrusTObjectIdentifiers.rsaSignatureWithripemd256);
9731+        // BEGIN android-removed
9732+        // algorithms.put("RIPEMD160WITHRSAENCRYPTION", TeleTrusTObjectIdentifiers.rsaSignatureWithripemd160);
9733+        // algorithms.put("RIPEMD160WITHRSA", TeleTrusTObjectIdentifiers.rsaSignatureWithripemd160);
9734+        // algorithms.put("RIPEMD128WITHRSAENCRYPTION", TeleTrusTObjectIdentifiers.rsaSignatureWithripemd128);
9735+        // algorithms.put("RIPEMD128WITHRSA", TeleTrusTObjectIdentifiers.rsaSignatureWithripemd128);
9736+        // algorithms.put("RIPEMD256WITHRSAENCRYPTION", TeleTrusTObjectIdentifiers.rsaSignatureWithripemd256);
9737+        // algorithms.put("RIPEMD256WITHRSA", TeleTrusTObjectIdentifiers.rsaSignatureWithripemd256);
9738+        // END android-removed
9739         algorithms.put("SHA1WITHDSA", X9ObjectIdentifiers.id_dsa_with_sha1);
9740         algorithms.put("DSAWITHSHA1", X9ObjectIdentifiers.id_dsa_with_sha1);
9741-        algorithms.put("SHA224WITHDSA", NISTObjectIdentifiers.dsa_with_sha224);
9742+        // BEGIN android-removed
9743+        // algorithms.put("SHA224WITHDSA", NISTObjectIdentifiers.dsa_with_sha224);
9744+        // END android-removed
9745         algorithms.put("SHA256WITHDSA", NISTObjectIdentifiers.dsa_with_sha256);
9746         algorithms.put("SHA384WITHDSA", NISTObjectIdentifiers.dsa_with_sha384);
9747         algorithms.put("SHA512WITHDSA", NISTObjectIdentifiers.dsa_with_sha512);
9748         algorithms.put("SHA1WITHECDSA", X9ObjectIdentifiers.ecdsa_with_SHA1);
9749         algorithms.put("ECDSAWITHSHA1", X9ObjectIdentifiers.ecdsa_with_SHA1);
9750-        algorithms.put("SHA224WITHECDSA", X9ObjectIdentifiers.ecdsa_with_SHA224);
9751+        // BEGIN android-removed
9752+        // algorithms.put("SHA224WITHECDSA", X9ObjectIdentifiers.ecdsa_with_SHA224);
9753+        // END android-removed
9754         algorithms.put("SHA256WITHECDSA", X9ObjectIdentifiers.ecdsa_with_SHA256);
9755         algorithms.put("SHA384WITHECDSA", X9ObjectIdentifiers.ecdsa_with_SHA384);
9756         algorithms.put("SHA512WITHECDSA", X9ObjectIdentifiers.ecdsa_with_SHA512);
9757-        algorithms.put("GOST3411WITHGOST3410", CryptoProObjectIdentifiers.gostR3411_94_with_gostR3410_94);
9758-        algorithms.put("GOST3411WITHGOST3410-94", CryptoProObjectIdentifiers.gostR3411_94_with_gostR3410_94);
9759-        algorithms.put("GOST3411WITHECGOST3410", CryptoProObjectIdentifiers.gostR3411_94_with_gostR3410_2001);
9760-        algorithms.put("GOST3411WITHECGOST3410-2001", CryptoProObjectIdentifiers.gostR3411_94_with_gostR3410_2001);
9761-        algorithms.put("GOST3411WITHGOST3410-2001", CryptoProObjectIdentifiers.gostR3411_94_with_gostR3410_2001);
9762+        // BEGIN android-removed
9763+        // algorithms.put("GOST3411WITHGOST3410", CryptoProObjectIdentifiers.gostR3411_94_with_gostR3410_94);
9764+        // algorithms.put("GOST3411WITHGOST3410-94", CryptoProObjectIdentifiers.gostR3411_94_with_gostR3410_94);
9765+        // algorithms.put("GOST3411WITHECGOST3410", CryptoProObjectIdentifiers.gostR3411_94_with_gostR3410_2001);
9766+        // algorithms.put("GOST3411WITHECGOST3410-2001", CryptoProObjectIdentifiers.gostR3411_94_with_gostR3410_2001);
9767+        // algorithms.put("GOST3411WITHGOST3410-2001", CryptoProObjectIdentifiers.gostR3411_94_with_gostR3410_2001);
9768+        // END android-removed
9769 
9770         //
9771         // According to RFC 3279, the ASN.1 encoding SHALL (id-dsa-with-sha1) or MUST (ecdsa-with-SHA*) omit the parameters field. 
9772         // The parameters field SHALL be NULL for RSA based signature algorithms.
9773         //
9774         noParams.add(X9ObjectIdentifiers.ecdsa_with_SHA1);
9775-        noParams.add(X9ObjectIdentifiers.ecdsa_with_SHA224);
9776+        // BEGIN android-removed
9777+        // noParams.add(X9ObjectIdentifiers.ecdsa_with_SHA224);
9778+        // END android-removed
9779         noParams.add(X9ObjectIdentifiers.ecdsa_with_SHA256);
9780         noParams.add(X9ObjectIdentifiers.ecdsa_with_SHA384);
9781         noParams.add(X9ObjectIdentifiers.ecdsa_with_SHA512);
9782         noParams.add(X9ObjectIdentifiers.id_dsa_with_sha1);
9783-        noParams.add(NISTObjectIdentifiers.dsa_with_sha224);
9784+        // BEGIN android-removed
9785+        // noParams.add(NISTObjectIdentifiers.dsa_with_sha224);
9786+        // END android-removed
9787         noParams.add(NISTObjectIdentifiers.dsa_with_sha256);
9788         noParams.add(NISTObjectIdentifiers.dsa_with_sha384);
9789         noParams.add(NISTObjectIdentifiers.dsa_with_sha512);
9790@@ -105,25 +127,39 @@
9791         //
9792         // RFC 4491
9793         //
9794-        noParams.add(CryptoProObjectIdentifiers.gostR3411_94_with_gostR3410_94);
9795-        noParams.add(CryptoProObjectIdentifiers.gostR3411_94_with_gostR3410_2001);
9796+        // BEGIN android-removed
9797+        // noParams.add(CryptoProObjectIdentifiers.gostR3411_94_with_gostR3410_94);
9798+        // noParams.add(CryptoProObjectIdentifiers.gostR3411_94_with_gostR3410_2001);
9799+        // END android-removed
9800 
9801         //
9802         // explicit params
9803         //
9804-        AlgorithmIdentifier sha1AlgId = new AlgorithmIdentifier(OIWObjectIdentifiers.idSHA1, new DERNull());
9805+        // BEGIN android-changed
9806+        AlgorithmIdentifier sha1AlgId = new AlgorithmIdentifier(OIWObjectIdentifiers.idSHA1, DERNull.INSTANCE);
9807+        // END android-changed
9808         params.put("SHA1WITHRSAANDMGF1", creatPSSParams(sha1AlgId, 20));
9809 
9810-        AlgorithmIdentifier sha224AlgId = new AlgorithmIdentifier(NISTObjectIdentifiers.id_sha224, new DERNull());
9811-        params.put("SHA224WITHRSAANDMGF1", creatPSSParams(sha224AlgId, 28));
9812-
9813-        AlgorithmIdentifier sha256AlgId = new AlgorithmIdentifier(NISTObjectIdentifiers.id_sha256, new DERNull());
9814+        // BEGIN android-removed
9815+        // // BEGIN android-changed
9816+        // AlgorithmIdentifier sha224AlgId = new AlgorithmIdentifier(NISTObjectIdentifiers.id_sha224, DERNull.INSTANCE);
9817+        // // END android-changed
9818+        // params.put("SHA224WITHRSAANDMGF1", creatPSSParams(sha224AlgId, 28));
9819+        // END android-removed
9820+
9821+        // BEGIN android-changed
9822+        AlgorithmIdentifier sha256AlgId = new AlgorithmIdentifier(NISTObjectIdentifiers.id_sha256, DERNull.INSTANCE);
9823+        // END android-changed
9824         params.put("SHA256WITHRSAANDMGF1", creatPSSParams(sha256AlgId, 32));
9825 
9826-        AlgorithmIdentifier sha384AlgId = new AlgorithmIdentifier(NISTObjectIdentifiers.id_sha384, new DERNull());
9827+        // BEGIN android-changed
9828+        AlgorithmIdentifier sha384AlgId = new AlgorithmIdentifier(NISTObjectIdentifiers.id_sha384, DERNull.INSTANCE);
9829+        // END android-changed
9830         params.put("SHA384WITHRSAANDMGF1", creatPSSParams(sha384AlgId, 48));
9831 
9832-        AlgorithmIdentifier sha512AlgId = new AlgorithmIdentifier(NISTObjectIdentifiers.id_sha512, new DERNull());
9833+        // BEGIN android-changed
9834+        AlgorithmIdentifier sha512AlgId = new AlgorithmIdentifier(NISTObjectIdentifiers.id_sha512, DERNull.INSTANCE);
9835+        // END android-changed
9836         params.put("SHA512WITHRSAANDMGF1", creatPSSParams(sha512AlgId, 64));
9837     }
9838 
9839@@ -166,7 +202,9 @@
9840         }
9841         else
9842         {
9843-            return new AlgorithmIdentifier(sigOid, new DERNull());
9844+            // BEGIN android-changed
9845+            return new AlgorithmIdentifier(sigOid, DERNull.INSTANCE);
9846+            // END android-changed
9847         }
9848     }
9849     
9850diff -Naur bcprov-jdk15on-147.orig/org/bouncycastle/x509/extension/X509ExtensionUtil.java bcprov-jdk15on-147/org/bouncycastle/x509/extension/X509ExtensionUtil.java
9851--- bcprov-jdk15on-147.orig/org/bouncycastle/x509/extension/X509ExtensionUtil.java	2012-03-22 15:11:48.000000000 +0000
9852+++ bcprov-jdk15on-147/org/bouncycastle/x509/extension/X509ExtensionUtil.java	2012-09-19 21:17:12.000000000 +0000
9853@@ -62,7 +62,9 @@
9854             {
9855                 GeneralName genName = GeneralName.getInstance(it.nextElement());
9856                 List list = new ArrayList();
9857-                list.add(new Integer(genName.getTagNo()));
9858+                // BEGIN android-changed
9859+                list.add(Integer.valueOf(genName.getTagNo()));
9860+                // END android-changed
9861                 switch (genName.getTagNo())
9862                 {
9863                 case GeneralName.ediPartyName:
9864