android_keymaster_messages_test.cpp revision b6837e7a62a1192e33beef586282812239ee8b28
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
2198d9b92547a9a7553b99e3e941a4175926f95b62Shawn Willden#include <keymaster/keymaster_tags.h>
22b6837e7a62a1192e33beef586282812239ee8b28Shawn Willden#include <keymaster/android_keymaster_utils.h>
2398d9b92547a9a7553b99e3e941a4175926f95b62Shawn Willden
24b6837e7a62a1192e33beef586282812239ee8b28Shawn Willden#include "android_keymaster_test_utils.h"
25b6837e7a62a1192e33beef586282812239ee8b28Shawn Willden#include "android_softkeymaster.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[] = {
1122665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
113da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA), Authorization(TAG_USER_ID, 7),
114eb63b9799eadcaa6ef206f8b804d7432e0dab14aShawn Willden    Authorization(TAG_USER_AUTH_TYPE, HW_AUTH_PASSWORD),
115eb63b9799eadcaa6ef206f8b804d7432e0dab14aShawn Willden    Authorization(TAG_APPLICATION_ID, "app_id", 6), Authorization(TAG_AUTH_TIMEOUT, 300),
116da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden};
117128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willdenuint8_t TEST_DATA[] = "a key blob";
118128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
119da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, GenerateKeyRequest) {
1202665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
1212665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        GenerateKeyRequest req(ver);
1222665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        req.key_description.Reinitialize(params, array_length(params));
1232665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UniquePtr<GenerateKeyRequest> deserialized(round_trip(ver, req, 78));
1242665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(deserialized->key_description, req.key_description);
1252665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
126da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
127da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
128da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, GenerateKeyResponse) {
1292665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
1302665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        GenerateKeyResponse rsp(ver);
1312665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        rsp.error = KM_ERROR_OK;
1322665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        rsp.key_blob.key_material = dup_array(TEST_DATA);
1332665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        rsp.key_blob.key_material_size = array_length(TEST_DATA);
1342665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        rsp.enforced.Reinitialize(params, array_length(params));
1352665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
1362665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UniquePtr<GenerateKeyResponse> deserialized(round_trip(ver, rsp, 109));
1372665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(KM_ERROR_OK, deserialized->error);
1382665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(deserialized->enforced, rsp.enforced);
1392665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(deserialized->unenforced, rsp.unenforced);
1402665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
141da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
142128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
143da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, GenerateKeyResponseTestError) {
1442665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
1452665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        GenerateKeyResponse rsp(ver);
1462665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        rsp.error = KM_ERROR_UNSUPPORTED_ALGORITHM;
1472665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        rsp.key_blob.key_material = dup_array(TEST_DATA);
1482665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        rsp.key_blob.key_material_size = array_length(TEST_DATA);
1492665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        rsp.enforced.Reinitialize(params, array_length(params));
1502665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
1512665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UniquePtr<GenerateKeyResponse> deserialized(round_trip(ver, rsp, 4));
1522665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(KM_ERROR_UNSUPPORTED_ALGORITHM, deserialized->error);
1532665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0U, deserialized->enforced.size());
1542665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0U, deserialized->unenforced.size());
1552665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0U, deserialized->key_blob.key_material_size);
1562665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
157da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
158da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
159da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, GetKeyCharacteristicsRequest) {
1602665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
1612665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        GetKeyCharacteristicsRequest req(ver);
1622665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        req.additional_params.Reinitialize(params, array_length(params));
1632665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        req.SetKeyMaterial("foo", 3);
1642665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
1652665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UniquePtr<GetKeyCharacteristicsRequest> deserialized(round_trip(ver, req, 85));
1662665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(7U, deserialized->additional_params.size());
1672665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(3U, deserialized->key_blob.key_material_size);
1682665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0, memcmp(deserialized->key_blob.key_material, "foo", 3));
1692665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
170da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
171128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
172da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, GetKeyCharacteristicsResponse) {
1732665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
1742665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        GetKeyCharacteristicsResponse msg(ver);
1752665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.error = KM_ERROR_OK;
1762665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.enforced.Reinitialize(params, array_length(params));
1772665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.unenforced.Reinitialize(params, array_length(params));
1782665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
1792665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UniquePtr<GetKeyCharacteristicsResponse> deserialized(round_trip(ver, msg, 160));
1802665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(msg.enforced, deserialized->enforced);
1812665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(msg.unenforced, deserialized->unenforced);
1822665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
183da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
184da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
185da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, BeginOperationRequest) {
1862665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
1872665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        BeginOperationRequest msg(ver);
1882665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.purpose = KM_PURPOSE_SIGN;
1892665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.SetKeyMaterial("foo", 3);
1902665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.additional_params.Reinitialize(params, array_length(params));
1912665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
1922665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UniquePtr<BeginOperationRequest> deserialized(round_trip(ver, msg, 89));
1932665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(KM_PURPOSE_SIGN, deserialized->purpose);
1942665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(3U, deserialized->key_blob.key_material_size);
1952665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0, memcmp(deserialized->key_blob.key_material, "foo", 3));
1962665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(msg.additional_params, deserialized->additional_params);
1972665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
198da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
199da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
200da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, BeginOperationResponse) {
2012665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
2022665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        BeginOperationResponse msg(ver);
2032665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.error = KM_ERROR_OK;
2042665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.op_handle = 0xDEADBEEF;
2057b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden        msg.output_params.push_back(Authorization(TAG_NONCE, "foo", 3));
2067b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden
2077b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden        UniquePtr<BeginOperationResponse> deserialized;
2087b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden        switch (ver) {
2097b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden        case 0:
2107b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden            deserialized.reset(round_trip(ver, msg, 12));
2117b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden            break;
2127b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden        case 1:
2137b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden            deserialized.reset(round_trip(ver, msg, 39));
2147b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden            break;
2157b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden        default:
2167b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden            FAIL();
2177b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden        }
2182665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
2192665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(KM_ERROR_OK, deserialized->error);
2202665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0xDEADBEEF, deserialized->op_handle);
2217b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden
2227b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden        switch (ver) {
2237b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden        case 0:
224c609659a4b469778f523bece9ad0235fcfe6dd91Shawn Willden            EXPECT_EQ(0U, deserialized->output_params.size());
2257b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden            break;
2267b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden        case 1:
2277b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden            EXPECT_EQ(msg.output_params, deserialized->output_params);
2287b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden            break;
2297b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden        default:
2307b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden            FAIL();
2317b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden        }
2322665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
233da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
234da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
235da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, BeginOperationResponseError) {
2362665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
2372665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        BeginOperationResponse msg(ver);
2382665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.error = KM_ERROR_INVALID_OPERATION_HANDLE;
2392665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.op_handle = 0xDEADBEEF;
240da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
2412665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UniquePtr<BeginOperationResponse> deserialized(round_trip(ver, msg, 4));
2422665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, deserialized->error);
2432665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
244da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
245da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
246da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, UpdateOperationRequest) {
2472665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
2482665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UpdateOperationRequest msg(ver);
2492665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.op_handle = 0xDEADBEEF;
2502665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.input.Reinitialize("foo", 3);
2512665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
252ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden        UniquePtr<UpdateOperationRequest> deserialized;
253eb63b9799eadcaa6ef206f8b804d7432e0dab14aShawn Willden        switch (ver) {
254ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden        case 0:
255ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden            deserialized.reset(round_trip(ver, msg, 15));
256ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden            break;
257ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden        case 1:
258ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden            deserialized.reset(round_trip(ver, msg, 27));
259ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden            break;
260ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden        default:
261ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden            FAIL();
262ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden        }
2632665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(3U, deserialized->input.available_read());
2642665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0, memcmp(deserialized->input.peek_read(), "foo", 3));
2652665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
266da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
267da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
268da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, UpdateOperationResponse) {
2692665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
2702665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UpdateOperationResponse msg(ver);
2712665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.error = KM_ERROR_OK;
2722665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.output.Reinitialize("foo", 3);
273b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden        msg.input_consumed = 99;
274b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden
275b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden        UniquePtr<UpdateOperationResponse> deserialized;
276b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden        switch (ver) {
277b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden        case 0:
278b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden            deserialized.reset(round_trip(ver, msg, 11));
279b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden            break;
280b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden        case 1:
281b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden            deserialized.reset(round_trip(ver, msg, 15));
282b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden            break;
283b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden        default:
284b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden            FAIL();
285b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden        }
2862665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(KM_ERROR_OK, deserialized->error);
2872665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(3U, deserialized->output.available_read());
2882665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0, memcmp(deserialized->output.peek_read(), "foo", 3));
289b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden
290b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden        switch (ver) {
291b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden        case 0:
292c609659a4b469778f523bece9ad0235fcfe6dd91Shawn Willden            EXPECT_EQ(0U, deserialized->input_consumed);
293b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden            break;
294b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden        case 1:
295c609659a4b469778f523bece9ad0235fcfe6dd91Shawn Willden            EXPECT_EQ(99U, deserialized->input_consumed);
296b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden            break;
297b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden        default:
298b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden            FAIL();
299b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden        }
3002665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
301da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
302da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
303da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, FinishOperationRequest) {
3042665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
3052665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        FinishOperationRequest msg(ver);
3062665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.op_handle = 0xDEADBEEF;
3072665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.signature.Reinitialize("bar", 3);
3082665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
309ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden        UniquePtr<FinishOperationRequest> deserialized;
310eb63b9799eadcaa6ef206f8b804d7432e0dab14aShawn Willden        switch (ver) {
311ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden        case 0:
312ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden            deserialized.reset(round_trip(ver, msg, 15));
313ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden            break;
314ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden        case 1:
315ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden            deserialized.reset(round_trip(ver, msg, 27));
316ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden            break;
317ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden        default:
318ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden            FAIL();
319ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden        }
3202665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0xDEADBEEF, deserialized->op_handle);
3212665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(3U, deserialized->signature.available_read());
3222665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0, memcmp(deserialized->signature.peek_read(), "bar", 3));
3232665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
324da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
325da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
326da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(Round_Trip, FinishOperationResponse) {
3272665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
3282665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        FinishOperationResponse msg(ver);
3292665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.error = KM_ERROR_OK;
3302665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.output.Reinitialize("foo", 3);
3312665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
3322665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UniquePtr<FinishOperationResponse> deserialized(round_trip(ver, msg, 11));
3332665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(msg.error, deserialized->error);
3342665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(msg.output.available_read(), deserialized->output.available_read());
3352665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0, memcmp(msg.output.peek_read(), deserialized->output.peek_read(),
3362665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden                            msg.output.available_read()));
3372665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
338da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
339da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
340da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, ImportKeyRequest) {
3412665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
3422665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        ImportKeyRequest msg(ver);
3432665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.key_description.Reinitialize(params, array_length(params));
3442665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.key_format = KM_KEY_FORMAT_X509;
3452665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.SetKeyMaterial("foo", 3);
3462665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
3472665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UniquePtr<ImportKeyRequest> deserialized(round_trip(ver, msg, 89));
3482665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(msg.key_description, deserialized->key_description);
3492665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(msg.key_format, deserialized->key_format);
3502665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(msg.key_data_length, deserialized->key_data_length);
3512665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0, memcmp(msg.key_data, deserialized->key_data, msg.key_data_length));
3522665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
353da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
354da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
355da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, ImportKeyResponse) {
3562665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
3572665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        ImportKeyResponse msg(ver);
3582665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.error = KM_ERROR_OK;
3592665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.SetKeyMaterial("foo", 3);
3602665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.enforced.Reinitialize(params, array_length(params));
3612665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.unenforced.Reinitialize(params, array_length(params));
3622665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
3632665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UniquePtr<ImportKeyResponse> deserialized(round_trip(ver, msg, 167));
3642665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(msg.error, deserialized->error);
3652665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(msg.key_blob.key_material_size, deserialized->key_blob.key_material_size);
3662665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0, memcmp(msg.key_blob.key_material, deserialized->key_blob.key_material,
3672665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden                            msg.key_blob.key_material_size));
3682665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(msg.enforced, deserialized->enforced);
3692665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(msg.unenforced, deserialized->unenforced);
3702665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
371da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
372da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
373da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, ExportKeyRequest) {
3742665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
3752665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        ExportKeyRequest msg(ver);
3762665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.additional_params.Reinitialize(params, array_length(params));
3772665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.key_format = KM_KEY_FORMAT_X509;
3782665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.SetKeyMaterial("foo", 3);
3792665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
3802665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UniquePtr<ExportKeyRequest> deserialized(round_trip(ver, msg, 89));
3812665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(msg.additional_params, deserialized->additional_params);
3822665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(msg.key_format, deserialized->key_format);
3832665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(3U, deserialized->key_blob.key_material_size);
3842665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0, memcmp("foo", deserialized->key_blob.key_material, 3));
3852665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
386da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
387da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
388da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, ExportKeyResponse) {
3892665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
3902665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        ExportKeyResponse msg(ver);
3912665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.error = KM_ERROR_OK;
3922665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.SetKeyMaterial("foo", 3);
3932665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
3942665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UniquePtr<ExportKeyResponse> deserialized(round_trip(ver, msg, 11));
3952665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(3U, deserialized->key_data_length);
3962665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0, memcmp("foo", deserialized->key_data, 3));
3972665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
3982665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden}
3992665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
4002665e868b1153cb89ad7cd906ae160cb417d4438Shawn WilldenTEST(RoundTrip, GetVersionRequest) {
4012665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    GetVersionRequest msg;
4022665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
4032665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    size_t size = msg.SerializedSize();
404c609659a4b469778f523bece9ad0235fcfe6dd91Shawn Willden    ASSERT_EQ(0U, size);
4052665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
4062665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    UniquePtr<uint8_t[]> buf(new uint8_t[size]);
4072665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    EXPECT_EQ(buf.get() + size, msg.Serialize(buf.get(), buf.get() + size));
4082665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
4092665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    GetVersionRequest deserialized;
4102665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    const uint8_t* p = buf.get();
4112665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    EXPECT_TRUE(deserialized.Deserialize(&p, p + size));
4122665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    EXPECT_EQ((ptrdiff_t)size, p - buf.get());
4132665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden}
4142665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
4152665e868b1153cb89ad7cd906ae160cb417d4438Shawn WilldenTEST(RoundTrip, GetVersionResponse) {
4162665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    GetVersionResponse msg;
417da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.error = KM_ERROR_OK;
4182665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    msg.major_ver = 9;
4192665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    msg.minor_ver = 98;
4202665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    msg.subminor_ver = 38;
4212665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
4222665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    size_t size = msg.SerializedSize();
423c609659a4b469778f523bece9ad0235fcfe6dd91Shawn Willden    ASSERT_EQ(7U, size);
424da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
4252665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    UniquePtr<uint8_t[]> buf(new uint8_t[size]);
4262665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    EXPECT_EQ(buf.get() + size, msg.Serialize(buf.get(), buf.get() + size));
4272665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
4282665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    GetVersionResponse deserialized;
4292665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    const uint8_t* p = buf.get();
4302665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    EXPECT_TRUE(deserialized.Deserialize(&p, p + size));
4312665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    EXPECT_EQ((ptrdiff_t)size, p - buf.get());
432c609659a4b469778f523bece9ad0235fcfe6dd91Shawn Willden    EXPECT_EQ(9U, msg.major_ver);
433c609659a4b469778f523bece9ad0235fcfe6dd91Shawn Willden    EXPECT_EQ(98U, msg.minor_ver);
434c609659a4b469778f523bece9ad0235fcfe6dd91Shawn Willden    EXPECT_EQ(38U, msg.subminor_ver);
435128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden}
436128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
437cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn WilldenTEST(RoundTrip, AddEntropyRequest) {
438cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
439cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden        AddEntropyRequest msg(ver);
440cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden        msg.random_data.Reinitialize("foo", 3);
441cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden
442cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden        UniquePtr<AddEntropyRequest> deserialized(round_trip(ver, msg, 7));
443cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden        EXPECT_EQ(3U, deserialized->random_data.available_read());
444cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden        EXPECT_EQ(0, memcmp("foo", deserialized->random_data.peek_read(), 3));
445cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden    }
446cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden}
447cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden
448f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willdenuint8_t msgbuf[] = {
449f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    220, 88,  183, 255, 71,  1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
450f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    0,   173, 0,   0,   0,   228, 174, 98,  187, 191, 135, 253, 200, 51,  230, 114, 247, 151, 109,
451f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    237, 79,  87,  32,  94,  5,   204, 46,  154, 30,  91,  6,   103, 148, 254, 129, 65,  171, 228,
452f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    167, 224, 163, 9,   15,  206, 90,  58,  11,  205, 55,  211, 33,  87,  178, 149, 91,  28,  236,
453f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    218, 112, 231, 34,  82,  82,  134, 103, 137, 115, 27,  156, 102, 159, 220, 226, 89,  42,  25,
454f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    37,  9,   84,  239, 76,  161, 198, 72,  167, 163, 39,  91,  148, 191, 17,  191, 87,  169, 179,
455f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    136, 10,  194, 154, 4,   40,  107, 109, 61,  161, 20,  176, 247, 13,  214, 106, 229, 45,  17,
456f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    5,   60,  189, 64,  39,  166, 208, 14,  57,  25,  140, 148, 25,  177, 246, 189, 43,  181, 88,
457f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    204, 29,  126, 224, 100, 143, 93,  60,  57,  249, 55,  0,   87,  83,  227, 224, 166, 59,  214,
458f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    81,  144, 129, 58,  6,   57,  46,  254, 232, 41,  220, 209, 230, 167, 138, 158, 94,  180, 125,
459f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    247, 26,  162, 116, 238, 202, 187, 100, 65,  13,  180, 44,  245, 159, 83,  161, 176, 58,  72,
460f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    236, 109, 105, 160, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
461f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    0,   11,  0,   0,   0,   98,  0,   0,   0,   1,   0,   0,   32,  2,   0,   0,   0,   1,   0,
462f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    0,   32,  3,   0,   0,   0,   2,   0,   0,   16,  1,   0,   0,   0,   3,   0,   0,   48,  0,
463f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    1,   0,   0,   200, 0,   0,   80,  3,   0,   0,   0,   0,   0,   0,   0,   244, 1,   0,   112,
464f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    1,   246, 1,   0,   112, 1,   189, 2,   0,   96,  144, 178, 236, 250, 255, 255, 255, 255, 145,
465f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    1,   0,   96,  144, 226, 33,  60,  222, 2,   0,   0,   189, 2,   0,   96,  0,   0,   0,   0,
466f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    0,   0,   0,   0,   190, 2,   0,   16,  1,   0,   0,   0,   12,  0,   0,   0,   0,   0,   0,
467f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    0,   0,   0,   0,   0,   0,   0,   0,   0,   110, 0,   0,   0,   0,   0,   0,   0,   11,  0,
468f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    0,   0,   98,  0,   0,   0,   1,   0,   0,   32,  2,   0,   0,   0,   1,   0,   0,   32,  3,
469f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    0,   0,   0,   2,   0,   0,   16,  1,   0,   0,   0,   3,   0,   0,   48,  0,   1,   0,   0,
470f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    200, 0,   0,   80,  3,   0,   0,   0,   0,   0,   0,   0,   244, 1,   0,   112, 1,   246, 1,
471f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    0,   112, 1,   189, 2,   0,   96,  144, 178, 236, 250, 255, 255, 255, 255, 145, 1,   0,   96,
472f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    144, 226, 33,  60,  222, 2,   0,   0,   189, 2,   0,   96,  0,   0,   0,   0,   0,   0,   0,
473f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    0,   190, 2,   0,   16,  1,   0,   0,   0,
474f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden};
475f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden
476f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden/*
477f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden * These tests don't have any assertions or expectations. They just try to parse garbage, to see if
478f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden * the result will be a crash.  This is especially informative when run under Valgrind memcheck.
479f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden */
480f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden
481f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willdentemplate <typename Message> void parse_garbage() {
4822665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int32_t ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
4832665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        Message msg(ver);
4842665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        const uint8_t* end = msgbuf + array_length(msgbuf);
4852665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        for (size_t i = 0; i < array_length(msgbuf); ++i) {
4862665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden            const uint8_t* begin = msgbuf + i;
4872665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden            const uint8_t* p = begin;
4882665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden            msg.Deserialize(&p, end);
4892665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        }
490f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    }
491f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden}
492f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden
493f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden#define GARBAGE_TEST(Message)                                                                      \
494f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    TEST(GarbageTest, Message) { parse_garbage<Message>(); }
495f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden
496f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(SupportedAlgorithmsResponse)
497f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(GenerateKeyRequest);
498f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(GenerateKeyResponse);
499f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(GetKeyCharacteristicsRequest);
500f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(GetKeyCharacteristicsResponse);
501f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(BeginOperationRequest);
502f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(BeginOperationResponse);
503f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(UpdateOperationRequest);
504f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(UpdateOperationResponse);
505f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(FinishOperationRequest);
506f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(FinishOperationResponse);
507cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn WilldenGARBAGE_TEST(AddEntropyRequest);
508f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(ImportKeyRequest);
509f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(ImportKeyResponse);
510f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(ExportKeyRequest);
511f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(ExportKeyResponse);
512f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden
513f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden// The macro doesn't work on this one.
514f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenTEST(GarbageTest, SupportedResponse) {
515f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    parse_garbage<SupportedResponse<keymaster_digest_t>>();
516f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden}
517f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden
518128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden}  // namespace test
5192665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
520128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden}  // namespace keymaster
521