Factor key blob management code out of message implementations

Change-Id: Idc40287c98e1e7c063958697ba8a305f7bc917d9
diff --git a/google_keymaster_messages.cpp b/google_keymaster_messages.cpp
index 2bc6f73..5e8f63b 100644
--- a/google_keymaster_messages.cpp
+++ b/google_keymaster_messages.cpp
@@ -19,6 +19,37 @@
 
 namespace keymaster {
 
+/*
+ * Helper functions for working with key blobs.
+ */
+
+static void set_key_blob(keymaster_key_blob_t* key_blob, const void* key_material, size_t length) {
+    delete[] key_blob->key_material;
+    key_blob->key_material = dup_buffer(key_material, length);
+    key_blob->key_material_size = length;
+}
+
+static size_t key_blob_size(const keymaster_key_blob_t& key_blob) {
+    return sizeof(uint32_t) /* key size */ + key_blob.key_material_size;
+}
+
+static uint8_t* serialize_key_blob(const keymaster_key_blob_t& key_blob, uint8_t* buf,
+                                   const uint8_t* end) {
+    return append_size_and_data_to_buf(buf, end, key_blob.key_material, key_blob.key_material_size);
+}
+
+static bool deserialize_key_blob(keymaster_key_blob_t* key_blob, const uint8_t** buf_ptr,
+                                 const uint8_t* end) {
+    delete[] key_blob->key_material;
+    key_blob->key_material = 0;
+    UniquePtr<uint8_t[]> deserialized_key_material;
+    if (!copy_size_and_data_from_buf(buf_ptr, end, &key_blob->key_material_size,
+                                     &deserialized_key_material))
+        return false;
+    key_blob->key_material = deserialized_key_material.release();
+    return true;
+}
+
 size_t KeymasterResponse::SerializedSize() const {
     if (error != KM_ERROR_OK)
         return sizeof(int32_t);
@@ -64,26 +95,18 @@
 }
 
 size_t GenerateKeyResponse::NonErrorSerializedSize() const {
-    return sizeof(uint32_t) /* key size */ + key_blob.key_material_size +
-           enforced.SerializedSize() + unenforced.SerializedSize();
+    return key_blob_size(key_blob) + enforced.SerializedSize() + unenforced.SerializedSize();
 }
 
 uint8_t* GenerateKeyResponse::NonErrorSerialize(uint8_t* buf, const uint8_t* end) const {
-    buf = append_size_and_data_to_buf(buf, end, key_blob.key_material, key_blob.key_material_size);
+    buf = serialize_key_blob(key_blob, buf, end);
     buf = enforced.Serialize(buf, end);
     return unenforced.Serialize(buf, end);
 }
 
 bool GenerateKeyResponse::NonErrorDeserialize(const uint8_t** buf_ptr, const uint8_t* end) {
-    delete[] key_blob.key_material;
-    key_blob.key_material = NULL;
-    UniquePtr<uint8_t[]> deserialized_key_material;
-    if (!copy_size_and_data_from_buf(buf_ptr, end, &key_blob.key_material_size,
-                                     &deserialized_key_material) ||
-        !enforced.Deserialize(buf_ptr, end) || !unenforced.Deserialize(buf_ptr, end))
-        return false;
-    key_blob.key_material = deserialized_key_material.release();
-    return true;
+    return deserialize_key_blob(&key_blob, buf_ptr, end) && enforced.Deserialize(buf_ptr, end) &&
+           unenforced.Deserialize(buf_ptr, end);
 }
 
 GetKeyCharacteristicsRequest::~GetKeyCharacteristicsRequest() {
@@ -91,31 +114,21 @@
 }
 
 void GetKeyCharacteristicsRequest::SetKeyMaterial(const void* key_material, size_t length) {
-    delete[] key_blob.key_material;
-    key_blob.key_material = dup_buffer(key_material, length);
-    key_blob.key_material_size = length;
+    set_key_blob(&key_blob, key_material, length);
 }
 
 size_t GetKeyCharacteristicsRequest::SerializedSize() const {
-    return sizeof(uint32_t) /* key blob size */ + key_blob.key_material_size +
-           additional_params.SerializedSize();
+    return key_blob_size(key_blob) + additional_params.SerializedSize();
 }
 
 uint8_t* GetKeyCharacteristicsRequest::Serialize(uint8_t* buf, const uint8_t* end) const {
-    buf = append_size_and_data_to_buf(buf, end, key_blob.key_material, key_blob.key_material_size);
+    buf = serialize_key_blob(key_blob, buf, end);
     return additional_params.Serialize(buf, end);
 }
 
 bool GetKeyCharacteristicsRequest::Deserialize(const uint8_t** buf_ptr, const uint8_t* end) {
-    delete[] key_blob.key_material;
-    key_blob.key_material = NULL;
-    UniquePtr<uint8_t[]> deserialized_key_material;
-    if (!copy_size_and_data_from_buf(buf_ptr, end, &key_blob.key_material_size,
-                                     &deserialized_key_material) ||
-        !additional_params.Deserialize(buf_ptr, end))
-        return false;
-    key_blob.key_material = deserialized_key_material.release();
-    return true;
+    return deserialize_key_blob(&key_blob, buf_ptr, end) &&
+           additional_params.Deserialize(buf_ptr, end);
 }
 
 size_t GetKeyCharacteristicsResponse::NonErrorSerializedSize() const {
@@ -133,33 +146,24 @@
 }
 
 void BeginOperationRequest::SetKeyMaterial(const void* key_material, size_t length) {
-    delete[] key_blob.key_material;
-    key_blob.key_material = dup_buffer(key_material, length);
-    key_blob.key_material_size = length;
+    set_key_blob(&key_blob, key_material, length);
 }
 
 size_t BeginOperationRequest::SerializedSize() const {
-    return sizeof(uint32_t) /* purpose */ + sizeof(uint32_t) /* key length */ +
-           key_blob.key_material_size + additional_params.SerializedSize();
+    return sizeof(uint32_t) /* purpose */ + key_blob_size(key_blob) +
+           additional_params.SerializedSize();
 }
 
 uint8_t* BeginOperationRequest::Serialize(uint8_t* buf, const uint8_t* end) const {
     buf = append_uint32_to_buf(buf, end, purpose);
-    buf = append_size_and_data_to_buf(buf, end, key_blob.key_material, key_blob.key_material_size);
+    buf = serialize_key_blob(key_blob, buf, end);
     return additional_params.Serialize(buf, end);
 }
 
 bool BeginOperationRequest::Deserialize(const uint8_t** buf_ptr, const uint8_t* end) {
-    delete[] key_blob.key_material;
-    key_blob.key_material = 0;
-    UniquePtr<uint8_t[]> deserialized_key_material;
-    if (!copy_uint32_from_buf(buf_ptr, end, &purpose) ||
-        !copy_size_and_data_from_buf(buf_ptr, end, &key_blob.key_material_size,
-                                     &deserialized_key_material) ||
-        !additional_params.Deserialize(buf_ptr, end))
-        return false;
-    key_blob.key_material = deserialized_key_material.release();
-    return true;
+    return copy_uint32_from_buf(buf_ptr, end, &purpose) &&
+           deserialize_key_blob(&key_blob, buf_ptr, end) &&
+           additional_params.Deserialize(buf_ptr, end);
 }
 
 size_t BeginOperationResponse::NonErrorSerializedSize() const {
@@ -303,62 +307,43 @@
 }
 
 void ImportKeyResponse::SetKeyMaterial(const void* key_material, size_t length) {
-    delete[] key_blob.key_material;
-    key_blob.key_material = dup_buffer(key_material, length);
-    key_blob.key_material_size = length;
+    set_key_blob(&key_blob, key_material, length);
 }
 
 size_t ImportKeyResponse::NonErrorSerializedSize() const {
-    return sizeof(uint32_t) /* key_material length */ + key_blob.key_material_size +
-           enforced.SerializedSize() + unenforced.SerializedSize();
+    return key_blob_size(key_blob) + enforced.SerializedSize() + unenforced.SerializedSize();
 }
 
 uint8_t* ImportKeyResponse::NonErrorSerialize(uint8_t* buf, const uint8_t* end) const {
-    buf = append_size_and_data_to_buf(buf, end, key_blob.key_material, key_blob.key_material_size);
+    buf = serialize_key_blob(key_blob, buf, end);
     buf = enforced.Serialize(buf, end);
     return unenforced.Serialize(buf, end);
 }
 
 bool ImportKeyResponse::NonErrorDeserialize(const uint8_t** buf_ptr, const uint8_t* end) {
-    delete[] key_blob.key_material;
-    key_blob.key_material = NULL;
-    UniquePtr<uint8_t[]> deserialized_key_material;
-    if (!copy_size_and_data_from_buf(buf_ptr, end, &key_blob.key_material_size,
-                                     &deserialized_key_material) ||
-        !enforced.Deserialize(buf_ptr, end) || !unenforced.Deserialize(buf_ptr, end))
-        return false;
-    key_blob.key_material = deserialized_key_material.release();
-    return true;
+    return deserialize_key_blob(&key_blob, buf_ptr, end) && enforced.Deserialize(buf_ptr, end) &&
+           unenforced.Deserialize(buf_ptr, end);
 }
 
 void ExportKeyRequest::SetKeyMaterial(const void* key_material, size_t length) {
-    delete[] key_blob.key_material;
-    key_blob.key_material = dup_buffer(key_material, length);
-    key_blob.key_material_size = length;
+    set_key_blob(&key_blob, key_material, length);
 }
 
 size_t ExportKeyRequest::SerializedSize() const {
     return additional_params.SerializedSize() + sizeof(uint32_t) /* key_format */ +
-           sizeof(uint32_t) /* key_material_size */ + key_blob.key_material_size;
+           key_blob_size(key_blob);
 }
 
 uint8_t* ExportKeyRequest::Serialize(uint8_t* buf, const uint8_t* end) const {
     buf = additional_params.Serialize(buf, end);
     buf = append_uint32_to_buf(buf, end, key_format);
-    return append_size_and_data_to_buf(buf, end, key_blob.key_material, key_blob.key_material_size);
+    return serialize_key_blob(key_blob, buf, end);
 }
 
 bool ExportKeyRequest::Deserialize(const uint8_t** buf_ptr, const uint8_t* end) {
-    delete[] key_blob.key_material;
-    key_blob.key_material = NULL;
-    UniquePtr<uint8_t[]> deserialized_key_material;
-    if (!additional_params.Deserialize(buf_ptr, end) ||
-        !copy_uint32_from_buf(buf_ptr, end, &key_format) ||
-        !copy_size_and_data_from_buf(buf_ptr, end, &key_blob.key_material_size,
-                                     &deserialized_key_material))
-        return false;
-    key_blob.key_material = deserialized_key_material.release();
-    return true;
+    return additional_params.Deserialize(buf_ptr, end) &&
+           copy_uint32_from_buf(buf_ptr, end, &key_format) &&
+           deserialize_key_blob(&key_blob, buf_ptr, end);
 }
 
 void ExportKeyResponse::SetKeyMaterial(const void* key_material, size_t length) {