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