android_keymaster_messages_test.cpp revision 7b38f4414c974ecc0972b822f1ee46c695101600
1128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden/* 2128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden * Copyright (C) 2014 The Android Open Source Project 3128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden * 4128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden * Licensed under the Apache License, Version 2.0 (the "License"); 5128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden * you may not use this file except in compliance with the License. 6128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden * You may obtain a copy of the License at 7128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden * 8128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden * http://www.apache.org/licenses/LICENSE-2.0 9128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden * 10128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden * Unless required by applicable law or agreed to in writing, software 11128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden * distributed under the License is distributed on an "AS IS" BASIS, 12128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden * See the License for the specific language governing permissions and 14128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden * limitations under the License. 15128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden */ 16128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden 17128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden#include <UniquePtr.h> 18128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden 19128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden#include <gtest/gtest.h> 20128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden 2198d9b92547a9a7553b99e3e941a4175926f95b62Shawn Willden#include <keymaster/keymaster_tags.h> 2298d9b92547a9a7553b99e3e941a4175926f95b62Shawn Willden#include <keymaster/google_keymaster_utils.h> 2398d9b92547a9a7553b99e3e941a4175926f95b62Shawn Willden 24da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden#include "google_keymaster_test_utils.h" 25128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden#include "google_softkeymaster.h" 26128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden 27128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willdenint main(int argc, char** argv) { 28128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden ::testing::InitGoogleTest(&argc, argv); 29128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden int result = RUN_ALL_TESTS(); 30128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden return result; 31128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden} 32128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden 33128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willdennamespace keymaster { 34128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willdennamespace test { 35128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden 36da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden/** 37da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden * Serialize and deserialize a message. 38da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden */ 392665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willdentemplate <typename Message> 402665e868b1153cb89ad7cd906ae160cb417d4438Shawn WilldenMessage* round_trip(int32_t ver, const Message& message, size_t expected_size) { 41da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden size_t size = message.SerializedSize(); 42da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden EXPECT_EQ(expected_size, size); 43da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden if (size == 0) 44da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden return NULL; 45128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden 46128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden UniquePtr<uint8_t[]> buf(new uint8_t[size]); 47da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden EXPECT_EQ(buf.get() + size, message.Serialize(buf.get(), buf.get() + size)); 48128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden 492665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden Message* deserialized = new Message(ver); 5058e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden const uint8_t* p = buf.get(); 51da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden EXPECT_TRUE(deserialized->Deserialize(&p, p + size)); 52da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden EXPECT_EQ((ptrdiff_t)size, p - buf.get()); 53da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden return deserialized; 54da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 55da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 562665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willdenstruct EmptyKeymasterResponse : public KeymasterResponse { 572665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EmptyKeymasterResponse(int32_t ver) : KeymasterResponse(ver) {} 58da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden size_t NonErrorSerializedSize() const { return 1; } 59da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden uint8_t* NonErrorSerialize(uint8_t* buf, const uint8_t* /* end */) const { 60da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden *buf++ = 0; 61da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden return buf; 62da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden } 63da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden bool NonErrorDeserialize(const uint8_t** buf_ptr, const uint8_t* end) { 64da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden if (*buf_ptr >= end) 65da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden return false; 66da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden EXPECT_EQ(0, **buf_ptr); 67da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden (*buf_ptr)++; 68da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden return true; 69da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden } 70da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}; 71da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 72da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, EmptyKeymasterResponse) { 732665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 742665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EmptyKeymasterResponse msg(ver); 752665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.error = KM_ERROR_OK; 76da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 772665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<EmptyKeymasterResponse> deserialized(round_trip(ver, msg, 5)); 782665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 79da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 80da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 81da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, EmptyKeymasterResponseError) { 822665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 832665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EmptyKeymasterResponse msg(ver); 842665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.error = KM_ERROR_MEMORY_ALLOCATION_FAILED; 85da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 862665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<EmptyKeymasterResponse> deserialized(round_trip(ver, msg, 4)); 872665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 88da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 89da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 90da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, SupportedAlgorithmsResponse) { 912665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 922665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden SupportedAlgorithmsResponse rsp(ver); 932665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden keymaster_algorithm_t algorithms[] = {KM_ALGORITHM_RSA, KM_ALGORITHM_DSA, 942665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden KM_ALGORITHM_ECDSA}; 952665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden rsp.error = KM_ERROR_OK; 962665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden rsp.algorithms = dup_array(algorithms); 972665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden rsp.algorithms_length = array_length(algorithms); 982665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 992665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<SupportedAlgorithmsResponse> deserialized(round_trip(ver, rsp, 20)); 1002665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(array_length(algorithms), deserialized->algorithms_length); 1012665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0, memcmp(deserialized->algorithms, algorithms, array_size(algorithms))); 1022665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 103128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden} 104128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden 105da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, SupportedResponse) { 1062665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 1072665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden SupportedResponse<keymaster_digest_t> rsp(ver); 1082665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden keymaster_digest_t digests[] = {KM_DIGEST_NONE, KM_DIGEST_MD5, KM_DIGEST_SHA1}; 1092665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden rsp.error = KM_ERROR_OK; 1102665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden rsp.SetResults(digests); 1112665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 1122665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<SupportedResponse<keymaster_digest_t>> deserialized(round_trip(ver, rsp, 20)); 1132665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(array_length(digests), deserialized->results_length); 1142665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0, memcmp(deserialized->results, digests, array_size(digests))); 1152665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 116da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 117da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 118da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willdenstatic keymaster_key_param_t params[] = { 1192665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY), 120da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA), Authorization(TAG_USER_ID, 7), 1212665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden Authorization(TAG_USER_AUTH_ID, 8), Authorization(TAG_APPLICATION_ID, "app_id", 6), 122da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden Authorization(TAG_AUTH_TIMEOUT, 300), 123da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden}; 124128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willdenuint8_t TEST_DATA[] = "a key blob"; 125128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden 126da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, GenerateKeyRequest) { 1272665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 1282665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden GenerateKeyRequest req(ver); 1292665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden req.key_description.Reinitialize(params, array_length(params)); 1302665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<GenerateKeyRequest> deserialized(round_trip(ver, req, 78)); 1312665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(deserialized->key_description, req.key_description); 1322665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 133da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 134da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 135da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, GenerateKeyResponse) { 1362665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 1372665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden GenerateKeyResponse rsp(ver); 1382665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden rsp.error = KM_ERROR_OK; 1392665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden rsp.key_blob.key_material = dup_array(TEST_DATA); 1402665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden rsp.key_blob.key_material_size = array_length(TEST_DATA); 1412665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden rsp.enforced.Reinitialize(params, array_length(params)); 1422665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 1432665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<GenerateKeyResponse> deserialized(round_trip(ver, rsp, 109)); 1442665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(KM_ERROR_OK, deserialized->error); 1452665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(deserialized->enforced, rsp.enforced); 1462665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(deserialized->unenforced, rsp.unenforced); 1472665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 148da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 149128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden 150da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, GenerateKeyResponseTestError) { 1512665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 1522665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden GenerateKeyResponse rsp(ver); 1532665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden rsp.error = KM_ERROR_UNSUPPORTED_ALGORITHM; 1542665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden rsp.key_blob.key_material = dup_array(TEST_DATA); 1552665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden rsp.key_blob.key_material_size = array_length(TEST_DATA); 1562665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden rsp.enforced.Reinitialize(params, array_length(params)); 1572665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 1582665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<GenerateKeyResponse> deserialized(round_trip(ver, rsp, 4)); 1592665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(KM_ERROR_UNSUPPORTED_ALGORITHM, deserialized->error); 1602665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0U, deserialized->enforced.size()); 1612665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0U, deserialized->unenforced.size()); 1622665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0U, deserialized->key_blob.key_material_size); 1632665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 164da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 165da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 166da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, GetKeyCharacteristicsRequest) { 1672665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 1682665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden GetKeyCharacteristicsRequest req(ver); 1692665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden req.additional_params.Reinitialize(params, array_length(params)); 1702665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden req.SetKeyMaterial("foo", 3); 1712665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 1722665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<GetKeyCharacteristicsRequest> deserialized(round_trip(ver, req, 85)); 1732665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(7U, deserialized->additional_params.size()); 1742665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(3U, deserialized->key_blob.key_material_size); 1752665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0, memcmp(deserialized->key_blob.key_material, "foo", 3)); 1762665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 177da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 178128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden 179da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, GetKeyCharacteristicsResponse) { 1802665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 1812665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden GetKeyCharacteristicsResponse msg(ver); 1822665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.error = KM_ERROR_OK; 1832665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.enforced.Reinitialize(params, array_length(params)); 1842665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.unenforced.Reinitialize(params, array_length(params)); 1852665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 1862665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<GetKeyCharacteristicsResponse> deserialized(round_trip(ver, msg, 160)); 1872665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(msg.enforced, deserialized->enforced); 1882665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(msg.unenforced, deserialized->unenforced); 1892665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 190da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 191da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 192da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, BeginOperationRequest) { 1932665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 1942665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden BeginOperationRequest msg(ver); 1952665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.purpose = KM_PURPOSE_SIGN; 1962665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.SetKeyMaterial("foo", 3); 1972665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.additional_params.Reinitialize(params, array_length(params)); 1982665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 1992665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<BeginOperationRequest> deserialized(round_trip(ver, msg, 89)); 2002665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(KM_PURPOSE_SIGN, deserialized->purpose); 2012665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(3U, deserialized->key_blob.key_material_size); 2022665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0, memcmp(deserialized->key_blob.key_material, "foo", 3)); 2032665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(msg.additional_params, deserialized->additional_params); 2042665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 205da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 206da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 207da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, BeginOperationResponse) { 2082665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 2092665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden BeginOperationResponse msg(ver); 2102665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.error = KM_ERROR_OK; 2112665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.op_handle = 0xDEADBEEF; 2127b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden msg.output_params.push_back(Authorization(TAG_NONCE, "foo", 3)); 2137b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden 2147b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden UniquePtr<BeginOperationResponse> deserialized; 2157b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden switch (ver) { 2167b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden case 0: 2177b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden deserialized.reset(round_trip(ver, msg, 12)); 2187b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden break; 2197b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden case 1: 2207b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden deserialized.reset(round_trip(ver, msg, 39)); 2217b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden break; 2227b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden default: 2237b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden FAIL(); 2247b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden } 2252665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 2262665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(KM_ERROR_OK, deserialized->error); 2272665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0xDEADBEEF, deserialized->op_handle); 2287b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden 2297b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden switch (ver) { 2307b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden case 0: 2317b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden EXPECT_EQ(0, deserialized->output_params.size()); 2327b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden break; 2337b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden case 1: 2347b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden EXPECT_EQ(msg.output_params, deserialized->output_params); 2357b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden break; 2367b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden default: 2377b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden FAIL(); 2387b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden } 2392665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 240da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 241da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 242da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, BeginOperationResponseError) { 2432665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 2442665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden BeginOperationResponse msg(ver); 2452665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.error = KM_ERROR_INVALID_OPERATION_HANDLE; 2462665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.op_handle = 0xDEADBEEF; 247da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 2482665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<BeginOperationResponse> deserialized(round_trip(ver, msg, 4)); 2492665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, deserialized->error); 2502665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 251da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 252da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 253da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, UpdateOperationRequest) { 2542665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 2552665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UpdateOperationRequest msg(ver); 2562665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.op_handle = 0xDEADBEEF; 2572665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.input.Reinitialize("foo", 3); 2582665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 2592665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<UpdateOperationRequest> deserialized(round_trip(ver, msg, 15)); 2602665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(3U, deserialized->input.available_read()); 2612665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0, memcmp(deserialized->input.peek_read(), "foo", 3)); 2622665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 263da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 264da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 265da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, UpdateOperationResponse) { 2662665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 2672665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UpdateOperationResponse msg(ver); 2682665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.error = KM_ERROR_OK; 2692665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.output.Reinitialize("foo", 3); 270b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden msg.input_consumed = 99; 271b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden 272b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden UniquePtr<UpdateOperationResponse> deserialized; 273b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden switch (ver) { 274b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden case 0: 275b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden deserialized.reset(round_trip(ver, msg, 11)); 276b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden break; 277b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden case 1: 278b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden deserialized.reset(round_trip(ver, msg, 15)); 279b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden break; 280b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden default: 281b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden FAIL(); 282b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden } 2832665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(KM_ERROR_OK, deserialized->error); 2842665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(3U, deserialized->output.available_read()); 2852665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0, memcmp(deserialized->output.peek_read(), "foo", 3)); 286b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden 287b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden switch (ver) { 288b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden case 0: 289b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden EXPECT_EQ(0, deserialized->input_consumed); 290b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden break; 291b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden case 1: 292b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden EXPECT_EQ(99, deserialized->input_consumed); 293b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden break; 294b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden default: 295b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden FAIL(); 296b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden } 2972665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 298da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 299da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 300da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, FinishOperationRequest) { 3012665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 3022665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden FinishOperationRequest msg(ver); 3032665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.op_handle = 0xDEADBEEF; 3042665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.signature.Reinitialize("bar", 3); 3052665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 3062665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<FinishOperationRequest> deserialized(round_trip(ver, msg, 15)); 3072665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0xDEADBEEF, deserialized->op_handle); 3082665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(3U, deserialized->signature.available_read()); 3092665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0, memcmp(deserialized->signature.peek_read(), "bar", 3)); 3102665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 311da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 312da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 313da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(Round_Trip, FinishOperationResponse) { 3142665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 3152665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden FinishOperationResponse msg(ver); 3162665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.error = KM_ERROR_OK; 3172665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.output.Reinitialize("foo", 3); 3182665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 3192665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<FinishOperationResponse> deserialized(round_trip(ver, msg, 11)); 3202665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(msg.error, deserialized->error); 3212665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(msg.output.available_read(), deserialized->output.available_read()); 3222665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0, memcmp(msg.output.peek_read(), deserialized->output.peek_read(), 3232665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.output.available_read())); 3242665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 325da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 326da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 327da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, ImportKeyRequest) { 3282665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 3292665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden ImportKeyRequest msg(ver); 3302665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.key_description.Reinitialize(params, array_length(params)); 3312665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.key_format = KM_KEY_FORMAT_X509; 3322665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.SetKeyMaterial("foo", 3); 3332665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 3342665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<ImportKeyRequest> deserialized(round_trip(ver, msg, 89)); 3352665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(msg.key_description, deserialized->key_description); 3362665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(msg.key_format, deserialized->key_format); 3372665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(msg.key_data_length, deserialized->key_data_length); 3382665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0, memcmp(msg.key_data, deserialized->key_data, msg.key_data_length)); 3392665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 340da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 341da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 342da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, ImportKeyResponse) { 3432665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 3442665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden ImportKeyResponse msg(ver); 3452665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.error = KM_ERROR_OK; 3462665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.SetKeyMaterial("foo", 3); 3472665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.enforced.Reinitialize(params, array_length(params)); 3482665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.unenforced.Reinitialize(params, array_length(params)); 3492665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 3502665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<ImportKeyResponse> deserialized(round_trip(ver, msg, 167)); 3512665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(msg.error, deserialized->error); 3522665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(msg.key_blob.key_material_size, deserialized->key_blob.key_material_size); 3532665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0, memcmp(msg.key_blob.key_material, deserialized->key_blob.key_material, 3542665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.key_blob.key_material_size)); 3552665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(msg.enforced, deserialized->enforced); 3562665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(msg.unenforced, deserialized->unenforced); 3572665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 358da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 359da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 360da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, ExportKeyRequest) { 3612665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 3622665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden ExportKeyRequest msg(ver); 3632665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.additional_params.Reinitialize(params, array_length(params)); 3642665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.key_format = KM_KEY_FORMAT_X509; 3652665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.SetKeyMaterial("foo", 3); 3662665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 3672665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<ExportKeyRequest> deserialized(round_trip(ver, msg, 89)); 3682665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(msg.additional_params, deserialized->additional_params); 3692665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(msg.key_format, deserialized->key_format); 3702665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(3U, deserialized->key_blob.key_material_size); 3712665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0, memcmp("foo", deserialized->key_blob.key_material, 3)); 3722665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 373da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 374da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 375da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenTEST(RoundTrip, ExportKeyResponse) { 3762665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 3772665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden ExportKeyResponse msg(ver); 3782665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.error = KM_ERROR_OK; 3792665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.SetKeyMaterial("foo", 3); 3802665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 3812665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<ExportKeyResponse> deserialized(round_trip(ver, msg, 11)); 3822665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(3U, deserialized->key_data_length); 3832665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(0, memcmp("foo", deserialized->key_data, 3)); 3842665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 3852665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden} 3862665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 3872665e868b1153cb89ad7cd906ae160cb417d4438Shawn WilldenTEST(RoundTrip, GetVersionRequest) { 3882665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden GetVersionRequest msg; 3892665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 3902665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden size_t size = msg.SerializedSize(); 3912665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden ASSERT_EQ(0, size); 3922665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 3932665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<uint8_t[]> buf(new uint8_t[size]); 3942665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(buf.get() + size, msg.Serialize(buf.get(), buf.get() + size)); 3952665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 3962665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden GetVersionRequest deserialized; 3972665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden const uint8_t* p = buf.get(); 3982665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_TRUE(deserialized.Deserialize(&p, p + size)); 3992665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ((ptrdiff_t)size, p - buf.get()); 4002665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden} 4012665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 4022665e868b1153cb89ad7cd906ae160cb417d4438Shawn WilldenTEST(RoundTrip, GetVersionResponse) { 4032665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden GetVersionResponse msg; 404da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden msg.error = KM_ERROR_OK; 4052665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.major_ver = 9; 4062665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.minor_ver = 98; 4072665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.subminor_ver = 38; 4082665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 4092665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden size_t size = msg.SerializedSize(); 4102665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden ASSERT_EQ(7, size); 411da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 4122665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden UniquePtr<uint8_t[]> buf(new uint8_t[size]); 4132665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(buf.get() + size, msg.Serialize(buf.get(), buf.get() + size)); 4142665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 4152665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden GetVersionResponse deserialized; 4162665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden const uint8_t* p = buf.get(); 4172665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_TRUE(deserialized.Deserialize(&p, p + size)); 4182665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ((ptrdiff_t)size, p - buf.get()); 4192665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(9, msg.major_ver); 4202665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(98, msg.minor_ver); 4212665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden EXPECT_EQ(38, msg.subminor_ver); 422128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden} 423128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden 424f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willdenuint8_t msgbuf[] = { 425f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 220, 88, 183, 255, 71, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 426f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 0, 173, 0, 0, 0, 228, 174, 98, 187, 191, 135, 253, 200, 51, 230, 114, 247, 151, 109, 427f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 237, 79, 87, 32, 94, 5, 204, 46, 154, 30, 91, 6, 103, 148, 254, 129, 65, 171, 228, 428f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 167, 224, 163, 9, 15, 206, 90, 58, 11, 205, 55, 211, 33, 87, 178, 149, 91, 28, 236, 429f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 218, 112, 231, 34, 82, 82, 134, 103, 137, 115, 27, 156, 102, 159, 220, 226, 89, 42, 25, 430f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 37, 9, 84, 239, 76, 161, 198, 72, 167, 163, 39, 91, 148, 191, 17, 191, 87, 169, 179, 431f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 136, 10, 194, 154, 4, 40, 107, 109, 61, 161, 20, 176, 247, 13, 214, 106, 229, 45, 17, 432f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 5, 60, 189, 64, 39, 166, 208, 14, 57, 25, 140, 148, 25, 177, 246, 189, 43, 181, 88, 433f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 204, 29, 126, 224, 100, 143, 93, 60, 57, 249, 55, 0, 87, 83, 227, 224, 166, 59, 214, 434f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 81, 144, 129, 58, 6, 57, 46, 254, 232, 41, 220, 209, 230, 167, 138, 158, 94, 180, 125, 435f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 247, 26, 162, 116, 238, 202, 187, 100, 65, 13, 180, 44, 245, 159, 83, 161, 176, 58, 72, 436f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 236, 109, 105, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 437f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 0, 11, 0, 0, 0, 98, 0, 0, 0, 1, 0, 0, 32, 2, 0, 0, 0, 1, 0, 438f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 0, 32, 3, 0, 0, 0, 2, 0, 0, 16, 1, 0, 0, 0, 3, 0, 0, 48, 0, 439f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 1, 0, 0, 200, 0, 0, 80, 3, 0, 0, 0, 0, 0, 0, 0, 244, 1, 0, 112, 440f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 1, 246, 1, 0, 112, 1, 189, 2, 0, 96, 144, 178, 236, 250, 255, 255, 255, 255, 145, 441f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 1, 0, 96, 144, 226, 33, 60, 222, 2, 0, 0, 189, 2, 0, 96, 0, 0, 0, 0, 442f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 0, 0, 0, 0, 190, 2, 0, 16, 1, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 443f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 0, 0, 0, 0, 0, 0, 0, 11, 0, 444f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 0, 0, 98, 0, 0, 0, 1, 0, 0, 32, 2, 0, 0, 0, 1, 0, 0, 32, 3, 445f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 0, 0, 0, 2, 0, 0, 16, 1, 0, 0, 0, 3, 0, 0, 48, 0, 1, 0, 0, 446f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 200, 0, 0, 80, 3, 0, 0, 0, 0, 0, 0, 0, 244, 1, 0, 112, 1, 246, 1, 447f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 0, 112, 1, 189, 2, 0, 96, 144, 178, 236, 250, 255, 255, 255, 255, 145, 1, 0, 96, 448f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 144, 226, 33, 60, 222, 2, 0, 0, 189, 2, 0, 96, 0, 0, 0, 0, 0, 0, 0, 449f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 0, 190, 2, 0, 16, 1, 0, 0, 0, 450f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden}; 451f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 452f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden/* 453f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden * These tests don't have any assertions or expectations. They just try to parse garbage, to see if 454f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden * the result will be a crash. This is especially informative when run under Valgrind memcheck. 455f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden */ 456f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 457f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willdentemplate <typename Message> void parse_garbage() { 4582665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (int32_t ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) { 4592665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden Message msg(ver); 4602665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden const uint8_t* end = msgbuf + array_length(msgbuf); 4612665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden for (size_t i = 0; i < array_length(msgbuf); ++i) { 4622665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden const uint8_t* begin = msgbuf + i; 4632665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden const uint8_t* p = begin; 4642665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden msg.Deserialize(&p, end); 4652665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 466f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden } 467f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden} 468f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 469f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden#define GARBAGE_TEST(Message) \ 470f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden TEST(GarbageTest, Message) { parse_garbage<Message>(); } 471f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 472f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(SupportedAlgorithmsResponse) 473f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(GenerateKeyRequest); 474f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(GenerateKeyResponse); 475f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(GetKeyCharacteristicsRequest); 476f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(GetKeyCharacteristicsResponse); 477f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(BeginOperationRequest); 478f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(BeginOperationResponse); 479f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(UpdateOperationRequest); 480f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(UpdateOperationResponse); 481f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(FinishOperationRequest); 482f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(FinishOperationResponse); 483f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden// GARBAGE_TEST(AddEntropyRequest); 484f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(ImportKeyRequest); 485f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(ImportKeyResponse); 486f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(ExportKeyRequest); 487f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenGARBAGE_TEST(ExportKeyResponse); 488f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden// GARBAGE_TEST(RescopeRequest); 489f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden// GARBAGE_TEST(RescopeResponse); 490f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 491f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden// The macro doesn't work on this one. 492f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn WilldenTEST(GarbageTest, SupportedResponse) { 493f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden parse_garbage<SupportedResponse<keymaster_digest_t>>(); 494f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden} 495f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden 496128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden} // namespace test 4972665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 498128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden} // namespace keymaster 499