Make HMAC operations use MAC length specified at operation time.

MAC length is no longer associated with a key, but specified for each
operation.

Bug: 19991862
Change-Id: I2c4389a0ab8b68b6f3a9464063d4422caa81d9b7
diff --git a/google_keymaster_test.cpp b/google_keymaster_test.cpp
index ab427d4..73e071f 100644
--- a/google_keymaster_test.cpp
+++ b/google_keymaster_test.cpp
@@ -428,60 +428,63 @@
 }
 
 TEST_F(SigningOperationsTest, HmacSha1Success) {
-    GenerateKey(AuthorizationSetBuilder()
-                    .HmacKey(128)
-                    .Digest(KM_DIGEST_SHA1)
-                    .Authorization(TAG_MAC_LENGTH, 20));
+    GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA1));
     string message = "12345678901234567890123456789012";
     string signature;
-    SignMessage(message, &signature);
+    MacMessage(message, &signature, 20);
     ASSERT_EQ(20U, signature.size());
 }
 
 TEST_F(SigningOperationsTest, HmacSha224Success) {
-    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
-                                           .HmacKey(128)
-                                           .Digest(KM_DIGEST_SHA_2_224)
-                                           .Authorization(TAG_MAC_LENGTH, 28)));
+    ASSERT_EQ(KM_ERROR_OK,
+              GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_224)));
     string message = "12345678901234567890123456789012";
     string signature;
-    SignMessage(message, &signature);
+    MacMessage(message, &signature, 28);
     ASSERT_EQ(28U, signature.size());
 }
 
 TEST_F(SigningOperationsTest, HmacSha256Success) {
-    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
-                                           .HmacKey(128)
-                                           .Digest(KM_DIGEST_SHA_2_256)
-                                           .Authorization(TAG_MAC_LENGTH, 32)));
+    ASSERT_EQ(KM_ERROR_OK,
+              GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_256)));
     string message = "12345678901234567890123456789012";
     string signature;
-    SignMessage(message, &signature);
+    MacMessage(message, &signature, 32);
     ASSERT_EQ(32U, signature.size());
 }
 
 TEST_F(SigningOperationsTest, HmacSha384Success) {
-    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
-                                           .HmacKey(128)
-                                           .Digest(KM_DIGEST_SHA_2_384)
-                                           .Authorization(TAG_MAC_LENGTH, 48)));
+    ASSERT_EQ(KM_ERROR_OK,
+              GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_384)));
+
     string message = "12345678901234567890123456789012";
     string signature;
-    SignMessage(message, &signature);
+    MacMessage(message, &signature, 48);
     ASSERT_EQ(48U, signature.size());
 }
 
 TEST_F(SigningOperationsTest, HmacSha512Success) {
-    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
-                                           .HmacKey(128)
-                                           .Digest(KM_DIGEST_SHA_2_512)
-                                           .Authorization(TAG_MAC_LENGTH, 64)));
+    ASSERT_EQ(KM_ERROR_OK,
+              GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_512)));
     string message = "12345678901234567890123456789012";
     string signature;
-    SignMessage(message, &signature);
+    MacMessage(message, &signature, 64);
     ASSERT_EQ(64U, signature.size());
 }
 
+TEST_F(SigningOperationsTest, HmacLengthInKey) {
+    // TODO(swillden): unified API should generate an error on key generation.
+    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
+                                           .HmacKey(128)
+                                           .Digest(KM_DIGEST_SHA_2_256)
+                                           .Authorization(TAG_MAC_LENGTH, 20)));
+    string message = "12345678901234567890123456789012";
+    string signature;
+    MacMessage(message, &signature, 30);
+    // Size in key was ignored.
+    ASSERT_EQ(30U, signature.size());
+}
+
 TEST_F(SigningOperationsTest, HmacRfc4231TestCase1) {
     uint8_t key_data[] = {
         0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
@@ -714,21 +717,18 @@
     CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
 }
 
-TEST_F(SigningOperationsTest, HmacSha256NoMacLength) {
-    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
-                                           .Authorization(TAG_ALGORITHM, KM_ALGORITHM_HMAC)
-                                           .Authorization(TAG_KEY_SIZE, 128)
-                                           .SigningKey()
-                                           .Authorization(TAG_DIGEST, KM_DIGEST_SHA_2_256)));
-    EXPECT_EQ(KM_ERROR_UNSUPPORTED_MAC_LENGTH, BeginOperation(KM_PURPOSE_SIGN));
-}
-
 TEST_F(SigningOperationsTest, HmacSha256TooLargeMacLength) {
-    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
-                                           .HmacKey(128)
-                                           .Digest(KM_DIGEST_SHA_2_256)
-                                           .Authorization(TAG_MAC_LENGTH, 33)));
-    ASSERT_EQ(KM_ERROR_UNSUPPORTED_MAC_LENGTH, BeginOperation(KM_PURPOSE_SIGN));
+    ASSERT_EQ(KM_ERROR_OK,
+              GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_256)));
+    AuthorizationSet begin_params(client_params());
+    begin_params.push_back(TAG_MAC_LENGTH, 33);
+    ASSERT_EQ(KM_ERROR_OK,
+              BeginOperation(KM_PURPOSE_SIGN, begin_params, nullptr /* output_params */));
+    string message = "1234567890123456789012345678901";
+    string result;
+    size_t input_consumed;
+    ASSERT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
+    ASSERT_EQ(KM_ERROR_UNSUPPORTED_MAC_LENGTH, FinishOperation(&result));
 }
 
 TEST_F(SigningOperationsTest, RsaTooShortMessage) {
@@ -984,57 +984,42 @@
 }
 
 TEST_F(VerificationOperationsTest, HmacSha1Success) {
-    GenerateKey(AuthorizationSetBuilder()
-                    .HmacKey(128)
-                    .Digest(KM_DIGEST_SHA1)
-                    .Authorization(TAG_MAC_LENGTH, 20));
+    GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA1));
     string message = "123456789012345678901234567890123456789012345678";
     string signature;
-    SignMessage(message, &signature);
+    MacMessage(message, &signature, 20);
     VerifyMessage(message, signature);
 }
 
 TEST_F(VerificationOperationsTest, HmacSha224Success) {
-    GenerateKey(AuthorizationSetBuilder()
-                    .HmacKey(128)
-                    .Digest(KM_DIGEST_SHA_2_224)
-                    .Authorization(TAG_MAC_LENGTH, 28));
+    GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_224));
     string message = "123456789012345678901234567890123456789012345678";
     string signature;
-    SignMessage(message, &signature);
+    MacMessage(message, &signature, 28);
     VerifyMessage(message, signature);
 }
 
 TEST_F(VerificationOperationsTest, HmacSha256Success) {
-    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
-                                           .HmacKey(128)
-                                           .Digest(KM_DIGEST_SHA_2_256)
-                                           .Authorization(TAG_MAC_LENGTH, 32)));
+    GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_256));
     string message = "123456789012345678901234567890123456789012345678";
     string signature;
-    SignMessage(message, &signature);
+    MacMessage(message, &signature, 32);
     VerifyMessage(message, signature);
 }
 
 TEST_F(VerificationOperationsTest, HmacSha384Success) {
-    GenerateKey(AuthorizationSetBuilder()
-                    .HmacKey(128)
-                    .Digest(KM_DIGEST_SHA_2_384)
-                    .Authorization(TAG_MAC_LENGTH, 48));
+    GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_384));
     string message = "123456789012345678901234567890123456789012345678";
     string signature;
-    SignMessage(message, &signature);
+    MacMessage(message, &signature, 48);
     VerifyMessage(message, signature);
 }
 
 TEST_F(VerificationOperationsTest, HmacSha512Success) {
-    GenerateKey(AuthorizationSetBuilder()
-                    .HmacKey(128)
-                    .Digest(KM_DIGEST_SHA_2_512)
-                    .Authorization(TAG_MAC_LENGTH, 64));
+    GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_512));
     string message = "123456789012345678901234567890123456789012345678";
     string signature;
-    SignMessage(message, &signature);
+    MacMessage(message, &signature, 64);
     VerifyMessage(message, signature);
 }
 
@@ -1248,7 +1233,7 @@
 
     string message = "Hello World!";
     string signature;
-    SignMessage(message, &signature);
+    MacMessage(message, &signature, 32);
     VerifyMessage(message, signature);
 }
 
@@ -1466,7 +1451,7 @@
 
     int increment = 15;
     string message(239, 'a');
-    AuthorizationSet input_params;
+    AuthorizationSet input_params(client_params());
     AuthorizationSet output_params;
     EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, input_params, &output_params));
 
@@ -1480,6 +1465,7 @@
 
     // Move TAG_NONCE into input_params
     input_params.Reinitialize(output_params);
+    input_params.push_back(client_params());
     output_params.Clear();
 
     EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_params, &output_params));
@@ -1555,7 +1541,7 @@
                                            .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
                                            .Authorization(TAG_CALLER_NONCE)));
 
-    AuthorizationSet input_params;
+    AuthorizationSet input_params(client_params());
     input_params.push_back(TAG_NONCE, "123", 3);
     EXPECT_EQ(KM_ERROR_INVALID_NONCE, BeginOperation(KM_PURPOSE_ENCRYPT, input_params));
 }
@@ -1598,7 +1584,7 @@
     EXPECT_EQ(message, plaintext);
 
     // Now specify a nonce, should also work.
-    AuthorizationSet input_params;
+    AuthorizationSet input_params(client_params());
     AuthorizationSet update_params;
     AuthorizationSet output_params;
     input_params.push_back(TAG_NONCE, "abcdefghijklmnop", 16);
@@ -1611,7 +1597,7 @@
     EXPECT_EQ(message, plaintext);
 
     // Now try with wrong nonce.
-    input_params.Clear();
+    input_params.Reinitialize(client_params());
     input_params.push_back(TAG_NONCE, "aaaaaaaaaaaaaaaa", 16);
     plaintext = ProcessMessage(KM_PURPOSE_DECRYPT, ciphertext2, input_params, update_params,
                                &output_params);
@@ -1625,7 +1611,7 @@
 
     int increment = 15;
     string message(240, 'a');
-    AuthorizationSet input_params;
+    AuthorizationSet input_params(client_params());
     AuthorizationSet output_params;
     EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, input_params, &output_params));
 
@@ -1639,6 +1625,7 @@
 
     // Move TAG_NONCE into input_params
     input_params.Reinitialize(output_params);
+    input_params.push_back(client_params());
     output_params.Clear();
 
     EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_params, &output_params));