== How to fix it in Java Cryptographic Extension

=== Code examples

==== Noncompliant code example

[source,kotlin,diff-id=1,diff-type=noncompliant]
----
import java.nio.charset.StandardCharsets
import java.security.InvalidAlgorithmParameterException
import java.security.InvalidKeyException
import java.security.NoSuchAlgorithmException
import javax.crypto.Cipher
import javax.crypto.NoSuchPaddingException
import javax.crypto.spec.GCMParameterSpec
import javax.crypto.spec.SecretKeySpec

fun encrypt(key: String, plainText: String) {

    val randomBytes = "7cVgr5cbdCZVw5WY".toByteArray(StandardCharsets.UTF_8)

    val iv      = GCMParameterSpec(128, randomBytes)
    val keySpec = SecretKeySpec(key.toByteArray(StandardCharsets.UTF_8), "AES")

    try {
        val cipher = Cipher.getInstance("AES/CBC/NoPadding")
        cipher.init(Cipher.ENCRYPT_MODE, keySpec, iv) // Noncompliant

    } catch (e: NoSuchAlgorithmException) {
        // ...
    } catch (e: InvalidKeyException) {
        // ...
    } catch (e: NoSuchPaddingException) {
        // ...
    } catch (e: InvalidAlgorithmParameterException) {
        // ...
    }
}
----

==== Compliant solution

:explicit_strong: java.security.SecureRandom

include::../../common/fix/explicit-fix.adoc[]

[source,kotlin,diff-id=1,diff-type=compliant]
----
import java.nio.charset.StandardCharsets
import java.security.SecureRandom
import java.security.InvalidAlgorithmParameterException
import java.security.InvalidKeyException
import java.security.NoSuchAlgorithmException
import javax.crypto.Cipher
import javax.crypto.NoSuchPaddingException
import javax.crypto.spec.GCMParameterSpec
import javax.crypto.spec.SecretKeySpec

fun encrypt(key: String, plainText: String) {

    val random      = SecureRandom();
    val randomBytes = ByteArray(16);
    random.nextBytes(randomBytes);

    val iv      = GCMParameterSpec(128, randomBytes)
    val keySpec = SecretKeySpec(key.toByteArray(StandardCharsets.UTF_8), "AES")

    try {
        val cipher = Cipher.getInstance("AES/CBC/NoPadding")
        cipher.init(Cipher.ENCRYPT_MODE, keySpec, iv)

    } catch (e: NoSuchAlgorithmException) {
        // ...
    } catch (e: InvalidKeyException) {
        // ...
    } catch (e: NoSuchPaddingException) {
        // ...
    } catch (e: InvalidAlgorithmParameterException) {
        // ...
    }
}
----

=== How does this work?

include::../../common/fix/fix.adoc[]
