Add VerifyAuthorization support.

Test: VtsHalKeymasterV4_0TargetTest
Change-Id: I1f9a952ee2ad3605f67f58c9f57a46df57556f92
diff --git a/ng/AndroidKeymaster4Device.cpp b/ng/AndroidKeymaster4Device.cpp
index 141005a..c6f2925 100644
--- a/ng/AndroidKeymaster4Device.cpp
+++ b/ng/AndroidKeymaster4Device.cpp
@@ -41,17 +41,29 @@
 inline keymaster_tag_t legacy_enum_conversion(const Tag value) {
     return keymaster_tag_t(value);
 }
+
 inline Tag legacy_enum_conversion(const keymaster_tag_t value) {
     return Tag(value);
 }
+
 inline keymaster_purpose_t legacy_enum_conversion(const KeyPurpose value) {
-    return keymaster_purpose_t(value);
+    return static_cast<keymaster_purpose_t>(value);
 }
+
 inline keymaster_key_format_t legacy_enum_conversion(const KeyFormat value) {
-    return keymaster_key_format_t(value);
+    return static_cast<keymaster_key_format_t>(value);
 }
+
+inline SecurityLevel legacy_enum_conversion(const keymaster_security_level_t value) {
+    return static_cast<SecurityLevel>(value);
+}
+
+inline hw_authenticator_type_t legacy_enum_conversion(const HardwareAuthenticatorType value) {
+    return static_cast<hw_authenticator_type_t>(value);
+}
+
 inline ErrorCode legacy_enum_conversion(const keymaster_error_t value) {
-    return ErrorCode(value);
+    return static_cast<ErrorCode>(value);
 }
 
 inline keymaster_tag_type_t typeFromTag(const keymaster_tag_t tag) {
@@ -251,9 +263,32 @@
 }
 
 Return<void> AndroidKeymaster4Device::verifyAuthorization(
-    uint64_t /* challenge */, const hidl_vec<KeyParameter>& /* parametersToVerify */,
-    const HardwareAuthToken& /* authToken */, verifyAuthorization_cb _hidl_cb) {
-    _hidl_cb(ErrorCode::UNIMPLEMENTED, {});
+    uint64_t challenge, const hidl_vec<KeyParameter>& parametersToVerify,
+    const ::android::hardware::keymaster::V4_0::HardwareAuthToken& authToken,
+    verifyAuthorization_cb _hidl_cb) {
+
+    VerifyAuthorizationRequest request;
+    request.challenge = challenge;
+    request.parameters_to_verify.Reinitialize(KmParamSet(parametersToVerify));
+    request.auth_token.challenge = authToken.challenge;
+    request.auth_token.user_id = authToken.userId;
+    request.auth_token.authenticator_id = authToken.authenticatorId;
+    request.auth_token.authenticator_type = legacy_enum_conversion(authToken.authenticatorType);
+    request.auth_token.timestamp = authToken.timestamp;
+    KeymasterBlob mac(authToken.mac.data(), authToken.mac.size());
+    request.auth_token.mac = mac;
+
+    auto response = impl_->VerifyAuthorization(request);
+
+    ::android::hardware::keymaster::V4_0::VerificationToken token;
+    token.challenge = response.token.challenge;
+    token.timestamp = response.token.timestamp;
+    token.parametersVerified = kmParamSet2Hidl(response.token.parameters_verified);
+    token.securityLevel = legacy_enum_conversion(response.token.security_level);
+    token.mac = kmBlob2hidlVec(response.token.mac);
+
+    _hidl_cb(legacy_enum_conversion(response.error), token);
+
     return Void();
 }