android_keymaster_messages_test.cpp revision da8485ea42e53839579575ec9fc2b49f7cf1a1f9
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
21da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden#include "google_keymaster_test_utils.h"
22128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden#include "google_keymaster_utils.h"
23128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden#include "google_softkeymaster.h"
24da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden#include "keymaster_tags.h"
25128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
26128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willdenint main(int argc, char** argv) {
27128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    ::testing::InitGoogleTest(&argc, argv);
28128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    int result = RUN_ALL_TESTS();
29128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    return result;
30128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden}
31128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
32128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willdennamespace keymaster {
33128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willdennamespace test {
34128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
35da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden/**
36da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden * Serialize and deserialize a message.
37da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden */
38da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willdentemplate <typename Message> Message* round_trip(const Message& message, size_t expected_size) {
39da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    size_t size = message.SerializedSize();
40da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(expected_size, size);
41da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    if (size == 0)
42da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden        return NULL;
43128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
44128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    UniquePtr<uint8_t[]> buf(new uint8_t[size]);
45da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(buf.get() + size, message.Serialize(buf.get(), buf.get() + size));
46128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
47da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    Message* deserialized = new Message;
4858e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden    const uint8_t* p = buf.get();
49da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_TRUE(deserialized->Deserialize(&p, p + size));
50da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ((ptrdiff_t)size, p - buf.get());
51da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    return deserialized;
52da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
53da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
54da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willdenclass EmptyKeymasterResponse : public KeymasterResponse {
55da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    size_t NonErrorSerializedSize() const { return 1; }
56da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    uint8_t* NonErrorSerialize(uint8_t* buf, const uint8_t* /* end */) const {
57da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden        *buf++ = 0;
58da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden        return buf;
59da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    }
60da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    bool NonErrorDeserialize(const uint8_t** buf_ptr, const uint8_t* end) {
61da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden        if (*buf_ptr >= end)
62da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden            return false;
63da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden        EXPECT_EQ(0, **buf_ptr);
64da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden        (*buf_ptr)++;
65da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden        return true;
66da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    }
67da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden};
68da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
69da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, EmptyKeymasterResponse) {
70da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EmptyKeymasterResponse msg;
71da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.error = KM_ERROR_OK;
72da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
73da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    UniquePtr<EmptyKeymasterResponse> deserialized(round_trip(msg, 5));
74da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
75da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
76da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, EmptyKeymasterResponseError) {
77da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EmptyKeymasterResponse msg;
78da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.error = KM_ERROR_MEMORY_ALLOCATION_FAILED;
79da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
80da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    UniquePtr<EmptyKeymasterResponse> deserialized(round_trip(msg, 4));
81da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
82da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
83da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, SupportedAlgorithmsResponse) {
84da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    SupportedAlgorithmsResponse rsp;
85da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    keymaster_algorithm_t algorithms[] = {KM_ALGORITHM_RSA, KM_ALGORITHM_DSA, KM_ALGORITHM_ECDSA};
86da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    rsp.error = KM_ERROR_OK;
87da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    rsp.algorithms = dup_array(algorithms);
88da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    rsp.algorithms_length = array_length(algorithms);
89da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
90da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    UniquePtr<SupportedAlgorithmsResponse> deserialized(round_trip(rsp, 20));
91da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(array_length(algorithms), deserialized->algorithms_length);
92da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(0, memcmp(deserialized->algorithms, algorithms, array_size(algorithms)));
93128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden}
94128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
95da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, SupportedResponse) {
96da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    SupportedResponse<keymaster_digest_t> rsp;
97da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    keymaster_digest_t digests[] = {KM_DIGEST_NONE, KM_DIGEST_MD5, KM_DIGEST_SHA1};
98da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    rsp.error = KM_ERROR_OK;
99da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    rsp.SetResults(digests);
100da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
101da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    UniquePtr<SupportedResponse<keymaster_digest_t>> deserialized(round_trip(rsp, 20));
102da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(array_length(digests), deserialized->results_length);
103da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(0, memcmp(deserialized->results, digests, array_size(digests)));
104da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
105da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
106da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willdenstatic keymaster_key_param_t params[] = {
107da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN),    Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
108da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA), Authorization(TAG_USER_ID, 7),
109da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    Authorization(TAG_USER_AUTH_ID, 8),             Authorization(TAG_APPLICATION_ID, "app_id", 6),
110da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    Authorization(TAG_AUTH_TIMEOUT, 300),
111da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden};
112128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willdenuint8_t TEST_DATA[] = "a key blob";
113128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
114da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, GenerateKeyRequest) {
115da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    GenerateKeyRequest req;
116da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    req.key_description.Reinitialize(params, array_length(params));
117da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    UniquePtr<GenerateKeyRequest> deserialized(round_trip(req, 78));
118da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(deserialized->key_description, req.key_description);
119da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
120da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
121da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, GenerateKeyResponse) {
122128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    GenerateKeyResponse rsp;
123128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    rsp.error = KM_ERROR_OK;
124128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    rsp.key_blob.key_material = dup_array(TEST_DATA);
125128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    rsp.key_blob.key_material_size = array_length(TEST_DATA);
126128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    rsp.enforced.Reinitialize(params, array_length(params));
127128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
128da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    UniquePtr<GenerateKeyResponse> deserialized(round_trip(rsp, 117));
129da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(KM_ERROR_OK, deserialized->error);
130da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(deserialized->enforced, rsp.enforced);
131da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(deserialized->unenforced, rsp.unenforced);
132da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
133128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
134da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, GenerateKeyResponseTestError) {
135128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    GenerateKeyResponse rsp;
136128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    rsp.error = KM_ERROR_UNSUPPORTED_ALGORITHM;
137128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    rsp.key_blob.key_material = dup_array(TEST_DATA);
138128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    rsp.key_blob.key_material_size = array_length(TEST_DATA);
139128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    rsp.enforced.Reinitialize(params, array_length(params));
140128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
141da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    UniquePtr<GenerateKeyResponse> deserialized(round_trip(rsp, 4));
142da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(KM_ERROR_UNSUPPORTED_ALGORITHM, deserialized->error);
143da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(0U, deserialized->enforced.size());
144da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(0U, deserialized->unenforced.size());
145da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(0U, deserialized->key_blob.key_material_size);
146da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
147da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
148da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, GetKeyCharacteristicsRequest) {
149da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    GetKeyCharacteristicsRequest req;
150da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    req.additional_params.Reinitialize(params, array_length(params));
151da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    req.SetKeyMaterial("foo", 3);
152128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
153da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    UniquePtr<GetKeyCharacteristicsRequest> deserialized(round_trip(req, 89));
154da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(7U, deserialized->additional_params.size());
155da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(3U, deserialized->key_blob.key_material_size);
156da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(0, memcmp(deserialized->key_blob.key_material, "foo", 3));
157da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
158128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
159da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, GetKeyCharacteristicsResponse) {
160da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    GetKeyCharacteristicsResponse msg;
161da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.error = KM_ERROR_OK;
162da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.enforced.Reinitialize(params, array_length(params));
163da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.unenforced.Reinitialize(params, array_length(params));
164da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
165da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    UniquePtr<GetKeyCharacteristicsResponse> deserialized(round_trip(msg, 168));
166da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(msg.enforced, deserialized->enforced);
167da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(msg.unenforced, deserialized->unenforced);
168da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
169da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
170da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, BeginOperationRequest) {
171da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    BeginOperationRequest msg;
172da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.purpose = KM_PURPOSE_SIGN;
173da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.SetKeyMaterial("foo", 3);
174da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.additional_params.Reinitialize(params, array_length(params));
175da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
176da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    UniquePtr<BeginOperationRequest> deserialized(round_trip(msg, 89));
177da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(KM_PURPOSE_SIGN, deserialized->purpose);
178da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(3U, deserialized->key_blob.key_material_size);
179da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(0, memcmp(deserialized->key_blob.key_material, "foo", 3));
180da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(msg.additional_params, deserialized->additional_params);
181da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
182da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
183da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, BeginOperationResponse) {
184da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    BeginOperationResponse msg;
185da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.error = KM_ERROR_OK;
186da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.op_handle = 0xDEADBEEF;
187da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
188da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    UniquePtr<BeginOperationResponse> deserialized(round_trip(msg, 12));
189da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(KM_ERROR_OK, deserialized->error);
190da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(0xDEADBEEF, deserialized->op_handle);
191da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
192da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
193da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, BeginOperationResponseError) {
194da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    BeginOperationResponse msg;
195da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.error = KM_ERROR_INVALID_OPERATION_HANDLE;
196da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.op_handle = 0xDEADBEEF;
197da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
198da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    UniquePtr<BeginOperationResponse> deserialized(round_trip(msg, 4));
199da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, deserialized->error);
200da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
201da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
202da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, UpdateOperationRequest) {
203da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    UpdateOperationRequest msg;
204da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.op_handle = 0xDEADBEEF;
205da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.input.Reinitialize("foo", 3);
206da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
207da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    UniquePtr<UpdateOperationRequest> deserialized(round_trip(msg, 15));
208da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(3U, deserialized->input.available_read());
209da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(0, memcmp(deserialized->input.peek_read(), "foo", 3));
210da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
211da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
212da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, UpdateOperationResponse) {
213da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    UpdateOperationResponse msg;
214da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.error = KM_ERROR_OK;
215da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.output.Reinitialize("foo", 3);
216da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
217da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    UniquePtr<UpdateOperationResponse> deserialized(round_trip(msg, 11));
218da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(KM_ERROR_OK, deserialized->error);
219da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(3U, deserialized->output.available_read());
220da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(0, memcmp(deserialized->output.peek_read(), "foo", 3));
221da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
222da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
223da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, FinishOperationRequest) {
224da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    FinishOperationRequest msg;
225da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.op_handle = 0xDEADBEEF;
226da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.signature.Reinitialize("bar", 3);
227da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
228da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    UniquePtr<FinishOperationRequest> deserialized(round_trip(msg, 15));
229da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(0xDEADBEEF, deserialized->op_handle);
230da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(3U, deserialized->signature.available_read());
231da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(0, memcmp(deserialized->signature.peek_read(), "bar", 3));
232da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
233da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
234da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(Round_Trip, FinishOperationResponse) {
235da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    FinishOperationResponse msg;
236da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.error = KM_ERROR_OK;
237da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.output.Reinitialize("foo", 3);
238da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
239da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    UniquePtr<FinishOperationResponse> deserialized(round_trip(msg, 11));
240da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(msg.error, deserialized->error);
241da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(msg.output.available_read(), deserialized->output.available_read());
242da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(0, memcmp(msg.output.peek_read(), deserialized->output.peek_read(),
243da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden                        msg.output.available_read()));
244da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
245da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
246da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, ImportKeyRequest) {
247da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    ImportKeyRequest msg;
248da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.additional_params.Reinitialize(params, array_length(params));
249da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.key_format = KM_KEY_FORMAT_X509;
250da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.SetKeyMaterial("foo", 3);
251da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
252da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    UniquePtr<ImportKeyRequest> deserialized(round_trip(msg, 93));
253da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(msg.additional_params, deserialized->additional_params);
254da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(msg.key_format, deserialized->key_format);
255da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(msg.key_data_length, deserialized->key_data_length);
256da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(0, memcmp(msg.key_data, deserialized->key_data, msg.key_data_length));
257da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
258da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
259da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, ImportKeyResponse) {
260da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    ImportKeyResponse msg;
261da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.error = KM_ERROR_OK;
262da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.SetKeyMaterial("foo", 3);
263da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.enforced.Reinitialize(params, array_length(params));
264da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.unenforced.Reinitialize(params, array_length(params));
265da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
266da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    UniquePtr<ImportKeyResponse> deserialized(round_trip(msg, 175));
267da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(msg.error, deserialized->error);
268da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(msg.key_blob.key_material_size, deserialized->key_blob.key_material_size);
269da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(0, memcmp(msg.key_blob.key_material, deserialized->key_blob.key_material,
270da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden                        msg.key_blob.key_material_size));
271da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(msg.enforced, deserialized->enforced);
272da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(msg.unenforced, deserialized->unenforced);
273da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
274da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
275da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, ExportKeyRequest) {
276da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    ExportKeyRequest msg;
277da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.additional_params.Reinitialize(params, array_length(params));
278da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.key_format = KM_KEY_FORMAT_X509;
279da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.SetKeyMaterial("foo", 3);
280da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
281da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    UniquePtr<ExportKeyRequest> deserialized(round_trip(msg, 93));
282da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(msg.additional_params, deserialized->additional_params);
283da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(msg.key_format, deserialized->key_format);
284da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(3U, deserialized->key_blob.key_material_size);
285da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(0, memcmp("foo", deserialized->key_blob.key_material, 3));
286da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}
287da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
288da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, ExportKeyResponse) {
289da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    ExportKeyResponse msg;
290da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.error = KM_ERROR_OK;
291da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    msg.SetKeyMaterial("foo", 3);
292da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden
293da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    UniquePtr<ExportKeyResponse> deserialized(round_trip(msg, 11));
294da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(3U, deserialized->key_data_length);
295da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden    EXPECT_EQ(0, memcmp("foo", deserialized->key_data, 3));
296128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden}
297128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
298128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden}  // namespace test
299128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden}  // namespace keymaster
300