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
17128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden#include <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 {
512665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    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
513cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn WilldenTEST(RoundTrip, AddEntropyRequest) {
514cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
515cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden        AddEntropyRequest msg(ver);
516cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden        msg.random_data.Reinitialize("foo", 3);
517cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden
518cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden        UniquePtr<AddEntropyRequest> deserialized(round_trip(ver, msg, 7));
519cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden        EXPECT_EQ(3U, deserialized->random_data.available_read());
520cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden        EXPECT_EQ(0, memcmp("foo", deserialized->random_data.peek_read(), 3));
521cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden    }
522cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden}
523cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden
52436d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenTEST(RoundTrip, AddEntropyResponse) {
52536d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
52636d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden        AddEntropyResponse msg(ver);
52736d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden        UniquePtr<AddEntropyResponse> deserialized(round_trip(ver, msg, 4));
52836d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden    }
52936d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden}
53036d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden
53136d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenTEST(RoundTrip, AbortOperationRequest) {
53236d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
53336d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden        AbortOperationRequest msg(ver);
53436d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden        UniquePtr<AbortOperationRequest> deserialized(round_trip(ver, msg, 8));
53536d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden    }
53636d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden}
53736d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden
53836d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenTEST(RoundTrip, AbortOperationResponse) {
53936d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
54036d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden        AbortOperationResponse msg(ver);
54136d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden        UniquePtr<AbortOperationResponse> deserialized(round_trip(ver, msg, 4));
54236d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden    }
54336d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden}
54436d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden
5453d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn WilldenTEST(RoundTrip, AttestKeyRequest) {
5463d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
5473d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden        AttestKeyRequest msg(ver);
5483d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden        msg.SetKeyMaterial("foo", 3);
5493d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden        msg.attest_params.Reinitialize(params, array_length(params));
5503d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden
5513d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden        UniquePtr<AttestKeyRequest> deserialized(round_trip(ver, msg, 85));
5523d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden        EXPECT_EQ(3U, deserialized->key_blob.key_material_size);
5533d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden        EXPECT_EQ(0, memcmp("foo", deserialized->key_blob.key_material, 3));
5543d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden        EXPECT_EQ(msg.attest_params, deserialized->attest_params);
5553d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden    }
5563d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden}
5573d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden
5583d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn WilldenTEST(RoundTrip, AttestKeyResponse) {
5593d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
5603d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden        AttestKeyResponse msg(ver);
5613d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden        msg.error = KM_ERROR_OK;
5623d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden        EXPECT_TRUE(msg.AllocateChain(3));
5633d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden        msg.certificate_chain.entries[0] = {dup_buffer("foo", 3), 3};
5643d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden        msg.certificate_chain.entries[1] = {dup_buffer("bar", 3), 3};
5653d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden        msg.certificate_chain.entries[2] = {dup_buffer("baz", 3), 3};
5663d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden
5673d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden        UniquePtr<AttestKeyResponse> deserialized(round_trip(ver, msg, 29));
5683d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden        keymaster_cert_chain_t* chain = &deserialized->certificate_chain;
5693d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden
5703d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden        EXPECT_NE(nullptr, chain->entries);
5713d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden        EXPECT_EQ(3U, chain->entry_count);
5723d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden        EXPECT_EQ(3U, chain->entries[0].data_length);
5733d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden        EXPECT_EQ(0, memcmp("foo", chain->entries[0].data, 3));
5743d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden        EXPECT_EQ(3U, chain->entries[1].data_length);
5753d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden        EXPECT_EQ(0, memcmp("bar", chain->entries[1].data, 3));
5763d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden        EXPECT_EQ(3U, chain->entries[2].data_length);
5773d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden        EXPECT_EQ(0, memcmp("baz", chain->entries[2].data, 3));
5783d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden    }
5793d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden}
5803d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden
581c15af1910d8f451341d0068b5533816ace5defecShawn WilldenTEST(RoundTrip, UpgradeKeyRequest) {
582c15af1910d8f451341d0068b5533816ace5defecShawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
583c15af1910d8f451341d0068b5533816ace5defecShawn Willden        UpgradeKeyRequest msg(ver);
584c15af1910d8f451341d0068b5533816ace5defecShawn Willden        msg.SetKeyMaterial("foo", 3);
585c15af1910d8f451341d0068b5533816ace5defecShawn Willden        msg.upgrade_params.Reinitialize(params, array_length(params));
586c15af1910d8f451341d0068b5533816ace5defecShawn Willden
587c15af1910d8f451341d0068b5533816ace5defecShawn Willden        UniquePtr<UpgradeKeyRequest> deserialized(round_trip(ver, msg, 85));
588c15af1910d8f451341d0068b5533816ace5defecShawn Willden        EXPECT_EQ(3U, deserialized->key_blob.key_material_size);
589c15af1910d8f451341d0068b5533816ace5defecShawn Willden        EXPECT_EQ(0, memcmp("foo", deserialized->key_blob.key_material, 3));
590c15af1910d8f451341d0068b5533816ace5defecShawn Willden        EXPECT_EQ(msg.upgrade_params, deserialized->upgrade_params);
591c15af1910d8f451341d0068b5533816ace5defecShawn Willden    }
592c15af1910d8f451341d0068b5533816ace5defecShawn Willden}
593c15af1910d8f451341d0068b5533816ace5defecShawn Willden
594c15af1910d8f451341d0068b5533816ace5defecShawn WilldenTEST(RoundTrip, UpgradeKeyResponse) {
595c15af1910d8f451341d0068b5533816ace5defecShawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
596c15af1910d8f451341d0068b5533816ace5defecShawn Willden        UpgradeKeyResponse req(ver);
597c15af1910d8f451341d0068b5533816ace5defecShawn Willden        req.error = KM_ERROR_OK;
598c15af1910d8f451341d0068b5533816ace5defecShawn Willden        req.upgraded_key.key_material = dup_array(TEST_DATA);
599c15af1910d8f451341d0068b5533816ace5defecShawn Willden        req.upgraded_key.key_material_size = array_length(TEST_DATA);
600c15af1910d8f451341d0068b5533816ace5defecShawn Willden
601c15af1910d8f451341d0068b5533816ace5defecShawn Willden        UniquePtr<UpgradeKeyResponse> deserialized(round_trip(ver, req, 19));
602c15af1910d8f451341d0068b5533816ace5defecShawn Willden        EXPECT_EQ(KM_ERROR_OK, deserialized->error);
603c15af1910d8f451341d0068b5533816ace5defecShawn Willden        EXPECT_EQ(req.upgraded_key.key_material_size, deserialized->upgraded_key.key_material_size);
604c15af1910d8f451341d0068b5533816ace5defecShawn Willden        EXPECT_EQ(0, memcmp(req.upgraded_key.key_material, deserialized->upgraded_key.key_material,
605c15af1910d8f451341d0068b5533816ace5defecShawn Willden                            req.upgraded_key.key_material_size));
606c15af1910d8f451341d0068b5533816ace5defecShawn Willden    }
607c15af1910d8f451341d0068b5533816ace5defecShawn Willden}
608c15af1910d8f451341d0068b5533816ace5defecShawn Willden
609f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willdenuint8_t msgbuf[] = {
610f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    220, 88,  183, 255, 71,  1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
611f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    0,   173, 0,   0,   0,   228, 174, 98,  187, 191, 135, 253, 200, 51,  230, 114, 247, 151, 109,
612f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    237, 79,  87,  32,  94,  5,   204, 46,  154, 30,  91,  6,   103, 148, 254, 129, 65,  171, 228,
613f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    167, 224, 163, 9,   15,  206, 90,  58,  11,  205, 55,  211, 33,  87,  178, 149, 91,  28,  236,
614f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    218, 112, 231, 34,  82,  82,  134, 103, 137, 115, 27,  156, 102, 159, 220, 226, 89,  42,  25,
615f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    37,  9,   84,  239, 76,  161, 198, 72,  167, 163, 39,  91,  148, 191, 17,  191, 87,  169, 179,
616f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    136, 10,  194, 154, 4,   40,  107, 109, 61,  161, 20,  176, 247, 13,  214, 106, 229, 45,  17,
617f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    5,   60,  189, 64,  39,  166, 208, 14,  57,  25,  140, 148, 25,  177, 246, 189, 43,  181, 88,
618f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    204, 29,  126, 224, 100, 143, 93,  60,  57,  249, 55,  0,   87,  83,  227, 224, 166, 59,  214,
619f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    81,  144, 129, 58,  6,   57,  46,  254, 232, 41,  220, 209, 230, 167, 138, 158, 94,  180, 125,
620f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    247, 26,  162, 116, 238, 202, 187, 100, 65,  13,  180, 44,  245, 159, 83,  161, 176, 58,  72,
621f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    236, 109, 105, 160, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
622f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    0,   11,  0,   0,   0,   98,  0,   0,   0,   1,   0,   0,   32,  2,   0,   0,   0,   1,   0,
623f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    0,   32,  3,   0,   0,   0,   2,   0,   0,   16,  1,   0,   0,   0,   3,   0,   0,   48,  0,
624f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    1,   0,   0,   200, 0,   0,   80,  3,   0,   0,   0,   0,   0,   0,   0,   244, 1,   0,   112,
625f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    1,   246, 1,   0,   112, 1,   189, 2,   0,   96,  144, 178, 236, 250, 255, 255, 255, 255, 145,
626f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    1,   0,   96,  144, 226, 33,  60,  222, 2,   0,   0,   189, 2,   0,   96,  0,   0,   0,   0,
627f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    0,   0,   0,   0,   190, 2,   0,   16,  1,   0,   0,   0,   12,  0,   0,   0,   0,   0,   0,
628f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    0,   0,   0,   0,   0,   0,   0,   0,   0,   110, 0,   0,   0,   0,   0,   0,   0,   11,  0,
629f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    0,   0,   98,  0,   0,   0,   1,   0,   0,   32,  2,   0,   0,   0,   1,   0,   0,   32,  3,
630f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    0,   0,   0,   2,   0,   0,   16,  1,   0,   0,   0,   3,   0,   0,   48,  0,   1,   0,   0,
631f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    200, 0,   0,   80,  3,   0,   0,   0,   0,   0,   0,   0,   244, 1,   0,   112, 1,   246, 1,
632f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    0,   112, 1,   189, 2,   0,   96,  144, 178, 236, 250, 255, 255, 255, 255, 145, 1,   0,   96,
633f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    144, 226, 33,  60,  222, 2,   0,   0,   189, 2,   0,   96,  0,   0,   0,   0,   0,   0,   0,
634f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    0,   190, 2,   0,   16,  1,   0,   0,   0,
635f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden};
636f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden
637f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden/*
638f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden * These tests don't have any assertions or expectations. They just try to parse garbage, to see if
639f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden * the result will be a crash.  This is especially informative when run under Valgrind memcheck.
640f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden */
641f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden
642f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willdentemplate <typename Message> void parse_garbage() {
6432665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int32_t ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
6442665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        Message msg(ver);
6452665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        const uint8_t* end = msgbuf + array_length(msgbuf);
6462665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        for (size_t i = 0; i < array_length(msgbuf); ++i) {
6472665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden            const uint8_t* begin = msgbuf + i;
6482665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden            const uint8_t* p = begin;
6492665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden            msg.Deserialize(&p, end);
6502665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        }
651f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    }
6520f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden
6530f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden    time_t now = time(NULL);
6540f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden    std::cout << "Seeding rand() with " << now << " for fuzz test." << std::endl;
6550f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden    srand(now);
6560f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden
6570f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden    // Fill large buffer with random bytes.
6580f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden    const int kBufSize = 10000;
6590f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden    UniquePtr<uint8_t[]> buf(new uint8_t[kBufSize]);
6600f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden    for (size_t i = 0; i < kBufSize; ++i)
6610f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden        buf[i] = static_cast<uint8_t>(rand());
6620f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden
6630f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden    for (uint32_t ver = 0; ver < MAX_MESSAGE_VERSION; ++ver) {
6640f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden        Message msg(ver);
6650f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden        const uint8_t* end = buf.get() + kBufSize;
6660f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden        for (size_t i = 0; i < kBufSize; ++i) {
6670f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden            const uint8_t* begin = buf.get() + i;
6680f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden            const uint8_t* p = begin;
6690f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden            msg.Deserialize(&p, end);
6700f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden        }
6710f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden    }
672f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden}
673f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden
674f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden#define GARBAGE_TEST(Message)                                                                      \
675f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    TEST(GarbageTest, Message) { parse_garbage<Message>(); }
676f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden
67736d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(AbortOperationRequest);
67836d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(AbortOperationResponse);
67936d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(AddEntropyRequest);
68036d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(AddEntropyResponse);
681f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(BeginOperationRequest);
682f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(BeginOperationResponse);
68336d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(DeleteAllKeysRequest);
68436d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(DeleteAllKeysResponse);
68536d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(DeleteKeyRequest);
68636d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(DeleteKeyResponse);
68736d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(ExportKeyRequest);
68836d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(ExportKeyResponse);
689f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(FinishOperationRequest);
690f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(FinishOperationResponse);
69136d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(GenerateKeyRequest);
69236d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(GenerateKeyResponse);
69336d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(GetKeyCharacteristicsRequest);
69436d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(GetKeyCharacteristicsResponse);
695f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(ImportKeyRequest);
696f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(ImportKeyResponse);
69736d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(SupportedByAlgorithmAndPurposeRequest)
69836d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(SupportedByAlgorithmRequest)
69936d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(UpdateOperationRequest);
70036d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(UpdateOperationResponse);
7013d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn WilldenGARBAGE_TEST(AttestKeyRequest);
7023d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn WilldenGARBAGE_TEST(AttestKeyResponse);
703c15af1910d8f451341d0068b5533816ace5defecShawn WilldenGARBAGE_TEST(UpgradeKeyRequest);
704c15af1910d8f451341d0068b5533816ace5defecShawn WilldenGARBAGE_TEST(UpgradeKeyResponse);
705f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden
706f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden// The macro doesn't work on this one.
707f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenTEST(GarbageTest, SupportedResponse) {
708f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    parse_garbage<SupportedResponse<keymaster_digest_t>>();
709f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden}
710f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden
711128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden}  // namespace test
7122665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
713128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden}  // namespace keymaster
714