blob: 71fa3c49135ac0fbf5de61bc1ca4bc88f270f2f3 [file] [log] [blame]
/* GENERATED SOURCE. DO NOT MODIFY. */
/*
* Copyright (C) 2017 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.org.conscrypt;
import java.nio.ByteBuffer;
import java.security.Key;
import javax.crypto.Cipher;
/**
* Benchmark for comparing cipher encrypt performance.
* @hide This class is not part of the Android public SDK API
*/
public final class CipherEncryptBenchmark {
/**
* @hide This class is not part of the Android public SDK API
*/
public enum BufferType {
ARRAY,
HEAP_HEAP,
HEAP_DIRECT,
DIRECT_DIRECT,
DIRECT_HEAP
}
/**
* Provider for the benchmark configuration
*/
interface Config {
BufferType bufferType();
CipherFactory cipherFactory();
Transformation transformation();
}
private final EncryptStrategy encryptStrategy;
CipherEncryptBenchmark(Config config) throws Exception {
switch (config.bufferType()) {
case ARRAY:
encryptStrategy = new ArrayStrategy(config);
break;
default:
encryptStrategy = new ByteBufferStrategy(config);
break;
}
}
int encrypt() throws Exception {
return encryptStrategy.encrypt();
}
private static abstract class EncryptStrategy {
private final Key key;
final Cipher cipher;
final int outputSize;
EncryptStrategy(Config config) throws Exception {
Transformation tx = config.transformation();
key = tx.newEncryptKey();
cipher = config.cipherFactory().newCipher(tx.toFormattedString());
initCipher();
int messageSize = messageSize(tx.toFormattedString());
outputSize = cipher.getOutputSize(messageSize);
}
final void initCipher() throws Exception {
cipher.init(Cipher.ENCRYPT_MODE, key);
}
final int messageSize(String transformation) throws Exception {
Cipher conscryptCipher = Cipher.getInstance(transformation, TestUtils.getConscryptProvider());
conscryptCipher.init(Cipher.ENCRYPT_MODE, key);
return conscryptCipher.getBlockSize() > 0 ? conscryptCipher.getBlockSize() : 128;
}
final byte[] newMessage() {
return TestUtils.newTextMessage(cipher.getBlockSize());
}
abstract int encrypt() throws Exception;
}
private static final class ArrayStrategy extends EncryptStrategy {
private final byte[] plainBytes;
private final byte[] cipherBytes;
ArrayStrategy(Config config) throws Exception {
super(config);
plainBytes = newMessage();
cipherBytes = new byte[outputSize];
}
@Override
int encrypt() throws Exception {
initCipher();
return cipher.doFinal(plainBytes, 0, plainBytes.length, cipherBytes, 0);
}
}
private static final class ByteBufferStrategy extends EncryptStrategy {
private final ByteBuffer input;
private final ByteBuffer output;
ByteBufferStrategy(Config config) throws Exception {
super(config);
switch (config.bufferType()) {
case HEAP_HEAP:
input = ByteBuffer.wrap(newMessage());
output = ByteBuffer.allocate(outputSize);
break;
case HEAP_DIRECT:
input = ByteBuffer.wrap(newMessage());
output = ByteBuffer.allocateDirect(outputSize);
break;
case DIRECT_DIRECT:
input = toDirect(newMessage());
output = ByteBuffer.allocateDirect(outputSize);
break;
case DIRECT_HEAP:
input = toDirect(newMessage());
output = ByteBuffer.allocate(outputSize);
break;
default: {
throw new IllegalStateException(
"Unexpected buffertype: " + config.bufferType());
}
}
}
@Override
int encrypt() throws Exception {
initCipher();
input.position(0);
output.clear();
return cipher.doFinal(input, output);
}
private static ByteBuffer toDirect(byte[] data) {
ByteBuffer buffer = ByteBuffer.allocateDirect(data.length);
buffer.put(data);
buffer.flip();
return buffer;
}
}
}