Handle AES CBC IVs via input/output params.
Change-Id: Idd98103943e661e0940f274c3b3342192d211438
diff --git a/google_keymaster_test.cpp b/google_keymaster_test.cpp
index 73b1fae..6fc5b0b 100644
--- a/google_keymaster_test.cpp
+++ b/google_keymaster_test.cpp
@@ -2295,16 +2295,19 @@
KM_MODE_CBC)));
// Two-block message.
string message = "12345678901234567890123456789012";
- string ciphertext1 = EncryptMessage(message);
- EXPECT_EQ(message.size() + 16, ciphertext1.size());
+ string iv1;
+ string ciphertext1 = EncryptMessage(message, &iv1);
+ EXPECT_EQ(message.size(), ciphertext1.size());
- string ciphertext2 = EncryptMessage(string(message));
- EXPECT_EQ(message.size() + 16, ciphertext2.size());
+ string iv2;
+ string ciphertext2 = EncryptMessage(message, &iv2);
+ EXPECT_EQ(message.size(), ciphertext2.size());
- // CBC uses random IVs, so ciphertexts shouldn't match.
+ // IVs should be random, so ciphertexts should differ.
+ EXPECT_NE(iv1, iv2);
EXPECT_NE(ciphertext1, ciphertext2);
- string plaintext = DecryptMessage(ciphertext1);
+ string plaintext = DecryptMessage(ciphertext1, iv1);
EXPECT_EQ(message, plaintext);
}
@@ -2314,22 +2317,29 @@
int increment = 15;
string message(240, 'a');
- EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT));
+ AuthorizationSet input_params;
+ AuthorizationSet output_params;
+ EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, input_params, &output_params));
+
string ciphertext;
size_t input_consumed;
for (size_t i = 0; i < message.size(); i += increment)
EXPECT_EQ(KM_ERROR_OK,
UpdateOperation(message.substr(i, increment), &ciphertext, &input_consumed));
EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
- EXPECT_EQ(message.size() + 16, ciphertext.size());
+ EXPECT_EQ(message.size(), ciphertext.size());
- EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT));
+ // Move TAG_NONCE into input_params
+ input_params.Reinitialize(output_params);
+ output_params.Clear();
+
+ EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_params, &output_params));
string plaintext;
for (size_t i = 0; i < ciphertext.size(); i += increment)
EXPECT_EQ(KM_ERROR_OK,
UpdateOperation(ciphertext.substr(i, increment), &plaintext, &input_consumed));
EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext));
- EXPECT_EQ(ciphertext.size() - 16, plaintext.size());
+ EXPECT_EQ(ciphertext.size(), plaintext.size());
EXPECT_EQ(message, plaintext);
}
@@ -2342,9 +2352,10 @@
// Try various message lengths; all should work.
for (int i = 0; i < 32; ++i) {
string message(i, 'a');
- string ciphertext = EncryptMessage(message);
- EXPECT_EQ(i + 32 - (i % 16), ciphertext.size());
- string plaintext = DecryptMessage(ciphertext);
+ string iv;
+ string ciphertext = EncryptMessage(message, &iv);
+ EXPECT_EQ(i + 16 - (i % 16), ciphertext.size());
+ string plaintext = DecryptMessage(ciphertext, iv);
EXPECT_EQ(message, plaintext);
}
}