1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage org.bouncycastle.x509;
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.IOException;
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.ArrayList;
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.Enumeration;
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.HashSet;
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.Hashtable;
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.Iterator;
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.List;
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.Set;
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport javax.security.auth.x500.X500Principal;
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.bouncycastle.asn1.DERNull;
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.bouncycastle.asn1.DERObjectIdentifier;
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.bouncycastle.asn1.cryptopro.CryptoProObjectIdentifiers;
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.bouncycastle.asn1.x509.AlgorithmIdentifier;
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project// BEGIN android-removed
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project// import org.bouncycastle.asn1.x9.X9ObjectIdentifiers;
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project// import org.bouncycastle.asn1.nist.NISTObjectIdentifiers;
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project// END android-removed
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.bouncycastle.jce.X509Principal;
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.bouncycastle.util.Strings;
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectclass X509Util
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static Hashtable algorithms = new Hashtable();
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static Set       noParams = new HashSet();
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        algorithms.put("MD2WITHRSAENCRYPTION", new DERObjectIdentifier("1.2.840.113549.1.1.2"));
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        algorithms.put("MD2WITHRSA", new DERObjectIdentifier("1.2.840.113549.1.1.2"));
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        algorithms.put("MD5WITHRSAENCRYPTION", new DERObjectIdentifier("1.2.840.113549.1.1.4"));
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        algorithms.put("MD5WITHRSA", new DERObjectIdentifier("1.2.840.113549.1.1.4"));
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        algorithms.put("SHA1WITHRSAENCRYPTION", new DERObjectIdentifier("1.2.840.113549.1.1.5"));
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        algorithms.put("SHA1WITHRSA", new DERObjectIdentifier("1.2.840.113549.1.1.5"));
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        algorithms.put("SHA224WITHRSAENCRYPTION", PKCSObjectIdentifiers.sha224WithRSAEncryption);
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        algorithms.put("SHA224WITHRSA", PKCSObjectIdentifiers.sha224WithRSAEncryption);
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        algorithms.put("SHA256WITHRSAENCRYPTION", PKCSObjectIdentifiers.sha256WithRSAEncryption);
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        algorithms.put("SHA256WITHRSA", PKCSObjectIdentifiers.sha256WithRSAEncryption);
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        algorithms.put("SHA384WITHRSAENCRYPTION", PKCSObjectIdentifiers.sha384WithRSAEncryption);
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        algorithms.put("SHA384WITHRSA", PKCSObjectIdentifiers.sha384WithRSAEncryption);
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        algorithms.put("SHA512WITHRSAENCRYPTION", PKCSObjectIdentifiers.sha512WithRSAEncryption);
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        algorithms.put("SHA512WITHRSA", PKCSObjectIdentifiers.sha512WithRSAEncryption);
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        algorithms.put("RIPEMD160WITHRSAENCRYPTION", new DERObjectIdentifier("1.3.36.3.3.1.2"));
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        algorithms.put("RIPEMD160WITHRSA", new DERObjectIdentifier("1.3.36.3.3.1.2"));
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // BEGIN android-removed
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // algorithms.put("SHA1WITHDSA", X9ObjectIdentifiers.id_dsa_with_sha1);
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // algorithms.put("DSAWITHSHA1", X9ObjectIdentifiers.id_dsa_with_sha1);
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // algorithms.put("SHA224WITHDSA", NISTObjectIdentifiers.dsa_with_sha224);
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // algorithms.put("SHA256WITHDSA", NISTObjectIdentifiers.dsa_with_sha256);
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // algorithms.put("SHA1WITHECDSA", X9ObjectIdentifiers.ecdsa_with_SHA1);
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // algorithms.put("ECDSAWITHSHA1", X9ObjectIdentifiers.ecdsa_with_SHA1);
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // algorithms.put("SHA224WITHECDSA", X9ObjectIdentifiers.ecdsa_with_SHA224);
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // algorithms.put("SHA256WITHECDSA", X9ObjectIdentifiers.ecdsa_with_SHA256);
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // algorithms.put("SHA384WITHECDSA", X9ObjectIdentifiers.ecdsa_with_SHA384);
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // algorithms.put("SHA512WITHECDSA", X9ObjectIdentifiers.ecdsa_with_SHA512);
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // END android-removed
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        algorithms.put("GOST3411WITHGOST3410", CryptoProObjectIdentifiers.gostR3411_94_with_gostR3410_94);
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        algorithms.put("GOST3411WITHGOST3410-94", CryptoProObjectIdentifiers.gostR3411_94_with_gostR3410_94);
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        //
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // According to RFC 3279, the ASN.1 encoding SHALL (id-dsa-with-sha1) or MUST (ecdsa-with-SHA*) omit the parameters field.
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // The parameters field SHALL be NULL for RSA based signature algorithms.
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        //
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // BEGIN android-removed
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // noParams.add(X9ObjectIdentifiers.ecdsa_with_SHA1);
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // noParams.add(X9ObjectIdentifiers.ecdsa_with_SHA224);
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // noParams.add(X9ObjectIdentifiers.ecdsa_with_SHA256);
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // noParams.add(X9ObjectIdentifiers.ecdsa_with_SHA384);
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // noParams.add(X9ObjectIdentifiers.ecdsa_with_SHA512);
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // noParams.add(X9ObjectIdentifiers.id_dsa_with_sha1);
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // noParams.add(NISTObjectIdentifiers.dsa_with_sha224);
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // noParams.add(NISTObjectIdentifiers.dsa_with_sha256);
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // END android-removed
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static DERObjectIdentifier getAlgorithmOID(
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        String algorithmName)
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        algorithmName = Strings.toUpperCase(algorithmName);
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (algorithms.containsKey(algorithmName))
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return (DERObjectIdentifier)algorithms.get(algorithmName);
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return new DERObjectIdentifier(algorithmName);
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static AlgorithmIdentifier getSigAlgID(
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        DERObjectIdentifier sigOid)
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (noParams.contains(sigOid))
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return new AlgorithmIdentifier(sigOid);
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        else
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            // BEGIN android-changed
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return new AlgorithmIdentifier(sigOid, DERNull.THE_ONE);
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            // END android-changed
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static Iterator getAlgNames()
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Enumeration e = algorithms.keys();
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        List        l = new ArrayList();
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        while (e.hasMoreElements())
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            l.add(e.nextElement());
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return l.iterator();
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static X509Principal convertPrincipal(
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        X500Principal principal)
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return new X509Principal(principal.getEncoded());
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        catch (IOException e)
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new IllegalArgumentException("cannot convert principal");
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
134