1 package org.bouncycastle.jcajce.provider.symmetric;
2 
3 import org.bouncycastle.crypto.BlockCipher;
4 import org.bouncycastle.crypto.CipherKeyGenerator;
5 import org.bouncycastle.crypto.engines.TwofishEngine;
6 import org.bouncycastle.crypto.generators.Poly1305KeyGenerator;
7 import org.bouncycastle.crypto.macs.GMac;
8 import org.bouncycastle.crypto.modes.CBCBlockCipher;
9 import org.bouncycastle.crypto.modes.GCMBlockCipher;
10 import org.bouncycastle.jcajce.provider.config.ConfigurableProvider;
11 import org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher;
12 import org.bouncycastle.jcajce.provider.symmetric.util.BaseKeyGenerator;
13 import org.bouncycastle.jcajce.provider.symmetric.util.BaseMac;
14 import org.bouncycastle.jcajce.provider.symmetric.util.BlockCipherProvider;
15 import org.bouncycastle.jcajce.provider.symmetric.util.IvAlgorithmParameters;
16 import org.bouncycastle.jcajce.provider.symmetric.util.PBESecretKeyFactory;
17 
18 public final class Twofish
19 {
Twofish()20     private Twofish()
21     {
22     }
23 
24     public static class ECB
25         extends BaseBlockCipher
26     {
ECB()27         public ECB()
28         {
29             super(new BlockCipherProvider()
30             {
31                 public BlockCipher get()
32                 {
33                     return new TwofishEngine();
34                 }
35             });
36         }
37     }
38 
39     public static class KeyGen
40         extends BaseKeyGenerator
41     {
KeyGen()42         public KeyGen()
43         {
44             super("Twofish", 256, new CipherKeyGenerator());
45         }
46     }
47 
48     public static class GMAC
49         extends BaseMac
50     {
GMAC()51         public GMAC()
52         {
53             super(new GMac(new GCMBlockCipher(new TwofishEngine())));
54         }
55     }
56 
57     public static class Poly1305
58         extends BaseMac
59     {
Poly1305()60         public Poly1305()
61         {
62             super(new org.bouncycastle.crypto.macs.Poly1305(new TwofishEngine()));
63         }
64     }
65 
66     public static class Poly1305KeyGen
67         extends BaseKeyGenerator
68     {
Poly1305KeyGen()69         public Poly1305KeyGen()
70         {
71             super("Poly1305-Twofish", 256, new Poly1305KeyGenerator());
72         }
73     }
74 
75     /**
76      * PBEWithSHAAndTwofish-CBC
77      */
78     static public class PBEWithSHAKeyFactory
79         extends PBESecretKeyFactory
80     {
PBEWithSHAKeyFactory()81         public PBEWithSHAKeyFactory()
82         {
83             super("PBEwithSHAandTwofish-CBC", null, true, PKCS12, SHA1, 256, 128);
84         }
85     }
86 
87     /**
88      * PBEWithSHAAndTwofish-CBC
89      */
90     static public class PBEWithSHA
91         extends BaseBlockCipher
92     {
PBEWithSHA()93         public PBEWithSHA()
94         {
95             super(new CBCBlockCipher(new TwofishEngine()), PKCS12, SHA1, 256, 16);
96         }
97     }
98 
99     public static class AlgParams
100         extends IvAlgorithmParameters
101     {
engineToString()102         protected String engineToString()
103         {
104             return "Twofish IV";
105         }
106     }
107 
108     public static class Mappings
109         extends SymmetricAlgorithmProvider
110     {
111         private static final String PREFIX = Twofish.class.getName();
112 
Mappings()113         public Mappings()
114         {
115         }
116 
configure(ConfigurableProvider provider)117         public void configure(ConfigurableProvider provider)
118         {
119             provider.addAlgorithm("Cipher.Twofish", PREFIX + "$ECB");
120             provider.addAlgorithm("KeyGenerator.Twofish", PREFIX + "$KeyGen");
121             provider.addAlgorithm("AlgorithmParameters.Twofish", PREFIX + "$AlgParams");
122 
123             provider.addAlgorithm("Alg.Alias.AlgorithmParameters.PBEWITHSHAANDTWOFISH", "PKCS12PBE");
124             provider.addAlgorithm("Alg.Alias.AlgorithmParameters.PBEWITHSHAANDTWOFISH-CBC", "PKCS12PBE");
125             provider.addAlgorithm("Cipher.PBEWITHSHAANDTWOFISH-CBC",  PREFIX + "$PBEWithSHA");
126             provider.addAlgorithm("SecretKeyFactory.PBEWITHSHAANDTWOFISH-CBC", PREFIX + "$PBEWithSHAKeyFactory");
127 
128             addGMacAlgorithm(provider, "Twofish", PREFIX + "$GMAC", PREFIX + "$KeyGen");
129             addPoly1305Algorithm(provider, "Twofish", PREFIX + "$Poly1305", PREFIX + "$Poly1305KeyGen");
130         }
131     }
132 }
133