android_keymaster_messages_test.cpp revision 58e1a5486219a1be9264d4e863a9dd3e393906c3
1/* 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(), buf.get() + size)); 53 54 GenerateKeyRequest deserialized1; 55 const uint8_t* p = buf.get(); 56 EXPECT_TRUE(deserialized1.Deserialize(&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.Deserialize(&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(), buf.get() + size)); 109 110 GenerateKeyResponse deserialized; 111 const uint8_t* p = buf.get(); 112 EXPECT_TRUE(deserialized.Deserialize(&p, p + size)); 113 EXPECT_EQ(7U, deserialized.enforced.size()); 114 115 EXPECT_EQ(0U, deserialized.unenforced.size()); 116 EXPECT_EQ(KM_ERROR_OK, deserialized.error); 117 118 // Check a few entries of enforced. 119 keymaster_purpose_t purpose; 120 EXPECT_TRUE(deserialized.enforced.GetTagValue(TAG_PURPOSE, 0, &purpose)); 121 EXPECT_EQ(KM_PURPOSE_SIGN, purpose); 122 keymaster_blob_t blob; 123 EXPECT_TRUE(deserialized.enforced.GetTagValue(TAG_APPLICATION_ID, &blob)); 124 EXPECT_EQ(6U, blob.data_length); 125 EXPECT_EQ(0, memcmp(blob.data, "app_id", 6)); 126 uint32_t val; 127 EXPECT_TRUE(deserialized.enforced.GetTagValue(TAG_USER_ID, &val)); 128 EXPECT_EQ(7U, val); 129} 130 131TEST(GenerateKeyResponse, Error) { 132 keymaster_key_param_t params[] = { 133 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), 134 Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY), 135 Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA), 136 Authorization(TAG_USER_ID, 7), 137 Authorization(TAG_USER_AUTH_ID, 8), 138 Authorization(TAG_APPLICATION_ID, "app_id", 6), 139 Authorization(TAG_AUTH_TIMEOUT, 300), 140 }; 141 GenerateKeyResponse rsp; 142 rsp.error = KM_ERROR_UNSUPPORTED_ALGORITHM; 143 rsp.key_blob.key_material = dup_array(TEST_DATA); 144 rsp.key_blob.key_material_size = array_length(TEST_DATA); 145 rsp.enforced.Reinitialize(params, array_length(params)); 146 147 size_t size = rsp.SerializedSize(); 148 EXPECT_EQ(4U, size); 149 150 UniquePtr<uint8_t[]> buf(new uint8_t[size]); 151 EXPECT_EQ(buf.get() + size, rsp.Serialize(buf.get(), buf.get() + size)); 152 153 GenerateKeyResponse deserialized; 154 const uint8_t* p = buf.get(); 155 EXPECT_TRUE(deserialized.Deserialize(&p, p + size)); 156 EXPECT_EQ(KM_ERROR_UNSUPPORTED_ALGORITHM, deserialized.error); 157 EXPECT_EQ(0U, deserialized.enforced.size()); 158 EXPECT_EQ(0U, deserialized.unenforced.size()); 159 EXPECT_EQ(0U, deserialized.key_blob.key_material_size); 160} 161 162} // namespace test 163} // namespace keymaster 164