1e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrompackage org.bouncycastle.cms;
2e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
3e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport java.util.HashMap;
4e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport java.util.Map;
5e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
6e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport org.bouncycastle.asn1.ASN1ObjectIdentifier;
7e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom// BEGIN android-removed
8e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom// import org.bouncycastle.asn1.cryptopro.CryptoProObjectIdentifiers;
9e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom// END android-removed
10e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport org.bouncycastle.asn1.eac.EACObjectIdentifiers;
11e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport org.bouncycastle.asn1.nist.NISTObjectIdentifiers;
12e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport org.bouncycastle.asn1.oiw.OIWObjectIdentifiers;
13e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
14e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport org.bouncycastle.asn1.teletrust.TeleTrusTObjectIdentifiers;
15e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport org.bouncycastle.asn1.x509.AlgorithmIdentifier;
16e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport org.bouncycastle.asn1.x509.X509ObjectIdentifiers;
17e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport org.bouncycastle.asn1.x9.X9ObjectIdentifiers;
18e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
19e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrompublic class DefaultCMSSignatureAlgorithmNameGenerator
20e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    implements CMSSignatureAlgorithmNameGenerator
21e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom{
22e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    private final Map encryptionAlgs = new HashMap();
23e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    private final Map     digestAlgs = new HashMap();
24e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
25e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    private void addEntries(ASN1ObjectIdentifier alias, String digest, String encryption)
26e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
27e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        digestAlgs.put(alias, digest);
28e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        encryptionAlgs.put(alias, encryption);
29e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
30e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
31e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    public DefaultCMSSignatureAlgorithmNameGenerator()
32e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
3387490acd76f544251011cf49753d4d0a61f86a66Kenny Root        addEntries(NISTObjectIdentifiers.dsa_with_sha224, "SHA224", "DSA");
34e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        addEntries(NISTObjectIdentifiers.dsa_with_sha256, "SHA256", "DSA");
35e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        addEntries(NISTObjectIdentifiers.dsa_with_sha384, "SHA384", "DSA");
36e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        addEntries(NISTObjectIdentifiers.dsa_with_sha512, "SHA512", "DSA");
37e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        addEntries(OIWObjectIdentifiers.dsaWithSHA1, "SHA1", "DSA");
38e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        // BEGIN android-removed
39e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        // addEntries(OIWObjectIdentifiers.md4WithRSA, "MD4", "RSA");
40e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        // addEntries(OIWObjectIdentifiers.md4WithRSAEncryption, "MD4", "RSA");
41e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        // END android-removed
42e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        addEntries(OIWObjectIdentifiers.md5WithRSA, "MD5", "RSA");
43e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        addEntries(OIWObjectIdentifiers.sha1WithRSA, "SHA1", "RSA");
44e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        // BEGIN android-removed
45e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        // addEntries(PKCSObjectIdentifiers.md2WithRSAEncryption, "MD2", "RSA");
46e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        // addEntries(PKCSObjectIdentifiers.md4WithRSAEncryption, "MD4", "RSA");
47e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        // END android-removed
48e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        addEntries(PKCSObjectIdentifiers.md5WithRSAEncryption, "MD5", "RSA");
49e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        addEntries(PKCSObjectIdentifiers.sha1WithRSAEncryption, "SHA1", "RSA");
5087490acd76f544251011cf49753d4d0a61f86a66Kenny Root        addEntries(PKCSObjectIdentifiers.sha224WithRSAEncryption, "SHA224", "RSA");
51e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        addEntries(PKCSObjectIdentifiers.sha256WithRSAEncryption, "SHA256", "RSA");
52e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        addEntries(PKCSObjectIdentifiers.sha384WithRSAEncryption, "SHA384", "RSA");
53e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        addEntries(PKCSObjectIdentifiers.sha512WithRSAEncryption, "SHA512", "RSA");
54e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        addEntries(X9ObjectIdentifiers.ecdsa_with_SHA1, "SHA1", "ECDSA");
5587490acd76f544251011cf49753d4d0a61f86a66Kenny Root        addEntries(X9ObjectIdentifiers.ecdsa_with_SHA224, "SHA224", "ECDSA");
56e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        addEntries(X9ObjectIdentifiers.ecdsa_with_SHA256, "SHA256", "ECDSA");
57e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        addEntries(X9ObjectIdentifiers.ecdsa_with_SHA384, "SHA384", "ECDSA");
58e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        addEntries(X9ObjectIdentifiers.ecdsa_with_SHA512, "SHA512", "ECDSA");
59e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        addEntries(X9ObjectIdentifiers.id_dsa_with_sha1, "SHA1", "DSA");
60e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        addEntries(EACObjectIdentifiers.id_TA_ECDSA_SHA_1, "SHA1", "ECDSA");
6187490acd76f544251011cf49753d4d0a61f86a66Kenny Root        addEntries(EACObjectIdentifiers.id_TA_ECDSA_SHA_224, "SHA224", "ECDSA");
62e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        addEntries(EACObjectIdentifiers.id_TA_ECDSA_SHA_256, "SHA256", "ECDSA");
63e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        addEntries(EACObjectIdentifiers.id_TA_ECDSA_SHA_384, "SHA384", "ECDSA");
64e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        addEntries(EACObjectIdentifiers.id_TA_ECDSA_SHA_512, "SHA512", "ECDSA");
65e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        addEntries(EACObjectIdentifiers.id_TA_RSA_v1_5_SHA_1, "SHA1", "RSA");
66e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        addEntries(EACObjectIdentifiers.id_TA_RSA_v1_5_SHA_256, "SHA256", "RSA");
67e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        addEntries(EACObjectIdentifiers.id_TA_RSA_PSS_SHA_1, "SHA1", "RSAandMGF1");
68e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        addEntries(EACObjectIdentifiers.id_TA_RSA_PSS_SHA_256, "SHA256", "RSAandMGF1");
69e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
70e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        encryptionAlgs.put(X9ObjectIdentifiers.id_dsa, "DSA");
71e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        encryptionAlgs.put(PKCSObjectIdentifiers.rsaEncryption, "RSA");
72e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        encryptionAlgs.put(TeleTrusTObjectIdentifiers.teleTrusTRSAsignatureAlgorithm, "RSA");
73e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        encryptionAlgs.put(X509ObjectIdentifiers.id_ea_rsa, "RSA");
74e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        encryptionAlgs.put(PKCSObjectIdentifiers.id_RSASSA_PSS, "RSAandMGF1");
75e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        // BEGIN android-removed
76e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        // encryptionAlgs.put(CryptoProObjectIdentifiers.gostR3410_94, "GOST3410");
77e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        // encryptionAlgs.put(CryptoProObjectIdentifiers.gostR3410_2001, "ECGOST3410");
78e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        // encryptionAlgs.put(new ASN1ObjectIdentifier("1.3.6.1.4.1.5849.1.6.2"), "ECGOST3410");
79e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        // encryptionAlgs.put(new ASN1ObjectIdentifier("1.3.6.1.4.1.5849.1.1.5"), "GOST3410");
80e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        // encryptionAlgs.put(CryptoProObjectIdentifiers.gostR3411_94_with_gostR3410_2001, "ECGOST3410");
81e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        // encryptionAlgs.put(CryptoProObjectIdentifiers.gostR3411_94_with_gostR3410_94, "GOST3410");
82e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        //
83e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        // digestAlgs.put(PKCSObjectIdentifiers.md2, "MD2");
84e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        // digestAlgs.put(PKCSObjectIdentifiers.md4, "MD4");
85e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        // END android-removed
86e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        digestAlgs.put(PKCSObjectIdentifiers.md5, "MD5");
87e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        digestAlgs.put(OIWObjectIdentifiers.idSHA1, "SHA1");
8887490acd76f544251011cf49753d4d0a61f86a66Kenny Root        digestAlgs.put(NISTObjectIdentifiers.id_sha224, "SHA224");
89e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        digestAlgs.put(NISTObjectIdentifiers.id_sha256, "SHA256");
90e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        digestAlgs.put(NISTObjectIdentifiers.id_sha384, "SHA384");
91e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        digestAlgs.put(NISTObjectIdentifiers.id_sha512, "SHA512");
92e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        // BEGIN android-removed
93e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        // digestAlgs.put(TeleTrusTObjectIdentifiers.ripemd128, "RIPEMD128");
94e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        // digestAlgs.put(TeleTrusTObjectIdentifiers.ripemd160, "RIPEMD160");
95e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        // digestAlgs.put(TeleTrusTObjectIdentifiers.ripemd256, "RIPEMD256");
96e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        // digestAlgs.put(CryptoProObjectIdentifiers.gostR3411,  "GOST3411");
97e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        // digestAlgs.put(new ASN1ObjectIdentifier("1.3.6.1.4.1.5849.1.2.1"),  "GOST3411");
98e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        // END android-removed
99e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
100e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
101e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    /**
102e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     * Return the digest algorithm using one of the standard JCA string
103e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     * representations rather than the algorithm identifier (if possible).
104e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     */
105e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    private String getDigestAlgName(
106e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        ASN1ObjectIdentifier digestAlgOID)
107e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
108e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        String algName = (String)digestAlgs.get(digestAlgOID);
109e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
110e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        if (algName != null)
111e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        {
112e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            return algName;
113e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        }
114e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
115e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        return digestAlgOID.getId();
116e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
117e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
118e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    /**
119e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     * Return the digest encryption algorithm using one of the standard
120e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     * JCA string representations rather the the algorithm identifier (if
121e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     * possible).
122e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     */
123e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    private String getEncryptionAlgName(
124e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        ASN1ObjectIdentifier encryptionAlgOID)
125e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
126e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        String algName = (String)encryptionAlgs.get(encryptionAlgOID);
127e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
128e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        if (algName != null)
129e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        {
130e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            return algName;
131e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        }
132e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
133e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        return encryptionAlgOID.getId();
134e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
135e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
136e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    /**
137e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     * Set the mapping for the encryption algorithm used in association with a SignedData generation
138e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     * or interpretation.
139e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     *
140e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     * @param oid object identifier to map.
141e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     * @param algorithmName algorithm name to use.
142e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     */
143e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    protected void setSigningEncryptionAlgorithmMapping(ASN1ObjectIdentifier oid, String algorithmName)
144e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
145e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        encryptionAlgs.put(oid, algorithmName);
146e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
147e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
148e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    /**
149e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     * Set the mapping for the digest algorithm to use in conjunction with a SignedData generation
150e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     * or interpretation.
151e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     *
152e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     * @param oid object identifier to map.
153e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     * @param algorithmName algorithm name to use.
154e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     */
155e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    protected void setSigningDigestAlgorithmMapping(ASN1ObjectIdentifier oid, String algorithmName)
156e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
157e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        digestAlgs.put(oid, algorithmName);
158e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
159e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
160e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    public String getSignatureName(AlgorithmIdentifier digestAlg, AlgorithmIdentifier encryptionAlg)
161e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
162e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        return getDigestAlgName(digestAlg.getAlgorithm()) + "with" + getEncryptionAlgName(encryptionAlg.getAlgorithm());
163e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
164e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom}
165