@Test
public void testMultipleKeys() throws Exception {

  byte[] primaryKeyValue = Random.randBytes(KDF_KEY_SIZE);
  byte[] otherKeyValue = Random.randBytes(KDF_KEY_SIZE);
  byte[] anotherKeyValue = Random.randBytes(KDF_KEY_SIZE);
  int derivedKeySize = AES_KEY_SIZE;
  Key primaryKey = TestUtil.createKey(
      TestUtil.createAesGcmHkdfStreamingKeyData(
          primaryKeyValue, derivedKeySize, 512),
      42,
      KeyStatusType.ENABLED,
      OutputPrefixType.RAW);
  // Another key with a smaller segment size than the primary key
  Key otherKey = TestUtil.createKey(
      TestUtil.createAesCtrHmacStreamingKeyData(
          otherKeyValue, derivedKeySize, 256),
      43,
      KeyStatusType.ENABLED,
      OutputPrefixType.RAW);
  // Another key with a larger segment size than the primary key
  Key anotherKey = TestUtil.createKey(
      TestUtil.createAesGcmHkdfStreamingKeyData(
          anotherKeyValue, derivedKeySize, 1024),
      72,
      KeyStatusType.ENABLED,
      OutputPrefixType.RAW);
  KeysetHandle keysetHandle =
      TestUtil.createKeysetHandle(TestUtil.createKeyset(primaryKey, otherKey, anotherKey));
  StreamingAead streamingAead = StreamingAeadFactory.getPrimitive(keysetHandle);
  StreamingAead primaryAead = StreamingAeadFactory.getPrimitive(
      TestUtil.createKeysetHandle(TestUtil.createKeyset(primaryKey)));
  StreamingAead otherAead = StreamingAeadFactory.getPrimitive(
      TestUtil.createKeysetHandle(TestUtil.createKeyset(otherKey)));
  StreamingAead anotherAead = StreamingAeadFactory.getPrimitive(
      TestUtil.createKeysetHandle(TestUtil.createKeyset(anotherKey)));
  StreamingTestUtil.testEncryptionAndDecryption(streamingAead, streamingAead);
  StreamingTestUtil.testEncryptionAndDecryption(streamingAead, primaryAead);
  StreamingTestUtil.testEncryptionAndDecryption(primaryAead, streamingAead);
  StreamingTestUtil.testEncryptionAndDecryption(otherAead, streamingAead);
  StreamingTestUtil.testEncryptionAndDecryption(anotherAead, streamingAead);
  StreamingTestUtil.testEncryptionAndDecryption(primaryAead, primaryAead);
  StreamingTestUtil.testEncryptionAndDecryption(otherAead, otherAead);
  StreamingTestUtil.testEncryptionAndDecryption(anotherAead, anotherAead);
  try {
    StreamingTestUtil.testEncryptionAndDecryption(otherAead, primaryAead);
    fail("No matching key, should have thrown an exception");
  } catch (IOException expected) {
    assertExceptionContains(expected, "No matching key");
  }
  try {
    StreamingTestUtil.testEncryptionAndDecryption(anotherAead, primaryAead);
    fail("No matching key, should have thrown an exception");
  } catch (IOException expected) {
    assertExceptionContains(expected, "No matching key");
  }
}