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 17f38a002624126ca837865826f948edc9100d6e8aJanis Danisevskis#include <keymaster/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 { 5103d4b6d531eb8c2ebcb4d572a3bf118c70a83ff6Chih-Hung Hsieh explicit 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 51318d5ae3233b8e11adf2b52a086f6e4999c5733dfJocelyn BohrTEST(RoundTrip, ConfigureRequest) { 51418d5ae3233b8e11adf2b52a086f6e4999c5733dfJocelyn Bohr for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 51518d5ae3233b8e11adf2b52a086f6e4999c5733dfJocelyn Bohr ConfigureRequest req(ver); 51618d5ae3233b8e11adf2b52a086f6e4999c5733dfJocelyn Bohr req.os_version = 1; 51718d5ae3233b8e11adf2b52a086f6e4999c5733dfJocelyn Bohr req.os_patchlevel = 1; 51818d5ae3233b8e11adf2b52a086f6e4999c5733dfJocelyn Bohr 51918d5ae3233b8e11adf2b52a086f6e4999c5733dfJocelyn Bohr UniquePtr<ConfigureRequest> deserialized(round_trip(ver, req, 8)); 52018d5ae3233b8e11adf2b52a086f6e4999c5733dfJocelyn Bohr EXPECT_EQ(deserialized->os_version, req.os_version); 52118d5ae3233b8e11adf2b52a086f6e4999c5733dfJocelyn Bohr EXPECT_EQ(deserialized->os_patchlevel, req.os_patchlevel); 52218d5ae3233b8e11adf2b52a086f6e4999c5733dfJocelyn Bohr } 52318d5ae3233b8e11adf2b52a086f6e4999c5733dfJocelyn Bohr} 52418d5ae3233b8e11adf2b52a086f6e4999c5733dfJocelyn Bohr 52518d5ae3233b8e11adf2b52a086f6e4999c5733dfJocelyn BohrTEST(RoundTrip, ConfigureResponse) { 52618d5ae3233b8e11adf2b52a086f6e4999c5733dfJocelyn Bohr for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 52718d5ae3233b8e11adf2b52a086f6e4999c5733dfJocelyn Bohr ConfigureResponse rsp(ver); 52818d5ae3233b8e11adf2b52a086f6e4999c5733dfJocelyn Bohr UniquePtr<ConfigureResponse> deserialized(round_trip(ver, rsp, 4)); 52918d5ae3233b8e11adf2b52a086f6e4999c5733dfJocelyn Bohr } 53018d5ae3233b8e11adf2b52a086f6e4999c5733dfJocelyn Bohr} 53118d5ae3233b8e11adf2b52a086f6e4999c5733dfJocelyn Bohr 532cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn WilldenTEST(RoundTrip, AddEntropyRequest) { 533cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 534cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden AddEntropyRequest msg(ver); 535cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden msg.random_data.Reinitialize("foo", 3); 536cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden 537cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden UniquePtr<AddEntropyRequest> deserialized(round_trip(ver, msg, 7)); 538cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden EXPECT_EQ(3U, deserialized->random_data.available_read()); 539cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden EXPECT_EQ(0, memcmp("foo", deserialized->random_data.peek_read(), 3)); 540cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden } 541cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden} 542cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden 54336d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenTEST(RoundTrip, AddEntropyResponse) { 54436d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 54536d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden AddEntropyResponse msg(ver); 54636d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden UniquePtr<AddEntropyResponse> deserialized(round_trip(ver, msg, 4)); 54736d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden } 54836d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden} 54936d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden 55036d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenTEST(RoundTrip, AbortOperationRequest) { 55136d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 55236d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden AbortOperationRequest msg(ver); 55336d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden UniquePtr<AbortOperationRequest> deserialized(round_trip(ver, msg, 8)); 55436d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden } 55536d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden} 55636d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden 55736d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenTEST(RoundTrip, AbortOperationResponse) { 55836d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 55936d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden AbortOperationResponse msg(ver); 56036d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden UniquePtr<AbortOperationResponse> deserialized(round_trip(ver, msg, 4)); 56136d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden } 56236d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden} 56336d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden 5643d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn WilldenTEST(RoundTrip, AttestKeyRequest) { 5653d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 5663d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden AttestKeyRequest msg(ver); 5673d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden msg.SetKeyMaterial("foo", 3); 5683d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden msg.attest_params.Reinitialize(params, array_length(params)); 5693d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden 5703d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden UniquePtr<AttestKeyRequest> deserialized(round_trip(ver, msg, 85)); 5713d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden EXPECT_EQ(3U, deserialized->key_blob.key_material_size); 5723d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden EXPECT_EQ(0, memcmp("foo", deserialized->key_blob.key_material, 3)); 5733d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden EXPECT_EQ(msg.attest_params, deserialized->attest_params); 5743d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden } 5753d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden} 5763d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden 5773d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn WilldenTEST(RoundTrip, AttestKeyResponse) { 5783d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 5793d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden AttestKeyResponse msg(ver); 5803d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden msg.error = KM_ERROR_OK; 5813d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden EXPECT_TRUE(msg.AllocateChain(3)); 5823d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden msg.certificate_chain.entries[0] = {dup_buffer("foo", 3), 3}; 5833d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden msg.certificate_chain.entries[1] = {dup_buffer("bar", 3), 3}; 5843d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden msg.certificate_chain.entries[2] = {dup_buffer("baz", 3), 3}; 5853d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden 5863d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden UniquePtr<AttestKeyResponse> deserialized(round_trip(ver, msg, 29)); 5873d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden keymaster_cert_chain_t* chain = &deserialized->certificate_chain; 5883d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden 5893d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden EXPECT_NE(nullptr, chain->entries); 5903d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden EXPECT_EQ(3U, chain->entry_count); 5913d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden EXPECT_EQ(3U, chain->entries[0].data_length); 5923d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden EXPECT_EQ(0, memcmp("foo", chain->entries[0].data, 3)); 5933d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden EXPECT_EQ(3U, chain->entries[1].data_length); 5943d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden EXPECT_EQ(0, memcmp("bar", chain->entries[1].data, 3)); 5953d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden EXPECT_EQ(3U, chain->entries[2].data_length); 5963d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden EXPECT_EQ(0, memcmp("baz", chain->entries[2].data, 3)); 5973d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden } 5983d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden} 5993d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden 600c636e187cb4cb6c5b07fab9bb5d27878690376deShawn WilldenTEST(RoundTrip, UpgradeKeyRequest) { 601c636e187cb4cb6c5b07fab9bb5d27878690376deShawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 602c636e187cb4cb6c5b07fab9bb5d27878690376deShawn Willden UpgradeKeyRequest msg(ver); 603c636e187cb4cb6c5b07fab9bb5d27878690376deShawn Willden msg.SetKeyMaterial("foo", 3); 604c636e187cb4cb6c5b07fab9bb5d27878690376deShawn Willden msg.upgrade_params.Reinitialize(params, array_length(params)); 605c636e187cb4cb6c5b07fab9bb5d27878690376deShawn Willden 606c636e187cb4cb6c5b07fab9bb5d27878690376deShawn Willden UniquePtr<UpgradeKeyRequest> deserialized(round_trip(ver, msg, 85)); 607c636e187cb4cb6c5b07fab9bb5d27878690376deShawn Willden EXPECT_EQ(3U, deserialized->key_blob.key_material_size); 608c636e187cb4cb6c5b07fab9bb5d27878690376deShawn Willden EXPECT_EQ(0, memcmp("foo", deserialized->key_blob.key_material, 3)); 609c636e187cb4cb6c5b07fab9bb5d27878690376deShawn Willden EXPECT_EQ(msg.upgrade_params, deserialized->upgrade_params); 610c636e187cb4cb6c5b07fab9bb5d27878690376deShawn Willden } 611c636e187cb4cb6c5b07fab9bb5d27878690376deShawn Willden} 612c636e187cb4cb6c5b07fab9bb5d27878690376deShawn Willden 613c636e187cb4cb6c5b07fab9bb5d27878690376deShawn WilldenTEST(RoundTrip, UpgradeKeyResponse) { 614c636e187cb4cb6c5b07fab9bb5d27878690376deShawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 615c636e187cb4cb6c5b07fab9bb5d27878690376deShawn Willden UpgradeKeyResponse req(ver); 616c636e187cb4cb6c5b07fab9bb5d27878690376deShawn Willden req.error = KM_ERROR_OK; 617c636e187cb4cb6c5b07fab9bb5d27878690376deShawn Willden req.upgraded_key.key_material = dup_array(TEST_DATA); 618c636e187cb4cb6c5b07fab9bb5d27878690376deShawn Willden req.upgraded_key.key_material_size = array_length(TEST_DATA); 619c636e187cb4cb6c5b07fab9bb5d27878690376deShawn Willden 620c636e187cb4cb6c5b07fab9bb5d27878690376deShawn Willden UniquePtr<UpgradeKeyResponse> deserialized(round_trip(ver, req, 19)); 621c636e187cb4cb6c5b07fab9bb5d27878690376deShawn Willden EXPECT_EQ(KM_ERROR_OK, deserialized->error); 622c636e187cb4cb6c5b07fab9bb5d27878690376deShawn Willden EXPECT_EQ(req.upgraded_key.key_material_size, deserialized->upgraded_key.key_material_size); 623c636e187cb4cb6c5b07fab9bb5d27878690376deShawn Willden EXPECT_EQ(0, memcmp(req.upgraded_key.key_material, deserialized->upgraded_key.key_material, 624c636e187cb4cb6c5b07fab9bb5d27878690376deShawn Willden req.upgraded_key.key_material_size)); 625c636e187cb4cb6c5b07fab9bb5d27878690376deShawn Willden } 626c636e187cb4cb6c5b07fab9bb5d27878690376deShawn Willden} 627c636e187cb4cb6c5b07fab9bb5d27878690376deShawn Willden 628f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willdenuint8_t msgbuf[] = { 629f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 220, 88, 183, 255, 71, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 630f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 0, 173, 0, 0, 0, 228, 174, 98, 187, 191, 135, 253, 200, 51, 230, 114, 247, 151, 109, 631f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 237, 79, 87, 32, 94, 5, 204, 46, 154, 30, 91, 6, 103, 148, 254, 129, 65, 171, 228, 632f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 167, 224, 163, 9, 15, 206, 90, 58, 11, 205, 55, 211, 33, 87, 178, 149, 91, 28, 236, 633f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 218, 112, 231, 34, 82, 82, 134, 103, 137, 115, 27, 156, 102, 159, 220, 226, 89, 42, 25, 634f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 37, 9, 84, 239, 76, 161, 198, 72, 167, 163, 39, 91, 148, 191, 17, 191, 87, 169, 179, 635f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 136, 10, 194, 154, 4, 40, 107, 109, 61, 161, 20, 176, 247, 13, 214, 106, 229, 45, 17, 636f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 5, 60, 189, 64, 39, 166, 208, 14, 57, 25, 140, 148, 25, 177, 246, 189, 43, 181, 88, 637f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 204, 29, 126, 224, 100, 143, 93, 60, 57, 249, 55, 0, 87, 83, 227, 224, 166, 59, 214, 638f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 81, 144, 129, 58, 6, 57, 46, 254, 232, 41, 220, 209, 230, 167, 138, 158, 94, 180, 125, 639f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 247, 26, 162, 116, 238, 202, 187, 100, 65, 13, 180, 44, 245, 159, 83, 161, 176, 58, 72, 640f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 236, 109, 105, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 641f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 0, 11, 0, 0, 0, 98, 0, 0, 0, 1, 0, 0, 32, 2, 0, 0, 0, 1, 0, 642f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 0, 32, 3, 0, 0, 0, 2, 0, 0, 16, 1, 0, 0, 0, 3, 0, 0, 48, 0, 643f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 1, 0, 0, 200, 0, 0, 80, 3, 0, 0, 0, 0, 0, 0, 0, 244, 1, 0, 112, 644f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 1, 246, 1, 0, 112, 1, 189, 2, 0, 96, 144, 178, 236, 250, 255, 255, 255, 255, 145, 645f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 1, 0, 96, 144, 226, 33, 60, 222, 2, 0, 0, 189, 2, 0, 96, 0, 0, 0, 0, 646f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 0, 0, 0, 0, 190, 2, 0, 16, 1, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 647f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 0, 0, 0, 0, 0, 0, 0, 11, 0, 648f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 0, 0, 98, 0, 0, 0, 1, 0, 0, 32, 2, 0, 0, 0, 1, 0, 0, 32, 3, 649f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 0, 0, 0, 2, 0, 0, 16, 1, 0, 0, 0, 3, 0, 0, 48, 0, 1, 0, 0, 650f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 200, 0, 0, 80, 3, 0, 0, 0, 0, 0, 0, 0, 244, 1, 0, 112, 1, 246, 1, 651f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 0, 112, 1, 189, 2, 0, 96, 144, 178, 236, 250, 255, 255, 255, 255, 145, 1, 0, 96, 652f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 144, 226, 33, 60, 222, 2, 0, 0, 189, 2, 0, 96, 0, 0, 0, 0, 0, 0, 0, 653f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 0, 190, 2, 0, 16, 1, 0, 0, 0, 654f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden}; 655f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 656f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden/* 657f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden * These tests don't have any assertions or expectations. They just try to parse garbage, to see if 658f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden * the result will be a crash. This is especially informative when run under Valgrind memcheck. 659f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden */ 660f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 661f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willdentemplate <typename Message> void parse_garbage() { 6622665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int32_t ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 6632665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden Message msg(ver); 6642665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden const uint8_t* end = msgbuf + array_length(msgbuf); 6652665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (size_t i = 0; i < array_length(msgbuf); ++i) { 6662665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden const uint8_t* begin = msgbuf + i; 6672665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden const uint8_t* p = begin; 6682665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.Deserialize(&p, end); 6692665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 670f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden } 6710f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden 6720f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden time_t now = time(NULL); 6730f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden std::cout << "Seeding rand() with " << now << " for fuzz test." << std::endl; 6740f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden srand(now); 6750f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden 6760f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden // Fill large buffer with random bytes. 6770f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden const int kBufSize = 10000; 6780f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden UniquePtr<uint8_t[]> buf(new uint8_t[kBufSize]); 6790f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden for (size_t i = 0; i < kBufSize; ++i) 6800f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden buf[i] = static_cast<uint8_t>(rand()); 6810f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden 6820f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden for (uint32_t ver = 0; ver < MAX_MESSAGE_VERSION; ++ver) { 6830f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden Message msg(ver); 6840f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden const uint8_t* end = buf.get() + kBufSize; 6850f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden for (size_t i = 0; i < kBufSize; ++i) { 6860f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden const uint8_t* begin = buf.get() + i; 6870f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden const uint8_t* p = begin; 6880f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden msg.Deserialize(&p, end); 6890f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden } 6900f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden } 691f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden} 692f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 693f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden#define GARBAGE_TEST(Message) \ 694f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden TEST(GarbageTest, Message) { parse_garbage<Message>(); } 695f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 69636d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(AbortOperationRequest); 69736d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(AbortOperationResponse); 69836d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(AddEntropyRequest); 69936d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(AddEntropyResponse); 700f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(BeginOperationRequest); 701f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(BeginOperationResponse); 70236d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(DeleteAllKeysRequest); 70336d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(DeleteAllKeysResponse); 70436d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(DeleteKeyRequest); 70536d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(DeleteKeyResponse); 70636d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(ExportKeyRequest); 70736d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(ExportKeyResponse); 708f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(FinishOperationRequest); 709f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(FinishOperationResponse); 71036d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(GenerateKeyRequest); 71136d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(GenerateKeyResponse); 71236d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(GetKeyCharacteristicsRequest); 71336d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(GetKeyCharacteristicsResponse); 714f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(ImportKeyRequest); 715f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(ImportKeyResponse); 71636d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(SupportedByAlgorithmAndPurposeRequest) 71736d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(SupportedByAlgorithmRequest) 71836d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(UpdateOperationRequest); 71936d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(UpdateOperationResponse); 7203d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn WilldenGARBAGE_TEST(AttestKeyRequest); 7213d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn WilldenGARBAGE_TEST(AttestKeyResponse); 722c636e187cb4cb6c5b07fab9bb5d27878690376deShawn WilldenGARBAGE_TEST(UpgradeKeyRequest); 723c636e187cb4cb6c5b07fab9bb5d27878690376deShawn WilldenGARBAGE_TEST(UpgradeKeyResponse); 724f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 725f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden// The macro doesn't work on this one. 726f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenTEST(GarbageTest, SupportedResponse) { 727f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden parse_garbage<SupportedResponse<keymaster_digest_t>>(); 728f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden} 729f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 730128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden} // namespace test 7312665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 732128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden} // namespace keymaster 733