1package org.bouncycastle.jce.provider;
2
3import java.security.InvalidAlgorithmParameterException;
4import java.security.InvalidKeyException;
5import java.security.Key;
6import java.security.spec.AlgorithmParameterSpec;
7
8import javax.crypto.MacSpi;
9import javax.crypto.spec.IvParameterSpec;
10import javax.crypto.spec.PBEParameterSpec;
11
12import org.bouncycastle.crypto.CipherParameters;
13import org.bouncycastle.crypto.Mac;
14import org.bouncycastle.crypto.digests.*;
15import org.bouncycastle.crypto.engines.DESEngine;
16import org.bouncycastle.crypto.engines.DESedeEngine;
17// BEGIN android-removed
18// import org.bouncycastle.crypto.engines.IDEAEngine;
19// import org.bouncycastle.crypto.engines.RC2Engine;
20// import org.bouncycastle.crypto.engines.RC532Engine;
21// import org.bouncycastle.crypto.engines.SkipjackEngine;
22// END android-removed
23import org.bouncycastle.crypto.macs.CBCBlockCipherMac;
24import org.bouncycastle.crypto.macs.CFBBlockCipherMac;
25// BEGIN android-removed
26// import org.bouncycastle.crypto.macs.GOST28147Mac;
27// END android-removed
28import org.bouncycastle.crypto.macs.HMac;
29import org.bouncycastle.crypto.macs.ISO9797Alg3Mac;
30import org.bouncycastle.crypto.macs.OldHMac;
31import org.bouncycastle.crypto.params.KeyParameter;
32import org.bouncycastle.crypto.params.ParametersWithIV;
33
34public class JCEMac
35    extends MacSpi implements PBE
36{
37    private Mac macEngine;
38
39    private int                     pbeType = PKCS12;
40    private int                     pbeHash = SHA1;
41    private int                     keySize = 160;
42
43    protected JCEMac(
44        Mac macEngine)
45    {
46        this.macEngine = macEngine;
47    }
48
49    protected JCEMac(
50        Mac macEngine,
51        int pbeType,
52        int pbeHash,
53        int keySize)
54    {
55        this.macEngine = macEngine;
56        this.pbeType = pbeType;
57        this.pbeHash = pbeHash;
58        this.keySize = keySize;
59    }
60
61    protected void engineInit(
62        Key                     key,
63        AlgorithmParameterSpec  params)
64        throws InvalidKeyException, InvalidAlgorithmParameterException
65    {
66        CipherParameters        param;
67
68        if (key == null)
69        {
70            throw new InvalidKeyException("key is null");
71        }
72
73        if (key instanceof JCEPBEKey)
74        {
75            JCEPBEKey   k = (JCEPBEKey)key;
76
77            if (k.getParam() != null)
78            {
79                param = k.getParam();
80            }
81            else if (params instanceof PBEParameterSpec)
82            {
83                param = PBE.Util.makePBEMacParameters(k, params);
84            }
85            else
86            {
87                throw new InvalidAlgorithmParameterException("PBE requires PBE parameters to be set.");
88            }
89        }
90        else if (params instanceof IvParameterSpec)
91        {
92            param = new ParametersWithIV(new KeyParameter(key.getEncoded()), ((IvParameterSpec)params).getIV());
93        }
94        else if (params == null)
95        {
96            param = new KeyParameter(key.getEncoded());
97        }
98        else
99        {
100            throw new InvalidAlgorithmParameterException("unknown parameter type.");
101        }
102
103        macEngine.init(param);
104    }
105
106    protected int engineGetMacLength()
107    {
108        return macEngine.getMacSize();
109    }
110
111    protected void engineReset()
112    {
113        macEngine.reset();
114    }
115
116    protected void engineUpdate(
117        byte    input)
118    {
119        macEngine.update(input);
120    }
121
122    protected void engineUpdate(
123        byte[]  input,
124        int     offset,
125        int     len)
126    {
127        macEngine.update(input, offset, len);
128    }
129
130    protected byte[] engineDoFinal()
131    {
132        byte[]  out = new byte[engineGetMacLength()];
133
134        macEngine.doFinal(out, 0);
135
136        return out;
137    }
138
139    /**
140     * the classes that extend directly off us.
141     */
142
143    /**
144     * DES
145     */
146    public static class DES
147        extends JCEMac
148    {
149        public DES()
150        {
151            super(new CBCBlockCipherMac(new DESEngine()));
152        }
153    }
154
155    /**
156     * DESede
157     */
158    public static class DESede
159        extends JCEMac
160    {
161        public DESede()
162        {
163            super(new CBCBlockCipherMac(new DESedeEngine()));
164        }
165    }
166
167    /**
168     * SKIPJACK
169     */
170    // BEGIN android-removed
171    // public static class Skipjack
172    //     extends JCEMac
173    // {
174    //     public Skipjack()
175    //     {
176    //         super(new CBCBlockCipherMac(new SkipjackEngine()));
177    //     }
178    // }
179    // END android-removed
180
181    /**
182     * IDEA
183     */
184    // BEGIN android-removed
185    // public static class IDEA
186    //     extends JCEMac
187    // {
188    //     public IDEA()
189    //     {
190    //         super(new CBCBlockCipherMac(new IDEAEngine()));
191    //     }
192    // }
193    // END android-removed
194
195    /**
196     * RC2
197     */
198    // BEGIN android-removed
199    // public static class RC2
200    //     extends JCEMac
201    // {
202    //     public RC2()
203    //     {
204    //         super(new CBCBlockCipherMac(new RC2Engine()));
205    //     }
206    // }
207    // END android-removed
208
209    /**
210     * RC5
211     */
212    // BEGIN android-removed
213    // public static class RC5
214    //     extends JCEMac
215    // {
216    //     public RC5()
217    //     {
218    //         super(new CBCBlockCipherMac(new RC532Engine()));
219    //     }
220    // }
221    // END android-removed
222
223    /**
224     * GOST28147
225     */
226    // BEGIN android-removed
227    // public static class GOST28147
228    //     extends JCEMac
229    // {
230    //     public GOST28147()
231    //     {
232    //         super(new GOST28147Mac());
233    //     }
234    // }
235    // END android-removed
236
237    /**
238     * DES
239     */
240    public static class DESCFB8
241        extends JCEMac
242    {
243        public DESCFB8()
244        {
245            super(new CFBBlockCipherMac(new DESEngine()));
246        }
247    }
248
249    /**
250     * DESede
251     */
252    public static class DESedeCFB8
253        extends JCEMac
254    {
255        public DESedeCFB8()
256        {
257            super(new CFBBlockCipherMac(new DESedeEngine()));
258        }
259    }
260
261    /**
262     * SKIPJACK
263     */
264    // BEGIN android-removed
265    // public static class SkipjackCFB8
266    //     extends JCEMac
267    // {
268    //     public SkipjackCFB8()
269    //     {
270    //         super(new CFBBlockCipherMac(new SkipjackEngine()));
271    //     }
272    // }
273    // END android-removed
274
275    /**
276     * IDEACFB8
277     */
278    // BEGIN android-removed
279    // public static class IDEACFB8
280    //     extends JCEMac
281    // {
282    //     public IDEACFB8()
283    //     {
284    //         super(new CFBBlockCipherMac(new IDEAEngine()));
285    //     }
286    // }
287    // END android-removed
288
289    /**
290     * RC2CFB8
291     */
292    // BEGIN android-removed
293    // public static class RC2CFB8
294    //     extends JCEMac
295    // {
296    //     public RC2CFB8()
297    //     {
298    //         super(new CFBBlockCipherMac(new RC2Engine()));
299    //     }
300    // }
301    // END android-removed
302
303    /**
304     * RC5CFB8
305     */
306    // BEGIN android-removed
307    // public static class RC5CFB8
308    //     extends JCEMac
309    // {
310    //     public RC5CFB8()
311    //     {
312    //         super(new CFBBlockCipherMac(new RC532Engine()));
313    //     }
314    // }
315    // END android-removed
316
317
318    /**
319     * DESede64
320     */
321    public static class DESede64
322        extends JCEMac
323    {
324        public DESede64()
325        {
326            super(new CBCBlockCipherMac(new DESedeEngine(), 64));
327        }
328    }
329
330    /**
331     * DES9797Alg3
332     */
333    public static class DES9797Alg3
334        extends JCEMac
335    {
336        public DES9797Alg3()
337        {
338            super(new ISO9797Alg3Mac(new DESEngine()));
339        }
340    }
341
342    /**
343     * MD2 HMac
344     */
345    // BEGIN android-removed
346    // public static class MD2
347    //     extends JCEMac
348    // {
349    //     public MD2()
350    //     {
351    //         super(new HMac(new MD2Digest()));
352    //     }
353    // }
354    // END android-removed
355
356    /**
357     * MD4 HMac
358     */
359    // BEGIN android-removed
360    // public static class MD4
361    //     extends JCEMac
362    // {
363    //     public MD4()
364    //     {
365    //         super(new HMac(new MD4Digest()));
366    //     }
367    // }
368    // END android-removed
369
370    /**
371     * MD5 HMac
372     */
373    public static class MD5
374        extends JCEMac
375    {
376        public MD5()
377        {
378            super(new HMac(new MD5Digest()));
379        }
380    }
381
382    /**
383     * SHA1 HMac
384     */
385    public static class SHA1
386        extends JCEMac
387    {
388        public SHA1()
389        {
390            super(new HMac(new SHA1Digest()));
391        }
392    }
393
394    /**
395     * SHA-224 HMac
396     */
397    public static class SHA224
398        extends JCEMac
399    {
400        public SHA224()
401        {
402            super(new HMac(new SHA224Digest()));
403        }
404    }
405
406    /**
407     * SHA-256 HMac
408     */
409    public static class SHA256
410        extends JCEMac
411    {
412        public SHA256()
413        {
414            super(new HMac(new SHA256Digest()));
415        }
416    }
417
418    /**
419     * SHA-384 HMac
420     */
421    public static class SHA384
422        extends JCEMac
423    {
424        public SHA384()
425        {
426            super(new HMac(new SHA384Digest()));
427        }
428    }
429
430    public static class OldSHA384
431        extends JCEMac
432    {
433        public OldSHA384()
434        {
435            super(new OldHMac(new SHA384Digest()));
436        }
437    }
438
439    /**
440     * SHA-512 HMac
441     */
442    public static class SHA512
443        extends JCEMac
444    {
445        public SHA512()
446        {
447            super(new HMac(new SHA512Digest()));
448        }
449    }
450
451    /**
452     * SHA-512 HMac
453     */
454    public static class OldSHA512
455        extends JCEMac
456    {
457        public OldSHA512()
458        {
459            super(new OldHMac(new SHA512Digest()));
460        }
461    }
462
463// BEGIN android-removed
464//    /**
465//     * RIPEMD128 HMac
466//     */
467//    public static class RIPEMD128
468//        extends JCEMac
469//    {
470//        public RIPEMD128()
471//        {
472//           super(new HMac(new RIPEMD128Digest()));
473//        }
474//    }
475//
476//    /**
477//     * RIPEMD160 HMac
478//     */
479//    public static class RIPEMD160
480//        extends JCEMac
481//    {
482//        public RIPEMD160()
483//        {
484//           super(new HMac(new RIPEMD160Digest()));
485//        }
486//    }
487//
488//    /**
489//     * Tiger HMac
490//     */
491//    public static class Tiger
492//        extends JCEMac
493//    {
494//        public Tiger()
495//        {
496//            super(new HMac(new TigerDigest()));
497//        }
498//    }
499//
500//    //
501//    // PKCS12 states that the same algorithm should be used
502//    // for the key generation as is used in the HMAC, so that
503//    // is what we do here.
504//    //
505//
506//    /**
507//     * PBEWithHmacRIPEMD160
508//     */
509//    public static class PBEWithRIPEMD160
510//        extends JCEMac
511//    {
512//        public PBEWithRIPEMD160()
513//        {
514//            super(new HMac(new RIPEMD160Digest()), PKCS12, RIPEMD160, 160);
515//        }
516//    }
517// END android-removed
518
519    /**
520     * PBEWithHmacSHA
521     */
522    public static class PBEWithSHA
523        extends JCEMac
524    {
525        public PBEWithSHA()
526        {
527            super(new HMac(new SHA1Digest()), PKCS12, SHA1, 160);
528        }
529    }
530
531    /**
532     * PBEWithHmacTiger
533     */
534// BEGIN android-removed
535//    public static class PBEWithTiger
536//        extends JCEMac
537//    {
538//        public PBEWithTiger()
539//        {
540//            super(new HMac(new TigerDigest()), PKCS12, TIGER, 192);
541//        }
542//    }
543// END android-removed
544}
545