From dec9fdc81d4f3c6a190a56a98ba2933ca1247ce3 Mon Sep 17 00:00:00 2001 From: Prashant Patil Date: Wed, 8 Dec 2021 15:25:47 +0000 Subject: [PATCH] Keymint: Test that corrupting the signature for HMAC verification fails A VTS test case to verify HMAC signature verification fails if data or signature is currupted. Bug: 209452930 Test: run vts -m VtsAidlKeyMintTargetTest Change-Id: I2177fd99cfab4ef4a347d50461db0d2e3ad8c612 --- .../aidl/vts/functional/KeyMintTest.cpp | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/security/keymint/aidl/vts/functional/KeyMintTest.cpp b/security/keymint/aidl/vts/functional/KeyMintTest.cpp index 2a7911cc36..dc14771a14 100644 --- a/security/keymint/aidl/vts/functional/KeyMintTest.cpp +++ b/security/keymint/aidl/vts/functional/KeyMintTest.cpp @@ -3151,6 +3151,58 @@ TEST_P(VerificationOperationsTest, HmacSigningKeyCannotVerify) { CheckedDeleteKey(&verification_key); } +/* + * VerificationOperationsTest.HmacVerificationFailsForCorruptSignature + * + * Verifies HMAC signature verification should fails if message or signature is corrupted. + */ +TEST_P(VerificationOperationsTest, HmacVerificationFailsForCorruptSignature) { + string key_material = "HelloThisIsAKey"; + + vector signing_key, verification_key; + vector signing_key_chars, verification_key_chars; + EXPECT_EQ(ErrorCode::OK, + ImportKey(AuthorizationSetBuilder() + .Authorization(TAG_NO_AUTH_REQUIRED) + .Authorization(TAG_ALGORITHM, Algorithm::HMAC) + .Authorization(TAG_PURPOSE, KeyPurpose::SIGN) + .Digest(Digest::SHA_2_256) + .Authorization(TAG_MIN_MAC_LENGTH, 160), + KeyFormat::RAW, key_material, &signing_key, &signing_key_chars)); + EXPECT_EQ(ErrorCode::OK, + ImportKey(AuthorizationSetBuilder() + .Authorization(TAG_NO_AUTH_REQUIRED) + .Authorization(TAG_ALGORITHM, Algorithm::HMAC) + .Authorization(TAG_PURPOSE, KeyPurpose::VERIFY) + .Digest(Digest::SHA_2_256) + .Authorization(TAG_MIN_MAC_LENGTH, 160), + KeyFormat::RAW, key_material, &verification_key, &verification_key_chars)); + + string message = "This is a message."; + string signature = SignMessage( + signing_key, message, + AuthorizationSetBuilder().Digest(Digest::SHA_2_256).Authorization(TAG_MAC_LENGTH, 160)); + + AuthorizationSet begin_out_params; + ASSERT_EQ(ErrorCode::OK, + Begin(KeyPurpose::VERIFY, verification_key, + AuthorizationSetBuilder().Digest(Digest::SHA_2_256), &begin_out_params)); + + string corruptMessage = "This is b message."; // Corrupted message + string output; + EXPECT_EQ(ErrorCode::VERIFICATION_FAILED, Finish(corruptMessage, signature, &output)); + + ASSERT_EQ(ErrorCode::OK, + Begin(KeyPurpose::VERIFY, verification_key, + AuthorizationSetBuilder().Digest(Digest::SHA_2_256), &begin_out_params)); + + signature[0] += 1; // Corrupt a signature + EXPECT_EQ(ErrorCode::VERIFICATION_FAILED, Finish(message, signature, &output)); + + CheckedDeleteKey(&signing_key); + CheckedDeleteKey(&verification_key); +} + INSTANTIATE_KEYMINT_AIDL_TEST(VerificationOperationsTest); typedef KeyMintAidlTestBase ExportKeyTest;