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, ×tamp) && //
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, ×tamp) &&
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