1128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden/* 2128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden * Copyright 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 17b6837e7a62a1192e33beef586282812239ee8b28Shawn Willden#include <keymaster/android_keymaster_messages.h> 18b6837e7a62a1192e33beef586282812239ee8b28Shawn Willden#include <keymaster/android_keymaster_utils.h> 19128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden 20128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willdennamespace keymaster { 21128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden 2238f170135c28bcaa975466321ebebd1c785cce9aShawn Willden/* 2338f170135c28bcaa975466321ebebd1c785cce9aShawn Willden * Helper functions for working with key blobs. 2438f170135c28bcaa975466321ebebd1c785cce9aShawn Willden */ 2538f170135c28bcaa975466321ebebd1c785cce9aShawn Willden 2638f170135c28bcaa975466321ebebd1c785cce9aShawn Willdenstatic void set_key_blob(keymaster_key_blob_t* key_blob, const void* key_material, size_t length) { 2738f170135c28bcaa975466321ebebd1c785cce9aShawn Willden delete[] key_blob->key_material; 2838f170135c28bcaa975466321ebebd1c785cce9aShawn Willden key_blob->key_material = dup_buffer(key_material, length); 2938f170135c28bcaa975466321ebebd1c785cce9aShawn Willden key_blob->key_material_size = length; 3038f170135c28bcaa975466321ebebd1c785cce9aShawn Willden} 3138f170135c28bcaa975466321ebebd1c785cce9aShawn Willden 3238f170135c28bcaa975466321ebebd1c785cce9aShawn Willdenstatic size_t key_blob_size(const keymaster_key_blob_t& key_blob) { 3338f170135c28bcaa975466321ebebd1c785cce9aShawn Willden return sizeof(uint32_t) /* key size */ + key_blob.key_material_size; 3438f170135c28bcaa975466321ebebd1c785cce9aShawn Willden} 3538f170135c28bcaa975466321ebebd1c785cce9aShawn Willden 3638f170135c28bcaa975466321ebebd1c785cce9aShawn Willdenstatic uint8_t* serialize_key_blob(const keymaster_key_blob_t& key_blob, uint8_t* buf, 3738f170135c28bcaa975466321ebebd1c785cce9aShawn Willden const uint8_t* end) { 3838f170135c28bcaa975466321ebebd1c785cce9aShawn Willden return append_size_and_data_to_buf(buf, end, key_blob.key_material, key_blob.key_material_size); 3938f170135c28bcaa975466321ebebd1c785cce9aShawn Willden} 4038f170135c28bcaa975466321ebebd1c785cce9aShawn Willden 4138f170135c28bcaa975466321ebebd1c785cce9aShawn Willdenstatic bool deserialize_key_blob(keymaster_key_blob_t* key_blob, const uint8_t** buf_ptr, 4238f170135c28bcaa975466321ebebd1c785cce9aShawn Willden const uint8_t* end) { 4338f170135c28bcaa975466321ebebd1c785cce9aShawn Willden delete[] key_blob->key_material; 4438f170135c28bcaa975466321ebebd1c785cce9aShawn Willden key_blob->key_material = 0; 4538f170135c28bcaa975466321ebebd1c785cce9aShawn Willden UniquePtr<uint8_t[]> deserialized_key_material; 4638f170135c28bcaa975466321ebebd1c785cce9aShawn Willden if (!copy_size_and_data_from_buf(buf_ptr, end, &key_blob->key_material_size, 4738f170135c28bcaa975466321ebebd1c785cce9aShawn Willden &deserialized_key_material)) 4838f170135c28bcaa975466321ebebd1c785cce9aShawn Willden return false; 4938f170135c28bcaa975466321ebebd1c785cce9aShawn Willden key_blob->key_material = deserialized_key_material.release(); 5038f170135c28bcaa975466321ebebd1c785cce9aShawn Willden return true; 5138f170135c28bcaa975466321ebebd1c785cce9aShawn Willden} 5238f170135c28bcaa975466321ebebd1c785cce9aShawn Willden 53da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willdensize_t KeymasterResponse::SerializedSize() const { 54da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden if (error != KM_ERROR_OK) 55da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden return sizeof(int32_t); 56da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden else 57da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden return sizeof(int32_t) + NonErrorSerializedSize(); 58128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden} 59128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden 60da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willdenuint8_t* KeymasterResponse::Serialize(uint8_t* buf, const uint8_t* end) const { 61da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden buf = append_uint32_to_buf(buf, end, static_cast<uint32_t>(error)); 62da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden if (error == KM_ERROR_OK) 63da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden buf = NonErrorSerialize(buf, end); 64da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden return buf; 65da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 66128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden 67da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willdenbool KeymasterResponse::Deserialize(const uint8_t** buf_ptr, const uint8_t* end) { 68da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden if (!copy_uint32_from_buf(buf_ptr, end, &error)) 69128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden return false; 70da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden if (error != KM_ERROR_OK) 71128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden return true; 72da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden return NonErrorDeserialize(buf_ptr, end); 73da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 74128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden 75da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenGenerateKeyResponse::~GenerateKeyResponse() { 76da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden delete[] key_blob.key_material; 77da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 78da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 79da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willdensize_t GenerateKeyResponse::NonErrorSerializedSize() const { 8038f170135c28bcaa975466321ebebd1c785cce9aShawn Willden return key_blob_size(key_blob) + enforced.SerializedSize() + unenforced.SerializedSize(); 81da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 82da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 83da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willdenuint8_t* GenerateKeyResponse::NonErrorSerialize(uint8_t* buf, const uint8_t* end) const { 8438f170135c28bcaa975466321ebebd1c785cce9aShawn Willden buf = serialize_key_blob(key_blob, buf, end); 85da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden buf = enforced.Serialize(buf, end); 86da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden return unenforced.Serialize(buf, end); 87da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 88da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 89da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willdenbool GenerateKeyResponse::NonErrorDeserialize(const uint8_t** buf_ptr, const uint8_t* end) { 9038f170135c28bcaa975466321ebebd1c785cce9aShawn Willden return deserialize_key_blob(&key_blob, buf_ptr, end) && enforced.Deserialize(buf_ptr, end) && 9138f170135c28bcaa975466321ebebd1c785cce9aShawn Willden unenforced.Deserialize(buf_ptr, end); 92da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 93da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 94da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn WilldenGetKeyCharacteristicsRequest::~GetKeyCharacteristicsRequest() { 95da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden delete[] key_blob.key_material; 96da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 97da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 98da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willdenvoid GetKeyCharacteristicsRequest::SetKeyMaterial(const void* key_material, size_t length) { 9938f170135c28bcaa975466321ebebd1c785cce9aShawn Willden set_key_blob(&key_blob, key_material, length); 100da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 101128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden 102da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willdensize_t GetKeyCharacteristicsRequest::SerializedSize() const { 10338f170135c28bcaa975466321ebebd1c785cce9aShawn Willden return key_blob_size(key_blob) + additional_params.SerializedSize(); 104da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 105da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 106da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willdenuint8_t* GetKeyCharacteristicsRequest::Serialize(uint8_t* buf, const uint8_t* end) const { 10738f170135c28bcaa975466321ebebd1c785cce9aShawn Willden buf = serialize_key_blob(key_blob, buf, end); 108da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden return additional_params.Serialize(buf, end); 109da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 110da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 111da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willdenbool GetKeyCharacteristicsRequest::Deserialize(const uint8_t** buf_ptr, const uint8_t* end) { 11238f170135c28bcaa975466321ebebd1c785cce9aShawn Willden return deserialize_key_blob(&key_blob, buf_ptr, end) && 11338f170135c28bcaa975466321ebebd1c785cce9aShawn Willden additional_params.Deserialize(buf_ptr, end); 114da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 115da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 116da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willdensize_t GetKeyCharacteristicsResponse::NonErrorSerializedSize() const { 117f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden return enforced.SerializedSize() + unenforced.SerializedSize(); 118da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 119da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 120da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willdenuint8_t* GetKeyCharacteristicsResponse::NonErrorSerialize(uint8_t* buf, const uint8_t* end) const { 121da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden buf = enforced.Serialize(buf, end); 122da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden return unenforced.Serialize(buf, end); 123da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 124da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 125da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willdenbool GetKeyCharacteristicsResponse::NonErrorDeserialize(const uint8_t** buf_ptr, 126da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden const uint8_t* end) { 127f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden return enforced.Deserialize(buf_ptr, end) && unenforced.Deserialize(buf_ptr, end); 128da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 129da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 130da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willdenvoid BeginOperationRequest::SetKeyMaterial(const void* key_material, size_t length) { 13138f170135c28bcaa975466321ebebd1c785cce9aShawn Willden set_key_blob(&key_blob, key_material, length); 132da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 133da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 134da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willdensize_t BeginOperationRequest::SerializedSize() const { 13538f170135c28bcaa975466321ebebd1c785cce9aShawn Willden return sizeof(uint32_t) /* purpose */ + key_blob_size(key_blob) + 13638f170135c28bcaa975466321ebebd1c785cce9aShawn Willden additional_params.SerializedSize(); 137da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 138da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 139da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willdenuint8_t* BeginOperationRequest::Serialize(uint8_t* buf, const uint8_t* end) const { 140da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden buf = append_uint32_to_buf(buf, end, purpose); 14138f170135c28bcaa975466321ebebd1c785cce9aShawn Willden buf = serialize_key_blob(key_blob, buf, end); 142da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden return additional_params.Serialize(buf, end); 143da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 144da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 145da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willdenbool BeginOperationRequest::Deserialize(const uint8_t** buf_ptr, const uint8_t* end) { 14638f170135c28bcaa975466321ebebd1c785cce9aShawn Willden return copy_uint32_from_buf(buf_ptr, end, &purpose) && 14738f170135c28bcaa975466321ebebd1c785cce9aShawn Willden deserialize_key_blob(&key_blob, buf_ptr, end) && 14838f170135c28bcaa975466321ebebd1c785cce9aShawn Willden additional_params.Deserialize(buf_ptr, end); 149da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 150da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 151da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willdensize_t BeginOperationResponse::NonErrorSerializedSize() const { 1527b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden if (message_version == 0) 1537b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden return sizeof(op_handle); 1547b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden else 1557b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden return sizeof(op_handle) + output_params.SerializedSize(); 156da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 157da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 158da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willdenuint8_t* BeginOperationResponse::NonErrorSerialize(uint8_t* buf, const uint8_t* end) const { 1597b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden buf = append_uint64_to_buf(buf, end, op_handle); 1607b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden if (message_version > 0) 1617b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden buf = output_params.Serialize(buf, end); 1627b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden return buf; 163da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 164da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 165da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willdenbool BeginOperationResponse::NonErrorDeserialize(const uint8_t** buf_ptr, const uint8_t* end) { 1667b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden bool retval = copy_uint64_from_buf(buf_ptr, end, &op_handle); 1677b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden if (retval && message_version > 0) 1687b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden retval = output_params.Deserialize(buf_ptr, end); 1697b38f4414c974ecc0972b822f1ee46c695101600Shawn Willden return retval; 170da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 171da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 172da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willdensize_t UpdateOperationRequest::SerializedSize() const { 173ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden if (message_version == 0) 174ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden return sizeof(op_handle) + input.SerializedSize(); 175ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden else 176ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden return sizeof(op_handle) + input.SerializedSize() + additional_params.SerializedSize(); 177da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 178da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 179da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willdenuint8_t* UpdateOperationRequest::Serialize(uint8_t* buf, const uint8_t* end) const { 180da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden buf = append_uint64_to_buf(buf, end, op_handle); 181ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden buf = input.Serialize(buf, end); 182ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden if (message_version > 0) 183ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden buf = additional_params.Serialize(buf, end); 184ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden return buf; 185da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 186da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 187da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willdenbool UpdateOperationRequest::Deserialize(const uint8_t** buf_ptr, const uint8_t* end) { 188ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden bool retval = copy_uint64_from_buf(buf_ptr, end, &op_handle) && input.Deserialize(buf_ptr, end); 189ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden if (retval && message_version > 0) 190ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden retval = additional_params.Deserialize(buf_ptr, end); 191ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden return retval; 192da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 193da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 194da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willdensize_t UpdateOperationResponse::NonErrorSerializedSize() const { 1954ed2d7ed2275735ddc4952f310badfa4dcbaf04eShawn Willden size_t size = 0; 196ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden switch (message_version) { 1974ed2d7ed2275735ddc4952f310badfa4dcbaf04eShawn Willden case 3: 198ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden case 2: 1994ed2d7ed2275735ddc4952f310badfa4dcbaf04eShawn Willden size += output_params.SerializedSize(); 2004ed2d7ed2275735ddc4952f310badfa4dcbaf04eShawn Willden ; /* falls through */ 2014ed2d7ed2275735ddc4952f310badfa4dcbaf04eShawn Willden case 1: 2024ed2d7ed2275735ddc4952f310badfa4dcbaf04eShawn Willden size += sizeof(uint32_t); 2034ed2d7ed2275735ddc4952f310badfa4dcbaf04eShawn Willden ; /* falls through */ 2044ed2d7ed2275735ddc4952f310badfa4dcbaf04eShawn Willden case 0: 2054ed2d7ed2275735ddc4952f310badfa4dcbaf04eShawn Willden size += output.SerializedSize(); 2064ed2d7ed2275735ddc4952f310badfa4dcbaf04eShawn Willden break; 2074ed2d7ed2275735ddc4952f310badfa4dcbaf04eShawn Willden 208ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden default: 209ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden assert(false); 210ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden } 2114ed2d7ed2275735ddc4952f310badfa4dcbaf04eShawn Willden 2124ed2d7ed2275735ddc4952f310badfa4dcbaf04eShawn Willden return size; 213da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 214da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 215da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willdenuint8_t* UpdateOperationResponse::NonErrorSerialize(uint8_t* buf, const uint8_t* end) const { 216b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden buf = output.Serialize(buf, end); 217b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden if (message_version > 0) 218b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden buf = append_uint32_to_buf(buf, end, input_consumed); 219ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden if (message_version > 1) 220ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden buf = output_params.Serialize(buf, end); 221b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden return buf; 222da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 223da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 224da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willdenbool UpdateOperationResponse::NonErrorDeserialize(const uint8_t** buf_ptr, const uint8_t* end) { 225b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden bool retval = output.Deserialize(buf_ptr, end); 226b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden if (retval && message_version > 0) 227b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden retval = copy_uint32_from_buf(buf_ptr, end, &input_consumed); 228ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden if (retval && message_version > 1) 229ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden retval = output_params.Deserialize(buf_ptr, end); 230b7361134bff4d3d7ef1d5a3c60e50c9952dc2b56Shawn Willden return retval; 231da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 232da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 233da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willdensize_t FinishOperationRequest::SerializedSize() const { 2344ed2d7ed2275735ddc4952f310badfa4dcbaf04eShawn Willden size_t size = 0; 2354ed2d7ed2275735ddc4952f310badfa4dcbaf04eShawn Willden switch (message_version) { 2364ed2d7ed2275735ddc4952f310badfa4dcbaf04eShawn Willden case 3: 2374ed2d7ed2275735ddc4952f310badfa4dcbaf04eShawn Willden size += input.SerializedSize(); 2384ed2d7ed2275735ddc4952f310badfa4dcbaf04eShawn Willden ; /* falls through */ 2394ed2d7ed2275735ddc4952f310badfa4dcbaf04eShawn Willden case 2: 2404ed2d7ed2275735ddc4952f310badfa4dcbaf04eShawn Willden case 1: 2414ed2d7ed2275735ddc4952f310badfa4dcbaf04eShawn Willden size += additional_params.SerializedSize(); 2424ed2d7ed2275735ddc4952f310badfa4dcbaf04eShawn Willden ; /* falls through */ 2434ed2d7ed2275735ddc4952f310badfa4dcbaf04eShawn Willden case 0: 2444ed2d7ed2275735ddc4952f310badfa4dcbaf04eShawn Willden size += sizeof(op_handle) + signature.SerializedSize(); 2454ed2d7ed2275735ddc4952f310badfa4dcbaf04eShawn Willden break; 2464ed2d7ed2275735ddc4952f310badfa4dcbaf04eShawn Willden 2474ed2d7ed2275735ddc4952f310badfa4dcbaf04eShawn Willden default: 2484ed2d7ed2275735ddc4952f310badfa4dcbaf04eShawn Willden assert(false); // Should never get here. 2494ed2d7ed2275735ddc4952f310badfa4dcbaf04eShawn Willden } 2504ed2d7ed2275735ddc4952f310badfa4dcbaf04eShawn Willden 2514ed2d7ed2275735ddc4952f310badfa4dcbaf04eShawn Willden return size; 252da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 253da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 254da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willdenuint8_t* FinishOperationRequest::Serialize(uint8_t* buf, const uint8_t* end) const { 255da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden buf = append_uint64_to_buf(buf, end, op_handle); 256ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden buf = signature.Serialize(buf, end); 257ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden if (message_version > 0) 258ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden buf = additional_params.Serialize(buf, end); 2594ed2d7ed2275735ddc4952f310badfa4dcbaf04eShawn Willden if (message_version > 2) 2604ed2d7ed2275735ddc4952f310badfa4dcbaf04eShawn Willden buf = input.Serialize(buf, end); 261ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden return buf; 262da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 263da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 264da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willdenbool FinishOperationRequest::Deserialize(const uint8_t** buf_ptr, const uint8_t* end) { 265ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden bool retval = 266ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden copy_uint64_from_buf(buf_ptr, end, &op_handle) && signature.Deserialize(buf_ptr, end); 267ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden if (retval && message_version > 0) 268ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden retval = additional_params.Deserialize(buf_ptr, end); 2694ed2d7ed2275735ddc4952f310badfa4dcbaf04eShawn Willden if (retval && message_version > 2) 2704ed2d7ed2275735ddc4952f310badfa4dcbaf04eShawn Willden retval = input.Deserialize(buf_ptr, end); 271ba5e94d2261db449747c37ffee34e85218c5cd6aShawn Willden return retval; 272da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 273da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 274da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willdensize_t FinishOperationResponse::NonErrorSerializedSize() const { 275ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden if (message_version < 2) 276ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden return output.SerializedSize(); 277ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden else 278ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden return output.SerializedSize() + output_params.SerializedSize(); 279da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 280da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 281da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willdenuint8_t* FinishOperationResponse::NonErrorSerialize(uint8_t* buf, const uint8_t* end) const { 282ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden buf = output.Serialize(buf, end); 283ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden if (message_version > 1) 284ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden buf = output_params.Serialize(buf, end); 285ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden return buf; 286da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 287da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 288da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willdenbool FinishOperationResponse::NonErrorDeserialize(const uint8_t** buf_ptr, const uint8_t* end) { 289ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden bool retval = output.Deserialize(buf_ptr, end); 290ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden if (retval && message_version > 1) 291ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden retval = output_params.Deserialize(buf_ptr, end); 292ac69d9559e96cf57d7705848a9f3d6e09eac9fe1Shawn Willden return retval; 293da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 294da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 295cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willdensize_t AddEntropyRequest::SerializedSize() const { 296cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden return random_data.SerializedSize(); 297cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden} 298cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden 299cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willdenuint8_t* AddEntropyRequest::Serialize(uint8_t* buf, const uint8_t* end) const { 300cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden return random_data.Serialize(buf, end); 301cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden} 302cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden 303cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willdenbool AddEntropyRequest::Deserialize(const uint8_t** buf_ptr, const uint8_t* end) { 304cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden return random_data.Deserialize(buf_ptr, end); 305cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden} 306cd695824a87fa9adc2d287012ddc791bb2ec63cdShawn Willden 307da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willdenvoid ImportKeyRequest::SetKeyMaterial(const void* key_material, size_t length) { 308da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden delete[] key_data; 309da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden key_data = dup_buffer(key_material, length); 310da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden key_data_length = length; 311da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 312da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 313da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willdensize_t ImportKeyRequest::SerializedSize() const { 314f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden return key_description.SerializedSize() + sizeof(uint32_t) /* key_format */ + 315f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden sizeof(uint32_t) /* key_data_length */ + key_data_length; 316da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 317da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 318da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willdenuint8_t* ImportKeyRequest::Serialize(uint8_t* buf, const uint8_t* end) const { 319437fbd195e7de57b7dc0c449c04458bd90ef50deShawn Willden buf = key_description.Serialize(buf, end); 320da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden buf = append_uint32_to_buf(buf, end, key_format); 321da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden return append_size_and_data_to_buf(buf, end, key_data, key_data_length); 322da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 323da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 324da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willdenbool ImportKeyRequest::Deserialize(const uint8_t** buf_ptr, const uint8_t* end) { 325f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden delete[] key_data; 326f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden key_data = NULL; 327f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden UniquePtr<uint8_t[]> deserialized_key_material; 328f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden if (!key_description.Deserialize(buf_ptr, end) || 329f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden !copy_uint32_from_buf(buf_ptr, end, &key_format) || 330f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden !copy_size_and_data_from_buf(buf_ptr, end, &key_data_length, &deserialized_key_material)) 331f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden return false; 332f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden key_data = deserialized_key_material.release(); 333f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden return true; 334da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 335da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 336da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willdenvoid ImportKeyResponse::SetKeyMaterial(const void* key_material, size_t length) { 33738f170135c28bcaa975466321ebebd1c785cce9aShawn Willden set_key_blob(&key_blob, key_material, length); 338da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 339da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 340da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willdensize_t ImportKeyResponse::NonErrorSerializedSize() const { 34138f170135c28bcaa975466321ebebd1c785cce9aShawn Willden return key_blob_size(key_blob) + enforced.SerializedSize() + unenforced.SerializedSize(); 342da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 343da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 344da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willdenuint8_t* ImportKeyResponse::NonErrorSerialize(uint8_t* buf, const uint8_t* end) const { 34538f170135c28bcaa975466321ebebd1c785cce9aShawn Willden buf = serialize_key_blob(key_blob, buf, end); 346da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden buf = enforced.Serialize(buf, end); 347da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden return unenforced.Serialize(buf, end); 348da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 349da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 350da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willdenbool ImportKeyResponse::NonErrorDeserialize(const uint8_t** buf_ptr, const uint8_t* end) { 35138f170135c28bcaa975466321ebebd1c785cce9aShawn Willden return deserialize_key_blob(&key_blob, buf_ptr, end) && enforced.Deserialize(buf_ptr, end) && 35238f170135c28bcaa975466321ebebd1c785cce9aShawn Willden unenforced.Deserialize(buf_ptr, end); 353da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 354da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 355da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willdenvoid ExportKeyRequest::SetKeyMaterial(const void* key_material, size_t length) { 35638f170135c28bcaa975466321ebebd1c785cce9aShawn Willden set_key_blob(&key_blob, key_material, length); 357da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 358da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 359da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willdensize_t ExportKeyRequest::SerializedSize() const { 360f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden return additional_params.SerializedSize() + sizeof(uint32_t) /* key_format */ + 36138f170135c28bcaa975466321ebebd1c785cce9aShawn Willden key_blob_size(key_blob); 362da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 363da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 364da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willdenuint8_t* ExportKeyRequest::Serialize(uint8_t* buf, const uint8_t* end) const { 365da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden buf = additional_params.Serialize(buf, end); 366da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden buf = append_uint32_to_buf(buf, end, key_format); 36738f170135c28bcaa975466321ebebd1c785cce9aShawn Willden return serialize_key_blob(key_blob, buf, end); 368da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 369da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 370da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willdenbool ExportKeyRequest::Deserialize(const uint8_t** buf_ptr, const uint8_t* end) { 37138f170135c28bcaa975466321ebebd1c785cce9aShawn Willden return additional_params.Deserialize(buf_ptr, end) && 37238f170135c28bcaa975466321ebebd1c785cce9aShawn Willden copy_uint32_from_buf(buf_ptr, end, &key_format) && 37338f170135c28bcaa975466321ebebd1c785cce9aShawn Willden deserialize_key_blob(&key_blob, buf_ptr, end); 374da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 375da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 376da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willdenvoid ExportKeyResponse::SetKeyMaterial(const void* key_material, size_t length) { 377da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden delete[] key_data; 378da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden key_data = dup_buffer(key_material, length); 379da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden key_data_length = length; 380da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 381da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 382da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willdensize_t ExportKeyResponse::NonErrorSerializedSize() const { 383da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden return sizeof(uint32_t) /* key_data_length */ + key_data_length; 384da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 385da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden 386da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willdenuint8_t* ExportKeyResponse::NonErrorSerialize(uint8_t* buf, const uint8_t* end) const { 387da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden return append_size_and_data_to_buf(buf, end, key_data, key_data_length); 388da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willden} 389128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden 390da8485ea42e53839579575ec9fc2b49f7cf1a1f9Shawn Willdenbool ExportKeyResponse::NonErrorDeserialize(const uint8_t** buf_ptr, const uint8_t* end) { 391f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden delete[] key_data; 392f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden key_data = NULL; 393f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden UniquePtr<uint8_t[]> deserialized_key_material; 394f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden if (!copy_size_and_data_from_buf(buf_ptr, end, &key_data_length, &deserialized_key_material)) 395f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden return false; 396f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden key_data = deserialized_key_material.release(); 397f2282b3c6690ccfaa7878886f01693ef4f0b3bedShawn Willden return true; 398128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden} 399128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden 4002beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willdenvoid DeleteKeyRequest::SetKeyMaterial(const void* key_material, size_t length) { 4012beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden set_key_blob(&key_blob, key_material, length); 4022beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden} 4032beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden 4042beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willdensize_t DeleteKeyRequest::SerializedSize() const { 4052beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden return key_blob_size(key_blob); 4062beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden} 4072beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden 4082beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willdenuint8_t* DeleteKeyRequest::Serialize(uint8_t* buf, const uint8_t* end) const { 4092beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden return serialize_key_blob(key_blob, buf, end); 4102beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden} 4112beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden 4122beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willdenbool DeleteKeyRequest::Deserialize(const uint8_t** buf_ptr, const uint8_t* end) { 4132beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden return deserialize_key_blob(&key_blob, buf_ptr, end); 4142beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden} 4152beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden 4162665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willdensize_t GetVersionResponse::NonErrorSerializedSize() const { 4172665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden return sizeof(major_ver) + sizeof(minor_ver) + sizeof(subminor_ver); 4182665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden} 4192665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 4202665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willdenuint8_t* GetVersionResponse::NonErrorSerialize(uint8_t* buf, const uint8_t* end) const { 4212665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden if (buf + NonErrorSerializedSize() <= end) { 4222665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden *buf++ = major_ver; 4232665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden *buf++ = minor_ver; 4242665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden *buf++ = subminor_ver; 4252665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } else { 4262665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden buf += NonErrorSerializedSize(); 4272665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden } 4282665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden return buf; 4292665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden} 4302665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 4312665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willdenbool GetVersionResponse::NonErrorDeserialize(const uint8_t** buf_ptr, const uint8_t* end) { 4322665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden if (*buf_ptr + NonErrorSerializedSize() > end) 4332665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden return false; 4342665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden const uint8_t* tmp = *buf_ptr; 4352665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden major_ver = *tmp++; 4362665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden minor_ver = *tmp++; 4372665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden subminor_ver = *tmp++; 4382665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden *buf_ptr = tmp; 4392665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden return true; 4402665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden} 4412665e868b1153cb89ad7cd906ae160cb417d4438Shawn Willden 4423d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn WilldenAttestKeyRequest::~AttestKeyRequest() { 4433d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden delete[] key_blob.key_material; 4443d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden} 4453d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden 4463d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willdenvoid AttestKeyRequest::SetKeyMaterial(const void* key_material, size_t length) { 4473d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden set_key_blob(&key_blob, key_material, length); 4483d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden} 4493d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden 4503d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willdensize_t AttestKeyRequest::SerializedSize() const { 4513d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden return key_blob_size(key_blob) + attest_params.SerializedSize(); 4523d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden} 4533d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden 4543d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willdenuint8_t* AttestKeyRequest::Serialize(uint8_t* buf, const uint8_t* end) const { 4553d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden buf = serialize_key_blob(key_blob, buf, end); 4563d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden return attest_params.Serialize(buf, end); 4573d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden} 4583d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden 4593d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willdenbool AttestKeyRequest::Deserialize(const uint8_t** buf_ptr, const uint8_t* end) { 4603d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden return deserialize_key_blob(&key_blob, buf_ptr, end) && attest_params.Deserialize(buf_ptr, end); 4613d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden} 4623d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden 4633d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn WilldenAttestKeyResponse::~AttestKeyResponse() { 4643d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden for (size_t i = 0; i < certificate_chain.entry_count; ++i) 4653d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden delete[] certificate_chain.entries[i].data; 4663d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden delete[] certificate_chain.entries; 4673d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden} 4683d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden 4693d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willdenconst size_t kMaxChainEntryCount = 10; 4703d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willdenbool AttestKeyResponse::AllocateChain(size_t entry_count) { 4713d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden if (entry_count > kMaxChainEntryCount) 4723d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden return false; 4733d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden 4743d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden if (certificate_chain.entries) { 4753d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden for (size_t i = 0; i < certificate_chain.entry_count; ++i) 4763d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden delete[] certificate_chain.entries[i].data; 4773d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden delete[] certificate_chain.entries; 4783d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden } 4793d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden 4803d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden certificate_chain.entry_count = entry_count; 4813d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden certificate_chain.entries = new keymaster_blob_t[entry_count]; 4823d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden if (!certificate_chain.entries) { 4833d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden certificate_chain.entry_count = 0; 4843d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden return false; 4853d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden } 4863d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden 4873d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden memset(certificate_chain.entries, 0, sizeof(certificate_chain.entries[0]) * entry_count); 4883d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden return true; 4893d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden} 4903d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden 4913d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willdensize_t AttestKeyResponse::NonErrorSerializedSize() const { 4923d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden size_t result = sizeof(uint32_t); /* certificate_chain.entry_count */ 4933d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden for (size_t i = 0; i < certificate_chain.entry_count; ++i) { 4943d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden result += sizeof(uint32_t); /* certificate_chain.entries[i].data_length */ 4953d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden result += certificate_chain.entries[i].data_length; 4963d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden } 4973d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden return result; 4983d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden} 4993d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden 5003d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willdenuint8_t* AttestKeyResponse::NonErrorSerialize(uint8_t* buf, const uint8_t* end) const { 5013d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden buf = append_uint32_to_buf(buf, end, certificate_chain.entry_count); 5023d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden for (size_t i = 0; i < certificate_chain.entry_count; ++i) { 5033d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden buf = append_size_and_data_to_buf(buf, end, certificate_chain.entries[i].data, 5043d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden certificate_chain.entries[i].data_length); 5053d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden } 5063d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden return buf; 5073d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden} 5083d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden 5093d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willdenbool AttestKeyResponse::NonErrorDeserialize(const uint8_t** buf_ptr, const uint8_t* end) { 5103d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden size_t entry_count; 5113d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden if (!copy_uint32_from_buf(buf_ptr, end, &entry_count) || !AllocateChain(entry_count)) 5123d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden return false; 5133d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden 5143d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden for (size_t i = 0; i < certificate_chain.entry_count; ++i) { 5153d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden UniquePtr<uint8_t[]> data; 5163d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden size_t data_length; 5173d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden if (!copy_size_and_data_from_buf(buf_ptr, end, &data_length, &data)) 5183d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden return false; 5193d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden certificate_chain.entries[i].data = data.release(); 5203d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden certificate_chain.entries[i].data_length = data_length; 5213d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden } 5223d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden 5233d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden return true; 5243d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden} 5253d68cf64fb4bcea55406c3b6844b397ad264d8b2Shawn Willden 526cddf3a443abf64f3d77c48886693179c0b8a35bbShawn WilldenUpgradeKeyRequest::~UpgradeKeyRequest() { 527cddf3a443abf64f3d77c48886693179c0b8a35bbShawn Willden delete[] key_blob.key_material; 528cddf3a443abf64f3d77c48886693179c0b8a35bbShawn Willden} 529cddf3a443abf64f3d77c48886693179c0b8a35bbShawn Willden 530cddf3a443abf64f3d77c48886693179c0b8a35bbShawn Willdenvoid UpgradeKeyRequest::SetKeyMaterial(const void* key_material, size_t length) { 531cddf3a443abf64f3d77c48886693179c0b8a35bbShawn Willden set_key_blob(&key_blob, key_material, length); 532cddf3a443abf64f3d77c48886693179c0b8a35bbShawn Willden} 533cddf3a443abf64f3d77c48886693179c0b8a35bbShawn Willden 534cddf3a443abf64f3d77c48886693179c0b8a35bbShawn Willdensize_t UpgradeKeyRequest::SerializedSize() const { 535cddf3a443abf64f3d77c48886693179c0b8a35bbShawn Willden return key_blob_size(key_blob) + upgrade_params.SerializedSize(); 536cddf3a443abf64f3d77c48886693179c0b8a35bbShawn Willden} 537cddf3a443abf64f3d77c48886693179c0b8a35bbShawn Willden 538cddf3a443abf64f3d77c48886693179c0b8a35bbShawn Willdenuint8_t* UpgradeKeyRequest::Serialize(uint8_t* buf, const uint8_t* end) const { 539cddf3a443abf64f3d77c48886693179c0b8a35bbShawn Willden buf = serialize_key_blob(key_blob, buf, end); 540cddf3a443abf64f3d77c48886693179c0b8a35bbShawn Willden return upgrade_params.Serialize(buf, end); 541cddf3a443abf64f3d77c48886693179c0b8a35bbShawn Willden} 542cddf3a443abf64f3d77c48886693179c0b8a35bbShawn Willden 543cddf3a443abf64f3d77c48886693179c0b8a35bbShawn Willdenbool UpgradeKeyRequest::Deserialize(const uint8_t** buf_ptr, const uint8_t* end) { 544cddf3a443abf64f3d77c48886693179c0b8a35bbShawn Willden return deserialize_key_blob(&key_blob, buf_ptr, end) && 545cddf3a443abf64f3d77c48886693179c0b8a35bbShawn Willden upgrade_params.Deserialize(buf_ptr, end); 546cddf3a443abf64f3d77c48886693179c0b8a35bbShawn Willden} 547cddf3a443abf64f3d77c48886693179c0b8a35bbShawn Willden 548cddf3a443abf64f3d77c48886693179c0b8a35bbShawn WilldenUpgradeKeyResponse::~UpgradeKeyResponse() { 549cddf3a443abf64f3d77c48886693179c0b8a35bbShawn Willden delete[] upgraded_key.key_material; 550cddf3a443abf64f3d77c48886693179c0b8a35bbShawn Willden} 551cddf3a443abf64f3d77c48886693179c0b8a35bbShawn Willden 552cddf3a443abf64f3d77c48886693179c0b8a35bbShawn Willdensize_t UpgradeKeyResponse::NonErrorSerializedSize() const { 553cddf3a443abf64f3d77c48886693179c0b8a35bbShawn Willden return key_blob_size(upgraded_key); 554cddf3a443abf64f3d77c48886693179c0b8a35bbShawn Willden} 555cddf3a443abf64f3d77c48886693179c0b8a35bbShawn Willden 556cddf3a443abf64f3d77c48886693179c0b8a35bbShawn Willdenuint8_t* UpgradeKeyResponse::NonErrorSerialize(uint8_t* buf, const uint8_t* end) const { 557cddf3a443abf64f3d77c48886693179c0b8a35bbShawn Willden return serialize_key_blob(upgraded_key, buf, end); 558cddf3a443abf64f3d77c48886693179c0b8a35bbShawn Willden} 559cddf3a443abf64f3d77c48886693179c0b8a35bbShawn Willden 560cddf3a443abf64f3d77c48886693179c0b8a35bbShawn Willdenbool UpgradeKeyResponse::NonErrorDeserialize(const uint8_t** buf_ptr, const uint8_t* end) { 561cddf3a443abf64f3d77c48886693179c0b8a35bbShawn Willden return deserialize_key_blob(&upgraded_key, buf_ptr, end); 562cddf3a443abf64f3d77c48886693179c0b8a35bbShawn Willden} 563cddf3a443abf64f3d77c48886693179c0b8a35bbShawn Willden 564128ffe07c723d8ffe2d5ea528ba5f64436c8a55aShawn Willden} // namespace keymaster 565