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 8436d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenTEST(RoundTrip, SupportedByAlgorithmRequest) { 852665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 8636d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden SupportedByAlgorithmRequest req(ver); 8736d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden req.algorithm = KM_ALGORITHM_EC; 882665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 8936d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden UniquePtr<SupportedByAlgorithmRequest> deserialized(round_trip(ver, req, 4)); 9036d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden EXPECT_EQ(KM_ALGORITHM_EC, deserialized->algorithm); 9136d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden } 9236d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden} 9336d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden 9436d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenTEST(RoundTrip, SupportedByAlgorithmAndPurposeRequest) { 9536d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 9636d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden SupportedByAlgorithmAndPurposeRequest req(ver); 9736d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden req.algorithm = KM_ALGORITHM_EC; 9836d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden req.purpose = KM_PURPOSE_DECRYPT; 9936d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden 10036d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden UniquePtr<SupportedByAlgorithmAndPurposeRequest> deserialized(round_trip(ver, req, 8)); 10136d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden EXPECT_EQ(KM_ALGORITHM_EC, deserialized->algorithm); 10236d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden EXPECT_EQ(KM_PURPOSE_DECRYPT, deserialized->purpose); 1032665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 104128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden} 105128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden 106da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, SupportedResponse) { 1072665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 1082665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden SupportedResponse<keymaster_digest_t> rsp(ver); 1092665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden keymaster_digest_t digests[] = {KM_DIGEST_NONE, KM_DIGEST_MD5, KM_DIGEST_SHA1}; 1102665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden rsp.error = KM_ERROR_OK; 1112665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden rsp.SetResults(digests); 1122665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 1132665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<SupportedResponse<keymaster_digest_t>> deserialized(round_trip(ver, rsp, 20)); 1142665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(array_length(digests), deserialized->results_length); 1152665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0, memcmp(deserialized->results, digests, array_size(digests))); 1162665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 117da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 118da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 119da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willdenstatic keymaster_key_param_t params[] = { 120ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), 121ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY), 122ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA), 123ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden Authorization(TAG_USER_ID, 7), 124eb63b9799eadcaa6ef206f8b804d7432e0dab14aShawn Willden Authorization(TAG_USER_AUTH_TYPE, HW_AUTH_PASSWORD), 125ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden Authorization(TAG_APPLICATION_ID, "app_id", 6), 126ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden Authorization(TAG_AUTH_TIMEOUT, 300), 127da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}; 128128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willdenuint8_t TEST_DATA[] = "a key blob"; 129128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden 130da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, GenerateKeyRequest) { 1312665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 1322665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden GenerateKeyRequest req(ver); 1332665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden req.key_description.Reinitialize(params, array_length(params)); 1342665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<GenerateKeyRequest> deserialized(round_trip(ver, req, 78)); 1352665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(deserialized->key_description, req.key_description); 1362665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 137da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 138da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 139da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, GenerateKeyResponse) { 1402665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 1412665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden GenerateKeyResponse rsp(ver); 1422665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden rsp.error = KM_ERROR_OK; 1432665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden rsp.key_blob.key_material = dup_array(TEST_DATA); 1442665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden rsp.key_blob.key_material_size = array_length(TEST_DATA); 1452665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden rsp.enforced.Reinitialize(params, array_length(params)); 1462665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 1472665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<GenerateKeyResponse> deserialized(round_trip(ver, rsp, 109)); 1482665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(KM_ERROR_OK, deserialized->error); 1492665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(deserialized->enforced, rsp.enforced); 1502665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(deserialized->unenforced, rsp.unenforced); 1512665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 152da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 153128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden 154da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, GenerateKeyResponseTestError) { 1552665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 1562665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden GenerateKeyResponse rsp(ver); 1572665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden rsp.error = KM_ERROR_UNSUPPORTED_ALGORITHM; 1582665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden rsp.key_blob.key_material = dup_array(TEST_DATA); 1592665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden rsp.key_blob.key_material_size = array_length(TEST_DATA); 1602665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden rsp.enforced.Reinitialize(params, array_length(params)); 1612665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 1622665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<GenerateKeyResponse> deserialized(round_trip(ver, rsp, 4)); 1632665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(KM_ERROR_UNSUPPORTED_ALGORITHM, deserialized->error); 1642665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0U, deserialized->enforced.size()); 1652665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0U, deserialized->unenforced.size()); 1662665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0U, deserialized->key_blob.key_material_size); 1672665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 168da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 169da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 170da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, GetKeyCharacteristicsRequest) { 1712665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 1722665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden GetKeyCharacteristicsRequest req(ver); 1732665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden req.additional_params.Reinitialize(params, array_length(params)); 1742665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden req.SetKeyMaterial("foo", 3); 1752665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 1762665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<GetKeyCharacteristicsRequest> deserialized(round_trip(ver, req, 85)); 1772665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(7U, deserialized->additional_params.size()); 1782665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(3U, deserialized->key_blob.key_material_size); 1792665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0, memcmp(deserialized->key_blob.key_material, "foo", 3)); 1802665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 181da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 182128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden 183da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, GetKeyCharacteristicsResponse) { 1842665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 1852665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden GetKeyCharacteristicsResponse msg(ver); 1862665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.error = KM_ERROR_OK; 1872665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.enforced.Reinitialize(params, array_length(params)); 1882665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.unenforced.Reinitialize(params, array_length(params)); 1892665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 1902665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<GetKeyCharacteristicsResponse> deserialized(round_trip(ver, msg, 160)); 1912665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(msg.enforced, deserialized->enforced); 1922665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(msg.unenforced, deserialized->unenforced); 1932665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 194da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 195da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 196da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, BeginOperationRequest) { 1972665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 1982665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden BeginOperationRequest msg(ver); 1992665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.purpose = KM_PURPOSE_SIGN; 2002665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.SetKeyMaterial("foo", 3); 2012665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.additional_params.Reinitialize(params, array_length(params)); 2022665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 2032665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<BeginOperationRequest> deserialized(round_trip(ver, msg, 89)); 2042665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(KM_PURPOSE_SIGN, deserialized->purpose); 2052665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(3U, deserialized->key_blob.key_material_size); 2062665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0, memcmp(deserialized->key_blob.key_material, "foo", 3)); 2072665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(msg.additional_params, deserialized->additional_params); 2082665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 209da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 210da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 211da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, BeginOperationResponse) { 2122665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 2132665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden BeginOperationResponse msg(ver); 2142665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.error = KM_ERROR_OK; 2152665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.op_handle = 0xDEADBEEF; 2167b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden msg.output_params.push_back(Authorization(TAG_NONCE, "foo", 3)); 2177b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden 2187b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden UniquePtr<BeginOperationResponse> deserialized; 2197b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden switch (ver) { 2207b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden case 0: 2217b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden deserialized.reset(round_trip(ver, msg, 12)); 2227b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden break; 2237b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden case 1: 224ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden case 2: 2254ed2d7ed2275735ddc4952f310badfa4dcbaf04eShawn Willden case 3: 2267b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden deserialized.reset(round_trip(ver, msg, 39)); 2277b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden break; 2287b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden default: 2297b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden FAIL(); 2307b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden } 2312665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 2322665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(KM_ERROR_OK, deserialized->error); 2332665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0xDEADBEEF, deserialized->op_handle); 2347b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden 2357b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden switch (ver) { 2367b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden case 0: 237c609659a4b469778f523bece9ad0235fcfe6dd91Shawn Willden EXPECT_EQ(0U, deserialized->output_params.size()); 2387b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden break; 2397b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden case 1: 240ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden case 2: 2414ed2d7ed2275735ddc4952f310badfa4dcbaf04eShawn Willden case 3: 2427b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden EXPECT_EQ(msg.output_params, deserialized->output_params); 2437b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden break; 2447b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden default: 2457b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden FAIL(); 2467b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden } 2472665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 248da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 249da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 250da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, BeginOperationResponseError) { 2512665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 2522665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden BeginOperationResponse msg(ver); 2532665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.error = KM_ERROR_INVALID_OPERATION_HANDLE; 2542665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.op_handle = 0xDEADBEEF; 255da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 2562665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<BeginOperationResponse> deserialized(round_trip(ver, msg, 4)); 2572665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, deserialized->error); 2582665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 259da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 260da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 261da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, UpdateOperationRequest) { 2622665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 2632665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UpdateOperationRequest msg(ver); 2642665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.op_handle = 0xDEADBEEF; 2652665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.input.Reinitialize("foo", 3); 2662665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 267ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden UniquePtr<UpdateOperationRequest> deserialized; 268eb63b9799eadcaa6ef206f8b804d7432e0dab14aShawn Willden switch (ver) { 269ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden case 0: 270ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden deserialized.reset(round_trip(ver, msg, 15)); 271ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden break; 272ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden case 1: 273ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden case 2: 2744ed2d7ed2275735ddc4952f310badfa4dcbaf04eShawn Willden case 3: 275ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden deserialized.reset(round_trip(ver, msg, 27)); 276ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden break; 277ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden default: 278ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden FAIL(); 279ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden } 2802665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(3U, deserialized->input.available_read()); 2812665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0, memcmp(deserialized->input.peek_read(), "foo", 3)); 2822665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 283da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 284da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 285da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, UpdateOperationResponse) { 2862665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 2872665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UpdateOperationResponse msg(ver); 2882665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.error = KM_ERROR_OK; 2892665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.output.Reinitialize("foo", 3); 290b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden msg.input_consumed = 99; 291ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden msg.output_params.push_back(TAG_APPLICATION_ID, "bar", 3); 292b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden 293b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden UniquePtr<UpdateOperationResponse> deserialized; 294b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden switch (ver) { 295b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden case 0: 296b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden deserialized.reset(round_trip(ver, msg, 11)); 297b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden break; 298b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden case 1: 299b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden deserialized.reset(round_trip(ver, msg, 15)); 300b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden break; 301ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden case 2: 3024ed2d7ed2275735ddc4952f310badfa4dcbaf04eShawn Willden case 3: 303ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden deserialized.reset(round_trip(ver, msg, 42)); 304ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden break; 305b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden default: 306b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden FAIL(); 307b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden } 3082665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(KM_ERROR_OK, deserialized->error); 3092665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(3U, deserialized->output.available_read()); 3102665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0, memcmp(deserialized->output.peek_read(), "foo", 3)); 311b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden 312b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden switch (ver) { 313b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden case 0: 314c609659a4b469778f523bece9ad0235fcfe6dd91Shawn Willden EXPECT_EQ(0U, deserialized->input_consumed); 315b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden break; 316b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden case 1: 317c609659a4b469778f523bece9ad0235fcfe6dd91Shawn Willden EXPECT_EQ(99U, deserialized->input_consumed); 318b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden break; 319ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden case 2: 3204ed2d7ed2275735ddc4952f310badfa4dcbaf04eShawn Willden case 3: 321ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden EXPECT_EQ(99U, deserialized->input_consumed); 322ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden EXPECT_EQ(1U, deserialized->output_params.size()); 323ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden break; 324b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden default: 325b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden FAIL(); 326b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden } 3272665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 328da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 329da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 330da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, FinishOperationRequest) { 3312665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 3322665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden FinishOperationRequest msg(ver); 3332665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.op_handle = 0xDEADBEEF; 3342665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.signature.Reinitialize("bar", 3); 3354ed2d7ed2275735ddc4952f310badfa4dcbaf04eShawn Willden msg.input.Reinitialize("baz", 3); 3362665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 337ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden UniquePtr<FinishOperationRequest> deserialized; 338eb63b9799eadcaa6ef206f8b804d7432e0dab14aShawn Willden switch (ver) { 339ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden case 0: 340ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden deserialized.reset(round_trip(ver, msg, 15)); 341ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden break; 342ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden case 1: 343ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden case 2: 344ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden deserialized.reset(round_trip(ver, msg, 27)); 345ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden break; 3464ed2d7ed2275735ddc4952f310badfa4dcbaf04eShawn Willden case 3: 3474ed2d7ed2275735ddc4952f310badfa4dcbaf04eShawn Willden deserialized.reset(round_trip(ver, msg, 34)); 3484ed2d7ed2275735ddc4952f310badfa4dcbaf04eShawn Willden break; 349ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden default: 350ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden FAIL(); 351ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden } 3522665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0xDEADBEEF, deserialized->op_handle); 3532665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(3U, deserialized->signature.available_read()); 3542665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0, memcmp(deserialized->signature.peek_read(), "bar", 3)); 3552665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 356da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 357da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 358da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(Round_Trip, FinishOperationResponse) { 3592665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 3602665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden FinishOperationResponse msg(ver); 3612665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.error = KM_ERROR_OK; 3622665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.output.Reinitialize("foo", 3); 3632665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 364ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden UniquePtr<FinishOperationResponse> deserialized; 365ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden switch (ver) { 366ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden case 0: 367ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden case 1: 368ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden deserialized.reset(round_trip(ver, msg, 11)); 369ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden break; 370ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden case 2: 3714ed2d7ed2275735ddc4952f310badfa4dcbaf04eShawn Willden case 3: 372ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden deserialized.reset(round_trip(ver, msg, 23)); 373ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden break; 374ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden default: 375ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden FAIL(); 376ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden } 3772665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(msg.error, deserialized->error); 3782665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(msg.output.available_read(), deserialized->output.available_read()); 3792665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0, memcmp(msg.output.peek_read(), deserialized->output.peek_read(), 3802665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.output.available_read())); 3812665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 382da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 383da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 384da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, ImportKeyRequest) { 3852665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 3862665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden ImportKeyRequest msg(ver); 3872665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.key_description.Reinitialize(params, array_length(params)); 3882665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.key_format = KM_KEY_FORMAT_X509; 3892665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.SetKeyMaterial("foo", 3); 3902665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 3912665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<ImportKeyRequest> deserialized(round_trip(ver, msg, 89)); 3922665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(msg.key_description, deserialized->key_description); 3932665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(msg.key_format, deserialized->key_format); 3942665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(msg.key_data_length, deserialized->key_data_length); 3952665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0, memcmp(msg.key_data, deserialized->key_data, msg.key_data_length)); 3962665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 397da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 398da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 399da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, ImportKeyResponse) { 4002665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 4012665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden ImportKeyResponse msg(ver); 4022665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.error = KM_ERROR_OK; 4032665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.SetKeyMaterial("foo", 3); 4042665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.enforced.Reinitialize(params, array_length(params)); 4052665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.unenforced.Reinitialize(params, array_length(params)); 4062665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 4072665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<ImportKeyResponse> deserialized(round_trip(ver, msg, 167)); 4082665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(msg.error, deserialized->error); 4092665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(msg.key_blob.key_material_size, deserialized->key_blob.key_material_size); 4102665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0, memcmp(msg.key_blob.key_material, deserialized->key_blob.key_material, 4112665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.key_blob.key_material_size)); 4122665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(msg.enforced, deserialized->enforced); 4132665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(msg.unenforced, deserialized->unenforced); 4142665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 415da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 416da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 417da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, ExportKeyRequest) { 4182665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 4192665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden ExportKeyRequest msg(ver); 4202665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.additional_params.Reinitialize(params, array_length(params)); 4212665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.key_format = KM_KEY_FORMAT_X509; 4222665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.SetKeyMaterial("foo", 3); 4232665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 4242665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<ExportKeyRequest> deserialized(round_trip(ver, msg, 89)); 4252665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(msg.additional_params, deserialized->additional_params); 4262665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(msg.key_format, deserialized->key_format); 4272665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(3U, deserialized->key_blob.key_material_size); 4282665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0, memcmp("foo", deserialized->key_blob.key_material, 3)); 4292665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 430da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 431da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 432da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, ExportKeyResponse) { 4332665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 4342665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden ExportKeyResponse msg(ver); 4352665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.error = KM_ERROR_OK; 4362665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.SetKeyMaterial("foo", 3); 4372665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 4382665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<ExportKeyResponse> deserialized(round_trip(ver, msg, 11)); 4392665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(3U, deserialized->key_data_length); 4402665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0, memcmp("foo", deserialized->key_data, 3)); 4412665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 4422665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden} 4432665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 4442beb628bfefae72fa6bb84a6235da7e3de532823Shawn WilldenTEST(RoundTrip, DeleteKeyRequest) { 4452beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 4462beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden DeleteKeyRequest msg(ver); 4472beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden msg.SetKeyMaterial("foo", 3); 4482beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden 4492beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden UniquePtr<DeleteKeyRequest> deserialized(round_trip(ver, msg, 7)); 4502beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden EXPECT_EQ(3U, deserialized->key_blob.key_material_size); 4512beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden EXPECT_EQ(0, memcmp("foo", deserialized->key_blob.key_material, 3)); 4522beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden } 4532beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden} 4542beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden 45536d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenTEST(RoundTrip, DeleteKeyResponse) { 45636d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 45736d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden DeleteKeyResponse msg(ver); 45836d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden UniquePtr<DeleteKeyResponse> deserialized(round_trip(ver, msg, 4)); 45936d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden } 46036d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden} 46136d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden 46236d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenTEST(RoundTrip, DeleteAllKeysRequest) { 46336d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 46436d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden DeleteAllKeysRequest msg(ver); 46536d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden UniquePtr<DeleteAllKeysRequest> deserialized(round_trip(ver, msg, 0)); 46636d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden } 46736d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden} 46836d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden 46936d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenTEST(RoundTrip, DeleteAllKeysResponse) { 47036d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 47136d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden DeleteAllKeysResponse msg(ver); 47236d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden UniquePtr<DeleteAllKeysResponse> deserialized(round_trip(ver, msg, 4)); 47336d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden } 47436d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden} 47536d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden 4762665e868b1153cb89ad7cd906ae160cb417d4438Shawn WilldenTEST(RoundTrip, GetVersionRequest) { 4772665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden GetVersionRequest msg; 4782665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 4792665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden size_t size = msg.SerializedSize(); 480c609659a4b469778f523bece9ad0235fcfe6dd91Shawn Willden ASSERT_EQ(0U, size); 4812665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 4822665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<uint8_t[]> buf(new uint8_t[size]); 4832665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(buf.get() + size, msg.Serialize(buf.get(), buf.get() + size)); 4842665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 4852665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden GetVersionRequest deserialized; 4862665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden const uint8_t* p = buf.get(); 4872665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_TRUE(deserialized.Deserialize(&p, p + size)); 4882665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ((ptrdiff_t)size, p - buf.get()); 4892665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden} 4902665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 4912665e868b1153cb89ad7cd906ae160cb417d4438Shawn WilldenTEST(RoundTrip, GetVersionResponse) { 4922665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden GetVersionResponse msg; 493da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden msg.error = KM_ERROR_OK; 4942665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.major_ver = 9; 4952665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.minor_ver = 98; 4962665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.subminor_ver = 38; 4972665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 4982665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden size_t size = msg.SerializedSize(); 499c609659a4b469778f523bece9ad0235fcfe6dd91Shawn Willden ASSERT_EQ(7U, size); 500da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 5012665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<uint8_t[]> buf(new uint8_t[size]); 5022665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(buf.get() + size, msg.Serialize(buf.get(), buf.get() + size)); 5032665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 5042665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden GetVersionResponse deserialized; 5052665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden const uint8_t* p = buf.get(); 5062665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_TRUE(deserialized.Deserialize(&p, p + size)); 5072665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ((ptrdiff_t)size, p - buf.get()); 508c609659a4b469778f523bece9ad0235fcfe6dd91Shawn Willden EXPECT_EQ(9U, msg.major_ver); 509c609659a4b469778f523bece9ad0235fcfe6dd91Shawn Willden EXPECT_EQ(98U, msg.minor_ver); 510c609659a4b469778f523bece9ad0235fcfe6dd91Shawn Willden EXPECT_EQ(38U, msg.subminor_ver); 511128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden} 512128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden 513cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn WilldenTEST(RoundTrip, AddEntropyRequest) { 514cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 515cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden AddEntropyRequest msg(ver); 516cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden msg.random_data.Reinitialize("foo", 3); 517cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden 518cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden UniquePtr<AddEntropyRequest> deserialized(round_trip(ver, msg, 7)); 519cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden EXPECT_EQ(3U, deserialized->random_data.available_read()); 520cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden EXPECT_EQ(0, memcmp("foo", deserialized->random_data.peek_read(), 3)); 521cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden } 522cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden} 523cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden 52436d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenTEST(RoundTrip, AddEntropyResponse) { 52536d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 52636d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden AddEntropyResponse msg(ver); 52736d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden UniquePtr<AddEntropyResponse> deserialized(round_trip(ver, msg, 4)); 52836d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden } 52936d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden} 53036d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden 53136d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenTEST(RoundTrip, AbortOperationRequest) { 53236d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 53336d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden AbortOperationRequest msg(ver); 53436d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden UniquePtr<AbortOperationRequest> deserialized(round_trip(ver, msg, 8)); 53536d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden } 53636d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden} 53736d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden 53836d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenTEST(RoundTrip, AbortOperationResponse) { 53936d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 54036d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden AbortOperationResponse msg(ver); 54136d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden UniquePtr<AbortOperationResponse> deserialized(round_trip(ver, msg, 4)); 54236d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden } 54336d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden} 54436d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden 5453d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn WilldenTEST(RoundTrip, AttestKeyRequest) { 5463d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 5473d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden AttestKeyRequest msg(ver); 5483d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden msg.SetKeyMaterial("foo", 3); 5493d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden msg.attest_params.Reinitialize(params, array_length(params)); 5503d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden 5513d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden UniquePtr<AttestKeyRequest> deserialized(round_trip(ver, msg, 85)); 5523d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden EXPECT_EQ(3U, deserialized->key_blob.key_material_size); 5533d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden EXPECT_EQ(0, memcmp("foo", deserialized->key_blob.key_material, 3)); 5543d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden EXPECT_EQ(msg.attest_params, deserialized->attest_params); 5553d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden } 5563d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden} 5573d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden 5583d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn WilldenTEST(RoundTrip, AttestKeyResponse) { 5593d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 5603d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden AttestKeyResponse msg(ver); 5613d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden msg.error = KM_ERROR_OK; 5623d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden EXPECT_TRUE(msg.AllocateChain(3)); 5633d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden msg.certificate_chain.entries[0] = {dup_buffer("foo", 3), 3}; 5643d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden msg.certificate_chain.entries[1] = {dup_buffer("bar", 3), 3}; 5653d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden msg.certificate_chain.entries[2] = {dup_buffer("baz", 3), 3}; 5663d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden 5673d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden UniquePtr<AttestKeyResponse> deserialized(round_trip(ver, msg, 29)); 5683d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden keymaster_cert_chain_t* chain = &deserialized->certificate_chain; 5693d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden 5703d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden EXPECT_NE(nullptr, chain->entries); 5713d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden EXPECT_EQ(3U, chain->entry_count); 5723d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden EXPECT_EQ(3U, chain->entries[0].data_length); 5733d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden EXPECT_EQ(0, memcmp("foo", chain->entries[0].data, 3)); 5743d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden EXPECT_EQ(3U, chain->entries[1].data_length); 5753d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden EXPECT_EQ(0, memcmp("bar", chain->entries[1].data, 3)); 5763d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden EXPECT_EQ(3U, chain->entries[2].data_length); 5773d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden EXPECT_EQ(0, memcmp("baz", chain->entries[2].data, 3)); 5783d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden } 5793d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden} 5803d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden 581c15af1910d8f451341d0068b5533816ace5defecShawn WilldenTEST(RoundTrip, UpgradeKeyRequest) { 582c15af1910d8f451341d0068b5533816ace5defecShawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 583c15af1910d8f451341d0068b5533816ace5defecShawn Willden UpgradeKeyRequest msg(ver); 584c15af1910d8f451341d0068b5533816ace5defecShawn Willden msg.SetKeyMaterial("foo", 3); 585c15af1910d8f451341d0068b5533816ace5defecShawn Willden msg.upgrade_params.Reinitialize(params, array_length(params)); 586c15af1910d8f451341d0068b5533816ace5defecShawn Willden 587c15af1910d8f451341d0068b5533816ace5defecShawn Willden UniquePtr<UpgradeKeyRequest> deserialized(round_trip(ver, msg, 85)); 588c15af1910d8f451341d0068b5533816ace5defecShawn Willden EXPECT_EQ(3U, deserialized->key_blob.key_material_size); 589c15af1910d8f451341d0068b5533816ace5defecShawn Willden EXPECT_EQ(0, memcmp("foo", deserialized->key_blob.key_material, 3)); 590c15af1910d8f451341d0068b5533816ace5defecShawn Willden EXPECT_EQ(msg.upgrade_params, deserialized->upgrade_params); 591c15af1910d8f451341d0068b5533816ace5defecShawn Willden } 592c15af1910d8f451341d0068b5533816ace5defecShawn Willden} 593c15af1910d8f451341d0068b5533816ace5defecShawn Willden 594c15af1910d8f451341d0068b5533816ace5defecShawn WilldenTEST(RoundTrip, UpgradeKeyResponse) { 595c15af1910d8f451341d0068b5533816ace5defecShawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 596c15af1910d8f451341d0068b5533816ace5defecShawn Willden UpgradeKeyResponse req(ver); 597c15af1910d8f451341d0068b5533816ace5defecShawn Willden req.error = KM_ERROR_OK; 598c15af1910d8f451341d0068b5533816ace5defecShawn Willden req.upgraded_key.key_material = dup_array(TEST_DATA); 599c15af1910d8f451341d0068b5533816ace5defecShawn Willden req.upgraded_key.key_material_size = array_length(TEST_DATA); 600c15af1910d8f451341d0068b5533816ace5defecShawn Willden 601c15af1910d8f451341d0068b5533816ace5defecShawn Willden UniquePtr<UpgradeKeyResponse> deserialized(round_trip(ver, req, 19)); 602c15af1910d8f451341d0068b5533816ace5defecShawn Willden EXPECT_EQ(KM_ERROR_OK, deserialized->error); 603c15af1910d8f451341d0068b5533816ace5defecShawn Willden EXPECT_EQ(req.upgraded_key.key_material_size, deserialized->upgraded_key.key_material_size); 604c15af1910d8f451341d0068b5533816ace5defecShawn Willden EXPECT_EQ(0, memcmp(req.upgraded_key.key_material, deserialized->upgraded_key.key_material, 605c15af1910d8f451341d0068b5533816ace5defecShawn Willden req.upgraded_key.key_material_size)); 606c15af1910d8f451341d0068b5533816ace5defecShawn Willden } 607c15af1910d8f451341d0068b5533816ace5defecShawn Willden} 608c15af1910d8f451341d0068b5533816ace5defecShawn Willden 609f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willdenuint8_t msgbuf[] = { 610f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 220, 88, 183, 255, 71, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 611f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 0, 173, 0, 0, 0, 228, 174, 98, 187, 191, 135, 253, 200, 51, 230, 114, 247, 151, 109, 612f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 237, 79, 87, 32, 94, 5, 204, 46, 154, 30, 91, 6, 103, 148, 254, 129, 65, 171, 228, 613f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 167, 224, 163, 9, 15, 206, 90, 58, 11, 205, 55, 211, 33, 87, 178, 149, 91, 28, 236, 614f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 218, 112, 231, 34, 82, 82, 134, 103, 137, 115, 27, 156, 102, 159, 220, 226, 89, 42, 25, 615f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 37, 9, 84, 239, 76, 161, 198, 72, 167, 163, 39, 91, 148, 191, 17, 191, 87, 169, 179, 616f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 136, 10, 194, 154, 4, 40, 107, 109, 61, 161, 20, 176, 247, 13, 214, 106, 229, 45, 17, 617f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 5, 60, 189, 64, 39, 166, 208, 14, 57, 25, 140, 148, 25, 177, 246, 189, 43, 181, 88, 618f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 204, 29, 126, 224, 100, 143, 93, 60, 57, 249, 55, 0, 87, 83, 227, 224, 166, 59, 214, 619f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 81, 144, 129, 58, 6, 57, 46, 254, 232, 41, 220, 209, 230, 167, 138, 158, 94, 180, 125, 620f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 247, 26, 162, 116, 238, 202, 187, 100, 65, 13, 180, 44, 245, 159, 83, 161, 176, 58, 72, 621f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 236, 109, 105, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 622f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 0, 11, 0, 0, 0, 98, 0, 0, 0, 1, 0, 0, 32, 2, 0, 0, 0, 1, 0, 623f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 0, 32, 3, 0, 0, 0, 2, 0, 0, 16, 1, 0, 0, 0, 3, 0, 0, 48, 0, 624f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 1, 0, 0, 200, 0, 0, 80, 3, 0, 0, 0, 0, 0, 0, 0, 244, 1, 0, 112, 625f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 1, 246, 1, 0, 112, 1, 189, 2, 0, 96, 144, 178, 236, 250, 255, 255, 255, 255, 145, 626f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 1, 0, 96, 144, 226, 33, 60, 222, 2, 0, 0, 189, 2, 0, 96, 0, 0, 0, 0, 627f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 0, 0, 0, 0, 190, 2, 0, 16, 1, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 628f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 0, 0, 0, 0, 0, 0, 0, 11, 0, 629f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 0, 0, 98, 0, 0, 0, 1, 0, 0, 32, 2, 0, 0, 0, 1, 0, 0, 32, 3, 630f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 0, 0, 0, 2, 0, 0, 16, 1, 0, 0, 0, 3, 0, 0, 48, 0, 1, 0, 0, 631f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 200, 0, 0, 80, 3, 0, 0, 0, 0, 0, 0, 0, 244, 1, 0, 112, 1, 246, 1, 632f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 0, 112, 1, 189, 2, 0, 96, 144, 178, 236, 250, 255, 255, 255, 255, 145, 1, 0, 96, 633f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 144, 226, 33, 60, 222, 2, 0, 0, 189, 2, 0, 96, 0, 0, 0, 0, 0, 0, 0, 634f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 0, 190, 2, 0, 16, 1, 0, 0, 0, 635f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden}; 636f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 637f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden/* 638f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden * These tests don't have any assertions or expectations. They just try to parse garbage, to see if 639f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden * the result will be a crash. This is especially informative when run under Valgrind memcheck. 640f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden */ 641f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 642f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willdentemplate <typename Message> void parse_garbage() { 6432665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int32_t ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 6442665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden Message msg(ver); 6452665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden const uint8_t* end = msgbuf + array_length(msgbuf); 6462665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (size_t i = 0; i < array_length(msgbuf); ++i) { 6472665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden const uint8_t* begin = msgbuf + i; 6482665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden const uint8_t* p = begin; 6492665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.Deserialize(&p, end); 6502665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 651f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden } 6520f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden 6530f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden time_t now = time(NULL); 6540f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden std::cout << "Seeding rand() with " << now << " for fuzz test." << std::endl; 6550f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden srand(now); 6560f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden 6570f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden // Fill large buffer with random bytes. 6580f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden const int kBufSize = 10000; 6590f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden UniquePtr<uint8_t[]> buf(new uint8_t[kBufSize]); 6600f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden for (size_t i = 0; i < kBufSize; ++i) 6610f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden buf[i] = static_cast<uint8_t>(rand()); 6620f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden 6630f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden for (uint32_t ver = 0; ver < MAX_MESSAGE_VERSION; ++ver) { 6640f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden Message msg(ver); 6650f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden const uint8_t* end = buf.get() + kBufSize; 6660f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden for (size_t i = 0; i < kBufSize; ++i) { 6670f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden const uint8_t* begin = buf.get() + i; 6680f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden const uint8_t* p = begin; 6690f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden msg.Deserialize(&p, end); 6700f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden } 6710f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden } 672f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden} 673f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 674f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden#define GARBAGE_TEST(Message) \ 675f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden TEST(GarbageTest, Message) { parse_garbage<Message>(); } 676f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 67736d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(AbortOperationRequest); 67836d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(AbortOperationResponse); 67936d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(AddEntropyRequest); 68036d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(AddEntropyResponse); 681f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(BeginOperationRequest); 682f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(BeginOperationResponse); 68336d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(DeleteAllKeysRequest); 68436d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(DeleteAllKeysResponse); 68536d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(DeleteKeyRequest); 68636d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(DeleteKeyResponse); 68736d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(ExportKeyRequest); 68836d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(ExportKeyResponse); 689f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(FinishOperationRequest); 690f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(FinishOperationResponse); 69136d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(GenerateKeyRequest); 69236d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(GenerateKeyResponse); 69336d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(GetKeyCharacteristicsRequest); 69436d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(GetKeyCharacteristicsResponse); 695f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(ImportKeyRequest); 696f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(ImportKeyResponse); 69736d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(SupportedByAlgorithmAndPurposeRequest) 69836d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(SupportedByAlgorithmRequest) 69936d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(UpdateOperationRequest); 70036d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(UpdateOperationResponse); 7013d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn WilldenGARBAGE_TEST(AttestKeyRequest); 7023d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn WilldenGARBAGE_TEST(AttestKeyResponse); 703c15af1910d8f451341d0068b5533816ace5defecShawn WilldenGARBAGE_TEST(UpgradeKeyRequest); 704c15af1910d8f451341d0068b5533816ace5defecShawn WilldenGARBAGE_TEST(UpgradeKeyResponse); 705f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 706f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden// The macro doesn't work on this one. 707f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenTEST(GarbageTest, SupportedResponse) { 708f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden parse_garbage<SupportedResponse<keymaster_digest_t>>(); 709f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden} 710f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 711128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden} // namespace test 7122665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 713128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden} // namespace keymaster 714