android_keymaster_messages_test.cpp revision 98d9b92547a9a7553b99e3e941a4175926f95b62
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 */
39da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willdentemplate <typename Message> Message* round_trip(const Message& message, size_t expected_size) {
40da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    size_t size = message.SerializedSize();
41da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(expected_size, size);
42da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    if (size == 0)
43da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden        return NULL;
44128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
45128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    UniquePtr<uint8_t[]> buf(new uint8_t[size]);
46da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(buf.get() + size, message.Serialize(buf.get(), buf.get() + size));
47128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
48da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    Message* deserialized = new Message;
4958e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden    const uint8_t* p = buf.get();
50da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_TRUE(deserialized->Deserialize(&p, p + size));
51da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ((ptrdiff_t)size, p - buf.get());
52da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    return deserialized;
53da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
54da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
55da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willdenclass EmptyKeymasterResponse : public KeymasterResponse {
56da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    size_t NonErrorSerializedSize() const { return 1; }
57da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    uint8_t* NonErrorSerialize(uint8_t* buf, const uint8_t* /* end */) const {
58da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden        *buf++ = 0;
59da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden        return buf;
60da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    }
61da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    bool NonErrorDeserialize(const uint8_t** buf_ptr, const uint8_t* end) {
62da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden        if (*buf_ptr >= end)
63da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden            return false;
64da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden        EXPECT_EQ(0, **buf_ptr);
65da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden        (*buf_ptr)++;
66da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden        return true;
67da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    }
68da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden};
69da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
70da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, EmptyKeymasterResponse) {
71da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EmptyKeymasterResponse msg;
72da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.error = KM_ERROR_OK;
73da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
74da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    UniquePtr<EmptyKeymasterResponse> deserialized(round_trip(msg, 5));
75da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
76da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
77da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, EmptyKeymasterResponseError) {
78da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EmptyKeymasterResponse msg;
79da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.error = KM_ERROR_MEMORY_ALLOCATION_FAILED;
80da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
81da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    UniquePtr<EmptyKeymasterResponse> deserialized(round_trip(msg, 4));
82da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
83da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
84da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, SupportedAlgorithmsResponse) {
85da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    SupportedAlgorithmsResponse rsp;
86da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    keymaster_algorithm_t algorithms[] = {KM_ALGORITHM_RSA, KM_ALGORITHM_DSA, KM_ALGORITHM_ECDSA};
87da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    rsp.error = KM_ERROR_OK;
88da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    rsp.algorithms = dup_array(algorithms);
89da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    rsp.algorithms_length = array_length(algorithms);
90da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
91da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    UniquePtr<SupportedAlgorithmsResponse> deserialized(round_trip(rsp, 20));
92da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(array_length(algorithms), deserialized->algorithms_length);
93da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(0, memcmp(deserialized->algorithms, algorithms, array_size(algorithms)));
94128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden}
95128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
96da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, SupportedResponse) {
97da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    SupportedResponse<keymaster_digest_t> rsp;
98da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    keymaster_digest_t digests[] = {KM_DIGEST_NONE, KM_DIGEST_MD5, KM_DIGEST_SHA1};
99da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    rsp.error = KM_ERROR_OK;
100da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    rsp.SetResults(digests);
101da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
102da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    UniquePtr<SupportedResponse<keymaster_digest_t>> deserialized(round_trip(rsp, 20));
103da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(array_length(digests), deserialized->results_length);
104da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(0, memcmp(deserialized->results, digests, array_size(digests)));
105da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
106da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
107da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willdenstatic keymaster_key_param_t params[] = {
108da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN),    Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
109da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA), Authorization(TAG_USER_ID, 7),
110da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    Authorization(TAG_USER_AUTH_ID, 8),             Authorization(TAG_APPLICATION_ID, "app_id", 6),
111da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    Authorization(TAG_AUTH_TIMEOUT, 300),
112da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden};
113128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willdenuint8_t TEST_DATA[] = "a key blob";
114128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
115da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, GenerateKeyRequest) {
116da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    GenerateKeyRequest req;
117da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    req.key_description.Reinitialize(params, array_length(params));
118da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    UniquePtr<GenerateKeyRequest> deserialized(round_trip(req, 78));
119da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(deserialized->key_description, req.key_description);
120da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
121da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
122da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, GenerateKeyResponse) {
123128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    GenerateKeyResponse rsp;
124128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    rsp.error = KM_ERROR_OK;
125128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    rsp.key_blob.key_material = dup_array(TEST_DATA);
126128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    rsp.key_blob.key_material_size = array_length(TEST_DATA);
127128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    rsp.enforced.Reinitialize(params, array_length(params));
128128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
129f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    UniquePtr<GenerateKeyResponse> deserialized(round_trip(rsp, 109));
130da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(KM_ERROR_OK, deserialized->error);
131da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(deserialized->enforced, rsp.enforced);
132da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(deserialized->unenforced, rsp.unenforced);
133da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
134128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
135da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, GenerateKeyResponseTestError) {
136128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    GenerateKeyResponse rsp;
137128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    rsp.error = KM_ERROR_UNSUPPORTED_ALGORITHM;
138128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    rsp.key_blob.key_material = dup_array(TEST_DATA);
139128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    rsp.key_blob.key_material_size = array_length(TEST_DATA);
140128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    rsp.enforced.Reinitialize(params, array_length(params));
141128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
142da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    UniquePtr<GenerateKeyResponse> deserialized(round_trip(rsp, 4));
143da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(KM_ERROR_UNSUPPORTED_ALGORITHM, deserialized->error);
144da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(0U, deserialized->enforced.size());
145da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(0U, deserialized->unenforced.size());
146da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(0U, deserialized->key_blob.key_material_size);
147da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
148da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
149da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, GetKeyCharacteristicsRequest) {
150da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    GetKeyCharacteristicsRequest req;
151da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    req.additional_params.Reinitialize(params, array_length(params));
152da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    req.SetKeyMaterial("foo", 3);
153128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
154f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    UniquePtr<GetKeyCharacteristicsRequest> deserialized(round_trip(req, 85));
155da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(7U, deserialized->additional_params.size());
156da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(3U, deserialized->key_blob.key_material_size);
157da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(0, memcmp(deserialized->key_blob.key_material, "foo", 3));
158da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
159128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
160da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, GetKeyCharacteristicsResponse) {
161da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    GetKeyCharacteristicsResponse msg;
162da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.error = KM_ERROR_OK;
163da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.enforced.Reinitialize(params, array_length(params));
164da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.unenforced.Reinitialize(params, array_length(params));
165da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
166f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    UniquePtr<GetKeyCharacteristicsResponse> deserialized(round_trip(msg, 160));
167da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(msg.enforced, deserialized->enforced);
168da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(msg.unenforced, deserialized->unenforced);
169da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
170da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
171da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, BeginOperationRequest) {
172da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    BeginOperationRequest msg;
173da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.purpose = KM_PURPOSE_SIGN;
174da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.SetKeyMaterial("foo", 3);
175da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.additional_params.Reinitialize(params, array_length(params));
176da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
177da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    UniquePtr<BeginOperationRequest> deserialized(round_trip(msg, 89));
178da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(KM_PURPOSE_SIGN, deserialized->purpose);
179da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(3U, deserialized->key_blob.key_material_size);
180da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(0, memcmp(deserialized->key_blob.key_material, "foo", 3));
181da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(msg.additional_params, deserialized->additional_params);
182da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
183da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
184da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, BeginOperationResponse) {
185da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    BeginOperationResponse msg;
186da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.error = KM_ERROR_OK;
187da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.op_handle = 0xDEADBEEF;
188da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
189da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    UniquePtr<BeginOperationResponse> deserialized(round_trip(msg, 12));
190da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(KM_ERROR_OK, deserialized->error);
191da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(0xDEADBEEF, deserialized->op_handle);
192da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
193da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
194da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, BeginOperationResponseError) {
195da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    BeginOperationResponse msg;
196da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.error = KM_ERROR_INVALID_OPERATION_HANDLE;
197da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.op_handle = 0xDEADBEEF;
198da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
199da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    UniquePtr<BeginOperationResponse> deserialized(round_trip(msg, 4));
200da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, deserialized->error);
201da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
202da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
203da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, UpdateOperationRequest) {
204da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    UpdateOperationRequest msg;
205da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.op_handle = 0xDEADBEEF;
206da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.input.Reinitialize("foo", 3);
207da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
208da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    UniquePtr<UpdateOperationRequest> deserialized(round_trip(msg, 15));
209da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(3U, deserialized->input.available_read());
210da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(0, memcmp(deserialized->input.peek_read(), "foo", 3));
211da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
212da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
213da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, UpdateOperationResponse) {
214da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    UpdateOperationResponse msg;
215da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.error = KM_ERROR_OK;
216da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.output.Reinitialize("foo", 3);
217da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
218da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    UniquePtr<UpdateOperationResponse> deserialized(round_trip(msg, 11));
219da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(KM_ERROR_OK, deserialized->error);
220da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(3U, deserialized->output.available_read());
221da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(0, memcmp(deserialized->output.peek_read(), "foo", 3));
222da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
223da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
224da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, FinishOperationRequest) {
225da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    FinishOperationRequest msg;
226da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.op_handle = 0xDEADBEEF;
227da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.signature.Reinitialize("bar", 3);
228da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
229da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    UniquePtr<FinishOperationRequest> deserialized(round_trip(msg, 15));
230da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(0xDEADBEEF, deserialized->op_handle);
231da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(3U, deserialized->signature.available_read());
232da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(0, memcmp(deserialized->signature.peek_read(), "bar", 3));
233da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
234da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
235da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(Round_Trip, FinishOperationResponse) {
236da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    FinishOperationResponse msg;
237da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.error = KM_ERROR_OK;
238da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.output.Reinitialize("foo", 3);
239da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
240da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    UniquePtr<FinishOperationResponse> deserialized(round_trip(msg, 11));
241da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(msg.error, deserialized->error);
242da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(msg.output.available_read(), deserialized->output.available_read());
243da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(0, memcmp(msg.output.peek_read(), deserialized->output.peek_read(),
244da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden                        msg.output.available_read()));
245da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
246da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
247da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, ImportKeyRequest) {
248da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    ImportKeyRequest msg;
249437fbd195e7de57b7dc0c449c04458bd90ef50deShawn Willden    msg.key_description.Reinitialize(params, array_length(params));
250da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.key_format = KM_KEY_FORMAT_X509;
251da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.SetKeyMaterial("foo", 3);
252da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
253f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    UniquePtr<ImportKeyRequest> deserialized(round_trip(msg, 89));
254437fbd195e7de57b7dc0c449c04458bd90ef50deShawn Willden    EXPECT_EQ(msg.key_description, deserialized->key_description);
255da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(msg.key_format, deserialized->key_format);
256da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(msg.key_data_length, deserialized->key_data_length);
257da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(0, memcmp(msg.key_data, deserialized->key_data, msg.key_data_length));
258da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
259da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
260da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, ImportKeyResponse) {
261da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    ImportKeyResponse msg;
262da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.error = KM_ERROR_OK;
263da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.SetKeyMaterial("foo", 3);
264da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.enforced.Reinitialize(params, array_length(params));
265da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.unenforced.Reinitialize(params, array_length(params));
266da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
267f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    UniquePtr<ImportKeyResponse> deserialized(round_trip(msg, 167));
268da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(msg.error, deserialized->error);
269da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(msg.key_blob.key_material_size, deserialized->key_blob.key_material_size);
270da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(0, memcmp(msg.key_blob.key_material, deserialized->key_blob.key_material,
271da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden                        msg.key_blob.key_material_size));
272da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(msg.enforced, deserialized->enforced);
273da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(msg.unenforced, deserialized->unenforced);
274da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
275da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
276da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, ExportKeyRequest) {
277da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    ExportKeyRequest msg;
278da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.additional_params.Reinitialize(params, array_length(params));
279da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.key_format = KM_KEY_FORMAT_X509;
280da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.SetKeyMaterial("foo", 3);
281da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
282f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    UniquePtr<ExportKeyRequest> deserialized(round_trip(msg, 89));
283da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(msg.additional_params, deserialized->additional_params);
284da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(msg.key_format, deserialized->key_format);
285da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(3U, deserialized->key_blob.key_material_size);
286da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(0, memcmp("foo", deserialized->key_blob.key_material, 3));
287da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
288da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
289da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, ExportKeyResponse) {
290da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    ExportKeyResponse msg;
291da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.error = KM_ERROR_OK;
292da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.SetKeyMaterial("foo", 3);
293da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
294da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    UniquePtr<ExportKeyResponse> deserialized(round_trip(msg, 11));
295da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(3U, deserialized->key_data_length);
296da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(0, memcmp("foo", deserialized->key_data, 3));
297128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden}
298128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
299f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willdenuint8_t msgbuf[] = {
300f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    220, 88,  183, 255, 71,  1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
301f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    0,   173, 0,   0,   0,   228, 174, 98,  187, 191, 135, 253, 200, 51,  230, 114, 247, 151, 109,
302f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    237, 79,  87,  32,  94,  5,   204, 46,  154, 30,  91,  6,   103, 148, 254, 129, 65,  171, 228,
303f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    167, 224, 163, 9,   15,  206, 90,  58,  11,  205, 55,  211, 33,  87,  178, 149, 91,  28,  236,
304f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    218, 112, 231, 34,  82,  82,  134, 103, 137, 115, 27,  156, 102, 159, 220, 226, 89,  42,  25,
305f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    37,  9,   84,  239, 76,  161, 198, 72,  167, 163, 39,  91,  148, 191, 17,  191, 87,  169, 179,
306f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    136, 10,  194, 154, 4,   40,  107, 109, 61,  161, 20,  176, 247, 13,  214, 106, 229, 45,  17,
307f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    5,   60,  189, 64,  39,  166, 208, 14,  57,  25,  140, 148, 25,  177, 246, 189, 43,  181, 88,
308f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    204, 29,  126, 224, 100, 143, 93,  60,  57,  249, 55,  0,   87,  83,  227, 224, 166, 59,  214,
309f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    81,  144, 129, 58,  6,   57,  46,  254, 232, 41,  220, 209, 230, 167, 138, 158, 94,  180, 125,
310f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    247, 26,  162, 116, 238, 202, 187, 100, 65,  13,  180, 44,  245, 159, 83,  161, 176, 58,  72,
311f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    236, 109, 105, 160, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
312f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    0,   11,  0,   0,   0,   98,  0,   0,   0,   1,   0,   0,   32,  2,   0,   0,   0,   1,   0,
313f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    0,   32,  3,   0,   0,   0,   2,   0,   0,   16,  1,   0,   0,   0,   3,   0,   0,   48,  0,
314f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    1,   0,   0,   200, 0,   0,   80,  3,   0,   0,   0,   0,   0,   0,   0,   244, 1,   0,   112,
315f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    1,   246, 1,   0,   112, 1,   189, 2,   0,   96,  144, 178, 236, 250, 255, 255, 255, 255, 145,
316f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    1,   0,   96,  144, 226, 33,  60,  222, 2,   0,   0,   189, 2,   0,   96,  0,   0,   0,   0,
317f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    0,   0,   0,   0,   190, 2,   0,   16,  1,   0,   0,   0,   12,  0,   0,   0,   0,   0,   0,
318f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    0,   0,   0,   0,   0,   0,   0,   0,   0,   110, 0,   0,   0,   0,   0,   0,   0,   11,  0,
319f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    0,   0,   98,  0,   0,   0,   1,   0,   0,   32,  2,   0,   0,   0,   1,   0,   0,   32,  3,
320f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    0,   0,   0,   2,   0,   0,   16,  1,   0,   0,   0,   3,   0,   0,   48,  0,   1,   0,   0,
321f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    200, 0,   0,   80,  3,   0,   0,   0,   0,   0,   0,   0,   244, 1,   0,   112, 1,   246, 1,
322f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    0,   112, 1,   189, 2,   0,   96,  144, 178, 236, 250, 255, 255, 255, 255, 145, 1,   0,   96,
323f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    144, 226, 33,  60,  222, 2,   0,   0,   189, 2,   0,   96,  0,   0,   0,   0,   0,   0,   0,
324f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    0,   190, 2,   0,   16,  1,   0,   0,   0,
325f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden};
326f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden
327f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden/*
328f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden * These tests don't have any assertions or expectations. They just try to parse garbage, to see if
329f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden * the result will be a crash.  This is especially informative when run under Valgrind memcheck.
330f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden */
331f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden
332f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willdentemplate <typename Message> void parse_garbage() {
333f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    Message msg;
334f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    const uint8_t* end = msgbuf + array_length(msgbuf);
335f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    for (size_t i = 0; i < array_length(msgbuf); ++i) {
336f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden        const uint8_t* begin = msgbuf + i;
337f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden        const uint8_t* p = begin;
338f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden        msg.Deserialize(&p, end);
339f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    }
340f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden}
341f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden
342f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden#define GARBAGE_TEST(Message)                                                                      \
343f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    TEST(GarbageTest, Message) { parse_garbage<Message>(); }
344f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden
345f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(SupportedAlgorithmsResponse)
346f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(GenerateKeyRequest);
347f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(GenerateKeyResponse);
348f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(GetKeyCharacteristicsRequest);
349f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(GetKeyCharacteristicsResponse);
350f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(BeginOperationRequest);
351f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(BeginOperationResponse);
352f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(UpdateOperationRequest);
353f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(UpdateOperationResponse);
354f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(FinishOperationRequest);
355f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(FinishOperationResponse);
356f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden// GARBAGE_TEST(AddEntropyRequest);
357f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(ImportKeyRequest);
358f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(ImportKeyResponse);
359f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(ExportKeyRequest);
360f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(ExportKeyResponse);
361f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden// GARBAGE_TEST(RescopeRequest);
362f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden// GARBAGE_TEST(RescopeResponse);
363f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden
364f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden// The macro doesn't work on this one.
365f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenTEST(GarbageTest, SupportedResponse) {
366f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden    parse_garbage<SupportedResponse<keymaster_digest_t>>();
367f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden}
368f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden
369128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden}  // namespace test
370128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden}  // namespace keymaster
371