android_keymaster_messages_test.cpp revision ba5e94d2261db449747c37ffee34e85218c5cd6a
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>
2298d9b92547a9a7553b99e3e941a4175926f95b62Shawn Willden#include <keymaster/google_keymaster_utils.h>
2398d9b92547a9a7553b99e3e941a4175926f95b62Shawn Willden
24da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden#include "google_keymaster_test_utils.h"
25128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden#include "google_softkeymaster.h"
26128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
27128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willdenint main(int argc, char** argv) {
28128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    ::testing::InitGoogleTest(&argc, argv);
29128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    int result = RUN_ALL_TESTS();
30128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    return result;
31128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden}
32128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
33128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willdennamespace keymaster {
34128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willdennamespace test {
35128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
36da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden/**
37da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden * Serialize and deserialize a message.
38da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden */
392665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willdentemplate <typename Message>
402665e868b1153cb89ad7cd906ae160cb417d4438Shawn WilldenMessage* round_trip(int32_t ver, const Message& message, size_t expected_size) {
41da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    size_t size = message.SerializedSize();
42da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(expected_size, size);
43da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    if (size == 0)
44da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden        return NULL;
45128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
46128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    UniquePtr<uint8_t[]> buf(new uint8_t[size]);
47da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(buf.get() + size, message.Serialize(buf.get(), buf.get() + size));
48128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
492665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    Message* deserialized = new Message(ver);
5058e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden    const uint8_t* p = buf.get();
51da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_TRUE(deserialized->Deserialize(&p, p + size));
52da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ((ptrdiff_t)size, p - buf.get());
53da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    return deserialized;
54da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
55da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
562665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willdenstruct EmptyKeymasterResponse : public KeymasterResponse {
572665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    EmptyKeymasterResponse(int32_t ver) : KeymasterResponse(ver) {}
58da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    size_t NonErrorSerializedSize() const { return 1; }
59da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    uint8_t* NonErrorSerialize(uint8_t* buf, const uint8_t* /* end */) const {
60da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden        *buf++ = 0;
61da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden        return buf;
62da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    }
63da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    bool NonErrorDeserialize(const uint8_t** buf_ptr, const uint8_t* end) {
64da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden        if (*buf_ptr >= end)
65da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden            return false;
66da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden        EXPECT_EQ(0, **buf_ptr);
67da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden        (*buf_ptr)++;
68da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden        return true;
69da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    }
70da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden};
71da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
72da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, EmptyKeymasterResponse) {
732665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
742665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EmptyKeymasterResponse msg(ver);
752665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.error = KM_ERROR_OK;
76da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
772665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UniquePtr<EmptyKeymasterResponse> deserialized(round_trip(ver, msg, 5));
782665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
79da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
80da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
81da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, EmptyKeymasterResponseError) {
822665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
832665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EmptyKeymasterResponse msg(ver);
842665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.error = KM_ERROR_MEMORY_ALLOCATION_FAILED;
85da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
862665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UniquePtr<EmptyKeymasterResponse> deserialized(round_trip(ver, msg, 4));
872665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
88da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
89da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
90da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, SupportedAlgorithmsResponse) {
912665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
922665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        SupportedAlgorithmsResponse rsp(ver);
932665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        keymaster_algorithm_t algorithms[] = {KM_ALGORITHM_RSA, KM_ALGORITHM_DSA,
942665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden                                              KM_ALGORITHM_ECDSA};
952665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        rsp.error = KM_ERROR_OK;
962665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        rsp.algorithms = dup_array(algorithms);
972665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        rsp.algorithms_length = array_length(algorithms);
982665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
992665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UniquePtr<SupportedAlgorithmsResponse> deserialized(round_trip(ver, rsp, 20));
1002665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(array_length(algorithms), deserialized->algorithms_length);
1012665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0, memcmp(deserialized->algorithms, algorithms, array_size(algorithms)));
1022665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
103128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden}
104128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
105da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, SupportedResponse) {
1062665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
1072665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        SupportedResponse<keymaster_digest_t> rsp(ver);
1082665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        keymaster_digest_t digests[] = {KM_DIGEST_NONE, KM_DIGEST_MD5, KM_DIGEST_SHA1};
1092665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        rsp.error = KM_ERROR_OK;
1102665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        rsp.SetResults(digests);
1112665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
1122665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UniquePtr<SupportedResponse<keymaster_digest_t>> deserialized(round_trip(ver, rsp, 20));
1132665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(array_length(digests), deserialized->results_length);
1142665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0, memcmp(deserialized->results, digests, array_size(digests)));
1152665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
116da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
117da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
118da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willdenstatic keymaster_key_param_t params[] = {
1192665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
120da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA), Authorization(TAG_USER_ID, 7),
1212665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    Authorization(TAG_USER_AUTH_ID, 8), Authorization(TAG_APPLICATION_ID, "app_id", 6),
122da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    Authorization(TAG_AUTH_TIMEOUT, 300),
123da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden};
124128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willdenuint8_t TEST_DATA[] = "a key blob";
125128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
126da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, GenerateKeyRequest) {
1272665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
1282665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        GenerateKeyRequest req(ver);
1292665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        req.key_description.Reinitialize(params, array_length(params));
1302665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UniquePtr<GenerateKeyRequest> deserialized(round_trip(ver, req, 78));
1312665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(deserialized->key_description, req.key_description);
1322665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
133da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
134da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
135da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, GenerateKeyResponse) {
1362665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
1372665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        GenerateKeyResponse rsp(ver);
1382665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        rsp.error = KM_ERROR_OK;
1392665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        rsp.key_blob.key_material = dup_array(TEST_DATA);
1402665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        rsp.key_blob.key_material_size = array_length(TEST_DATA);
1412665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        rsp.enforced.Reinitialize(params, array_length(params));
1422665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
1432665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UniquePtr<GenerateKeyResponse> deserialized(round_trip(ver, rsp, 109));
1442665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(KM_ERROR_OK, deserialized->error);
1452665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(deserialized->enforced, rsp.enforced);
1462665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(deserialized->unenforced, rsp.unenforced);
1472665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
148da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
149128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
150da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, GenerateKeyResponseTestError) {
1512665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
1522665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        GenerateKeyResponse rsp(ver);
1532665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        rsp.error = KM_ERROR_UNSUPPORTED_ALGORITHM;
1542665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        rsp.key_blob.key_material = dup_array(TEST_DATA);
1552665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        rsp.key_blob.key_material_size = array_length(TEST_DATA);
1562665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        rsp.enforced.Reinitialize(params, array_length(params));
1572665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
1582665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UniquePtr<GenerateKeyResponse> deserialized(round_trip(ver, rsp, 4));
1592665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(KM_ERROR_UNSUPPORTED_ALGORITHM, deserialized->error);
1602665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0U, deserialized->enforced.size());
1612665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0U, deserialized->unenforced.size());
1622665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0U, deserialized->key_blob.key_material_size);
1632665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
164da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
165da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
166da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, GetKeyCharacteristicsRequest) {
1672665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
1682665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        GetKeyCharacteristicsRequest req(ver);
1692665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        req.additional_params.Reinitialize(params, array_length(params));
1702665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        req.SetKeyMaterial("foo", 3);
1712665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
1722665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UniquePtr<GetKeyCharacteristicsRequest> deserialized(round_trip(ver, req, 85));
1732665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(7U, deserialized->additional_params.size());
1742665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(3U, deserialized->key_blob.key_material_size);
1752665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0, memcmp(deserialized->key_blob.key_material, "foo", 3));
1762665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
177da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
178128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
179da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, GetKeyCharacteristicsResponse) {
1802665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
1812665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        GetKeyCharacteristicsResponse msg(ver);
1822665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.error = KM_ERROR_OK;
1832665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.enforced.Reinitialize(params, array_length(params));
1842665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.unenforced.Reinitialize(params, array_length(params));
1852665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
1862665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UniquePtr<GetKeyCharacteristicsResponse> deserialized(round_trip(ver, msg, 160));
1872665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(msg.enforced, deserialized->enforced);
1882665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(msg.unenforced, deserialized->unenforced);
1892665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
190da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
191da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
192da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, BeginOperationRequest) {
1932665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
1942665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        BeginOperationRequest msg(ver);
1952665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.purpose = KM_PURPOSE_SIGN;
1962665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.SetKeyMaterial("foo", 3);
1972665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.additional_params.Reinitialize(params, array_length(params));
1982665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
1992665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UniquePtr<BeginOperationRequest> deserialized(round_trip(ver, msg, 89));
2002665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(KM_PURPOSE_SIGN, deserialized->purpose);
2012665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(3U, deserialized->key_blob.key_material_size);
2022665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0, memcmp(deserialized->key_blob.key_material, "foo", 3));
2032665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(msg.additional_params, deserialized->additional_params);
2042665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
205da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
206da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
207da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, BeginOperationResponse) {
2082665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
2092665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        BeginOperationResponse msg(ver);
2102665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.error = KM_ERROR_OK;
2112665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.op_handle = 0xDEADBEEF;
2127b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden        msg.output_params.push_back(Authorization(TAG_NONCE, "foo", 3));
2137b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden
2147b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden        UniquePtr<BeginOperationResponse> deserialized;
2157b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden        switch (ver) {
2167b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden        case 0:
2177b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden            deserialized.reset(round_trip(ver, msg, 12));
2187b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden            break;
2197b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden        case 1:
2207b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden            deserialized.reset(round_trip(ver, msg, 39));
2217b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden            break;
2227b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden        default:
2237b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden            FAIL();
2247b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden        }
2252665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
2262665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(KM_ERROR_OK, deserialized->error);
2272665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0xDEADBEEF, deserialized->op_handle);
2287b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden
2297b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden        switch (ver) {
2307b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden        case 0:
2317b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden            EXPECT_EQ(0, deserialized->output_params.size());
2327b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden            break;
2337b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden        case 1:
2347b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden            EXPECT_EQ(msg.output_params, deserialized->output_params);
2357b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden            break;
2367b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden        default:
2377b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden            FAIL();
2387b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden        }
2392665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
240da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
241da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
242da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, BeginOperationResponseError) {
2432665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
2442665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        BeginOperationResponse msg(ver);
2452665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.error = KM_ERROR_INVALID_OPERATION_HANDLE;
2462665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.op_handle = 0xDEADBEEF;
247da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
2482665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UniquePtr<BeginOperationResponse> deserialized(round_trip(ver, msg, 4));
2492665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, deserialized->error);
2502665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
251da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
252da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
253da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, UpdateOperationRequest) {
2542665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
2552665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UpdateOperationRequest msg(ver);
2562665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.op_handle = 0xDEADBEEF;
2572665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.input.Reinitialize("foo", 3);
2582665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
259ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden        UniquePtr<UpdateOperationRequest> deserialized;
260ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden        switch(ver) {
261ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden        case 0:
262ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden            deserialized.reset(round_trip(ver, msg, 15));
263ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden            break;
264ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden        case 1:
265ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden            deserialized.reset(round_trip(ver, msg, 27));
266ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden            break;
267ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden        default:
268ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden            FAIL();
269ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden        }
2702665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(3U, deserialized->input.available_read());
2712665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0, memcmp(deserialized->input.peek_read(), "foo", 3));
2722665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
273da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
274da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
275da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, UpdateOperationResponse) {
2762665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
2772665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UpdateOperationResponse msg(ver);
2782665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.error = KM_ERROR_OK;
2792665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.output.Reinitialize("foo", 3);
280b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden        msg.input_consumed = 99;
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;
290b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden        default:
291b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden            FAIL();
292b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden        }
2932665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(KM_ERROR_OK, deserialized->error);
2942665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(3U, deserialized->output.available_read());
2952665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0, memcmp(deserialized->output.peek_read(), "foo", 3));
296b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden
297b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden        switch (ver) {
298b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden        case 0:
299b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden            EXPECT_EQ(0, deserialized->input_consumed);
300b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden            break;
301b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden        case 1:
302b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden            EXPECT_EQ(99, deserialized->input_consumed);
303b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden            break;
304b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden        default:
305b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden            FAIL();
306b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden        }
3072665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
308da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
309da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
310da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, FinishOperationRequest) {
3112665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
3122665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        FinishOperationRequest msg(ver);
3132665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.op_handle = 0xDEADBEEF;
3142665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.signature.Reinitialize("bar", 3);
3152665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
316ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden        UniquePtr<FinishOperationRequest> deserialized;
317ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden        switch(ver) {
318ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden        case 0:
319ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden            deserialized.reset(round_trip(ver, msg, 15));
320ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden            break;
321ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden        case 1:
322ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden            deserialized.reset(round_trip(ver, msg, 27));
323ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden            break;
324ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden        default:
325ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden            FAIL();
326ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden        }
3272665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0xDEADBEEF, deserialized->op_handle);
3282665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(3U, deserialized->signature.available_read());
3292665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0, memcmp(deserialized->signature.peek_read(), "bar", 3));
3302665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
331da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
332da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
333da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(Round_Trip, FinishOperationResponse) {
3342665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
3352665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        FinishOperationResponse msg(ver);
3362665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.error = KM_ERROR_OK;
3372665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.output.Reinitialize("foo", 3);
3382665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
3392665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UniquePtr<FinishOperationResponse> deserialized(round_trip(ver, msg, 11));
3402665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(msg.error, deserialized->error);
3412665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(msg.output.available_read(), deserialized->output.available_read());
3422665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0, memcmp(msg.output.peek_read(), deserialized->output.peek_read(),
3432665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden                            msg.output.available_read()));
3442665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
345da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
346da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
347da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, ImportKeyRequest) {
3482665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
3492665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        ImportKeyRequest msg(ver);
3502665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.key_description.Reinitialize(params, array_length(params));
3512665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.key_format = KM_KEY_FORMAT_X509;
3522665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.SetKeyMaterial("foo", 3);
3532665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
3542665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UniquePtr<ImportKeyRequest> deserialized(round_trip(ver, msg, 89));
3552665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(msg.key_description, deserialized->key_description);
3562665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(msg.key_format, deserialized->key_format);
3572665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(msg.key_data_length, deserialized->key_data_length);
3582665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0, memcmp(msg.key_data, deserialized->key_data, msg.key_data_length));
3592665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
360da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
361da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
362da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, ImportKeyResponse) {
3632665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
3642665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        ImportKeyResponse msg(ver);
3652665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.error = KM_ERROR_OK;
3662665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.SetKeyMaterial("foo", 3);
3672665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.enforced.Reinitialize(params, array_length(params));
3682665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.unenforced.Reinitialize(params, array_length(params));
3692665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
3702665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UniquePtr<ImportKeyResponse> deserialized(round_trip(ver, msg, 167));
3712665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(msg.error, deserialized->error);
3722665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(msg.key_blob.key_material_size, deserialized->key_blob.key_material_size);
3732665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0, memcmp(msg.key_blob.key_material, deserialized->key_blob.key_material,
3742665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden                            msg.key_blob.key_material_size));
3752665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(msg.enforced, deserialized->enforced);
3762665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(msg.unenforced, deserialized->unenforced);
3772665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
378da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
379da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
380da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, ExportKeyRequest) {
3812665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
3822665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        ExportKeyRequest msg(ver);
3832665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.additional_params.Reinitialize(params, array_length(params));
3842665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.key_format = KM_KEY_FORMAT_X509;
3852665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.SetKeyMaterial("foo", 3);
3862665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
3872665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UniquePtr<ExportKeyRequest> deserialized(round_trip(ver, msg, 89));
3882665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(msg.additional_params, deserialized->additional_params);
3892665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(msg.key_format, deserialized->key_format);
3902665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(3U, deserialized->key_blob.key_material_size);
3912665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0, memcmp("foo", deserialized->key_blob.key_material, 3));
3922665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
393da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
394da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
395da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, ExportKeyResponse) {
3962665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
3972665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        ExportKeyResponse msg(ver);
3982665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.error = KM_ERROR_OK;
3992665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        msg.SetKeyMaterial("foo", 3);
4002665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
4012665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        UniquePtr<ExportKeyResponse> deserialized(round_trip(ver, msg, 11));
4022665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(3U, deserialized->key_data_length);
4032665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        EXPECT_EQ(0, memcmp("foo", deserialized->key_data, 3));
4042665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    }
4052665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden}
4062665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
4072665e868b1153cb89ad7cd906ae160cb417d4438Shawn WilldenTEST(RoundTrip, GetVersionRequest) {
4082665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    GetVersionRequest msg;
4092665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
4102665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    size_t size = msg.SerializedSize();
4112665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    ASSERT_EQ(0, size);
4122665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
4132665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    UniquePtr<uint8_t[]> buf(new uint8_t[size]);
4142665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    EXPECT_EQ(buf.get() + size, msg.Serialize(buf.get(), buf.get() + size));
4152665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
4162665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    GetVersionRequest deserialized;
4172665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    const uint8_t* p = buf.get();
4182665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    EXPECT_TRUE(deserialized.Deserialize(&p, p + size));
4192665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    EXPECT_EQ((ptrdiff_t)size, p - buf.get());
4202665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden}
4212665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
4222665e868b1153cb89ad7cd906ae160cb417d4438Shawn WilldenTEST(RoundTrip, GetVersionResponse) {
4232665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    GetVersionResponse msg;
424da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.error = KM_ERROR_OK;
4252665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    msg.major_ver = 9;
4262665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    msg.minor_ver = 98;
4272665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    msg.subminor_ver = 38;
4282665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
4292665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    size_t size = msg.SerializedSize();
4302665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    ASSERT_EQ(7, size);
431da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
4322665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    UniquePtr<uint8_t[]> buf(new uint8_t[size]);
4332665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    EXPECT_EQ(buf.get() + size, msg.Serialize(buf.get(), buf.get() + size));
4342665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
4352665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    GetVersionResponse deserialized;
4362665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    const uint8_t* p = buf.get();
4372665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    EXPECT_TRUE(deserialized.Deserialize(&p, p + size));
4382665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    EXPECT_EQ((ptrdiff_t)size, p - buf.get());
4392665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    EXPECT_EQ(9, msg.major_ver);
4402665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    EXPECT_EQ(98, msg.minor_ver);
4412665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    EXPECT_EQ(38, msg.subminor_ver);
442128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden}
443128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
444f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willdenuint8_t msgbuf[] = {
445f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    220, 88,  183, 255, 71,  1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
446f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    0,   173, 0,   0,   0,   228, 174, 98,  187, 191, 135, 253, 200, 51,  230, 114, 247, 151, 109,
447f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    237, 79,  87,  32,  94,  5,   204, 46,  154, 30,  91,  6,   103, 148, 254, 129, 65,  171, 228,
448f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    167, 224, 163, 9,   15,  206, 90,  58,  11,  205, 55,  211, 33,  87,  178, 149, 91,  28,  236,
449f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    218, 112, 231, 34,  82,  82,  134, 103, 137, 115, 27,  156, 102, 159, 220, 226, 89,  42,  25,
450f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    37,  9,   84,  239, 76,  161, 198, 72,  167, 163, 39,  91,  148, 191, 17,  191, 87,  169, 179,
451f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    136, 10,  194, 154, 4,   40,  107, 109, 61,  161, 20,  176, 247, 13,  214, 106, 229, 45,  17,
452f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    5,   60,  189, 64,  39,  166, 208, 14,  57,  25,  140, 148, 25,  177, 246, 189, 43,  181, 88,
453f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    204, 29,  126, 224, 100, 143, 93,  60,  57,  249, 55,  0,   87,  83,  227, 224, 166, 59,  214,
454f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    81,  144, 129, 58,  6,   57,  46,  254, 232, 41,  220, 209, 230, 167, 138, 158, 94,  180, 125,
455f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    247, 26,  162, 116, 238, 202, 187, 100, 65,  13,  180, 44,  245, 159, 83,  161, 176, 58,  72,
456f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    236, 109, 105, 160, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
457f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    0,   11,  0,   0,   0,   98,  0,   0,   0,   1,   0,   0,   32,  2,   0,   0,   0,   1,   0,
458f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    0,   32,  3,   0,   0,   0,   2,   0,   0,   16,  1,   0,   0,   0,   3,   0,   0,   48,  0,
459f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    1,   0,   0,   200, 0,   0,   80,  3,   0,   0,   0,   0,   0,   0,   0,   244, 1,   0,   112,
460f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    1,   246, 1,   0,   112, 1,   189, 2,   0,   96,  144, 178, 236, 250, 255, 255, 255, 255, 145,
461f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    1,   0,   96,  144, 226, 33,  60,  222, 2,   0,   0,   189, 2,   0,   96,  0,   0,   0,   0,
462f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    0,   0,   0,   0,   190, 2,   0,   16,  1,   0,   0,   0,   12,  0,   0,   0,   0,   0,   0,
463f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    0,   0,   0,   0,   0,   0,   0,   0,   0,   110, 0,   0,   0,   0,   0,   0,   0,   11,  0,
464f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    0,   0,   98,  0,   0,   0,   1,   0,   0,   32,  2,   0,   0,   0,   1,   0,   0,   32,  3,
465f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    0,   0,   0,   2,   0,   0,   16,  1,   0,   0,   0,   3,   0,   0,   48,  0,   1,   0,   0,
466f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    200, 0,   0,   80,  3,   0,   0,   0,   0,   0,   0,   0,   244, 1,   0,   112, 1,   246, 1,
467f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    0,   112, 1,   189, 2,   0,   96,  144, 178, 236, 250, 255, 255, 255, 255, 145, 1,   0,   96,
468f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    144, 226, 33,  60,  222, 2,   0,   0,   189, 2,   0,   96,  0,   0,   0,   0,   0,   0,   0,
469f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    0,   190, 2,   0,   16,  1,   0,   0,   0,
470f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden};
471f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden
472f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden/*
473f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden * These tests don't have any assertions or expectations. They just try to parse garbage, to see if
474f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden * the result will be a crash.  This is especially informative when run under Valgrind memcheck.
475f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden */
476f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden
477f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willdentemplate <typename Message> void parse_garbage() {
4782665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden    for (int32_t ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
4792665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        Message msg(ver);
4802665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        const uint8_t* end = msgbuf + array_length(msgbuf);
4812665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        for (size_t i = 0; i < array_length(msgbuf); ++i) {
4822665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden            const uint8_t* begin = msgbuf + i;
4832665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden            const uint8_t* p = begin;
4842665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden            msg.Deserialize(&p, end);
4852665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden        }
486f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    }
487f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden}
488f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden
489f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden#define GARBAGE_TEST(Message)                                                                      \
490f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    TEST(GarbageTest, Message) { parse_garbage<Message>(); }
491f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden
492f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(SupportedAlgorithmsResponse)
493f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(GenerateKeyRequest);
494f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(GenerateKeyResponse);
495f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(GetKeyCharacteristicsRequest);
496f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(GetKeyCharacteristicsResponse);
497f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(BeginOperationRequest);
498f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(BeginOperationResponse);
499f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(UpdateOperationRequest);
500f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(UpdateOperationResponse);
501f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(FinishOperationRequest);
502f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(FinishOperationResponse);
503f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden// GARBAGE_TEST(AddEntropyRequest);
504f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(ImportKeyRequest);
505f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(ImportKeyResponse);
506f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(ExportKeyRequest);
507f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(ExportKeyResponse);
508f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden// GARBAGE_TEST(RescopeRequest);
509f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden// GARBAGE_TEST(RescopeResponse);
510f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden
511f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden// The macro doesn't work on this one.
512f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenTEST(GarbageTest, SupportedResponse) {
513f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    parse_garbage<SupportedResponse<keymaster_digest_t>>();
514f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden}
515f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden
516128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden}  // namespace test
5172665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden
518128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden}  // namespace keymaster
519