1package org.bouncycastle.jcajce.provider.symmetric; 2 3// BEGIN android-removed 4// import java.security.AlgorithmParameters; 5// import java.security.InvalidAlgorithmParameterException; 6// END android-removed 7import java.security.SecureRandom; 8// BEGIN android-removed 9// import java.security.spec.AlgorithmParameterSpec; 10// 11// import javax.crypto.spec.IvParameterSpec; 12// END android-removed 13 14import org.bouncycastle.asn1.nist.NISTObjectIdentifiers; 15import org.bouncycastle.crypto.BufferedBlockCipher; 16import org.bouncycastle.crypto.CipherKeyGenerator; 17import org.bouncycastle.crypto.engines.AESFastEngine; 18import org.bouncycastle.crypto.engines.AESWrapEngine; 19// BEGIN android-removed 20// import org.bouncycastle.crypto.engines.RFC3211WrapEngine; 21// import org.bouncycastle.crypto.macs.CMac; 22// END android-removed 23import org.bouncycastle.crypto.modes.CBCBlockCipher; 24import org.bouncycastle.crypto.modes.CFBBlockCipher; 25import org.bouncycastle.crypto.modes.OFBBlockCipher; 26import org.bouncycastle.jcajce.provider.config.ConfigurableProvider; 27// BEGIN android-removed 28// import org.bouncycastle.jcajce.provider.symmetric.util.BaseAlgorithmParameterGenerator; 29// END android-removed 30import org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher; 31import org.bouncycastle.jcajce.provider.symmetric.util.BaseKeyGenerator; 32// BEGIN android-removed 33// import org.bouncycastle.jcajce.provider.symmetric.util.BaseMac; 34// END android-removed 35import org.bouncycastle.jcajce.provider.symmetric.util.BaseWrapCipher; 36import org.bouncycastle.jcajce.provider.symmetric.util.IvAlgorithmParameters; 37import org.bouncycastle.jcajce.provider.util.AlgorithmProvider; 38// BEGIN android-removed 39// import org.bouncycastle.jce.provider.BouncyCastleProvider; 40// END android-removed 41 42public final class AES 43{ 44 private AES() 45 { 46 } 47 48 public static class ECB 49 extends BaseBlockCipher 50 { 51 public ECB() 52 { 53 super(new AESFastEngine()); 54 } 55 } 56 57 public static class CBC 58 extends BaseBlockCipher 59 { 60 public CBC() 61 { 62 super(new CBCBlockCipher(new AESFastEngine()), 128); 63 } 64 } 65 66 static public class CFB 67 extends BaseBlockCipher 68 { 69 public CFB() 70 { 71 super(new BufferedBlockCipher(new CFBBlockCipher(new AESFastEngine(), 128)), 128); 72 } 73 } 74 75 static public class OFB 76 extends BaseBlockCipher 77 { 78 public OFB() 79 { 80 super(new BufferedBlockCipher(new OFBBlockCipher(new AESFastEngine(), 128)), 128); 81 } 82 } 83 84 // BEGIN android-removed 85 // public static class AESCMAC 86 // extends BaseMac 87 // { 88 // public AESCMAC() 89 // { 90 // super(new CMac(new AESFastEngine())); 91 // } 92 // } 93 // END android-removed 94 95 static public class Wrap 96 extends BaseWrapCipher 97 { 98 public Wrap() 99 { 100 super(new AESWrapEngine()); 101 } 102 } 103 104 // BEGIN android-removed 105 // public static class RFC3211Wrap 106 // extends BaseWrapCipher 107 // { 108 // public RFC3211Wrap() 109 // { 110 // super(new RFC3211WrapEngine(new AESFastEngine()), 16); 111 // } 112 // } 113 // END android-removed 114 115 public static class KeyGen 116 extends BaseKeyGenerator 117 { 118 public KeyGen() 119 { 120 this(192); 121 } 122 123 public KeyGen(int keySize) 124 { 125 super("AES", keySize, new CipherKeyGenerator()); 126 } 127 } 128 129 // BEGIN android-removed 130 // public static class KeyGen128 131 // extends KeyGen 132 // { 133 // public KeyGen128() 134 // { 135 // super(128); 136 // } 137 // } 138 // 139 // public static class KeyGen192 140 // extends KeyGen 141 // { 142 // public KeyGen192() 143 // { 144 // super(192); 145 // } 146 // } 147 // 148 // public static class KeyGen256 149 // extends KeyGen 150 // { 151 // public KeyGen256() 152 // { 153 // super(256); 154 // } 155 // } 156 // 157 // public static class AlgParamGen 158 // extends BaseAlgorithmParameterGenerator 159 // { 160 // protected void engineInit( 161 // AlgorithmParameterSpec genParamSpec, 162 // SecureRandom random) 163 // throws InvalidAlgorithmParameterException 164 // { 165 // throw new InvalidAlgorithmParameterException("No supported AlgorithmParameterSpec for AES parameter generation."); 166 // } 167 // 168 // protected AlgorithmParameters engineGenerateParameters() 169 // { 170 // byte[] iv = new byte[16]; 171 // 172 // if (random == null) 173 // { 174 // random = new SecureRandom(); 175 // } 176 // 177 // random.nextBytes(iv); 178 // 179 // AlgorithmParameters params; 180 // 181 // try 182 // { 183 // params = AlgorithmParameters.getInstance("AES", BouncyCastleProvider.PROVIDER_NAME); 184 // params.init(new IvParameterSpec(iv)); 185 // } 186 // catch (Exception e) 187 // { 188 // throw new RuntimeException(e.getMessage()); 189 // } 190 // 191 // return params; 192 // } 193 // } 194 // END android-removed 195 196 public static class AlgParams 197 extends IvAlgorithmParameters 198 { 199 protected String engineToString() 200 { 201 return "AES IV"; 202 } 203 } 204 205 public static class Mappings 206 extends AlgorithmProvider 207 { 208 private static final String PREFIX = AES.class.getName(); 209 210 /** 211 * These three got introduced in some messages as a result of a typo in an 212 * early document. We don't produce anything using these OID values, but we'll 213 * read them. 214 */ 215 private static final String wrongAES128 = "2.16.840.1.101.3.4.2"; 216 private static final String wrongAES192 = "2.16.840.1.101.3.4.22"; 217 private static final String wrongAES256 = "2.16.840.1.101.3.4.42"; 218 219 public Mappings() 220 { 221 } 222 223 public void configure(ConfigurableProvider provider) 224 { 225 provider.addAlgorithm("AlgorithmParameters.AES", PREFIX + "$AlgParams"); 226 provider.addAlgorithm("Alg.Alias.AlgorithmParameters." + wrongAES128, "AES"); 227 provider.addAlgorithm("Alg.Alias.AlgorithmParameters." + wrongAES192, "AES"); 228 provider.addAlgorithm("Alg.Alias.AlgorithmParameters." + wrongAES256, "AES"); 229 provider.addAlgorithm("Alg.Alias.AlgorithmParameters." + NISTObjectIdentifiers.id_aes128_CBC, "AES"); 230 provider.addAlgorithm("Alg.Alias.AlgorithmParameters." + NISTObjectIdentifiers.id_aes192_CBC, "AES"); 231 provider.addAlgorithm("Alg.Alias.AlgorithmParameters." + NISTObjectIdentifiers.id_aes256_CBC, "AES"); 232 233 // BEGIN android-removed 234 // provider.addAlgorithm("AlgorithmParameterGenerator.AES", PREFIX + "$AlgParamGen"); 235 // provider.addAlgorithm("Alg.Alias.AlgorithmParameterGenerator." + wrongAES128, "AES"); 236 // provider.addAlgorithm("Alg.Alias.AlgorithmParameterGenerator." + wrongAES192, "AES"); 237 // provider.addAlgorithm("Alg.Alias.AlgorithmParameterGenerator." + wrongAES256, "AES"); 238 // provider.addAlgorithm("Alg.Alias.AlgorithmParameterGenerator." + NISTObjectIdentifiers.id_aes128_CBC, "AES"); 239 // provider.addAlgorithm("Alg.Alias.AlgorithmParameterGenerator." + NISTObjectIdentifiers.id_aes192_CBC, "AES"); 240 // provider.addAlgorithm("Alg.Alias.AlgorithmParameterGenerator." + NISTObjectIdentifiers.id_aes256_CBC, "AES"); 241 // END android-removed 242 243 provider.addAlgorithm("Cipher.AES", PREFIX + "$ECB"); 244 provider.addAlgorithm("Alg.Alias.Cipher." + wrongAES128, "AES"); 245 provider.addAlgorithm("Alg.Alias.Cipher." + wrongAES192, "AES"); 246 provider.addAlgorithm("Alg.Alias.Cipher." + wrongAES256, "AES"); 247 // BEGIN android-removed 248 // provider.addAlgorithm("Cipher." + NISTObjectIdentifiers.id_aes128_ECB, PREFIX + "$ECB"); 249 // provider.addAlgorithm("Cipher." + NISTObjectIdentifiers.id_aes192_ECB, PREFIX + "$ECB"); 250 // provider.addAlgorithm("Cipher." + NISTObjectIdentifiers.id_aes256_ECB, PREFIX + "$ECB"); 251 // provider.addAlgorithm("Cipher." + NISTObjectIdentifiers.id_aes128_CBC, PREFIX + "$CBC"); 252 // provider.addAlgorithm("Cipher." + NISTObjectIdentifiers.id_aes192_CBC, PREFIX + "$CBC"); 253 // provider.addAlgorithm("Cipher." + NISTObjectIdentifiers.id_aes256_CBC, PREFIX + "$CBC"); 254 // provider.addAlgorithm("Cipher." + NISTObjectIdentifiers.id_aes128_OFB, PREFIX + "$OFB"); 255 // provider.addAlgorithm("Cipher." + NISTObjectIdentifiers.id_aes192_OFB, PREFIX + "$OFB"); 256 // provider.addAlgorithm("Cipher." + NISTObjectIdentifiers.id_aes256_OFB, PREFIX + "$OFB"); 257 // provider.addAlgorithm("Cipher." + NISTObjectIdentifiers.id_aes128_CFB, PREFIX + "$CFB"); 258 // provider.addAlgorithm("Cipher." + NISTObjectIdentifiers.id_aes192_CFB, PREFIX + "$CFB"); 259 // provider.addAlgorithm("Cipher." + NISTObjectIdentifiers.id_aes256_CFB, PREFIX + "$CFB"); 260 // END android-removed 261 provider.addAlgorithm("Cipher.AESWRAP", PREFIX + "$Wrap"); 262 provider.addAlgorithm("Alg.Alias.Cipher." + NISTObjectIdentifiers.id_aes128_wrap, "AESWRAP"); 263 provider.addAlgorithm("Alg.Alias.Cipher." + NISTObjectIdentifiers.id_aes192_wrap, "AESWRAP"); 264 provider.addAlgorithm("Alg.Alias.Cipher." + NISTObjectIdentifiers.id_aes256_wrap, "AESWRAP"); 265 // BEGIN android-removed 266 // provider.addAlgorithm("Cipher.AESRFC3211WRAP", PREFIX + "$RFC3211Wrap"); 267 // END android-removed 268 269 provider.addAlgorithm("KeyGenerator.AES", PREFIX + "$KeyGen"); 270 // BEGIN android-removed 271 // provider.addAlgorithm("KeyGenerator." + wrongAES128, PREFIX + "$KeyGen128"); 272 // provider.addAlgorithm("KeyGenerator." + wrongAES192, PREFIX + "$KeyGen192"); 273 // provider.addAlgorithm("KeyGenerator." + wrongAES256, PREFIX + "$KeyGen256"); 274 // provider.addAlgorithm("KeyGenerator." + NISTObjectIdentifiers.id_aes128_ECB, PREFIX + "$KeyGen128"); 275 // provider.addAlgorithm("KeyGenerator." + NISTObjectIdentifiers.id_aes128_CBC, PREFIX + "$KeyGen128"); 276 // provider.addAlgorithm("KeyGenerator." + NISTObjectIdentifiers.id_aes128_OFB, PREFIX + "$KeyGen128"); 277 // provider.addAlgorithm("KeyGenerator." + NISTObjectIdentifiers.id_aes128_CFB, PREFIX + "$KeyGen128"); 278 // provider.addAlgorithm("KeyGenerator." + NISTObjectIdentifiers.id_aes192_ECB, PREFIX + "$KeyGen192"); 279 // provider.addAlgorithm("KeyGenerator." + NISTObjectIdentifiers.id_aes192_CBC, PREFIX + "$KeyGen192"); 280 // provider.addAlgorithm("KeyGenerator." + NISTObjectIdentifiers.id_aes192_OFB, PREFIX + "$KeyGen192"); 281 // provider.addAlgorithm("KeyGenerator." + NISTObjectIdentifiers.id_aes192_CFB, PREFIX + "$KeyGen192"); 282 // provider.addAlgorithm("KeyGenerator." + NISTObjectIdentifiers.id_aes256_ECB, PREFIX + "$KeyGen256"); 283 // provider.addAlgorithm("KeyGenerator." + NISTObjectIdentifiers.id_aes256_CBC, PREFIX + "$KeyGen256"); 284 // provider.addAlgorithm("KeyGenerator." + NISTObjectIdentifiers.id_aes256_OFB, PREFIX + "$KeyGen256"); 285 // provider.addAlgorithm("KeyGenerator." + NISTObjectIdentifiers.id_aes256_CFB, PREFIX + "$KeyGen256"); 286 // provider.addAlgorithm("KeyGenerator.AESWRAP", PREFIX + "$KeyGen"); 287 // provider.addAlgorithm("KeyGenerator." + NISTObjectIdentifiers.id_aes128_wrap, PREFIX + "$KeyGen128"); 288 // provider.addAlgorithm("KeyGenerator." + NISTObjectIdentifiers.id_aes192_wrap, PREFIX + "$KeyGen192"); 289 // provider.addAlgorithm("KeyGenerator." + NISTObjectIdentifiers.id_aes256_wrap, PREFIX + "$KeyGen256"); 290 // 291 // provider.addAlgorithm("Mac.AESCMAC", PREFIX + "$AESCMAC"); 292 // END android-removed 293 } 294 } 295} 296