/** @return null if JCA is crippled (restricted to 128-bit) so we need
* to use this class. */
private static Provider getAesCtrProvider() {
try {
final String algo = "AES/CTR/NOPADDING";
final Provider bcastle = JceLoader.BouncyCastle;
final Class<?> clazz = Rijndael.class;
byte[] key = new byte[32]; // Test for whether 256-bit works.
byte[] iv = new byte[16];
byte[] plaintext = new byte[16];
SecretKeySpec k = new SecretKeySpec(key, "AES");
IvParameterSpec IV = new IvParameterSpec(iv);
Cipher c = Cipher.getInstance(algo);
c.init(Cipher.ENCRYPT_MODE, k, IV);
// ^^^ resolve provider
Provider provider = c.getProvider();
if (bcastle != null) {
// BouncyCastle provider is faster (in some configurations)
try {
Cipher bcastle_cipher = Cipher.getInstance(algo, bcastle);
bcastle_cipher.init(Cipher.ENCRYPT_MODE, k, IV);
Provider bcastle_provider = bcastle_cipher.getProvider();
if (provider != bcastle_provider) {
long time_def = benchmark(c, k, IV);
long time_bcastle = benchmark(bcastle_cipher, k, IV);
System.out.println(algo + " (" + provider + "): " + time_def + "ns");
System.out.println(algo + " (" + bcastle_provider + "): " + time_bcastle + "ns");