Update the HmacKeyManager tests.

PiperOrigin-RevId: 265860753
diff --git a/java/src/test/java/com/google/crypto/tink/mac/HmacKeyManagerTest.java b/java/src/test/java/com/google/crypto/tink/mac/HmacKeyManagerTest.java
index fb1d282..7656231 100644
--- a/java/src/test/java/com/google/crypto/tink/mac/HmacKeyManagerTest.java
+++ b/java/src/test/java/com/google/crypto/tink/mac/HmacKeyManagerTest.java
@@ -16,22 +16,22 @@
 
 package com.google.crypto.tink.mac;
 
-import static org.junit.Assert.assertEquals;
+import static com.google.common.truth.Truth.assertThat;
 import static org.junit.Assert.fail;
 
-import com.google.crypto.tink.KeyManager;
-import com.google.crypto.tink.KeyManagerImpl;
 import com.google.crypto.tink.Mac;
 import com.google.crypto.tink.TestUtil;
 import com.google.crypto.tink.proto.HashType;
 import com.google.crypto.tink.proto.HmacKey;
 import com.google.crypto.tink.proto.HmacKeyFormat;
 import com.google.crypto.tink.proto.HmacParams;
-import com.google.crypto.tink.proto.KeyTemplate;
+import com.google.crypto.tink.subtle.MacJce;
+import com.google.crypto.tink.subtle.Random;
 import com.google.protobuf.ByteString;
 import java.security.GeneralSecurityException;
 import java.util.Set;
 import java.util.TreeSet;
+import javax.crypto.spec.SecretKeySpec;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -40,57 +40,230 @@
 @RunWith(JUnit4.class)
 public class HmacKeyManagerTest {
   @Test
-  public void testNewKeyMultipleTimes() throws Exception {
-    KeyManager<Mac> keyManager = new KeyManagerImpl<>(new HmacKeyManager(), Mac.class);
-    HmacKeyFormat hmacKeyFormat = HmacKeyFormat.newBuilder()
-        .setParams(HmacParams.newBuilder().setHash(HashType.SHA256).setTagSize(16).build())
-        .setKeySize(32)
-        .build();
-    ByteString serialized = ByteString.copyFrom(hmacKeyFormat.toByteArray());
-    KeyTemplate keyTemplate =
-        KeyTemplate.newBuilder()
-            .setTypeUrl(new HmacKeyManager().getKeyType())
-            .setValue(serialized)
-            .build();
-    // Calls newKey multiple times and make sure that we get different HmacKey each time.
-    Set<String> keys = new TreeSet<String>();
-    int numTests = 27;
-    for (int i = 0; i < numTests / 3; i++) {
-      HmacKey key = (HmacKey) keyManager.newKey(hmacKeyFormat);
-      assertEquals(32, key.getKeyValue().toByteArray().length);
-      keys.add(TestUtil.hexEncode(key.getKeyValue().toByteArray()));
-
-      key = (HmacKey) keyManager.newKey(serialized);
-      assertEquals(32, key.getKeyValue().toByteArray().length);
-      keys.add(TestUtil.hexEncode(key.getKeyValue().toByteArray()));
-
-      key = HmacKey.parseFrom(keyManager.newKeyData(keyTemplate.getValue()).getValue());
-      assertEquals(32, key.getKeyValue().toByteArray().length);
-      keys.add(TestUtil.hexEncode(key.getKeyValue().toByteArray()));
+  public void validateKeyFormat_empty() throws Exception {
+    try {
+      new HmacKeyManager().keyFactory().validateKeyFormat(HmacKeyFormat.getDefaultInstance());
+      fail("At least the hash type needs to be set");
+    } catch (GeneralSecurityException e) {
+      // expected.
     }
-    assertEquals(numTests, keys.size());
+  }
+
+  private static HmacKeyFormat makeHmacKeyFormat(int keySize, int tagSize, HashType hashType) {
+    HmacParams params = HmacParams.newBuilder()
+        .setHash(hashType)
+        .setTagSize(tagSize)
+        .build();
+    return HmacKeyFormat.newBuilder()
+        .setParams(params)
+        .setKeySize(keySize)
+        .build();
   }
 
   @Test
-  public void testNewKeyCorruptedFormat() throws Exception {
-    KeyManager<Mac> keyManager = new KeyManagerImpl<>(new HmacKeyManager(), Mac.class);
-    ByteString serialized = ByteString.copyFrom(new byte[128]);
-    KeyTemplate keyTemplate =
-        KeyTemplate.newBuilder()
-            .setTypeUrl(new HmacKeyManager().getKeyType())
-            .setValue(serialized)
-            .build();
+  public void validateKeyFormat_tagSizesSha1() throws Exception {
+    HmacKeyManager manager = new HmacKeyManager();
+    manager.keyFactory().validateKeyFormat(makeHmacKeyFormat(16, 10, HashType.SHA1));
+    manager.keyFactory().validateKeyFormat(makeHmacKeyFormat(16, 11, HashType.SHA1));
+    manager.keyFactory().validateKeyFormat(makeHmacKeyFormat(16, 12, HashType.SHA1));
+    manager.keyFactory().validateKeyFormat(makeHmacKeyFormat(16, 13, HashType.SHA1));
+    manager.keyFactory().validateKeyFormat(makeHmacKeyFormat(16, 14, HashType.SHA1));
+    manager.keyFactory().validateKeyFormat(makeHmacKeyFormat(16, 15, HashType.SHA1));
+    manager.keyFactory().validateKeyFormat(makeHmacKeyFormat(16, 16, HashType.SHA1));
+    manager.keyFactory().validateKeyFormat(makeHmacKeyFormat(16, 17, HashType.SHA1));
+    manager.keyFactory().validateKeyFormat(makeHmacKeyFormat(16, 18, HashType.SHA1));
+    manager.keyFactory().validateKeyFormat(makeHmacKeyFormat(16, 19, HashType.SHA1));
+    manager.keyFactory().validateKeyFormat(makeHmacKeyFormat(16, 20, HashType.SHA1));
     try {
-      keyManager.newKey(serialized);
-      fail("Corrupted format, should have thrown exception");
-    } catch (GeneralSecurityException expected) {
-      // Expected
+      manager.keyFactory().validateKeyFormat(makeHmacKeyFormat(16, 21, HashType.SHA1));
+      fail("SHA1 HMAC should not support tag size 21");
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void validateKeyFormat_tagSizesSha256() throws Exception {
+    HmacKeyManager manager = new HmacKeyManager();
+    manager.keyFactory().validateKeyFormat(makeHmacKeyFormat(16, 10, HashType.SHA256));
+    manager.keyFactory().validateKeyFormat(makeHmacKeyFormat(16, 11, HashType.SHA256));
+    manager.keyFactory().validateKeyFormat(makeHmacKeyFormat(16, 12, HashType.SHA256));
+
+    manager.keyFactory().validateKeyFormat(makeHmacKeyFormat(16, 30, HashType.SHA256));
+    manager.keyFactory().validateKeyFormat(makeHmacKeyFormat(16, 31, HashType.SHA256));
+    manager.keyFactory().validateKeyFormat(makeHmacKeyFormat(16, 32, HashType.SHA256));
+    try {
+      manager.keyFactory().validateKeyFormat(makeHmacKeyFormat(16, 33, HashType.SHA256));
+      fail("SHA256 HMAC should not support tag size 33");
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void validateKeyFormat_tagSizesSha512() throws Exception {
+    HmacKeyManager manager = new HmacKeyManager();
+    manager.keyFactory().validateKeyFormat(makeHmacKeyFormat(16, 10, HashType.SHA512));
+    manager.keyFactory().validateKeyFormat(makeHmacKeyFormat(16, 11, HashType.SHA512));
+    manager.keyFactory().validateKeyFormat(makeHmacKeyFormat(16, 12, HashType.SHA512));
+
+    manager.keyFactory().validateKeyFormat(makeHmacKeyFormat(16, 62, HashType.SHA512));
+    manager.keyFactory().validateKeyFormat(makeHmacKeyFormat(16, 63, HashType.SHA512));
+    manager.keyFactory().validateKeyFormat(makeHmacKeyFormat(16, 64, HashType.SHA512));
+    try {
+      manager.keyFactory().validateKeyFormat(makeHmacKeyFormat(16, 65, HashType.SHA512));
+      fail("SHA256 HMAC should not support tag size 65");
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void validateKeyFormat_keySizes() throws Exception {
+    HmacKeyManager manager = new HmacKeyManager();
+    manager.keyFactory().validateKeyFormat(makeHmacKeyFormat(16, 10, HashType.SHA256));
+    try {
+      manager.keyFactory().validateKeyFormat(makeHmacKeyFormat(15, 10, HashType.SHA256));
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void createKey_valid() throws Exception {
+    HmacKeyManager manager = new HmacKeyManager();
+    manager.validateKey(manager.keyFactory().createKey(makeHmacKeyFormat(16, 10, HashType.SHA1)));
+    manager.validateKey(manager.keyFactory().createKey(makeHmacKeyFormat(16, 20, HashType.SHA1)));
+    manager.validateKey(manager.keyFactory().createKey(makeHmacKeyFormat(16, 10, HashType.SHA256)));
+    manager.validateKey(manager.keyFactory().createKey(makeHmacKeyFormat(16, 32, HashType.SHA256)));
+    manager.validateKey(manager.keyFactory().createKey(makeHmacKeyFormat(16, 10, HashType.SHA512)));
+    manager.validateKey(manager.keyFactory().createKey(makeHmacKeyFormat(16, 64, HashType.SHA512)));
+  }
+
+  @Test
+  public void createKey_checkValues() throws Exception {
+    HmacKeyFormat keyFormat = makeHmacKeyFormat(16, 10, HashType.SHA256);
+    HmacKey key = new HmacKeyManager().keyFactory().createKey(keyFormat);
+    assertThat(key.getKeyValue()).hasSize(keyFormat.getKeySize());
+    assertThat(key.getParams().getTagSize()).isEqualTo(keyFormat.getParams().getTagSize());
+  }
+
+  @Test
+  public void createKey_multipleTimes() throws Exception {
+    HmacKeyManager manager = new HmacKeyManager();
+    HmacKeyFormat keyFormat = makeHmacKeyFormat(16, 10, HashType.SHA256);
+    int numKeys = 100;
+    Set<String> keys = new TreeSet<String>();
+    for (int i = 0; i < numKeys; ++i) {
+      keys.add(
+          TestUtil.hexEncode(
+              manager.keyFactory().createKey(keyFormat).getKeyValue().toByteArray()));
+    }
+    assertThat(keys).hasSize(numKeys);
+  }
+
+  @Test
+  public void validateKey_wrongVersion_throws() throws Exception {
+    HmacKeyManager manager = new HmacKeyManager();
+    HmacKey validKey = manager.keyFactory().createKey(makeHmacKeyFormat(16, 10, HashType.SHA1));
+    try {
+      manager.validateKey(HmacKey.newBuilder(validKey).setVersion(1).build());
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void validateKey_notValid_throws() throws Exception {
+    HmacKeyManager manager = new HmacKeyManager();
+    HmacKey validKey = manager.keyFactory().createKey(makeHmacKeyFormat(16, 10, HashType.SHA1));
+    try {
+      manager.validateKey(
+          HmacKey.newBuilder(validKey)
+              .setKeyValue(ByteString.copyFrom(Random.randBytes(15)))
+              .build());
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
     }
     try {
-      keyManager.newKeyData(keyTemplate.getValue());
-      fail("Corrupted format, should have thrown exception");
-    } catch (GeneralSecurityException expected) {
-      // Expected
+      manager
+          .validateKey(
+              HmacKey.newBuilder(validKey)
+                  .setParams(HmacParams.newBuilder(validKey.getParams()).setTagSize(0).build())
+                  .build());
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
     }
+    try {
+      manager
+          .validateKey(
+              HmacKey.newBuilder(validKey)
+                  .setParams(HmacParams.newBuilder(validKey.getParams()).setTagSize(9).build())
+                  .build());
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+    try {
+      manager
+          .validateKey(
+              HmacKey.newBuilder(validKey)
+                  .setParams(HmacParams.newBuilder(validKey.getParams()).setTagSize(21).build())
+                  .build());
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+    try {
+      manager
+          .validateKey(
+              HmacKey.newBuilder(validKey)
+                  .setParams(HmacParams.newBuilder(validKey.getParams()).setTagSize(32).build())
+                  .build());
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+
+  @Test
+  public void getPrimitive_worksForSha1() throws Exception {
+    HmacKeyManager manager = new HmacKeyManager();
+    HmacKey validKey = manager.keyFactory().createKey(makeHmacKeyFormat(16, 19, HashType.SHA1));
+    Mac managerMac = manager.getPrimitive(validKey, Mac.class);
+    Mac directMac =
+        new MacJce(
+            "HMACSHA1", new SecretKeySpec(validKey.getKeyValue().toByteArray(), "HMAC"), 19);
+    byte[] message = Random.randBytes(50);
+    managerMac.verifyMac(directMac.computeMac(message), message);
+  }
+
+  @Test
+  public void getPrimitive_worksForSha256() throws Exception {
+    HmacKeyManager manager = new HmacKeyManager();
+    HmacKey validKey = manager.keyFactory().createKey(makeHmacKeyFormat(16, 29, HashType.SHA256));
+    Mac managerMac = manager.getPrimitive(validKey, Mac.class);
+    Mac directMac =
+        new MacJce(
+            "HMACSHA256", new SecretKeySpec(validKey.getKeyValue().toByteArray(), "HMAC"), 29);
+    byte[] message = Random.randBytes(50);
+    managerMac.verifyMac(directMac.computeMac(message), message);
+  }
+
+  @Test
+  public void getPrimitive_worksForSha512() throws Exception {
+    HmacKeyManager manager = new HmacKeyManager();
+    HmacKey validKey = manager.keyFactory().createKey(makeHmacKeyFormat(16, 33, HashType.SHA512));
+    Mac managerMac = manager.getPrimitive(validKey, Mac.class);
+    Mac directMac =
+        new MacJce(
+            "HMACSHA512", new SecretKeySpec(validKey.getKeyValue().toByteArray(), "HMAC"), 33);
+    byte[] message = Random.randBytes(50);
+    managerMac.verifyMac(directMac.computeMac(message), message);
   }
 }