android_keymaster_messages_test.cpp revision 58e1a5486219a1be9264d4e863a9dd3e393906c3
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
21128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden#define KEYMASTER_NAME_TAGS
22128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden#include "keymaster_tags.h"
23128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden#include "google_keymaster_utils.h"
24128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden#include "google_softkeymaster.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
35128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn WilldenTEST(GenerateKeyRequest, RoundTrip) {
36128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    keymaster_key_param_t params[] = {
37128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden        Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN),
38128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden        Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
39128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden        Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA),
40128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden        Authorization(TAG_USER_ID, 7),
41128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden        Authorization(TAG_USER_AUTH_ID, 8),
42128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden        Authorization(TAG_APPLICATION_ID, "app_id", 6),
43128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden        Authorization(TAG_AUTH_TIMEOUT, 300),
44128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    };
45128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    GenerateKeyRequest req;
46128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    req.key_description.Reinitialize(params, array_length(params));
47128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
48128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    size_t size = req.SerializedSize();
49128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    EXPECT_EQ(182U, size);
50128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
51128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    UniquePtr<uint8_t[]> buf(new uint8_t[size]);
5258e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden    EXPECT_EQ(buf.get() + size, req.Serialize(buf.get(), buf.get() + size));
53128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
54128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    GenerateKeyRequest deserialized1;
5558e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden    const uint8_t* p = buf.get();
5658e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden    EXPECT_TRUE(deserialized1.Deserialize(&p, p + size));
57128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    EXPECT_EQ(7U, deserialized1.key_description.size());
58128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
59128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    // Check a few entries.
60128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    keymaster_purpose_t purpose;
61128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    EXPECT_TRUE(deserialized1.key_description.GetTagValue(TAG_PURPOSE, 0, &purpose));
62128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    EXPECT_EQ(KM_PURPOSE_SIGN, purpose);
63128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    keymaster_blob_t blob;
64128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    EXPECT_TRUE(deserialized1.key_description.GetTagValue(TAG_APPLICATION_ID, &blob));
65128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    EXPECT_EQ(6U, blob.data_length);
66128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    EXPECT_EQ(0, memcmp(blob.data, "app_id", 6));
67128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    uint32_t val;
68128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    EXPECT_TRUE(deserialized1.key_description.GetTagValue(TAG_USER_ID, &val));
69128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    EXPECT_EQ(7U, val);
70128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
71128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    GenerateKeyRequest deserialized2;
72128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    const uint8_t* p2 = buf.get();
7358e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden    EXPECT_TRUE(deserialized2.Deserialize(&p2, p2 + size));
74128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    EXPECT_EQ(7U, deserialized2.key_description.size());
75128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
76128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    // Check a few entries.
77128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    EXPECT_TRUE(deserialized2.key_description.GetTagValue(TAG_PURPOSE, 0, &purpose));
78128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    EXPECT_EQ(KM_PURPOSE_SIGN, purpose);
79128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    EXPECT_TRUE(deserialized2.key_description.GetTagValue(TAG_APPLICATION_ID, &blob));
80128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    EXPECT_EQ(6U, blob.data_length);
81128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    EXPECT_EQ(0, memcmp(blob.data, "app_id", 6));
82128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    EXPECT_TRUE(deserialized2.key_description.GetTagValue(TAG_USER_ID, &val));
83128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    EXPECT_EQ(7U, val);
84128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden}
85128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
86128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willdenuint8_t TEST_DATA[] = "a key blob";
87128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
88128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn WilldenTEST(GenerateKeyResponse, RoundTrip) {
89128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    keymaster_key_param_t params[] = {
90128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden        Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN),
91128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden        Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
92128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden        Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA),
93128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden        Authorization(TAG_USER_ID, 7),
94128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden        Authorization(TAG_USER_AUTH_ID, 8),
95128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden        Authorization(TAG_APPLICATION_ID, "app_id", 6),
96128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden        Authorization(TAG_AUTH_TIMEOUT, 300),
97128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    };
98128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    GenerateKeyResponse rsp;
99128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    rsp.error = KM_ERROR_OK;
100128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    rsp.key_blob.key_material = dup_array(TEST_DATA);
101128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    rsp.key_blob.key_material_size = array_length(TEST_DATA);
102128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    rsp.enforced.Reinitialize(params, array_length(params));
103128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
104128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    size_t size = rsp.SerializedSize();
105128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    EXPECT_EQ(217U, size);
106128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
107128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    UniquePtr<uint8_t[]> buf(new uint8_t[size]);
10858e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden    EXPECT_EQ(buf.get() + size, rsp.Serialize(buf.get(), buf.get() + size));
109128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
110128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    GenerateKeyResponse deserialized;
11158e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden    const uint8_t* p = buf.get();
11258e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden    EXPECT_TRUE(deserialized.Deserialize(&p, p + size));
113128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    EXPECT_EQ(7U, deserialized.enforced.size());
114128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
115128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    EXPECT_EQ(0U, deserialized.unenforced.size());
116128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    EXPECT_EQ(KM_ERROR_OK, deserialized.error);
117128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
118128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    // Check a few entries of enforced.
119128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    keymaster_purpose_t purpose;
120128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    EXPECT_TRUE(deserialized.enforced.GetTagValue(TAG_PURPOSE, 0, &purpose));
121128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    EXPECT_EQ(KM_PURPOSE_SIGN, purpose);
122128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    keymaster_blob_t blob;
123128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    EXPECT_TRUE(deserialized.enforced.GetTagValue(TAG_APPLICATION_ID, &blob));
124128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    EXPECT_EQ(6U, blob.data_length);
125128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    EXPECT_EQ(0, memcmp(blob.data, "app_id", 6));
126128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    uint32_t val;
127128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    EXPECT_TRUE(deserialized.enforced.GetTagValue(TAG_USER_ID, &val));
128128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    EXPECT_EQ(7U, val);
129128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden}
130128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
131128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn WilldenTEST(GenerateKeyResponse, Error) {
132128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    keymaster_key_param_t params[] = {
133128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden        Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN),
134128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden        Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
135128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden        Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA),
136128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden        Authorization(TAG_USER_ID, 7),
137128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden        Authorization(TAG_USER_AUTH_ID, 8),
138128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden        Authorization(TAG_APPLICATION_ID, "app_id", 6),
139128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden        Authorization(TAG_AUTH_TIMEOUT, 300),
140128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    };
141128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    GenerateKeyResponse rsp;
142128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    rsp.error = KM_ERROR_UNSUPPORTED_ALGORITHM;
143128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    rsp.key_blob.key_material = dup_array(TEST_DATA);
144128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    rsp.key_blob.key_material_size = array_length(TEST_DATA);
145128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    rsp.enforced.Reinitialize(params, array_length(params));
146128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
147128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    size_t size = rsp.SerializedSize();
148128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    EXPECT_EQ(4U, size);
149128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
150128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    UniquePtr<uint8_t[]> buf(new uint8_t[size]);
15158e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden    EXPECT_EQ(buf.get() + size, rsp.Serialize(buf.get(), buf.get() + size));
152128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
153128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    GenerateKeyResponse deserialized;
154128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    const uint8_t* p = buf.get();
15558e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden    EXPECT_TRUE(deserialized.Deserialize(&p, p + size));
156128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    EXPECT_EQ(KM_ERROR_UNSUPPORTED_ALGORITHM, deserialized.error);
157128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    EXPECT_EQ(0U, deserialized.enforced.size());
158128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    EXPECT_EQ(0U, deserialized.unenforced.size());
159128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden    EXPECT_EQ(0U, deserialized.key_blob.key_material_size);
160128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden}
161128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden
162128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden}  // namespace test
163128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden}  // namespace keymaster
164