android_keymaster_messages_test.cpp revision ac69d9559e96cf57d7705848a9f3d6e09eac9fe1
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 210cb6942d3efb6c056f96321c82a4b3d86af601d6Shawn Willden#include <keymaster/android_keymaster.h> 2213fbe3e93247943c26e7ca2ed27b6d650282b8bfShawn Willden#include <keymaster/android_keymaster_utils.h> 230cb6942d3efb6c056f96321c82a4b3d86af601d6Shawn Willden#include <keymaster/keymaster_tags.h> 2498d9b92547a9a7553b99e3e941a4175926f95b62Shawn Willden 25b6837e7a62a1192e33beef586282812239ee8b28Shawn Willden#include "android_keymaster_test_utils.h" 26128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden 27128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willdennamespace keymaster { 28128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willdennamespace test { 29128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden 30da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden/** 31da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden * Serialize and deserialize a message. 32da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden */ 332665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willdentemplate <typename Message> 342665e868b1153cb89ad7cd906ae160cb417d4438Shawn WilldenMessage* round_trip(int32_t ver, const Message& message, size_t expected_size) { 35da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden size_t size = message.SerializedSize(); 36da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden EXPECT_EQ(expected_size, size); 37da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden if (size == 0) 38da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden return NULL; 39128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden 40128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden UniquePtr<uint8_t[]> buf(new uint8_t[size]); 41da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden EXPECT_EQ(buf.get() + size, message.Serialize(buf.get(), buf.get() + size)); 42128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden 432665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden Message* deserialized = new Message(ver); 4458e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden const uint8_t* p = buf.get(); 45da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden EXPECT_TRUE(deserialized->Deserialize(&p, p + size)); 46da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden EXPECT_EQ((ptrdiff_t)size, p - buf.get()); 47da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden return deserialized; 48da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 49da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 502665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willdenstruct EmptyKeymasterResponse : public KeymasterResponse { 512665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EmptyKeymasterResponse(int32_t ver) : KeymasterResponse(ver) {} 52da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden size_t NonErrorSerializedSize() const { return 1; } 53da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden uint8_t* NonErrorSerialize(uint8_t* buf, const uint8_t* /* end */) const { 54da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden *buf++ = 0; 55da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden return buf; 56da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden } 57da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden bool NonErrorDeserialize(const uint8_t** buf_ptr, const uint8_t* end) { 58da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden if (*buf_ptr >= end) 59da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden return false; 60da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden EXPECT_EQ(0, **buf_ptr); 61da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden (*buf_ptr)++; 62da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden return true; 63da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden } 64da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}; 65da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 66da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, EmptyKeymasterResponse) { 672665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 682665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EmptyKeymasterResponse msg(ver); 692665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.error = KM_ERROR_OK; 70da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 712665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<EmptyKeymasterResponse> deserialized(round_trip(ver, msg, 5)); 722665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 73da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 74da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 75da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, EmptyKeymasterResponseError) { 762665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 772665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EmptyKeymasterResponse msg(ver); 782665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.error = KM_ERROR_MEMORY_ALLOCATION_FAILED; 79da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 802665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<EmptyKeymasterResponse> deserialized(round_trip(ver, msg, 4)); 812665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 82da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 83da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 84da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, SupportedAlgorithmsResponse) { 852665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 862665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden SupportedAlgorithmsResponse rsp(ver); 879c65b2bd1978a918b52a459596dafc7dde992416Shawn Willden keymaster_algorithm_t algorithms[] = {KM_ALGORITHM_RSA, KM_ALGORITHM_EC}; 882665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden rsp.error = KM_ERROR_OK; 892665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden rsp.algorithms = dup_array(algorithms); 902665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden rsp.algorithms_length = array_length(algorithms); 912665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 929c65b2bd1978a918b52a459596dafc7dde992416Shawn Willden UniquePtr<SupportedAlgorithmsResponse> deserialized(round_trip(ver, rsp, 16)); 932665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(array_length(algorithms), deserialized->algorithms_length); 942665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0, memcmp(deserialized->algorithms, algorithms, array_size(algorithms))); 952665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 96128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden} 97128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden 98da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, SupportedResponse) { 992665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 1002665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden SupportedResponse<keymaster_digest_t> rsp(ver); 1012665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden keymaster_digest_t digests[] = {KM_DIGEST_NONE, KM_DIGEST_MD5, KM_DIGEST_SHA1}; 1022665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden rsp.error = KM_ERROR_OK; 1032665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden rsp.SetResults(digests); 1042665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 1052665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<SupportedResponse<keymaster_digest_t>> deserialized(round_trip(ver, rsp, 20)); 1062665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(array_length(digests), deserialized->results_length); 1072665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0, memcmp(deserialized->results, digests, array_size(digests))); 1082665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 109da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 110da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 111da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willdenstatic keymaster_key_param_t params[] = { 112ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), 113ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY), 114ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA), 115ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden Authorization(TAG_USER_ID, 7), 116eb63b9799eadcaa6ef206f8b804d7432e0dab14aShawn Willden Authorization(TAG_USER_AUTH_TYPE, HW_AUTH_PASSWORD), 117ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden Authorization(TAG_APPLICATION_ID, "app_id", 6), 118ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden Authorization(TAG_AUTH_TIMEOUT, 300), 119da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}; 120128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willdenuint8_t TEST_DATA[] = "a key blob"; 121128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden 122da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, GenerateKeyRequest) { 1232665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 1242665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden GenerateKeyRequest req(ver); 1252665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden req.key_description.Reinitialize(params, array_length(params)); 1262665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<GenerateKeyRequest> deserialized(round_trip(ver, req, 78)); 1272665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(deserialized->key_description, req.key_description); 1282665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 129da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 130da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 131da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, GenerateKeyResponse) { 1322665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 1332665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden GenerateKeyResponse rsp(ver); 1342665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden rsp.error = KM_ERROR_OK; 1352665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden rsp.key_blob.key_material = dup_array(TEST_DATA); 1362665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden rsp.key_blob.key_material_size = array_length(TEST_DATA); 1372665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden rsp.enforced.Reinitialize(params, array_length(params)); 1382665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 1392665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<GenerateKeyResponse> deserialized(round_trip(ver, rsp, 109)); 1402665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(KM_ERROR_OK, deserialized->error); 1412665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(deserialized->enforced, rsp.enforced); 1422665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(deserialized->unenforced, rsp.unenforced); 1432665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 144da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 145128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden 146da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, GenerateKeyResponseTestError) { 1472665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 1482665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden GenerateKeyResponse rsp(ver); 1492665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden rsp.error = KM_ERROR_UNSUPPORTED_ALGORITHM; 1502665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden rsp.key_blob.key_material = dup_array(TEST_DATA); 1512665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden rsp.key_blob.key_material_size = array_length(TEST_DATA); 1522665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden rsp.enforced.Reinitialize(params, array_length(params)); 1532665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 1542665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<GenerateKeyResponse> deserialized(round_trip(ver, rsp, 4)); 1552665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(KM_ERROR_UNSUPPORTED_ALGORITHM, deserialized->error); 1562665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0U, deserialized->enforced.size()); 1572665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0U, deserialized->unenforced.size()); 1582665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0U, deserialized->key_blob.key_material_size); 1592665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 160da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 161da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 162da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, GetKeyCharacteristicsRequest) { 1632665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 1642665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden GetKeyCharacteristicsRequest req(ver); 1652665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden req.additional_params.Reinitialize(params, array_length(params)); 1662665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden req.SetKeyMaterial("foo", 3); 1672665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 1682665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<GetKeyCharacteristicsRequest> deserialized(round_trip(ver, req, 85)); 1692665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(7U, deserialized->additional_params.size()); 1702665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(3U, deserialized->key_blob.key_material_size); 1712665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0, memcmp(deserialized->key_blob.key_material, "foo", 3)); 1722665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 173da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 174128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden 175da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, GetKeyCharacteristicsResponse) { 1762665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 1772665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden GetKeyCharacteristicsResponse msg(ver); 1782665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.error = KM_ERROR_OK; 1792665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.enforced.Reinitialize(params, array_length(params)); 1802665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.unenforced.Reinitialize(params, array_length(params)); 1812665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 1822665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<GetKeyCharacteristicsResponse> deserialized(round_trip(ver, msg, 160)); 1832665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(msg.enforced, deserialized->enforced); 1842665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(msg.unenforced, deserialized->unenforced); 1852665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 186da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 187da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 188da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, BeginOperationRequest) { 1892665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 1902665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden BeginOperationRequest msg(ver); 1912665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.purpose = KM_PURPOSE_SIGN; 1922665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.SetKeyMaterial("foo", 3); 1932665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.additional_params.Reinitialize(params, array_length(params)); 1942665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 1952665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<BeginOperationRequest> deserialized(round_trip(ver, msg, 89)); 1962665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(KM_PURPOSE_SIGN, deserialized->purpose); 1972665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(3U, deserialized->key_blob.key_material_size); 1982665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0, memcmp(deserialized->key_blob.key_material, "foo", 3)); 1992665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(msg.additional_params, deserialized->additional_params); 2002665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 201da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 202da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 203da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, BeginOperationResponse) { 2042665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 2052665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden BeginOperationResponse msg(ver); 2062665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.error = KM_ERROR_OK; 2072665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.op_handle = 0xDEADBEEF; 2087b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden msg.output_params.push_back(Authorization(TAG_NONCE, "foo", 3)); 2097b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden 2107b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden UniquePtr<BeginOperationResponse> deserialized; 2117b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden switch (ver) { 2127b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden case 0: 2137b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden deserialized.reset(round_trip(ver, msg, 12)); 2147b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden break; 2157b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden case 1: 216ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden case 2: 2177b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden deserialized.reset(round_trip(ver, msg, 39)); 2187b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden break; 2197b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden default: 2207b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden FAIL(); 2217b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden } 2222665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 2232665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(KM_ERROR_OK, deserialized->error); 2242665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0xDEADBEEF, deserialized->op_handle); 2257b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden 2267b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden switch (ver) { 2277b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden case 0: 228c609659a4b469778f523bece9ad0235fcfe6dd91Shawn Willden EXPECT_EQ(0U, deserialized->output_params.size()); 2297b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden break; 2307b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden case 1: 231ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden case 2: 2327b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden EXPECT_EQ(msg.output_params, deserialized->output_params); 2337b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden break; 2347b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden default: 2357b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden FAIL(); 2367b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden } 2372665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 238da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 239da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 240da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, BeginOperationResponseError) { 2412665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 2422665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden BeginOperationResponse msg(ver); 2432665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.error = KM_ERROR_INVALID_OPERATION_HANDLE; 2442665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.op_handle = 0xDEADBEEF; 245da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 2462665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<BeginOperationResponse> deserialized(round_trip(ver, msg, 4)); 2472665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, deserialized->error); 2482665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 249da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 250da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 251da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, UpdateOperationRequest) { 2522665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 2532665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UpdateOperationRequest msg(ver); 2542665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.op_handle = 0xDEADBEEF; 2552665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.input.Reinitialize("foo", 3); 2562665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 257ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden UniquePtr<UpdateOperationRequest> deserialized; 258eb63b9799eadcaa6ef206f8b804d7432e0dab14aShawn Willden switch (ver) { 259ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden case 0: 260ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden deserialized.reset(round_trip(ver, msg, 15)); 261ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden break; 262ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden case 1: 263ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden case 2: 264ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden deserialized.reset(round_trip(ver, msg, 27)); 265ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden break; 266ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden default: 267ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden FAIL(); 268ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden } 2692665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(3U, deserialized->input.available_read()); 2702665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0, memcmp(deserialized->input.peek_read(), "foo", 3)); 2712665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 272da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 273da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 274da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, UpdateOperationResponse) { 2752665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 2762665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UpdateOperationResponse msg(ver); 2772665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.error = KM_ERROR_OK; 2782665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.output.Reinitialize("foo", 3); 279b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden msg.input_consumed = 99; 280ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden msg.output_params.push_back(TAG_APPLICATION_ID, "bar", 3); 281b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden 282b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden UniquePtr<UpdateOperationResponse> deserialized; 283b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden switch (ver) { 284b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden case 0: 285b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden deserialized.reset(round_trip(ver, msg, 11)); 286b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden break; 287b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden case 1: 288b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden deserialized.reset(round_trip(ver, msg, 15)); 289b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden break; 290ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden case 2: 291ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden deserialized.reset(round_trip(ver, msg, 42)); 292ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden break; 293b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden default: 294b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden FAIL(); 295b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden } 2962665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(KM_ERROR_OK, deserialized->error); 2972665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(3U, deserialized->output.available_read()); 2982665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0, memcmp(deserialized->output.peek_read(), "foo", 3)); 299b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden 300b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden switch (ver) { 301b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden case 0: 302c609659a4b469778f523bece9ad0235fcfe6dd91Shawn Willden EXPECT_EQ(0U, deserialized->input_consumed); 303b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden break; 304b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden case 1: 305c609659a4b469778f523bece9ad0235fcfe6dd91Shawn Willden EXPECT_EQ(99U, deserialized->input_consumed); 306b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden break; 307ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden case 2: 308ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden EXPECT_EQ(99U, deserialized->input_consumed); 309ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden EXPECT_EQ(1U, deserialized->output_params.size()); 310ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden break; 311b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden default: 312b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden FAIL(); 313b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden } 3142665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 315da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 316da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 317da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, FinishOperationRequest) { 3182665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 3192665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden FinishOperationRequest msg(ver); 3202665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.op_handle = 0xDEADBEEF; 3212665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.signature.Reinitialize("bar", 3); 3222665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 323ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden UniquePtr<FinishOperationRequest> deserialized; 324eb63b9799eadcaa6ef206f8b804d7432e0dab14aShawn Willden switch (ver) { 325ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden case 0: 326ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden deserialized.reset(round_trip(ver, msg, 15)); 327ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden break; 328ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden case 1: 329ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden case 2: 330ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden deserialized.reset(round_trip(ver, msg, 27)); 331ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden break; 332ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden default: 333ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden FAIL(); 334ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden } 3352665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0xDEADBEEF, deserialized->op_handle); 3362665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(3U, deserialized->signature.available_read()); 3372665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0, memcmp(deserialized->signature.peek_read(), "bar", 3)); 3382665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 339da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 340da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 341da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(Round_Trip, FinishOperationResponse) { 3422665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 3432665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden FinishOperationResponse msg(ver); 3442665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.error = KM_ERROR_OK; 3452665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.output.Reinitialize("foo", 3); 3462665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 347ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden UniquePtr<FinishOperationResponse> deserialized; 348ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden switch (ver) { 349ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden case 0: 350ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden case 1: 351ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden deserialized.reset(round_trip(ver, msg, 11)); 352ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden break; 353ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden case 2: 354ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden deserialized.reset(round_trip(ver, msg, 23)); 355ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden break; 356ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden default: 357ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden FAIL(); 358ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden } 3592665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(msg.error, deserialized->error); 3602665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(msg.output.available_read(), deserialized->output.available_read()); 3612665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0, memcmp(msg.output.peek_read(), deserialized->output.peek_read(), 3622665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.output.available_read())); 3632665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 364da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 365da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 366da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, ImportKeyRequest) { 3672665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 3682665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden ImportKeyRequest msg(ver); 3692665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.key_description.Reinitialize(params, array_length(params)); 3702665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.key_format = KM_KEY_FORMAT_X509; 3712665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.SetKeyMaterial("foo", 3); 3722665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 3732665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<ImportKeyRequest> deserialized(round_trip(ver, msg, 89)); 3742665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(msg.key_description, deserialized->key_description); 3752665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(msg.key_format, deserialized->key_format); 3762665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(msg.key_data_length, deserialized->key_data_length); 3772665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0, memcmp(msg.key_data, deserialized->key_data, msg.key_data_length)); 3782665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 379da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 380da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 381da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, ImportKeyResponse) { 3822665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 3832665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden ImportKeyResponse msg(ver); 3842665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.error = KM_ERROR_OK; 3852665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.SetKeyMaterial("foo", 3); 3862665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.enforced.Reinitialize(params, array_length(params)); 3872665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.unenforced.Reinitialize(params, array_length(params)); 3882665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 3892665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<ImportKeyResponse> deserialized(round_trip(ver, msg, 167)); 3902665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(msg.error, deserialized->error); 3912665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(msg.key_blob.key_material_size, deserialized->key_blob.key_material_size); 3922665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0, memcmp(msg.key_blob.key_material, deserialized->key_blob.key_material, 3932665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.key_blob.key_material_size)); 3942665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(msg.enforced, deserialized->enforced); 3952665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(msg.unenforced, deserialized->unenforced); 3962665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 397da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 398da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 399da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, ExportKeyRequest) { 4002665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 4012665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden ExportKeyRequest msg(ver); 4022665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.additional_params.Reinitialize(params, array_length(params)); 4032665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.key_format = KM_KEY_FORMAT_X509; 4042665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.SetKeyMaterial("foo", 3); 4052665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 4062665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<ExportKeyRequest> deserialized(round_trip(ver, msg, 89)); 4072665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(msg.additional_params, deserialized->additional_params); 4082665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(msg.key_format, deserialized->key_format); 4092665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(3U, deserialized->key_blob.key_material_size); 4102665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0, memcmp("foo", deserialized->key_blob.key_material, 3)); 4112665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 412da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 413da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 414da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, ExportKeyResponse) { 4152665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 4162665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden ExportKeyResponse msg(ver); 4172665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.error = KM_ERROR_OK; 4182665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.SetKeyMaterial("foo", 3); 4192665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 4202665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<ExportKeyResponse> deserialized(round_trip(ver, msg, 11)); 4212665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(3U, deserialized->key_data_length); 4222665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0, memcmp("foo", deserialized->key_data, 3)); 4232665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 4242665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden} 4252665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 4262beb628bfefae72fa6bb84a6235da7e3de532823Shawn WilldenTEST(RoundTrip, DeleteKeyRequest) { 4272beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 4282beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden DeleteKeyRequest msg(ver); 4292beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden msg.SetKeyMaterial("foo", 3); 4302beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden 4312beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden UniquePtr<DeleteKeyRequest> deserialized(round_trip(ver, msg, 7)); 4322beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden EXPECT_EQ(3U, deserialized->key_blob.key_material_size); 4332beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden EXPECT_EQ(0, memcmp("foo", deserialized->key_blob.key_material, 3)); 4342beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden } 4352beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden} 4362beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden 4372665e868b1153cb89ad7cd906ae160cb417d4438Shawn WilldenTEST(RoundTrip, GetVersionRequest) { 4382665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden GetVersionRequest msg; 4392665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 4402665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden size_t size = msg.SerializedSize(); 441c609659a4b469778f523bece9ad0235fcfe6dd91Shawn Willden ASSERT_EQ(0U, size); 4422665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 4432665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<uint8_t[]> buf(new uint8_t[size]); 4442665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(buf.get() + size, msg.Serialize(buf.get(), buf.get() + size)); 4452665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 4462665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden GetVersionRequest deserialized; 4472665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden const uint8_t* p = buf.get(); 4482665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_TRUE(deserialized.Deserialize(&p, p + size)); 4492665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ((ptrdiff_t)size, p - buf.get()); 4502665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden} 4512665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 4522665e868b1153cb89ad7cd906ae160cb417d4438Shawn WilldenTEST(RoundTrip, GetVersionResponse) { 4532665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden GetVersionResponse msg; 454da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden msg.error = KM_ERROR_OK; 4552665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.major_ver = 9; 4562665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.minor_ver = 98; 4572665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.subminor_ver = 38; 4582665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 4592665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden size_t size = msg.SerializedSize(); 460c609659a4b469778f523bece9ad0235fcfe6dd91Shawn Willden ASSERT_EQ(7U, size); 461da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 4622665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<uint8_t[]> buf(new uint8_t[size]); 4632665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(buf.get() + size, msg.Serialize(buf.get(), buf.get() + size)); 4642665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 4652665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden GetVersionResponse deserialized; 4662665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden const uint8_t* p = buf.get(); 4672665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_TRUE(deserialized.Deserialize(&p, p + size)); 4682665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ((ptrdiff_t)size, p - buf.get()); 469c609659a4b469778f523bece9ad0235fcfe6dd91Shawn Willden EXPECT_EQ(9U, msg.major_ver); 470c609659a4b469778f523bece9ad0235fcfe6dd91Shawn Willden EXPECT_EQ(98U, msg.minor_ver); 471c609659a4b469778f523bece9ad0235fcfe6dd91Shawn Willden EXPECT_EQ(38U, msg.subminor_ver); 472128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden} 473128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden 474cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn WilldenTEST(RoundTrip, AddEntropyRequest) { 475cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 476cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden AddEntropyRequest msg(ver); 477cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden msg.random_data.Reinitialize("foo", 3); 478cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden 479cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden UniquePtr<AddEntropyRequest> deserialized(round_trip(ver, msg, 7)); 480cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden EXPECT_EQ(3U, deserialized->random_data.available_read()); 481cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden EXPECT_EQ(0, memcmp("foo", deserialized->random_data.peek_read(), 3)); 482cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden } 483cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden} 484cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden 485f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willdenuint8_t msgbuf[] = { 486f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 220, 88, 183, 255, 71, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 487f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 0, 173, 0, 0, 0, 228, 174, 98, 187, 191, 135, 253, 200, 51, 230, 114, 247, 151, 109, 488f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 237, 79, 87, 32, 94, 5, 204, 46, 154, 30, 91, 6, 103, 148, 254, 129, 65, 171, 228, 489f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 167, 224, 163, 9, 15, 206, 90, 58, 11, 205, 55, 211, 33, 87, 178, 149, 91, 28, 236, 490f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 218, 112, 231, 34, 82, 82, 134, 103, 137, 115, 27, 156, 102, 159, 220, 226, 89, 42, 25, 491f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 37, 9, 84, 239, 76, 161, 198, 72, 167, 163, 39, 91, 148, 191, 17, 191, 87, 169, 179, 492f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 136, 10, 194, 154, 4, 40, 107, 109, 61, 161, 20, 176, 247, 13, 214, 106, 229, 45, 17, 493f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 5, 60, 189, 64, 39, 166, 208, 14, 57, 25, 140, 148, 25, 177, 246, 189, 43, 181, 88, 494f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 204, 29, 126, 224, 100, 143, 93, 60, 57, 249, 55, 0, 87, 83, 227, 224, 166, 59, 214, 495f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 81, 144, 129, 58, 6, 57, 46, 254, 232, 41, 220, 209, 230, 167, 138, 158, 94, 180, 125, 496f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 247, 26, 162, 116, 238, 202, 187, 100, 65, 13, 180, 44, 245, 159, 83, 161, 176, 58, 72, 497f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 236, 109, 105, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 498f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 0, 11, 0, 0, 0, 98, 0, 0, 0, 1, 0, 0, 32, 2, 0, 0, 0, 1, 0, 499f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 0, 32, 3, 0, 0, 0, 2, 0, 0, 16, 1, 0, 0, 0, 3, 0, 0, 48, 0, 500f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 1, 0, 0, 200, 0, 0, 80, 3, 0, 0, 0, 0, 0, 0, 0, 244, 1, 0, 112, 501f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 1, 246, 1, 0, 112, 1, 189, 2, 0, 96, 144, 178, 236, 250, 255, 255, 255, 255, 145, 502f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 1, 0, 96, 144, 226, 33, 60, 222, 2, 0, 0, 189, 2, 0, 96, 0, 0, 0, 0, 503f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 0, 0, 0, 0, 190, 2, 0, 16, 1, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 504f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 0, 0, 0, 0, 0, 0, 0, 11, 0, 505f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 0, 0, 98, 0, 0, 0, 1, 0, 0, 32, 2, 0, 0, 0, 1, 0, 0, 32, 3, 506f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 0, 0, 0, 2, 0, 0, 16, 1, 0, 0, 0, 3, 0, 0, 48, 0, 1, 0, 0, 507f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 200, 0, 0, 80, 3, 0, 0, 0, 0, 0, 0, 0, 244, 1, 0, 112, 1, 246, 1, 508f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 0, 112, 1, 189, 2, 0, 96, 144, 178, 236, 250, 255, 255, 255, 255, 145, 1, 0, 96, 509f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 144, 226, 33, 60, 222, 2, 0, 0, 189, 2, 0, 96, 0, 0, 0, 0, 0, 0, 0, 510f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 0, 190, 2, 0, 16, 1, 0, 0, 0, 511f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden}; 512f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 513f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden/* 514f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden * These tests don't have any assertions or expectations. They just try to parse garbage, to see if 515f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden * the result will be a crash. This is especially informative when run under Valgrind memcheck. 516f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden */ 517f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 518f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willdentemplate <typename Message> void parse_garbage() { 5192665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int32_t ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 5202665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden Message msg(ver); 5212665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden const uint8_t* end = msgbuf + array_length(msgbuf); 5222665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (size_t i = 0; i < array_length(msgbuf); ++i) { 5232665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden const uint8_t* begin = msgbuf + i; 5242665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden const uint8_t* p = begin; 5252665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.Deserialize(&p, end); 5262665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 527f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden } 528f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden} 529f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 530f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden#define GARBAGE_TEST(Message) \ 531f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden TEST(GarbageTest, Message) { parse_garbage<Message>(); } 532f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 533f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(SupportedAlgorithmsResponse) 534f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(GenerateKeyRequest); 535f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(GenerateKeyResponse); 536f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(GetKeyCharacteristicsRequest); 537f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(GetKeyCharacteristicsResponse); 538f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(BeginOperationRequest); 539f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(BeginOperationResponse); 540f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(UpdateOperationRequest); 541f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(UpdateOperationResponse); 542f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(FinishOperationRequest); 543f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(FinishOperationResponse); 544cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn WilldenGARBAGE_TEST(AddEntropyRequest); 545f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(ImportKeyRequest); 546f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(ImportKeyResponse); 547f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(ExportKeyRequest); 548f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(ExportKeyResponse); 5492beb628bfefae72fa6bb84a6235da7e3de532823Shawn WilldenGARBAGE_TEST(DeleteKeyRequest); 550f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 551f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden// The macro doesn't work on this one. 552f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenTEST(GarbageTest, SupportedResponse) { 553f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden parse_garbage<SupportedResponse<keymaster_digest_t>>(); 554f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden} 555f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 556128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden} // namespace test 5572665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 558128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden} // namespace keymaster 559