Example usage for org.bouncycastle.asn1.pkcs EncryptionScheme getAlgorithm

List of usage examples for org.bouncycastle.asn1.pkcs EncryptionScheme getAlgorithm

Introduction

In this page you can find the example usage for org.bouncycastle.asn1.pkcs EncryptionScheme getAlgorithm.

Prototype

public ASN1ObjectIdentifier getAlgorithm() 

Source Link

Usage

From source file:org.cryptacular.pbe.PBES2EncryptionScheme.java

License:Open Source License

/**
 * Initializes the block cipher and sets up its initialization parameters.
 *
 * @param  generator  Derived key generator.
 * @param  scheme  PKCS#5 encryption scheme.
 *///ww w . j  av a 2s.  co  m
private void initCipher(final PKCS5S2ParametersGenerator generator,
        final org.bouncycastle.asn1.pkcs.EncryptionScheme scheme) {
    final PBES2Algorithm alg = PBES2Algorithm.fromOid(scheme.getAlgorithm().getId());
    if (keyLength == 0) {
        keyLength = alg.getKeySize();
    }

    byte[] iv = null;
    CipherParameters cipherParameters = generator.generateDerivedParameters(keyLength);
    switch (alg) {

    case RC2:
        setCipher(alg.getCipherSpec().newInstance());

        final ASN1Sequence rc2Params = ASN1Sequence.getInstance(scheme.getParameters());
        if (rc2Params.size() > 1) {
            cipherParameters = new RC2Parameters(((KeyParameter) cipherParameters).getKey(),
                    ASN1Integer.getInstance(rc2Params.getObjectAt(0)).getValue().intValue());
            iv = ASN1OctetString.getInstance(rc2Params.getObjectAt(0)).getOctets();
        }
        break;

    case RC5:

        final ASN1Sequence rc5Params = ASN1Sequence.getInstance(scheme.getParameters());
        final int rounds = ASN1Integer.getInstance(rc5Params.getObjectAt(1)).getValue().intValue();
        final int blockSize = ASN1Integer.getInstance(rc5Params.getObjectAt(2)).getValue().intValue();
        if (blockSize == 32) {
            setCipher(new PaddedBufferedBlockCipher(new CBCBlockCipher(new RC532Engine()), new PKCS7Padding()));
        }
        cipherParameters = new RC5Parameters(((KeyParameter) cipherParameters).getKey(), rounds);
        if (rc5Params.size() > 3) {
            iv = ASN1OctetString.getInstance(rc5Params.getObjectAt(3)).getOctets();
        }
        break;

    default:
        setCipher(alg.getCipherSpec().newInstance());
        iv = ASN1OctetString.getInstance(scheme.getParameters()).getOctets();
    }
    if (iv != null) {
        cipherParameters = new ParametersWithIV(cipherParameters, iv);
    }
    setCipherParameters(cipherParameters);
}

From source file:org.jruby.ext.openssl.x509store.PEMInputOutput.java

License:LGPL

private static PrivateKey derivePrivateKeyPBES2(EncryptedPrivateKeyInfo eIn, AlgorithmIdentifier algId,
        char[] password) throws GeneralSecurityException, InvalidCipherTextException {
    PBES2Parameters pbeParams = PBES2Parameters.getInstance((ASN1Sequence) algId.getParameters());
    CipherParameters cipherParams = extractPBES2CipherParams(password, pbeParams);

    EncryptionScheme scheme = pbeParams.getEncryptionScheme();
    BufferedBlockCipher cipher;/*from  w w  w.  j  ava 2 s.  c o  m*/
    if (scheme.getAlgorithm().equals(PKCSObjectIdentifiers.RC2_CBC)) {
        RC2CBCParameter rc2Params = RC2CBCParameter.getInstance(scheme);
        byte[] iv = rc2Params.getIV();
        CipherParameters param = new ParametersWithIV(cipherParams, iv);
        cipher = new PaddedBufferedBlockCipher(new CBCBlockCipher(new RC2Engine()));
        cipher.init(false, param);
    } else {
        byte[] iv = ((ASN1OctetString) scheme.getObject()).getOctets();
        // this version, done for BC 1.49 compat, caused #1238.
        //            byte[] iv = ASN1OctetString.getInstance(scheme).getOctets();
        CipherParameters param = new ParametersWithIV(cipherParams, iv);
        cipher = new PaddedBufferedBlockCipher(new CBCBlockCipher(new DESedeEngine()));
        cipher.init(false, param);
    }

    byte[] data = eIn.getEncryptedData();
    byte[] out = new byte[cipher.getOutputSize(data.length)];
    int len = cipher.processBytes(data, 0, data.length, out, 0);
    len += cipher.doFinal(out, len);
    byte[] pkcs8 = new byte[len];
    System.arraycopy(out, 0, pkcs8, 0, len);
    KeyFactory fact = KeyFactory.getInstance("RSA"); // It seems to work for both RSA and DSA.
    return fact.generatePrivate(new PKCS8EncodedKeySpec(pkcs8));
}

From source file:org.xwiki.crypto.password.internal.pbe.factory.BcPBES2AesCipherFactory.java

License:Open Source License

@Override
protected PasswordBasedCipher getInstance(boolean forEncryption, byte[] password, KeyDerivationFunc kdfParams,
        EncryptionScheme scheme) {
    KeyDerivationFunction kdf = getKeyDerivationFunction(kdfParams);

    // Set key size according to the encryption scheme algorithm used.
    kdf.overrideKeySize(getAESKeySize(scheme.getAlgorithm()));

    return getPasswordBasedCipher(forEncryption, kdf, new KeyWithIVParameters(kdf.derive(password).getKey(),
            ((ASN1OctetString) scheme.getParameters()).getOctets()));
}

From source file:org.xwiki.crypto.password.internal.pbe.factory.BcPBES2CipherFactory.java

License:Open Source License

private PasswordBasedCipherFactory getPBES2CipherFactory(EncryptionScheme scheme) {
    try {//from   w w  w . ja va2  s .  c  om
        if (scheme.getAlgorithm().equals(PKCSObjectIdentifiers.encryptionAlgorithm.branch("9"))) {
            RC5CBCParameter rc5Param = RC5CBCParameter.getInstance(scheme.getParameters());
            if (rc5Param.getBlockSizeInBits().intValue() > 64) {
                // RC5-CBC-Pad with a 128bits block size
                return manager.getInstance(PasswordBasedCipherFactory.class, "PBES2-RC5-64-CBC-Pad");
            }
        }
        return manager.getInstance(PasswordBasedCipherFactory.class, scheme.getAlgorithm().getId());
    } catch (ComponentLookupException e) {
        throw new UnsupportedOperationException("Password based cipher factory not found.", e);
    }
}