From dc91bb349891e6f69a9dbfaa87e9874e91128458 Mon Sep 17 00:00:00 2001 From: Veronika Slivova <slivova@google.com> Date: Tue, 3 Jul 2018 01:32:50 -0700 Subject: [PATCH] Registering key manager with not supported key type should not be allowed. PiperOrigin-RevId: 203082603 GitOrigin-RevId: 610b190732a8c98bfbed8f0625a2688d8c748a67 --- .../java/com/google/crypto/tink/Registry.java | 5 +++ .../com/google/crypto/tink/RegistryTest.java | 41 ++++++++++++++----- 2 files changed, 35 insertions(+), 11 deletions(-) diff --git a/java/src/main/java/com/google/crypto/tink/Registry.java b/java/src/main/java/com/google/crypto/tink/Registry.java index c40af4af0..16970ab65 100644 --- a/java/src/main/java/com/google/crypto/tink/Registry.java +++ b/java/src/main/java/com/google/crypto/tink/Registry.java @@ -194,6 +194,11 @@ public final class Registry { if (manager == null) { throw new IllegalArgumentException("key manager must be non-null."); } + if (!manager.doesSupport(typeUrl)) { + throw new GeneralSecurityException( + "Manager does not support key type " + + typeUrl + "."); + } if (keyManagerMap.containsKey(typeUrl)) { KeyManager<P> existingManager = getKeyManager(typeUrl); boolean existingNewKeyAllowed = newKeyAllowedMap.get(typeUrl).booleanValue(); diff --git a/java/src/test/java/com/google/crypto/tink/RegistryTest.java b/java/src/test/java/com/google/crypto/tink/RegistryTest.java index c15b5174b..0bd3e2d7f 100644 --- a/java/src/test/java/com/google/crypto/tink/RegistryTest.java +++ b/java/src/test/java/com/google/crypto/tink/RegistryTest.java @@ -50,7 +50,11 @@ import org.junit.runners.JUnit4; @RunWith(JUnit4.class) public class RegistryTest { private static class CustomAeadKeyManager implements KeyManager<Aead> { - public CustomAeadKeyManager() {} + public CustomAeadKeyManager(String typeUrl) { + this.typeUrl = typeUrl; + } + + private final String typeUrl; @Override public Aead getPrimitive(ByteString proto) throws GeneralSecurityException { @@ -78,13 +82,13 @@ public class RegistryTest { } @Override - public boolean doesSupport(String typeUrl) { // supports same keys as AesEaxKey - return typeUrl.equals(AeadConfig.AES_EAX_TYPE_URL); + public boolean doesSupport(String typeUrl) { + return typeUrl.equals(this.typeUrl); } @Override public String getKeyType() { - return AeadConfig.AES_EAX_TYPE_URL; + return this.typeUrl; } @Override @@ -147,13 +151,28 @@ public class RegistryTest { } } + @Test + public void testRegisterKeyManager_WithKeyTypeNotSupported_shouldThrowException() + throws Exception { + String typeUrl = "someTypeUrl"; + String differentTypeUrl = "differentTypeUrl"; + try { + Registry.registerKeyManager(differentTypeUrl, new CustomAeadKeyManager(typeUrl)); + } catch (GeneralSecurityException e) { + assertExceptionContains(e, + "Manager does not support key type " + differentTypeUrl); + return; + } + fail("Should throw an exception."); + } + @Test public void testRegisterKeyManager_MoreRestrictedNewKeyAllowed_shouldWork() throws Exception { String typeUrl = "typeUrl"; - Registry.registerKeyManager(typeUrl, new CustomAeadKeyManager()); + Registry.registerKeyManager(typeUrl, new CustomAeadKeyManager(typeUrl)); try { - Registry.registerKeyManager(typeUrl, new CustomAeadKeyManager(), false); + Registry.registerKeyManager(typeUrl, new CustomAeadKeyManager(typeUrl), false); } catch (GeneralSecurityException e) { fail("repeated registrations of the same key manager should work"); } @@ -163,10 +182,10 @@ public class RegistryTest { public void testRegisterKeyManager_LessRestrictedNewKeyAllowed_shouldThrowException() throws Exception { String typeUrl = "typeUrl"; - Registry.registerKeyManager(typeUrl, new CustomAeadKeyManager(), false); + Registry.registerKeyManager(typeUrl, new CustomAeadKeyManager(typeUrl), false); try { - Registry.registerKeyManager(typeUrl, new CustomAeadKeyManager(), true); + Registry.registerKeyManager(typeUrl, new CustomAeadKeyManager(typeUrl), true); fail("Expected GeneralSecurityException"); } catch (GeneralSecurityException e) { // expected @@ -178,8 +197,8 @@ public class RegistryTest { throws Exception { // This should not overwrite the existing manager. try { - Registry.registerKeyManager( - AeadConfig.AES_CTR_HMAC_AEAD_TYPE_URL, new CustomAeadKeyManager()); + Registry.registerKeyManager(AeadConfig.AES_CTR_HMAC_AEAD_TYPE_URL, + new CustomAeadKeyManager(AeadConfig.AES_CTR_HMAC_AEAD_TYPE_URL)); fail("Expected GeneralSecurityException."); } catch (GeneralSecurityException e) { assertThat(e.toString()).contains("already registered"); @@ -324,7 +343,7 @@ public class RegistryTest { .build()); // Get a PrimitiveSet using a custom key manager for key1. - KeyManager<Aead> customManager = new CustomAeadKeyManager(); + KeyManager<Aead> customManager = new CustomAeadKeyManager(AeadConfig.AES_EAX_TYPE_URL); PrimitiveSet<Aead> aeadSet = Registry.getPrimitives(keysetHandle, customManager); List<PrimitiveSet.Entry<Aead>> aead1List = aeadSet.getPrimitive(keysetHandle.getKeyset().getKey(0)); -- GitLab