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