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