android_keymaster_messages_test.cpp revision ac69d9559e96cf57d7705848a9f3d6e09eac9fe1
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
84da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, SupportedAlgorithmsResponse) {
852665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
862665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        SupportedAlgorithmsResponse rsp(ver);
879c65b2bd1978a918b52a459596dafc7dde992416Shawn Willden        keymaster_algorithm_t algorithms[] = {KM_ALGORITHM_RSA, KM_ALGORITHM_EC};
882665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        rsp.error = KM_ERROR_OK;
892665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        rsp.algorithms = dup_array(algorithms);
902665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        rsp.algorithms_length = array_length(algorithms);
912665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
929c65b2bd1978a918b52a459596dafc7dde992416Shawn Willden        UniquePtr<SupportedAlgorithmsResponse> deserialized(round_trip(ver, rsp, 16));
932665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(array_length(algorithms), deserialized->algorithms_length);
942665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0, memcmp(deserialized->algorithms, algorithms, array_size(algorithms)));
952665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
96128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden}
97128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
98da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, SupportedResponse) {
992665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
1002665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        SupportedResponse<keymaster_digest_t> rsp(ver);
1012665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        keymaster_digest_t digests[] = {KM_DIGEST_NONE, KM_DIGEST_MD5, KM_DIGEST_SHA1};
1022665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        rsp.error = KM_ERROR_OK;
1032665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        rsp.SetResults(digests);
1042665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
1052665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UniquePtr<SupportedResponse<keymaster_digest_t>> deserialized(round_trip(ver, rsp, 20));
1062665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(array_length(digests), deserialized->results_length);
1072665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0, memcmp(deserialized->results, digests, array_size(digests)));
1082665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
109da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
110da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
111da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willdenstatic keymaster_key_param_t params[] = {
112ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden    Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN),
113ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden    Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
114ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden    Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA),
115ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden    Authorization(TAG_USER_ID, 7),
116eb63b9799eadcaa6ef206f8b804d7432e0dab14aShawn Willden    Authorization(TAG_USER_AUTH_TYPE, HW_AUTH_PASSWORD),
117ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden    Authorization(TAG_APPLICATION_ID, "app_id", 6),
118ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden    Authorization(TAG_AUTH_TIMEOUT, 300),
119da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden};
120128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willdenuint8_t TEST_DATA[] = "a key blob";
121128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
122da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, GenerateKeyRequest) {
1232665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
1242665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        GenerateKeyRequest req(ver);
1252665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        req.key_description.Reinitialize(params, array_length(params));
1262665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UniquePtr<GenerateKeyRequest> deserialized(round_trip(ver, req, 78));
1272665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(deserialized->key_description, req.key_description);
1282665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
129da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
130da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
131da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, GenerateKeyResponse) {
1322665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
1332665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        GenerateKeyResponse rsp(ver);
1342665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        rsp.error = KM_ERROR_OK;
1352665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        rsp.key_blob.key_material = dup_array(TEST_DATA);
1362665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        rsp.key_blob.key_material_size = array_length(TEST_DATA);
1372665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        rsp.enforced.Reinitialize(params, array_length(params));
1382665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
1392665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UniquePtr<GenerateKeyResponse> deserialized(round_trip(ver, rsp, 109));
1402665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(KM_ERROR_OK, deserialized->error);
1412665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(deserialized->enforced, rsp.enforced);
1422665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(deserialized->unenforced, rsp.unenforced);
1432665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
144da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
145128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
146da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, GenerateKeyResponseTestError) {
1472665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
1482665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        GenerateKeyResponse rsp(ver);
1492665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        rsp.error = KM_ERROR_UNSUPPORTED_ALGORITHM;
1502665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        rsp.key_blob.key_material = dup_array(TEST_DATA);
1512665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        rsp.key_blob.key_material_size = array_length(TEST_DATA);
1522665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        rsp.enforced.Reinitialize(params, array_length(params));
1532665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
1542665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UniquePtr<GenerateKeyResponse> deserialized(round_trip(ver, rsp, 4));
1552665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(KM_ERROR_UNSUPPORTED_ALGORITHM, deserialized->error);
1562665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0U, deserialized->enforced.size());
1572665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0U, deserialized->unenforced.size());
1582665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0U, deserialized->key_blob.key_material_size);
1592665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
160da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
161da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
162da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, GetKeyCharacteristicsRequest) {
1632665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
1642665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        GetKeyCharacteristicsRequest req(ver);
1652665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        req.additional_params.Reinitialize(params, array_length(params));
1662665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        req.SetKeyMaterial("foo", 3);
1672665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
1682665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UniquePtr<GetKeyCharacteristicsRequest> deserialized(round_trip(ver, req, 85));
1692665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(7U, deserialized->additional_params.size());
1702665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(3U, deserialized->key_blob.key_material_size);
1712665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0, memcmp(deserialized->key_blob.key_material, "foo", 3));
1722665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
173da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
174128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
175da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, GetKeyCharacteristicsResponse) {
1762665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
1772665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        GetKeyCharacteristicsResponse msg(ver);
1782665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.error = KM_ERROR_OK;
1792665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.enforced.Reinitialize(params, array_length(params));
1802665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.unenforced.Reinitialize(params, array_length(params));
1812665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
1822665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UniquePtr<GetKeyCharacteristicsResponse> deserialized(round_trip(ver, msg, 160));
1832665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(msg.enforced, deserialized->enforced);
1842665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(msg.unenforced, deserialized->unenforced);
1852665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
186da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
187da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
188da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, BeginOperationRequest) {
1892665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
1902665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        BeginOperationRequest msg(ver);
1912665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.purpose = KM_PURPOSE_SIGN;
1922665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.SetKeyMaterial("foo", 3);
1932665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.additional_params.Reinitialize(params, array_length(params));
1942665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
1952665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UniquePtr<BeginOperationRequest> deserialized(round_trip(ver, msg, 89));
1962665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(KM_PURPOSE_SIGN, deserialized->purpose);
1972665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(3U, deserialized->key_blob.key_material_size);
1982665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0, memcmp(deserialized->key_blob.key_material, "foo", 3));
1992665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(msg.additional_params, deserialized->additional_params);
2002665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
201da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
202da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
203da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, BeginOperationResponse) {
2042665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
2052665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        BeginOperationResponse msg(ver);
2062665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.error = KM_ERROR_OK;
2072665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.op_handle = 0xDEADBEEF;
2087b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden        msg.output_params.push_back(Authorization(TAG_NONCE, "foo", 3));
2097b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden
2107b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden        UniquePtr<BeginOperationResponse> deserialized;
2117b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden        switch (ver) {
2127b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden        case 0:
2137b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden            deserialized.reset(round_trip(ver, msg, 12));
2147b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden            break;
2157b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden        case 1:
216ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden        case 2:
2177b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden            deserialized.reset(round_trip(ver, msg, 39));
2187b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden            break;
2197b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden        default:
2207b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden            FAIL();
2217b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden        }
2222665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
2232665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(KM_ERROR_OK, deserialized->error);
2242665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0xDEADBEEF, deserialized->op_handle);
2257b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden
2267b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden        switch (ver) {
2277b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden        case 0:
228c609659a4b469778f523bece9ad0235fcfe6dd91Shawn Willden            EXPECT_EQ(0U, deserialized->output_params.size());
2297b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden            break;
2307b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden        case 1:
231ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden        case 2:
2327b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden            EXPECT_EQ(msg.output_params, deserialized->output_params);
2337b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden            break;
2347b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden        default:
2357b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden            FAIL();
2367b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden        }
2372665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
238da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
239da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
240da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, BeginOperationResponseError) {
2412665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
2422665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        BeginOperationResponse msg(ver);
2432665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.error = KM_ERROR_INVALID_OPERATION_HANDLE;
2442665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.op_handle = 0xDEADBEEF;
245da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
2462665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UniquePtr<BeginOperationResponse> deserialized(round_trip(ver, msg, 4));
2472665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, deserialized->error);
2482665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
249da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
250da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
251da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, UpdateOperationRequest) {
2522665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
2532665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UpdateOperationRequest msg(ver);
2542665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.op_handle = 0xDEADBEEF;
2552665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.input.Reinitialize("foo", 3);
2562665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
257ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden        UniquePtr<UpdateOperationRequest> deserialized;
258eb63b9799eadcaa6ef206f8b804d7432e0dab14aShawn Willden        switch (ver) {
259ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden        case 0:
260ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden            deserialized.reset(round_trip(ver, msg, 15));
261ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden            break;
262ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden        case 1:
263ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden        case 2:
264ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden            deserialized.reset(round_trip(ver, msg, 27));
265ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden            break;
266ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden        default:
267ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden            FAIL();
268ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden        }
2692665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(3U, deserialized->input.available_read());
2702665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0, memcmp(deserialized->input.peek_read(), "foo", 3));
2712665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
272da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
273da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
274da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, UpdateOperationResponse) {
2752665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
2762665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UpdateOperationResponse msg(ver);
2772665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.error = KM_ERROR_OK;
2782665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.output.Reinitialize("foo", 3);
279b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden        msg.input_consumed = 99;
280ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden        msg.output_params.push_back(TAG_APPLICATION_ID, "bar", 3);
281b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden
282b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden        UniquePtr<UpdateOperationResponse> deserialized;
283b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden        switch (ver) {
284b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden        case 0:
285b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden            deserialized.reset(round_trip(ver, msg, 11));
286b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden            break;
287b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden        case 1:
288b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden            deserialized.reset(round_trip(ver, msg, 15));
289b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden            break;
290ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden        case 2:
291ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden            deserialized.reset(round_trip(ver, msg, 42));
292ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden            break;
293b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden        default:
294b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden            FAIL();
295b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden        }
2962665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(KM_ERROR_OK, deserialized->error);
2972665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(3U, deserialized->output.available_read());
2982665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0, memcmp(deserialized->output.peek_read(), "foo", 3));
299b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden
300b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden        switch (ver) {
301b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden        case 0:
302c609659a4b469778f523bece9ad0235fcfe6dd91Shawn Willden            EXPECT_EQ(0U, deserialized->input_consumed);
303b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden            break;
304b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden        case 1:
305c609659a4b469778f523bece9ad0235fcfe6dd91Shawn Willden            EXPECT_EQ(99U, deserialized->input_consumed);
306b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden            break;
307ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden        case 2:
308ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden            EXPECT_EQ(99U, deserialized->input_consumed);
309ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden            EXPECT_EQ(1U, deserialized->output_params.size());
310ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden            break;
311b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden        default:
312b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden            FAIL();
313b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden        }
3142665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
315da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
316da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
317da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, FinishOperationRequest) {
3182665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
3192665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        FinishOperationRequest msg(ver);
3202665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.op_handle = 0xDEADBEEF;
3212665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.signature.Reinitialize("bar", 3);
3222665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
323ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden        UniquePtr<FinishOperationRequest> deserialized;
324eb63b9799eadcaa6ef206f8b804d7432e0dab14aShawn Willden        switch (ver) {
325ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden        case 0:
326ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden            deserialized.reset(round_trip(ver, msg, 15));
327ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden            break;
328ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden        case 1:
329ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden        case 2:
330ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden            deserialized.reset(round_trip(ver, msg, 27));
331ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden            break;
332ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden        default:
333ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden            FAIL();
334ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden        }
3352665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0xDEADBEEF, deserialized->op_handle);
3362665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(3U, deserialized->signature.available_read());
3372665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0, memcmp(deserialized->signature.peek_read(), "bar", 3));
3382665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
339da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
340da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
341da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(Round_Trip, FinishOperationResponse) {
3422665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
3432665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        FinishOperationResponse msg(ver);
3442665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.error = KM_ERROR_OK;
3452665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.output.Reinitialize("foo", 3);
3462665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
347ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden        UniquePtr<FinishOperationResponse> deserialized;
348ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden        switch (ver) {
349ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden        case 0:
350ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden        case 1:
351ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden            deserialized.reset(round_trip(ver, msg, 11));
352ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden            break;
353ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden        case 2:
354ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden            deserialized.reset(round_trip(ver, msg, 23));
355ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden            break;
356ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden        default:
357ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden            FAIL();
358ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden        }
3592665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(msg.error, deserialized->error);
3602665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(msg.output.available_read(), deserialized->output.available_read());
3612665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0, memcmp(msg.output.peek_read(), deserialized->output.peek_read(),
3622665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden                            msg.output.available_read()));
3632665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
364da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
365da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
366da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, ImportKeyRequest) {
3672665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
3682665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        ImportKeyRequest msg(ver);
3692665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.key_description.Reinitialize(params, array_length(params));
3702665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.key_format = KM_KEY_FORMAT_X509;
3712665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.SetKeyMaterial("foo", 3);
3722665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
3732665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UniquePtr<ImportKeyRequest> deserialized(round_trip(ver, msg, 89));
3742665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(msg.key_description, deserialized->key_description);
3752665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(msg.key_format, deserialized->key_format);
3762665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(msg.key_data_length, deserialized->key_data_length);
3772665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0, memcmp(msg.key_data, deserialized->key_data, msg.key_data_length));
3782665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
379da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
380da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
381da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, ImportKeyResponse) {
3822665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
3832665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        ImportKeyResponse msg(ver);
3842665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.error = KM_ERROR_OK;
3852665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.SetKeyMaterial("foo", 3);
3862665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.enforced.Reinitialize(params, array_length(params));
3872665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.unenforced.Reinitialize(params, array_length(params));
3882665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
3892665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UniquePtr<ImportKeyResponse> deserialized(round_trip(ver, msg, 167));
3902665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(msg.error, deserialized->error);
3912665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(msg.key_blob.key_material_size, deserialized->key_blob.key_material_size);
3922665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0, memcmp(msg.key_blob.key_material, deserialized->key_blob.key_material,
3932665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden                            msg.key_blob.key_material_size));
3942665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(msg.enforced, deserialized->enforced);
3952665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(msg.unenforced, deserialized->unenforced);
3962665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
397da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
398da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
399da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, ExportKeyRequest) {
4002665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
4012665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        ExportKeyRequest msg(ver);
4022665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.additional_params.Reinitialize(params, array_length(params));
4032665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.key_format = KM_KEY_FORMAT_X509;
4042665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.SetKeyMaterial("foo", 3);
4052665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
4062665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UniquePtr<ExportKeyRequest> deserialized(round_trip(ver, msg, 89));
4072665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(msg.additional_params, deserialized->additional_params);
4082665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(msg.key_format, deserialized->key_format);
4092665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(3U, deserialized->key_blob.key_material_size);
4102665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0, memcmp("foo", deserialized->key_blob.key_material, 3));
4112665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
412da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
413da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
414da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, ExportKeyResponse) {
4152665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
4162665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        ExportKeyResponse msg(ver);
4172665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.error = KM_ERROR_OK;
4182665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.SetKeyMaterial("foo", 3);
4192665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
4202665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UniquePtr<ExportKeyResponse> deserialized(round_trip(ver, msg, 11));
4212665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(3U, deserialized->key_data_length);
4222665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0, memcmp("foo", deserialized->key_data, 3));
4232665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
4242665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden}
4252665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
4262beb628bfefae72fa6bb84a6235da7e3de532823Shawn WilldenTEST(RoundTrip, DeleteKeyRequest) {
4272beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
4282beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden        DeleteKeyRequest msg(ver);
4292beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden        msg.SetKeyMaterial("foo", 3);
4302beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden
4312beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden        UniquePtr<DeleteKeyRequest> deserialized(round_trip(ver, msg, 7));
4322beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden        EXPECT_EQ(3U, deserialized->key_blob.key_material_size);
4332beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden        EXPECT_EQ(0, memcmp("foo", deserialized->key_blob.key_material, 3));
4342beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden    }
4352beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden}
4362beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden
4372665e868b1153cb89ad7cd906ae160cb417d4438Shawn WilldenTEST(RoundTrip, GetVersionRequest) {
4382665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    GetVersionRequest msg;
4392665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
4402665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    size_t size = msg.SerializedSize();
441c609659a4b469778f523bece9ad0235fcfe6dd91Shawn Willden    ASSERT_EQ(0U, size);
4422665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
4432665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    UniquePtr<uint8_t[]> buf(new uint8_t[size]);
4442665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    EXPECT_EQ(buf.get() + size, msg.Serialize(buf.get(), buf.get() + size));
4452665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
4462665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    GetVersionRequest deserialized;
4472665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    const uint8_t* p = buf.get();
4482665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    EXPECT_TRUE(deserialized.Deserialize(&p, p + size));
4492665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    EXPECT_EQ((ptrdiff_t)size, p - buf.get());
4502665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden}
4512665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
4522665e868b1153cb89ad7cd906ae160cb417d4438Shawn WilldenTEST(RoundTrip, GetVersionResponse) {
4532665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    GetVersionResponse msg;
454da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.error = KM_ERROR_OK;
4552665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    msg.major_ver = 9;
4562665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    msg.minor_ver = 98;
4572665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    msg.subminor_ver = 38;
4582665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
4592665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    size_t size = msg.SerializedSize();
460c609659a4b469778f523bece9ad0235fcfe6dd91Shawn Willden    ASSERT_EQ(7U, size);
461da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
4622665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    UniquePtr<uint8_t[]> buf(new uint8_t[size]);
4632665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    EXPECT_EQ(buf.get() + size, msg.Serialize(buf.get(), buf.get() + size));
4642665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
4652665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    GetVersionResponse deserialized;
4662665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    const uint8_t* p = buf.get();
4672665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    EXPECT_TRUE(deserialized.Deserialize(&p, p + size));
4682665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    EXPECT_EQ((ptrdiff_t)size, p - buf.get());
469c609659a4b469778f523bece9ad0235fcfe6dd91Shawn Willden    EXPECT_EQ(9U, msg.major_ver);
470c609659a4b469778f523bece9ad0235fcfe6dd91Shawn Willden    EXPECT_EQ(98U, msg.minor_ver);
471c609659a4b469778f523bece9ad0235fcfe6dd91Shawn Willden    EXPECT_EQ(38U, msg.subminor_ver);
472128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden}
473128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
474cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn WilldenTEST(RoundTrip, AddEntropyRequest) {
475cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
476cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden        AddEntropyRequest msg(ver);
477cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden        msg.random_data.Reinitialize("foo", 3);
478cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden
479cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden        UniquePtr<AddEntropyRequest> deserialized(round_trip(ver, msg, 7));
480cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden        EXPECT_EQ(3U, deserialized->random_data.available_read());
481cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden        EXPECT_EQ(0, memcmp("foo", deserialized->random_data.peek_read(), 3));
482cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden    }
483cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden}
484cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden
485f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willdenuint8_t msgbuf[] = {
486f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    220, 88,  183, 255, 71,  1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
487f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    0,   173, 0,   0,   0,   228, 174, 98,  187, 191, 135, 253, 200, 51,  230, 114, 247, 151, 109,
488f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    237, 79,  87,  32,  94,  5,   204, 46,  154, 30,  91,  6,   103, 148, 254, 129, 65,  171, 228,
489f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    167, 224, 163, 9,   15,  206, 90,  58,  11,  205, 55,  211, 33,  87,  178, 149, 91,  28,  236,
490f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    218, 112, 231, 34,  82,  82,  134, 103, 137, 115, 27,  156, 102, 159, 220, 226, 89,  42,  25,
491f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    37,  9,   84,  239, 76,  161, 198, 72,  167, 163, 39,  91,  148, 191, 17,  191, 87,  169, 179,
492f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    136, 10,  194, 154, 4,   40,  107, 109, 61,  161, 20,  176, 247, 13,  214, 106, 229, 45,  17,
493f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    5,   60,  189, 64,  39,  166, 208, 14,  57,  25,  140, 148, 25,  177, 246, 189, 43,  181, 88,
494f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    204, 29,  126, 224, 100, 143, 93,  60,  57,  249, 55,  0,   87,  83,  227, 224, 166, 59,  214,
495f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    81,  144, 129, 58,  6,   57,  46,  254, 232, 41,  220, 209, 230, 167, 138, 158, 94,  180, 125,
496f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    247, 26,  162, 116, 238, 202, 187, 100, 65,  13,  180, 44,  245, 159, 83,  161, 176, 58,  72,
497f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    236, 109, 105, 160, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
498f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    0,   11,  0,   0,   0,   98,  0,   0,   0,   1,   0,   0,   32,  2,   0,   0,   0,   1,   0,
499f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    0,   32,  3,   0,   0,   0,   2,   0,   0,   16,  1,   0,   0,   0,   3,   0,   0,   48,  0,
500f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    1,   0,   0,   200, 0,   0,   80,  3,   0,   0,   0,   0,   0,   0,   0,   244, 1,   0,   112,
501f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    1,   246, 1,   0,   112, 1,   189, 2,   0,   96,  144, 178, 236, 250, 255, 255, 255, 255, 145,
502f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    1,   0,   96,  144, 226, 33,  60,  222, 2,   0,   0,   189, 2,   0,   96,  0,   0,   0,   0,
503f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    0,   0,   0,   0,   190, 2,   0,   16,  1,   0,   0,   0,   12,  0,   0,   0,   0,   0,   0,
504f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    0,   0,   0,   0,   0,   0,   0,   0,   0,   110, 0,   0,   0,   0,   0,   0,   0,   11,  0,
505f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    0,   0,   98,  0,   0,   0,   1,   0,   0,   32,  2,   0,   0,   0,   1,   0,   0,   32,  3,
506f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    0,   0,   0,   2,   0,   0,   16,  1,   0,   0,   0,   3,   0,   0,   48,  0,   1,   0,   0,
507f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    200, 0,   0,   80,  3,   0,   0,   0,   0,   0,   0,   0,   244, 1,   0,   112, 1,   246, 1,
508f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    0,   112, 1,   189, 2,   0,   96,  144, 178, 236, 250, 255, 255, 255, 255, 145, 1,   0,   96,
509f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    144, 226, 33,  60,  222, 2,   0,   0,   189, 2,   0,   96,  0,   0,   0,   0,   0,   0,   0,
510f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    0,   190, 2,   0,   16,  1,   0,   0,   0,
511f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden};
512f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden
513f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden/*
514f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden * These tests don't have any assertions or expectations. They just try to parse garbage, to see if
515f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden * the result will be a crash.  This is especially informative when run under Valgrind memcheck.
516f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden */
517f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden
518f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willdentemplate <typename Message> void parse_garbage() {
5192665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int32_t ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
5202665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        Message msg(ver);
5212665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        const uint8_t* end = msgbuf + array_length(msgbuf);
5222665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        for (size_t i = 0; i < array_length(msgbuf); ++i) {
5232665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden            const uint8_t* begin = msgbuf + i;
5242665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden            const uint8_t* p = begin;
5252665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden            msg.Deserialize(&p, end);
5262665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        }
527f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    }
528f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden}
529f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden
530f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden#define GARBAGE_TEST(Message)                                                                      \
531f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    TEST(GarbageTest, Message) { parse_garbage<Message>(); }
532f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden
533f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(SupportedAlgorithmsResponse)
534f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(GenerateKeyRequest);
535f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(GenerateKeyResponse);
536f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(GetKeyCharacteristicsRequest);
537f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(GetKeyCharacteristicsResponse);
538f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(BeginOperationRequest);
539f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(BeginOperationResponse);
540f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(UpdateOperationRequest);
541f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(UpdateOperationResponse);
542f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(FinishOperationRequest);
543f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(FinishOperationResponse);
544cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn WilldenGARBAGE_TEST(AddEntropyRequest);
545f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(ImportKeyRequest);
546f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(ImportKeyResponse);
547f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(ExportKeyRequest);
548f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(ExportKeyResponse);
5492beb628bfefae72fa6bb84a6235da7e3de532823Shawn WilldenGARBAGE_TEST(DeleteKeyRequest);
550f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden
551f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden// The macro doesn't work on this one.
552f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenTEST(GarbageTest, SupportedResponse) {
553f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    parse_garbage<SupportedResponse<keymaster_digest_t>>();
554f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden}
555f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden
556128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden}  // namespace test
5572665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
558128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden}  // namespace keymaster
559