android_keymaster_messages_test.cpp revision b6837e7a62a1192e33beef586282812239ee8b28
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 2198d9b92547a9a7553b99e3e941a4175926f95b62Shawn Willden#include <keymaster/keymaster_tags.h> 22b6837e7a62a1192e33beef586282812239ee8b28Shawn Willden#include <keymaster/android_keymaster_utils.h> 2398d9b92547a9a7553b99e3e941a4175926f95b62Shawn Willden 24b6837e7a62a1192e33beef586282812239ee8b28Shawn Willden#include "android_keymaster_test_utils.h" 25b6837e7a62a1192e33beef586282812239ee8b28Shawn Willden#include "android_softkeymaster.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[] = { 1122665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY), 113da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA), Authorization(TAG_USER_ID, 7), 114eb63b9799eadcaa6ef206f8b804d7432e0dab14aShawn Willden Authorization(TAG_USER_AUTH_TYPE, HW_AUTH_PASSWORD), 115eb63b9799eadcaa6ef206f8b804d7432e0dab14aShawn Willden Authorization(TAG_APPLICATION_ID, "app_id", 6), Authorization(TAG_AUTH_TIMEOUT, 300), 116da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}; 117128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willdenuint8_t TEST_DATA[] = "a key blob"; 118128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden 119da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, GenerateKeyRequest) { 1202665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 1212665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden GenerateKeyRequest req(ver); 1222665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden req.key_description.Reinitialize(params, array_length(params)); 1232665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<GenerateKeyRequest> deserialized(round_trip(ver, req, 78)); 1242665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(deserialized->key_description, req.key_description); 1252665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 126da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 127da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 128da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, GenerateKeyResponse) { 1292665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 1302665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden GenerateKeyResponse rsp(ver); 1312665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden rsp.error = KM_ERROR_OK; 1322665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden rsp.key_blob.key_material = dup_array(TEST_DATA); 1332665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden rsp.key_blob.key_material_size = array_length(TEST_DATA); 1342665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden rsp.enforced.Reinitialize(params, array_length(params)); 1352665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 1362665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<GenerateKeyResponse> deserialized(round_trip(ver, rsp, 109)); 1372665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(KM_ERROR_OK, deserialized->error); 1382665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(deserialized->enforced, rsp.enforced); 1392665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(deserialized->unenforced, rsp.unenforced); 1402665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 141da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 142128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden 143da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, GenerateKeyResponseTestError) { 1442665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 1452665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden GenerateKeyResponse rsp(ver); 1462665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden rsp.error = KM_ERROR_UNSUPPORTED_ALGORITHM; 1472665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden rsp.key_blob.key_material = dup_array(TEST_DATA); 1482665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden rsp.key_blob.key_material_size = array_length(TEST_DATA); 1492665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden rsp.enforced.Reinitialize(params, array_length(params)); 1502665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 1512665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<GenerateKeyResponse> deserialized(round_trip(ver, rsp, 4)); 1522665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(KM_ERROR_UNSUPPORTED_ALGORITHM, deserialized->error); 1532665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0U, deserialized->enforced.size()); 1542665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0U, deserialized->unenforced.size()); 1552665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0U, deserialized->key_blob.key_material_size); 1562665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 157da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 158da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 159da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, GetKeyCharacteristicsRequest) { 1602665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 1612665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden GetKeyCharacteristicsRequest req(ver); 1622665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden req.additional_params.Reinitialize(params, array_length(params)); 1632665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden req.SetKeyMaterial("foo", 3); 1642665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 1652665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<GetKeyCharacteristicsRequest> deserialized(round_trip(ver, req, 85)); 1662665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(7U, deserialized->additional_params.size()); 1672665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(3U, deserialized->key_blob.key_material_size); 1682665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0, memcmp(deserialized->key_blob.key_material, "foo", 3)); 1692665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 170da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 171128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden 172da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, GetKeyCharacteristicsResponse) { 1732665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 1742665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden GetKeyCharacteristicsResponse msg(ver); 1752665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.error = KM_ERROR_OK; 1762665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.enforced.Reinitialize(params, array_length(params)); 1772665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.unenforced.Reinitialize(params, array_length(params)); 1782665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 1792665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<GetKeyCharacteristicsResponse> deserialized(round_trip(ver, msg, 160)); 1802665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(msg.enforced, deserialized->enforced); 1812665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(msg.unenforced, deserialized->unenforced); 1822665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 183da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 184da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 185da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, BeginOperationRequest) { 1862665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 1872665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden BeginOperationRequest msg(ver); 1882665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.purpose = KM_PURPOSE_SIGN; 1892665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.SetKeyMaterial("foo", 3); 1902665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.additional_params.Reinitialize(params, array_length(params)); 1912665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 1922665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<BeginOperationRequest> deserialized(round_trip(ver, msg, 89)); 1932665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(KM_PURPOSE_SIGN, deserialized->purpose); 1942665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(3U, deserialized->key_blob.key_material_size); 1952665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0, memcmp(deserialized->key_blob.key_material, "foo", 3)); 1962665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(msg.additional_params, deserialized->additional_params); 1972665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 198da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 199da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 200da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, BeginOperationResponse) { 2012665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 2022665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden BeginOperationResponse msg(ver); 2032665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.error = KM_ERROR_OK; 2042665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.op_handle = 0xDEADBEEF; 2057b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden msg.output_params.push_back(Authorization(TAG_NONCE, "foo", 3)); 2067b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden 2077b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden UniquePtr<BeginOperationResponse> deserialized; 2087b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden switch (ver) { 2097b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden case 0: 2107b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden deserialized.reset(round_trip(ver, msg, 12)); 2117b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden break; 2127b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden case 1: 2137b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden deserialized.reset(round_trip(ver, msg, 39)); 2147b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden break; 2157b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden default: 2167b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden FAIL(); 2177b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden } 2182665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 2192665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(KM_ERROR_OK, deserialized->error); 2202665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0xDEADBEEF, deserialized->op_handle); 2217b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden 2227b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden switch (ver) { 2237b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden case 0: 224c609659a4b469778f523bece9ad0235fcfe6dd91Shawn Willden EXPECT_EQ(0U, deserialized->output_params.size()); 2257b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden break; 2267b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden case 1: 2277b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden EXPECT_EQ(msg.output_params, deserialized->output_params); 2287b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden break; 2297b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden default: 2307b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden FAIL(); 2317b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden } 2322665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 233da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 234da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 235da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, BeginOperationResponseError) { 2362665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 2372665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden BeginOperationResponse msg(ver); 2382665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.error = KM_ERROR_INVALID_OPERATION_HANDLE; 2392665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.op_handle = 0xDEADBEEF; 240da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 2412665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<BeginOperationResponse> deserialized(round_trip(ver, msg, 4)); 2422665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, deserialized->error); 2432665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 244da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 245da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 246da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, UpdateOperationRequest) { 2472665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 2482665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UpdateOperationRequest msg(ver); 2492665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.op_handle = 0xDEADBEEF; 2502665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.input.Reinitialize("foo", 3); 2512665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 252ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden UniquePtr<UpdateOperationRequest> deserialized; 253eb63b9799eadcaa6ef206f8b804d7432e0dab14aShawn Willden switch (ver) { 254ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden case 0: 255ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden deserialized.reset(round_trip(ver, msg, 15)); 256ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden break; 257ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden case 1: 258ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden deserialized.reset(round_trip(ver, msg, 27)); 259ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden break; 260ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden default: 261ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden FAIL(); 262ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden } 2632665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(3U, deserialized->input.available_read()); 2642665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0, memcmp(deserialized->input.peek_read(), "foo", 3)); 2652665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 266da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 267da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 268da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, UpdateOperationResponse) { 2692665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 2702665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UpdateOperationResponse msg(ver); 2712665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.error = KM_ERROR_OK; 2722665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.output.Reinitialize("foo", 3); 273b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden msg.input_consumed = 99; 274b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden 275b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden UniquePtr<UpdateOperationResponse> deserialized; 276b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden switch (ver) { 277b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden case 0: 278b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden deserialized.reset(round_trip(ver, msg, 11)); 279b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden break; 280b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden case 1: 281b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden deserialized.reset(round_trip(ver, msg, 15)); 282b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden break; 283b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden default: 284b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden FAIL(); 285b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden } 2862665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(KM_ERROR_OK, deserialized->error); 2872665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(3U, deserialized->output.available_read()); 2882665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0, memcmp(deserialized->output.peek_read(), "foo", 3)); 289b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden 290b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden switch (ver) { 291b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden case 0: 292c609659a4b469778f523bece9ad0235fcfe6dd91Shawn Willden EXPECT_EQ(0U, deserialized->input_consumed); 293b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden break; 294b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden case 1: 295c609659a4b469778f523bece9ad0235fcfe6dd91Shawn Willden EXPECT_EQ(99U, deserialized->input_consumed); 296b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden break; 297b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden default: 298b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden FAIL(); 299b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden } 3002665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 301da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 302da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 303da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, FinishOperationRequest) { 3042665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 3052665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden FinishOperationRequest msg(ver); 3062665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.op_handle = 0xDEADBEEF; 3072665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.signature.Reinitialize("bar", 3); 3082665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 309ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden UniquePtr<FinishOperationRequest> deserialized; 310eb63b9799eadcaa6ef206f8b804d7432e0dab14aShawn Willden switch (ver) { 311ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden case 0: 312ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden deserialized.reset(round_trip(ver, msg, 15)); 313ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden break; 314ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden case 1: 315ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden deserialized.reset(round_trip(ver, msg, 27)); 316ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden break; 317ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden default: 318ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden FAIL(); 319ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden } 3202665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0xDEADBEEF, deserialized->op_handle); 3212665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(3U, deserialized->signature.available_read()); 3222665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0, memcmp(deserialized->signature.peek_read(), "bar", 3)); 3232665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 324da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 325da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 326da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(Round_Trip, FinishOperationResponse) { 3272665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 3282665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden FinishOperationResponse msg(ver); 3292665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.error = KM_ERROR_OK; 3302665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.output.Reinitialize("foo", 3); 3312665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 3322665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<FinishOperationResponse> deserialized(round_trip(ver, msg, 11)); 3332665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(msg.error, deserialized->error); 3342665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(msg.output.available_read(), deserialized->output.available_read()); 3352665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0, memcmp(msg.output.peek_read(), deserialized->output.peek_read(), 3362665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.output.available_read())); 3372665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 338da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 339da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 340da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, ImportKeyRequest) { 3412665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 3422665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden ImportKeyRequest msg(ver); 3432665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.key_description.Reinitialize(params, array_length(params)); 3442665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.key_format = KM_KEY_FORMAT_X509; 3452665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.SetKeyMaterial("foo", 3); 3462665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 3472665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<ImportKeyRequest> deserialized(round_trip(ver, msg, 89)); 3482665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(msg.key_description, deserialized->key_description); 3492665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(msg.key_format, deserialized->key_format); 3502665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(msg.key_data_length, deserialized->key_data_length); 3512665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0, memcmp(msg.key_data, deserialized->key_data, msg.key_data_length)); 3522665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 353da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 354da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 355da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, ImportKeyResponse) { 3562665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 3572665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden ImportKeyResponse msg(ver); 3582665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.error = KM_ERROR_OK; 3592665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.SetKeyMaterial("foo", 3); 3602665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.enforced.Reinitialize(params, array_length(params)); 3612665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.unenforced.Reinitialize(params, array_length(params)); 3622665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 3632665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<ImportKeyResponse> deserialized(round_trip(ver, msg, 167)); 3642665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(msg.error, deserialized->error); 3652665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(msg.key_blob.key_material_size, deserialized->key_blob.key_material_size); 3662665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0, memcmp(msg.key_blob.key_material, deserialized->key_blob.key_material, 3672665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.key_blob.key_material_size)); 3682665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(msg.enforced, deserialized->enforced); 3692665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(msg.unenforced, deserialized->unenforced); 3702665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 371da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 372da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 373da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, ExportKeyRequest) { 3742665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 3752665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden ExportKeyRequest msg(ver); 3762665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.additional_params.Reinitialize(params, array_length(params)); 3772665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.key_format = KM_KEY_FORMAT_X509; 3782665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.SetKeyMaterial("foo", 3); 3792665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 3802665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<ExportKeyRequest> deserialized(round_trip(ver, msg, 89)); 3812665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(msg.additional_params, deserialized->additional_params); 3822665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(msg.key_format, deserialized->key_format); 3832665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(3U, deserialized->key_blob.key_material_size); 3842665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0, memcmp("foo", deserialized->key_blob.key_material, 3)); 3852665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 386da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 387da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 388da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, ExportKeyResponse) { 3892665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 3902665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden ExportKeyResponse msg(ver); 3912665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.error = KM_ERROR_OK; 3922665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.SetKeyMaterial("foo", 3); 3932665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 3942665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<ExportKeyResponse> deserialized(round_trip(ver, msg, 11)); 3952665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(3U, deserialized->key_data_length); 3962665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0, memcmp("foo", deserialized->key_data, 3)); 3972665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 3982665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden} 3992665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 4002665e868b1153cb89ad7cd906ae160cb417d4438Shawn WilldenTEST(RoundTrip, GetVersionRequest) { 4012665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden GetVersionRequest msg; 4022665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 4032665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden size_t size = msg.SerializedSize(); 404c609659a4b469778f523bece9ad0235fcfe6dd91Shawn Willden ASSERT_EQ(0U, size); 4052665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 4062665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<uint8_t[]> buf(new uint8_t[size]); 4072665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(buf.get() + size, msg.Serialize(buf.get(), buf.get() + size)); 4082665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 4092665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden GetVersionRequest deserialized; 4102665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden const uint8_t* p = buf.get(); 4112665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_TRUE(deserialized.Deserialize(&p, p + size)); 4122665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ((ptrdiff_t)size, p - buf.get()); 4132665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden} 4142665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 4152665e868b1153cb89ad7cd906ae160cb417d4438Shawn WilldenTEST(RoundTrip, GetVersionResponse) { 4162665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden GetVersionResponse msg; 417da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden msg.error = KM_ERROR_OK; 4182665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.major_ver = 9; 4192665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.minor_ver = 98; 4202665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.subminor_ver = 38; 4212665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 4222665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden size_t size = msg.SerializedSize(); 423c609659a4b469778f523bece9ad0235fcfe6dd91Shawn Willden ASSERT_EQ(7U, size); 424da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 4252665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<uint8_t[]> buf(new uint8_t[size]); 4262665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(buf.get() + size, msg.Serialize(buf.get(), buf.get() + size)); 4272665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 4282665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden GetVersionResponse deserialized; 4292665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden const uint8_t* p = buf.get(); 4302665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_TRUE(deserialized.Deserialize(&p, p + size)); 4312665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ((ptrdiff_t)size, p - buf.get()); 432c609659a4b469778f523bece9ad0235fcfe6dd91Shawn Willden EXPECT_EQ(9U, msg.major_ver); 433c609659a4b469778f523bece9ad0235fcfe6dd91Shawn Willden EXPECT_EQ(98U, msg.minor_ver); 434c609659a4b469778f523bece9ad0235fcfe6dd91Shawn Willden EXPECT_EQ(38U, msg.subminor_ver); 435128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden} 436128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden 437cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn WilldenTEST(RoundTrip, AddEntropyRequest) { 438cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 439cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden AddEntropyRequest msg(ver); 440cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden msg.random_data.Reinitialize("foo", 3); 441cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden 442cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden UniquePtr<AddEntropyRequest> deserialized(round_trip(ver, msg, 7)); 443cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden EXPECT_EQ(3U, deserialized->random_data.available_read()); 444cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden EXPECT_EQ(0, memcmp("foo", deserialized->random_data.peek_read(), 3)); 445cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden } 446cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden} 447cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden 448f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willdenuint8_t msgbuf[] = { 449f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 220, 88, 183, 255, 71, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 0, 173, 0, 0, 0, 228, 174, 98, 187, 191, 135, 253, 200, 51, 230, 114, 247, 151, 109, 451f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 237, 79, 87, 32, 94, 5, 204, 46, 154, 30, 91, 6, 103, 148, 254, 129, 65, 171, 228, 452f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 167, 224, 163, 9, 15, 206, 90, 58, 11, 205, 55, 211, 33, 87, 178, 149, 91, 28, 236, 453f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 218, 112, 231, 34, 82, 82, 134, 103, 137, 115, 27, 156, 102, 159, 220, 226, 89, 42, 25, 454f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 37, 9, 84, 239, 76, 161, 198, 72, 167, 163, 39, 91, 148, 191, 17, 191, 87, 169, 179, 455f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 136, 10, 194, 154, 4, 40, 107, 109, 61, 161, 20, 176, 247, 13, 214, 106, 229, 45, 17, 456f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 5, 60, 189, 64, 39, 166, 208, 14, 57, 25, 140, 148, 25, 177, 246, 189, 43, 181, 88, 457f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 204, 29, 126, 224, 100, 143, 93, 60, 57, 249, 55, 0, 87, 83, 227, 224, 166, 59, 214, 458f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 81, 144, 129, 58, 6, 57, 46, 254, 232, 41, 220, 209, 230, 167, 138, 158, 94, 180, 125, 459f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 247, 26, 162, 116, 238, 202, 187, 100, 65, 13, 180, 44, 245, 159, 83, 161, 176, 58, 72, 460f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 236, 109, 105, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 461f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 0, 11, 0, 0, 0, 98, 0, 0, 0, 1, 0, 0, 32, 2, 0, 0, 0, 1, 0, 462f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 0, 32, 3, 0, 0, 0, 2, 0, 0, 16, 1, 0, 0, 0, 3, 0, 0, 48, 0, 463f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 1, 0, 0, 200, 0, 0, 80, 3, 0, 0, 0, 0, 0, 0, 0, 244, 1, 0, 112, 464f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 1, 246, 1, 0, 112, 1, 189, 2, 0, 96, 144, 178, 236, 250, 255, 255, 255, 255, 145, 465f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 1, 0, 96, 144, 226, 33, 60, 222, 2, 0, 0, 189, 2, 0, 96, 0, 0, 0, 0, 466f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 0, 0, 0, 0, 190, 2, 0, 16, 1, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 467f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 0, 0, 0, 0, 0, 0, 0, 11, 0, 468f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 0, 0, 98, 0, 0, 0, 1, 0, 0, 32, 2, 0, 0, 0, 1, 0, 0, 32, 3, 469f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 0, 0, 0, 2, 0, 0, 16, 1, 0, 0, 0, 3, 0, 0, 48, 0, 1, 0, 0, 470f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 200, 0, 0, 80, 3, 0, 0, 0, 0, 0, 0, 0, 244, 1, 0, 112, 1, 246, 1, 471f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 0, 112, 1, 189, 2, 0, 96, 144, 178, 236, 250, 255, 255, 255, 255, 145, 1, 0, 96, 472f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 144, 226, 33, 60, 222, 2, 0, 0, 189, 2, 0, 96, 0, 0, 0, 0, 0, 0, 0, 473f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 0, 190, 2, 0, 16, 1, 0, 0, 0, 474f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden}; 475f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 476f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden/* 477f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden * These tests don't have any assertions or expectations. They just try to parse garbage, to see if 478f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden * the result will be a crash. This is especially informative when run under Valgrind memcheck. 479f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden */ 480f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 481f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willdentemplate <typename Message> void parse_garbage() { 4822665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int32_t ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 4832665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden Message msg(ver); 4842665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden const uint8_t* end = msgbuf + array_length(msgbuf); 4852665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (size_t i = 0; i < array_length(msgbuf); ++i) { 4862665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden const uint8_t* begin = msgbuf + i; 4872665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden const uint8_t* p = begin; 4882665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.Deserialize(&p, end); 4892665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 490f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden } 491f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden} 492f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 493f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden#define GARBAGE_TEST(Message) \ 494f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden TEST(GarbageTest, Message) { parse_garbage<Message>(); } 495f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 496f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(SupportedAlgorithmsResponse) 497f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(GenerateKeyRequest); 498f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(GenerateKeyResponse); 499f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(GetKeyCharacteristicsRequest); 500f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(GetKeyCharacteristicsResponse); 501f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(BeginOperationRequest); 502f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(BeginOperationResponse); 503f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(UpdateOperationRequest); 504f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(UpdateOperationResponse); 505f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(FinishOperationRequest); 506f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(FinishOperationResponse); 507cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn WilldenGARBAGE_TEST(AddEntropyRequest); 508f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(ImportKeyRequest); 509f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(ImportKeyResponse); 510f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(ExportKeyRequest); 511f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(ExportKeyResponse); 512f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 513f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden// The macro doesn't work on this one. 514f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenTEST(GarbageTest, SupportedResponse) { 515f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden parse_garbage<SupportedResponse<keymaster_digest_t>>(); 516f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden} 517f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 518128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden} // namespace test 5192665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 520128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden} // namespace keymaster 521