android_keymaster_messages_test.cpp revision 0f906ec40f6ade7955c6b967ea522aade54ea2e4
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:
2257b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden            deserialized.reset(round_trip(ver, msg, 39));
2267b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden            break;
2277b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden        default:
2287b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden            FAIL();
2297b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden        }
2302665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
2312665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(KM_ERROR_OK, deserialized->error);
2322665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0xDEADBEEF, deserialized->op_handle);
2337b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden
2347b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden        switch (ver) {
2357b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden        case 0:
236c609659a4b469778f523bece9ad0235fcfe6dd91Shawn Willden            EXPECT_EQ(0U, deserialized->output_params.size());
2377b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden            break;
2387b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden        case 1:
239ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden        case 2:
2407b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden            EXPECT_EQ(msg.output_params, deserialized->output_params);
2417b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden            break;
2427b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden        default:
2437b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden            FAIL();
2447b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden        }
2452665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
246da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
247da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
248da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, BeginOperationResponseError) {
2492665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
2502665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        BeginOperationResponse msg(ver);
2512665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.error = KM_ERROR_INVALID_OPERATION_HANDLE;
2522665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.op_handle = 0xDEADBEEF;
253da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
2542665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UniquePtr<BeginOperationResponse> deserialized(round_trip(ver, msg, 4));
2552665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, deserialized->error);
2562665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
257da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
258da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
259da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, UpdateOperationRequest) {
2602665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
2612665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UpdateOperationRequest msg(ver);
2622665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.op_handle = 0xDEADBEEF;
2632665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.input.Reinitialize("foo", 3);
2642665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
265ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden        UniquePtr<UpdateOperationRequest> deserialized;
266eb63b9799eadcaa6ef206f8b804d7432e0dab14aShawn Willden        switch (ver) {
267ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden        case 0:
268ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden            deserialized.reset(round_trip(ver, msg, 15));
269ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden            break;
270ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden        case 1:
271ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden        case 2:
272ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden            deserialized.reset(round_trip(ver, msg, 27));
273ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden            break;
274ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden        default:
275ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden            FAIL();
276ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden        }
2772665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(3U, deserialized->input.available_read());
2782665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0, memcmp(deserialized->input.peek_read(), "foo", 3));
2792665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
280da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
281da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
282da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, UpdateOperationResponse) {
2832665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
2842665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UpdateOperationResponse msg(ver);
2852665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.error = KM_ERROR_OK;
2862665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.output.Reinitialize("foo", 3);
287b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden        msg.input_consumed = 99;
288ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden        msg.output_params.push_back(TAG_APPLICATION_ID, "bar", 3);
289b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden
290b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden        UniquePtr<UpdateOperationResponse> deserialized;
291b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden        switch (ver) {
292b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden        case 0:
293b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden            deserialized.reset(round_trip(ver, msg, 11));
294b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden            break;
295b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden        case 1:
296b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden            deserialized.reset(round_trip(ver, msg, 15));
297b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden            break;
298ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden        case 2:
299ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden            deserialized.reset(round_trip(ver, msg, 42));
300ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden            break;
301b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden        default:
302b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden            FAIL();
303b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden        }
3042665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(KM_ERROR_OK, deserialized->error);
3052665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(3U, deserialized->output.available_read());
3062665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0, memcmp(deserialized->output.peek_read(), "foo", 3));
307b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden
308b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden        switch (ver) {
309b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden        case 0:
310c609659a4b469778f523bece9ad0235fcfe6dd91Shawn Willden            EXPECT_EQ(0U, deserialized->input_consumed);
311b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden            break;
312b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden        case 1:
313c609659a4b469778f523bece9ad0235fcfe6dd91Shawn Willden            EXPECT_EQ(99U, deserialized->input_consumed);
314b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden            break;
315ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden        case 2:
316ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden            EXPECT_EQ(99U, deserialized->input_consumed);
317ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden            EXPECT_EQ(1U, deserialized->output_params.size());
318ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden            break;
319b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden        default:
320b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden            FAIL();
321b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden        }
3222665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
323da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
324da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
325da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, FinishOperationRequest) {
3262665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
3272665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        FinishOperationRequest msg(ver);
3282665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.op_handle = 0xDEADBEEF;
3292665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.signature.Reinitialize("bar", 3);
3302665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
331ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden        UniquePtr<FinishOperationRequest> deserialized;
332eb63b9799eadcaa6ef206f8b804d7432e0dab14aShawn Willden        switch (ver) {
333ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden        case 0:
334ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden            deserialized.reset(round_trip(ver, msg, 15));
335ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden            break;
336ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden        case 1:
337ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden        case 2:
338ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden            deserialized.reset(round_trip(ver, msg, 27));
339ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden            break;
340ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden        default:
341ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden            FAIL();
342ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden        }
3432665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0xDEADBEEF, deserialized->op_handle);
3442665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(3U, deserialized->signature.available_read());
3452665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0, memcmp(deserialized->signature.peek_read(), "bar", 3));
3462665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
347da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
348da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
349da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(Round_Trip, FinishOperationResponse) {
3502665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
3512665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        FinishOperationResponse msg(ver);
3522665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.error = KM_ERROR_OK;
3532665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.output.Reinitialize("foo", 3);
3542665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
355ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden        UniquePtr<FinishOperationResponse> deserialized;
356ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden        switch (ver) {
357ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden        case 0:
358ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden        case 1:
359ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden            deserialized.reset(round_trip(ver, msg, 11));
360ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden            break;
361ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden        case 2:
362ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden            deserialized.reset(round_trip(ver, msg, 23));
363ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden            break;
364ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden        default:
365ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden            FAIL();
366ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden        }
3672665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(msg.error, deserialized->error);
3682665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(msg.output.available_read(), deserialized->output.available_read());
3692665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0, memcmp(msg.output.peek_read(), deserialized->output.peek_read(),
3702665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden                            msg.output.available_read()));
3712665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
372da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
373da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
374da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, ImportKeyRequest) {
3752665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
3762665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        ImportKeyRequest msg(ver);
3772665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.key_description.Reinitialize(params, array_length(params));
3782665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.key_format = KM_KEY_FORMAT_X509;
3792665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.SetKeyMaterial("foo", 3);
3802665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
3812665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UniquePtr<ImportKeyRequest> deserialized(round_trip(ver, msg, 89));
3822665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(msg.key_description, deserialized->key_description);
3832665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(msg.key_format, deserialized->key_format);
3842665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(msg.key_data_length, deserialized->key_data_length);
3852665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0, memcmp(msg.key_data, deserialized->key_data, msg.key_data_length));
3862665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
387da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
388da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
389da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, ImportKeyResponse) {
3902665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
3912665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        ImportKeyResponse msg(ver);
3922665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.error = KM_ERROR_OK;
3932665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.SetKeyMaterial("foo", 3);
3942665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.enforced.Reinitialize(params, array_length(params));
3952665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.unenforced.Reinitialize(params, array_length(params));
3962665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
3972665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UniquePtr<ImportKeyResponse> deserialized(round_trip(ver, msg, 167));
3982665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(msg.error, deserialized->error);
3992665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(msg.key_blob.key_material_size, deserialized->key_blob.key_material_size);
4002665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0, memcmp(msg.key_blob.key_material, deserialized->key_blob.key_material,
4012665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden                            msg.key_blob.key_material_size));
4022665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(msg.enforced, deserialized->enforced);
4032665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(msg.unenforced, deserialized->unenforced);
4042665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
405da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
406da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
407da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, ExportKeyRequest) {
4082665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
4092665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        ExportKeyRequest msg(ver);
4102665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.additional_params.Reinitialize(params, array_length(params));
4112665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.key_format = KM_KEY_FORMAT_X509;
4122665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.SetKeyMaterial("foo", 3);
4132665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
4142665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UniquePtr<ExportKeyRequest> deserialized(round_trip(ver, msg, 89));
4152665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(msg.additional_params, deserialized->additional_params);
4162665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(msg.key_format, deserialized->key_format);
4172665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(3U, deserialized->key_blob.key_material_size);
4182665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0, memcmp("foo", deserialized->key_blob.key_material, 3));
4192665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
420da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
421da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
422da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, ExportKeyResponse) {
4232665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
4242665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        ExportKeyResponse msg(ver);
4252665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.error = KM_ERROR_OK;
4262665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.SetKeyMaterial("foo", 3);
4272665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
4282665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UniquePtr<ExportKeyResponse> deserialized(round_trip(ver, msg, 11));
4292665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(3U, deserialized->key_data_length);
4302665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0, memcmp("foo", deserialized->key_data, 3));
4312665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
4322665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden}
4332665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
4342beb628bfefae72fa6bb84a6235da7e3de532823Shawn WilldenTEST(RoundTrip, DeleteKeyRequest) {
4352beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
4362beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden        DeleteKeyRequest msg(ver);
4372beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden        msg.SetKeyMaterial("foo", 3);
4382beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden
4392beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden        UniquePtr<DeleteKeyRequest> deserialized(round_trip(ver, msg, 7));
4402beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden        EXPECT_EQ(3U, deserialized->key_blob.key_material_size);
4412beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden        EXPECT_EQ(0, memcmp("foo", deserialized->key_blob.key_material, 3));
4422beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden    }
4432beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden}
4442beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden
44536d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenTEST(RoundTrip, DeleteKeyResponse) {
44636d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
44736d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden        DeleteKeyResponse msg(ver);
44836d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden        UniquePtr<DeleteKeyResponse> deserialized(round_trip(ver, msg, 4));
44936d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden    }
45036d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden}
45136d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden
45236d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenTEST(RoundTrip, DeleteAllKeysRequest) {
45336d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
45436d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden        DeleteAllKeysRequest msg(ver);
45536d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden        UniquePtr<DeleteAllKeysRequest> deserialized(round_trip(ver, msg, 0));
45636d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden    }
45736d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden}
45836d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden
45936d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenTEST(RoundTrip, DeleteAllKeysResponse) {
46036d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
46136d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden        DeleteAllKeysResponse msg(ver);
46236d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden        UniquePtr<DeleteAllKeysResponse> deserialized(round_trip(ver, msg, 4));
46336d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden    }
46436d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden}
46536d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden
4662665e868b1153cb89ad7cd906ae160cb417d4438Shawn WilldenTEST(RoundTrip, GetVersionRequest) {
4672665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    GetVersionRequest msg;
4682665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
4692665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    size_t size = msg.SerializedSize();
470c609659a4b469778f523bece9ad0235fcfe6dd91Shawn Willden    ASSERT_EQ(0U, size);
4712665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
4722665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    UniquePtr<uint8_t[]> buf(new uint8_t[size]);
4732665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    EXPECT_EQ(buf.get() + size, msg.Serialize(buf.get(), buf.get() + size));
4742665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
4752665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    GetVersionRequest deserialized;
4762665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    const uint8_t* p = buf.get();
4772665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    EXPECT_TRUE(deserialized.Deserialize(&p, p + size));
4782665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    EXPECT_EQ((ptrdiff_t)size, p - buf.get());
4792665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden}
4802665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
4812665e868b1153cb89ad7cd906ae160cb417d4438Shawn WilldenTEST(RoundTrip, GetVersionResponse) {
4822665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    GetVersionResponse msg;
483da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.error = KM_ERROR_OK;
4842665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    msg.major_ver = 9;
4852665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    msg.minor_ver = 98;
4862665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    msg.subminor_ver = 38;
4872665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
4882665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    size_t size = msg.SerializedSize();
489c609659a4b469778f523bece9ad0235fcfe6dd91Shawn Willden    ASSERT_EQ(7U, size);
490da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
4912665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    UniquePtr<uint8_t[]> buf(new uint8_t[size]);
4922665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    EXPECT_EQ(buf.get() + size, msg.Serialize(buf.get(), buf.get() + size));
4932665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
4942665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    GetVersionResponse deserialized;
4952665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    const uint8_t* p = buf.get();
4962665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    EXPECT_TRUE(deserialized.Deserialize(&p, p + size));
4972665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    EXPECT_EQ((ptrdiff_t)size, p - buf.get());
498c609659a4b469778f523bece9ad0235fcfe6dd91Shawn Willden    EXPECT_EQ(9U, msg.major_ver);
499c609659a4b469778f523bece9ad0235fcfe6dd91Shawn Willden    EXPECT_EQ(98U, msg.minor_ver);
500c609659a4b469778f523bece9ad0235fcfe6dd91Shawn Willden    EXPECT_EQ(38U, msg.subminor_ver);
501128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden}
502128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
503cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn WilldenTEST(RoundTrip, AddEntropyRequest) {
504cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
505cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden        AddEntropyRequest msg(ver);
506cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden        msg.random_data.Reinitialize("foo", 3);
507cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden
508cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden        UniquePtr<AddEntropyRequest> deserialized(round_trip(ver, msg, 7));
509cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden        EXPECT_EQ(3U, deserialized->random_data.available_read());
510cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden        EXPECT_EQ(0, memcmp("foo", deserialized->random_data.peek_read(), 3));
511cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden    }
512cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden}
513cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden
51436d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenTEST(RoundTrip, AddEntropyResponse) {
51536d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
51636d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden        AddEntropyResponse msg(ver);
51736d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden        UniquePtr<AddEntropyResponse> deserialized(round_trip(ver, msg, 4));
51836d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden    }
51936d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden}
52036d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden
52136d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenTEST(RoundTrip, AbortOperationRequest) {
52236d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
52336d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden        AbortOperationRequest msg(ver);
52436d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden        UniquePtr<AbortOperationRequest> deserialized(round_trip(ver, msg, 8));
52536d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden    }
52636d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden}
52736d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden
52836d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenTEST(RoundTrip, AbortOperationResponse) {
52936d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
53036d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden        AbortOperationResponse msg(ver);
53136d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden        UniquePtr<AbortOperationResponse> deserialized(round_trip(ver, msg, 4));
53236d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden    }
53336d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden}
53436d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden
535f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willdenuint8_t msgbuf[] = {
536f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    220, 88,  183, 255, 71,  1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
537f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    0,   173, 0,   0,   0,   228, 174, 98,  187, 191, 135, 253, 200, 51,  230, 114, 247, 151, 109,
538f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    237, 79,  87,  32,  94,  5,   204, 46,  154, 30,  91,  6,   103, 148, 254, 129, 65,  171, 228,
539f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    167, 224, 163, 9,   15,  206, 90,  58,  11,  205, 55,  211, 33,  87,  178, 149, 91,  28,  236,
540f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    218, 112, 231, 34,  82,  82,  134, 103, 137, 115, 27,  156, 102, 159, 220, 226, 89,  42,  25,
541f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    37,  9,   84,  239, 76,  161, 198, 72,  167, 163, 39,  91,  148, 191, 17,  191, 87,  169, 179,
542f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    136, 10,  194, 154, 4,   40,  107, 109, 61,  161, 20,  176, 247, 13,  214, 106, 229, 45,  17,
543f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    5,   60,  189, 64,  39,  166, 208, 14,  57,  25,  140, 148, 25,  177, 246, 189, 43,  181, 88,
544f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    204, 29,  126, 224, 100, 143, 93,  60,  57,  249, 55,  0,   87,  83,  227, 224, 166, 59,  214,
545f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    81,  144, 129, 58,  6,   57,  46,  254, 232, 41,  220, 209, 230, 167, 138, 158, 94,  180, 125,
546f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    247, 26,  162, 116, 238, 202, 187, 100, 65,  13,  180, 44,  245, 159, 83,  161, 176, 58,  72,
547f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    236, 109, 105, 160, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
548f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    0,   11,  0,   0,   0,   98,  0,   0,   0,   1,   0,   0,   32,  2,   0,   0,   0,   1,   0,
549f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    0,   32,  3,   0,   0,   0,   2,   0,   0,   16,  1,   0,   0,   0,   3,   0,   0,   48,  0,
550f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    1,   0,   0,   200, 0,   0,   80,  3,   0,   0,   0,   0,   0,   0,   0,   244, 1,   0,   112,
551f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    1,   246, 1,   0,   112, 1,   189, 2,   0,   96,  144, 178, 236, 250, 255, 255, 255, 255, 145,
552f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    1,   0,   96,  144, 226, 33,  60,  222, 2,   0,   0,   189, 2,   0,   96,  0,   0,   0,   0,
553f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    0,   0,   0,   0,   190, 2,   0,   16,  1,   0,   0,   0,   12,  0,   0,   0,   0,   0,   0,
554f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    0,   0,   0,   0,   0,   0,   0,   0,   0,   110, 0,   0,   0,   0,   0,   0,   0,   11,  0,
555f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    0,   0,   98,  0,   0,   0,   1,   0,   0,   32,  2,   0,   0,   0,   1,   0,   0,   32,  3,
556f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    0,   0,   0,   2,   0,   0,   16,  1,   0,   0,   0,   3,   0,   0,   48,  0,   1,   0,   0,
557f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    200, 0,   0,   80,  3,   0,   0,   0,   0,   0,   0,   0,   244, 1,   0,   112, 1,   246, 1,
558f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    0,   112, 1,   189, 2,   0,   96,  144, 178, 236, 250, 255, 255, 255, 255, 145, 1,   0,   96,
559f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    144, 226, 33,  60,  222, 2,   0,   0,   189, 2,   0,   96,  0,   0,   0,   0,   0,   0,   0,
560f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    0,   190, 2,   0,   16,  1,   0,   0,   0,
561f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden};
562f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden
563f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden/*
564f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden * These tests don't have any assertions or expectations. They just try to parse garbage, to see if
565f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden * the result will be a crash.  This is especially informative when run under Valgrind memcheck.
566f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden */
567f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden
568f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willdentemplate <typename Message> void parse_garbage() {
5692665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int32_t ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
5702665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        Message msg(ver);
5712665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        const uint8_t* end = msgbuf + array_length(msgbuf);
5722665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        for (size_t i = 0; i < array_length(msgbuf); ++i) {
5732665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden            const uint8_t* begin = msgbuf + i;
5742665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden            const uint8_t* p = begin;
5752665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden            msg.Deserialize(&p, end);
5762665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        }
577f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    }
5780f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden
5790f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden    time_t now = time(NULL);
5800f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden    std::cout << "Seeding rand() with " << now << " for fuzz test." << std::endl;
5810f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden    srand(now);
5820f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden
5830f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden    // Fill large buffer with random bytes.
5840f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden    const int kBufSize = 10000;
5850f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden    UniquePtr<uint8_t[]> buf(new uint8_t[kBufSize]);
5860f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden    for (size_t i = 0; i < kBufSize; ++i)
5870f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden        buf[i] = static_cast<uint8_t>(rand());
5880f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden
5890f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden    for (uint32_t ver = 0; ver < MAX_MESSAGE_VERSION; ++ver) {
5900f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden        Message msg(ver);
5910f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden        const uint8_t* end = buf.get() + kBufSize;
5920f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden        for (size_t i = 0; i < kBufSize; ++i) {
5930f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden            const uint8_t* begin = buf.get() + i;
5940f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden            const uint8_t* p = begin;
5950f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden            msg.Deserialize(&p, end);
5960f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden        }
5970f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden    }
598f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden}
599f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden
600f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden#define GARBAGE_TEST(Message)                                                                      \
601f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    TEST(GarbageTest, Message) { parse_garbage<Message>(); }
602f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden
60336d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(AbortOperationRequest);
60436d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(AbortOperationResponse);
60536d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(AddEntropyRequest);
60636d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(AddEntropyResponse);
607f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(BeginOperationRequest);
608f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(BeginOperationResponse);
60936d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(DeleteAllKeysRequest);
61036d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(DeleteAllKeysResponse);
61136d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(DeleteKeyRequest);
61236d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(DeleteKeyResponse);
61336d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(ExportKeyRequest);
61436d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(ExportKeyResponse);
615f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(FinishOperationRequest);
616f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(FinishOperationResponse);
61736d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(GenerateKeyRequest);
61836d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(GenerateKeyResponse);
61936d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(GetKeyCharacteristicsRequest);
62036d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(GetKeyCharacteristicsResponse);
621f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(ImportKeyRequest);
622f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(ImportKeyResponse);
62336d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(SupportedByAlgorithmAndPurposeRequest)
62436d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(SupportedByAlgorithmRequest)
62536d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(UpdateOperationRequest);
62636d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(UpdateOperationResponse);
627f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden
628f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden// The macro doesn't work on this one.
629f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenTEST(GarbageTest, SupportedResponse) {
630f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    parse_garbage<SupportedResponse<keymaster_digest_t>>();
631f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden}
632f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden
633128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden}  // namespace test
6342665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
635128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden}  // namespace keymaster
636