Match message_version to AndroidKeymaster version.

Explicitly set the message version used when encoding and decoding
keymaster messages to match the version appropriate to the API version
indicated by AndroidKeymaster. Message version mismatch can otherwise
lead to decoding errors if the default MAX_MESSAGE_VERSION doesn't
match AndroidKeymaster's advertised version.

Change-Id: I318bf09bc88cb99a4cc24e8106975d9deff1aa31
diff --git a/ipc/keymaster_ipc.cpp b/ipc/keymaster_ipc.cpp
index fbdda2b..63d0e13 100644
--- a/ipc/keymaster_ipc.cpp
+++ b/ipc/keymaster_ipc.cpp
@@ -72,6 +72,7 @@
 static void keymaster_chan_handler(const uevent_t* ev, void* priv);
 
 TrustyKeymaster* device;
+int32_t message_version = -1;
 
 class MessageDeleter {
   public:
@@ -125,10 +126,12 @@
                         UniquePtr<uint8_t[]>* out, uint32_t* out_size) {
     const uint8_t* payload = msg->payload;
     Request req;
+    req.message_version = message_version;
     if (!req.Deserialize(&payload, msg->payload + payload_size))
         return ERR_NOT_VALID;
 
     Response rsp;
+    rsp.message_version = message_version;
     (device->*operation)(req, &rsp);
 
     *out_size = rsp.SerializedSize();
@@ -487,6 +490,17 @@
 
     LOG_I("Initializing", 0);
 
+    GetVersionRequest request;
+    GetVersionResponse response;
+    device->GetVersion(request, &response);
+    if (response.error == KM_ERROR_OK) {
+      message_version = MessageVersion(
+          response.major_ver, response.minor_ver, response.subminor_ver);
+    } else {
+      LOG_E("Error %d determining AndroidKeymaster version.", response.error);
+      return ERR_GENERIC;
+    }
+
     keymaster_srv_ctx ctx;
     rc = keymaster_ipc_init(&ctx);
     if (rc < 0) {