AndroidKeymaster: ImportWrappedKey

•Add KM_PURPOSE_WRAP for wrapped key import
•Parse the wrapped key format

Test: tests/android_keymaster_test

Change-Id: I06b61128ff72b119747cfce9cab754b22a13ec00
diff --git a/ng/AndroidKeymaster4Device.cpp b/ng/AndroidKeymaster4Device.cpp
index 9801ea4..141005a 100644
--- a/ng/AndroidKeymaster4Device.cpp
+++ b/ng/AndroidKeymaster4Device.cpp
@@ -331,11 +331,28 @@
     return Void();
 }
 
-Return<void> AndroidKeymaster4Device::importWrappedKey(
-    const hidl_vec<uint8_t>& /* wrappedKeyData */, const hidl_vec<uint8_t>& /* wrappingKeyBlob */,
-    const hidl_vec<uint8_t>& /* maskingKey */, importWrappedKey_cb _hidl_cb) {
-    // TODO(franksalim): PUT CODE HERE
-    _hidl_cb(ErrorCode::UNIMPLEMENTED, hidl_vec<uint8_t>(), KeyCharacteristics());
+Return<void> AndroidKeymaster4Device::importWrappedKey(const hidl_vec<uint8_t>& wrappedKeyData,
+                                                       const hidl_vec<uint8_t>& wrappingKeyBlob,
+                                                       const hidl_vec<uint8_t>& maskingKey,
+                                                       importWrappedKey_cb _hidl_cb) {
+
+    ImportWrappedKeyRequest request;
+    request.SetWrappedMaterial(wrappedKeyData.data(), wrappedKeyData.size());
+    request.SetWrappingMaterial(wrappingKeyBlob.data(), wrappingKeyBlob.size());
+    request.SetMaskingKeyMaterial(maskingKey.data(), maskingKey.size());
+    // TODO(franksalim): set request.additional_params when wrapping key params are allowed
+
+    ImportWrappedKeyResponse response;
+    impl_->ImportWrappedKey(request, &response);
+
+    KeyCharacteristics resultCharacteristics;
+    hidl_vec<uint8_t> resultKeyBlob;
+    if (response.error == KM_ERROR_OK) {
+        resultKeyBlob = kmBlob2hidlVec(response.key_blob);
+        resultCharacteristics.hardwareEnforced = kmParamSet2Hidl(response.enforced);
+        resultCharacteristics.softwareEnforced = kmParamSet2Hidl(response.unenforced);
+    }
+    _hidl_cb(legacy_enum_conversion(response.error), resultKeyBlob, resultCharacteristics);
     return Void();
 }