blob: 60105720411661fd859e0523a929af1c89fa2659 [file] [log] [blame]
Shawn Willden128ffe02014-08-06 12:31:33 -06001/*
2 * Copyright (C) 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <UniquePtr.h>
18
19#include <gtest/gtest.h>
20
21#define KEYMASTER_NAME_TAGS
22#include "keymaster_tags.h"
23#include "google_keymaster_utils.h"
24#include "google_softkeymaster.h"
25
26int main(int argc, char** argv) {
27 ::testing::InitGoogleTest(&argc, argv);
28 int result = RUN_ALL_TESTS();
29 return result;
30}
31
32namespace keymaster {
33namespace test {
34
35TEST(GenerateKeyRequest, RoundTrip) {
36 keymaster_key_param_t params[] = {
37 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN),
38 Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
39 Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA),
40 Authorization(TAG_USER_ID, 7),
41 Authorization(TAG_USER_AUTH_ID, 8),
42 Authorization(TAG_APPLICATION_ID, "app_id", 6),
43 Authorization(TAG_AUTH_TIMEOUT, 300),
44 };
45 GenerateKeyRequest req;
46 req.key_description.Reinitialize(params, array_length(params));
47
48 size_t size = req.SerializedSize();
49 EXPECT_EQ(182U, size);
50
51 UniquePtr<uint8_t[]> buf(new uint8_t[size]);
52 EXPECT_EQ(buf.get() + size, req.Serialize(buf.get()));
53
54 GenerateKeyRequest deserialized1;
55 uint8_t* p = buf.get();
56 EXPECT_TRUE(deserialized1.DeserializeInPlace(&p, p + size));
57 EXPECT_EQ(7U, deserialized1.key_description.size());
58
59 // Check a few entries.
60 keymaster_purpose_t purpose;
61 EXPECT_TRUE(deserialized1.key_description.GetTagValue(TAG_PURPOSE, 0, &purpose));
62 EXPECT_EQ(KM_PURPOSE_SIGN, purpose);
63 keymaster_blob_t blob;
64 EXPECT_TRUE(deserialized1.key_description.GetTagValue(TAG_APPLICATION_ID, &blob));
65 EXPECT_EQ(6U, blob.data_length);
66 EXPECT_EQ(0, memcmp(blob.data, "app_id", 6));
67 uint32_t val;
68 EXPECT_TRUE(deserialized1.key_description.GetTagValue(TAG_USER_ID, &val));
69 EXPECT_EQ(7U, val);
70
71 GenerateKeyRequest deserialized2;
72 const uint8_t* p2 = buf.get();
73 EXPECT_TRUE(deserialized2.DeserializeToCopy(&p2, p2 + size));
74 EXPECT_EQ(7U, deserialized2.key_description.size());
75
76 // Check a few entries.
77 EXPECT_TRUE(deserialized2.key_description.GetTagValue(TAG_PURPOSE, 0, &purpose));
78 EXPECT_EQ(KM_PURPOSE_SIGN, purpose);
79 EXPECT_TRUE(deserialized2.key_description.GetTagValue(TAG_APPLICATION_ID, &blob));
80 EXPECT_EQ(6U, blob.data_length);
81 EXPECT_EQ(0, memcmp(blob.data, "app_id", 6));
82 EXPECT_TRUE(deserialized2.key_description.GetTagValue(TAG_USER_ID, &val));
83 EXPECT_EQ(7U, val);
84}
85
86uint8_t TEST_DATA[] = "a key blob";
87
88TEST(GenerateKeyResponse, RoundTrip) {
89 keymaster_key_param_t params[] = {
90 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN),
91 Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
92 Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA),
93 Authorization(TAG_USER_ID, 7),
94 Authorization(TAG_USER_AUTH_ID, 8),
95 Authorization(TAG_APPLICATION_ID, "app_id", 6),
96 Authorization(TAG_AUTH_TIMEOUT, 300),
97 };
98 GenerateKeyResponse rsp;
99 rsp.error = KM_ERROR_OK;
100 rsp.key_blob.key_material = dup_array(TEST_DATA);
101 rsp.key_blob.key_material_size = array_length(TEST_DATA);
102 rsp.enforced.Reinitialize(params, array_length(params));
103
104 size_t size = rsp.SerializedSize();
105 EXPECT_EQ(217U, size);
106
107 UniquePtr<uint8_t[]> buf(new uint8_t[size]);
108 EXPECT_EQ(buf.get() + size, rsp.Serialize(buf.get()));
109
110 GenerateKeyResponse deserialized;
111 uint8_t* p = buf.get();
112
113 // DeserializeInPlace is not implemented.
114 EXPECT_FALSE(deserialized.DeserializeInPlace(&p, p + size));
115
116 const uint8_t* p2 = buf.get();
117 EXPECT_TRUE(deserialized.DeserializeToCopy(&p2, p2 + size));
118 EXPECT_EQ(7U, deserialized.enforced.size());
119
120 EXPECT_EQ(0U, deserialized.unenforced.size());
121 EXPECT_EQ(KM_ERROR_OK, deserialized.error);
122
123 // Check a few entries of enforced.
124 keymaster_purpose_t purpose;
125 EXPECT_TRUE(deserialized.enforced.GetTagValue(TAG_PURPOSE, 0, &purpose));
126 EXPECT_EQ(KM_PURPOSE_SIGN, purpose);
127 keymaster_blob_t blob;
128 EXPECT_TRUE(deserialized.enforced.GetTagValue(TAG_APPLICATION_ID, &blob));
129 EXPECT_EQ(6U, blob.data_length);
130 EXPECT_EQ(0, memcmp(blob.data, "app_id", 6));
131 uint32_t val;
132 EXPECT_TRUE(deserialized.enforced.GetTagValue(TAG_USER_ID, &val));
133 EXPECT_EQ(7U, val);
134}
135
136TEST(GenerateKeyResponse, Error) {
137 keymaster_key_param_t params[] = {
138 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN),
139 Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
140 Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA),
141 Authorization(TAG_USER_ID, 7),
142 Authorization(TAG_USER_AUTH_ID, 8),
143 Authorization(TAG_APPLICATION_ID, "app_id", 6),
144 Authorization(TAG_AUTH_TIMEOUT, 300),
145 };
146 GenerateKeyResponse rsp;
147 rsp.error = KM_ERROR_UNSUPPORTED_ALGORITHM;
148 rsp.key_blob.key_material = dup_array(TEST_DATA);
149 rsp.key_blob.key_material_size = array_length(TEST_DATA);
150 rsp.enforced.Reinitialize(params, array_length(params));
151
152 size_t size = rsp.SerializedSize();
153 EXPECT_EQ(4U, size);
154
155 UniquePtr<uint8_t[]> buf(new uint8_t[size]);
156 EXPECT_EQ(buf.get() + size, rsp.Serialize(buf.get()));
157
158 GenerateKeyResponse deserialized;
159 const uint8_t* p = buf.get();
160 EXPECT_TRUE(deserialized.DeserializeToCopy(&p, p + size));
161 EXPECT_EQ(KM_ERROR_UNSUPPORTED_ALGORITHM, deserialized.error);
162 EXPECT_EQ(0U, deserialized.enforced.size());
163 EXPECT_EQ(0U, deserialized.unenforced.size());
164 EXPECT_EQ(0U, deserialized.key_blob.key_material_size);
165}
166
167} // namespace test
168} // namespace keymaster