1128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden/*
2128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden * Copyright (C) 2014 The Android Open Source Project
3128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden *
4128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden * Licensed under the Apache License, Version 2.0 (the "License");
5128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden * you may not use this file except in compliance with the License.
6128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden * You may obtain a copy of the License at
7128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden *
8128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden *      http://www.apache.org/licenses/LICENSE-2.0
9128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden *
10128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden * Unless required by applicable law or agreed to in writing, software
11128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden * distributed under the License is distributed on an "AS IS" BASIS,
12128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden * See the License for the specific language governing permissions and
14128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden * limitations under the License.
15128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden */
16128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
17f38a002624126ca837865826f948edc9100d6e8aJanis Danisevskis#include <keymaster/UniquePtr.h>
18128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
19128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden#include <gtest/gtest.h>
20128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
210cb6942d3efb6c056f96321c82a4b3d86af601d6Shawn Willden#include <keymaster/android_keymaster.h>
2213fbe3e93247943c26e7ca2ed27b6d650282b8bfShawn Willden#include <keymaster/android_keymaster_utils.h>
230cb6942d3efb6c056f96321c82a4b3d86af601d6Shawn Willden#include <keymaster/keymaster_tags.h>
2498d9b92547a9a7553b99e3e941a4175926f95b62Shawn Willden
25b6837e7a62a1192e33beef586282812239ee8b28Shawn Willden#include "android_keymaster_test_utils.h"
26128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
27128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willdennamespace keymaster {
28128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willdennamespace test {
29128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
30da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden/**
31da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden * Serialize and deserialize a message.
32da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden */
332665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willdentemplate <typename Message>
342665e868b1153cb89ad7cd906ae160cb417d4438Shawn WilldenMessage* round_trip(int32_t ver, const Message& message, size_t expected_size) {
35da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    size_t size = message.SerializedSize();
36da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(expected_size, size);
37da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    if (size == 0)
38da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden        return NULL;
39128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
40128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    UniquePtr<uint8_t[]> buf(new uint8_t[size]);
41da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(buf.get() + size, message.Serialize(buf.get(), buf.get() + size));
42128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
432665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    Message* deserialized = new Message(ver);
4458e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden    const uint8_t* p = buf.get();
45da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_TRUE(deserialized->Deserialize(&p, p + size));
46da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ((ptrdiff_t)size, p - buf.get());
47da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    return deserialized;
48da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
49da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
502665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willdenstruct EmptyKeymasterResponse : public KeymasterResponse {
5103d4b6d531eb8c2ebcb4d572a3bf118c70a83ff6Chih-Hung Hsieh    explicit EmptyKeymasterResponse(int32_t ver) : KeymasterResponse(ver) {}
52da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    size_t NonErrorSerializedSize() const { return 1; }
53da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    uint8_t* NonErrorSerialize(uint8_t* buf, const uint8_t* /* end */) const {
54da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden        *buf++ = 0;
55da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden        return buf;
56da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    }
57da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    bool NonErrorDeserialize(const uint8_t** buf_ptr, const uint8_t* end) {
58da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden        if (*buf_ptr >= end)
59da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden            return false;
60da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden        EXPECT_EQ(0, **buf_ptr);
61da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden        (*buf_ptr)++;
62da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden        return true;
63da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    }
64da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden};
65da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
66da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, EmptyKeymasterResponse) {
672665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
682665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EmptyKeymasterResponse msg(ver);
692665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.error = KM_ERROR_OK;
70da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
712665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UniquePtr<EmptyKeymasterResponse> deserialized(round_trip(ver, msg, 5));
722665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
73da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
74da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
75da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, EmptyKeymasterResponseError) {
762665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
772665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EmptyKeymasterResponse msg(ver);
782665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.error = KM_ERROR_MEMORY_ALLOCATION_FAILED;
79da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
802665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UniquePtr<EmptyKeymasterResponse> deserialized(round_trip(ver, msg, 4));
812665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
82da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
83da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
8436d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenTEST(RoundTrip, SupportedByAlgorithmRequest) {
852665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
8636d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden        SupportedByAlgorithmRequest req(ver);
8736d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden        req.algorithm = KM_ALGORITHM_EC;
882665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
8936d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden        UniquePtr<SupportedByAlgorithmRequest> deserialized(round_trip(ver, req, 4));
9036d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden        EXPECT_EQ(KM_ALGORITHM_EC, deserialized->algorithm);
9136d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden    }
9236d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden}
9336d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden
9436d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenTEST(RoundTrip, SupportedByAlgorithmAndPurposeRequest) {
9536d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
9636d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden        SupportedByAlgorithmAndPurposeRequest req(ver);
9736d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden        req.algorithm = KM_ALGORITHM_EC;
9836d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden        req.purpose = KM_PURPOSE_DECRYPT;
9936d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden
10036d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden        UniquePtr<SupportedByAlgorithmAndPurposeRequest> deserialized(round_trip(ver, req, 8));
10136d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden        EXPECT_EQ(KM_ALGORITHM_EC, deserialized->algorithm);
10236d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden        EXPECT_EQ(KM_PURPOSE_DECRYPT, deserialized->purpose);
1032665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
104128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden}
105128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
106da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, SupportedResponse) {
1072665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
1082665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        SupportedResponse<keymaster_digest_t> rsp(ver);
1092665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        keymaster_digest_t digests[] = {KM_DIGEST_NONE, KM_DIGEST_MD5, KM_DIGEST_SHA1};
1102665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        rsp.error = KM_ERROR_OK;
1112665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        rsp.SetResults(digests);
1122665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
1132665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UniquePtr<SupportedResponse<keymaster_digest_t>> deserialized(round_trip(ver, rsp, 20));
1142665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(array_length(digests), deserialized->results_length);
1152665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0, memcmp(deserialized->results, digests, array_size(digests)));
1162665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
117da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
118da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
119da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willdenstatic keymaster_key_param_t params[] = {
120ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden    Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN),
121ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden    Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
122ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden    Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA),
123ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden    Authorization(TAG_USER_ID, 7),
124eb63b9799eadcaa6ef206f8b804d7432e0dab14aShawn Willden    Authorization(TAG_USER_AUTH_TYPE, HW_AUTH_PASSWORD),
125ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden    Authorization(TAG_APPLICATION_ID, "app_id", 6),
126ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden    Authorization(TAG_AUTH_TIMEOUT, 300),
127da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden};
128128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willdenuint8_t TEST_DATA[] = "a key blob";
129128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
130da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, GenerateKeyRequest) {
1312665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
1322665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        GenerateKeyRequest req(ver);
1332665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        req.key_description.Reinitialize(params, array_length(params));
1342665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UniquePtr<GenerateKeyRequest> deserialized(round_trip(ver, req, 78));
1352665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(deserialized->key_description, req.key_description);
1362665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
137da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
138da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
139da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, GenerateKeyResponse) {
1402665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
1412665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        GenerateKeyResponse rsp(ver);
1422665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        rsp.error = KM_ERROR_OK;
1432665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        rsp.key_blob.key_material = dup_array(TEST_DATA);
1442665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        rsp.key_blob.key_material_size = array_length(TEST_DATA);
1452665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        rsp.enforced.Reinitialize(params, array_length(params));
1462665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
1472665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UniquePtr<GenerateKeyResponse> deserialized(round_trip(ver, rsp, 109));
1482665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(KM_ERROR_OK, deserialized->error);
1492665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(deserialized->enforced, rsp.enforced);
1502665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(deserialized->unenforced, rsp.unenforced);
1512665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
152da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
153128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
154da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, GenerateKeyResponseTestError) {
1552665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
1562665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        GenerateKeyResponse rsp(ver);
1572665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        rsp.error = KM_ERROR_UNSUPPORTED_ALGORITHM;
1582665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        rsp.key_blob.key_material = dup_array(TEST_DATA);
1592665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        rsp.key_blob.key_material_size = array_length(TEST_DATA);
1602665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        rsp.enforced.Reinitialize(params, array_length(params));
1612665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
1622665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UniquePtr<GenerateKeyResponse> deserialized(round_trip(ver, rsp, 4));
1632665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(KM_ERROR_UNSUPPORTED_ALGORITHM, deserialized->error);
1642665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0U, deserialized->enforced.size());
1652665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0U, deserialized->unenforced.size());
1662665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0U, deserialized->key_blob.key_material_size);
1672665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
168da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
169da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
170da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, GetKeyCharacteristicsRequest) {
1712665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
1722665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        GetKeyCharacteristicsRequest req(ver);
1732665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        req.additional_params.Reinitialize(params, array_length(params));
1742665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        req.SetKeyMaterial("foo", 3);
1752665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
1762665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UniquePtr<GetKeyCharacteristicsRequest> deserialized(round_trip(ver, req, 85));
1772665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(7U, deserialized->additional_params.size());
1782665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(3U, deserialized->key_blob.key_material_size);
1792665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0, memcmp(deserialized->key_blob.key_material, "foo", 3));
1802665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
181da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
182128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
183da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, GetKeyCharacteristicsResponse) {
1842665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
1852665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        GetKeyCharacteristicsResponse msg(ver);
1862665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.error = KM_ERROR_OK;
1872665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.enforced.Reinitialize(params, array_length(params));
1882665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.unenforced.Reinitialize(params, array_length(params));
1892665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
1902665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UniquePtr<GetKeyCharacteristicsResponse> deserialized(round_trip(ver, msg, 160));
1912665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(msg.enforced, deserialized->enforced);
1922665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(msg.unenforced, deserialized->unenforced);
1932665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
194da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
195da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
196da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, BeginOperationRequest) {
1972665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
1982665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        BeginOperationRequest msg(ver);
1992665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.purpose = KM_PURPOSE_SIGN;
2002665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.SetKeyMaterial("foo", 3);
2012665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.additional_params.Reinitialize(params, array_length(params));
2022665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
2032665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UniquePtr<BeginOperationRequest> deserialized(round_trip(ver, msg, 89));
2042665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(KM_PURPOSE_SIGN, deserialized->purpose);
2052665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(3U, deserialized->key_blob.key_material_size);
2062665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0, memcmp(deserialized->key_blob.key_material, "foo", 3));
2072665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(msg.additional_params, deserialized->additional_params);
2082665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
209da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
210da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
211da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, BeginOperationResponse) {
2122665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
2132665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        BeginOperationResponse msg(ver);
2142665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.error = KM_ERROR_OK;
2152665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.op_handle = 0xDEADBEEF;
2167b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden        msg.output_params.push_back(Authorization(TAG_NONCE, "foo", 3));
2177b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden
2187b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden        UniquePtr<BeginOperationResponse> deserialized;
2197b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden        switch (ver) {
2207b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden        case 0:
2217b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden            deserialized.reset(round_trip(ver, msg, 12));
2227b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden            break;
2237b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden        case 1:
224ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden        case 2:
2254ed2d7ed2275735ddc4952f310badfa4dcbaf04eShawn Willden        case 3:
2267b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden            deserialized.reset(round_trip(ver, msg, 39));
2277b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden            break;
2287b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden        default:
2297b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden            FAIL();
2307b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden        }
2312665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
2322665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(KM_ERROR_OK, deserialized->error);
2332665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0xDEADBEEF, deserialized->op_handle);
2347b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden
2357b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden        switch (ver) {
2367b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden        case 0:
237c609659a4b469778f523bece9ad0235fcfe6dd91Shawn Willden            EXPECT_EQ(0U, deserialized->output_params.size());
2387b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden            break;
2397b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden        case 1:
240ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden        case 2:
2414ed2d7ed2275735ddc4952f310badfa4dcbaf04eShawn Willden        case 3:
2427b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden            EXPECT_EQ(msg.output_params, deserialized->output_params);
2437b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden            break;
2447b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden        default:
2457b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden            FAIL();
2467b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden        }
2472665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
248da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
249da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
250da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, BeginOperationResponseError) {
2512665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
2522665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        BeginOperationResponse msg(ver);
2532665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.error = KM_ERROR_INVALID_OPERATION_HANDLE;
2542665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.op_handle = 0xDEADBEEF;
255da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
2562665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UniquePtr<BeginOperationResponse> deserialized(round_trip(ver, msg, 4));
2572665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, deserialized->error);
2582665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
259da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
260da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
261da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, UpdateOperationRequest) {
2622665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
2632665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UpdateOperationRequest msg(ver);
2642665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.op_handle = 0xDEADBEEF;
2652665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.input.Reinitialize("foo", 3);
2662665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
267ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden        UniquePtr<UpdateOperationRequest> deserialized;
268eb63b9799eadcaa6ef206f8b804d7432e0dab14aShawn Willden        switch (ver) {
269ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden        case 0:
270ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden            deserialized.reset(round_trip(ver, msg, 15));
271ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden            break;
272ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden        case 1:
273ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden        case 2:
2744ed2d7ed2275735ddc4952f310badfa4dcbaf04eShawn Willden        case 3:
275ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden            deserialized.reset(round_trip(ver, msg, 27));
276ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden            break;
277ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden        default:
278ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden            FAIL();
279ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden        }
2802665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(3U, deserialized->input.available_read());
2812665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0, memcmp(deserialized->input.peek_read(), "foo", 3));
2822665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
283da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
284da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
285da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, UpdateOperationResponse) {
2862665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
2872665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UpdateOperationResponse msg(ver);
2882665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.error = KM_ERROR_OK;
2892665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.output.Reinitialize("foo", 3);
290b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden        msg.input_consumed = 99;
291ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden        msg.output_params.push_back(TAG_APPLICATION_ID, "bar", 3);
292b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden
293b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden        UniquePtr<UpdateOperationResponse> deserialized;
294b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden        switch (ver) {
295b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden        case 0:
296b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden            deserialized.reset(round_trip(ver, msg, 11));
297b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden            break;
298b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden        case 1:
299b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden            deserialized.reset(round_trip(ver, msg, 15));
300b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden            break;
301ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden        case 2:
3024ed2d7ed2275735ddc4952f310badfa4dcbaf04eShawn Willden        case 3:
303ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden            deserialized.reset(round_trip(ver, msg, 42));
304ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden            break;
305b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden        default:
306b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden            FAIL();
307b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden        }
3082665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(KM_ERROR_OK, deserialized->error);
3092665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(3U, deserialized->output.available_read());
3102665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0, memcmp(deserialized->output.peek_read(), "foo", 3));
311b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden
312b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden        switch (ver) {
313b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden        case 0:
314c609659a4b469778f523bece9ad0235fcfe6dd91Shawn Willden            EXPECT_EQ(0U, deserialized->input_consumed);
315b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden            break;
316b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden        case 1:
317c609659a4b469778f523bece9ad0235fcfe6dd91Shawn Willden            EXPECT_EQ(99U, deserialized->input_consumed);
318b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden            break;
319ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden        case 2:
3204ed2d7ed2275735ddc4952f310badfa4dcbaf04eShawn Willden        case 3:
321ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden            EXPECT_EQ(99U, deserialized->input_consumed);
322ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden            EXPECT_EQ(1U, deserialized->output_params.size());
323ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden            break;
324b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden        default:
325b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden            FAIL();
326b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden        }
3272665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
328da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
329da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
330da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, FinishOperationRequest) {
3312665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
3322665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        FinishOperationRequest msg(ver);
3332665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.op_handle = 0xDEADBEEF;
3342665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.signature.Reinitialize("bar", 3);
3354ed2d7ed2275735ddc4952f310badfa4dcbaf04eShawn Willden        msg.input.Reinitialize("baz", 3);
3362665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
337ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden        UniquePtr<FinishOperationRequest> deserialized;
338eb63b9799eadcaa6ef206f8b804d7432e0dab14aShawn Willden        switch (ver) {
339ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden        case 0:
340ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden            deserialized.reset(round_trip(ver, msg, 15));
341ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden            break;
342ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden        case 1:
343ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden        case 2:
344ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden            deserialized.reset(round_trip(ver, msg, 27));
345ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden            break;
3464ed2d7ed2275735ddc4952f310badfa4dcbaf04eShawn Willden        case 3:
3474ed2d7ed2275735ddc4952f310badfa4dcbaf04eShawn Willden            deserialized.reset(round_trip(ver, msg, 34));
3484ed2d7ed2275735ddc4952f310badfa4dcbaf04eShawn Willden            break;
349ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden        default:
350ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden            FAIL();
351ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden        }
3522665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0xDEADBEEF, deserialized->op_handle);
3532665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(3U, deserialized->signature.available_read());
3542665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0, memcmp(deserialized->signature.peek_read(), "bar", 3));
3552665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
356da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
357da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
358da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(Round_Trip, FinishOperationResponse) {
3592665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
3602665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        FinishOperationResponse msg(ver);
3612665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.error = KM_ERROR_OK;
3622665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.output.Reinitialize("foo", 3);
3632665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
364ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden        UniquePtr<FinishOperationResponse> deserialized;
365ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden        switch (ver) {
366ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden        case 0:
367ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden        case 1:
368ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden            deserialized.reset(round_trip(ver, msg, 11));
369ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden            break;
370ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden        case 2:
3714ed2d7ed2275735ddc4952f310badfa4dcbaf04eShawn Willden        case 3:
372ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden            deserialized.reset(round_trip(ver, msg, 23));
373ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden            break;
374ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden        default:
375ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden            FAIL();
376ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden        }
3772665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(msg.error, deserialized->error);
3782665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(msg.output.available_read(), deserialized->output.available_read());
3792665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0, memcmp(msg.output.peek_read(), deserialized->output.peek_read(),
3802665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden                            msg.output.available_read()));
3812665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
382da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
383da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
384da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, ImportKeyRequest) {
3852665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
3862665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        ImportKeyRequest msg(ver);
3872665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.key_description.Reinitialize(params, array_length(params));
3882665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.key_format = KM_KEY_FORMAT_X509;
3892665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.SetKeyMaterial("foo", 3);
3902665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
3912665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UniquePtr<ImportKeyRequest> deserialized(round_trip(ver, msg, 89));
3922665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(msg.key_description, deserialized->key_description);
3932665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(msg.key_format, deserialized->key_format);
3942665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(msg.key_data_length, deserialized->key_data_length);
3952665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0, memcmp(msg.key_data, deserialized->key_data, msg.key_data_length));
3962665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
397da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
398da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
399da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, ImportKeyResponse) {
4002665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
4012665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        ImportKeyResponse msg(ver);
4022665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.error = KM_ERROR_OK;
4032665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.SetKeyMaterial("foo", 3);
4042665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.enforced.Reinitialize(params, array_length(params));
4052665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.unenforced.Reinitialize(params, array_length(params));
4062665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
4072665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UniquePtr<ImportKeyResponse> deserialized(round_trip(ver, msg, 167));
4082665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(msg.error, deserialized->error);
4092665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(msg.key_blob.key_material_size, deserialized->key_blob.key_material_size);
4102665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0, memcmp(msg.key_blob.key_material, deserialized->key_blob.key_material,
4112665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden                            msg.key_blob.key_material_size));
4122665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(msg.enforced, deserialized->enforced);
4132665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(msg.unenforced, deserialized->unenforced);
4142665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
415da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
416da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
417da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, ExportKeyRequest) {
4182665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
4192665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        ExportKeyRequest msg(ver);
4202665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.additional_params.Reinitialize(params, array_length(params));
4212665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.key_format = KM_KEY_FORMAT_X509;
4222665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.SetKeyMaterial("foo", 3);
4232665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
4242665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UniquePtr<ExportKeyRequest> deserialized(round_trip(ver, msg, 89));
4252665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(msg.additional_params, deserialized->additional_params);
4262665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(msg.key_format, deserialized->key_format);
4272665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(3U, deserialized->key_blob.key_material_size);
4282665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0, memcmp("foo", deserialized->key_blob.key_material, 3));
4292665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
430da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
431da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
432da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, ExportKeyResponse) {
4332665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
4342665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        ExportKeyResponse msg(ver);
4352665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.error = KM_ERROR_OK;
4362665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.SetKeyMaterial("foo", 3);
4372665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
4382665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UniquePtr<ExportKeyResponse> deserialized(round_trip(ver, msg, 11));
4392665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(3U, deserialized->key_data_length);
4402665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0, memcmp("foo", deserialized->key_data, 3));
4412665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
4422665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden}
4432665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
4442beb628bfefae72fa6bb84a6235da7e3de532823Shawn WilldenTEST(RoundTrip, DeleteKeyRequest) {
4452beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
4462beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden        DeleteKeyRequest msg(ver);
4472beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden        msg.SetKeyMaterial("foo", 3);
4482beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden
4492beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden        UniquePtr<DeleteKeyRequest> deserialized(round_trip(ver, msg, 7));
4502beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden        EXPECT_EQ(3U, deserialized->key_blob.key_material_size);
4512beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden        EXPECT_EQ(0, memcmp("foo", deserialized->key_blob.key_material, 3));
4522beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden    }
4532beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden}
4542beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden
45536d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenTEST(RoundTrip, DeleteKeyResponse) {
45636d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
45736d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden        DeleteKeyResponse msg(ver);
45836d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden        UniquePtr<DeleteKeyResponse> deserialized(round_trip(ver, msg, 4));
45936d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden    }
46036d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden}
46136d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden
46236d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenTEST(RoundTrip, DeleteAllKeysRequest) {
46336d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
46436d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden        DeleteAllKeysRequest msg(ver);
46536d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden        UniquePtr<DeleteAllKeysRequest> deserialized(round_trip(ver, msg, 0));
46636d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden    }
46736d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden}
46836d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden
46936d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenTEST(RoundTrip, DeleteAllKeysResponse) {
47036d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
47136d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden        DeleteAllKeysResponse msg(ver);
47236d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden        UniquePtr<DeleteAllKeysResponse> deserialized(round_trip(ver, msg, 4));
47336d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden    }
47436d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden}
47536d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden
4762665e868b1153cb89ad7cd906ae160cb417d4438Shawn WilldenTEST(RoundTrip, GetVersionRequest) {
4772665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    GetVersionRequest msg;
4782665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
4792665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    size_t size = msg.SerializedSize();
480c609659a4b469778f523bece9ad0235fcfe6dd91Shawn Willden    ASSERT_EQ(0U, size);
4812665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
4822665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    UniquePtr<uint8_t[]> buf(new uint8_t[size]);
4832665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    EXPECT_EQ(buf.get() + size, msg.Serialize(buf.get(), buf.get() + size));
4842665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
4852665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    GetVersionRequest deserialized;
4862665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    const uint8_t* p = buf.get();
4872665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    EXPECT_TRUE(deserialized.Deserialize(&p, p + size));
4882665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    EXPECT_EQ((ptrdiff_t)size, p - buf.get());
4892665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden}
4902665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
4912665e868b1153cb89ad7cd906ae160cb417d4438Shawn WilldenTEST(RoundTrip, GetVersionResponse) {
4922665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    GetVersionResponse msg;
493da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.error = KM_ERROR_OK;
4942665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    msg.major_ver = 9;
4952665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    msg.minor_ver = 98;
4962665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    msg.subminor_ver = 38;
4972665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
4982665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    size_t size = msg.SerializedSize();
499c609659a4b469778f523bece9ad0235fcfe6dd91Shawn Willden    ASSERT_EQ(7U, size);
500da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
5012665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    UniquePtr<uint8_t[]> buf(new uint8_t[size]);
5022665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    EXPECT_EQ(buf.get() + size, msg.Serialize(buf.get(), buf.get() + size));
5032665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
5042665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    GetVersionResponse deserialized;
5052665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    const uint8_t* p = buf.get();
5062665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    EXPECT_TRUE(deserialized.Deserialize(&p, p + size));
5072665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    EXPECT_EQ((ptrdiff_t)size, p - buf.get());
508c609659a4b469778f523bece9ad0235fcfe6dd91Shawn Willden    EXPECT_EQ(9U, msg.major_ver);
509c609659a4b469778f523bece9ad0235fcfe6dd91Shawn Willden    EXPECT_EQ(98U, msg.minor_ver);
510c609659a4b469778f523bece9ad0235fcfe6dd91Shawn Willden    EXPECT_EQ(38U, msg.subminor_ver);
511128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden}
512128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
51318d5ae3233b8e11adf2b52a086f6e4999c5733dfJocelyn BohrTEST(RoundTrip, ConfigureRequest) {
51418d5ae3233b8e11adf2b52a086f6e4999c5733dfJocelyn Bohr    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
51518d5ae3233b8e11adf2b52a086f6e4999c5733dfJocelyn Bohr        ConfigureRequest req(ver);
51618d5ae3233b8e11adf2b52a086f6e4999c5733dfJocelyn Bohr        req.os_version = 1;
51718d5ae3233b8e11adf2b52a086f6e4999c5733dfJocelyn Bohr        req.os_patchlevel = 1;
51818d5ae3233b8e11adf2b52a086f6e4999c5733dfJocelyn Bohr
51918d5ae3233b8e11adf2b52a086f6e4999c5733dfJocelyn Bohr        UniquePtr<ConfigureRequest> deserialized(round_trip(ver, req, 8));
52018d5ae3233b8e11adf2b52a086f6e4999c5733dfJocelyn Bohr        EXPECT_EQ(deserialized->os_version, req.os_version);
52118d5ae3233b8e11adf2b52a086f6e4999c5733dfJocelyn Bohr        EXPECT_EQ(deserialized->os_patchlevel, req.os_patchlevel);
52218d5ae3233b8e11adf2b52a086f6e4999c5733dfJocelyn Bohr    }
52318d5ae3233b8e11adf2b52a086f6e4999c5733dfJocelyn Bohr}
52418d5ae3233b8e11adf2b52a086f6e4999c5733dfJocelyn Bohr
52518d5ae3233b8e11adf2b52a086f6e4999c5733dfJocelyn BohrTEST(RoundTrip, ConfigureResponse) {
52618d5ae3233b8e11adf2b52a086f6e4999c5733dfJocelyn Bohr    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
52718d5ae3233b8e11adf2b52a086f6e4999c5733dfJocelyn Bohr        ConfigureResponse rsp(ver);
52818d5ae3233b8e11adf2b52a086f6e4999c5733dfJocelyn Bohr        UniquePtr<ConfigureResponse> deserialized(round_trip(ver, rsp, 4));
52918d5ae3233b8e11adf2b52a086f6e4999c5733dfJocelyn Bohr    }
53018d5ae3233b8e11adf2b52a086f6e4999c5733dfJocelyn Bohr}
53118d5ae3233b8e11adf2b52a086f6e4999c5733dfJocelyn Bohr
532cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn WilldenTEST(RoundTrip, AddEntropyRequest) {
533cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
534cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden        AddEntropyRequest msg(ver);
535cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden        msg.random_data.Reinitialize("foo", 3);
536cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden
537cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden        UniquePtr<AddEntropyRequest> deserialized(round_trip(ver, msg, 7));
538cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden        EXPECT_EQ(3U, deserialized->random_data.available_read());
539cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden        EXPECT_EQ(0, memcmp("foo", deserialized->random_data.peek_read(), 3));
540cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden    }
541cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden}
542cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden
54336d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenTEST(RoundTrip, AddEntropyResponse) {
54436d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
54536d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden        AddEntropyResponse msg(ver);
54636d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden        UniquePtr<AddEntropyResponse> deserialized(round_trip(ver, msg, 4));
54736d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden    }
54836d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden}
54936d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden
55036d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenTEST(RoundTrip, AbortOperationRequest) {
55136d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
55236d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden        AbortOperationRequest msg(ver);
55336d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden        UniquePtr<AbortOperationRequest> deserialized(round_trip(ver, msg, 8));
55436d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden    }
55536d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden}
55636d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden
55736d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenTEST(RoundTrip, AbortOperationResponse) {
55836d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
55936d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden        AbortOperationResponse msg(ver);
56036d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden        UniquePtr<AbortOperationResponse> deserialized(round_trip(ver, msg, 4));
56136d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden    }
56236d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden}
56336d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden
5643d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn WilldenTEST(RoundTrip, AttestKeyRequest) {
5653d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
5663d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden        AttestKeyRequest msg(ver);
5673d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden        msg.SetKeyMaterial("foo", 3);
5683d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden        msg.attest_params.Reinitialize(params, array_length(params));
5693d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden
5703d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden        UniquePtr<AttestKeyRequest> deserialized(round_trip(ver, msg, 85));
5713d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden        EXPECT_EQ(3U, deserialized->key_blob.key_material_size);
5723d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden        EXPECT_EQ(0, memcmp("foo", deserialized->key_blob.key_material, 3));
5733d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden        EXPECT_EQ(msg.attest_params, deserialized->attest_params);
5743d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden    }
5753d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden}
5763d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden
5773d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn WilldenTEST(RoundTrip, AttestKeyResponse) {
5783d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
5793d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden        AttestKeyResponse msg(ver);
5803d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden        msg.error = KM_ERROR_OK;
5813d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden        EXPECT_TRUE(msg.AllocateChain(3));
5823d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden        msg.certificate_chain.entries[0] = {dup_buffer("foo", 3), 3};
5833d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden        msg.certificate_chain.entries[1] = {dup_buffer("bar", 3), 3};
5843d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden        msg.certificate_chain.entries[2] = {dup_buffer("baz", 3), 3};
5853d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden
5863d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden        UniquePtr<AttestKeyResponse> deserialized(round_trip(ver, msg, 29));
5873d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden        keymaster_cert_chain_t* chain = &deserialized->certificate_chain;
5883d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden
5893d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden        EXPECT_NE(nullptr, chain->entries);
5903d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden        EXPECT_EQ(3U, chain->entry_count);
5913d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden        EXPECT_EQ(3U, chain->entries[0].data_length);
5923d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden        EXPECT_EQ(0, memcmp("foo", chain->entries[0].data, 3));
5933d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden        EXPECT_EQ(3U, chain->entries[1].data_length);
5943d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden        EXPECT_EQ(0, memcmp("bar", chain->entries[1].data, 3));
5953d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden        EXPECT_EQ(3U, chain->entries[2].data_length);
5963d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden        EXPECT_EQ(0, memcmp("baz", chain->entries[2].data, 3));
5973d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden    }
5983d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden}
5993d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden
600c636e187cb4cb6c5b07fab9bb5d27878690376deShawn WilldenTEST(RoundTrip, UpgradeKeyRequest) {
601c636e187cb4cb6c5b07fab9bb5d27878690376deShawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
602c636e187cb4cb6c5b07fab9bb5d27878690376deShawn Willden        UpgradeKeyRequest msg(ver);
603c636e187cb4cb6c5b07fab9bb5d27878690376deShawn Willden        msg.SetKeyMaterial("foo", 3);
604c636e187cb4cb6c5b07fab9bb5d27878690376deShawn Willden        msg.upgrade_params.Reinitialize(params, array_length(params));
605c636e187cb4cb6c5b07fab9bb5d27878690376deShawn Willden
606c636e187cb4cb6c5b07fab9bb5d27878690376deShawn Willden        UniquePtr<UpgradeKeyRequest> deserialized(round_trip(ver, msg, 85));
607c636e187cb4cb6c5b07fab9bb5d27878690376deShawn Willden        EXPECT_EQ(3U, deserialized->key_blob.key_material_size);
608c636e187cb4cb6c5b07fab9bb5d27878690376deShawn Willden        EXPECT_EQ(0, memcmp("foo", deserialized->key_blob.key_material, 3));
609c636e187cb4cb6c5b07fab9bb5d27878690376deShawn Willden        EXPECT_EQ(msg.upgrade_params, deserialized->upgrade_params);
610c636e187cb4cb6c5b07fab9bb5d27878690376deShawn Willden    }
611c636e187cb4cb6c5b07fab9bb5d27878690376deShawn Willden}
612c636e187cb4cb6c5b07fab9bb5d27878690376deShawn Willden
613c636e187cb4cb6c5b07fab9bb5d27878690376deShawn WilldenTEST(RoundTrip, UpgradeKeyResponse) {
614c636e187cb4cb6c5b07fab9bb5d27878690376deShawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
615c636e187cb4cb6c5b07fab9bb5d27878690376deShawn Willden        UpgradeKeyResponse req(ver);
616c636e187cb4cb6c5b07fab9bb5d27878690376deShawn Willden        req.error = KM_ERROR_OK;
617c636e187cb4cb6c5b07fab9bb5d27878690376deShawn Willden        req.upgraded_key.key_material = dup_array(TEST_DATA);
618c636e187cb4cb6c5b07fab9bb5d27878690376deShawn Willden        req.upgraded_key.key_material_size = array_length(TEST_DATA);
619c636e187cb4cb6c5b07fab9bb5d27878690376deShawn Willden
620c636e187cb4cb6c5b07fab9bb5d27878690376deShawn Willden        UniquePtr<UpgradeKeyResponse> deserialized(round_trip(ver, req, 19));
621c636e187cb4cb6c5b07fab9bb5d27878690376deShawn Willden        EXPECT_EQ(KM_ERROR_OK, deserialized->error);
622c636e187cb4cb6c5b07fab9bb5d27878690376deShawn Willden        EXPECT_EQ(req.upgraded_key.key_material_size, deserialized->upgraded_key.key_material_size);
623c636e187cb4cb6c5b07fab9bb5d27878690376deShawn Willden        EXPECT_EQ(0, memcmp(req.upgraded_key.key_material, deserialized->upgraded_key.key_material,
624c636e187cb4cb6c5b07fab9bb5d27878690376deShawn Willden                            req.upgraded_key.key_material_size));
625c636e187cb4cb6c5b07fab9bb5d27878690376deShawn Willden    }
626c636e187cb4cb6c5b07fab9bb5d27878690376deShawn Willden}
627c636e187cb4cb6c5b07fab9bb5d27878690376deShawn Willden
628f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willdenuint8_t msgbuf[] = {
629f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    220, 88,  183, 255, 71,  1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
630f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    0,   173, 0,   0,   0,   228, 174, 98,  187, 191, 135, 253, 200, 51,  230, 114, 247, 151, 109,
631f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    237, 79,  87,  32,  94,  5,   204, 46,  154, 30,  91,  6,   103, 148, 254, 129, 65,  171, 228,
632f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    167, 224, 163, 9,   15,  206, 90,  58,  11,  205, 55,  211, 33,  87,  178, 149, 91,  28,  236,
633f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    218, 112, 231, 34,  82,  82,  134, 103, 137, 115, 27,  156, 102, 159, 220, 226, 89,  42,  25,
634f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    37,  9,   84,  239, 76,  161, 198, 72,  167, 163, 39,  91,  148, 191, 17,  191, 87,  169, 179,
635f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    136, 10,  194, 154, 4,   40,  107, 109, 61,  161, 20,  176, 247, 13,  214, 106, 229, 45,  17,
636f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    5,   60,  189, 64,  39,  166, 208, 14,  57,  25,  140, 148, 25,  177, 246, 189, 43,  181, 88,
637f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    204, 29,  126, 224, 100, 143, 93,  60,  57,  249, 55,  0,   87,  83,  227, 224, 166, 59,  214,
638f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    81,  144, 129, 58,  6,   57,  46,  254, 232, 41,  220, 209, 230, 167, 138, 158, 94,  180, 125,
639f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    247, 26,  162, 116, 238, 202, 187, 100, 65,  13,  180, 44,  245, 159, 83,  161, 176, 58,  72,
640f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    236, 109, 105, 160, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
641f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    0,   11,  0,   0,   0,   98,  0,   0,   0,   1,   0,   0,   32,  2,   0,   0,   0,   1,   0,
642f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    0,   32,  3,   0,   0,   0,   2,   0,   0,   16,  1,   0,   0,   0,   3,   0,   0,   48,  0,
643f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    1,   0,   0,   200, 0,   0,   80,  3,   0,   0,   0,   0,   0,   0,   0,   244, 1,   0,   112,
644f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    1,   246, 1,   0,   112, 1,   189, 2,   0,   96,  144, 178, 236, 250, 255, 255, 255, 255, 145,
645f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    1,   0,   96,  144, 226, 33,  60,  222, 2,   0,   0,   189, 2,   0,   96,  0,   0,   0,   0,
646f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    0,   0,   0,   0,   190, 2,   0,   16,  1,   0,   0,   0,   12,  0,   0,   0,   0,   0,   0,
647f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    0,   0,   0,   0,   0,   0,   0,   0,   0,   110, 0,   0,   0,   0,   0,   0,   0,   11,  0,
648f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    0,   0,   98,  0,   0,   0,   1,   0,   0,   32,  2,   0,   0,   0,   1,   0,   0,   32,  3,
649f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    0,   0,   0,   2,   0,   0,   16,  1,   0,   0,   0,   3,   0,   0,   48,  0,   1,   0,   0,
650f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    200, 0,   0,   80,  3,   0,   0,   0,   0,   0,   0,   0,   244, 1,   0,   112, 1,   246, 1,
651f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    0,   112, 1,   189, 2,   0,   96,  144, 178, 236, 250, 255, 255, 255, 255, 145, 1,   0,   96,
652f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    144, 226, 33,  60,  222, 2,   0,   0,   189, 2,   0,   96,  0,   0,   0,   0,   0,   0,   0,
653f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    0,   190, 2,   0,   16,  1,   0,   0,   0,
654f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden};
655f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden
656f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden/*
657f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden * These tests don't have any assertions or expectations. They just try to parse garbage, to see if
658f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden * the result will be a crash.  This is especially informative when run under Valgrind memcheck.
659f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden */
660f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden
661f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willdentemplate <typename Message> void parse_garbage() {
6622665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int32_t ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
6632665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        Message msg(ver);
6642665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        const uint8_t* end = msgbuf + array_length(msgbuf);
6652665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        for (size_t i = 0; i < array_length(msgbuf); ++i) {
6662665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden            const uint8_t* begin = msgbuf + i;
6672665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden            const uint8_t* p = begin;
6682665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden            msg.Deserialize(&p, end);
6692665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        }
670f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    }
6710f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden
6720f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden    time_t now = time(NULL);
6730f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden    std::cout << "Seeding rand() with " << now << " for fuzz test." << std::endl;
6740f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden    srand(now);
6750f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden
6760f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden    // Fill large buffer with random bytes.
6770f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden    const int kBufSize = 10000;
6780f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden    UniquePtr<uint8_t[]> buf(new uint8_t[kBufSize]);
6790f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden    for (size_t i = 0; i < kBufSize; ++i)
6800f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden        buf[i] = static_cast<uint8_t>(rand());
6810f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden
6820f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden    for (uint32_t ver = 0; ver < MAX_MESSAGE_VERSION; ++ver) {
6830f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden        Message msg(ver);
6840f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden        const uint8_t* end = buf.get() + kBufSize;
6850f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden        for (size_t i = 0; i < kBufSize; ++i) {
6860f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden            const uint8_t* begin = buf.get() + i;
6870f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden            const uint8_t* p = begin;
6880f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden            msg.Deserialize(&p, end);
6890f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden        }
6900f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden    }
691f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden}
692f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden
693f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden#define GARBAGE_TEST(Message)                                                                      \
694f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    TEST(GarbageTest, Message) { parse_garbage<Message>(); }
695f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden
69636d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(AbortOperationRequest);
69736d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(AbortOperationResponse);
69836d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(AddEntropyRequest);
69936d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(AddEntropyResponse);
700f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(BeginOperationRequest);
701f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(BeginOperationResponse);
70236d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(DeleteAllKeysRequest);
70336d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(DeleteAllKeysResponse);
70436d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(DeleteKeyRequest);
70536d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(DeleteKeyResponse);
70636d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(ExportKeyRequest);
70736d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(ExportKeyResponse);
708f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(FinishOperationRequest);
709f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(FinishOperationResponse);
71036d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(GenerateKeyRequest);
71136d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(GenerateKeyResponse);
71236d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(GetKeyCharacteristicsRequest);
71336d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(GetKeyCharacteristicsResponse);
714f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(ImportKeyRequest);
715f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(ImportKeyResponse);
71636d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(SupportedByAlgorithmAndPurposeRequest)
71736d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(SupportedByAlgorithmRequest)
71836d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(UpdateOperationRequest);
71936d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(UpdateOperationResponse);
7203d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn WilldenGARBAGE_TEST(AttestKeyRequest);
7213d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn WilldenGARBAGE_TEST(AttestKeyResponse);
722c636e187cb4cb6c5b07fab9bb5d27878690376deShawn WilldenGARBAGE_TEST(UpgradeKeyRequest);
723c636e187cb4cb6c5b07fab9bb5d27878690376deShawn WilldenGARBAGE_TEST(UpgradeKeyResponse);
724f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden
725f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden// The macro doesn't work on this one.
726f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenTEST(GarbageTest, SupportedResponse) {
727f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    parse_garbage<SupportedResponse<keymaster_digest_t>>();
728f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden}
729f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden
730128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden}  // namespace test
7312665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
732128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden}  // namespace keymaster
733