1package org.bouncycastle.jcajce.provider.digest;
2
3import org.bouncycastle.asn1.nist.NISTObjectIdentifiers;
4import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
5import org.bouncycastle.crypto.CipherKeyGenerator;
6import org.bouncycastle.crypto.digests.SHA512Digest;
7// BEGIN android-removed
8// import org.bouncycastle.crypto.digests.SHA512tDigest;
9// END android-removed
10import org.bouncycastle.crypto.macs.HMac;
11// BEGIN android-removed
12// import org.bouncycastle.crypto.macs.OldHMac;
13// END android-removed
14import org.bouncycastle.jcajce.provider.config.ConfigurableProvider;
15import org.bouncycastle.jcajce.provider.symmetric.util.BaseKeyGenerator;
16import org.bouncycastle.jcajce.provider.symmetric.util.BaseMac;
17
18public class SHA512
19{
20    private SHA512()
21    {
22
23    }
24
25    static public class Digest
26        extends BCMessageDigest
27        implements Cloneable
28    {
29        public Digest()
30        {
31            super(new SHA512Digest());
32        }
33
34        public Object clone()
35            throws CloneNotSupportedException
36        {
37            Digest d = (Digest)super.clone();
38            d.digest = new SHA512Digest((SHA512Digest)digest);
39
40            return d;
41        }
42    }
43
44    // BEGIN android-removed
45    // static public class DigestT
46    //     extends BCMessageDigest
47    //     implements Cloneable
48    // {
49    //     public DigestT(int bitLength)
50    //     {
51    //         super(new SHA512tDigest(bitLength));
52    //     }
53    //
54    //     public Object clone()
55    //         throws CloneNotSupportedException
56    //     {
57    //         DigestT d = (DigestT)super.clone();
58    //         d.digest = new SHA512tDigest((SHA512tDigest)digest);
59    //
60    //         return d;
61    //     }
62    // }
63    //
64    // static public class DigestT224
65    //     extends DigestT
66    // {
67    //     public DigestT224()
68    //     {
69    //         super(224);
70    //     }
71    // }
72    //
73    // static public class DigestT256
74    //     extends DigestT
75    // {
76    //     public DigestT256()
77    //     {
78    //         super(256);
79    //     }
80    // }
81    // END android-removed
82
83    public static class HashMac
84        extends BaseMac
85    {
86        public HashMac()
87        {
88            super(new HMac(new SHA512Digest()));
89        }
90    }
91
92    // BEGIN android-removed
93    // public static class HashMacT224
94    //     extends BaseMac
95    // {
96    //     public HashMacT224()
97    //     {
98    //         super(new HMac(new SHA512tDigest(224)));
99    //     }
100    // }
101    //
102    // public static class HashMacT256
103    //     extends BaseMac
104    // {
105    //     public HashMacT256()
106    //     {
107    //         super(new HMac(new SHA512tDigest(256)));
108    //     }
109    // }
110    //
111    // /**
112    //  * SHA-512 HMac
113    //  */
114    // public static class OldSHA512
115    //     extends BaseMac
116    // {
117    //     public OldSHA512()
118    //     {
119    //         super(new OldHMac(new SHA512Digest()));
120    //     }
121    // }
122    // END android-removed
123
124    /**
125     * HMACSHA512
126     */
127    public static class KeyGenerator
128        extends BaseKeyGenerator
129    {
130        public KeyGenerator()
131        {
132            super("HMACSHA512", 512, new CipherKeyGenerator());
133        }
134    }
135
136    // BEGIN android-removed
137    // public static class KeyGeneratorT224
138    //     extends BaseKeyGenerator
139    // {
140    //     public KeyGeneratorT224()
141    //     {
142    //         super("HMACSHA512/224", 224, new CipherKeyGenerator());
143    //     }
144    // }
145    //
146    // public static class KeyGeneratorT256
147    //     extends BaseKeyGenerator
148    // {
149    //     public KeyGeneratorT256()
150    //     {
151    //         super("HMACSHA512/256", 256, new CipherKeyGenerator());
152    //     }
153    // }
154    // END android-removed
155
156    public static class Mappings
157        extends DigestAlgorithmProvider
158    {
159        private static final String PREFIX = SHA512.class.getName();
160
161        public Mappings()
162        {
163        }
164
165        public void configure(ConfigurableProvider provider)
166        {
167            provider.addAlgorithm("MessageDigest.SHA-512", PREFIX + "$Digest");
168            provider.addAlgorithm("Alg.Alias.MessageDigest.SHA512", "SHA-512");
169            provider.addAlgorithm("Alg.Alias.MessageDigest." + NISTObjectIdentifiers.id_sha512, "SHA-512");
170
171            // BEGIN android-removed
172            // provider.addAlgorithm("MessageDigest.SHA-512/224", PREFIX + "$DigestT224");
173            // provider.addAlgorithm("Alg.Alias.MessageDigest.SHA512/224", "SHA-512/224");
174            // provider.addAlgorithm("Alg.Alias.MessageDigest." + NISTObjectIdentifiers.id_sha512_224, "SHA-512/224");
175            //
176            // provider.addAlgorithm("MessageDigest.SHA-512/256", PREFIX + "$DigestT256");
177            // provider.addAlgorithm("Alg.Alias.MessageDigest.SHA512256", "SHA-512/256");
178            // provider.addAlgorithm("Alg.Alias.MessageDigest." + NISTObjectIdentifiers.id_sha512_256, "SHA-512/256");
179            //
180            // provider.addAlgorithm("Mac.OLDHMACSHA512", PREFIX + "$OldSHA512");
181            // END android-removed
182
183            addHMACAlgorithm(provider, "SHA512", PREFIX + "$HashMac",  PREFIX + "$KeyGenerator");
184            addHMACAlias(provider, "SHA512", PKCSObjectIdentifiers.id_hmacWithSHA512);
185
186            // BEGIN android-removed
187            // addHMACAlgorithm(provider, "SHA512/224", PREFIX + "$HashMacT224",  PREFIX + "$KeyGeneratorT224");
188            // addHMACAlgorithm(provider, "SHA512/256", PREFIX + "$HashMacT256",  PREFIX + "$KeyGeneratorT256");
189            // END android-removed
190        }
191    }
192
193}
194