Search in sources :

Example 11 with AlgorithmParameterSpec

use of java.security.spec.AlgorithmParameterSpec in project robovm by robovm.

the class CipherTest method test_Cipher.

private void test_Cipher(Cipher c) throws Exception {
    String algorithm = c.getAlgorithm().toUpperCase(Locale.US);
    String providerName = c.getProvider().getName();
    if (!isSupported(algorithm, providerName)) {
        return;
    }
    String cipherID = algorithm + ":" + providerName;
    try {
        c.getOutputSize(0);
    } catch (IllegalStateException expected) {
    }
    // TODO: test keys from different factories (e.g. OpenSSLRSAPrivateKey vs JCERSAPrivateKey)
    Key encryptKey = getEncryptKey(algorithm);
    final AlgorithmParameterSpec encryptSpec = getEncryptAlgorithmParameterSpec(algorithm);
    int encryptMode = getEncryptMode(algorithm);
    // Bouncycastle doesn't return a default PBEParameterSpec
    if (isPBE(algorithm) && !"BC".equals(providerName)) {
        assertNotNull(cipherID + " getParameters()", c.getParameters());
        assertNotNull(c.getParameters().getParameterSpec(PBEParameterSpec.class));
    } else {
        assertNull(cipherID + " getParameters()", c.getParameters());
    }
    try {
        assertNull(cipherID + " getIV()", c.getIV());
    } catch (NullPointerException e) {
        // Bouncycastle apparently has a bug here with AESWRAP, et al.
        if (!("BC".equals(providerName) && isOnlyWrappingAlgorithm(algorithm))) {
            throw e;
        }
    }
    c.init(encryptMode, encryptKey, encryptSpec);
    assertEquals(cipherID + " getBlockSize() encryptMode", getExpectedBlockSize(algorithm, encryptMode, providerName), c.getBlockSize());
    assertEquals(cipherID + " getOutputSize(0) encryptMode", getExpectedOutputSize(algorithm, encryptMode, providerName), c.getOutputSize(0));
    final AlgorithmParameterSpec decryptSpec = getDecryptAlgorithmParameterSpec(encryptSpec, c);
    int decryptMode = getDecryptMode(algorithm);
    c.init(decryptMode, encryptKey, decryptSpec);
    assertEquals(cipherID + " getBlockSize() decryptMode", getExpectedBlockSize(algorithm, decryptMode, providerName), c.getBlockSize());
    assertEquals(cipherID + " getOutputSize(0) decryptMode", getExpectedOutputSize(algorithm, decryptMode, providerName), c.getOutputSize(0));
    if (isPBE(algorithm)) {
        if (algorithm.endsWith("RC4")) {
            assertNull(cipherID + " getIV()", c.getIV());
        } else {
            assertNotNull(cipherID + " getIV()", c.getIV());
        }
    } else if (decryptSpec instanceof IvParameterSpec) {
        assertEquals(cipherID + " getIV()", Arrays.toString(((IvParameterSpec) decryptSpec).getIV()), Arrays.toString(c.getIV()));
    } else {
        try {
            assertNull(cipherID + " getIV()", c.getIV());
        } catch (NullPointerException e) {
            // Bouncycastle apparently has a bug here with AESWRAP, et al.
            if (!("BC".equals(providerName) && isOnlyWrappingAlgorithm(algorithm))) {
                throw e;
            }
        }
    }
    AlgorithmParameters params = c.getParameters();
    if (decryptSpec == null) {
        assertNull(cipherID + " getParameters()", params);
    } else if (decryptSpec instanceof IvParameterSpec) {
        IvParameterSpec ivDecryptSpec = (IvParameterSpec) params.getParameterSpec(IvParameterSpec.class);
        assertEquals(cipherID + " getIV()", Arrays.toString(((IvParameterSpec) decryptSpec).getIV()), Arrays.toString(ivDecryptSpec.getIV()));
    } else if (decryptSpec instanceof PBEParameterSpec) {
        // Bouncycastle seems to be schizophrenic about whther it returns this or not
        if (!"BC".equals(providerName)) {
            assertNotNull(cipherID + " getParameters()", params);
        }
    }
    assertNull(cipherID, c.getExemptionMechanism());
    // Test wrapping a key.  Every cipher should be able to wrap. Except those that can't.
    if (isSupportedForWrapping(algorithm)) {
        // Generate a small SecretKey for AES.
        KeyGenerator kg = KeyGenerator.getInstance("AES");
        kg.init(128);
        SecretKey sk = kg.generateKey();
        // Wrap it
        c.init(Cipher.WRAP_MODE, encryptKey, encryptSpec);
        byte[] cipherText = c.wrap(sk);
        // Unwrap it
        c.init(Cipher.UNWRAP_MODE, getDecryptKey(algorithm), decryptSpec);
        Key decryptedKey = c.unwrap(cipherText, sk.getAlgorithm(), Cipher.SECRET_KEY);
        assertEquals(cipherID + " sk.getAlgorithm()=" + sk.getAlgorithm() + " decryptedKey.getAlgorithm()=" + decryptedKey.getAlgorithm() + " encryptKey.getEncoded()=" + Arrays.toString(sk.getEncoded()) + " decryptedKey.getEncoded()=" + Arrays.toString(decryptedKey.getEncoded()), sk, decryptedKey);
    }
    if (!isOnlyWrappingAlgorithm(algorithm)) {
        c.init(Cipher.ENCRYPT_MODE, encryptKey, encryptSpec);
        byte[] cipherText = c.doFinal(getActualPlainText(algorithm));
        c.init(Cipher.DECRYPT_MODE, getDecryptKey(algorithm), decryptSpec);
        byte[] decryptedPlainText = c.doFinal(cipherText);
        assertEquals(cipherID, Arrays.toString(getExpectedPlainText(algorithm, providerName)), Arrays.toString(decryptedPlainText));
    }
}
Also used : SecretKey(javax.crypto.SecretKey) IvParameterSpec(javax.crypto.spec.IvParameterSpec) AlgorithmParameterSpec(java.security.spec.AlgorithmParameterSpec) KeyGenerator(javax.crypto.KeyGenerator) RSAPublicKey(java.security.interfaces.RSAPublicKey) RSAPrivateKey(java.security.interfaces.RSAPrivateKey) PublicKey(java.security.PublicKey) Key(java.security.Key) PrivateKey(java.security.PrivateKey) SecretKey(javax.crypto.SecretKey) PBEParameterSpec(javax.crypto.spec.PBEParameterSpec) AlgorithmParameters(java.security.AlgorithmParameters)

Example 12 with AlgorithmParameterSpec

use of java.security.spec.AlgorithmParameterSpec in project robovm by robovm.

the class CipherTest method checkCipher.

private void checkCipher(CipherTestParam p, String provider) throws Exception {
    SecretKey key = new SecretKeySpec(p.key, "AES");
    Cipher c = Cipher.getInstance(p.mode + "/PKCS5Padding", provider);
    AlgorithmParameterSpec spec = null;
    if (p.iv != null) {
        spec = new IvParameterSpec(p.iv);
    }
    c.init(Cipher.ENCRYPT_MODE, key, spec);
    final byte[] actualCiphertext = c.doFinal(p.plaintext);
    assertEquals(Arrays.toString(p.ciphertext), Arrays.toString(actualCiphertext));
    byte[] emptyCipherText = c.doFinal();
    assertNotNull(emptyCipherText);
    c.init(Cipher.DECRYPT_MODE, key, spec);
    try {
        c.updateAAD(new byte[8]);
        fail("Cipher should not support AAD");
    } catch (UnsupportedOperationException expected) {
    }
    byte[] emptyPlainText = c.doFinal(emptyCipherText);
    assertEquals(Arrays.toString(EmptyArray.BYTE), Arrays.toString(emptyPlainText));
    // empty decrypt
    {
        if (StandardNames.IS_RI) {
            assertEquals(Arrays.toString(EmptyArray.BYTE), Arrays.toString(c.doFinal()));
            c.update(EmptyArray.BYTE);
            assertEquals(Arrays.toString(EmptyArray.BYTE), Arrays.toString(c.doFinal()));
        } else if (provider.equals("BC")) {
            try {
                c.doFinal();
                fail();
            } catch (IllegalBlockSizeException expected) {
            }
            try {
                c.update(EmptyArray.BYTE);
                c.doFinal();
                fail();
            } catch (IllegalBlockSizeException expected) {
            }
        } else if (provider.equals("AndroidOpenSSL")) {
            assertNull(c.doFinal());
            c.update(EmptyArray.BYTE);
            assertNull(c.doFinal());
        } else {
            throw new AssertionError("Define your behavior here for " + provider);
        }
    }
    // .doFinal(input)
    {
        final byte[] actualPlaintext = c.doFinal(p.ciphertext);
        assertEquals(Arrays.toString(p.plaintext), Arrays.toString(actualPlaintext));
    }
    // .doFinal(input, offset, len, output)
    {
        final byte[] largerThanCiphertext = new byte[p.ciphertext.length + 5];
        System.arraycopy(p.ciphertext, 0, largerThanCiphertext, 5, p.ciphertext.length);
        final byte[] actualPlaintext = new byte[c.getOutputSize(p.ciphertext.length)];
        assertEquals(p.plaintext.length, c.doFinal(largerThanCiphertext, 5, p.ciphertext.length, actualPlaintext));
        assertEquals(Arrays.toString(p.plaintext), Arrays.toString(Arrays.copyOfRange(actualPlaintext, 0, p.plaintext.length)));
    }
    // .doFinal(input, offset, len, output, offset)
    {
        final byte[] largerThanCiphertext = new byte[p.ciphertext.length + 10];
        System.arraycopy(p.ciphertext, 0, largerThanCiphertext, 5, p.ciphertext.length);
        final byte[] actualPlaintext = new byte[c.getOutputSize(p.ciphertext.length) + 2];
        assertEquals(p.plaintext.length, c.doFinal(largerThanCiphertext, 5, p.ciphertext.length, actualPlaintext, 1));
        assertEquals(Arrays.toString(p.plaintext), Arrays.toString(Arrays.copyOfRange(actualPlaintext, 1, p.plaintext.length + 1)));
    }
    Cipher cNoPad = Cipher.getInstance(p.mode + "/NoPadding", provider);
    cNoPad.init(Cipher.DECRYPT_MODE, key, spec);
    final byte[] actualPlaintextPadded = cNoPad.doFinal(p.ciphertext);
    assertEquals(Arrays.toString(p.plaintextPadded), Arrays.toString(actualPlaintextPadded));
    // Test wrapping a key. Every cipher should be able to wrap.
    {
        // Generate a small SecretKey for AES.
        KeyGenerator kg = KeyGenerator.getInstance("AES");
        kg.init(128);
        SecretKey sk = kg.generateKey();
        // Wrap it
        c.init(Cipher.WRAP_MODE, key, spec);
        byte[] cipherText = c.wrap(sk);
        // Unwrap it
        c.init(Cipher.UNWRAP_MODE, key, spec);
        Key decryptedKey = c.unwrap(cipherText, sk.getAlgorithm(), Cipher.SECRET_KEY);
        assertEquals("sk.getAlgorithm()=" + sk.getAlgorithm() + " decryptedKey.getAlgorithm()=" + decryptedKey.getAlgorithm() + " encryptKey.getEncoded()=" + Arrays.toString(sk.getEncoded()) + " decryptedKey.getEncoded()=" + Arrays.toString(decryptedKey.getEncoded()), sk, decryptedKey);
    }
}
Also used : SecretKey(javax.crypto.SecretKey) SecretKeySpec(javax.crypto.spec.SecretKeySpec) IllegalBlockSizeException(javax.crypto.IllegalBlockSizeException) IvParameterSpec(javax.crypto.spec.IvParameterSpec) Cipher(javax.crypto.Cipher) AlgorithmParameterSpec(java.security.spec.AlgorithmParameterSpec) KeyGenerator(javax.crypto.KeyGenerator) RSAPublicKey(java.security.interfaces.RSAPublicKey) RSAPrivateKey(java.security.interfaces.RSAPrivateKey) PublicKey(java.security.PublicKey) Key(java.security.Key) PrivateKey(java.security.PrivateKey) SecretKey(javax.crypto.SecretKey)

Example 13 with AlgorithmParameterSpec

use of java.security.spec.AlgorithmParameterSpec in project robovm by robovm.

the class CipherTest method test_doFinal$BII.

public void test_doFinal$BII() throws Exception {
    byte[] b = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 };
    byte[] b1 = new byte[30];
    AlgorithmParameterSpec ap = new IvParameterSpec(IV);
    Cipher c = Cipher.getInstance("DES/CBC/NoPadding");
    c.init(Cipher.ENCRYPT_MODE, CIPHER_KEY_DES, ap);
    try {
        c.doFinal(b, 0, 10);
        fail();
    } catch (IllegalBlockSizeException expected) {
    }
    c = Cipher.getInstance("DES/CBC/NoPadding");
    try {
        c.doFinal(b, 0, 10);
        fail();
    } catch (IllegalStateException expected) {
    }
    c = Cipher.getInstance("DES/CBC/NoPadding");
    c.init(Cipher.ENCRYPT_MODE, CIPHER_KEY_DES, ap);
    int len1 = c.doFinal(b, 0, 16).length;
    assertEquals(16, len1);
    c.init(Cipher.ENCRYPT_MODE, CIPHER_KEY_DES, ap);
    int len2 = c.doFinal(b, 0, 16, b1, 0);
    assertEquals(16, len2);
    c = Cipher.getInstance("DES/CBC/PKCS5Padding");
    c.init(Cipher.DECRYPT_MODE, CIPHER_KEY_DES, ap);
    try {
        c.doFinal(b1, 0, 24);
        fail();
    } catch (BadPaddingException expected) {
    }
}
Also used : IllegalBlockSizeException(javax.crypto.IllegalBlockSizeException) IvParameterSpec(javax.crypto.spec.IvParameterSpec) Cipher(javax.crypto.Cipher) MyCipher(org.apache.harmony.crypto.tests.support.MyCipher) BadPaddingException(javax.crypto.BadPaddingException) AlgorithmParameterSpec(java.security.spec.AlgorithmParameterSpec)

Example 14 with AlgorithmParameterSpec

use of java.security.spec.AlgorithmParameterSpec in project robovm by robovm.

the class CipherTest method test_doFinal$BI.

public void test_doFinal$BI() throws Exception {
    byte[] b = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 };
    byte[] b1 = new byte[30];
    AlgorithmParameterSpec ap = new IvParameterSpec(IV);
    Cipher c = Cipher.getInstance("DES/CBC/NoPadding");
    c.init(Cipher.ENCRYPT_MODE, CIPHER_KEY_DES, ap);
    c.update(b, 0, 10);
    try {
        c.doFinal(b1, 5);
        fail();
    } catch (IllegalBlockSizeException expected) {
    }
    c = Cipher.getInstance("DES/CBC/NoPadding");
    try {
        c.doFinal(b1, 5);
        fail();
    } catch (IllegalStateException expected) {
    }
    c = Cipher.getInstance("DES/CBC/NoPadding");
    c.init(Cipher.ENCRYPT_MODE, CIPHER_KEY_DES, ap);
    c.update(b, 3, 8);
    int len = c.doFinal(b1, 0);
    assertEquals(0, len);
    c = Cipher.getInstance("DES/CBC/PKCS5Padding");
    c.init(Cipher.DECRYPT_MODE, CIPHER_KEY_DES, ap);
    c.update(b1, 0, 24);
    try {
        c.doFinal(b, 0);
        fail();
    } catch (BadPaddingException expected) {
    }
    b1 = new byte[6];
    c = Cipher.getInstance("DESede");
    c.init(Cipher.ENCRYPT_MODE, CIPHER_KEY_3DES);
    c.update(b, 3, 6);
    try {
        c.doFinal(b1, 5);
        fail();
    } catch (ShortBufferException expected) {
    }
}
Also used : IllegalBlockSizeException(javax.crypto.IllegalBlockSizeException) ShortBufferException(javax.crypto.ShortBufferException) IvParameterSpec(javax.crypto.spec.IvParameterSpec) Cipher(javax.crypto.Cipher) MyCipher(org.apache.harmony.crypto.tests.support.MyCipher) BadPaddingException(javax.crypto.BadPaddingException) AlgorithmParameterSpec(java.security.spec.AlgorithmParameterSpec)

Example 15 with AlgorithmParameterSpec

use of java.security.spec.AlgorithmParameterSpec in project robovm by robovm.

the class CipherTest method test_doFinal$BII$B.

public void test_doFinal$BII$B() throws Exception {
    byte[] b = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 };
    byte[] b1 = new byte[30];
    AlgorithmParameterSpec ap = new IvParameterSpec(IV);
    Cipher c = Cipher.getInstance("DES/CBC/NoPadding");
    c.init(Cipher.ENCRYPT_MODE, CIPHER_KEY_DES, ap);
    try {
        c.doFinal(b, 0, 10, b1);
        fail();
    } catch (IllegalBlockSizeException expected) {
    }
    c = Cipher.getInstance("DES/CBC/NoPadding");
    try {
        c.doFinal(b, 0, 10, b1);
        fail();
    } catch (IllegalStateException expected) {
    }
    c = Cipher.getInstance("DES/CBC/NoPadding");
    c.init(Cipher.ENCRYPT_MODE, CIPHER_KEY_DES, ap);
    int len = c.doFinal(b, 0, 16, b1);
    assertEquals(16, len);
    c = Cipher.getInstance("DES/CBC/PKCS5Padding");
    c.init(Cipher.DECRYPT_MODE, CIPHER_KEY_DES, ap);
    try {
        c.doFinal(b1, 0, 24, new byte[42]);
        fail();
    } catch (BadPaddingException expected) {
    }
    b1 = new byte[6];
    c = Cipher.getInstance("DESede");
    c.init(Cipher.ENCRYPT_MODE, CIPHER_KEY_3DES);
    try {
        c.doFinal(b, 3, 6, b1);
        fail();
    } catch (ShortBufferException expected) {
    }
}
Also used : IllegalBlockSizeException(javax.crypto.IllegalBlockSizeException) ShortBufferException(javax.crypto.ShortBufferException) IvParameterSpec(javax.crypto.spec.IvParameterSpec) Cipher(javax.crypto.Cipher) MyCipher(org.apache.harmony.crypto.tests.support.MyCipher) BadPaddingException(javax.crypto.BadPaddingException) AlgorithmParameterSpec(java.security.spec.AlgorithmParameterSpec)

Aggregations

AlgorithmParameterSpec (java.security.spec.AlgorithmParameterSpec)186 IvParameterSpec (javax.crypto.spec.IvParameterSpec)59 Cipher (javax.crypto.Cipher)55 InvalidAlgorithmParameterException (java.security.InvalidAlgorithmParameterException)51 InvalidKeyException (java.security.InvalidKeyException)42 NoSuchAlgorithmException (java.security.NoSuchAlgorithmException)37 SecureRandom (java.security.SecureRandom)27 SecretKey (javax.crypto.SecretKey)27 IllegalBlockSizeException (javax.crypto.IllegalBlockSizeException)24 BigInteger (java.math.BigInteger)21 BadPaddingException (javax.crypto.BadPaddingException)21 NoSuchPaddingException (javax.crypto.NoSuchPaddingException)20 RSAKeyGenParameterSpec (java.security.spec.RSAKeyGenParameterSpec)19 ShortBufferException (javax.crypto.ShortBufferException)19 Key (java.security.Key)18 SecretKeySpec (javax.crypto.spec.SecretKeySpec)18 AlgorithmParameters (java.security.AlgorithmParameters)17 KeyGenerator (javax.crypto.KeyGenerator)17 OAEPParameterSpec (javax.crypto.spec.OAEPParameterSpec)15 IOException (java.io.IOException)14