Example usage for org.bouncycastle.openpgp.operator PBEDataDecryptorFactory makeKeyFromPassPhrase

List of usage examples for org.bouncycastle.openpgp.operator PBEDataDecryptorFactory makeKeyFromPassPhrase

Introduction

In this page you can find the example usage for org.bouncycastle.openpgp.operator PBEDataDecryptorFactory makeKeyFromPassPhrase.

Prototype

public byte[] makeKeyFromPassPhrase(int keyAlgorithm, S2K s2k) throws PGPException 

Source Link

Document

Generates an encryption key using the pass phrase and digest calculator configured for this factory.

Usage

From source file:org.sufficientlysecure.keychain.operations.BenchmarkOperation.java

License:Open Source License

@NonNull
@Override//from   w  w w  .j  av  a  2 s. co m
public BenchmarkResult execute(BenchmarkInputParcel consolidateInputParcel,
        CryptoInputParcel cryptoInputParcel) {
    OperationLog log = new OperationLog();
    log.add(LogType.MSG_BENCH, 0);

    // random data
    byte[] buf = new byte[1024 * 1024 * 10];
    new Random().nextBytes(buf);

    Passphrase passphrase = new Passphrase("a");

    int numRepeats = 5;
    long totalTime = 0;

    // encrypt
    SignEncryptResult encryptResult;
    int i = 0;
    do {
        SignEncryptOperation op = new SignEncryptOperation(mContext, mProviderHelper,
                new ProgressScaler(mProgressable, i * (50 / numRepeats), (i + 1) * (50 / numRepeats), 100),
                mCancelled);
        PgpSignEncryptData data = new PgpSignEncryptData();
        data.setSymmetricPassphrase(passphrase);
        data.setSymmetricEncryptionAlgorithm(OpenKeychainSymmetricKeyAlgorithmTags.AES_128);
        SignEncryptParcel input = new SignEncryptParcel(data);
        input.setBytes(buf);
        encryptResult = op.execute(input, new CryptoInputParcel());
        log.add(encryptResult, 1);
        log.add(LogType.MSG_BENCH_ENC_TIME, 2,
                String.format("%.2f", encryptResult.getResults().get(0).mOperationTime / 1000.0));
        totalTime += encryptResult.getResults().get(0).mOperationTime;
    } while (++i < numRepeats);

    long encryptionTime = totalTime / numRepeats;
    totalTime = 0;

    // decrypt
    i = 0;
    do {
        DecryptVerifyResult decryptResult;
        PgpDecryptVerifyOperation op = new PgpDecryptVerifyOperation(mContext, mProviderHelper,
                new ProgressScaler(mProgressable, 50 + i * (50 / numRepeats), 50 + (i + 1) * (50 / numRepeats),
                        100));
        PgpDecryptVerifyInputParcel input = new PgpDecryptVerifyInputParcel(encryptResult.getResultBytes());
        input.setAllowSymmetricDecryption(true);
        decryptResult = op.execute(input, new CryptoInputParcel(passphrase));
        log.add(decryptResult, 1);
        log.add(LogType.MSG_BENCH_DEC_TIME, 2, String.format("%.2f", decryptResult.mOperationTime / 1000.0));
        totalTime += decryptResult.mOperationTime;
    } while (++i < numRepeats);

    long decryptionTime = totalTime / numRepeats;
    totalTime = 0;

    int iterationsFor100ms;
    try {
        PGPDigestCalculatorProvider digestCalcProvider = new JcaPGPDigestCalculatorProviderBuilder()
                .setProvider(Constants.BOUNCY_CASTLE_PROVIDER_NAME).build();
        PBEDataDecryptorFactory decryptorFactory = new JcePBEDataDecryptorFactoryBuilder(digestCalcProvider)
                .setProvider(Constants.BOUNCY_CASTLE_PROVIDER_NAME).build("".toCharArray());

        byte[] iv = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };
        int iterations = 0;
        while (iterations < 255 && totalTime < 100) {
            iterations += 1;

            S2K s2k = new S2K(HashAlgorithmTags.SHA1, iv, iterations);
            totalTime = System.currentTimeMillis();
            decryptorFactory.makeKeyFromPassPhrase(SymmetricKeyAlgorithmTags.AES_128, s2k);
            totalTime = System.currentTimeMillis() - totalTime;

            if ((iterations % 10) == 0) {
                log.add(LogType.MSG_BENCH_S2K_FOR_IT, 1, Integer.toString(iterations),
                        Long.toString(totalTime));
            }

        }
        iterationsFor100ms = iterations;

    } catch (PGPException e) {
        Log.e(Constants.TAG, "internal error during benchmark", e);
        log.add(LogType.MSG_INTERNAL_ERROR, 0);
        return new BenchmarkResult(BenchmarkResult.RESULT_ERROR, log);
    }

    log.add(LogType.MSG_BENCH_S2K_100MS_ITS, 1, Integer.toString(iterationsFor100ms));
    log.add(LogType.MSG_BENCH_ENC_TIME_AVG, 1, String.format("%.2f", encryptionTime / 1000.0));
    log.add(LogType.MSG_BENCH_DEC_TIME_AVG, 1, String.format("%.2f", decryptionTime / 1000.0));

    log.add(LogType.MSG_BENCH_SUCCESS, 0);
    return new BenchmarkResult(BenchmarkResult.RESULT_OK, log);
}