android_keymaster_messages_test.cpp revision 128ffe07c723d8ffe2d5ea528ba5f64436c8a55a
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]); 52128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden EXPECT_EQ(buf.get() + size, req.Serialize(buf.get())); 53128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden 54128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden GenerateKeyRequest deserialized1; 55128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden uint8_t* p = buf.get(); 56128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden EXPECT_TRUE(deserialized1.DeserializeInPlace(&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(); 73128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden EXPECT_TRUE(deserialized2.DeserializeToCopy(&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]); 108128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden EXPECT_EQ(buf.get() + size, rsp.Serialize(buf.get())); 109128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden 110128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden GenerateKeyResponse deserialized; 111128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden uint8_t* p = buf.get(); 112128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden 113128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden // DeserializeInPlace is not implemented. 114128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden EXPECT_FALSE(deserialized.DeserializeInPlace(&p, p + size)); 115128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden 116128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden const uint8_t* p2 = buf.get(); 117128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden EXPECT_TRUE(deserialized.DeserializeToCopy(&p2, p2 + size)); 118128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden EXPECT_EQ(7U, deserialized.enforced.size()); 119128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden 120128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden EXPECT_EQ(0U, deserialized.unenforced.size()); 121128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden EXPECT_EQ(KM_ERROR_OK, deserialized.error); 122128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden 123128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden // Check a few entries of enforced. 124128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden keymaster_purpose_t purpose; 125128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden EXPECT_TRUE(deserialized.enforced.GetTagValue(TAG_PURPOSE, 0, &purpose)); 126128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden EXPECT_EQ(KM_PURPOSE_SIGN, purpose); 127128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden keymaster_blob_t blob; 128128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden EXPECT_TRUE(deserialized.enforced.GetTagValue(TAG_APPLICATION_ID, &blob)); 129128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden EXPECT_EQ(6U, blob.data_length); 130128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden EXPECT_EQ(0, memcmp(blob.data, "app_id", 6)); 131128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden uint32_t val; 132128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden EXPECT_TRUE(deserialized.enforced.GetTagValue(TAG_USER_ID, &val)); 133128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden EXPECT_EQ(7U, val); 134128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden} 135128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden 136128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn WilldenTEST(GenerateKeyResponse, Error) { 137128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden keymaster_key_param_t params[] = { 138128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), 139128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY), 140128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA), 141128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden Authorization(TAG_USER_ID, 7), 142128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden Authorization(TAG_USER_AUTH_ID, 8), 143128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden Authorization(TAG_APPLICATION_ID, "app_id", 6), 144128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden Authorization(TAG_AUTH_TIMEOUT, 300), 145128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden }; 146128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden GenerateKeyResponse rsp; 147128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden rsp.error = KM_ERROR_UNSUPPORTED_ALGORITHM; 148128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden rsp.key_blob.key_material = dup_array(TEST_DATA); 149128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden rsp.key_blob.key_material_size = array_length(TEST_DATA); 150128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden rsp.enforced.Reinitialize(params, array_length(params)); 151128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden 152128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden size_t size = rsp.SerializedSize(); 153128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden EXPECT_EQ(4U, size); 154128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden 155128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden UniquePtr<uint8_t[]> buf(new uint8_t[size]); 156128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden EXPECT_EQ(buf.get() + size, rsp.Serialize(buf.get())); 157128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden 158128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden GenerateKeyResponse deserialized; 159128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden const uint8_t* p = buf.get(); 160128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden EXPECT_TRUE(deserialized.DeserializeToCopy(&p, p + size)); 161128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden EXPECT_EQ(KM_ERROR_UNSUPPORTED_ALGORITHM, deserialized.error); 162128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden EXPECT_EQ(0U, deserialized.enforced.size()); 163128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden EXPECT_EQ(0U, deserialized.unenforced.size()); 164128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden EXPECT_EQ(0U, deserialized.key_blob.key_material_size); 165128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden} 166128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden 167128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden} // namespace test 168128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden} // namespace keymaster 169