xref: /aosp_15_r20/system/keymaster/android_keymaster/android_keymaster_messages.cpp (revision 789431f29546679ab5188a97751fb38e3018d44d)
1 /*
2  * Copyright 2014 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include <keymaster/android_keymaster_messages.h>
18 #include <keymaster/android_keymaster_utils.h>
19 
20 namespace keymaster {
21 
22 // Maximum supported number of entries in an HmacSharingParamsArray.
23 const size_t kMaxSharingParams = 10;
24 
25 namespace {
26 
27 /*
28  * Helper functions for working with key blobs.
29  */
30 
set_key_blob(keymaster_key_blob_t * key_blob,const void * key_material,size_t length)31 void set_key_blob(keymaster_key_blob_t* key_blob, const void* key_material, size_t length) {
32     delete[] key_blob->key_material;
33     key_blob->key_material = dup_buffer(key_material, length);
34     key_blob->key_material_size = length;
35 }
36 
key_blob_size(const keymaster_key_blob_t & key_blob)37 size_t key_blob_size(const keymaster_key_blob_t& key_blob) {
38     return sizeof(uint32_t) /* key size */ + key_blob.key_material_size;
39 }
40 
serialize_key_blob(const keymaster_key_blob_t & key_blob,uint8_t * buf,const uint8_t * end)41 uint8_t* serialize_key_blob(const keymaster_key_blob_t& key_blob, uint8_t* buf,
42                             const uint8_t* end) {
43     return append_size_and_data_to_buf(buf, end, key_blob.key_material, key_blob.key_material_size);
44 }
45 
deserialize_key_blob(keymaster_key_blob_t * key_blob,const uint8_t ** buf_ptr,const uint8_t * end)46 bool deserialize_key_blob(keymaster_key_blob_t* key_blob, const uint8_t** buf_ptr,
47                           const uint8_t* end) {
48     delete[] key_blob->key_material;
49     key_blob->key_material = nullptr;
50     UniquePtr<uint8_t[]> deserialized_key_material;
51     if (!copy_size_and_data_from_buf(buf_ptr, end, &key_blob->key_material_size,
52                                      &deserialized_key_material))
53         return false;
54     key_blob->key_material = deserialized_key_material.release();
55     return true;
56 }
57 
set_blob(keymaster_blob_t * blob,const void * data,size_t length)58 void set_blob(keymaster_blob_t* blob, const void* data, size_t length) {
59     assert(blob);
60     assert(data);
61     delete[] blob->data;
62     blob->data = dup_buffer(data, length);
63     blob->data_length = length;
64 }
65 
blob_size(const keymaster_blob_t & blob)66 size_t blob_size(const keymaster_blob_t& blob) {
67     return sizeof(uint32_t) /* data size */ + blob.data_length;
68 }
69 
serialize_blob(const keymaster_blob_t & blob,uint8_t * buf,const uint8_t * end)70 uint8_t* serialize_blob(const keymaster_blob_t& blob, uint8_t* buf, const uint8_t* end) {
71     return append_size_and_data_to_buf(buf, end, blob.data, blob.data_length);
72 }
73 
deserialize_blob(keymaster_blob_t * blob,const uint8_t ** buf_ptr,const uint8_t * end)74 bool deserialize_blob(keymaster_blob_t* blob, const uint8_t** buf_ptr, const uint8_t* end) {
75     delete[] blob->data;
76     *blob = {};
77     UniquePtr<uint8_t[]> deserialized_blob;
78     if (!copy_size_and_data_from_buf(buf_ptr, end, &blob->data_length, &deserialized_blob))
79         return false;
80     blob->data = deserialized_blob.release();
81     return true;
82 }
83 
84 /*
85  * Helper functions for working with certificate chains.
86  */
87 const size_t kMaxChainEntryCount = 10;
88 
chain_size(const keymaster_cert_chain_t & certificate_chain)89 size_t chain_size(const keymaster_cert_chain_t& certificate_chain) {
90     size_t result = sizeof(uint32_t); /* certificate_chain.entry_count */
91     for (size_t i = 0; i < certificate_chain.entry_count; ++i) {
92         result += sizeof(uint32_t); /* certificate_chain.entries[i].data_length */
93         result += certificate_chain.entries[i].data_length;
94     }
95     return result;
96 }
97 
serialize_chain(const keymaster_cert_chain_t & certificate_chain,uint8_t * buf,const uint8_t * end)98 uint8_t* serialize_chain(const keymaster_cert_chain_t& certificate_chain, uint8_t* buf,
99                          const uint8_t* end) {
100     buf = append_uint32_to_buf(buf, end, certificate_chain.entry_count);
101     for (size_t i = 0; i < certificate_chain.entry_count; ++i) {
102         buf = append_size_and_data_to_buf(buf, end, certificate_chain.entries[i].data,
103                                           certificate_chain.entries[i].data_length);
104     }
105     return buf;
106 }
107 
deserialize_chain(const uint8_t ** buf_ptr,const uint8_t * end)108 CertificateChain deserialize_chain(const uint8_t** buf_ptr, const uint8_t* end) {
109     size_t entry_count;
110     if (!copy_uint32_from_buf(buf_ptr, end, &entry_count) || entry_count > kMaxChainEntryCount) {
111         return {};
112     }
113 
114     CertificateChain certificate_chain(entry_count);
115     if (!certificate_chain.entries) return {};
116 
117     for (size_t i = 0; i < certificate_chain.entry_count; ++i) {
118         UniquePtr<uint8_t[]> data;
119         size_t data_length;
120         if (!copy_size_and_data_from_buf(buf_ptr, end, &data_length, &data)) return {};
121         certificate_chain.entries[i].data = data.release();
122         certificate_chain.entries[i].data_length = data_length;
123     }
124 
125     return certificate_chain;
126 }
127 
128 }  // namespace
129 
NegotiateMessageVersion(const GetVersionResponse & response,keymaster_error_t * error)130 int32_t NegotiateMessageVersion(const GetVersionResponse& response, keymaster_error_t* error) {
131     switch (response.major_ver) {
132     case 1:  // KM1
133         switch (response.minor_ver) {
134         case 0:
135             return MessageVersion(KmVersion::KEYMASTER_1, 0 /* km_date */);
136         case 1:
137             return MessageVersion(KmVersion::KEYMASTER_1_1, 0 /* km_date */);
138         }
139         break;
140     case 2:
141         return MessageVersion(KmVersion::KEYMASTER_2, 0 /* km_date */);
142     case 3:
143         return MessageVersion(KmVersion::KEYMASTER_3, 0 /* km_date */);
144     case 4:
145         switch (response.minor_ver) {
146         case 0:
147             return MessageVersion(KmVersion::KEYMASTER_4, 0 /* km_date */);
148         case 1:
149             return MessageVersion(KmVersion::KEYMASTER_4_1, 0 /* km_date */);
150         }
151         break;
152     }
153 
154     *error = KM_ERROR_UNKNOWN_ERROR;
155     return -1;
156 }
157 
NegotiateMessageVersion(const GetVersion2Request & request,const GetVersion2Response & response)158 int32_t NegotiateMessageVersion(const GetVersion2Request& request,
159                                 const GetVersion2Response& response) {
160     return request.max_message_version < response.max_message_version
161                ? request.max_message_version
162                : response.max_message_version;
163 }
164 
SerializedSize() const165 size_t KeymasterResponse::SerializedSize() const {
166     if (error != KM_ERROR_OK)
167         return sizeof(int32_t);
168     else
169         return sizeof(int32_t) + NonErrorSerializedSize();
170 }
171 
Serialize(uint8_t * buf,const uint8_t * end) const172 uint8_t* KeymasterResponse::Serialize(uint8_t* buf, const uint8_t* end) const {
173     buf = append_uint32_to_buf(buf, end, static_cast<uint32_t>(error));
174     if (error == KM_ERROR_OK) buf = NonErrorSerialize(buf, end);
175     return buf;
176 }
177 
Deserialize(const uint8_t ** buf_ptr,const uint8_t * end)178 bool KeymasterResponse::Deserialize(const uint8_t** buf_ptr, const uint8_t* end) {
179     if (!copy_uint32_from_buf(buf_ptr, end, &error)) return false;
180     if (error != KM_ERROR_OK) return true;
181     return NonErrorDeserialize(buf_ptr, end);
182 }
183 
SerializedSize() const184 size_t GenerateKeyRequest::SerializedSize() const {
185     size_t size = key_description.SerializedSize();
186     if (message_version < 4) return size;
187     return size                                           //
188            + key_blob_size(attestation_signing_key_blob)  //
189            + attest_key_params.SerializedSize()           //
190            + blob_size(issuer_subject);
191 }
192 
Serialize(uint8_t * buf,const uint8_t * end) const193 uint8_t* GenerateKeyRequest::Serialize(uint8_t* buf, const uint8_t* end) const {
194     buf = key_description.Serialize(buf, end);
195     if (message_version < 4) return buf;
196     buf = serialize_key_blob(attestation_signing_key_blob, buf, end);
197     buf = attest_key_params.Serialize(buf, end);
198     return serialize_blob(issuer_subject, buf, end);
199 }
200 
Deserialize(const uint8_t ** buf_ptr,const uint8_t * end)201 bool GenerateKeyRequest::Deserialize(const uint8_t** buf_ptr, const uint8_t* end) {
202     if (!key_description.Deserialize(buf_ptr, end)) return false;
203     if (message_version < 4) return true;
204     return deserialize_key_blob(&attestation_signing_key_blob, buf_ptr, end)  //
205            && attest_key_params.Deserialize(buf_ptr, end)                     //
206            && deserialize_blob(&issuer_subject, buf_ptr, end);
207 }
208 
NonErrorSerializedSize() const209 size_t GenerateKeyResponse::NonErrorSerializedSize() const {
210     size_t result =
211         key_blob_size(key_blob) + enforced.SerializedSize() + unenforced.SerializedSize();
212     if (message_version < 4) return result;
213     return result + chain_size(certificate_chain);
214 }
215 
NonErrorSerialize(uint8_t * buf,const uint8_t * end) const216 uint8_t* GenerateKeyResponse::NonErrorSerialize(uint8_t* buf, const uint8_t* end) const {
217     buf = serialize_key_blob(key_blob, buf, end);
218     buf = enforced.Serialize(buf, end);
219     buf = unenforced.Serialize(buf, end);
220     if (message_version < 4) return buf;
221     return serialize_chain(certificate_chain, buf, end);
222 }
223 
NonErrorDeserialize(const uint8_t ** buf_ptr,const uint8_t * end)224 bool GenerateKeyResponse::NonErrorDeserialize(const uint8_t** buf_ptr, const uint8_t* end) {
225     if (!deserialize_key_blob(&key_blob, buf_ptr, end) ||  //
226         !enforced.Deserialize(buf_ptr, end) ||             //
227         !unenforced.Deserialize(buf_ptr, end)) {
228         return false;
229     }
230     if (message_version < 4) return true;
231     certificate_chain = deserialize_chain(buf_ptr, end);
232     return !!certificate_chain.entries;
233 }
234 
NonErrorSerializedSize() const235 size_t GenerateRkpKeyResponse::NonErrorSerializedSize() const {
236     return key_blob_size(key_blob) + blob_size(maced_public_key);
237 }
238 
NonErrorSerialize(uint8_t * buf,const uint8_t * end) const239 uint8_t* GenerateRkpKeyResponse::NonErrorSerialize(uint8_t* buf, const uint8_t* end) const {
240     buf = serialize_key_blob(key_blob, buf, end);
241     return serialize_blob(maced_public_key, buf, end);
242 }
243 
NonErrorDeserialize(const uint8_t ** buf_ptr,const uint8_t * end)244 bool GenerateRkpKeyResponse::NonErrorDeserialize(const uint8_t** buf_ptr, const uint8_t* end) {
245     return deserialize_key_blob(&key_blob, buf_ptr, end) &&
246            deserialize_blob(&maced_public_key, buf_ptr, end);
247 }
248 
SerializedSize() const249 size_t GenerateCsrRequest::SerializedSize() const {
250     size_t size = sizeof(uint8_t); /* test_mode */
251     size += sizeof(uint32_t);      /* num_keys */
252     for (size_t i = 0; i < num_keys; i++) {
253         size += blob_size(keys_to_sign_array[i]);
254     }
255     size += blob_size(endpoint_enc_cert_chain);
256     size += blob_size(challenge);
257     return size;
258 }
259 
Serialize(uint8_t * buf,const uint8_t * end) const260 uint8_t* GenerateCsrRequest::Serialize(uint8_t* buf, const uint8_t* end) const {
261     buf = append_to_buf(buf, end, &test_mode, sizeof(uint8_t));
262     buf = append_uint32_to_buf(buf, end, num_keys);
263     for (size_t i = 0; i < num_keys; i++) {
264         buf = serialize_blob(keys_to_sign_array[i], buf, end);
265     }
266     buf = serialize_blob(endpoint_enc_cert_chain, buf, end);
267     return serialize_blob(challenge, buf, end);
268 }
269 
Deserialize(const uint8_t ** buf_ptr,const uint8_t * end)270 bool GenerateCsrRequest::Deserialize(const uint8_t** buf_ptr, const uint8_t* end) {
271     if (!copy_from_buf(buf_ptr, end, &test_mode, sizeof(uint8_t)) ||
272         !copy_from_buf(buf_ptr, end, &num_keys, sizeof(uint32_t))) {
273         return false;
274     }
275     keys_to_sign_array = new (std::nothrow) KeymasterBlob[num_keys];
276     if (!keys_to_sign_array) return false;
277     for (size_t i = 0; i < num_keys; i++) {
278         if (!deserialize_blob(&keys_to_sign_array[i], buf_ptr, end)) return false;
279     }
280     return deserialize_blob(&endpoint_enc_cert_chain, buf_ptr, end) &&
281            deserialize_blob(&challenge, buf_ptr, end);
282 }
283 
SetKeyToSign(uint32_t index,const void * data,size_t length)284 void GenerateCsrRequest::SetKeyToSign(uint32_t index, const void* data, size_t length) {
285     if (index >= num_keys) {
286         return;
287     }
288     set_blob(&keys_to_sign_array[index], data, length);
289 }
290 
SetEndpointEncCertChain(const void * data,size_t length)291 void GenerateCsrRequest::SetEndpointEncCertChain(const void* data, size_t length) {
292     set_blob(&endpoint_enc_cert_chain, data, length);
293 }
294 
SetChallenge(const void * data,size_t length)295 void GenerateCsrRequest::SetChallenge(const void* data, size_t length) {
296     set_blob(&challenge, data, length);
297 }
298 
NonErrorSerializedSize() const299 size_t GenerateCsrResponse::NonErrorSerializedSize() const {
300     return blob_size(keys_to_sign_mac) + blob_size(device_info_blob) +
301            blob_size(protected_data_blob);
302 }
303 
NonErrorSerialize(uint8_t * buf,const uint8_t * end) const304 uint8_t* GenerateCsrResponse::NonErrorSerialize(uint8_t* buf, const uint8_t* end) const {
305     buf = serialize_blob(keys_to_sign_mac, buf, end);
306     buf = serialize_blob(device_info_blob, buf, end);
307     return serialize_blob(protected_data_blob, buf, end);
308 }
309 
NonErrorDeserialize(const uint8_t ** buf_ptr,const uint8_t * end)310 bool GenerateCsrResponse::NonErrorDeserialize(const uint8_t** buf_ptr, const uint8_t* end) {
311     return deserialize_blob(&keys_to_sign_mac, buf_ptr, end) &&
312            deserialize_blob(&device_info_blob, buf_ptr, end) &&
313            deserialize_blob(&protected_data_blob, buf_ptr, end);
314 }
315 
SerializedSize() const316 size_t GenerateCsrV2Request::SerializedSize() const {
317     size_t size = sizeof(uint32_t); /* num_keys */
318     for (size_t i = 0; i < num_keys; i++) {
319         size += blob_size(keys_to_sign_array[i]);
320     }
321     size += blob_size(challenge);
322     return size;
323 }
324 
Serialize(uint8_t * buf,const uint8_t * end) const325 uint8_t* GenerateCsrV2Request::Serialize(uint8_t* buf, const uint8_t* end) const {
326     buf = append_uint32_to_buf(buf, end, num_keys);
327     for (size_t i = 0; i < num_keys; i++) {
328         buf = serialize_blob(keys_to_sign_array[i], buf, end);
329     }
330     return serialize_blob(challenge, buf, end);
331 }
332 
Deserialize(const uint8_t ** buf_ptr,const uint8_t * end)333 bool GenerateCsrV2Request::Deserialize(const uint8_t** buf_ptr, const uint8_t* end) {
334     if (!copy_from_buf(buf_ptr, end, &num_keys, sizeof(uint32_t))) return false;
335 
336     keys_to_sign_array = new (std::nothrow) KeymasterBlob[num_keys];
337     if (!keys_to_sign_array) return false;
338     for (size_t i = 0; i < num_keys; i++) {
339         if (!deserialize_blob(&keys_to_sign_array[i], buf_ptr, end)) return false;
340     }
341     return deserialize_blob(&challenge, buf_ptr, end);
342 }
343 
InitKeysToSign(uint32_t count)344 bool GenerateCsrV2Request::InitKeysToSign(uint32_t count) {
345     num_keys = count;
346     keys_to_sign_array = new (std::nothrow) KeymasterBlob[count];
347     if (!keys_to_sign_array) {
348         return false;
349     }
350     return true;
351 }
352 
SetKeyToSign(uint32_t index,const void * data,size_t length)353 void GenerateCsrV2Request::SetKeyToSign(uint32_t index, const void* data, size_t length) {
354     if (index >= num_keys) {
355         return;
356     }
357     set_blob(&keys_to_sign_array[index], data, length);
358 }
359 
SetChallenge(const void * data,size_t length)360 void GenerateCsrV2Request::SetChallenge(const void* data, size_t length) {
361     set_blob(&challenge, data, length);
362 }
363 
NonErrorSerializedSize() const364 size_t GenerateCsrV2Response::NonErrorSerializedSize() const {
365     return blob_size(csr);
366 }
367 
NonErrorSerialize(uint8_t * buf,const uint8_t * end) const368 uint8_t* GenerateCsrV2Response::NonErrorSerialize(uint8_t* buf, const uint8_t* end) const {
369     return serialize_blob(csr, buf, end);
370 }
371 
NonErrorDeserialize(const uint8_t ** buf_ptr,const uint8_t * end)372 bool GenerateCsrV2Response::NonErrorDeserialize(const uint8_t** buf_ptr, const uint8_t* end) {
373     return deserialize_blob(&csr, buf_ptr, end);
374 }
375 
~GetKeyCharacteristicsRequest()376 GetKeyCharacteristicsRequest::~GetKeyCharacteristicsRequest() {
377     delete[] key_blob.key_material;
378 }
379 
SetKeyMaterial(const void * key_material,size_t length)380 void GetKeyCharacteristicsRequest::SetKeyMaterial(const void* key_material, size_t length) {
381     set_key_blob(&key_blob, key_material, length);
382 }
383 
SerializedSize() const384 size_t GetKeyCharacteristicsRequest::SerializedSize() const {
385     return key_blob_size(key_blob) + additional_params.SerializedSize();
386 }
387 
Serialize(uint8_t * buf,const uint8_t * end) const388 uint8_t* GetKeyCharacteristicsRequest::Serialize(uint8_t* buf, const uint8_t* end) const {
389     buf = serialize_key_blob(key_blob, buf, end);
390     return additional_params.Serialize(buf, end);
391 }
392 
Deserialize(const uint8_t ** buf_ptr,const uint8_t * end)393 bool GetKeyCharacteristicsRequest::Deserialize(const uint8_t** buf_ptr, const uint8_t* end) {
394     return deserialize_key_blob(&key_blob, buf_ptr, end) &&
395            additional_params.Deserialize(buf_ptr, end);
396 }
397 
NonErrorSerializedSize() const398 size_t GetKeyCharacteristicsResponse::NonErrorSerializedSize() const {
399     return enforced.SerializedSize() + unenforced.SerializedSize();
400 }
401 
NonErrorSerialize(uint8_t * buf,const uint8_t * end) const402 uint8_t* GetKeyCharacteristicsResponse::NonErrorSerialize(uint8_t* buf, const uint8_t* end) const {
403     buf = enforced.Serialize(buf, end);
404     return unenforced.Serialize(buf, end);
405 }
406 
NonErrorDeserialize(const uint8_t ** buf_ptr,const uint8_t * end)407 bool GetKeyCharacteristicsResponse::NonErrorDeserialize(const uint8_t** buf_ptr,
408                                                         const uint8_t* end) {
409     return enforced.Deserialize(buf_ptr, end) && unenforced.Deserialize(buf_ptr, end);
410 }
411 
SetKeyMaterial(const void * key_material,size_t length)412 void BeginOperationRequest::SetKeyMaterial(const void* key_material, size_t length) {
413     set_key_blob(&key_blob, key_material, length);
414 }
415 
SerializedSize() const416 size_t BeginOperationRequest::SerializedSize() const {
417     return sizeof(uint32_t) /* purpose */ + key_blob_size(key_blob) +
418            additional_params.SerializedSize();
419 }
420 
Serialize(uint8_t * buf,const uint8_t * end) const421 uint8_t* BeginOperationRequest::Serialize(uint8_t* buf, const uint8_t* end) const {
422     buf = append_uint32_to_buf(buf, end, purpose);
423     buf = serialize_key_blob(key_blob, buf, end);
424     return additional_params.Serialize(buf, end);
425 }
426 
Deserialize(const uint8_t ** buf_ptr,const uint8_t * end)427 bool BeginOperationRequest::Deserialize(const uint8_t** buf_ptr, const uint8_t* end) {
428     return copy_uint32_from_buf(buf_ptr, end, &purpose) &&
429            deserialize_key_blob(&key_blob, buf_ptr, end) &&
430            additional_params.Deserialize(buf_ptr, end);
431 }
432 
NonErrorSerializedSize() const433 size_t BeginOperationResponse::NonErrorSerializedSize() const {
434     if (message_version == 0)
435         return sizeof(op_handle);
436     else
437         return sizeof(op_handle) + output_params.SerializedSize();
438 }
439 
NonErrorSerialize(uint8_t * buf,const uint8_t * end) const440 uint8_t* BeginOperationResponse::NonErrorSerialize(uint8_t* buf, const uint8_t* end) const {
441     buf = append_uint64_to_buf(buf, end, op_handle);
442     if (message_version > 0) buf = output_params.Serialize(buf, end);
443     return buf;
444 }
445 
NonErrorDeserialize(const uint8_t ** buf_ptr,const uint8_t * end)446 bool BeginOperationResponse::NonErrorDeserialize(const uint8_t** buf_ptr, const uint8_t* end) {
447     bool retval = copy_uint64_from_buf(buf_ptr, end, &op_handle);
448     if (retval && message_version > 0) retval = output_params.Deserialize(buf_ptr, end);
449     return retval;
450 }
451 
SerializedSize() const452 size_t UpdateOperationRequest::SerializedSize() const {
453     if (message_version == 0)
454         return sizeof(op_handle) + input.SerializedSize();
455     else
456         return sizeof(op_handle) + input.SerializedSize() + additional_params.SerializedSize();
457 }
458 
Serialize(uint8_t * buf,const uint8_t * end) const459 uint8_t* UpdateOperationRequest::Serialize(uint8_t* buf, const uint8_t* end) const {
460     buf = append_uint64_to_buf(buf, end, op_handle);
461     buf = input.Serialize(buf, end);
462     if (message_version > 0) buf = additional_params.Serialize(buf, end);
463     return buf;
464 }
465 
Deserialize(const uint8_t ** buf_ptr,const uint8_t * end)466 bool UpdateOperationRequest::Deserialize(const uint8_t** buf_ptr, const uint8_t* end) {
467     bool retval = copy_uint64_from_buf(buf_ptr, end, &op_handle) && input.Deserialize(buf_ptr, end);
468     if (retval && message_version > 0) retval = additional_params.Deserialize(buf_ptr, end);
469     return retval;
470 }
471 
NonErrorSerializedSize() const472 size_t UpdateOperationResponse::NonErrorSerializedSize() const {
473     size_t size = 0;
474     switch (message_version) {
475     case 4:
476     case 3:
477     case 2:
478         size += output_params.SerializedSize();
479         FALLTHROUGH;
480     case 1:
481         size += sizeof(uint32_t);
482         FALLTHROUGH;
483     case 0:
484         size += output.SerializedSize();
485         break;
486 
487     default:
488         assert(false);
489     }
490 
491     return size;
492 }
493 
NonErrorSerialize(uint8_t * buf,const uint8_t * end) const494 uint8_t* UpdateOperationResponse::NonErrorSerialize(uint8_t* buf, const uint8_t* end) const {
495     buf = output.Serialize(buf, end);
496     if (message_version > 0) buf = append_uint32_to_buf(buf, end, input_consumed);
497     if (message_version > 1) buf = output_params.Serialize(buf, end);
498     return buf;
499 }
500 
NonErrorDeserialize(const uint8_t ** buf_ptr,const uint8_t * end)501 bool UpdateOperationResponse::NonErrorDeserialize(const uint8_t** buf_ptr, const uint8_t* end) {
502     bool retval = output.Deserialize(buf_ptr, end);
503     if (retval && message_version > 0) retval = copy_uint32_from_buf(buf_ptr, end, &input_consumed);
504     if (retval && message_version > 1) retval = output_params.Deserialize(buf_ptr, end);
505     return retval;
506 }
507 
SerializedSize() const508 size_t FinishOperationRequest::SerializedSize() const {
509     size_t size = 0;
510     switch (message_version) {
511     case 4:
512     case 3:
513         size += input.SerializedSize();
514         FALLTHROUGH;
515     case 2:
516     case 1:
517         size += additional_params.SerializedSize();
518         FALLTHROUGH;
519     case 0:
520         size += sizeof(op_handle) + signature.SerializedSize();
521         break;
522 
523     default:
524         assert(false);  // Should never get here.
525     }
526 
527     return size;
528 }
529 
Serialize(uint8_t * buf,const uint8_t * end) const530 uint8_t* FinishOperationRequest::Serialize(uint8_t* buf, const uint8_t* end) const {
531     buf = append_uint64_to_buf(buf, end, op_handle);
532     buf = signature.Serialize(buf, end);
533     if (message_version > 0) buf = additional_params.Serialize(buf, end);
534     if (message_version > 2) buf = input.Serialize(buf, end);
535     return buf;
536 }
537 
Deserialize(const uint8_t ** buf_ptr,const uint8_t * end)538 bool FinishOperationRequest::Deserialize(const uint8_t** buf_ptr, const uint8_t* end) {
539     bool retval =
540         copy_uint64_from_buf(buf_ptr, end, &op_handle) && signature.Deserialize(buf_ptr, end);
541     if (retval && message_version > 0) retval = additional_params.Deserialize(buf_ptr, end);
542     if (retval && message_version > 2) retval = input.Deserialize(buf_ptr, end);
543     return retval;
544 }
545 
NonErrorSerializedSize() const546 size_t FinishOperationResponse::NonErrorSerializedSize() const {
547     if (message_version < 2)
548         return output.SerializedSize();
549     else
550         return output.SerializedSize() + output_params.SerializedSize();
551 }
552 
NonErrorSerialize(uint8_t * buf,const uint8_t * end) const553 uint8_t* FinishOperationResponse::NonErrorSerialize(uint8_t* buf, const uint8_t* end) const {
554     buf = output.Serialize(buf, end);
555     if (message_version > 1) buf = output_params.Serialize(buf, end);
556     return buf;
557 }
558 
NonErrorDeserialize(const uint8_t ** buf_ptr,const uint8_t * end)559 bool FinishOperationResponse::NonErrorDeserialize(const uint8_t** buf_ptr, const uint8_t* end) {
560     bool retval = output.Deserialize(buf_ptr, end);
561     if (retval && message_version > 1) retval = output_params.Deserialize(buf_ptr, end);
562     return retval;
563 }
564 
SerializedSize() const565 size_t AddEntropyRequest::SerializedSize() const {
566     return random_data.SerializedSize();
567 }
568 
Serialize(uint8_t * buf,const uint8_t * end) const569 uint8_t* AddEntropyRequest::Serialize(uint8_t* buf, const uint8_t* end) const {
570     return random_data.Serialize(buf, end);
571 }
572 
Deserialize(const uint8_t ** buf_ptr,const uint8_t * end)573 bool AddEntropyRequest::Deserialize(const uint8_t** buf_ptr, const uint8_t* end) {
574     return random_data.Deserialize(buf_ptr, end);
575 }
576 
SerializedSize() const577 size_t ImportKeyRequest::SerializedSize() const {
578     size_t size = key_description.SerializedSize()     //
579                   + sizeof(uint32_t) /* key_format */  //
580                   + key_blob_size(key_data);
581     if (message_version < 4) return size;
582     return size                                           //
583            + key_blob_size(attestation_signing_key_blob)  //
584            + attest_key_params.SerializedSize()           //
585            + blob_size(issuer_subject);
586 }
587 
Serialize(uint8_t * buf,const uint8_t * end) const588 uint8_t* ImportKeyRequest::Serialize(uint8_t* buf, const uint8_t* end) const {
589     buf = key_description.Serialize(buf, end);
590     buf = append_uint32_to_buf(buf, end, key_format);
591     buf = serialize_key_blob(key_data, buf, end);
592     if (message_version < 4) return buf;
593     buf = serialize_key_blob(attestation_signing_key_blob, buf, end);
594     buf = attest_key_params.Serialize(buf, end);
595     return serialize_blob(issuer_subject, buf, end);
596 }
597 
Deserialize(const uint8_t ** buf_ptr,const uint8_t * end)598 bool ImportKeyRequest::Deserialize(const uint8_t** buf_ptr, const uint8_t* end) {
599     if (!(key_description.Deserialize(buf_ptr, end) &&
600           copy_uint32_from_buf(buf_ptr, end, &key_format) &&
601           deserialize_key_blob(&key_data, buf_ptr, end))) {
602         return false;
603     }
604     if (message_version < 4) return true;
605 
606     return deserialize_key_blob(&attestation_signing_key_blob, buf_ptr, end)  //
607            && attest_key_params.Deserialize(buf_ptr, end)                     //
608            && deserialize_blob(&issuer_subject, buf_ptr, end);
609 }
610 
SetKeyMaterial(const void * key_material,size_t length)611 void ImportKeyResponse::SetKeyMaterial(const void* key_material, size_t length) {
612     set_key_blob(&key_blob, key_material, length);
613 }
614 
NonErrorSerializedSize() const615 size_t ImportKeyResponse::NonErrorSerializedSize() const {
616     size_t result =
617         key_blob_size(key_blob) + enforced.SerializedSize() + unenforced.SerializedSize();
618     if (message_version < 4) return result;
619     return result + chain_size(certificate_chain);
620 }
621 
NonErrorSerialize(uint8_t * buf,const uint8_t * end) const622 uint8_t* ImportKeyResponse::NonErrorSerialize(uint8_t* buf, const uint8_t* end) const {
623     buf = serialize_key_blob(key_blob, buf, end);
624     buf = enforced.Serialize(buf, end);
625     buf = unenforced.Serialize(buf, end);
626     if (message_version < 4) return buf;
627     return serialize_chain(certificate_chain, buf, end);
628 }
629 
NonErrorDeserialize(const uint8_t ** buf_ptr,const uint8_t * end)630 bool ImportKeyResponse::NonErrorDeserialize(const uint8_t** buf_ptr, const uint8_t* end) {
631     if (!deserialize_key_blob(&key_blob, buf_ptr, end) ||  //
632         !enforced.Deserialize(buf_ptr, end) ||             //
633         !unenforced.Deserialize(buf_ptr, end)) {
634         return false;
635     }
636     if (message_version < 4) return true;
637     certificate_chain = deserialize_chain(buf_ptr, end);
638     return !!certificate_chain.entries;
639 }
640 
SetKeyMaterial(const void * key_material,size_t length)641 void ExportKeyRequest::SetKeyMaterial(const void* key_material, size_t length) {
642     set_key_blob(&key_blob, key_material, length);
643 }
644 
SerializedSize() const645 size_t ExportKeyRequest::SerializedSize() const {
646     return additional_params.SerializedSize() + sizeof(uint32_t) /* key_format */ +
647            key_blob_size(key_blob);
648 }
649 
Serialize(uint8_t * buf,const uint8_t * end) const650 uint8_t* ExportKeyRequest::Serialize(uint8_t* buf, const uint8_t* end) const {
651     buf = additional_params.Serialize(buf, end);
652     buf = append_uint32_to_buf(buf, end, key_format);
653     return serialize_key_blob(key_blob, buf, end);
654 }
655 
Deserialize(const uint8_t ** buf_ptr,const uint8_t * end)656 bool ExportKeyRequest::Deserialize(const uint8_t** buf_ptr, const uint8_t* end) {
657     return additional_params.Deserialize(buf_ptr, end) &&
658            copy_uint32_from_buf(buf_ptr, end, &key_format) &&
659            deserialize_key_blob(&key_blob, buf_ptr, end);
660 }
661 
SetKeyMaterial(const void * key_material,size_t length)662 void ExportKeyResponse::SetKeyMaterial(const void* key_material, size_t length) {
663     delete[] key_data;
664     key_data = dup_buffer(key_material, length);
665     key_data_length = length;
666 }
667 
NonErrorSerializedSize() const668 size_t ExportKeyResponse::NonErrorSerializedSize() const {
669     return sizeof(uint32_t) /* key_data_length */ + key_data_length;
670 }
671 
NonErrorSerialize(uint8_t * buf,const uint8_t * end) const672 uint8_t* ExportKeyResponse::NonErrorSerialize(uint8_t* buf, const uint8_t* end) const {
673     return append_size_and_data_to_buf(buf, end, key_data, key_data_length);
674 }
675 
NonErrorDeserialize(const uint8_t ** buf_ptr,const uint8_t * end)676 bool ExportKeyResponse::NonErrorDeserialize(const uint8_t** buf_ptr, const uint8_t* end) {
677     delete[] key_data;
678     key_data = nullptr;
679     UniquePtr<uint8_t[]> deserialized_key_material;
680     if (!copy_size_and_data_from_buf(buf_ptr, end, &key_data_length, &deserialized_key_material))
681         return false;
682     key_data = deserialized_key_material.release();
683     return true;
684 }
685 
SetKeyMaterial(const void * key_material,size_t length)686 void DeleteKeyRequest::SetKeyMaterial(const void* key_material, size_t length) {
687     set_key_blob(&key_blob, key_material, length);
688 }
689 
SerializedSize() const690 size_t DeleteKeyRequest::SerializedSize() const {
691     return key_blob_size(key_blob);
692 }
693 
Serialize(uint8_t * buf,const uint8_t * end) const694 uint8_t* DeleteKeyRequest::Serialize(uint8_t* buf, const uint8_t* end) const {
695     return serialize_key_blob(key_blob, buf, end);
696 }
697 
Deserialize(const uint8_t ** buf_ptr,const uint8_t * end)698 bool DeleteKeyRequest::Deserialize(const uint8_t** buf_ptr, const uint8_t* end) {
699     return deserialize_key_blob(&key_blob, buf_ptr, end);
700 }
701 
NonErrorSerializedSize() const702 size_t GetVersionResponse::NonErrorSerializedSize() const {
703     return sizeof(major_ver) + sizeof(minor_ver) + sizeof(subminor_ver);
704 }
705 
NonErrorSerialize(uint8_t * buf,const uint8_t * end) const706 uint8_t* GetVersionResponse::NonErrorSerialize(uint8_t* buf, const uint8_t* end) const {
707     if (buf + NonErrorSerializedSize() <= end) {
708         *buf++ = major_ver;
709         *buf++ = minor_ver;
710         *buf++ = subminor_ver;
711     } else {
712         buf += NonErrorSerializedSize();
713     }
714     return buf;
715 }
716 
NonErrorDeserialize(const uint8_t ** buf_ptr,const uint8_t * end)717 bool GetVersionResponse::NonErrorDeserialize(const uint8_t** buf_ptr, const uint8_t* end) {
718     if (*buf_ptr + NonErrorSerializedSize() > end) return false;
719     const uint8_t* tmp = *buf_ptr;
720     major_ver = *tmp++;
721     minor_ver = *tmp++;
722     subminor_ver = *tmp++;
723     *buf_ptr = tmp;
724     return true;
725 }
726 
~AttestKeyRequest()727 AttestKeyRequest::~AttestKeyRequest() {
728     delete[] key_blob.key_material;
729 }
730 
SetKeyMaterial(const void * key_material,size_t length)731 void AttestKeyRequest::SetKeyMaterial(const void* key_material, size_t length) {
732     set_key_blob(&key_blob, key_material, length);
733 }
734 
SerializedSize() const735 size_t AttestKeyRequest::SerializedSize() const {
736     return key_blob_size(key_blob) + attest_params.SerializedSize();
737 }
738 
Serialize(uint8_t * buf,const uint8_t * end) const739 uint8_t* AttestKeyRequest::Serialize(uint8_t* buf, const uint8_t* end) const {
740     buf = serialize_key_blob(key_blob, buf, end);
741     return attest_params.Serialize(buf, end);
742 }
743 
Deserialize(const uint8_t ** buf_ptr,const uint8_t * end)744 bool AttestKeyRequest::Deserialize(const uint8_t** buf_ptr, const uint8_t* end) {
745     return deserialize_key_blob(&key_blob, buf_ptr, end) && attest_params.Deserialize(buf_ptr, end);
746 }
747 
NonErrorSerializedSize() const748 size_t AttestKeyResponse::NonErrorSerializedSize() const {
749     return chain_size(certificate_chain);
750 }
751 
NonErrorSerialize(uint8_t * buf,const uint8_t * end) const752 uint8_t* AttestKeyResponse::NonErrorSerialize(uint8_t* buf, const uint8_t* end) const {
753     return serialize_chain(certificate_chain, buf, end);
754 }
755 
NonErrorDeserialize(const uint8_t ** buf_ptr,const uint8_t * end)756 bool AttestKeyResponse::NonErrorDeserialize(const uint8_t** buf_ptr, const uint8_t* end) {
757     certificate_chain = deserialize_chain(buf_ptr, end);
758     return !!certificate_chain.entries;
759 }
760 
~UpgradeKeyRequest()761 UpgradeKeyRequest::~UpgradeKeyRequest() {
762     delete[] key_blob.key_material;
763 }
764 
SetKeyMaterial(const void * key_material,size_t length)765 void UpgradeKeyRequest::SetKeyMaterial(const void* key_material, size_t length) {
766     set_key_blob(&key_blob, key_material, length);
767 }
768 
SerializedSize() const769 size_t UpgradeKeyRequest::SerializedSize() const {
770     return key_blob_size(key_blob) + upgrade_params.SerializedSize();
771 }
772 
Serialize(uint8_t * buf,const uint8_t * end) const773 uint8_t* UpgradeKeyRequest::Serialize(uint8_t* buf, const uint8_t* end) const {
774     buf = serialize_key_blob(key_blob, buf, end);
775     return upgrade_params.Serialize(buf, end);
776 }
777 
Deserialize(const uint8_t ** buf_ptr,const uint8_t * end)778 bool UpgradeKeyRequest::Deserialize(const uint8_t** buf_ptr, const uint8_t* end) {
779     return deserialize_key_blob(&key_blob, buf_ptr, end) &&
780            upgrade_params.Deserialize(buf_ptr, end);
781 }
782 
~UpgradeKeyResponse()783 UpgradeKeyResponse::~UpgradeKeyResponse() {
784     delete[] upgraded_key.key_material;
785 }
786 
NonErrorSerializedSize() const787 size_t UpgradeKeyResponse::NonErrorSerializedSize() const {
788     return key_blob_size(upgraded_key);
789 }
790 
NonErrorSerialize(uint8_t * buf,const uint8_t * end) const791 uint8_t* UpgradeKeyResponse::NonErrorSerialize(uint8_t* buf, const uint8_t* end) const {
792     return serialize_key_blob(upgraded_key, buf, end);
793 }
794 
NonErrorDeserialize(const uint8_t ** buf_ptr,const uint8_t * end)795 bool UpgradeKeyResponse::NonErrorDeserialize(const uint8_t** buf_ptr, const uint8_t* end) {
796     return deserialize_key_blob(&upgraded_key, buf_ptr, end);
797 }
798 
SerializedSize() const799 size_t HmacSharingParameters::SerializedSize() const {
800     return blob_size(seed) + sizeof(nonce);
801 }
802 
Serialize(uint8_t * buf,const uint8_t * end) const803 uint8_t* HmacSharingParameters::Serialize(uint8_t* buf, const uint8_t* end) const {
804     buf = serialize_blob(seed, buf, end);
805     return append_to_buf(buf, end, nonce, sizeof(nonce));
806 }
807 
Deserialize(const uint8_t ** buf_ptr,const uint8_t * end)808 bool HmacSharingParameters::Deserialize(const uint8_t** buf_ptr, const uint8_t* end) {
809     return deserialize_blob(&seed, buf_ptr, end) &&
810            copy_from_buf(buf_ptr, end, nonce, sizeof(nonce));
811 }
812 
SerializedSize() const813 size_t HmacSharingParametersArray::SerializedSize() const {
814     size_t size = sizeof(uint32_t);  // num_params size
815     for (size_t i = 0; i < num_params; ++i) {
816         size += params_array[i].SerializedSize();
817     }
818     return size;
819 }
820 
Serialize(uint8_t * buf,const uint8_t * end) const821 uint8_t* HmacSharingParametersArray::Serialize(uint8_t* buf, const uint8_t* end) const {
822     buf = append_uint32_to_buf(buf, end, num_params);
823     for (size_t i = 0; i < num_params; ++i) {
824         buf = params_array[i].Serialize(buf, end);
825     }
826     return buf;
827 }
828 
Deserialize(const uint8_t ** buf_ptr,const uint8_t * end)829 bool HmacSharingParametersArray::Deserialize(const uint8_t** buf_ptr, const uint8_t* end) {
830     if (!copy_uint32_from_buf(buf_ptr, end, &num_params)) return false;
831     if (num_params > kMaxSharingParams) return false;
832     params_array = new (std::nothrow) HmacSharingParameters[num_params];
833     if (!params_array) return false;
834     for (size_t i = 0; i < num_params; ++i) {
835         if (!params_array[i].Deserialize(buf_ptr, end)) return false;
836     }
837     return true;
838 }
839 
NonErrorSerializedSize() const840 size_t ComputeSharedHmacResponse::NonErrorSerializedSize() const {
841     return blob_size(sharing_check);
842 }
843 
NonErrorSerialize(uint8_t * buf,const uint8_t * end) const844 uint8_t* ComputeSharedHmacResponse::NonErrorSerialize(uint8_t* buf, const uint8_t* end) const {
845     return serialize_blob(sharing_check, buf, end);
846 }
847 
NonErrorDeserialize(const uint8_t ** buf_ptr,const uint8_t * end)848 bool ComputeSharedHmacResponse::NonErrorDeserialize(const uint8_t** buf_ptr, const uint8_t* end) {
849     return deserialize_blob(&sharing_check, buf_ptr, end);
850 }
851 
SerializedSize() const852 size_t ImportWrappedKeyRequest::SerializedSize() const {
853     return key_blob_size(wrapped_key) + key_blob_size(wrapping_key) + key_blob_size(masking_key) +
854            additional_params.SerializedSize() + sizeof(uint64_t)  // password_sid
855            + sizeof(uint64_t);                                    // biometric_sid
856 }
857 
Serialize(uint8_t * buf,const uint8_t * end) const858 uint8_t* ImportWrappedKeyRequest::Serialize(uint8_t* buf, const uint8_t* end) const {
859     buf = serialize_key_blob(wrapped_key, buf, end);
860     buf = serialize_key_blob(wrapping_key, buf, end);
861     buf = serialize_key_blob(masking_key, buf, end);
862     buf = additional_params.Serialize(buf, end);
863     buf = append_uint64_to_buf(buf, end, password_sid);
864     return append_uint64_to_buf(buf, end, biometric_sid);
865 }
866 
Deserialize(const uint8_t ** buf_ptr,const uint8_t * end)867 bool ImportWrappedKeyRequest::Deserialize(const uint8_t** buf_ptr, const uint8_t* end) {
868     return deserialize_key_blob(&wrapped_key, buf_ptr, end) &&
869            deserialize_key_blob(&wrapping_key, buf_ptr, end) &&
870            deserialize_key_blob(&masking_key, buf_ptr, end) &&
871            additional_params.Deserialize(buf_ptr, end) &&
872            copy_uint64_from_buf(buf_ptr, end, &password_sid) &&
873            copy_uint64_from_buf(buf_ptr, end, &biometric_sid);
874 }
875 
SetWrappedMaterial(const void * key_material,size_t length)876 void ImportWrappedKeyRequest::SetWrappedMaterial(const void* key_material, size_t length) {
877     set_key_blob(&wrapped_key, key_material, length);
878 }
879 
SetWrappingMaterial(const void * key_material,size_t length)880 void ImportWrappedKeyRequest::SetWrappingMaterial(const void* key_material, size_t length) {
881     set_key_blob(&wrapping_key, key_material, length);
882 }
883 
SetMaskingKeyMaterial(const void * key_material,size_t length)884 void ImportWrappedKeyRequest::SetMaskingKeyMaterial(const void* key_material, size_t length) {
885     set_key_blob(&masking_key, key_material, length);
886 }
887 
SetKeyMaterial(const void * key_material,size_t length)888 void ImportWrappedKeyResponse::SetKeyMaterial(const void* key_material, size_t length) {
889     set_key_blob(&key_blob, key_material, length);
890 }
891 
NonErrorSerializedSize() const892 size_t ImportWrappedKeyResponse::NonErrorSerializedSize() const {
893     size_t result =
894         key_blob_size(key_blob) + enforced.SerializedSize() + unenforced.SerializedSize();
895     if (message_version < 4) return result;
896     return result + chain_size(certificate_chain);
897 }
898 
NonErrorSerialize(uint8_t * buf,const uint8_t * end) const899 uint8_t* ImportWrappedKeyResponse::NonErrorSerialize(uint8_t* buf, const uint8_t* end) const {
900     buf = serialize_key_blob(key_blob, buf, end);
901     buf = enforced.Serialize(buf, end);
902     buf = unenforced.Serialize(buf, end);
903     if (message_version < 4) return buf;
904     return serialize_chain(certificate_chain, buf, end);
905 }
906 
NonErrorDeserialize(const uint8_t ** buf_ptr,const uint8_t * end)907 bool ImportWrappedKeyResponse::NonErrorDeserialize(const uint8_t** buf_ptr, const uint8_t* end) {
908     if (!deserialize_key_blob(&key_blob, buf_ptr, end) ||  //
909         !enforced.Deserialize(buf_ptr, end) ||             //
910         !unenforced.Deserialize(buf_ptr, end)) {
911         return false;
912     }
913     if (message_version < 4) return true;
914     certificate_chain = deserialize_chain(buf_ptr, end);
915     return !!certificate_chain.entries;
916 }
917 
SerializedSize() const918 size_t HardwareAuthToken::SerializedSize() const {
919     return sizeof(challenge) + sizeof(user_id) + sizeof(authenticator_id) +
920            sizeof(authenticator_type) + sizeof(timestamp) + blob_size(mac);
921 }
922 
Serialize(uint8_t * buf,const uint8_t * end) const923 uint8_t* HardwareAuthToken::Serialize(uint8_t* buf, const uint8_t* end) const {
924     buf = append_uint64_to_buf(buf, end, challenge);
925     buf = append_uint64_to_buf(buf, end, user_id);
926     buf = append_uint64_to_buf(buf, end, authenticator_id);
927     buf = append_uint32_to_buf(buf, end, authenticator_type);
928     buf = append_uint64_to_buf(buf, end, timestamp);
929     return serialize_blob(mac, buf, end);
930 }
931 
Deserialize(const uint8_t ** buf_ptr,const uint8_t * end)932 bool HardwareAuthToken::Deserialize(const uint8_t** buf_ptr, const uint8_t* end) {
933     return copy_uint64_from_buf(buf_ptr, end, &challenge) &&
934            copy_uint64_from_buf(buf_ptr, end, &user_id) &&
935            copy_uint64_from_buf(buf_ptr, end, &authenticator_id) &&
936            copy_uint32_from_buf(buf_ptr, end, &authenticator_type) &&
937            copy_uint64_from_buf(buf_ptr, end, &timestamp) &&  //
938            deserialize_blob(&mac, buf_ptr, end);
939 }
940 
SerializedSize() const941 size_t VerificationToken::SerializedSize() const {
942     return sizeof(challenge) + sizeof(timestamp) + parameters_verified.SerializedSize() +
943            sizeof(security_level) + blob_size(mac);
944 }
945 
Serialize(uint8_t * buf,const uint8_t * end) const946 uint8_t* VerificationToken::Serialize(uint8_t* buf, const uint8_t* end) const {
947     buf = append_uint64_to_buf(buf, end, challenge);
948     buf = append_uint64_to_buf(buf, end, timestamp);
949     buf = parameters_verified.Serialize(buf, end);
950     buf = append_uint32_to_buf(buf, end, security_level);
951     return serialize_blob(mac, buf, end);
952 }
953 
Deserialize(const uint8_t ** buf_ptr,const uint8_t * end)954 bool VerificationToken::Deserialize(const uint8_t** buf_ptr, const uint8_t* end) {
955     return copy_uint64_from_buf(buf_ptr, end, &challenge) &&
956            copy_uint64_from_buf(buf_ptr, end, &timestamp) &&
957            parameters_verified.Deserialize(buf_ptr, end) &&
958            copy_uint32_from_buf(buf_ptr, end, &security_level) &&
959            deserialize_blob(&mac, buf_ptr, end);
960 }
961 
NonErrorSerializedSize() const962 size_t GetVersion2Response::NonErrorSerializedSize() const {
963     return sizeof(max_message_version) +  //
964            sizeof(km_version) +           //
965            sizeof(km_date);
966 }
967 
NonErrorSerialize(uint8_t * buf,const uint8_t * end) const968 uint8_t* GetVersion2Response::NonErrorSerialize(uint8_t* buf, const uint8_t* end) const {
969     buf = append_uint32_to_buf(buf, end, max_message_version);
970     buf = append_uint32_to_buf(buf, end, km_version);
971     return append_uint32_to_buf(buf, end, km_date);
972 }
973 
NonErrorDeserialize(const uint8_t ** buf_ptr,const uint8_t * end)974 bool GetVersion2Response::NonErrorDeserialize(const uint8_t** buf_ptr, const uint8_t* end) {
975     return copy_uint32_from_buf(buf_ptr, end, &max_message_version) &&
976            copy_uint32_from_buf(buf_ptr, end, &km_version) &&
977            copy_uint32_from_buf(buf_ptr, end, &km_date);
978 }
979 
980 }  // namespace keymaster
981