@Test
public void testMultipleKeys() throws Exception {

  byte[] aesCtrKeyValue = Random.randBytes(AES_KEY_SIZE);
  byte[] hmacKeyValue = Random.randBytes(HMAC_KEY_SIZE);
  int ivSize = 12;
  int tagSize = 16;
  Key primary =
      TestUtil.createKey(
          TestUtil.createAesCtrHmacAeadKeyData(aesCtrKeyValue, ivSize, hmacKeyValue, tagSize),
          42,
          KeyStatusType.ENABLED,
          OutputPrefixType.TINK);
  Key raw =
      TestUtil.createKey(
          TestUtil.createAesCtrHmacAeadKeyData(aesCtrKeyValue, ivSize, hmacKeyValue, tagSize),
          43,
          KeyStatusType.ENABLED,
          OutputPrefixType.RAW);
  Key legacy =
      TestUtil.createKey(
          TestUtil.createAesCtrHmacAeadKeyData(aesCtrKeyValue, ivSize, hmacKeyValue, tagSize),
          44,
          KeyStatusType.ENABLED,
          OutputPrefixType.LEGACY);
  Key tink =
      TestUtil.createKey(
          TestUtil.createAesCtrHmacAeadKeyData(aesCtrKeyValue, ivSize, hmacKeyValue, tagSize),
          45,
          KeyStatusType.ENABLED,
          OutputPrefixType.TINK);
  KeysetHandle keysetHandle =
      TestUtil.createKeysetHandle(TestUtil.createKeyset(primary, raw, legacy, tink));
  Aead aead = keysetHandle.getPrimitive(Aead.class);
  byte[] plaintext = Random.randBytes(20);
  byte[] associatedData = Random.randBytes(20);
  byte[] ciphertext = aead.encrypt(plaintext, associatedData);
  byte[] prefix = Arrays.copyOfRange(ciphertext, 0, CryptoFormat.NON_RAW_PREFIX_SIZE);
  assertArrayEquals(prefix, CryptoFormat.getOutputPrefix(primary));
  assertArrayEquals(plaintext, aead.decrypt(ciphertext, associatedData));
  assertEquals(
      CryptoFormat.NON_RAW_PREFIX_SIZE + plaintext.length + ivSize + tagSize, ciphertext.length);
  // encrypt with a non-primary RAW key and decrypt with the keyset
  KeysetHandle keysetHandle2 =
      TestUtil.createKeysetHandle(TestUtil.createKeyset(raw, legacy, tink));
  Aead aead2 = keysetHandle2.getPrimitive(Aead.class);
  ciphertext = aead2.encrypt(plaintext, associatedData);
  assertArrayEquals(plaintext, aead.decrypt(ciphertext, associatedData));
  // encrypt with a random key not in the keyset, decrypt with the keyset should fail
  byte[] aesCtrKeyValue2 = Random.randBytes(AES_KEY_SIZE);
  byte[] hmacKeyValue2 = Random.randBytes(HMAC_KEY_SIZE);
  Key random =
      TestUtil.createKey(
          TestUtil.createAesCtrHmacAeadKeyData(aesCtrKeyValue2, ivSize, hmacKeyValue2, tagSize),
          44,
          KeyStatusType.ENABLED,
          OutputPrefixType.TINK);
  keysetHandle2 = TestUtil.createKeysetHandle(TestUtil.createKeyset(random));
  aead2 = keysetHandle2.getPrimitive(Aead.class);
  ciphertext = aead2.encrypt(plaintext, associatedData);
  try {
    aead.decrypt(ciphertext, associatedData);
    fail("Expected GeneralSecurityException");
  } catch (GeneralSecurityException e) {
    assertExceptionContains(e, "decryption failed");
  }
}