116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giropackage org.bouncycastle.operator.bc;
216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport java.util.Collections;
416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport java.util.HashMap;
516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport java.util.Map;
616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
7c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro// BEGIN android-removed
8c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro// import org.bouncycastle.asn1.cryptopro.CryptoProObjectIdentifiers;
9c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro// END android-removed
1016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.nist.NISTObjectIdentifiers;
1116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.oiw.OIWObjectIdentifiers;
1216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
1316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.teletrust.TeleTrusTObjectIdentifiers;
1416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.x509.AlgorithmIdentifier;
1516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.crypto.ExtendedDigest;
16c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro// BEGIN android-removed
17c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro// import org.bouncycastle.crypto.digests.GOST3411Digest;
18c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro// import org.bouncycastle.crypto.digests.MD2Digest;
19c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro// import org.bouncycastle.crypto.digests.MD4Digest;
20c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro// END android-removed
2116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.crypto.digests.MD5Digest;
22c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro// BEGIN android-removed
23c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro// import org.bouncycastle.crypto.digests.RIPEMD128Digest;
24c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro// import org.bouncycastle.crypto.digests.RIPEMD160Digest;
25c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro// import org.bouncycastle.crypto.digests.RIPEMD256Digest;
26c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro// END android-removed
2716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.crypto.digests.SHA1Digest;
2816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.crypto.digests.SHA224Digest;
2916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.crypto.digests.SHA256Digest;
3016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.crypto.digests.SHA384Digest;
317dad97b63c47edea4e3afb374dcd00c7b7a1bdd4Sergio Giro// BEGIN android-removed
327dad97b63c47edea4e3afb374dcd00c7b7a1bdd4Sergio Giro// import org.bouncycastle.crypto.digests.SHA3Digest;
337dad97b63c47edea4e3afb374dcd00c7b7a1bdd4Sergio Giro// END android-removed
3416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.crypto.digests.SHA512Digest;
3516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.operator.OperatorCreationException;
3616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
3716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giropublic class BcDefaultDigestProvider
3816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    implements BcDigestProvider
3916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro{
4016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    private static final Map lookup = createTable();
4116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
4216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    private static Map createTable()
4316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
4416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        Map table = new HashMap();
4516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
4616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        table.put(OIWObjectIdentifiers.idSHA1, new BcDigestProvider()
4716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
4816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            public ExtendedDigest get(AlgorithmIdentifier digestAlgorithmIdentifier)
4916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            {
5016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                return new SHA1Digest();
5116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            }
5216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        });
5316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        table.put(NISTObjectIdentifiers.id_sha224, new BcDigestProvider()
5416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
5516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            public ExtendedDigest get(AlgorithmIdentifier digestAlgorithmIdentifier)
5616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            {
5716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                return new SHA224Digest();
5816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            }
5916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        });
6016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        table.put(NISTObjectIdentifiers.id_sha256, new BcDigestProvider()
6116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
6216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            public ExtendedDigest get(AlgorithmIdentifier digestAlgorithmIdentifier)
6316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            {
6416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                return new SHA256Digest();
6516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            }
6616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        });
6716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        table.put(NISTObjectIdentifiers.id_sha384, new BcDigestProvider()
6816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
6916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            public ExtendedDigest get(AlgorithmIdentifier digestAlgorithmIdentifier)
7016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            {
7116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                return new SHA384Digest();
7216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            }
7316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        });
7416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        table.put(NISTObjectIdentifiers.id_sha512, new BcDigestProvider()
7516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
7616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            public ExtendedDigest get(AlgorithmIdentifier digestAlgorithmIdentifier)
7716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            {
7816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                return new SHA512Digest();
7916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            }
8016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        });
81c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro        // BEGIN android-removed
827dad97b63c47edea4e3afb374dcd00c7b7a1bdd4Sergio Giro        // table.put(NISTObjectIdentifiers.id_sha3_224, new BcDigestProvider()
837dad97b63c47edea4e3afb374dcd00c7b7a1bdd4Sergio Giro        // {
847dad97b63c47edea4e3afb374dcd00c7b7a1bdd4Sergio Giro        //     public ExtendedDigest get(AlgorithmIdentifier digestAlgorithmIdentifier)
857dad97b63c47edea4e3afb374dcd00c7b7a1bdd4Sergio Giro        //     {
867dad97b63c47edea4e3afb374dcd00c7b7a1bdd4Sergio Giro        //         return new SHA3Digest(224);
877dad97b63c47edea4e3afb374dcd00c7b7a1bdd4Sergio Giro        //     }
887dad97b63c47edea4e3afb374dcd00c7b7a1bdd4Sergio Giro        // });
897dad97b63c47edea4e3afb374dcd00c7b7a1bdd4Sergio Giro        // table.put(NISTObjectIdentifiers.id_sha3_256, new BcDigestProvider()
907dad97b63c47edea4e3afb374dcd00c7b7a1bdd4Sergio Giro        // {
917dad97b63c47edea4e3afb374dcd00c7b7a1bdd4Sergio Giro        //     public ExtendedDigest get(AlgorithmIdentifier digestAlgorithmIdentifier)
927dad97b63c47edea4e3afb374dcd00c7b7a1bdd4Sergio Giro        //     {
937dad97b63c47edea4e3afb374dcd00c7b7a1bdd4Sergio Giro        //         return new SHA3Digest(256);
947dad97b63c47edea4e3afb374dcd00c7b7a1bdd4Sergio Giro        //     }
957dad97b63c47edea4e3afb374dcd00c7b7a1bdd4Sergio Giro        // });
967dad97b63c47edea4e3afb374dcd00c7b7a1bdd4Sergio Giro        // table.put(NISTObjectIdentifiers.id_sha3_384, new BcDigestProvider()
977dad97b63c47edea4e3afb374dcd00c7b7a1bdd4Sergio Giro        // {
987dad97b63c47edea4e3afb374dcd00c7b7a1bdd4Sergio Giro        //     public ExtendedDigest get(AlgorithmIdentifier digestAlgorithmIdentifier)
997dad97b63c47edea4e3afb374dcd00c7b7a1bdd4Sergio Giro        //     {
1007dad97b63c47edea4e3afb374dcd00c7b7a1bdd4Sergio Giro        //         return new SHA3Digest(384);
1017dad97b63c47edea4e3afb374dcd00c7b7a1bdd4Sergio Giro        //     }
1027dad97b63c47edea4e3afb374dcd00c7b7a1bdd4Sergio Giro        // });
1037dad97b63c47edea4e3afb374dcd00c7b7a1bdd4Sergio Giro        // table.put(NISTObjectIdentifiers.id_sha3_512, new BcDigestProvider()
1047dad97b63c47edea4e3afb374dcd00c7b7a1bdd4Sergio Giro        // {
1057dad97b63c47edea4e3afb374dcd00c7b7a1bdd4Sergio Giro        //     public ExtendedDigest get(AlgorithmIdentifier digestAlgorithmIdentifier)
1067dad97b63c47edea4e3afb374dcd00c7b7a1bdd4Sergio Giro        //     {
1077dad97b63c47edea4e3afb374dcd00c7b7a1bdd4Sergio Giro        //         return new SHA3Digest(512);
1087dad97b63c47edea4e3afb374dcd00c7b7a1bdd4Sergio Giro        //     }
1097dad97b63c47edea4e3afb374dcd00c7b7a1bdd4Sergio Giro        // });
1107dad97b63c47edea4e3afb374dcd00c7b7a1bdd4Sergio Giro        // table.put(PKCSObjectIdentifiers.md5, new BcDigestProvider()
1117dad97b63c47edea4e3afb374dcd00c7b7a1bdd4Sergio Giro        // {
1127dad97b63c47edea4e3afb374dcd00c7b7a1bdd4Sergio Giro        //     public ExtendedDigest get(AlgorithmIdentifier digestAlgorithmIdentifier)
1137dad97b63c47edea4e3afb374dcd00c7b7a1bdd4Sergio Giro        //     {
1147dad97b63c47edea4e3afb374dcd00c7b7a1bdd4Sergio Giro        //         return new MD5Digest();
1157dad97b63c47edea4e3afb374dcd00c7b7a1bdd4Sergio Giro        //     }
1167dad97b63c47edea4e3afb374dcd00c7b7a1bdd4Sergio Giro        // });
117c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro        // table.put(PKCSObjectIdentifiers.md4, new BcDigestProvider()
118c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro        // {
119c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro        //     public ExtendedDigest get(AlgorithmIdentifier digestAlgorithmIdentifier)
120c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro        //     {
121c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro        //         return new MD4Digest();
122c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro        //     }
123c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro        // });
124c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro        // table.put(PKCSObjectIdentifiers.md2, new BcDigestProvider()
125c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro        // {
126c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro        //     public ExtendedDigest get(AlgorithmIdentifier digestAlgorithmIdentifier)
127c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro        //     {
128c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro        //         return new MD2Digest();
129c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro        //     }
130c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro        // });
131c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro        // table.put(CryptoProObjectIdentifiers.gostR3411, new BcDigestProvider()
132c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro        // {
133c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro        //     public ExtendedDigest get(AlgorithmIdentifier digestAlgorithmIdentifier)
134c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro        //     {
135c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro        //         return new GOST3411Digest();
136c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro        //     }
137c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro        // });
138c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro        // table.put(TeleTrusTObjectIdentifiers.ripemd128, new BcDigestProvider()
139c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro        // {
140c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro        //     public ExtendedDigest get(AlgorithmIdentifier digestAlgorithmIdentifier)
141c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro        //     {
142c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro        //         return new RIPEMD128Digest();
143c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro        //     }
144c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro        // });
145c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro        // table.put(TeleTrusTObjectIdentifiers.ripemd160, new BcDigestProvider()
146c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro        // {
147c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro        //     public ExtendedDigest get(AlgorithmIdentifier digestAlgorithmIdentifier)
148c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro        //     {
149c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro        //         return new RIPEMD160Digest();
150c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro        //     }
151c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro        // });
152c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro        // table.put(TeleTrusTObjectIdentifiers.ripemd256, new BcDigestProvider()
153c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro        // {
154c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro        //     public ExtendedDigest get(AlgorithmIdentifier digestAlgorithmIdentifier)
155c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro        //     {
156c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro        //         return new RIPEMD256Digest();
157c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro        //     }
158c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro        // });
159c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro        // END android-removed
16016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
16116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        return Collections.unmodifiableMap(table);
16216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
16316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
16416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public static final BcDigestProvider INSTANCE = new BcDefaultDigestProvider();
16516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
16616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    private BcDefaultDigestProvider()
16716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
16816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
16916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
17016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
17116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public ExtendedDigest get(AlgorithmIdentifier digestAlgorithmIdentifier)
17216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        throws OperatorCreationException
17316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
17416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        BcDigestProvider extProv = (BcDigestProvider)lookup.get(digestAlgorithmIdentifier.getAlgorithm());
17516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
17616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        if (extProv == null)
17716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
17816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            throw new OperatorCreationException("cannot recognise digest");
17916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
18016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
18116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        return extProv.get(digestAlgorithmIdentifier);
18216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
18316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro}
184