android_keymaster_messages_test.cpp revision 3d68cf64fb4bcea55406c3b6844b397ad264d8b2
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: 2257b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden deserialized.reset(round_trip(ver, msg, 39)); 2267b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden break; 2277b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden default: 2287b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden FAIL(); 2297b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden } 2302665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 2312665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(KM_ERROR_OK, deserialized->error); 2322665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0xDEADBEEF, deserialized->op_handle); 2337b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden 2347b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden switch (ver) { 2357b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden case 0: 236c609659a4b469778f523bece9ad0235fcfe6dd91Shawn Willden EXPECT_EQ(0U, deserialized->output_params.size()); 2377b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden break; 2387b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden case 1: 239ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden case 2: 2407b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden EXPECT_EQ(msg.output_params, deserialized->output_params); 2417b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden break; 2427b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden default: 2437b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden FAIL(); 2447b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden } 2452665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 246da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 247da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 248da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, BeginOperationResponseError) { 2492665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 2502665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden BeginOperationResponse msg(ver); 2512665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.error = KM_ERROR_INVALID_OPERATION_HANDLE; 2522665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.op_handle = 0xDEADBEEF; 253da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 2542665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<BeginOperationResponse> deserialized(round_trip(ver, msg, 4)); 2552665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, deserialized->error); 2562665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 257da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 258da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 259da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, UpdateOperationRequest) { 2602665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 2612665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UpdateOperationRequest msg(ver); 2622665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.op_handle = 0xDEADBEEF; 2632665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.input.Reinitialize("foo", 3); 2642665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 265ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden UniquePtr<UpdateOperationRequest> deserialized; 266eb63b9799eadcaa6ef206f8b804d7432e0dab14aShawn Willden switch (ver) { 267ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden case 0: 268ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden deserialized.reset(round_trip(ver, msg, 15)); 269ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden break; 270ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden case 1: 271ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden case 2: 272ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden deserialized.reset(round_trip(ver, msg, 27)); 273ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden break; 274ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden default: 275ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden FAIL(); 276ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden } 2772665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(3U, deserialized->input.available_read()); 2782665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0, memcmp(deserialized->input.peek_read(), "foo", 3)); 2792665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 280da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 281da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 282da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, UpdateOperationResponse) { 2832665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 2842665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UpdateOperationResponse msg(ver); 2852665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.error = KM_ERROR_OK; 2862665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.output.Reinitialize("foo", 3); 287b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden msg.input_consumed = 99; 288ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden msg.output_params.push_back(TAG_APPLICATION_ID, "bar", 3); 289b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden 290b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden UniquePtr<UpdateOperationResponse> deserialized; 291b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden switch (ver) { 292b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden case 0: 293b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden deserialized.reset(round_trip(ver, msg, 11)); 294b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden break; 295b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden case 1: 296b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden deserialized.reset(round_trip(ver, msg, 15)); 297b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden break; 298ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden case 2: 299ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden deserialized.reset(round_trip(ver, msg, 42)); 300ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden break; 301b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden default: 302b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden FAIL(); 303b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden } 3042665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(KM_ERROR_OK, deserialized->error); 3052665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(3U, deserialized->output.available_read()); 3062665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0, memcmp(deserialized->output.peek_read(), "foo", 3)); 307b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden 308b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden switch (ver) { 309b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden case 0: 310c609659a4b469778f523bece9ad0235fcfe6dd91Shawn Willden EXPECT_EQ(0U, deserialized->input_consumed); 311b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden break; 312b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden case 1: 313c609659a4b469778f523bece9ad0235fcfe6dd91Shawn Willden EXPECT_EQ(99U, deserialized->input_consumed); 314b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden break; 315ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden case 2: 316ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden EXPECT_EQ(99U, deserialized->input_consumed); 317ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden EXPECT_EQ(1U, deserialized->output_params.size()); 318ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden break; 319b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden default: 320b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden FAIL(); 321b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden } 3222665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 323da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 324da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 325da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, FinishOperationRequest) { 3262665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 3272665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden FinishOperationRequest msg(ver); 3282665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.op_handle = 0xDEADBEEF; 3292665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.signature.Reinitialize("bar", 3); 3302665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 331ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden UniquePtr<FinishOperationRequest> deserialized; 332eb63b9799eadcaa6ef206f8b804d7432e0dab14aShawn Willden switch (ver) { 333ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden case 0: 334ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden deserialized.reset(round_trip(ver, msg, 15)); 335ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden break; 336ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden case 1: 337ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden case 2: 338ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden deserialized.reset(round_trip(ver, msg, 27)); 339ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden break; 340ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden default: 341ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden FAIL(); 342ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden } 3432665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0xDEADBEEF, deserialized->op_handle); 3442665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(3U, deserialized->signature.available_read()); 3452665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0, memcmp(deserialized->signature.peek_read(), "bar", 3)); 3462665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 347da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 348da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 349da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(Round_Trip, FinishOperationResponse) { 3502665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 3512665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden FinishOperationResponse msg(ver); 3522665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.error = KM_ERROR_OK; 3532665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.output.Reinitialize("foo", 3); 3542665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 355ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden UniquePtr<FinishOperationResponse> deserialized; 356ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden switch (ver) { 357ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden case 0: 358ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden case 1: 359ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden deserialized.reset(round_trip(ver, msg, 11)); 360ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden break; 361ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden case 2: 362ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden deserialized.reset(round_trip(ver, msg, 23)); 363ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden break; 364ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden default: 365ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden FAIL(); 366ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden } 3672665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(msg.error, deserialized->error); 3682665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(msg.output.available_read(), deserialized->output.available_read()); 3692665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0, memcmp(msg.output.peek_read(), deserialized->output.peek_read(), 3702665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.output.available_read())); 3712665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 372da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 373da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 374da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, ImportKeyRequest) { 3752665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 3762665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden ImportKeyRequest msg(ver); 3772665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.key_description.Reinitialize(params, array_length(params)); 3782665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.key_format = KM_KEY_FORMAT_X509; 3792665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.SetKeyMaterial("foo", 3); 3802665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 3812665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<ImportKeyRequest> deserialized(round_trip(ver, msg, 89)); 3822665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(msg.key_description, deserialized->key_description); 3832665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(msg.key_format, deserialized->key_format); 3842665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(msg.key_data_length, deserialized->key_data_length); 3852665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0, memcmp(msg.key_data, deserialized->key_data, msg.key_data_length)); 3862665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 387da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 388da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 389da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, ImportKeyResponse) { 3902665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 3912665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden ImportKeyResponse msg(ver); 3922665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.error = KM_ERROR_OK; 3932665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.SetKeyMaterial("foo", 3); 3942665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.enforced.Reinitialize(params, array_length(params)); 3952665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.unenforced.Reinitialize(params, array_length(params)); 3962665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 3972665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<ImportKeyResponse> deserialized(round_trip(ver, msg, 167)); 3982665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(msg.error, deserialized->error); 3992665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(msg.key_blob.key_material_size, deserialized->key_blob.key_material_size); 4002665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0, memcmp(msg.key_blob.key_material, deserialized->key_blob.key_material, 4012665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.key_blob.key_material_size)); 4022665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(msg.enforced, deserialized->enforced); 4032665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(msg.unenforced, deserialized->unenforced); 4042665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 405da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 406da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 407da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, ExportKeyRequest) { 4082665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 4092665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden ExportKeyRequest msg(ver); 4102665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.additional_params.Reinitialize(params, array_length(params)); 4112665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.key_format = KM_KEY_FORMAT_X509; 4122665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.SetKeyMaterial("foo", 3); 4132665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 4142665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<ExportKeyRequest> deserialized(round_trip(ver, msg, 89)); 4152665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(msg.additional_params, deserialized->additional_params); 4162665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(msg.key_format, deserialized->key_format); 4172665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(3U, deserialized->key_blob.key_material_size); 4182665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0, memcmp("foo", deserialized->key_blob.key_material, 3)); 4192665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 420da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 421da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 422da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, ExportKeyResponse) { 4232665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 4242665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden ExportKeyResponse msg(ver); 4252665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.error = KM_ERROR_OK; 4262665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.SetKeyMaterial("foo", 3); 4272665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 4282665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<ExportKeyResponse> deserialized(round_trip(ver, msg, 11)); 4292665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(3U, deserialized->key_data_length); 4302665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0, memcmp("foo", deserialized->key_data, 3)); 4312665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 4322665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden} 4332665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 4342beb628bfefae72fa6bb84a6235da7e3de532823Shawn WilldenTEST(RoundTrip, DeleteKeyRequest) { 4352beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 4362beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden DeleteKeyRequest msg(ver); 4372beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden msg.SetKeyMaterial("foo", 3); 4382beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden 4392beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden UniquePtr<DeleteKeyRequest> deserialized(round_trip(ver, msg, 7)); 4402beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden EXPECT_EQ(3U, deserialized->key_blob.key_material_size); 4412beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden EXPECT_EQ(0, memcmp("foo", deserialized->key_blob.key_material, 3)); 4422beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden } 4432beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden} 4442beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden 44536d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenTEST(RoundTrip, DeleteKeyResponse) { 44636d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 44736d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden DeleteKeyResponse msg(ver); 44836d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden UniquePtr<DeleteKeyResponse> deserialized(round_trip(ver, msg, 4)); 44936d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden } 45036d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden} 45136d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden 45236d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenTEST(RoundTrip, DeleteAllKeysRequest) { 45336d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 45436d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden DeleteAllKeysRequest msg(ver); 45536d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden UniquePtr<DeleteAllKeysRequest> deserialized(round_trip(ver, msg, 0)); 45636d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden } 45736d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden} 45836d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden 45936d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenTEST(RoundTrip, DeleteAllKeysResponse) { 46036d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 46136d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden DeleteAllKeysResponse msg(ver); 46236d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden UniquePtr<DeleteAllKeysResponse> deserialized(round_trip(ver, msg, 4)); 46336d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden } 46436d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden} 46536d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden 4662665e868b1153cb89ad7cd906ae160cb417d4438Shawn WilldenTEST(RoundTrip, GetVersionRequest) { 4672665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden GetVersionRequest msg; 4682665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 4692665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden size_t size = msg.SerializedSize(); 470c609659a4b469778f523bece9ad0235fcfe6dd91Shawn Willden ASSERT_EQ(0U, size); 4712665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 4722665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<uint8_t[]> buf(new uint8_t[size]); 4732665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(buf.get() + size, msg.Serialize(buf.get(), buf.get() + size)); 4742665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 4752665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden GetVersionRequest deserialized; 4762665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden const uint8_t* p = buf.get(); 4772665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_TRUE(deserialized.Deserialize(&p, p + size)); 4782665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ((ptrdiff_t)size, p - buf.get()); 4792665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden} 4802665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 4812665e868b1153cb89ad7cd906ae160cb417d4438Shawn WilldenTEST(RoundTrip, GetVersionResponse) { 4822665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden GetVersionResponse msg; 483da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden msg.error = KM_ERROR_OK; 4842665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.major_ver = 9; 4852665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.minor_ver = 98; 4862665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.subminor_ver = 38; 4872665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 4882665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden size_t size = msg.SerializedSize(); 489c609659a4b469778f523bece9ad0235fcfe6dd91Shawn Willden ASSERT_EQ(7U, size); 490da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 4912665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<uint8_t[]> buf(new uint8_t[size]); 4922665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(buf.get() + size, msg.Serialize(buf.get(), buf.get() + size)); 4932665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 4942665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden GetVersionResponse deserialized; 4952665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden const uint8_t* p = buf.get(); 4962665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_TRUE(deserialized.Deserialize(&p, p + size)); 4972665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ((ptrdiff_t)size, p - buf.get()); 498c609659a4b469778f523bece9ad0235fcfe6dd91Shawn Willden EXPECT_EQ(9U, msg.major_ver); 499c609659a4b469778f523bece9ad0235fcfe6dd91Shawn Willden EXPECT_EQ(98U, msg.minor_ver); 500c609659a4b469778f523bece9ad0235fcfe6dd91Shawn Willden EXPECT_EQ(38U, msg.subminor_ver); 501128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden} 502128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden 503cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn WilldenTEST(RoundTrip, AddEntropyRequest) { 504cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 505cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden AddEntropyRequest msg(ver); 506cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden msg.random_data.Reinitialize("foo", 3); 507cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden 508cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden UniquePtr<AddEntropyRequest> deserialized(round_trip(ver, msg, 7)); 509cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden EXPECT_EQ(3U, deserialized->random_data.available_read()); 510cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden EXPECT_EQ(0, memcmp("foo", deserialized->random_data.peek_read(), 3)); 511cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden } 512cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden} 513cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden 51436d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenTEST(RoundTrip, AddEntropyResponse) { 51536d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 51636d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden AddEntropyResponse msg(ver); 51736d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden UniquePtr<AddEntropyResponse> deserialized(round_trip(ver, msg, 4)); 51836d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden } 51936d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden} 52036d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden 52136d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenTEST(RoundTrip, AbortOperationRequest) { 52236d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 52336d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden AbortOperationRequest msg(ver); 52436d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden UniquePtr<AbortOperationRequest> deserialized(round_trip(ver, msg, 8)); 52536d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden } 52636d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden} 52736d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden 52836d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenTEST(RoundTrip, AbortOperationResponse) { 52936d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 53036d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden AbortOperationResponse msg(ver); 53136d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden UniquePtr<AbortOperationResponse> deserialized(round_trip(ver, msg, 4)); 53236d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden } 53336d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden} 53436d41e230417ac3b86a1425ebf60fff6d92377ecShawn Willden 5353d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn WilldenTEST(RoundTrip, AttestKeyRequest) { 5363d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 5373d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden AttestKeyRequest msg(ver); 5383d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden msg.SetKeyMaterial("foo", 3); 5393d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden msg.attest_params.Reinitialize(params, array_length(params)); 5403d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden 5413d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden UniquePtr<AttestKeyRequest> deserialized(round_trip(ver, msg, 85)); 5423d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden EXPECT_EQ(3U, deserialized->key_blob.key_material_size); 5433d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden EXPECT_EQ(0, memcmp("foo", deserialized->key_blob.key_material, 3)); 5443d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden EXPECT_EQ(msg.attest_params, deserialized->attest_params); 5453d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden } 5463d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden} 5473d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden 5483d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn WilldenTEST(RoundTrip, AttestKeyResponse) { 5493d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 5503d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden AttestKeyResponse msg(ver); 5513d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden msg.error = KM_ERROR_OK; 5523d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden EXPECT_TRUE(msg.AllocateChain(3)); 5533d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden msg.certificate_chain.entries[0] = {dup_buffer("foo", 3), 3}; 5543d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden msg.certificate_chain.entries[1] = {dup_buffer("bar", 3), 3}; 5553d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden msg.certificate_chain.entries[2] = {dup_buffer("baz", 3), 3}; 5563d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden 5573d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden UniquePtr<AttestKeyResponse> deserialized(round_trip(ver, msg, 29)); 5583d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden keymaster_cert_chain_t* chain = &deserialized->certificate_chain; 5593d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden 5603d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden EXPECT_NE(nullptr, chain->entries); 5613d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden EXPECT_EQ(3U, chain->entry_count); 5623d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden EXPECT_EQ(3U, chain->entries[0].data_length); 5633d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden EXPECT_EQ(0, memcmp("foo", chain->entries[0].data, 3)); 5643d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden EXPECT_EQ(3U, chain->entries[1].data_length); 5653d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden EXPECT_EQ(0, memcmp("bar", chain->entries[1].data, 3)); 5663d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden EXPECT_EQ(3U, chain->entries[2].data_length); 5673d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden EXPECT_EQ(0, memcmp("baz", chain->entries[2].data, 3)); 5683d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden } 5693d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden} 5703d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden 571f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willdenuint8_t msgbuf[] = { 572f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 220, 88, 183, 255, 71, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 573f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 0, 173, 0, 0, 0, 228, 174, 98, 187, 191, 135, 253, 200, 51, 230, 114, 247, 151, 109, 574f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 237, 79, 87, 32, 94, 5, 204, 46, 154, 30, 91, 6, 103, 148, 254, 129, 65, 171, 228, 575f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 167, 224, 163, 9, 15, 206, 90, 58, 11, 205, 55, 211, 33, 87, 178, 149, 91, 28, 236, 576f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 218, 112, 231, 34, 82, 82, 134, 103, 137, 115, 27, 156, 102, 159, 220, 226, 89, 42, 25, 577f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 37, 9, 84, 239, 76, 161, 198, 72, 167, 163, 39, 91, 148, 191, 17, 191, 87, 169, 179, 578f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 136, 10, 194, 154, 4, 40, 107, 109, 61, 161, 20, 176, 247, 13, 214, 106, 229, 45, 17, 579f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 5, 60, 189, 64, 39, 166, 208, 14, 57, 25, 140, 148, 25, 177, 246, 189, 43, 181, 88, 580f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 204, 29, 126, 224, 100, 143, 93, 60, 57, 249, 55, 0, 87, 83, 227, 224, 166, 59, 214, 581f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 81, 144, 129, 58, 6, 57, 46, 254, 232, 41, 220, 209, 230, 167, 138, 158, 94, 180, 125, 582f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 247, 26, 162, 116, 238, 202, 187, 100, 65, 13, 180, 44, 245, 159, 83, 161, 176, 58, 72, 583f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 236, 109, 105, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 584f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 0, 11, 0, 0, 0, 98, 0, 0, 0, 1, 0, 0, 32, 2, 0, 0, 0, 1, 0, 585f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 0, 32, 3, 0, 0, 0, 2, 0, 0, 16, 1, 0, 0, 0, 3, 0, 0, 48, 0, 586f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 1, 0, 0, 200, 0, 0, 80, 3, 0, 0, 0, 0, 0, 0, 0, 244, 1, 0, 112, 587f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 1, 246, 1, 0, 112, 1, 189, 2, 0, 96, 144, 178, 236, 250, 255, 255, 255, 255, 145, 588f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 1, 0, 96, 144, 226, 33, 60, 222, 2, 0, 0, 189, 2, 0, 96, 0, 0, 0, 0, 589f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 0, 0, 0, 0, 190, 2, 0, 16, 1, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 590f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 0, 0, 0, 0, 0, 0, 0, 11, 0, 591f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 0, 0, 98, 0, 0, 0, 1, 0, 0, 32, 2, 0, 0, 0, 1, 0, 0, 32, 3, 592f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 0, 0, 0, 2, 0, 0, 16, 1, 0, 0, 0, 3, 0, 0, 48, 0, 1, 0, 0, 593f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 200, 0, 0, 80, 3, 0, 0, 0, 0, 0, 0, 0, 244, 1, 0, 112, 1, 246, 1, 594f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 0, 112, 1, 189, 2, 0, 96, 144, 178, 236, 250, 255, 255, 255, 255, 145, 1, 0, 96, 595f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 144, 226, 33, 60, 222, 2, 0, 0, 189, 2, 0, 96, 0, 0, 0, 0, 0, 0, 0, 596f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 0, 190, 2, 0, 16, 1, 0, 0, 0, 597f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden}; 598f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 599f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden/* 600f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden * These tests don't have any assertions or expectations. They just try to parse garbage, to see if 601f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden * the result will be a crash. This is especially informative when run under Valgrind memcheck. 602f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden */ 603f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 604f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willdentemplate <typename Message> void parse_garbage() { 6052665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int32_t ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 6062665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden Message msg(ver); 6072665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden const uint8_t* end = msgbuf + array_length(msgbuf); 6082665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (size_t i = 0; i < array_length(msgbuf); ++i) { 6092665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden const uint8_t* begin = msgbuf + i; 6102665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden const uint8_t* p = begin; 6112665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.Deserialize(&p, end); 6122665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 613f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden } 6140f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden 6150f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden time_t now = time(NULL); 6160f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden std::cout << "Seeding rand() with " << now << " for fuzz test." << std::endl; 6170f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden srand(now); 6180f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden 6190f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden // Fill large buffer with random bytes. 6200f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden const int kBufSize = 10000; 6210f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden UniquePtr<uint8_t[]> buf(new uint8_t[kBufSize]); 6220f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden for (size_t i = 0; i < kBufSize; ++i) 6230f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden buf[i] = static_cast<uint8_t>(rand()); 6240f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden 6250f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden for (uint32_t ver = 0; ver < MAX_MESSAGE_VERSION; ++ver) { 6260f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden Message msg(ver); 6270f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden const uint8_t* end = buf.get() + kBufSize; 6280f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden for (size_t i = 0; i < kBufSize; ++i) { 6290f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden const uint8_t* begin = buf.get() + i; 6300f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden const uint8_t* p = begin; 6310f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden msg.Deserialize(&p, end); 6320f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden } 6330f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden } 634f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden} 635f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 636f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden#define GARBAGE_TEST(Message) \ 637f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden TEST(GarbageTest, Message) { parse_garbage<Message>(); } 638f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 63936d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(AbortOperationRequest); 64036d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(AbortOperationResponse); 64136d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(AddEntropyRequest); 64236d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(AddEntropyResponse); 643f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(BeginOperationRequest); 644f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(BeginOperationResponse); 64536d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(DeleteAllKeysRequest); 64636d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(DeleteAllKeysResponse); 64736d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(DeleteKeyRequest); 64836d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(DeleteKeyResponse); 64936d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(ExportKeyRequest); 65036d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(ExportKeyResponse); 651f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(FinishOperationRequest); 652f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(FinishOperationResponse); 65336d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(GenerateKeyRequest); 65436d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(GenerateKeyResponse); 65536d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(GetKeyCharacteristicsRequest); 65636d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(GetKeyCharacteristicsResponse); 657f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(ImportKeyRequest); 658f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(ImportKeyResponse); 65936d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(SupportedByAlgorithmAndPurposeRequest) 66036d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(SupportedByAlgorithmRequest) 66136d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(UpdateOperationRequest); 66236d41e230417ac3b86a1425ebf60fff6d92377ecShawn WilldenGARBAGE_TEST(UpdateOperationResponse); 6633d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn WilldenGARBAGE_TEST(AttestKeyRequest); 6643d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn WilldenGARBAGE_TEST(AttestKeyResponse); 665f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 666f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden// The macro doesn't work on this one. 667f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenTEST(GarbageTest, SupportedResponse) { 668f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden parse_garbage<SupportedResponse<keymaster_digest_t>>(); 669f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden} 670f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 671128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden} // namespace test 6722665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 673128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden} // namespace keymaster 674