Home | History | Annotate | Download | only in trunks
      1 //
      2 // Copyright (C) 2015 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 // THIS CODE IS GENERATED - DO NOT MODIFY!
     18 
     19 #include "trunks/tpm_generated.h"
     20 
     21 #include <memory>
     22 #include <string>
     23 
     24 #include <base/bind.h>
     25 #include <base/callback.h>
     26 #include <base/logging.h>
     27 #include <base/macros.h>
     28 #include <base/stl_util.h>
     29 #include <base/strings/string_number_conversions.h>
     30 #include <base/sys_byteorder.h>
     31 #include <crypto/secure_hash.h>
     32 
     33 #include "trunks/authorization_delegate.h"
     34 #include "trunks/command_transceiver.h"
     35 #include "trunks/error_codes.h"
     36 
     37 namespace trunks {
     38 
     39 size_t GetNumberOfRequestHandles(TPM_CC command_code) {
     40   switch (command_code) {
     41     case TPM_CC_Startup:
     42       return 0;
     43     case TPM_CC_Shutdown:
     44       return 0;
     45     case TPM_CC_SelfTest:
     46       return 0;
     47     case TPM_CC_IncrementalSelfTest:
     48       return 0;
     49     case TPM_CC_GetTestResult:
     50       return 0;
     51     case TPM_CC_StartAuthSession:
     52       return 2;
     53     case TPM_CC_PolicyRestart:
     54       return 1;
     55     case TPM_CC_Create:
     56       return 1;
     57     case TPM_CC_Load:
     58       return 1;
     59     case TPM_CC_LoadExternal:
     60       return 0;
     61     case TPM_CC_ReadPublic:
     62       return 1;
     63     case TPM_CC_ActivateCredential:
     64       return 2;
     65     case TPM_CC_MakeCredential:
     66       return 1;
     67     case TPM_CC_Unseal:
     68       return 1;
     69     case TPM_CC_ObjectChangeAuth:
     70       return 2;
     71     case TPM_CC_Duplicate:
     72       return 2;
     73     case TPM_CC_Rewrap:
     74       return 2;
     75     case TPM_CC_Import:
     76       return 1;
     77     case TPM_CC_RSA_Encrypt:
     78       return 1;
     79     case TPM_CC_RSA_Decrypt:
     80       return 1;
     81     case TPM_CC_ECDH_KeyGen:
     82       return 1;
     83     case TPM_CC_ECDH_ZGen:
     84       return 1;
     85     case TPM_CC_ECC_Parameters:
     86       return 0;
     87     case TPM_CC_ZGen_2Phase:
     88       return 1;
     89     case TPM_CC_EncryptDecrypt:
     90       return 1;
     91     case TPM_CC_Hash:
     92       return 0;
     93     case TPM_CC_HMAC:
     94       return 1;
     95     case TPM_CC_GetRandom:
     96       return 0;
     97     case TPM_CC_StirRandom:
     98       return 0;
     99     case TPM_CC_HMAC_Start:
    100       return 1;
    101     case TPM_CC_HashSequenceStart:
    102       return 0;
    103     case TPM_CC_SequenceUpdate:
    104       return 1;
    105     case TPM_CC_SequenceComplete:
    106       return 1;
    107     case TPM_CC_EventSequenceComplete:
    108       return 2;
    109     case TPM_CC_Certify:
    110       return 2;
    111     case TPM_CC_CertifyCreation:
    112       return 2;
    113     case TPM_CC_Quote:
    114       return 1;
    115     case TPM_CC_GetSessionAuditDigest:
    116       return 3;
    117     case TPM_CC_GetCommandAuditDigest:
    118       return 2;
    119     case TPM_CC_GetTime:
    120       return 2;
    121     case TPM_CC_Commit:
    122       return 1;
    123     case TPM_CC_EC_Ephemeral:
    124       return 0;
    125     case TPM_CC_VerifySignature:
    126       return 1;
    127     case TPM_CC_Sign:
    128       return 1;
    129     case TPM_CC_SetCommandCodeAuditStatus:
    130       return 1;
    131     case TPM_CC_PCR_Extend:
    132       return 1;
    133     case TPM_CC_PCR_Event:
    134       return 1;
    135     case TPM_CC_PCR_Read:
    136       return 0;
    137     case TPM_CC_PCR_Allocate:
    138       return 1;
    139     case TPM_CC_PCR_SetAuthPolicy:
    140       return 2;
    141     case TPM_CC_PCR_SetAuthValue:
    142       return 1;
    143     case TPM_CC_PCR_Reset:
    144       return 1;
    145     case TPM_CC_PolicySigned:
    146       return 2;
    147     case TPM_CC_PolicySecret:
    148       return 2;
    149     case TPM_CC_PolicyTicket:
    150       return 1;
    151     case TPM_CC_PolicyOR:
    152       return 1;
    153     case TPM_CC_PolicyPCR:
    154       return 1;
    155     case TPM_CC_PolicyLocality:
    156       return 1;
    157     case TPM_CC_PolicyNV:
    158       return 3;
    159     case TPM_CC_PolicyCounterTimer:
    160       return 1;
    161     case TPM_CC_PolicyCommandCode:
    162       return 1;
    163     case TPM_CC_PolicyPhysicalPresence:
    164       return 1;
    165     case TPM_CC_PolicyCpHash:
    166       return 1;
    167     case TPM_CC_PolicyNameHash:
    168       return 1;
    169     case TPM_CC_PolicyDuplicationSelect:
    170       return 1;
    171     case TPM_CC_PolicyAuthorize:
    172       return 1;
    173     case TPM_CC_PolicyAuthValue:
    174       return 1;
    175     case TPM_CC_PolicyPassword:
    176       return 1;
    177     case TPM_CC_PolicyGetDigest:
    178       return 1;
    179     case TPM_CC_PolicyNvWritten:
    180       return 1;
    181     case TPM_CC_CreatePrimary:
    182       return 1;
    183     case TPM_CC_HierarchyControl:
    184       return 1;
    185     case TPM_CC_SetPrimaryPolicy:
    186       return 1;
    187     case TPM_CC_ChangePPS:
    188       return 1;
    189     case TPM_CC_ChangeEPS:
    190       return 1;
    191     case TPM_CC_Clear:
    192       return 1;
    193     case TPM_CC_ClearControl:
    194       return 1;
    195     case TPM_CC_HierarchyChangeAuth:
    196       return 1;
    197     case TPM_CC_DictionaryAttackLockReset:
    198       return 1;
    199     case TPM_CC_DictionaryAttackParameters:
    200       return 1;
    201     case TPM_CC_PP_Commands:
    202       return 1;
    203     case TPM_CC_SetAlgorithmSet:
    204       return 1;
    205     case TPM_CC_FieldUpgradeStart:
    206       return 2;
    207     case TPM_CC_FieldUpgradeData:
    208       return 0;
    209     case TPM_CC_FirmwareRead:
    210       return 0;
    211     case TPM_CC_ContextSave:
    212       return 1;
    213     case TPM_CC_ContextLoad:
    214       return 0;
    215     case TPM_CC_FlushContext:
    216       return 0;
    217     case TPM_CC_EvictControl:
    218       return 2;
    219     case TPM_CC_ReadClock:
    220       return 0;
    221     case TPM_CC_ClockSet:
    222       return 1;
    223     case TPM_CC_ClockRateAdjust:
    224       return 1;
    225     case TPM_CC_GetCapability:
    226       return 0;
    227     case TPM_CC_TestParms:
    228       return 0;
    229     case TPM_CC_NV_DefineSpace:
    230       return 1;
    231     case TPM_CC_NV_UndefineSpace:
    232       return 2;
    233     case TPM_CC_NV_UndefineSpaceSpecial:
    234       return 2;
    235     case TPM_CC_NV_ReadPublic:
    236       return 1;
    237     case TPM_CC_NV_Write:
    238       return 2;
    239     case TPM_CC_NV_Increment:
    240       return 2;
    241     case TPM_CC_NV_Extend:
    242       return 2;
    243     case TPM_CC_NV_SetBits:
    244       return 2;
    245     case TPM_CC_NV_WriteLock:
    246       return 2;
    247     case TPM_CC_NV_GlobalWriteLock:
    248       return 1;
    249     case TPM_CC_NV_Read:
    250       return 2;
    251     case TPM_CC_NV_ReadLock:
    252       return 2;
    253     case TPM_CC_NV_ChangeAuth:
    254       return 1;
    255     case TPM_CC_NV_Certify:
    256       return 3;
    257     default:
    258       LOG(WARNING) << "Unknown command code: " << command_code;
    259   }
    260   return 0;
    261 }
    262 
    263 size_t GetNumberOfResponseHandles(TPM_CC command_code) {
    264   switch (command_code) {
    265     case TPM_CC_Startup:
    266       return 0;
    267     case TPM_CC_Shutdown:
    268       return 0;
    269     case TPM_CC_SelfTest:
    270       return 0;
    271     case TPM_CC_IncrementalSelfTest:
    272       return 0;
    273     case TPM_CC_GetTestResult:
    274       return 0;
    275     case TPM_CC_StartAuthSession:
    276       return 1;
    277     case TPM_CC_PolicyRestart:
    278       return 0;
    279     case TPM_CC_Create:
    280       return 0;
    281     case TPM_CC_Load:
    282       return 1;
    283     case TPM_CC_LoadExternal:
    284       return 1;
    285     case TPM_CC_ReadPublic:
    286       return 0;
    287     case TPM_CC_ActivateCredential:
    288       return 0;
    289     case TPM_CC_MakeCredential:
    290       return 0;
    291     case TPM_CC_Unseal:
    292       return 0;
    293     case TPM_CC_ObjectChangeAuth:
    294       return 0;
    295     case TPM_CC_Duplicate:
    296       return 0;
    297     case TPM_CC_Rewrap:
    298       return 0;
    299     case TPM_CC_Import:
    300       return 0;
    301     case TPM_CC_RSA_Encrypt:
    302       return 0;
    303     case TPM_CC_RSA_Decrypt:
    304       return 0;
    305     case TPM_CC_ECDH_KeyGen:
    306       return 0;
    307     case TPM_CC_ECDH_ZGen:
    308       return 0;
    309     case TPM_CC_ECC_Parameters:
    310       return 0;
    311     case TPM_CC_ZGen_2Phase:
    312       return 0;
    313     case TPM_CC_EncryptDecrypt:
    314       return 0;
    315     case TPM_CC_Hash:
    316       return 0;
    317     case TPM_CC_HMAC:
    318       return 0;
    319     case TPM_CC_GetRandom:
    320       return 0;
    321     case TPM_CC_StirRandom:
    322       return 0;
    323     case TPM_CC_HMAC_Start:
    324       return 1;
    325     case TPM_CC_HashSequenceStart:
    326       return 1;
    327     case TPM_CC_SequenceUpdate:
    328       return 0;
    329     case TPM_CC_SequenceComplete:
    330       return 0;
    331     case TPM_CC_EventSequenceComplete:
    332       return 0;
    333     case TPM_CC_Certify:
    334       return 0;
    335     case TPM_CC_CertifyCreation:
    336       return 0;
    337     case TPM_CC_Quote:
    338       return 0;
    339     case TPM_CC_GetSessionAuditDigest:
    340       return 0;
    341     case TPM_CC_GetCommandAuditDigest:
    342       return 0;
    343     case TPM_CC_GetTime:
    344       return 0;
    345     case TPM_CC_Commit:
    346       return 0;
    347     case TPM_CC_EC_Ephemeral:
    348       return 0;
    349     case TPM_CC_VerifySignature:
    350       return 0;
    351     case TPM_CC_Sign:
    352       return 0;
    353     case TPM_CC_SetCommandCodeAuditStatus:
    354       return 0;
    355     case TPM_CC_PCR_Extend:
    356       return 0;
    357     case TPM_CC_PCR_Event:
    358       return 0;
    359     case TPM_CC_PCR_Read:
    360       return 0;
    361     case TPM_CC_PCR_Allocate:
    362       return 0;
    363     case TPM_CC_PCR_SetAuthPolicy:
    364       return 0;
    365     case TPM_CC_PCR_SetAuthValue:
    366       return 0;
    367     case TPM_CC_PCR_Reset:
    368       return 0;
    369     case TPM_CC_PolicySigned:
    370       return 0;
    371     case TPM_CC_PolicySecret:
    372       return 0;
    373     case TPM_CC_PolicyTicket:
    374       return 0;
    375     case TPM_CC_PolicyOR:
    376       return 0;
    377     case TPM_CC_PolicyPCR:
    378       return 0;
    379     case TPM_CC_PolicyLocality:
    380       return 0;
    381     case TPM_CC_PolicyNV:
    382       return 0;
    383     case TPM_CC_PolicyCounterTimer:
    384       return 0;
    385     case TPM_CC_PolicyCommandCode:
    386       return 0;
    387     case TPM_CC_PolicyPhysicalPresence:
    388       return 0;
    389     case TPM_CC_PolicyCpHash:
    390       return 0;
    391     case TPM_CC_PolicyNameHash:
    392       return 0;
    393     case TPM_CC_PolicyDuplicationSelect:
    394       return 0;
    395     case TPM_CC_PolicyAuthorize:
    396       return 0;
    397     case TPM_CC_PolicyAuthValue:
    398       return 0;
    399     case TPM_CC_PolicyPassword:
    400       return 0;
    401     case TPM_CC_PolicyGetDigest:
    402       return 0;
    403     case TPM_CC_PolicyNvWritten:
    404       return 0;
    405     case TPM_CC_CreatePrimary:
    406       return 1;
    407     case TPM_CC_HierarchyControl:
    408       return 0;
    409     case TPM_CC_SetPrimaryPolicy:
    410       return 0;
    411     case TPM_CC_ChangePPS:
    412       return 0;
    413     case TPM_CC_ChangeEPS:
    414       return 0;
    415     case TPM_CC_Clear:
    416       return 0;
    417     case TPM_CC_ClearControl:
    418       return 0;
    419     case TPM_CC_HierarchyChangeAuth:
    420       return 0;
    421     case TPM_CC_DictionaryAttackLockReset:
    422       return 0;
    423     case TPM_CC_DictionaryAttackParameters:
    424       return 0;
    425     case TPM_CC_PP_Commands:
    426       return 0;
    427     case TPM_CC_SetAlgorithmSet:
    428       return 0;
    429     case TPM_CC_FieldUpgradeStart:
    430       return 0;
    431     case TPM_CC_FieldUpgradeData:
    432       return 0;
    433     case TPM_CC_FirmwareRead:
    434       return 0;
    435     case TPM_CC_ContextSave:
    436       return 0;
    437     case TPM_CC_ContextLoad:
    438       return 1;
    439     case TPM_CC_FlushContext:
    440       return 0;
    441     case TPM_CC_EvictControl:
    442       return 0;
    443     case TPM_CC_ReadClock:
    444       return 0;
    445     case TPM_CC_ClockSet:
    446       return 0;
    447     case TPM_CC_ClockRateAdjust:
    448       return 0;
    449     case TPM_CC_GetCapability:
    450       return 0;
    451     case TPM_CC_TestParms:
    452       return 0;
    453     case TPM_CC_NV_DefineSpace:
    454       return 0;
    455     case TPM_CC_NV_UndefineSpace:
    456       return 0;
    457     case TPM_CC_NV_UndefineSpaceSpecial:
    458       return 0;
    459     case TPM_CC_NV_ReadPublic:
    460       return 0;
    461     case TPM_CC_NV_Write:
    462       return 0;
    463     case TPM_CC_NV_Increment:
    464       return 0;
    465     case TPM_CC_NV_Extend:
    466       return 0;
    467     case TPM_CC_NV_SetBits:
    468       return 0;
    469     case TPM_CC_NV_WriteLock:
    470       return 0;
    471     case TPM_CC_NV_GlobalWriteLock:
    472       return 0;
    473     case TPM_CC_NV_Read:
    474       return 0;
    475     case TPM_CC_NV_ReadLock:
    476       return 0;
    477     case TPM_CC_NV_ChangeAuth:
    478       return 0;
    479     case TPM_CC_NV_Certify:
    480       return 0;
    481     default:
    482       LOG(WARNING) << "Unknown command code: " << command_code;
    483   }
    484   return 0;
    485 }
    486 
    487 TPM_RC Serialize_uint8_t(const uint8_t& value, std::string* buffer) {
    488   VLOG(3) << __func__;
    489   uint8_t value_net = value;
    490   switch (sizeof(uint8_t)) {
    491     case 2:
    492       value_net = base::HostToNet16(value);
    493       break;
    494     case 4:
    495       value_net = base::HostToNet32(value);
    496       break;
    497     case 8:
    498       value_net = base::HostToNet64(value);
    499       break;
    500     default:
    501       break;
    502   }
    503   const char* value_bytes = reinterpret_cast<const char*>(&value_net);
    504   buffer->append(value_bytes, sizeof(uint8_t));
    505   return TPM_RC_SUCCESS;
    506 }
    507 
    508 TPM_RC Parse_uint8_t(std::string* buffer,
    509                      uint8_t* value,
    510                      std::string* value_bytes) {
    511   VLOG(3) << __func__;
    512   if (buffer->size() < sizeof(uint8_t))
    513     return TPM_RC_INSUFFICIENT;
    514   uint8_t value_net = 0;
    515   memcpy(&value_net, buffer->data(), sizeof(uint8_t));
    516   switch (sizeof(uint8_t)) {
    517     case 2:
    518       *value = base::NetToHost16(value_net);
    519       break;
    520     case 4:
    521       *value = base::NetToHost32(value_net);
    522       break;
    523     case 8:
    524       *value = base::NetToHost64(value_net);
    525       break;
    526     default:
    527       *value = value_net;
    528   }
    529   if (value_bytes) {
    530     value_bytes->append(buffer->substr(0, sizeof(uint8_t)));
    531   }
    532   buffer->erase(0, sizeof(uint8_t));
    533   return TPM_RC_SUCCESS;
    534 }
    535 
    536 TPM_RC Serialize_int8_t(const int8_t& value, std::string* buffer) {
    537   VLOG(3) << __func__;
    538   int8_t value_net = value;
    539   switch (sizeof(int8_t)) {
    540     case 2:
    541       value_net = base::HostToNet16(value);
    542       break;
    543     case 4:
    544       value_net = base::HostToNet32(value);
    545       break;
    546     case 8:
    547       value_net = base::HostToNet64(value);
    548       break;
    549     default:
    550       break;
    551   }
    552   const char* value_bytes = reinterpret_cast<const char*>(&value_net);
    553   buffer->append(value_bytes, sizeof(int8_t));
    554   return TPM_RC_SUCCESS;
    555 }
    556 
    557 TPM_RC Parse_int8_t(std::string* buffer,
    558                     int8_t* value,
    559                     std::string* value_bytes) {
    560   VLOG(3) << __func__;
    561   if (buffer->size() < sizeof(int8_t))
    562     return TPM_RC_INSUFFICIENT;
    563   int8_t value_net = 0;
    564   memcpy(&value_net, buffer->data(), sizeof(int8_t));
    565   switch (sizeof(int8_t)) {
    566     case 2:
    567       *value = base::NetToHost16(value_net);
    568       break;
    569     case 4:
    570       *value = base::NetToHost32(value_net);
    571       break;
    572     case 8:
    573       *value = base::NetToHost64(value_net);
    574       break;
    575     default:
    576       *value = value_net;
    577   }
    578   if (value_bytes) {
    579     value_bytes->append(buffer->substr(0, sizeof(int8_t)));
    580   }
    581   buffer->erase(0, sizeof(int8_t));
    582   return TPM_RC_SUCCESS;
    583 }
    584 
    585 TPM_RC Serialize_int(const int& value, std::string* buffer) {
    586   VLOG(3) << __func__;
    587   int value_net = value;
    588   switch (sizeof(int)) {
    589     case 2:
    590       value_net = base::HostToNet16(value);
    591       break;
    592     case 4:
    593       value_net = base::HostToNet32(value);
    594       break;
    595     case 8:
    596       value_net = base::HostToNet64(value);
    597       break;
    598     default:
    599       break;
    600   }
    601   const char* value_bytes = reinterpret_cast<const char*>(&value_net);
    602   buffer->append(value_bytes, sizeof(int));
    603   return TPM_RC_SUCCESS;
    604 }
    605 
    606 TPM_RC Parse_int(std::string* buffer, int* value, std::string* value_bytes) {
    607   VLOG(3) << __func__;
    608   if (buffer->size() < sizeof(int))
    609     return TPM_RC_INSUFFICIENT;
    610   int value_net = 0;
    611   memcpy(&value_net, buffer->data(), sizeof(int));
    612   switch (sizeof(int)) {
    613     case 2:
    614       *value = base::NetToHost16(value_net);
    615       break;
    616     case 4:
    617       *value = base::NetToHost32(value_net);
    618       break;
    619     case 8:
    620       *value = base::NetToHost64(value_net);
    621       break;
    622     default:
    623       *value = value_net;
    624   }
    625   if (value_bytes) {
    626     value_bytes->append(buffer->substr(0, sizeof(int)));
    627   }
    628   buffer->erase(0, sizeof(int));
    629   return TPM_RC_SUCCESS;
    630 }
    631 
    632 TPM_RC Serialize_uint16_t(const uint16_t& value, std::string* buffer) {
    633   VLOG(3) << __func__;
    634   uint16_t value_net = value;
    635   switch (sizeof(uint16_t)) {
    636     case 2:
    637       value_net = base::HostToNet16(value);
    638       break;
    639     case 4:
    640       value_net = base::HostToNet32(value);
    641       break;
    642     case 8:
    643       value_net = base::HostToNet64(value);
    644       break;
    645     default:
    646       break;
    647   }
    648   const char* value_bytes = reinterpret_cast<const char*>(&value_net);
    649   buffer->append(value_bytes, sizeof(uint16_t));
    650   return TPM_RC_SUCCESS;
    651 }
    652 
    653 TPM_RC Parse_uint16_t(std::string* buffer,
    654                       uint16_t* value,
    655                       std::string* value_bytes) {
    656   VLOG(3) << __func__;
    657   if (buffer->size() < sizeof(uint16_t))
    658     return TPM_RC_INSUFFICIENT;
    659   uint16_t value_net = 0;
    660   memcpy(&value_net, buffer->data(), sizeof(uint16_t));
    661   switch (sizeof(uint16_t)) {
    662     case 2:
    663       *value = base::NetToHost16(value_net);
    664       break;
    665     case 4:
    666       *value = base::NetToHost32(value_net);
    667       break;
    668     case 8:
    669       *value = base::NetToHost64(value_net);
    670       break;
    671     default:
    672       *value = value_net;
    673   }
    674   if (value_bytes) {
    675     value_bytes->append(buffer->substr(0, sizeof(uint16_t)));
    676   }
    677   buffer->erase(0, sizeof(uint16_t));
    678   return TPM_RC_SUCCESS;
    679 }
    680 
    681 TPM_RC Serialize_int16_t(const int16_t& value, std::string* buffer) {
    682   VLOG(3) << __func__;
    683   int16_t value_net = value;
    684   switch (sizeof(int16_t)) {
    685     case 2:
    686       value_net = base::HostToNet16(value);
    687       break;
    688     case 4:
    689       value_net = base::HostToNet32(value);
    690       break;
    691     case 8:
    692       value_net = base::HostToNet64(value);
    693       break;
    694     default:
    695       break;
    696   }
    697   const char* value_bytes = reinterpret_cast<const char*>(&value_net);
    698   buffer->append(value_bytes, sizeof(int16_t));
    699   return TPM_RC_SUCCESS;
    700 }
    701 
    702 TPM_RC Parse_int16_t(std::string* buffer,
    703                      int16_t* value,
    704                      std::string* value_bytes) {
    705   VLOG(3) << __func__;
    706   if (buffer->size() < sizeof(int16_t))
    707     return TPM_RC_INSUFFICIENT;
    708   int16_t value_net = 0;
    709   memcpy(&value_net, buffer->data(), sizeof(int16_t));
    710   switch (sizeof(int16_t)) {
    711     case 2:
    712       *value = base::NetToHost16(value_net);
    713       break;
    714     case 4:
    715       *value = base::NetToHost32(value_net);
    716       break;
    717     case 8:
    718       *value = base::NetToHost64(value_net);
    719       break;
    720     default:
    721       *value = value_net;
    722   }
    723   if (value_bytes) {
    724     value_bytes->append(buffer->substr(0, sizeof(int16_t)));
    725   }
    726   buffer->erase(0, sizeof(int16_t));
    727   return TPM_RC_SUCCESS;
    728 }
    729 
    730 TPM_RC Serialize_uint32_t(const uint32_t& value, std::string* buffer) {
    731   VLOG(3) << __func__;
    732   uint32_t value_net = value;
    733   switch (sizeof(uint32_t)) {
    734     case 2:
    735       value_net = base::HostToNet16(value);
    736       break;
    737     case 4:
    738       value_net = base::HostToNet32(value);
    739       break;
    740     case 8:
    741       value_net = base::HostToNet64(value);
    742       break;
    743     default:
    744       break;
    745   }
    746   const char* value_bytes = reinterpret_cast<const char*>(&value_net);
    747   buffer->append(value_bytes, sizeof(uint32_t));
    748   return TPM_RC_SUCCESS;
    749 }
    750 
    751 TPM_RC Parse_uint32_t(std::string* buffer,
    752                       uint32_t* value,
    753                       std::string* value_bytes) {
    754   VLOG(3) << __func__;
    755   if (buffer->size() < sizeof(uint32_t))
    756     return TPM_RC_INSUFFICIENT;
    757   uint32_t value_net = 0;
    758   memcpy(&value_net, buffer->data(), sizeof(uint32_t));
    759   switch (sizeof(uint32_t)) {
    760     case 2:
    761       *value = base::NetToHost16(value_net);
    762       break;
    763     case 4:
    764       *value = base::NetToHost32(value_net);
    765       break;
    766     case 8:
    767       *value = base::NetToHost64(value_net);
    768       break;
    769     default:
    770       *value = value_net;
    771   }
    772   if (value_bytes) {
    773     value_bytes->append(buffer->substr(0, sizeof(uint32_t)));
    774   }
    775   buffer->erase(0, sizeof(uint32_t));
    776   return TPM_RC_SUCCESS;
    777 }
    778 
    779 TPM_RC Serialize_int32_t(const int32_t& value, std::string* buffer) {
    780   VLOG(3) << __func__;
    781   int32_t value_net = value;
    782   switch (sizeof(int32_t)) {
    783     case 2:
    784       value_net = base::HostToNet16(value);
    785       break;
    786     case 4:
    787       value_net = base::HostToNet32(value);
    788       break;
    789     case 8:
    790       value_net = base::HostToNet64(value);
    791       break;
    792     default:
    793       break;
    794   }
    795   const char* value_bytes = reinterpret_cast<const char*>(&value_net);
    796   buffer->append(value_bytes, sizeof(int32_t));
    797   return TPM_RC_SUCCESS;
    798 }
    799 
    800 TPM_RC Parse_int32_t(std::string* buffer,
    801                      int32_t* value,
    802                      std::string* value_bytes) {
    803   VLOG(3) << __func__;
    804   if (buffer->size() < sizeof(int32_t))
    805     return TPM_RC_INSUFFICIENT;
    806   int32_t value_net = 0;
    807   memcpy(&value_net, buffer->data(), sizeof(int32_t));
    808   switch (sizeof(int32_t)) {
    809     case 2:
    810       *value = base::NetToHost16(value_net);
    811       break;
    812     case 4:
    813       *value = base::NetToHost32(value_net);
    814       break;
    815     case 8:
    816       *value = base::NetToHost64(value_net);
    817       break;
    818     default:
    819       *value = value_net;
    820   }
    821   if (value_bytes) {
    822     value_bytes->append(buffer->substr(0, sizeof(int32_t)));
    823   }
    824   buffer->erase(0, sizeof(int32_t));
    825   return TPM_RC_SUCCESS;
    826 }
    827 
    828 TPM_RC Serialize_uint64_t(const uint64_t& value, std::string* buffer) {
    829   VLOG(3) << __func__;
    830   uint64_t value_net = value;
    831   switch (sizeof(uint64_t)) {
    832     case 2:
    833       value_net = base::HostToNet16(value);
    834       break;
    835     case 4:
    836       value_net = base::HostToNet32(value);
    837       break;
    838     case 8:
    839       value_net = base::HostToNet64(value);
    840       break;
    841     default:
    842       break;
    843   }
    844   const char* value_bytes = reinterpret_cast<const char*>(&value_net);
    845   buffer->append(value_bytes, sizeof(uint64_t));
    846   return TPM_RC_SUCCESS;
    847 }
    848 
    849 TPM_RC Parse_uint64_t(std::string* buffer,
    850                       uint64_t* value,
    851                       std::string* value_bytes) {
    852   VLOG(3) << __func__;
    853   if (buffer->size() < sizeof(uint64_t))
    854     return TPM_RC_INSUFFICIENT;
    855   uint64_t value_net = 0;
    856   memcpy(&value_net, buffer->data(), sizeof(uint64_t));
    857   switch (sizeof(uint64_t)) {
    858     case 2:
    859       *value = base::NetToHost16(value_net);
    860       break;
    861     case 4:
    862       *value = base::NetToHost32(value_net);
    863       break;
    864     case 8:
    865       *value = base::NetToHost64(value_net);
    866       break;
    867     default:
    868       *value = value_net;
    869   }
    870   if (value_bytes) {
    871     value_bytes->append(buffer->substr(0, sizeof(uint64_t)));
    872   }
    873   buffer->erase(0, sizeof(uint64_t));
    874   return TPM_RC_SUCCESS;
    875 }
    876 
    877 TPM_RC Serialize_int64_t(const int64_t& value, std::string* buffer) {
    878   VLOG(3) << __func__;
    879   int64_t value_net = value;
    880   switch (sizeof(int64_t)) {
    881     case 2:
    882       value_net = base::HostToNet16(value);
    883       break;
    884     case 4:
    885       value_net = base::HostToNet32(value);
    886       break;
    887     case 8:
    888       value_net = base::HostToNet64(value);
    889       break;
    890     default:
    891       break;
    892   }
    893   const char* value_bytes = reinterpret_cast<const char*>(&value_net);
    894   buffer->append(value_bytes, sizeof(int64_t));
    895   return TPM_RC_SUCCESS;
    896 }
    897 
    898 TPM_RC Parse_int64_t(std::string* buffer,
    899                      int64_t* value,
    900                      std::string* value_bytes) {
    901   VLOG(3) << __func__;
    902   if (buffer->size() < sizeof(int64_t))
    903     return TPM_RC_INSUFFICIENT;
    904   int64_t value_net = 0;
    905   memcpy(&value_net, buffer->data(), sizeof(int64_t));
    906   switch (sizeof(int64_t)) {
    907     case 2:
    908       *value = base::NetToHost16(value_net);
    909       break;
    910     case 4:
    911       *value = base::NetToHost32(value_net);
    912       break;
    913     case 8:
    914       *value = base::NetToHost64(value_net);
    915       break;
    916     default:
    917       *value = value_net;
    918   }
    919   if (value_bytes) {
    920     value_bytes->append(buffer->substr(0, sizeof(int64_t)));
    921   }
    922   buffer->erase(0, sizeof(int64_t));
    923   return TPM_RC_SUCCESS;
    924 }
    925 
    926 TPM_RC Serialize_UINT8(const UINT8& value, std::string* buffer) {
    927   VLOG(3) << __func__;
    928   return Serialize_uint8_t(value, buffer);
    929 }
    930 
    931 TPM_RC Parse_UINT8(std::string* buffer,
    932                    UINT8* value,
    933                    std::string* value_bytes) {
    934   VLOG(3) << __func__;
    935   return Parse_uint8_t(buffer, value, value_bytes);
    936 }
    937 
    938 TPM_RC Serialize_BYTE(const BYTE& value, std::string* buffer) {
    939   VLOG(3) << __func__;
    940   return Serialize_uint8_t(value, buffer);
    941 }
    942 
    943 TPM_RC Parse_BYTE(std::string* buffer, BYTE* value, std::string* value_bytes) {
    944   VLOG(3) << __func__;
    945   return Parse_uint8_t(buffer, value, value_bytes);
    946 }
    947 
    948 TPM_RC Serialize_INT8(const INT8& value, std::string* buffer) {
    949   VLOG(3) << __func__;
    950   return Serialize_int8_t(value, buffer);
    951 }
    952 
    953 TPM_RC Parse_INT8(std::string* buffer, INT8* value, std::string* value_bytes) {
    954   VLOG(3) << __func__;
    955   return Parse_int8_t(buffer, value, value_bytes);
    956 }
    957 
    958 TPM_RC Serialize_BOOL(const BOOL& value, std::string* buffer) {
    959   VLOG(3) << __func__;
    960   return Serialize_int(value, buffer);
    961 }
    962 
    963 TPM_RC Parse_BOOL(std::string* buffer, BOOL* value, std::string* value_bytes) {
    964   VLOG(3) << __func__;
    965   return Parse_int(buffer, value, value_bytes);
    966 }
    967 
    968 TPM_RC Serialize_UINT16(const UINT16& value, std::string* buffer) {
    969   VLOG(3) << __func__;
    970   return Serialize_uint16_t(value, buffer);
    971 }
    972 
    973 TPM_RC Parse_UINT16(std::string* buffer,
    974                     UINT16* value,
    975                     std::string* value_bytes) {
    976   VLOG(3) << __func__;
    977   return Parse_uint16_t(buffer, value, value_bytes);
    978 }
    979 
    980 TPM_RC Serialize_INT16(const INT16& value, std::string* buffer) {
    981   VLOG(3) << __func__;
    982   return Serialize_int16_t(value, buffer);
    983 }
    984 
    985 TPM_RC Parse_INT16(std::string* buffer,
    986                    INT16* value,
    987                    std::string* value_bytes) {
    988   VLOG(3) << __func__;
    989   return Parse_int16_t(buffer, value, value_bytes);
    990 }
    991 
    992 TPM_RC Serialize_UINT32(const UINT32& value, std::string* buffer) {
    993   VLOG(3) << __func__;
    994   return Serialize_uint32_t(value, buffer);
    995 }
    996 
    997 TPM_RC Parse_UINT32(std::string* buffer,
    998                     UINT32* value,
    999                     std::string* value_bytes) {
   1000   VLOG(3) << __func__;
   1001   return Parse_uint32_t(buffer, value, value_bytes);
   1002 }
   1003 
   1004 TPM_RC Serialize_INT32(const INT32& value, std::string* buffer) {
   1005   VLOG(3) << __func__;
   1006   return Serialize_int32_t(value, buffer);
   1007 }
   1008 
   1009 TPM_RC Parse_INT32(std::string* buffer,
   1010                    INT32* value,
   1011                    std::string* value_bytes) {
   1012   VLOG(3) << __func__;
   1013   return Parse_int32_t(buffer, value, value_bytes);
   1014 }
   1015 
   1016 TPM_RC Serialize_UINT64(const UINT64& value, std::string* buffer) {
   1017   VLOG(3) << __func__;
   1018   return Serialize_uint64_t(value, buffer);
   1019 }
   1020 
   1021 TPM_RC Parse_UINT64(std::string* buffer,
   1022                     UINT64* value,
   1023                     std::string* value_bytes) {
   1024   VLOG(3) << __func__;
   1025   return Parse_uint64_t(buffer, value, value_bytes);
   1026 }
   1027 
   1028 TPM_RC Serialize_INT64(const INT64& value, std::string* buffer) {
   1029   VLOG(3) << __func__;
   1030   return Serialize_int64_t(value, buffer);
   1031 }
   1032 
   1033 TPM_RC Parse_INT64(std::string* buffer,
   1034                    INT64* value,
   1035                    std::string* value_bytes) {
   1036   VLOG(3) << __func__;
   1037   return Parse_int64_t(buffer, value, value_bytes);
   1038 }
   1039 
   1040 TPM_RC Serialize_TPM_ALGORITHM_ID(const TPM_ALGORITHM_ID& value,
   1041                                   std::string* buffer) {
   1042   VLOG(3) << __func__;
   1043   return Serialize_UINT32(value, buffer);
   1044 }
   1045 
   1046 TPM_RC Parse_TPM_ALGORITHM_ID(std::string* buffer,
   1047                               TPM_ALGORITHM_ID* value,
   1048                               std::string* value_bytes) {
   1049   VLOG(3) << __func__;
   1050   return Parse_UINT32(buffer, value, value_bytes);
   1051 }
   1052 
   1053 TPM_RC Serialize_TPM_MODIFIER_INDICATOR(const TPM_MODIFIER_INDICATOR& value,
   1054                                         std::string* buffer) {
   1055   VLOG(3) << __func__;
   1056   return Serialize_UINT32(value, buffer);
   1057 }
   1058 
   1059 TPM_RC Parse_TPM_MODIFIER_INDICATOR(std::string* buffer,
   1060                                     TPM_MODIFIER_INDICATOR* value,
   1061                                     std::string* value_bytes) {
   1062   VLOG(3) << __func__;
   1063   return Parse_UINT32(buffer, value, value_bytes);
   1064 }
   1065 
   1066 TPM_RC Serialize_TPM_AUTHORIZATION_SIZE(const TPM_AUTHORIZATION_SIZE& value,
   1067                                         std::string* buffer) {
   1068   VLOG(3) << __func__;
   1069   return Serialize_UINT32(value, buffer);
   1070 }
   1071 
   1072 TPM_RC Parse_TPM_AUTHORIZATION_SIZE(std::string* buffer,
   1073                                     TPM_AUTHORIZATION_SIZE* value,
   1074                                     std::string* value_bytes) {
   1075   VLOG(3) << __func__;
   1076   return Parse_UINT32(buffer, value, value_bytes);
   1077 }
   1078 
   1079 TPM_RC Serialize_TPM_PARAMETER_SIZE(const TPM_PARAMETER_SIZE& value,
   1080                                     std::string* buffer) {
   1081   VLOG(3) << __func__;
   1082   return Serialize_UINT32(value, buffer);
   1083 }
   1084 
   1085 TPM_RC Parse_TPM_PARAMETER_SIZE(std::string* buffer,
   1086                                 TPM_PARAMETER_SIZE* value,
   1087                                 std::string* value_bytes) {
   1088   VLOG(3) << __func__;
   1089   return Parse_UINT32(buffer, value, value_bytes);
   1090 }
   1091 
   1092 TPM_RC Serialize_TPM_KEY_SIZE(const TPM_KEY_SIZE& value, std::string* buffer) {
   1093   VLOG(3) << __func__;
   1094   return Serialize_UINT16(value, buffer);
   1095 }
   1096 
   1097 TPM_RC Parse_TPM_KEY_SIZE(std::string* buffer,
   1098                           TPM_KEY_SIZE* value,
   1099                           std::string* value_bytes) {
   1100   VLOG(3) << __func__;
   1101   return Parse_UINT16(buffer, value, value_bytes);
   1102 }
   1103 
   1104 TPM_RC Serialize_TPM_KEY_BITS(const TPM_KEY_BITS& value, std::string* buffer) {
   1105   VLOG(3) << __func__;
   1106   return Serialize_UINT16(value, buffer);
   1107 }
   1108 
   1109 TPM_RC Parse_TPM_KEY_BITS(std::string* buffer,
   1110                           TPM_KEY_BITS* value,
   1111                           std::string* value_bytes) {
   1112   VLOG(3) << __func__;
   1113   return Parse_UINT16(buffer, value, value_bytes);
   1114 }
   1115 
   1116 TPM_RC Serialize_TPM_HANDLE(const TPM_HANDLE& value, std::string* buffer) {
   1117   VLOG(3) << __func__;
   1118   return Serialize_UINT32(value, buffer);
   1119 }
   1120 
   1121 TPM_RC Parse_TPM_HANDLE(std::string* buffer,
   1122                         TPM_HANDLE* value,
   1123                         std::string* value_bytes) {
   1124   VLOG(3) << __func__;
   1125   return Parse_UINT32(buffer, value, value_bytes);
   1126 }
   1127 
   1128 TPM_RC Serialize_TPM2B_DIGEST(const TPM2B_DIGEST& value, std::string* buffer) {
   1129   TPM_RC result = TPM_RC_SUCCESS;
   1130   VLOG(3) << __func__;
   1131 
   1132   result = Serialize_UINT16(value.size, buffer);
   1133   if (result) {
   1134     return result;
   1135   }
   1136 
   1137   if (arraysize(value.buffer) < value.size) {
   1138     return TPM_RC_INSUFFICIENT;
   1139   }
   1140   for (uint32_t i = 0; i < value.size; ++i) {
   1141     result = Serialize_BYTE(value.buffer[i], buffer);
   1142     if (result) {
   1143       return result;
   1144     }
   1145   }
   1146   return result;
   1147 }
   1148 
   1149 TPM_RC Parse_TPM2B_DIGEST(std::string* buffer,
   1150                           TPM2B_DIGEST* value,
   1151                           std::string* value_bytes) {
   1152   TPM_RC result = TPM_RC_SUCCESS;
   1153   VLOG(3) << __func__;
   1154 
   1155   result = Parse_UINT16(buffer, &value->size, value_bytes);
   1156   if (result) {
   1157     return result;
   1158   }
   1159 
   1160   if (arraysize(value->buffer) < value->size) {
   1161     return TPM_RC_INSUFFICIENT;
   1162   }
   1163   for (uint32_t i = 0; i < value->size; ++i) {
   1164     result = Parse_BYTE(buffer, &value->buffer[i], value_bytes);
   1165     if (result) {
   1166       return result;
   1167     }
   1168   }
   1169   return result;
   1170 }
   1171 
   1172 TPM2B_DIGEST Make_TPM2B_DIGEST(const std::string& bytes) {
   1173   TPM2B_DIGEST tpm2b;
   1174   CHECK(bytes.size() <= sizeof(tpm2b.buffer));
   1175   memset(&tpm2b, 0, sizeof(TPM2B_DIGEST));
   1176   tpm2b.size = bytes.size();
   1177   memcpy(tpm2b.buffer, bytes.data(), bytes.size());
   1178   return tpm2b;
   1179 }
   1180 
   1181 std::string StringFrom_TPM2B_DIGEST(const TPM2B_DIGEST& tpm2b) {
   1182   const char* char_buffer = reinterpret_cast<const char*>(tpm2b.buffer);
   1183   return std::string(char_buffer, tpm2b.size);
   1184 }
   1185 
   1186 TPM_RC Serialize_TPM2B_NONCE(const TPM2B_NONCE& value, std::string* buffer) {
   1187   VLOG(3) << __func__;
   1188   return Serialize_TPM2B_DIGEST(value, buffer);
   1189 }
   1190 
   1191 TPM_RC Parse_TPM2B_NONCE(std::string* buffer,
   1192                          TPM2B_NONCE* value,
   1193                          std::string* value_bytes) {
   1194   VLOG(3) << __func__;
   1195   return Parse_TPM2B_DIGEST(buffer, value, value_bytes);
   1196 }
   1197 
   1198 TPM_RC Serialize_TPM2B_AUTH(const TPM2B_AUTH& value, std::string* buffer) {
   1199   VLOG(3) << __func__;
   1200   return Serialize_TPM2B_DIGEST(value, buffer);
   1201 }
   1202 
   1203 TPM_RC Parse_TPM2B_AUTH(std::string* buffer,
   1204                         TPM2B_AUTH* value,
   1205                         std::string* value_bytes) {
   1206   VLOG(3) << __func__;
   1207   return Parse_TPM2B_DIGEST(buffer, value, value_bytes);
   1208 }
   1209 
   1210 TPM_RC Serialize_TPM2B_OPERAND(const TPM2B_OPERAND& value,
   1211                                std::string* buffer) {
   1212   VLOG(3) << __func__;
   1213   return Serialize_TPM2B_DIGEST(value, buffer);
   1214 }
   1215 
   1216 TPM_RC Parse_TPM2B_OPERAND(std::string* buffer,
   1217                            TPM2B_OPERAND* value,
   1218                            std::string* value_bytes) {
   1219   VLOG(3) << __func__;
   1220   return Parse_TPM2B_DIGEST(buffer, value, value_bytes);
   1221 }
   1222 
   1223 TPM_RC Serialize_TPM_ALG_ID(const TPM_ALG_ID& value, std::string* buffer) {
   1224   VLOG(3) << __func__;
   1225   return Serialize_UINT16(value, buffer);
   1226 }
   1227 
   1228 TPM_RC Parse_TPM_ALG_ID(std::string* buffer,
   1229                         TPM_ALG_ID* value,
   1230                         std::string* value_bytes) {
   1231   VLOG(3) << __func__;
   1232   return Parse_UINT16(buffer, value, value_bytes);
   1233 }
   1234 
   1235 TPM_RC Serialize_TPMI_ALG_HASH(const TPMI_ALG_HASH& value,
   1236                                std::string* buffer) {
   1237   VLOG(3) << __func__;
   1238   return Serialize_TPM_ALG_ID(value, buffer);
   1239 }
   1240 
   1241 TPM_RC Parse_TPMI_ALG_HASH(std::string* buffer,
   1242                            TPMI_ALG_HASH* value,
   1243                            std::string* value_bytes) {
   1244   VLOG(3) << __func__;
   1245   return Parse_TPM_ALG_ID(buffer, value, value_bytes);
   1246 }
   1247 
   1248 TPM_RC Serialize_TPMS_SCHEME_SIGHASH(const TPMS_SCHEME_SIGHASH& value,
   1249                                      std::string* buffer) {
   1250   TPM_RC result = TPM_RC_SUCCESS;
   1251   VLOG(3) << __func__;
   1252 
   1253   result = Serialize_TPMI_ALG_HASH(value.hash_alg, buffer);
   1254   if (result) {
   1255     return result;
   1256   }
   1257   return result;
   1258 }
   1259 
   1260 TPM_RC Parse_TPMS_SCHEME_SIGHASH(std::string* buffer,
   1261                                  TPMS_SCHEME_SIGHASH* value,
   1262                                  std::string* value_bytes) {
   1263   TPM_RC result = TPM_RC_SUCCESS;
   1264   VLOG(3) << __func__;
   1265 
   1266   result = Parse_TPMI_ALG_HASH(buffer, &value->hash_alg, value_bytes);
   1267   if (result) {
   1268     return result;
   1269   }
   1270   return result;
   1271 }
   1272 
   1273 TPM_RC Serialize_TPMS_SCHEME_HMAC(const TPMS_SCHEME_HMAC& value,
   1274                                   std::string* buffer) {
   1275   VLOG(3) << __func__;
   1276   return Serialize_TPMS_SCHEME_SIGHASH(value, buffer);
   1277 }
   1278 
   1279 TPM_RC Parse_TPMS_SCHEME_HMAC(std::string* buffer,
   1280                               TPMS_SCHEME_HMAC* value,
   1281                               std::string* value_bytes) {
   1282   VLOG(3) << __func__;
   1283   return Parse_TPMS_SCHEME_SIGHASH(buffer, value, value_bytes);
   1284 }
   1285 
   1286 TPM_RC Serialize_TPMS_SCHEME_RSASSA(const TPMS_SCHEME_RSASSA& value,
   1287                                     std::string* buffer) {
   1288   VLOG(3) << __func__;
   1289   return Serialize_TPMS_SCHEME_SIGHASH(value, buffer);
   1290 }
   1291 
   1292 TPM_RC Parse_TPMS_SCHEME_RSASSA(std::string* buffer,
   1293                                 TPMS_SCHEME_RSASSA* value,
   1294                                 std::string* value_bytes) {
   1295   VLOG(3) << __func__;
   1296   return Parse_TPMS_SCHEME_SIGHASH(buffer, value, value_bytes);
   1297 }
   1298 
   1299 TPM_RC Serialize_TPMS_SCHEME_RSAPSS(const TPMS_SCHEME_RSAPSS& value,
   1300                                     std::string* buffer) {
   1301   VLOG(3) << __func__;
   1302   return Serialize_TPMS_SCHEME_SIGHASH(value, buffer);
   1303 }
   1304 
   1305 TPM_RC Parse_TPMS_SCHEME_RSAPSS(std::string* buffer,
   1306                                 TPMS_SCHEME_RSAPSS* value,
   1307                                 std::string* value_bytes) {
   1308   VLOG(3) << __func__;
   1309   return Parse_TPMS_SCHEME_SIGHASH(buffer, value, value_bytes);
   1310 }
   1311 
   1312 TPM_RC Serialize_TPMS_SCHEME_ECDSA(const TPMS_SCHEME_ECDSA& value,
   1313                                    std::string* buffer) {
   1314   VLOG(3) << __func__;
   1315   return Serialize_TPMS_SCHEME_SIGHASH(value, buffer);
   1316 }
   1317 
   1318 TPM_RC Parse_TPMS_SCHEME_ECDSA(std::string* buffer,
   1319                                TPMS_SCHEME_ECDSA* value,
   1320                                std::string* value_bytes) {
   1321   VLOG(3) << __func__;
   1322   return Parse_TPMS_SCHEME_SIGHASH(buffer, value, value_bytes);
   1323 }
   1324 
   1325 TPM_RC Serialize_TPMS_SCHEME_SM2(const TPMS_SCHEME_SM2& value,
   1326                                  std::string* buffer) {
   1327   VLOG(3) << __func__;
   1328   return Serialize_TPMS_SCHEME_SIGHASH(value, buffer);
   1329 }
   1330 
   1331 TPM_RC Parse_TPMS_SCHEME_SM2(std::string* buffer,
   1332                              TPMS_SCHEME_SM2* value,
   1333                              std::string* value_bytes) {
   1334   VLOG(3) << __func__;
   1335   return Parse_TPMS_SCHEME_SIGHASH(buffer, value, value_bytes);
   1336 }
   1337 
   1338 TPM_RC Serialize_TPMS_SCHEME_ECSCHNORR(const TPMS_SCHEME_ECSCHNORR& value,
   1339                                        std::string* buffer) {
   1340   VLOG(3) << __func__;
   1341   return Serialize_TPMS_SCHEME_SIGHASH(value, buffer);
   1342 }
   1343 
   1344 TPM_RC Parse_TPMS_SCHEME_ECSCHNORR(std::string* buffer,
   1345                                    TPMS_SCHEME_ECSCHNORR* value,
   1346                                    std::string* value_bytes) {
   1347   VLOG(3) << __func__;
   1348   return Parse_TPMS_SCHEME_SIGHASH(buffer, value, value_bytes);
   1349 }
   1350 
   1351 TPM_RC Serialize_TPMI_YES_NO(const TPMI_YES_NO& value, std::string* buffer) {
   1352   VLOG(3) << __func__;
   1353   return Serialize_BYTE(value, buffer);
   1354 }
   1355 
   1356 TPM_RC Parse_TPMI_YES_NO(std::string* buffer,
   1357                          TPMI_YES_NO* value,
   1358                          std::string* value_bytes) {
   1359   VLOG(3) << __func__;
   1360   return Parse_BYTE(buffer, value, value_bytes);
   1361 }
   1362 
   1363 TPM_RC Serialize_TPMI_DH_OBJECT(const TPMI_DH_OBJECT& value,
   1364                                 std::string* buffer) {
   1365   VLOG(3) << __func__;
   1366   return Serialize_TPM_HANDLE(value, buffer);
   1367 }
   1368 
   1369 TPM_RC Parse_TPMI_DH_OBJECT(std::string* buffer,
   1370                             TPMI_DH_OBJECT* value,
   1371                             std::string* value_bytes) {
   1372   VLOG(3) << __func__;
   1373   return Parse_TPM_HANDLE(buffer, value, value_bytes);
   1374 }
   1375 
   1376 TPM_RC Serialize_TPMI_DH_PERSISTENT(const TPMI_DH_PERSISTENT& value,
   1377                                     std::string* buffer) {
   1378   VLOG(3) << __func__;
   1379   return Serialize_TPM_HANDLE(value, buffer);
   1380 }
   1381 
   1382 TPM_RC Parse_TPMI_DH_PERSISTENT(std::string* buffer,
   1383                                 TPMI_DH_PERSISTENT* value,
   1384                                 std::string* value_bytes) {
   1385   VLOG(3) << __func__;
   1386   return Parse_TPM_HANDLE(buffer, value, value_bytes);
   1387 }
   1388 
   1389 TPM_RC Serialize_TPMI_DH_ENTITY(const TPMI_DH_ENTITY& value,
   1390                                 std::string* buffer) {
   1391   VLOG(3) << __func__;
   1392   return Serialize_TPM_HANDLE(value, buffer);
   1393 }
   1394 
   1395 TPM_RC Parse_TPMI_DH_ENTITY(std::string* buffer,
   1396                             TPMI_DH_ENTITY* value,
   1397                             std::string* value_bytes) {
   1398   VLOG(3) << __func__;
   1399   return Parse_TPM_HANDLE(buffer, value, value_bytes);
   1400 }
   1401 
   1402 TPM_RC Serialize_TPMI_DH_PCR(const TPMI_DH_PCR& value, std::string* buffer) {
   1403   VLOG(3) << __func__;
   1404   return Serialize_TPM_HANDLE(value, buffer);
   1405 }
   1406 
   1407 TPM_RC Parse_TPMI_DH_PCR(std::string* buffer,
   1408                          TPMI_DH_PCR* value,
   1409                          std::string* value_bytes) {
   1410   VLOG(3) << __func__;
   1411   return Parse_TPM_HANDLE(buffer, value, value_bytes);
   1412 }
   1413 
   1414 TPM_RC Serialize_TPMI_SH_AUTH_SESSION(const TPMI_SH_AUTH_SESSION& value,
   1415                                       std::string* buffer) {
   1416   VLOG(3) << __func__;
   1417   return Serialize_TPM_HANDLE(value, buffer);
   1418 }
   1419 
   1420 TPM_RC Parse_TPMI_SH_AUTH_SESSION(std::string* buffer,
   1421                                   TPMI_SH_AUTH_SESSION* value,
   1422                                   std::string* value_bytes) {
   1423   VLOG(3) << __func__;
   1424   return Parse_TPM_HANDLE(buffer, value, value_bytes);
   1425 }
   1426 
   1427 TPM_RC Serialize_TPMI_SH_HMAC(const TPMI_SH_HMAC& value, std::string* buffer) {
   1428   VLOG(3) << __func__;
   1429   return Serialize_TPM_HANDLE(value, buffer);
   1430 }
   1431 
   1432 TPM_RC Parse_TPMI_SH_HMAC(std::string* buffer,
   1433                           TPMI_SH_HMAC* value,
   1434                           std::string* value_bytes) {
   1435   VLOG(3) << __func__;
   1436   return Parse_TPM_HANDLE(buffer, value, value_bytes);
   1437 }
   1438 
   1439 TPM_RC Serialize_TPMI_SH_POLICY(const TPMI_SH_POLICY& value,
   1440                                 std::string* buffer) {
   1441   VLOG(3) << __func__;
   1442   return Serialize_TPM_HANDLE(value, buffer);
   1443 }
   1444 
   1445 TPM_RC Parse_TPMI_SH_POLICY(std::string* buffer,
   1446                             TPMI_SH_POLICY* value,
   1447                             std::string* value_bytes) {
   1448   VLOG(3) << __func__;
   1449   return Parse_TPM_HANDLE(buffer, value, value_bytes);
   1450 }
   1451 
   1452 TPM_RC Serialize_TPMI_DH_CONTEXT(const TPMI_DH_CONTEXT& value,
   1453                                  std::string* buffer) {
   1454   VLOG(3) << __func__;
   1455   return Serialize_TPM_HANDLE(value, buffer);
   1456 }
   1457 
   1458 TPM_RC Parse_TPMI_DH_CONTEXT(std::string* buffer,
   1459                              TPMI_DH_CONTEXT* value,
   1460                              std::string* value_bytes) {
   1461   VLOG(3) << __func__;
   1462   return Parse_TPM_HANDLE(buffer, value, value_bytes);
   1463 }
   1464 
   1465 TPM_RC Serialize_TPMI_RH_HIERARCHY(const TPMI_RH_HIERARCHY& value,
   1466                                    std::string* buffer) {
   1467   VLOG(3) << __func__;
   1468   return Serialize_TPM_HANDLE(value, buffer);
   1469 }
   1470 
   1471 TPM_RC Parse_TPMI_RH_HIERARCHY(std::string* buffer,
   1472                                TPMI_RH_HIERARCHY* value,
   1473                                std::string* value_bytes) {
   1474   VLOG(3) << __func__;
   1475   return Parse_TPM_HANDLE(buffer, value, value_bytes);
   1476 }
   1477 
   1478 TPM_RC Serialize_TPMI_RH_ENABLES(const TPMI_RH_ENABLES& value,
   1479                                  std::string* buffer) {
   1480   VLOG(3) << __func__;
   1481   return Serialize_TPM_HANDLE(value, buffer);
   1482 }
   1483 
   1484 TPM_RC Parse_TPMI_RH_ENABLES(std::string* buffer,
   1485                              TPMI_RH_ENABLES* value,
   1486                              std::string* value_bytes) {
   1487   VLOG(3) << __func__;
   1488   return Parse_TPM_HANDLE(buffer, value, value_bytes);
   1489 }
   1490 
   1491 TPM_RC Serialize_TPMI_RH_HIERARCHY_AUTH(const TPMI_RH_HIERARCHY_AUTH& value,
   1492                                         std::string* buffer) {
   1493   VLOG(3) << __func__;
   1494   return Serialize_TPM_HANDLE(value, buffer);
   1495 }
   1496 
   1497 TPM_RC Parse_TPMI_RH_HIERARCHY_AUTH(std::string* buffer,
   1498                                     TPMI_RH_HIERARCHY_AUTH* value,
   1499                                     std::string* value_bytes) {
   1500   VLOG(3) << __func__;
   1501   return Parse_TPM_HANDLE(buffer, value, value_bytes);
   1502 }
   1503 
   1504 TPM_RC Serialize_TPMI_RH_PLATFORM(const TPMI_RH_PLATFORM& value,
   1505                                   std::string* buffer) {
   1506   VLOG(3) << __func__;
   1507   return Serialize_TPM_HANDLE(value, buffer);
   1508 }
   1509 
   1510 TPM_RC Parse_TPMI_RH_PLATFORM(std::string* buffer,
   1511                               TPMI_RH_PLATFORM* value,
   1512                               std::string* value_bytes) {
   1513   VLOG(3) << __func__;
   1514   return Parse_TPM_HANDLE(buffer, value, value_bytes);
   1515 }
   1516 
   1517 TPM_RC Serialize_TPMI_RH_OWNER(const TPMI_RH_OWNER& value,
   1518                                std::string* buffer) {
   1519   VLOG(3) << __func__;
   1520   return Serialize_TPM_HANDLE(value, buffer);
   1521 }
   1522 
   1523 TPM_RC Parse_TPMI_RH_OWNER(std::string* buffer,
   1524                            TPMI_RH_OWNER* value,
   1525                            std::string* value_bytes) {
   1526   VLOG(3) << __func__;
   1527   return Parse_TPM_HANDLE(buffer, value, value_bytes);
   1528 }
   1529 
   1530 TPM_RC Serialize_TPMI_RH_ENDORSEMENT(const TPMI_RH_ENDORSEMENT& value,
   1531                                      std::string* buffer) {
   1532   VLOG(3) << __func__;
   1533   return Serialize_TPM_HANDLE(value, buffer);
   1534 }
   1535 
   1536 TPM_RC Parse_TPMI_RH_ENDORSEMENT(std::string* buffer,
   1537                                  TPMI_RH_ENDORSEMENT* value,
   1538                                  std::string* value_bytes) {
   1539   VLOG(3) << __func__;
   1540   return Parse_TPM_HANDLE(buffer, value, value_bytes);
   1541 }
   1542 
   1543 TPM_RC Serialize_TPMI_RH_PROVISION(const TPMI_RH_PROVISION& value,
   1544                                    std::string* buffer) {
   1545   VLOG(3) << __func__;
   1546   return Serialize_TPM_HANDLE(value, buffer);
   1547 }
   1548 
   1549 TPM_RC Parse_TPMI_RH_PROVISION(std::string* buffer,
   1550                                TPMI_RH_PROVISION* value,
   1551                                std::string* value_bytes) {
   1552   VLOG(3) << __func__;
   1553   return Parse_TPM_HANDLE(buffer, value, value_bytes);
   1554 }
   1555 
   1556 TPM_RC Serialize_TPMI_RH_CLEAR(const TPMI_RH_CLEAR& value,
   1557                                std::string* buffer) {
   1558   VLOG(3) << __func__;
   1559   return Serialize_TPM_HANDLE(value, buffer);
   1560 }
   1561 
   1562 TPM_RC Parse_TPMI_RH_CLEAR(std::string* buffer,
   1563                            TPMI_RH_CLEAR* value,
   1564                            std::string* value_bytes) {
   1565   VLOG(3) << __func__;
   1566   return Parse_TPM_HANDLE(buffer, value, value_bytes);
   1567 }
   1568 
   1569 TPM_RC Serialize_TPMI_RH_NV_AUTH(const TPMI_RH_NV_AUTH& value,
   1570                                  std::string* buffer) {
   1571   VLOG(3) << __func__;
   1572   return Serialize_TPM_HANDLE(value, buffer);
   1573 }
   1574 
   1575 TPM_RC Parse_TPMI_RH_NV_AUTH(std::string* buffer,
   1576                              TPMI_RH_NV_AUTH* value,
   1577                              std::string* value_bytes) {
   1578   VLOG(3) << __func__;
   1579   return Parse_TPM_HANDLE(buffer, value, value_bytes);
   1580 }
   1581 
   1582 TPM_RC Serialize_TPMI_RH_LOCKOUT(const TPMI_RH_LOCKOUT& value,
   1583                                  std::string* buffer) {
   1584   VLOG(3) << __func__;
   1585   return Serialize_TPM_HANDLE(value, buffer);
   1586 }
   1587 
   1588 TPM_RC Parse_TPMI_RH_LOCKOUT(std::string* buffer,
   1589                              TPMI_RH_LOCKOUT* value,
   1590                              std::string* value_bytes) {
   1591   VLOG(3) << __func__;
   1592   return Parse_TPM_HANDLE(buffer, value, value_bytes);
   1593 }
   1594 
   1595 TPM_RC Serialize_TPMI_RH_NV_INDEX(const TPMI_RH_NV_INDEX& value,
   1596                                   std::string* buffer) {
   1597   VLOG(3) << __func__;
   1598   return Serialize_TPM_HANDLE(value, buffer);
   1599 }
   1600 
   1601 TPM_RC Parse_TPMI_RH_NV_INDEX(std::string* buffer,
   1602                               TPMI_RH_NV_INDEX* value,
   1603                               std::string* value_bytes) {
   1604   VLOG(3) << __func__;
   1605   return Parse_TPM_HANDLE(buffer, value, value_bytes);
   1606 }
   1607 
   1608 TPM_RC Serialize_TPMI_ALG_ASYM(const TPMI_ALG_ASYM& value,
   1609                                std::string* buffer) {
   1610   VLOG(3) << __func__;
   1611   return Serialize_TPM_ALG_ID(value, buffer);
   1612 }
   1613 
   1614 TPM_RC Parse_TPMI_ALG_ASYM(std::string* buffer,
   1615                            TPMI_ALG_ASYM* value,
   1616                            std::string* value_bytes) {
   1617   VLOG(3) << __func__;
   1618   return Parse_TPM_ALG_ID(buffer, value, value_bytes);
   1619 }
   1620 
   1621 TPM_RC Serialize_TPMI_ALG_SYM(const TPMI_ALG_SYM& value, std::string* buffer) {
   1622   VLOG(3) << __func__;
   1623   return Serialize_TPM_ALG_ID(value, buffer);
   1624 }
   1625 
   1626 TPM_RC Parse_TPMI_ALG_SYM(std::string* buffer,
   1627                           TPMI_ALG_SYM* value,
   1628                           std::string* value_bytes) {
   1629   VLOG(3) << __func__;
   1630   return Parse_TPM_ALG_ID(buffer, value, value_bytes);
   1631 }
   1632 
   1633 TPM_RC Serialize_TPMI_ALG_SYM_OBJECT(const TPMI_ALG_SYM_OBJECT& value,
   1634                                      std::string* buffer) {
   1635   VLOG(3) << __func__;
   1636   return Serialize_TPM_ALG_ID(value, buffer);
   1637 }
   1638 
   1639 TPM_RC Parse_TPMI_ALG_SYM_OBJECT(std::string* buffer,
   1640                                  TPMI_ALG_SYM_OBJECT* value,
   1641                                  std::string* value_bytes) {
   1642   VLOG(3) << __func__;
   1643   return Parse_TPM_ALG_ID(buffer, value, value_bytes);
   1644 }
   1645 
   1646 TPM_RC Serialize_TPMI_ALG_SYM_MODE(const TPMI_ALG_SYM_MODE& value,
   1647                                    std::string* buffer) {
   1648   VLOG(3) << __func__;
   1649   return Serialize_TPM_ALG_ID(value, buffer);
   1650 }
   1651 
   1652 TPM_RC Parse_TPMI_ALG_SYM_MODE(std::string* buffer,
   1653                                TPMI_ALG_SYM_MODE* value,
   1654                                std::string* value_bytes) {
   1655   VLOG(3) << __func__;
   1656   return Parse_TPM_ALG_ID(buffer, value, value_bytes);
   1657 }
   1658 
   1659 TPM_RC Serialize_TPMI_ALG_KDF(const TPMI_ALG_KDF& value, std::string* buffer) {
   1660   VLOG(3) << __func__;
   1661   return Serialize_TPM_ALG_ID(value, buffer);
   1662 }
   1663 
   1664 TPM_RC Parse_TPMI_ALG_KDF(std::string* buffer,
   1665                           TPMI_ALG_KDF* value,
   1666                           std::string* value_bytes) {
   1667   VLOG(3) << __func__;
   1668   return Parse_TPM_ALG_ID(buffer, value, value_bytes);
   1669 }
   1670 
   1671 TPM_RC Serialize_TPMI_ALG_SIG_SCHEME(const TPMI_ALG_SIG_SCHEME& value,
   1672                                      std::string* buffer) {
   1673   VLOG(3) << __func__;
   1674   return Serialize_TPM_ALG_ID(value, buffer);
   1675 }
   1676 
   1677 TPM_RC Parse_TPMI_ALG_SIG_SCHEME(std::string* buffer,
   1678                                  TPMI_ALG_SIG_SCHEME* value,
   1679                                  std::string* value_bytes) {
   1680   VLOG(3) << __func__;
   1681   return Parse_TPM_ALG_ID(buffer, value, value_bytes);
   1682 }
   1683 
   1684 TPM_RC Serialize_TPMI_ECC_KEY_EXCHANGE(const TPMI_ECC_KEY_EXCHANGE& value,
   1685                                        std::string* buffer) {
   1686   VLOG(3) << __func__;
   1687   return Serialize_TPM_ALG_ID(value, buffer);
   1688 }
   1689 
   1690 TPM_RC Parse_TPMI_ECC_KEY_EXCHANGE(std::string* buffer,
   1691                                    TPMI_ECC_KEY_EXCHANGE* value,
   1692                                    std::string* value_bytes) {
   1693   VLOG(3) << __func__;
   1694   return Parse_TPM_ALG_ID(buffer, value, value_bytes);
   1695 }
   1696 
   1697 TPM_RC Serialize_TPM_ST(const TPM_ST& value, std::string* buffer) {
   1698   VLOG(3) << __func__;
   1699   return Serialize_UINT16(value, buffer);
   1700 }
   1701 
   1702 TPM_RC Parse_TPM_ST(std::string* buffer,
   1703                     TPM_ST* value,
   1704                     std::string* value_bytes) {
   1705   VLOG(3) << __func__;
   1706   return Parse_UINT16(buffer, value, value_bytes);
   1707 }
   1708 
   1709 TPM_RC Serialize_TPMI_ST_COMMAND_TAG(const TPMI_ST_COMMAND_TAG& value,
   1710                                      std::string* buffer) {
   1711   VLOG(3) << __func__;
   1712   return Serialize_TPM_ST(value, buffer);
   1713 }
   1714 
   1715 TPM_RC Parse_TPMI_ST_COMMAND_TAG(std::string* buffer,
   1716                                  TPMI_ST_COMMAND_TAG* value,
   1717                                  std::string* value_bytes) {
   1718   VLOG(3) << __func__;
   1719   return Parse_TPM_ST(buffer, value, value_bytes);
   1720 }
   1721 
   1722 TPM_RC Serialize_TPMI_ST_ATTEST(const TPMI_ST_ATTEST& value,
   1723                                 std::string* buffer) {
   1724   VLOG(3) << __func__;
   1725   return Serialize_TPM_ST(value, buffer);
   1726 }
   1727 
   1728 TPM_RC Parse_TPMI_ST_ATTEST(std::string* buffer,
   1729                             TPMI_ST_ATTEST* value,
   1730                             std::string* value_bytes) {
   1731   VLOG(3) << __func__;
   1732   return Parse_TPM_ST(buffer, value, value_bytes);
   1733 }
   1734 
   1735 TPM_RC Serialize_TPMI_AES_KEY_BITS(const TPMI_AES_KEY_BITS& value,
   1736                                    std::string* buffer) {
   1737   VLOG(3) << __func__;
   1738   return Serialize_TPM_KEY_BITS(value, buffer);
   1739 }
   1740 
   1741 TPM_RC Parse_TPMI_AES_KEY_BITS(std::string* buffer,
   1742                                TPMI_AES_KEY_BITS* value,
   1743                                std::string* value_bytes) {
   1744   VLOG(3) << __func__;
   1745   return Parse_TPM_KEY_BITS(buffer, value, value_bytes);
   1746 }
   1747 
   1748 TPM_RC Serialize_TPMI_SM4_KEY_BITS(const TPMI_SM4_KEY_BITS& value,
   1749                                    std::string* buffer) {
   1750   VLOG(3) << __func__;
   1751   return Serialize_TPM_KEY_BITS(value, buffer);
   1752 }
   1753 
   1754 TPM_RC Parse_TPMI_SM4_KEY_BITS(std::string* buffer,
   1755                                TPMI_SM4_KEY_BITS* value,
   1756                                std::string* value_bytes) {
   1757   VLOG(3) << __func__;
   1758   return Parse_TPM_KEY_BITS(buffer, value, value_bytes);
   1759 }
   1760 
   1761 TPM_RC Serialize_TPMI_ALG_KEYEDHASH_SCHEME(
   1762     const TPMI_ALG_KEYEDHASH_SCHEME& value,
   1763     std::string* buffer) {
   1764   VLOG(3) << __func__;
   1765   return Serialize_TPM_ALG_ID(value, buffer);
   1766 }
   1767 
   1768 TPM_RC Parse_TPMI_ALG_KEYEDHASH_SCHEME(std::string* buffer,
   1769                                        TPMI_ALG_KEYEDHASH_SCHEME* value,
   1770                                        std::string* value_bytes) {
   1771   VLOG(3) << __func__;
   1772   return Parse_TPM_ALG_ID(buffer, value, value_bytes);
   1773 }
   1774 
   1775 TPM_RC Serialize_TPMI_ALG_ASYM_SCHEME(const TPMI_ALG_ASYM_SCHEME& value,
   1776                                       std::string* buffer) {
   1777   VLOG(3) << __func__;
   1778   return Serialize_TPM_ALG_ID(value, buffer);
   1779 }
   1780 
   1781 TPM_RC Parse_TPMI_ALG_ASYM_SCHEME(std::string* buffer,
   1782                                   TPMI_ALG_ASYM_SCHEME* value,
   1783                                   std::string* value_bytes) {
   1784   VLOG(3) << __func__;
   1785   return Parse_TPM_ALG_ID(buffer, value, value_bytes);
   1786 }
   1787 
   1788 TPM_RC Serialize_TPMI_ALG_RSA_SCHEME(const TPMI_ALG_RSA_SCHEME& value,
   1789                                      std::string* buffer) {
   1790   VLOG(3) << __func__;
   1791   return Serialize_TPM_ALG_ID(value, buffer);
   1792 }
   1793 
   1794 TPM_RC Parse_TPMI_ALG_RSA_SCHEME(std::string* buffer,
   1795                                  TPMI_ALG_RSA_SCHEME* value,
   1796                                  std::string* value_bytes) {
   1797   VLOG(3) << __func__;
   1798   return Parse_TPM_ALG_ID(buffer, value, value_bytes);
   1799 }
   1800 
   1801 TPM_RC Serialize_TPMI_ALG_RSA_DECRYPT(const TPMI_ALG_RSA_DECRYPT& value,
   1802                                       std::string* buffer) {
   1803   VLOG(3) << __func__;
   1804   return Serialize_TPM_ALG_ID(value, buffer);
   1805 }
   1806 
   1807 TPM_RC Parse_TPMI_ALG_RSA_DECRYPT(std::string* buffer,
   1808                                   TPMI_ALG_RSA_DECRYPT* value,
   1809                                   std::string* value_bytes) {
   1810   VLOG(3) << __func__;
   1811   return Parse_TPM_ALG_ID(buffer, value, value_bytes);
   1812 }
   1813 
   1814 TPM_RC Serialize_TPMI_RSA_KEY_BITS(const TPMI_RSA_KEY_BITS& value,
   1815                                    std::string* buffer) {
   1816   VLOG(3) << __func__;
   1817   return Serialize_TPM_KEY_BITS(value, buffer);
   1818 }
   1819 
   1820 TPM_RC Parse_TPMI_RSA_KEY_BITS(std::string* buffer,
   1821                                TPMI_RSA_KEY_BITS* value,
   1822                                std::string* value_bytes) {
   1823   VLOG(3) << __func__;
   1824   return Parse_TPM_KEY_BITS(buffer, value, value_bytes);
   1825 }
   1826 
   1827 TPM_RC Serialize_TPMI_ALG_ECC_SCHEME(const TPMI_ALG_ECC_SCHEME& value,
   1828                                      std::string* buffer) {
   1829   VLOG(3) << __func__;
   1830   return Serialize_TPM_ALG_ID(value, buffer);
   1831 }
   1832 
   1833 TPM_RC Parse_TPMI_ALG_ECC_SCHEME(std::string* buffer,
   1834                                  TPMI_ALG_ECC_SCHEME* value,
   1835                                  std::string* value_bytes) {
   1836   VLOG(3) << __func__;
   1837   return Parse_TPM_ALG_ID(buffer, value, value_bytes);
   1838 }
   1839 
   1840 TPM_RC Serialize_TPM_ECC_CURVE(const TPM_ECC_CURVE& value,
   1841                                std::string* buffer) {
   1842   VLOG(3) << __func__;
   1843   return Serialize_UINT16(value, buffer);
   1844 }
   1845 
   1846 TPM_RC Parse_TPM_ECC_CURVE(std::string* buffer,
   1847                            TPM_ECC_CURVE* value,
   1848                            std::string* value_bytes) {
   1849   VLOG(3) << __func__;
   1850   return Parse_UINT16(buffer, value, value_bytes);
   1851 }
   1852 
   1853 TPM_RC Serialize_TPMI_ECC_CURVE(const TPMI_ECC_CURVE& value,
   1854                                 std::string* buffer) {
   1855   VLOG(3) << __func__;
   1856   return Serialize_TPM_ECC_CURVE(value, buffer);
   1857 }
   1858 
   1859 TPM_RC Parse_TPMI_ECC_CURVE(std::string* buffer,
   1860                             TPMI_ECC_CURVE* value,
   1861                             std::string* value_bytes) {
   1862   VLOG(3) << __func__;
   1863   return Parse_TPM_ECC_CURVE(buffer, value, value_bytes);
   1864 }
   1865 
   1866 TPM_RC Serialize_TPMI_ALG_PUBLIC(const TPMI_ALG_PUBLIC& value,
   1867                                  std::string* buffer) {
   1868   VLOG(3) << __func__;
   1869   return Serialize_TPM_ALG_ID(value, buffer);
   1870 }
   1871 
   1872 TPM_RC Parse_TPMI_ALG_PUBLIC(std::string* buffer,
   1873                              TPMI_ALG_PUBLIC* value,
   1874                              std::string* value_bytes) {
   1875   VLOG(3) << __func__;
   1876   return Parse_TPM_ALG_ID(buffer, value, value_bytes);
   1877 }
   1878 
   1879 TPM_RC Serialize_TPMA_ALGORITHM(const TPMA_ALGORITHM& value,
   1880                                 std::string* buffer) {
   1881   VLOG(3) << __func__;
   1882   return Serialize_UINT32(value, buffer);
   1883 }
   1884 
   1885 TPM_RC Parse_TPMA_ALGORITHM(std::string* buffer,
   1886                             TPMA_ALGORITHM* value,
   1887                             std::string* value_bytes) {
   1888   VLOG(3) << __func__;
   1889   return Parse_UINT32(buffer, value, value_bytes);
   1890 }
   1891 
   1892 TPM_RC Serialize_TPMA_OBJECT(const TPMA_OBJECT& value, std::string* buffer) {
   1893   VLOG(3) << __func__;
   1894   return Serialize_UINT32(value, buffer);
   1895 }
   1896 
   1897 TPM_RC Parse_TPMA_OBJECT(std::string* buffer,
   1898                          TPMA_OBJECT* value,
   1899                          std::string* value_bytes) {
   1900   VLOG(3) << __func__;
   1901   return Parse_UINT32(buffer, value, value_bytes);
   1902 }
   1903 
   1904 TPM_RC Serialize_TPMA_SESSION(const TPMA_SESSION& value, std::string* buffer) {
   1905   VLOG(3) << __func__;
   1906   return Serialize_UINT8(value, buffer);
   1907 }
   1908 
   1909 TPM_RC Parse_TPMA_SESSION(std::string* buffer,
   1910                           TPMA_SESSION* value,
   1911                           std::string* value_bytes) {
   1912   VLOG(3) << __func__;
   1913   return Parse_UINT8(buffer, value, value_bytes);
   1914 }
   1915 
   1916 TPM_RC Serialize_TPMA_LOCALITY(const TPMA_LOCALITY& value,
   1917                                std::string* buffer) {
   1918   VLOG(3) << __func__;
   1919   return Serialize_UINT8(value, buffer);
   1920 }
   1921 
   1922 TPM_RC Parse_TPMA_LOCALITY(std::string* buffer,
   1923                            TPMA_LOCALITY* value,
   1924                            std::string* value_bytes) {
   1925   VLOG(3) << __func__;
   1926   return Parse_UINT8(buffer, value, value_bytes);
   1927 }
   1928 
   1929 TPM_RC Serialize_TPMA_PERMANENT(const TPMA_PERMANENT& value,
   1930                                 std::string* buffer) {
   1931   VLOG(3) << __func__;
   1932   return Serialize_UINT32(value, buffer);
   1933 }
   1934 
   1935 TPM_RC Parse_TPMA_PERMANENT(std::string* buffer,
   1936                             TPMA_PERMANENT* value,
   1937                             std::string* value_bytes) {
   1938   VLOG(3) << __func__;
   1939   return Parse_UINT32(buffer, value, value_bytes);
   1940 }
   1941 
   1942 TPM_RC Serialize_TPMA_STARTUP_CLEAR(const TPMA_STARTUP_CLEAR& value,
   1943                                     std::string* buffer) {
   1944   VLOG(3) << __func__;
   1945   return Serialize_UINT32(value, buffer);
   1946 }
   1947 
   1948 TPM_RC Parse_TPMA_STARTUP_CLEAR(std::string* buffer,
   1949                                 TPMA_STARTUP_CLEAR* value,
   1950                                 std::string* value_bytes) {
   1951   VLOG(3) << __func__;
   1952   return Parse_UINT32(buffer, value, value_bytes);
   1953 }
   1954 
   1955 TPM_RC Serialize_TPMA_MEMORY(const TPMA_MEMORY& value, std::string* buffer) {
   1956   VLOG(3) << __func__;
   1957   return Serialize_UINT32(value, buffer);
   1958 }
   1959 
   1960 TPM_RC Parse_TPMA_MEMORY(std::string* buffer,
   1961                          TPMA_MEMORY* value,
   1962                          std::string* value_bytes) {
   1963   VLOG(3) << __func__;
   1964   return Parse_UINT32(buffer, value, value_bytes);
   1965 }
   1966 
   1967 TPM_RC Serialize_TPM_CC(const TPM_CC& value, std::string* buffer) {
   1968   VLOG(3) << __func__;
   1969   return Serialize_UINT32(value, buffer);
   1970 }
   1971 
   1972 TPM_RC Parse_TPM_CC(std::string* buffer,
   1973                     TPM_CC* value,
   1974                     std::string* value_bytes) {
   1975   VLOG(3) << __func__;
   1976   return Parse_UINT32(buffer, value, value_bytes);
   1977 }
   1978 
   1979 TPM_RC Serialize_TPMA_CC(const TPMA_CC& value, std::string* buffer) {
   1980   VLOG(3) << __func__;
   1981   return Serialize_TPM_CC(value, buffer);
   1982 }
   1983 
   1984 TPM_RC Parse_TPMA_CC(std::string* buffer,
   1985                      TPMA_CC* value,
   1986                      std::string* value_bytes) {
   1987   VLOG(3) << __func__;
   1988   return Parse_TPM_CC(buffer, value, value_bytes);
   1989 }
   1990 
   1991 TPM_RC Serialize_TPM_NV_INDEX(const TPM_NV_INDEX& value, std::string* buffer) {
   1992   VLOG(3) << __func__;
   1993   return Serialize_UINT32(value, buffer);
   1994 }
   1995 
   1996 TPM_RC Parse_TPM_NV_INDEX(std::string* buffer,
   1997                           TPM_NV_INDEX* value,
   1998                           std::string* value_bytes) {
   1999   VLOG(3) << __func__;
   2000   return Parse_UINT32(buffer, value, value_bytes);
   2001 }
   2002 
   2003 TPM_RC Serialize_TPMA_NV(const TPMA_NV& value, std::string* buffer) {
   2004   VLOG(3) << __func__;
   2005   return Serialize_UINT32(value, buffer);
   2006 }
   2007 
   2008 TPM_RC Parse_TPMA_NV(std::string* buffer,
   2009                      TPMA_NV* value,
   2010                      std::string* value_bytes) {
   2011   VLOG(3) << __func__;
   2012   return Parse_UINT32(buffer, value, value_bytes);
   2013 }
   2014 
   2015 TPM_RC Serialize_TPM_SPEC(const TPM_SPEC& value, std::string* buffer) {
   2016   VLOG(3) << __func__;
   2017   return Serialize_UINT32(value, buffer);
   2018 }
   2019 
   2020 TPM_RC Parse_TPM_SPEC(std::string* buffer,
   2021                       TPM_SPEC* value,
   2022                       std::string* value_bytes) {
   2023   VLOG(3) << __func__;
   2024   return Parse_UINT32(buffer, value, value_bytes);
   2025 }
   2026 
   2027 TPM_RC Serialize_TPM_GENERATED(const TPM_GENERATED& value,
   2028                                std::string* buffer) {
   2029   VLOG(3) << __func__;
   2030   return Serialize_UINT32(value, buffer);
   2031 }
   2032 
   2033 TPM_RC Parse_TPM_GENERATED(std::string* buffer,
   2034                            TPM_GENERATED* value,
   2035                            std::string* value_bytes) {
   2036   VLOG(3) << __func__;
   2037   return Parse_UINT32(buffer, value, value_bytes);
   2038 }
   2039 
   2040 TPM_RC Serialize_TPM_RC(const TPM_RC& value, std::string* buffer) {
   2041   VLOG(3) << __func__;
   2042   return Serialize_UINT32(value, buffer);
   2043 }
   2044 
   2045 TPM_RC Parse_TPM_RC(std::string* buffer,
   2046                     TPM_RC* value,
   2047                     std::string* value_bytes) {
   2048   VLOG(3) << __func__;
   2049   return Parse_UINT32(buffer, value, value_bytes);
   2050 }
   2051 
   2052 TPM_RC Serialize_TPM_CLOCK_ADJUST(const TPM_CLOCK_ADJUST& value,
   2053                                   std::string* buffer) {
   2054   VLOG(3) << __func__;
   2055   return Serialize_INT8(value, buffer);
   2056 }
   2057 
   2058 TPM_RC Parse_TPM_CLOCK_ADJUST(std::string* buffer,
   2059                               TPM_CLOCK_ADJUST* value,
   2060                               std::string* value_bytes) {
   2061   VLOG(3) << __func__;
   2062   return Parse_INT8(buffer, value, value_bytes);
   2063 }
   2064 
   2065 TPM_RC Serialize_TPM_EO(const TPM_EO& value, std::string* buffer) {
   2066   VLOG(3) << __func__;
   2067   return Serialize_UINT16(value, buffer);
   2068 }
   2069 
   2070 TPM_RC Parse_TPM_EO(std::string* buffer,
   2071                     TPM_EO* value,
   2072                     std::string* value_bytes) {
   2073   VLOG(3) << __func__;
   2074   return Parse_UINT16(buffer, value, value_bytes);
   2075 }
   2076 
   2077 TPM_RC Serialize_TPM_SU(const TPM_SU& value, std::string* buffer) {
   2078   VLOG(3) << __func__;
   2079   return Serialize_UINT16(value, buffer);
   2080 }
   2081 
   2082 TPM_RC Parse_TPM_SU(std::string* buffer,
   2083                     TPM_SU* value,
   2084                     std::string* value_bytes) {
   2085   VLOG(3) << __func__;
   2086   return Parse_UINT16(buffer, value, value_bytes);
   2087 }
   2088 
   2089 TPM_RC Serialize_TPM_SE(const TPM_SE& value, std::string* buffer) {
   2090   VLOG(3) << __func__;
   2091   return Serialize_UINT8(value, buffer);
   2092 }
   2093 
   2094 TPM_RC Parse_TPM_SE(std::string* buffer,
   2095                     TPM_SE* value,
   2096                     std::string* value_bytes) {
   2097   VLOG(3) << __func__;
   2098   return Parse_UINT8(buffer, value, value_bytes);
   2099 }
   2100 
   2101 TPM_RC Serialize_TPM_CAP(const TPM_CAP& value, std::string* buffer) {
   2102   VLOG(3) << __func__;
   2103   return Serialize_UINT32(value, buffer);
   2104 }
   2105 
   2106 TPM_RC Parse_TPM_CAP(std::string* buffer,
   2107                      TPM_CAP* value,
   2108                      std::string* value_bytes) {
   2109   VLOG(3) << __func__;
   2110   return Parse_UINT32(buffer, value, value_bytes);
   2111 }
   2112 
   2113 TPM_RC Serialize_TPM_PT(const TPM_PT& value, std::string* buffer) {
   2114   VLOG(3) << __func__;
   2115   return Serialize_UINT32(value, buffer);
   2116 }
   2117 
   2118 TPM_RC Parse_TPM_PT(std::string* buffer,
   2119                     TPM_PT* value,
   2120                     std::string* value_bytes) {
   2121   VLOG(3) << __func__;
   2122   return Parse_UINT32(buffer, value, value_bytes);
   2123 }
   2124 
   2125 TPM_RC Serialize_TPM_PT_PCR(const TPM_PT_PCR& value, std::string* buffer) {
   2126   VLOG(3) << __func__;
   2127   return Serialize_UINT32(value, buffer);
   2128 }
   2129 
   2130 TPM_RC Parse_TPM_PT_PCR(std::string* buffer,
   2131                         TPM_PT_PCR* value,
   2132                         std::string* value_bytes) {
   2133   VLOG(3) << __func__;
   2134   return Parse_UINT32(buffer, value, value_bytes);
   2135 }
   2136 
   2137 TPM_RC Serialize_TPM_PS(const TPM_PS& value, std::string* buffer) {
   2138   VLOG(3) << __func__;
   2139   return Serialize_UINT32(value, buffer);
   2140 }
   2141 
   2142 TPM_RC Parse_TPM_PS(std::string* buffer,
   2143                     TPM_PS* value,
   2144                     std::string* value_bytes) {
   2145   VLOG(3) << __func__;
   2146   return Parse_UINT32(buffer, value, value_bytes);
   2147 }
   2148 
   2149 TPM_RC Serialize_TPM_HT(const TPM_HT& value, std::string* buffer) {
   2150   VLOG(3) << __func__;
   2151   return Serialize_UINT8(value, buffer);
   2152 }
   2153 
   2154 TPM_RC Parse_TPM_HT(std::string* buffer,
   2155                     TPM_HT* value,
   2156                     std::string* value_bytes) {
   2157   VLOG(3) << __func__;
   2158   return Parse_UINT8(buffer, value, value_bytes);
   2159 }
   2160 
   2161 TPM_RC Serialize_TPM_RH(const TPM_RH& value, std::string* buffer) {
   2162   VLOG(3) << __func__;
   2163   return Serialize_UINT32(value, buffer);
   2164 }
   2165 
   2166 TPM_RC Parse_TPM_RH(std::string* buffer,
   2167                     TPM_RH* value,
   2168                     std::string* value_bytes) {
   2169   VLOG(3) << __func__;
   2170   return Parse_UINT32(buffer, value, value_bytes);
   2171 }
   2172 
   2173 TPM_RC Serialize_TPM_HC(const TPM_HC& value, std::string* buffer) {
   2174   VLOG(3) << __func__;
   2175   return Serialize_TPM_HANDLE(value, buffer);
   2176 }
   2177 
   2178 TPM_RC Parse_TPM_HC(std::string* buffer,
   2179                     TPM_HC* value,
   2180                     std::string* value_bytes) {
   2181   VLOG(3) << __func__;
   2182   return Parse_TPM_HANDLE(buffer, value, value_bytes);
   2183 }
   2184 
   2185 TPM_RC Serialize_TPMS_ALGORITHM_DESCRIPTION(
   2186     const TPMS_ALGORITHM_DESCRIPTION& value,
   2187     std::string* buffer) {
   2188   TPM_RC result = TPM_RC_SUCCESS;
   2189   VLOG(3) << __func__;
   2190 
   2191   result = Serialize_TPM_ALG_ID(value.alg, buffer);
   2192   if (result) {
   2193     return result;
   2194   }
   2195 
   2196   result = Serialize_TPMA_ALGORITHM(value.attributes, buffer);
   2197   if (result) {
   2198     return result;
   2199   }
   2200   return result;
   2201 }
   2202 
   2203 TPM_RC Parse_TPMS_ALGORITHM_DESCRIPTION(std::string* buffer,
   2204                                         TPMS_ALGORITHM_DESCRIPTION* value,
   2205                                         std::string* value_bytes) {
   2206   TPM_RC result = TPM_RC_SUCCESS;
   2207   VLOG(3) << __func__;
   2208 
   2209   result = Parse_TPM_ALG_ID(buffer, &value->alg, value_bytes);
   2210   if (result) {
   2211     return result;
   2212   }
   2213 
   2214   result = Parse_TPMA_ALGORITHM(buffer, &value->attributes, value_bytes);
   2215   if (result) {
   2216     return result;
   2217   }
   2218   return result;
   2219 }
   2220 
   2221 TPM_RC Serialize_TPMU_HA(const TPMU_HA& value,
   2222                          TPMI_ALG_HASH selector,
   2223                          std::string* buffer) {
   2224   TPM_RC result = TPM_RC_SUCCESS;
   2225   VLOG(3) << __func__;
   2226 
   2227   if (selector == TPM_ALG_SHA384) {
   2228     if (arraysize(value.sha384) < SHA384_DIGEST_SIZE) {
   2229       return TPM_RC_INSUFFICIENT;
   2230     }
   2231     for (uint32_t i = 0; i < SHA384_DIGEST_SIZE; ++i) {
   2232       result = Serialize_BYTE(value.sha384[i], buffer);
   2233       if (result) {
   2234         return result;
   2235       }
   2236     }
   2237   }
   2238 
   2239   if (selector == TPM_ALG_SHA1) {
   2240     if (arraysize(value.sha1) < SHA1_DIGEST_SIZE) {
   2241       return TPM_RC_INSUFFICIENT;
   2242     }
   2243     for (uint32_t i = 0; i < SHA1_DIGEST_SIZE; ++i) {
   2244       result = Serialize_BYTE(value.sha1[i], buffer);
   2245       if (result) {
   2246         return result;
   2247       }
   2248     }
   2249   }
   2250 
   2251   if (selector == TPM_ALG_SM3_256) {
   2252     if (arraysize(value.sm3_256) < SM3_256_DIGEST_SIZE) {
   2253       return TPM_RC_INSUFFICIENT;
   2254     }
   2255     for (uint32_t i = 0; i < SM3_256_DIGEST_SIZE; ++i) {
   2256       result = Serialize_BYTE(value.sm3_256[i], buffer);
   2257       if (result) {
   2258         return result;
   2259       }
   2260     }
   2261   }
   2262 
   2263   if (selector == TPM_ALG_NULL) {
   2264     // Do nothing.
   2265   }
   2266 
   2267   if (selector == TPM_ALG_SHA256) {
   2268     if (arraysize(value.sha256) < SHA256_DIGEST_SIZE) {
   2269       return TPM_RC_INSUFFICIENT;
   2270     }
   2271     for (uint32_t i = 0; i < SHA256_DIGEST_SIZE; ++i) {
   2272       result = Serialize_BYTE(value.sha256[i], buffer);
   2273       if (result) {
   2274         return result;
   2275       }
   2276     }
   2277   }
   2278 
   2279   if (selector == TPM_ALG_SHA512) {
   2280     if (arraysize(value.sha512) < SHA512_DIGEST_SIZE) {
   2281       return TPM_RC_INSUFFICIENT;
   2282     }
   2283     for (uint32_t i = 0; i < SHA512_DIGEST_SIZE; ++i) {
   2284       result = Serialize_BYTE(value.sha512[i], buffer);
   2285       if (result) {
   2286         return result;
   2287       }
   2288     }
   2289   }
   2290   return result;
   2291 }
   2292 
   2293 TPM_RC Parse_TPMU_HA(std::string* buffer,
   2294                      TPMI_ALG_HASH selector,
   2295                      TPMU_HA* value,
   2296                      std::string* value_bytes) {
   2297   TPM_RC result = TPM_RC_SUCCESS;
   2298   VLOG(3) << __func__;
   2299 
   2300   if (selector == TPM_ALG_SHA384) {
   2301     if (arraysize(value->sha384) < SHA384_DIGEST_SIZE) {
   2302       return TPM_RC_INSUFFICIENT;
   2303     }
   2304     for (uint32_t i = 0; i < SHA384_DIGEST_SIZE; ++i) {
   2305       result = Parse_BYTE(buffer, &value->sha384[i], value_bytes);
   2306       if (result) {
   2307         return result;
   2308       }
   2309     }
   2310   }
   2311 
   2312   if (selector == TPM_ALG_SHA1) {
   2313     if (arraysize(value->sha1) < SHA1_DIGEST_SIZE) {
   2314       return TPM_RC_INSUFFICIENT;
   2315     }
   2316     for (uint32_t i = 0; i < SHA1_DIGEST_SIZE; ++i) {
   2317       result = Parse_BYTE(buffer, &value->sha1[i], value_bytes);
   2318       if (result) {
   2319         return result;
   2320       }
   2321     }
   2322   }
   2323 
   2324   if (selector == TPM_ALG_SM3_256) {
   2325     if (arraysize(value->sm3_256) < SM3_256_DIGEST_SIZE) {
   2326       return TPM_RC_INSUFFICIENT;
   2327     }
   2328     for (uint32_t i = 0; i < SM3_256_DIGEST_SIZE; ++i) {
   2329       result = Parse_BYTE(buffer, &value->sm3_256[i], value_bytes);
   2330       if (result) {
   2331         return result;
   2332       }
   2333     }
   2334   }
   2335 
   2336   if (selector == TPM_ALG_NULL) {
   2337     // Do nothing.
   2338   }
   2339 
   2340   if (selector == TPM_ALG_SHA256) {
   2341     if (arraysize(value->sha256) < SHA256_DIGEST_SIZE) {
   2342       return TPM_RC_INSUFFICIENT;
   2343     }
   2344     for (uint32_t i = 0; i < SHA256_DIGEST_SIZE; ++i) {
   2345       result = Parse_BYTE(buffer, &value->sha256[i], value_bytes);
   2346       if (result) {
   2347         return result;
   2348       }
   2349     }
   2350   }
   2351 
   2352   if (selector == TPM_ALG_SHA512) {
   2353     if (arraysize(value->sha512) < SHA512_DIGEST_SIZE) {
   2354       return TPM_RC_INSUFFICIENT;
   2355     }
   2356     for (uint32_t i = 0; i < SHA512_DIGEST_SIZE; ++i) {
   2357       result = Parse_BYTE(buffer, &value->sha512[i], value_bytes);
   2358       if (result) {
   2359         return result;
   2360       }
   2361     }
   2362   }
   2363   return result;
   2364 }
   2365 
   2366 TPM_RC Serialize_TPMT_HA(const TPMT_HA& value, std::string* buffer) {
   2367   TPM_RC result = TPM_RC_SUCCESS;
   2368   VLOG(3) << __func__;
   2369 
   2370   result = Serialize_TPMI_ALG_HASH(value.hash_alg, buffer);
   2371   if (result) {
   2372     return result;
   2373   }
   2374 
   2375   result = Serialize_TPMU_HA(value.digest, value.hash_alg, buffer);
   2376   if (result) {
   2377     return result;
   2378   }
   2379   return result;
   2380 }
   2381 
   2382 TPM_RC Parse_TPMT_HA(std::string* buffer,
   2383                      TPMT_HA* value,
   2384                      std::string* value_bytes) {
   2385   TPM_RC result = TPM_RC_SUCCESS;
   2386   VLOG(3) << __func__;
   2387 
   2388   result = Parse_TPMI_ALG_HASH(buffer, &value->hash_alg, value_bytes);
   2389   if (result) {
   2390     return result;
   2391   }
   2392 
   2393   result = Parse_TPMU_HA(buffer, value->hash_alg, &value->digest, value_bytes);
   2394   if (result) {
   2395     return result;
   2396   }
   2397   return result;
   2398 }
   2399 
   2400 TPM_RC Serialize_TPM2B_DATA(const TPM2B_DATA& value, std::string* buffer) {
   2401   TPM_RC result = TPM_RC_SUCCESS;
   2402   VLOG(3) << __func__;
   2403 
   2404   result = Serialize_UINT16(value.size, buffer);
   2405   if (result) {
   2406     return result;
   2407   }
   2408 
   2409   if (arraysize(value.buffer) < value.size) {
   2410     return TPM_RC_INSUFFICIENT;
   2411   }
   2412   for (uint32_t i = 0; i < value.size; ++i) {
   2413     result = Serialize_BYTE(value.buffer[i], buffer);
   2414     if (result) {
   2415       return result;
   2416     }
   2417   }
   2418   return result;
   2419 }
   2420 
   2421 TPM_RC Parse_TPM2B_DATA(std::string* buffer,
   2422                         TPM2B_DATA* value,
   2423                         std::string* value_bytes) {
   2424   TPM_RC result = TPM_RC_SUCCESS;
   2425   VLOG(3) << __func__;
   2426 
   2427   result = Parse_UINT16(buffer, &value->size, value_bytes);
   2428   if (result) {
   2429     return result;
   2430   }
   2431 
   2432   if (arraysize(value->buffer) < value->size) {
   2433     return TPM_RC_INSUFFICIENT;
   2434   }
   2435   for (uint32_t i = 0; i < value->size; ++i) {
   2436     result = Parse_BYTE(buffer, &value->buffer[i], value_bytes);
   2437     if (result) {
   2438       return result;
   2439     }
   2440   }
   2441   return result;
   2442 }
   2443 
   2444 TPM2B_DATA Make_TPM2B_DATA(const std::string& bytes) {
   2445   TPM2B_DATA tpm2b;
   2446   CHECK(bytes.size() <= sizeof(tpm2b.buffer));
   2447   memset(&tpm2b, 0, sizeof(TPM2B_DATA));
   2448   tpm2b.size = bytes.size();
   2449   memcpy(tpm2b.buffer, bytes.data(), bytes.size());
   2450   return tpm2b;
   2451 }
   2452 
   2453 std::string StringFrom_TPM2B_DATA(const TPM2B_DATA& tpm2b) {
   2454   const char* char_buffer = reinterpret_cast<const char*>(tpm2b.buffer);
   2455   return std::string(char_buffer, tpm2b.size);
   2456 }
   2457 
   2458 TPM_RC Serialize_TPM2B_EVENT(const TPM2B_EVENT& value, std::string* buffer) {
   2459   TPM_RC result = TPM_RC_SUCCESS;
   2460   VLOG(3) << __func__;
   2461 
   2462   result = Serialize_UINT16(value.size, buffer);
   2463   if (result) {
   2464     return result;
   2465   }
   2466 
   2467   if (arraysize(value.buffer) < value.size) {
   2468     return TPM_RC_INSUFFICIENT;
   2469   }
   2470   for (uint32_t i = 0; i < value.size; ++i) {
   2471     result = Serialize_BYTE(value.buffer[i], buffer);
   2472     if (result) {
   2473       return result;
   2474     }
   2475   }
   2476   return result;
   2477 }
   2478 
   2479 TPM_RC Parse_TPM2B_EVENT(std::string* buffer,
   2480                          TPM2B_EVENT* value,
   2481                          std::string* value_bytes) {
   2482   TPM_RC result = TPM_RC_SUCCESS;
   2483   VLOG(3) << __func__;
   2484 
   2485   result = Parse_UINT16(buffer, &value->size, value_bytes);
   2486   if (result) {
   2487     return result;
   2488   }
   2489 
   2490   if (arraysize(value->buffer) < value->size) {
   2491     return TPM_RC_INSUFFICIENT;
   2492   }
   2493   for (uint32_t i = 0; i < value->size; ++i) {
   2494     result = Parse_BYTE(buffer, &value->buffer[i], value_bytes);
   2495     if (result) {
   2496       return result;
   2497     }
   2498   }
   2499   return result;
   2500 }
   2501 
   2502 TPM2B_EVENT Make_TPM2B_EVENT(const std::string& bytes) {
   2503   TPM2B_EVENT tpm2b;
   2504   CHECK(bytes.size() <= sizeof(tpm2b.buffer));
   2505   memset(&tpm2b, 0, sizeof(TPM2B_EVENT));
   2506   tpm2b.size = bytes.size();
   2507   memcpy(tpm2b.buffer, bytes.data(), bytes.size());
   2508   return tpm2b;
   2509 }
   2510 
   2511 std::string StringFrom_TPM2B_EVENT(const TPM2B_EVENT& tpm2b) {
   2512   const char* char_buffer = reinterpret_cast<const char*>(tpm2b.buffer);
   2513   return std::string(char_buffer, tpm2b.size);
   2514 }
   2515 
   2516 TPM_RC Serialize_TPM2B_MAX_BUFFER(const TPM2B_MAX_BUFFER& value,
   2517                                   std::string* buffer) {
   2518   TPM_RC result = TPM_RC_SUCCESS;
   2519   VLOG(3) << __func__;
   2520 
   2521   result = Serialize_UINT16(value.size, buffer);
   2522   if (result) {
   2523     return result;
   2524   }
   2525 
   2526   if (arraysize(value.buffer) < value.size) {
   2527     return TPM_RC_INSUFFICIENT;
   2528   }
   2529   for (uint32_t i = 0; i < value.size; ++i) {
   2530     result = Serialize_BYTE(value.buffer[i], buffer);
   2531     if (result) {
   2532       return result;
   2533     }
   2534   }
   2535   return result;
   2536 }
   2537 
   2538 TPM_RC Parse_TPM2B_MAX_BUFFER(std::string* buffer,
   2539                               TPM2B_MAX_BUFFER* value,
   2540                               std::string* value_bytes) {
   2541   TPM_RC result = TPM_RC_SUCCESS;
   2542   VLOG(3) << __func__;
   2543 
   2544   result = Parse_UINT16(buffer, &value->size, value_bytes);
   2545   if (result) {
   2546     return result;
   2547   }
   2548 
   2549   if (arraysize(value->buffer) < value->size) {
   2550     return TPM_RC_INSUFFICIENT;
   2551   }
   2552   for (uint32_t i = 0; i < value->size; ++i) {
   2553     result = Parse_BYTE(buffer, &value->buffer[i], value_bytes);
   2554     if (result) {
   2555       return result;
   2556     }
   2557   }
   2558   return result;
   2559 }
   2560 
   2561 TPM2B_MAX_BUFFER Make_TPM2B_MAX_BUFFER(const std::string& bytes) {
   2562   TPM2B_MAX_BUFFER tpm2b;
   2563   CHECK(bytes.size() <= sizeof(tpm2b.buffer));
   2564   memset(&tpm2b, 0, sizeof(TPM2B_MAX_BUFFER));
   2565   tpm2b.size = bytes.size();
   2566   memcpy(tpm2b.buffer, bytes.data(), bytes.size());
   2567   return tpm2b;
   2568 }
   2569 
   2570 std::string StringFrom_TPM2B_MAX_BUFFER(const TPM2B_MAX_BUFFER& tpm2b) {
   2571   const char* char_buffer = reinterpret_cast<const char*>(tpm2b.buffer);
   2572   return std::string(char_buffer, tpm2b.size);
   2573 }
   2574 
   2575 TPM_RC Serialize_TPM2B_MAX_NV_BUFFER(const TPM2B_MAX_NV_BUFFER& value,
   2576                                      std::string* buffer) {
   2577   TPM_RC result = TPM_RC_SUCCESS;
   2578   VLOG(3) << __func__;
   2579 
   2580   result = Serialize_UINT16(value.size, buffer);
   2581   if (result) {
   2582     return result;
   2583   }
   2584 
   2585   if (arraysize(value.buffer) < value.size) {
   2586     return TPM_RC_INSUFFICIENT;
   2587   }
   2588   for (uint32_t i = 0; i < value.size; ++i) {
   2589     result = Serialize_BYTE(value.buffer[i], buffer);
   2590     if (result) {
   2591       return result;
   2592     }
   2593   }
   2594   return result;
   2595 }
   2596 
   2597 TPM_RC Parse_TPM2B_MAX_NV_BUFFER(std::string* buffer,
   2598                                  TPM2B_MAX_NV_BUFFER* value,
   2599                                  std::string* value_bytes) {
   2600   TPM_RC result = TPM_RC_SUCCESS;
   2601   VLOG(3) << __func__;
   2602 
   2603   result = Parse_UINT16(buffer, &value->size, value_bytes);
   2604   if (result) {
   2605     return result;
   2606   }
   2607 
   2608   if (arraysize(value->buffer) < value->size) {
   2609     return TPM_RC_INSUFFICIENT;
   2610   }
   2611   for (uint32_t i = 0; i < value->size; ++i) {
   2612     result = Parse_BYTE(buffer, &value->buffer[i], value_bytes);
   2613     if (result) {
   2614       return result;
   2615     }
   2616   }
   2617   return result;
   2618 }
   2619 
   2620 TPM2B_MAX_NV_BUFFER Make_TPM2B_MAX_NV_BUFFER(const std::string& bytes) {
   2621   TPM2B_MAX_NV_BUFFER tpm2b;
   2622   CHECK(bytes.size() <= sizeof(tpm2b.buffer));
   2623   memset(&tpm2b, 0, sizeof(TPM2B_MAX_NV_BUFFER));
   2624   tpm2b.size = bytes.size();
   2625   memcpy(tpm2b.buffer, bytes.data(), bytes.size());
   2626   return tpm2b;
   2627 }
   2628 
   2629 std::string StringFrom_TPM2B_MAX_NV_BUFFER(const TPM2B_MAX_NV_BUFFER& tpm2b) {
   2630   const char* char_buffer = reinterpret_cast<const char*>(tpm2b.buffer);
   2631   return std::string(char_buffer, tpm2b.size);
   2632 }
   2633 
   2634 TPM_RC Serialize_TPM2B_TIMEOUT(const TPM2B_TIMEOUT& value,
   2635                                std::string* buffer) {
   2636   TPM_RC result = TPM_RC_SUCCESS;
   2637   VLOG(3) << __func__;
   2638 
   2639   result = Serialize_UINT16(value.size, buffer);
   2640   if (result) {
   2641     return result;
   2642   }
   2643 
   2644   if (arraysize(value.buffer) < value.size) {
   2645     return TPM_RC_INSUFFICIENT;
   2646   }
   2647   for (uint32_t i = 0; i < value.size; ++i) {
   2648     result = Serialize_BYTE(value.buffer[i], buffer);
   2649     if (result) {
   2650       return result;
   2651     }
   2652   }
   2653   return result;
   2654 }
   2655 
   2656 TPM_RC Parse_TPM2B_TIMEOUT(std::string* buffer,
   2657                            TPM2B_TIMEOUT* value,
   2658                            std::string* value_bytes) {
   2659   TPM_RC result = TPM_RC_SUCCESS;
   2660   VLOG(3) << __func__;
   2661 
   2662   result = Parse_UINT16(buffer, &value->size, value_bytes);
   2663   if (result) {
   2664     return result;
   2665   }
   2666 
   2667   if (arraysize(value->buffer) < value->size) {
   2668     return TPM_RC_INSUFFICIENT;
   2669   }
   2670   for (uint32_t i = 0; i < value->size; ++i) {
   2671     result = Parse_BYTE(buffer, &value->buffer[i], value_bytes);
   2672     if (result) {
   2673       return result;
   2674     }
   2675   }
   2676   return result;
   2677 }
   2678 
   2679 TPM2B_TIMEOUT Make_TPM2B_TIMEOUT(const std::string& bytes) {
   2680   TPM2B_TIMEOUT tpm2b;
   2681   CHECK(bytes.size() <= sizeof(tpm2b.buffer));
   2682   memset(&tpm2b, 0, sizeof(TPM2B_TIMEOUT));
   2683   tpm2b.size = bytes.size();
   2684   memcpy(tpm2b.buffer, bytes.data(), bytes.size());
   2685   return tpm2b;
   2686 }
   2687 
   2688 std::string StringFrom_TPM2B_TIMEOUT(const TPM2B_TIMEOUT& tpm2b) {
   2689   const char* char_buffer = reinterpret_cast<const char*>(tpm2b.buffer);
   2690   return std::string(char_buffer, tpm2b.size);
   2691 }
   2692 
   2693 TPM_RC Serialize_TPM2B_IV(const TPM2B_IV& value, std::string* buffer) {
   2694   TPM_RC result = TPM_RC_SUCCESS;
   2695   VLOG(3) << __func__;
   2696 
   2697   result = Serialize_UINT16(value.size, buffer);
   2698   if (result) {
   2699     return result;
   2700   }
   2701 
   2702   if (arraysize(value.buffer) < value.size) {
   2703     return TPM_RC_INSUFFICIENT;
   2704   }
   2705   for (uint32_t i = 0; i < value.size; ++i) {
   2706     result = Serialize_BYTE(value.buffer[i], buffer);
   2707     if (result) {
   2708       return result;
   2709     }
   2710   }
   2711   return result;
   2712 }
   2713 
   2714 TPM_RC Parse_TPM2B_IV(std::string* buffer,
   2715                       TPM2B_IV* value,
   2716                       std::string* value_bytes) {
   2717   TPM_RC result = TPM_RC_SUCCESS;
   2718   VLOG(3) << __func__;
   2719 
   2720   result = Parse_UINT16(buffer, &value->size, value_bytes);
   2721   if (result) {
   2722     return result;
   2723   }
   2724 
   2725   if (arraysize(value->buffer) < value->size) {
   2726     return TPM_RC_INSUFFICIENT;
   2727   }
   2728   for (uint32_t i = 0; i < value->size; ++i) {
   2729     result = Parse_BYTE(buffer, &value->buffer[i], value_bytes);
   2730     if (result) {
   2731       return result;
   2732     }
   2733   }
   2734   return result;
   2735 }
   2736 
   2737 TPM2B_IV Make_TPM2B_IV(const std::string& bytes) {
   2738   TPM2B_IV tpm2b;
   2739   CHECK(bytes.size() <= sizeof(tpm2b.buffer));
   2740   memset(&tpm2b, 0, sizeof(TPM2B_IV));
   2741   tpm2b.size = bytes.size();
   2742   memcpy(tpm2b.buffer, bytes.data(), bytes.size());
   2743   return tpm2b;
   2744 }
   2745 
   2746 std::string StringFrom_TPM2B_IV(const TPM2B_IV& tpm2b) {
   2747   const char* char_buffer = reinterpret_cast<const char*>(tpm2b.buffer);
   2748   return std::string(char_buffer, tpm2b.size);
   2749 }
   2750 
   2751 TPM_RC Serialize_TPM2B_NAME(const TPM2B_NAME& value, std::string* buffer) {
   2752   TPM_RC result = TPM_RC_SUCCESS;
   2753   VLOG(3) << __func__;
   2754 
   2755   result = Serialize_UINT16(value.size, buffer);
   2756   if (result) {
   2757     return result;
   2758   }
   2759 
   2760   if (arraysize(value.name) < value.size) {
   2761     return TPM_RC_INSUFFICIENT;
   2762   }
   2763   for (uint32_t i = 0; i < value.size; ++i) {
   2764     result = Serialize_BYTE(value.name[i], buffer);
   2765     if (result) {
   2766       return result;
   2767     }
   2768   }
   2769   return result;
   2770 }
   2771 
   2772 TPM_RC Parse_TPM2B_NAME(std::string* buffer,
   2773                         TPM2B_NAME* value,
   2774                         std::string* value_bytes) {
   2775   TPM_RC result = TPM_RC_SUCCESS;
   2776   VLOG(3) << __func__;
   2777 
   2778   result = Parse_UINT16(buffer, &value->size, value_bytes);
   2779   if (result) {
   2780     return result;
   2781   }
   2782 
   2783   if (arraysize(value->name) < value->size) {
   2784     return TPM_RC_INSUFFICIENT;
   2785   }
   2786   for (uint32_t i = 0; i < value->size; ++i) {
   2787     result = Parse_BYTE(buffer, &value->name[i], value_bytes);
   2788     if (result) {
   2789       return result;
   2790     }
   2791   }
   2792   return result;
   2793 }
   2794 
   2795 TPM2B_NAME Make_TPM2B_NAME(const std::string& bytes) {
   2796   TPM2B_NAME tpm2b;
   2797   CHECK(bytes.size() <= sizeof(tpm2b.name));
   2798   memset(&tpm2b, 0, sizeof(TPM2B_NAME));
   2799   tpm2b.size = bytes.size();
   2800   memcpy(tpm2b.name, bytes.data(), bytes.size());
   2801   return tpm2b;
   2802 }
   2803 
   2804 std::string StringFrom_TPM2B_NAME(const TPM2B_NAME& tpm2b) {
   2805   const char* char_buffer = reinterpret_cast<const char*>(tpm2b.name);
   2806   return std::string(char_buffer, tpm2b.size);
   2807 }
   2808 
   2809 TPM_RC Serialize_TPMS_PCR_SELECT(const TPMS_PCR_SELECT& value,
   2810                                  std::string* buffer) {
   2811   TPM_RC result = TPM_RC_SUCCESS;
   2812   VLOG(3) << __func__;
   2813 
   2814   result = Serialize_UINT8(value.sizeof_select, buffer);
   2815   if (result) {
   2816     return result;
   2817   }
   2818 
   2819   if (arraysize(value.pcr_select) < value.sizeof_select) {
   2820     return TPM_RC_INSUFFICIENT;
   2821   }
   2822   for (uint32_t i = 0; i < value.sizeof_select; ++i) {
   2823     result = Serialize_BYTE(value.pcr_select[i], buffer);
   2824     if (result) {
   2825       return result;
   2826     }
   2827   }
   2828   return result;
   2829 }
   2830 
   2831 TPM_RC Parse_TPMS_PCR_SELECT(std::string* buffer,
   2832                              TPMS_PCR_SELECT* value,
   2833                              std::string* value_bytes) {
   2834   TPM_RC result = TPM_RC_SUCCESS;
   2835   VLOG(3) << __func__;
   2836 
   2837   result = Parse_UINT8(buffer, &value->sizeof_select, value_bytes);
   2838   if (result) {
   2839     return result;
   2840   }
   2841 
   2842   if (arraysize(value->pcr_select) < value->sizeof_select) {
   2843     return TPM_RC_INSUFFICIENT;
   2844   }
   2845   for (uint32_t i = 0; i < value->sizeof_select; ++i) {
   2846     result = Parse_BYTE(buffer, &value->pcr_select[i], value_bytes);
   2847     if (result) {
   2848       return result;
   2849     }
   2850   }
   2851   return result;
   2852 }
   2853 
   2854 TPM_RC Serialize_TPMS_PCR_SELECTION(const TPMS_PCR_SELECTION& value,
   2855                                     std::string* buffer) {
   2856   TPM_RC result = TPM_RC_SUCCESS;
   2857   VLOG(3) << __func__;
   2858 
   2859   result = Serialize_TPMI_ALG_HASH(value.hash, buffer);
   2860   if (result) {
   2861     return result;
   2862   }
   2863 
   2864   result = Serialize_UINT8(value.sizeof_select, buffer);
   2865   if (result) {
   2866     return result;
   2867   }
   2868 
   2869   if (arraysize(value.pcr_select) < value.sizeof_select) {
   2870     return TPM_RC_INSUFFICIENT;
   2871   }
   2872   for (uint32_t i = 0; i < value.sizeof_select; ++i) {
   2873     result = Serialize_BYTE(value.pcr_select[i], buffer);
   2874     if (result) {
   2875       return result;
   2876     }
   2877   }
   2878   return result;
   2879 }
   2880 
   2881 TPM_RC Parse_TPMS_PCR_SELECTION(std::string* buffer,
   2882                                 TPMS_PCR_SELECTION* value,
   2883                                 std::string* value_bytes) {
   2884   TPM_RC result = TPM_RC_SUCCESS;
   2885   VLOG(3) << __func__;
   2886 
   2887   result = Parse_TPMI_ALG_HASH(buffer, &value->hash, value_bytes);
   2888   if (result) {
   2889     return result;
   2890   }
   2891 
   2892   result = Parse_UINT8(buffer, &value->sizeof_select, value_bytes);
   2893   if (result) {
   2894     return result;
   2895   }
   2896 
   2897   if (arraysize(value->pcr_select) < value->sizeof_select) {
   2898     return TPM_RC_INSUFFICIENT;
   2899   }
   2900   for (uint32_t i = 0; i < value->sizeof_select; ++i) {
   2901     result = Parse_BYTE(buffer, &value->pcr_select[i], value_bytes);
   2902     if (result) {
   2903       return result;
   2904     }
   2905   }
   2906   return result;
   2907 }
   2908 
   2909 TPM_RC Serialize_TPMT_TK_CREATION(const TPMT_TK_CREATION& value,
   2910                                   std::string* buffer) {
   2911   TPM_RC result = TPM_RC_SUCCESS;
   2912   VLOG(3) << __func__;
   2913 
   2914   result = Serialize_TPM_ST(value.tag, buffer);
   2915   if (result) {
   2916     return result;
   2917   }
   2918 
   2919   result = Serialize_TPMI_RH_HIERARCHY(value.hierarchy, buffer);
   2920   if (result) {
   2921     return result;
   2922   }
   2923 
   2924   result = Serialize_TPM2B_DIGEST(value.digest, buffer);
   2925   if (result) {
   2926     return result;
   2927   }
   2928   return result;
   2929 }
   2930 
   2931 TPM_RC Parse_TPMT_TK_CREATION(std::string* buffer,
   2932                               TPMT_TK_CREATION* value,
   2933                               std::string* value_bytes) {
   2934   TPM_RC result = TPM_RC_SUCCESS;
   2935   VLOG(3) << __func__;
   2936 
   2937   result = Parse_TPM_ST(buffer, &value->tag, value_bytes);
   2938   if (result) {
   2939     return result;
   2940   }
   2941 
   2942   result = Parse_TPMI_RH_HIERARCHY(buffer, &value->hierarchy, value_bytes);
   2943   if (result) {
   2944     return result;
   2945   }
   2946 
   2947   result = Parse_TPM2B_DIGEST(buffer, &value->digest, value_bytes);
   2948   if (result) {
   2949     return result;
   2950   }
   2951   return result;
   2952 }
   2953 
   2954 TPM_RC Serialize_TPMT_TK_VERIFIED(const TPMT_TK_VERIFIED& value,
   2955                                   std::string* buffer) {
   2956   TPM_RC result = TPM_RC_SUCCESS;
   2957   VLOG(3) << __func__;
   2958 
   2959   result = Serialize_TPM_ST(value.tag, buffer);
   2960   if (result) {
   2961     return result;
   2962   }
   2963 
   2964   result = Serialize_TPMI_RH_HIERARCHY(value.hierarchy, buffer);
   2965   if (result) {
   2966     return result;
   2967   }
   2968 
   2969   result = Serialize_TPM2B_DIGEST(value.digest, buffer);
   2970   if (result) {
   2971     return result;
   2972   }
   2973   return result;
   2974 }
   2975 
   2976 TPM_RC Parse_TPMT_TK_VERIFIED(std::string* buffer,
   2977                               TPMT_TK_VERIFIED* value,
   2978                               std::string* value_bytes) {
   2979   TPM_RC result = TPM_RC_SUCCESS;
   2980   VLOG(3) << __func__;
   2981 
   2982   result = Parse_TPM_ST(buffer, &value->tag, value_bytes);
   2983   if (result) {
   2984     return result;
   2985   }
   2986 
   2987   result = Parse_TPMI_RH_HIERARCHY(buffer, &value->hierarchy, value_bytes);
   2988   if (result) {
   2989     return result;
   2990   }
   2991 
   2992   result = Parse_TPM2B_DIGEST(buffer, &value->digest, value_bytes);
   2993   if (result) {
   2994     return result;
   2995   }
   2996   return result;
   2997 }
   2998 
   2999 TPM_RC Serialize_TPMT_TK_AUTH(const TPMT_TK_AUTH& value, std::string* buffer) {
   3000   TPM_RC result = TPM_RC_SUCCESS;
   3001   VLOG(3) << __func__;
   3002 
   3003   result = Serialize_TPMI_RH_HIERARCHY(value.hierarchy, buffer);
   3004   if (result) {
   3005     return result;
   3006   }
   3007 
   3008   result = Serialize_TPM2B_DIGEST(value.digest, buffer);
   3009   if (result) {
   3010     return result;
   3011   }
   3012   return result;
   3013 }
   3014 
   3015 TPM_RC Parse_TPMT_TK_AUTH(std::string* buffer,
   3016                           TPMT_TK_AUTH* value,
   3017                           std::string* value_bytes) {
   3018   TPM_RC result = TPM_RC_SUCCESS;
   3019   VLOG(3) << __func__;
   3020 
   3021   result = Parse_TPMI_RH_HIERARCHY(buffer, &value->hierarchy, value_bytes);
   3022   if (result) {
   3023     return result;
   3024   }
   3025 
   3026   result = Parse_TPM2B_DIGEST(buffer, &value->digest, value_bytes);
   3027   if (result) {
   3028     return result;
   3029   }
   3030   return result;
   3031 }
   3032 
   3033 TPM_RC Serialize_TPMT_TK_HASHCHECK(const TPMT_TK_HASHCHECK& value,
   3034                                    std::string* buffer) {
   3035   TPM_RC result = TPM_RC_SUCCESS;
   3036   VLOG(3) << __func__;
   3037 
   3038   result = Serialize_TPM_ST(value.tag, buffer);
   3039   if (result) {
   3040     return result;
   3041   }
   3042 
   3043   result = Serialize_TPMI_RH_HIERARCHY(value.hierarchy, buffer);
   3044   if (result) {
   3045     return result;
   3046   }
   3047 
   3048   result = Serialize_TPM2B_DIGEST(value.digest, buffer);
   3049   if (result) {
   3050     return result;
   3051   }
   3052   return result;
   3053 }
   3054 
   3055 TPM_RC Parse_TPMT_TK_HASHCHECK(std::string* buffer,
   3056                                TPMT_TK_HASHCHECK* value,
   3057                                std::string* value_bytes) {
   3058   TPM_RC result = TPM_RC_SUCCESS;
   3059   VLOG(3) << __func__;
   3060 
   3061   result = Parse_TPM_ST(buffer, &value->tag, value_bytes);
   3062   if (result) {
   3063     return result;
   3064   }
   3065 
   3066   result = Parse_TPMI_RH_HIERARCHY(buffer, &value->hierarchy, value_bytes);
   3067   if (result) {
   3068     return result;
   3069   }
   3070 
   3071   result = Parse_TPM2B_DIGEST(buffer, &value->digest, value_bytes);
   3072   if (result) {
   3073     return result;
   3074   }
   3075   return result;
   3076 }
   3077 
   3078 TPM_RC Serialize_TPMS_ALG_PROPERTY(const TPMS_ALG_PROPERTY& value,
   3079                                    std::string* buffer) {
   3080   TPM_RC result = TPM_RC_SUCCESS;
   3081   VLOG(3) << __func__;
   3082 
   3083   result = Serialize_TPM_ALG_ID(value.alg, buffer);
   3084   if (result) {
   3085     return result;
   3086   }
   3087 
   3088   result = Serialize_TPMA_ALGORITHM(value.alg_properties, buffer);
   3089   if (result) {
   3090     return result;
   3091   }
   3092   return result;
   3093 }
   3094 
   3095 TPM_RC Parse_TPMS_ALG_PROPERTY(std::string* buffer,
   3096                                TPMS_ALG_PROPERTY* value,
   3097                                std::string* value_bytes) {
   3098   TPM_RC result = TPM_RC_SUCCESS;
   3099   VLOG(3) << __func__;
   3100 
   3101   result = Parse_TPM_ALG_ID(buffer, &value->alg, value_bytes);
   3102   if (result) {
   3103     return result;
   3104   }
   3105 
   3106   result = Parse_TPMA_ALGORITHM(buffer, &value->alg_properties, value_bytes);
   3107   if (result) {
   3108     return result;
   3109   }
   3110   return result;
   3111 }
   3112 
   3113 TPM_RC Serialize_TPMS_TAGGED_PROPERTY(const TPMS_TAGGED_PROPERTY& value,
   3114                                       std::string* buffer) {
   3115   TPM_RC result = TPM_RC_SUCCESS;
   3116   VLOG(3) << __func__;
   3117 
   3118   result = Serialize_TPM_PT(value.property, buffer);
   3119   if (result) {
   3120     return result;
   3121   }
   3122 
   3123   result = Serialize_UINT32(value.value, buffer);
   3124   if (result) {
   3125     return result;
   3126   }
   3127   return result;
   3128 }
   3129 
   3130 TPM_RC Parse_TPMS_TAGGED_PROPERTY(std::string* buffer,
   3131                                   TPMS_TAGGED_PROPERTY* value,
   3132                                   std::string* value_bytes) {
   3133   TPM_RC result = TPM_RC_SUCCESS;
   3134   VLOG(3) << __func__;
   3135 
   3136   result = Parse_TPM_PT(buffer, &value->property, value_bytes);
   3137   if (result) {
   3138     return result;
   3139   }
   3140 
   3141   result = Parse_UINT32(buffer, &value->value, value_bytes);
   3142   if (result) {
   3143     return result;
   3144   }
   3145   return result;
   3146 }
   3147 
   3148 TPM_RC Serialize_TPMS_TAGGED_PCR_SELECT(const TPMS_TAGGED_PCR_SELECT& value,
   3149                                         std::string* buffer) {
   3150   TPM_RC result = TPM_RC_SUCCESS;
   3151   VLOG(3) << __func__;
   3152 
   3153   result = Serialize_TPM_PT(value.tag, buffer);
   3154   if (result) {
   3155     return result;
   3156   }
   3157 
   3158   result = Serialize_UINT8(value.sizeof_select, buffer);
   3159   if (result) {
   3160     return result;
   3161   }
   3162 
   3163   if (arraysize(value.pcr_select) < value.sizeof_select) {
   3164     return TPM_RC_INSUFFICIENT;
   3165   }
   3166   for (uint32_t i = 0; i < value.sizeof_select; ++i) {
   3167     result = Serialize_BYTE(value.pcr_select[i], buffer);
   3168     if (result) {
   3169       return result;
   3170     }
   3171   }
   3172   return result;
   3173 }
   3174 
   3175 TPM_RC Parse_TPMS_TAGGED_PCR_SELECT(std::string* buffer,
   3176                                     TPMS_TAGGED_PCR_SELECT* value,
   3177                                     std::string* value_bytes) {
   3178   TPM_RC result = TPM_RC_SUCCESS;
   3179   VLOG(3) << __func__;
   3180 
   3181   result = Parse_TPM_PT(buffer, &value->tag, value_bytes);
   3182   if (result) {
   3183     return result;
   3184   }
   3185 
   3186   result = Parse_UINT8(buffer, &value->sizeof_select, value_bytes);
   3187   if (result) {
   3188     return result;
   3189   }
   3190 
   3191   if (arraysize(value->pcr_select) < value->sizeof_select) {
   3192     return TPM_RC_INSUFFICIENT;
   3193   }
   3194   for (uint32_t i = 0; i < value->sizeof_select; ++i) {
   3195     result = Parse_BYTE(buffer, &value->pcr_select[i], value_bytes);
   3196     if (result) {
   3197       return result;
   3198     }
   3199   }
   3200   return result;
   3201 }
   3202 
   3203 TPM_RC Serialize_TPML_CC(const TPML_CC& value, std::string* buffer) {
   3204   TPM_RC result = TPM_RC_SUCCESS;
   3205   VLOG(3) << __func__;
   3206 
   3207   result = Serialize_UINT32(value.count, buffer);
   3208   if (result) {
   3209     return result;
   3210   }
   3211 
   3212   if (arraysize(value.command_codes) < value.count) {
   3213     return TPM_RC_INSUFFICIENT;
   3214   }
   3215   for (uint32_t i = 0; i < value.count; ++i) {
   3216     result = Serialize_TPM_CC(value.command_codes[i], buffer);
   3217     if (result) {
   3218       return result;
   3219     }
   3220   }
   3221   return result;
   3222 }
   3223 
   3224 TPM_RC Parse_TPML_CC(std::string* buffer,
   3225                      TPML_CC* value,
   3226                      std::string* value_bytes) {
   3227   TPM_RC result = TPM_RC_SUCCESS;
   3228   VLOG(3) << __func__;
   3229 
   3230   result = Parse_UINT32(buffer, &value->count, value_bytes);
   3231   if (result) {
   3232     return result;
   3233   }
   3234 
   3235   if (arraysize(value->command_codes) < value->count) {
   3236     return TPM_RC_INSUFFICIENT;
   3237   }
   3238   for (uint32_t i = 0; i < value->count; ++i) {
   3239     result = Parse_TPM_CC(buffer, &value->command_codes[i], value_bytes);
   3240     if (result) {
   3241       return result;
   3242     }
   3243   }
   3244   return result;
   3245 }
   3246 
   3247 TPM_RC Serialize_TPML_CCA(const TPML_CCA& value, std::string* buffer) {
   3248   TPM_RC result = TPM_RC_SUCCESS;
   3249   VLOG(3) << __func__;
   3250 
   3251   result = Serialize_UINT32(value.count, buffer);
   3252   if (result) {
   3253     return result;
   3254   }
   3255 
   3256   if (arraysize(value.command_attributes) < value.count) {
   3257     return TPM_RC_INSUFFICIENT;
   3258   }
   3259   for (uint32_t i = 0; i < value.count; ++i) {
   3260     result = Serialize_TPMA_CC(value.command_attributes[i], buffer);
   3261     if (result) {
   3262       return result;
   3263     }
   3264   }
   3265   return result;
   3266 }
   3267 
   3268 TPM_RC Parse_TPML_CCA(std::string* buffer,
   3269                       TPML_CCA* value,
   3270                       std::string* value_bytes) {
   3271   TPM_RC result = TPM_RC_SUCCESS;
   3272   VLOG(3) << __func__;
   3273 
   3274   result = Parse_UINT32(buffer, &value->count, value_bytes);
   3275   if (result) {
   3276     return result;
   3277   }
   3278 
   3279   if (arraysize(value->command_attributes) < value->count) {
   3280     return TPM_RC_INSUFFICIENT;
   3281   }
   3282   for (uint32_t i = 0; i < value->count; ++i) {
   3283     result = Parse_TPMA_CC(buffer, &value->command_attributes[i], value_bytes);
   3284     if (result) {
   3285       return result;
   3286     }
   3287   }
   3288   return result;
   3289 }
   3290 
   3291 TPM_RC Serialize_TPML_ALG(const TPML_ALG& value, std::string* buffer) {
   3292   TPM_RC result = TPM_RC_SUCCESS;
   3293   VLOG(3) << __func__;
   3294 
   3295   result = Serialize_UINT32(value.count, buffer);
   3296   if (result) {
   3297     return result;
   3298   }
   3299 
   3300   if (arraysize(value.algorithms) < value.count) {
   3301     return TPM_RC_INSUFFICIENT;
   3302   }
   3303   for (uint32_t i = 0; i < value.count; ++i) {
   3304     result = Serialize_TPM_ALG_ID(value.algorithms[i], buffer);
   3305     if (result) {
   3306       return result;
   3307     }
   3308   }
   3309   return result;
   3310 }
   3311 
   3312 TPM_RC Parse_TPML_ALG(std::string* buffer,
   3313                       TPML_ALG* value,
   3314                       std::string* value_bytes) {
   3315   TPM_RC result = TPM_RC_SUCCESS;
   3316   VLOG(3) << __func__;
   3317 
   3318   result = Parse_UINT32(buffer, &value->count, value_bytes);
   3319   if (result) {
   3320     return result;
   3321   }
   3322 
   3323   if (arraysize(value->algorithms) < value->count) {
   3324     return TPM_RC_INSUFFICIENT;
   3325   }
   3326   for (uint32_t i = 0; i < value->count; ++i) {
   3327     result = Parse_TPM_ALG_ID(buffer, &value->algorithms[i], value_bytes);
   3328     if (result) {
   3329       return result;
   3330     }
   3331   }
   3332   return result;
   3333 }
   3334 
   3335 TPM_RC Serialize_TPML_HANDLE(const TPML_HANDLE& value, std::string* buffer) {
   3336   TPM_RC result = TPM_RC_SUCCESS;
   3337   VLOG(3) << __func__;
   3338 
   3339   result = Serialize_UINT32(value.count, buffer);
   3340   if (result) {
   3341     return result;
   3342   }
   3343 
   3344   if (arraysize(value.handle) < value.count) {
   3345     return TPM_RC_INSUFFICIENT;
   3346   }
   3347   for (uint32_t i = 0; i < value.count; ++i) {
   3348     result = Serialize_TPM_HANDLE(value.handle[i], buffer);
   3349     if (result) {
   3350       return result;
   3351     }
   3352   }
   3353   return result;
   3354 }
   3355 
   3356 TPM_RC Parse_TPML_HANDLE(std::string* buffer,
   3357                          TPML_HANDLE* value,
   3358                          std::string* value_bytes) {
   3359   TPM_RC result = TPM_RC_SUCCESS;
   3360   VLOG(3) << __func__;
   3361 
   3362   result = Parse_UINT32(buffer, &value->count, value_bytes);
   3363   if (result) {
   3364     return result;
   3365   }
   3366 
   3367   if (arraysize(value->handle) < value->count) {
   3368     return TPM_RC_INSUFFICIENT;
   3369   }
   3370   for (uint32_t i = 0; i < value->count; ++i) {
   3371     result = Parse_TPM_HANDLE(buffer, &value->handle[i], value_bytes);
   3372     if (result) {
   3373       return result;
   3374     }
   3375   }
   3376   return result;
   3377 }
   3378 
   3379 TPM_RC Serialize_TPML_DIGEST(const TPML_DIGEST& value, std::string* buffer) {
   3380   TPM_RC result = TPM_RC_SUCCESS;
   3381   VLOG(3) << __func__;
   3382 
   3383   result = Serialize_UINT32(value.count, buffer);
   3384   if (result) {
   3385     return result;
   3386   }
   3387 
   3388   if (arraysize(value.digests) < value.count) {
   3389     return TPM_RC_INSUFFICIENT;
   3390   }
   3391   for (uint32_t i = 0; i < value.count; ++i) {
   3392     result = Serialize_TPM2B_DIGEST(value.digests[i], buffer);
   3393     if (result) {
   3394       return result;
   3395     }
   3396   }
   3397   return result;
   3398 }
   3399 
   3400 TPM_RC Parse_TPML_DIGEST(std::string* buffer,
   3401                          TPML_DIGEST* value,
   3402                          std::string* value_bytes) {
   3403   TPM_RC result = TPM_RC_SUCCESS;
   3404   VLOG(3) << __func__;
   3405 
   3406   result = Parse_UINT32(buffer, &value->count, value_bytes);
   3407   if (result) {
   3408     return result;
   3409   }
   3410 
   3411   if (arraysize(value->digests) < value->count) {
   3412     return TPM_RC_INSUFFICIENT;
   3413   }
   3414   for (uint32_t i = 0; i < value->count; ++i) {
   3415     result = Parse_TPM2B_DIGEST(buffer, &value->digests[i], value_bytes);
   3416     if (result) {
   3417       return result;
   3418     }
   3419   }
   3420   return result;
   3421 }
   3422 
   3423 TPM_RC Serialize_TPML_DIGEST_VALUES(const TPML_DIGEST_VALUES& value,
   3424                                     std::string* buffer) {
   3425   TPM_RC result = TPM_RC_SUCCESS;
   3426   VLOG(3) << __func__;
   3427 
   3428   result = Serialize_UINT32(value.count, buffer);
   3429   if (result) {
   3430     return result;
   3431   }
   3432 
   3433   if (arraysize(value.digests) < value.count) {
   3434     return TPM_RC_INSUFFICIENT;
   3435   }
   3436   for (uint32_t i = 0; i < value.count; ++i) {
   3437     result = Serialize_TPMT_HA(value.digests[i], buffer);
   3438     if (result) {
   3439       return result;
   3440     }
   3441   }
   3442   return result;
   3443 }
   3444 
   3445 TPM_RC Parse_TPML_DIGEST_VALUES(std::string* buffer,
   3446                                 TPML_DIGEST_VALUES* value,
   3447                                 std::string* value_bytes) {
   3448   TPM_RC result = TPM_RC_SUCCESS;
   3449   VLOG(3) << __func__;
   3450 
   3451   result = Parse_UINT32(buffer, &value->count, value_bytes);
   3452   if (result) {
   3453     return result;
   3454   }
   3455 
   3456   if (arraysize(value->digests) < value->count) {
   3457     return TPM_RC_INSUFFICIENT;
   3458   }
   3459   for (uint32_t i = 0; i < value->count; ++i) {
   3460     result = Parse_TPMT_HA(buffer, &value->digests[i], value_bytes);
   3461     if (result) {
   3462       return result;
   3463     }
   3464   }
   3465   return result;
   3466 }
   3467 
   3468 TPM_RC Serialize_TPM2B_DIGEST_VALUES(const TPM2B_DIGEST_VALUES& value,
   3469                                      std::string* buffer) {
   3470   TPM_RC result = TPM_RC_SUCCESS;
   3471   VLOG(3) << __func__;
   3472 
   3473   result = Serialize_UINT16(value.size, buffer);
   3474   if (result) {
   3475     return result;
   3476   }
   3477 
   3478   if (arraysize(value.buffer) < value.size) {
   3479     return TPM_RC_INSUFFICIENT;
   3480   }
   3481   for (uint32_t i = 0; i < value.size; ++i) {
   3482     result = Serialize_BYTE(value.buffer[i], buffer);
   3483     if (result) {
   3484       return result;
   3485     }
   3486   }
   3487   return result;
   3488 }
   3489 
   3490 TPM_RC Parse_TPM2B_DIGEST_VALUES(std::string* buffer,
   3491                                  TPM2B_DIGEST_VALUES* value,
   3492                                  std::string* value_bytes) {
   3493   TPM_RC result = TPM_RC_SUCCESS;
   3494   VLOG(3) << __func__;
   3495 
   3496   result = Parse_UINT16(buffer, &value->size, value_bytes);
   3497   if (result) {
   3498     return result;
   3499   }
   3500 
   3501   if (arraysize(value->buffer) < value->size) {
   3502     return TPM_RC_INSUFFICIENT;
   3503   }
   3504   for (uint32_t i = 0; i < value->size; ++i) {
   3505     result = Parse_BYTE(buffer, &value->buffer[i], value_bytes);
   3506     if (result) {
   3507       return result;
   3508     }
   3509   }
   3510   return result;
   3511 }
   3512 
   3513 TPM2B_DIGEST_VALUES Make_TPM2B_DIGEST_VALUES(const std::string& bytes) {
   3514   TPM2B_DIGEST_VALUES tpm2b;
   3515   CHECK(bytes.size() <= sizeof(tpm2b.buffer));
   3516   memset(&tpm2b, 0, sizeof(TPM2B_DIGEST_VALUES));
   3517   tpm2b.size = bytes.size();
   3518   memcpy(tpm2b.buffer, bytes.data(), bytes.size());
   3519   return tpm2b;
   3520 }
   3521 
   3522 std::string StringFrom_TPM2B_DIGEST_VALUES(const TPM2B_DIGEST_VALUES& tpm2b) {
   3523   const char* char_buffer = reinterpret_cast<const char*>(tpm2b.buffer);
   3524   return std::string(char_buffer, tpm2b.size);
   3525 }
   3526 
   3527 TPM_RC Serialize_TPML_PCR_SELECTION(const TPML_PCR_SELECTION& value,
   3528                                     std::string* buffer) {
   3529   TPM_RC result = TPM_RC_SUCCESS;
   3530   VLOG(3) << __func__;
   3531 
   3532   result = Serialize_UINT32(value.count, buffer);
   3533   if (result) {
   3534     return result;
   3535   }
   3536 
   3537   if (arraysize(value.pcr_selections) < value.count) {
   3538     return TPM_RC_INSUFFICIENT;
   3539   }
   3540   for (uint32_t i = 0; i < value.count; ++i) {
   3541     result = Serialize_TPMS_PCR_SELECTION(value.pcr_selections[i], buffer);
   3542     if (result) {
   3543       return result;
   3544     }
   3545   }
   3546   return result;
   3547 }
   3548 
   3549 TPM_RC Parse_TPML_PCR_SELECTION(std::string* buffer,
   3550                                 TPML_PCR_SELECTION* value,
   3551                                 std::string* value_bytes) {
   3552   TPM_RC result = TPM_RC_SUCCESS;
   3553   VLOG(3) << __func__;
   3554 
   3555   result = Parse_UINT32(buffer, &value->count, value_bytes);
   3556   if (result) {
   3557     return result;
   3558   }
   3559 
   3560   if (arraysize(value->pcr_selections) < value->count) {
   3561     return TPM_RC_INSUFFICIENT;
   3562   }
   3563   for (uint32_t i = 0; i < value->count; ++i) {
   3564     result = Parse_TPMS_PCR_SELECTION(buffer, &value->pcr_selections[i],
   3565                                       value_bytes);
   3566     if (result) {
   3567       return result;
   3568     }
   3569   }
   3570   return result;
   3571 }
   3572 
   3573 TPM_RC Serialize_TPML_ALG_PROPERTY(const TPML_ALG_PROPERTY& value,
   3574                                    std::string* buffer) {
   3575   TPM_RC result = TPM_RC_SUCCESS;
   3576   VLOG(3) << __func__;
   3577 
   3578   result = Serialize_UINT32(value.count, buffer);
   3579   if (result) {
   3580     return result;
   3581   }
   3582 
   3583   if (arraysize(value.alg_properties) < value.count) {
   3584     return TPM_RC_INSUFFICIENT;
   3585   }
   3586   for (uint32_t i = 0; i < value.count; ++i) {
   3587     result = Serialize_TPMS_ALG_PROPERTY(value.alg_properties[i], buffer);
   3588     if (result) {
   3589       return result;
   3590     }
   3591   }
   3592   return result;
   3593 }
   3594 
   3595 TPM_RC Parse_TPML_ALG_PROPERTY(std::string* buffer,
   3596                                TPML_ALG_PROPERTY* value,
   3597                                std::string* value_bytes) {
   3598   TPM_RC result = TPM_RC_SUCCESS;
   3599   VLOG(3) << __func__;
   3600 
   3601   result = Parse_UINT32(buffer, &value->count, value_bytes);
   3602   if (result) {
   3603     return result;
   3604   }
   3605 
   3606   if (arraysize(value->alg_properties) < value->count) {
   3607     return TPM_RC_INSUFFICIENT;
   3608   }
   3609   for (uint32_t i = 0; i < value->count; ++i) {
   3610     result =
   3611         Parse_TPMS_ALG_PROPERTY(buffer, &value->alg_properties[i], value_bytes);
   3612     if (result) {
   3613       return result;
   3614     }
   3615   }
   3616   return result;
   3617 }
   3618 
   3619 TPM_RC Serialize_TPML_TAGGED_TPM_PROPERTY(const TPML_TAGGED_TPM_PROPERTY& value,
   3620                                           std::string* buffer) {
   3621   TPM_RC result = TPM_RC_SUCCESS;
   3622   VLOG(3) << __func__;
   3623 
   3624   result = Serialize_UINT32(value.count, buffer);
   3625   if (result) {
   3626     return result;
   3627   }
   3628 
   3629   if (arraysize(value.tpm_property) < value.count) {
   3630     return TPM_RC_INSUFFICIENT;
   3631   }
   3632   for (uint32_t i = 0; i < value.count; ++i) {
   3633     result = Serialize_TPMS_TAGGED_PROPERTY(value.tpm_property[i], buffer);
   3634     if (result) {
   3635       return result;
   3636     }
   3637   }
   3638   return result;
   3639 }
   3640 
   3641 TPM_RC Parse_TPML_TAGGED_TPM_PROPERTY(std::string* buffer,
   3642                                       TPML_TAGGED_TPM_PROPERTY* value,
   3643                                       std::string* value_bytes) {
   3644   TPM_RC result = TPM_RC_SUCCESS;
   3645   VLOG(3) << __func__;
   3646 
   3647   result = Parse_UINT32(buffer, &value->count, value_bytes);
   3648   if (result) {
   3649     return result;
   3650   }
   3651 
   3652   if (arraysize(value->tpm_property) < value->count) {
   3653     return TPM_RC_INSUFFICIENT;
   3654   }
   3655   for (uint32_t i = 0; i < value->count; ++i) {
   3656     result = Parse_TPMS_TAGGED_PROPERTY(buffer, &value->tpm_property[i],
   3657                                         value_bytes);
   3658     if (result) {
   3659       return result;
   3660     }
   3661   }
   3662   return result;
   3663 }
   3664 
   3665 TPM_RC Serialize_TPML_TAGGED_PCR_PROPERTY(const TPML_TAGGED_PCR_PROPERTY& value,
   3666                                           std::string* buffer) {
   3667   TPM_RC result = TPM_RC_SUCCESS;
   3668   VLOG(3) << __func__;
   3669 
   3670   result = Serialize_UINT32(value.count, buffer);
   3671   if (result) {
   3672     return result;
   3673   }
   3674 
   3675   if (arraysize(value.pcr_property) < value.count) {
   3676     return TPM_RC_INSUFFICIENT;
   3677   }
   3678   for (uint32_t i = 0; i < value.count; ++i) {
   3679     result = Serialize_TPMS_TAGGED_PCR_SELECT(value.pcr_property[i], buffer);
   3680     if (result) {
   3681       return result;
   3682     }
   3683   }
   3684   return result;
   3685 }
   3686 
   3687 TPM_RC Parse_TPML_TAGGED_PCR_PROPERTY(std::string* buffer,
   3688                                       TPML_TAGGED_PCR_PROPERTY* value,
   3689                                       std::string* value_bytes) {
   3690   TPM_RC result = TPM_RC_SUCCESS;
   3691   VLOG(3) << __func__;
   3692 
   3693   result = Parse_UINT32(buffer, &value->count, value_bytes);
   3694   if (result) {
   3695     return result;
   3696   }
   3697 
   3698   if (arraysize(value->pcr_property) < value->count) {
   3699     return TPM_RC_INSUFFICIENT;
   3700   }
   3701   for (uint32_t i = 0; i < value->count; ++i) {
   3702     result = Parse_TPMS_TAGGED_PCR_SELECT(buffer, &value->pcr_property[i],
   3703                                           value_bytes);
   3704     if (result) {
   3705       return result;
   3706     }
   3707   }
   3708   return result;
   3709 }
   3710 
   3711 TPM_RC Serialize_TPML_ECC_CURVE(const TPML_ECC_CURVE& value,
   3712                                 std::string* buffer) {
   3713   TPM_RC result = TPM_RC_SUCCESS;
   3714   VLOG(3) << __func__;
   3715 
   3716   result = Serialize_UINT32(value.count, buffer);
   3717   if (result) {
   3718     return result;
   3719   }
   3720 
   3721   if (arraysize(value.ecc_curves) < value.count) {
   3722     return TPM_RC_INSUFFICIENT;
   3723   }
   3724   for (uint32_t i = 0; i < value.count; ++i) {
   3725     result = Serialize_TPM_ECC_CURVE(value.ecc_curves[i], buffer);
   3726     if (result) {
   3727       return result;
   3728     }
   3729   }
   3730   return result;
   3731 }
   3732 
   3733 TPM_RC Parse_TPML_ECC_CURVE(std::string* buffer,
   3734                             TPML_ECC_CURVE* value,
   3735                             std::string* value_bytes) {
   3736   TPM_RC result = TPM_RC_SUCCESS;
   3737   VLOG(3) << __func__;
   3738 
   3739   result = Parse_UINT32(buffer, &value->count, value_bytes);
   3740   if (result) {
   3741     return result;
   3742   }
   3743 
   3744   if (arraysize(value->ecc_curves) < value->count) {
   3745     return TPM_RC_INSUFFICIENT;
   3746   }
   3747   for (uint32_t i = 0; i < value->count; ++i) {
   3748     result = Parse_TPM_ECC_CURVE(buffer, &value->ecc_curves[i], value_bytes);
   3749     if (result) {
   3750       return result;
   3751     }
   3752   }
   3753   return result;
   3754 }
   3755 
   3756 TPM_RC Serialize_TPMU_CAPABILITIES(const TPMU_CAPABILITIES& value,
   3757                                    TPM_CAP selector,
   3758                                    std::string* buffer) {
   3759   TPM_RC result = TPM_RC_SUCCESS;
   3760   VLOG(3) << __func__;
   3761 
   3762   if (selector == TPM_CAP_PCRS) {
   3763     result = Serialize_TPML_PCR_SELECTION(value.assigned_pcr, buffer);
   3764     if (result) {
   3765       return result;
   3766     }
   3767   }
   3768 
   3769   if (selector == TPM_CAP_TPM_PROPERTIES) {
   3770     result = Serialize_TPML_TAGGED_TPM_PROPERTY(value.tpm_properties, buffer);
   3771     if (result) {
   3772       return result;
   3773     }
   3774   }
   3775 
   3776   if (selector == TPM_CAP_PP_COMMANDS) {
   3777     result = Serialize_TPML_CC(value.pp_commands, buffer);
   3778     if (result) {
   3779       return result;
   3780     }
   3781   }
   3782 
   3783   if (selector == TPM_CAP_AUDIT_COMMANDS) {
   3784     result = Serialize_TPML_CC(value.audit_commands, buffer);
   3785     if (result) {
   3786       return result;
   3787     }
   3788   }
   3789 
   3790   if (selector == TPM_CAP_COMMANDS) {
   3791     result = Serialize_TPML_CCA(value.command, buffer);
   3792     if (result) {
   3793       return result;
   3794     }
   3795   }
   3796 
   3797   if (selector == TPM_CAP_ECC_CURVES) {
   3798     result = Serialize_TPML_ECC_CURVE(value.ecc_curves, buffer);
   3799     if (result) {
   3800       return result;
   3801     }
   3802   }
   3803 
   3804   if (selector == TPM_CAP_PCR_PROPERTIES) {
   3805     result = Serialize_TPML_TAGGED_PCR_PROPERTY(value.pcr_properties, buffer);
   3806     if (result) {
   3807       return result;
   3808     }
   3809   }
   3810 
   3811   if (selector == TPM_CAP_HANDLES) {
   3812     result = Serialize_TPML_HANDLE(value.handles, buffer);
   3813     if (result) {
   3814       return result;
   3815     }
   3816   }
   3817 
   3818   if (selector == TPM_CAP_ALGS) {
   3819     result = Serialize_TPML_ALG_PROPERTY(value.algorithms, buffer);
   3820     if (result) {
   3821       return result;
   3822     }
   3823   }
   3824   return result;
   3825 }
   3826 
   3827 TPM_RC Parse_TPMU_CAPABILITIES(std::string* buffer,
   3828                                TPM_CAP selector,
   3829                                TPMU_CAPABILITIES* value,
   3830                                std::string* value_bytes) {
   3831   TPM_RC result = TPM_RC_SUCCESS;
   3832   VLOG(3) << __func__;
   3833 
   3834   if (selector == TPM_CAP_PCRS) {
   3835     result =
   3836         Parse_TPML_PCR_SELECTION(buffer, &value->assigned_pcr, value_bytes);
   3837     if (result) {
   3838       return result;
   3839     }
   3840   }
   3841 
   3842   if (selector == TPM_CAP_TPM_PROPERTIES) {
   3843     result = Parse_TPML_TAGGED_TPM_PROPERTY(buffer, &value->tpm_properties,
   3844                                             value_bytes);
   3845     if (result) {
   3846       return result;
   3847     }
   3848   }
   3849 
   3850   if (selector == TPM_CAP_PP_COMMANDS) {
   3851     result = Parse_TPML_CC(buffer, &value->pp_commands, value_bytes);
   3852     if (result) {
   3853       return result;
   3854     }
   3855   }
   3856 
   3857   if (selector == TPM_CAP_AUDIT_COMMANDS) {
   3858     result = Parse_TPML_CC(buffer, &value->audit_commands, value_bytes);
   3859     if (result) {
   3860       return result;
   3861     }
   3862   }
   3863 
   3864   if (selector == TPM_CAP_COMMANDS) {
   3865     result = Parse_TPML_CCA(buffer, &value->command, value_bytes);
   3866     if (result) {
   3867       return result;
   3868     }
   3869   }
   3870 
   3871   if (selector == TPM_CAP_ECC_CURVES) {
   3872     result = Parse_TPML_ECC_CURVE(buffer, &value->ecc_curves, value_bytes);
   3873     if (result) {
   3874       return result;
   3875     }
   3876   }
   3877 
   3878   if (selector == TPM_CAP_PCR_PROPERTIES) {
   3879     result = Parse_TPML_TAGGED_PCR_PROPERTY(buffer, &value->pcr_properties,
   3880                                             value_bytes);
   3881     if (result) {
   3882       return result;
   3883     }
   3884   }
   3885 
   3886   if (selector == TPM_CAP_HANDLES) {
   3887     result = Parse_TPML_HANDLE(buffer, &value->handles, value_bytes);
   3888     if (result) {
   3889       return result;
   3890     }
   3891   }
   3892 
   3893   if (selector == TPM_CAP_ALGS) {
   3894     result = Parse_TPML_ALG_PROPERTY(buffer, &value->algorithms, value_bytes);
   3895     if (result) {
   3896       return result;
   3897     }
   3898   }
   3899   return result;
   3900 }
   3901 
   3902 TPM_RC Serialize_TPMS_CAPABILITY_DATA(const TPMS_CAPABILITY_DATA& value,
   3903                                       std::string* buffer) {
   3904   TPM_RC result = TPM_RC_SUCCESS;
   3905   VLOG(3) << __func__;
   3906 
   3907   result = Serialize_TPM_CAP(value.capability, buffer);
   3908   if (result) {
   3909     return result;
   3910   }
   3911 
   3912   result = Serialize_TPMU_CAPABILITIES(value.data, value.capability, buffer);
   3913   if (result) {
   3914     return result;
   3915   }
   3916   return result;
   3917 }
   3918 
   3919 TPM_RC Parse_TPMS_CAPABILITY_DATA(std::string* buffer,
   3920                                   TPMS_CAPABILITY_DATA* value,
   3921                                   std::string* value_bytes) {
   3922   TPM_RC result = TPM_RC_SUCCESS;
   3923   VLOG(3) << __func__;
   3924 
   3925   result = Parse_TPM_CAP(buffer, &value->capability, value_bytes);
   3926   if (result) {
   3927     return result;
   3928   }
   3929 
   3930   result = Parse_TPMU_CAPABILITIES(buffer, value->capability, &value->data,
   3931                                    value_bytes);
   3932   if (result) {
   3933     return result;
   3934   }
   3935   return result;
   3936 }
   3937 
   3938 TPM_RC Serialize_TPMS_CLOCK_INFO(const TPMS_CLOCK_INFO& value,
   3939                                  std::string* buffer) {
   3940   TPM_RC result = TPM_RC_SUCCESS;
   3941   VLOG(3) << __func__;
   3942 
   3943   result = Serialize_UINT64(value.clock, buffer);
   3944   if (result) {
   3945     return result;
   3946   }
   3947 
   3948   result = Serialize_UINT32(value.reset_count, buffer);
   3949   if (result) {
   3950     return result;
   3951   }
   3952 
   3953   result = Serialize_UINT32(value.restart_count, buffer);
   3954   if (result) {
   3955     return result;
   3956   }
   3957 
   3958   result = Serialize_TPMI_YES_NO(value.safe, buffer);
   3959   if (result) {
   3960     return result;
   3961   }
   3962   return result;
   3963 }
   3964 
   3965 TPM_RC Parse_TPMS_CLOCK_INFO(std::string* buffer,
   3966                              TPMS_CLOCK_INFO* value,
   3967                              std::string* value_bytes) {
   3968   TPM_RC result = TPM_RC_SUCCESS;
   3969   VLOG(3) << __func__;
   3970 
   3971   result = Parse_UINT64(buffer, &value->clock, value_bytes);
   3972   if (result) {
   3973     return result;
   3974   }
   3975 
   3976   result = Parse_UINT32(buffer, &value->reset_count, value_bytes);
   3977   if (result) {
   3978     return result;
   3979   }
   3980 
   3981   result = Parse_UINT32(buffer, &value->restart_count, value_bytes);
   3982   if (result) {
   3983     return result;
   3984   }
   3985 
   3986   result = Parse_TPMI_YES_NO(buffer, &value->safe, value_bytes);
   3987   if (result) {
   3988     return result;
   3989   }
   3990   return result;
   3991 }
   3992 
   3993 TPM_RC Serialize_TPMS_TIME_INFO(const TPMS_TIME_INFO& value,
   3994                                 std::string* buffer) {
   3995   TPM_RC result = TPM_RC_SUCCESS;
   3996   VLOG(3) << __func__;
   3997 
   3998   result = Serialize_UINT64(value.time, buffer);
   3999   if (result) {
   4000     return result;
   4001   }
   4002 
   4003   result = Serialize_TPMS_CLOCK_INFO(value.clock_info, buffer);
   4004   if (result) {
   4005     return result;
   4006   }
   4007   return result;
   4008 }
   4009 
   4010 TPM_RC Parse_TPMS_TIME_INFO(std::string* buffer,
   4011                             TPMS_TIME_INFO* value,
   4012                             std::string* value_bytes) {
   4013   TPM_RC result = TPM_RC_SUCCESS;
   4014   VLOG(3) << __func__;
   4015 
   4016   result = Parse_UINT64(buffer, &value->time, value_bytes);
   4017   if (result) {
   4018     return result;
   4019   }
   4020 
   4021   result = Parse_TPMS_CLOCK_INFO(buffer, &value->clock_info, value_bytes);
   4022   if (result) {
   4023     return result;
   4024   }
   4025   return result;
   4026 }
   4027 
   4028 TPM_RC Serialize_TPMS_TIME_ATTEST_INFO(const TPMS_TIME_ATTEST_INFO& value,
   4029                                        std::string* buffer) {
   4030   TPM_RC result = TPM_RC_SUCCESS;
   4031   VLOG(3) << __func__;
   4032 
   4033   result = Serialize_TPMS_TIME_INFO(value.time, buffer);
   4034   if (result) {
   4035     return result;
   4036   }
   4037 
   4038   result = Serialize_UINT64(value.firmware_version, buffer);
   4039   if (result) {
   4040     return result;
   4041   }
   4042   return result;
   4043 }
   4044 
   4045 TPM_RC Parse_TPMS_TIME_ATTEST_INFO(std::string* buffer,
   4046                                    TPMS_TIME_ATTEST_INFO* value,
   4047                                    std::string* value_bytes) {
   4048   TPM_RC result = TPM_RC_SUCCESS;
   4049   VLOG(3) << __func__;
   4050 
   4051   result = Parse_TPMS_TIME_INFO(buffer, &value->time, value_bytes);
   4052   if (result) {
   4053     return result;
   4054   }
   4055 
   4056   result = Parse_UINT64(buffer, &value->firmware_version, value_bytes);
   4057   if (result) {
   4058     return result;
   4059   }
   4060   return result;
   4061 }
   4062 
   4063 TPM_RC Serialize_TPMS_CERTIFY_INFO(const TPMS_CERTIFY_INFO& value,
   4064                                    std::string* buffer) {
   4065   TPM_RC result = TPM_RC_SUCCESS;
   4066   VLOG(3) << __func__;
   4067 
   4068   result = Serialize_TPM2B_NAME(value.name, buffer);
   4069   if (result) {
   4070     return result;
   4071   }
   4072 
   4073   result = Serialize_TPM2B_NAME(value.qualified_name, buffer);
   4074   if (result) {
   4075     return result;
   4076   }
   4077   return result;
   4078 }
   4079 
   4080 TPM_RC Parse_TPMS_CERTIFY_INFO(std::string* buffer,
   4081                                TPMS_CERTIFY_INFO* value,
   4082                                std::string* value_bytes) {
   4083   TPM_RC result = TPM_RC_SUCCESS;
   4084   VLOG(3) << __func__;
   4085 
   4086   result = Parse_TPM2B_NAME(buffer, &value->name, value_bytes);
   4087   if (result) {
   4088     return result;
   4089   }
   4090 
   4091   result = Parse_TPM2B_NAME(buffer, &value->qualified_name, value_bytes);
   4092   if (result) {
   4093     return result;
   4094   }
   4095   return result;
   4096 }
   4097 
   4098 TPM_RC Serialize_TPMS_QUOTE_INFO(const TPMS_QUOTE_INFO& value,
   4099                                  std::string* buffer) {
   4100   TPM_RC result = TPM_RC_SUCCESS;
   4101   VLOG(3) << __func__;
   4102 
   4103   result = Serialize_TPML_PCR_SELECTION(value.pcr_select, buffer);
   4104   if (result) {
   4105     return result;
   4106   }
   4107 
   4108   result = Serialize_TPM2B_DIGEST(value.pcr_digest, buffer);
   4109   if (result) {
   4110     return result;
   4111   }
   4112   return result;
   4113 }
   4114 
   4115 TPM_RC Parse_TPMS_QUOTE_INFO(std::string* buffer,
   4116                              TPMS_QUOTE_INFO* value,
   4117                              std::string* value_bytes) {
   4118   TPM_RC result = TPM_RC_SUCCESS;
   4119   VLOG(3) << __func__;
   4120 
   4121   result = Parse_TPML_PCR_SELECTION(buffer, &value->pcr_select, value_bytes);
   4122   if (result) {
   4123     return result;
   4124   }
   4125 
   4126   result = Parse_TPM2B_DIGEST(buffer, &value->pcr_digest, value_bytes);
   4127   if (result) {
   4128     return result;
   4129   }
   4130   return result;
   4131 }
   4132 
   4133 TPM_RC Serialize_TPMS_COMMAND_AUDIT_INFO(const TPMS_COMMAND_AUDIT_INFO& value,
   4134                                          std::string* buffer) {
   4135   TPM_RC result = TPM_RC_SUCCESS;
   4136   VLOG(3) << __func__;
   4137 
   4138   result = Serialize_UINT64(value.audit_counter, buffer);
   4139   if (result) {
   4140     return result;
   4141   }
   4142 
   4143   result = Serialize_TPM_ALG_ID(value.digest_alg, buffer);
   4144   if (result) {
   4145     return result;
   4146   }
   4147 
   4148   result = Serialize_TPM2B_DIGEST(value.audit_digest, buffer);
   4149   if (result) {
   4150     return result;
   4151   }
   4152 
   4153   result = Serialize_TPM2B_DIGEST(value.command_digest, buffer);
   4154   if (result) {
   4155     return result;
   4156   }
   4157   return result;
   4158 }
   4159 
   4160 TPM_RC Parse_TPMS_COMMAND_AUDIT_INFO(std::string* buffer,
   4161                                      TPMS_COMMAND_AUDIT_INFO* value,
   4162                                      std::string* value_bytes) {
   4163   TPM_RC result = TPM_RC_SUCCESS;
   4164   VLOG(3) << __func__;
   4165 
   4166   result = Parse_UINT64(buffer, &value->audit_counter, value_bytes);
   4167   if (result) {
   4168     return result;
   4169   }
   4170 
   4171   result = Parse_TPM_ALG_ID(buffer, &value->digest_alg, value_bytes);
   4172   if (result) {
   4173     return result;
   4174   }
   4175 
   4176   result = Parse_TPM2B_DIGEST(buffer, &value->audit_digest, value_bytes);
   4177   if (result) {
   4178     return result;
   4179   }
   4180 
   4181   result = Parse_TPM2B_DIGEST(buffer, &value->command_digest, value_bytes);
   4182   if (result) {
   4183     return result;
   4184   }
   4185   return result;
   4186 }
   4187 
   4188 TPM_RC Serialize_TPMS_SESSION_AUDIT_INFO(const TPMS_SESSION_AUDIT_INFO& value,
   4189                                          std::string* buffer) {
   4190   TPM_RC result = TPM_RC_SUCCESS;
   4191   VLOG(3) << __func__;
   4192 
   4193   result = Serialize_TPMI_YES_NO(value.exclusive_session, buffer);
   4194   if (result) {
   4195     return result;
   4196   }
   4197 
   4198   result = Serialize_TPM2B_DIGEST(value.session_digest, buffer);
   4199   if (result) {
   4200     return result;
   4201   }
   4202   return result;
   4203 }
   4204 
   4205 TPM_RC Parse_TPMS_SESSION_AUDIT_INFO(std::string* buffer,
   4206                                      TPMS_SESSION_AUDIT_INFO* value,
   4207                                      std::string* value_bytes) {
   4208   TPM_RC result = TPM_RC_SUCCESS;
   4209   VLOG(3) << __func__;
   4210 
   4211   result = Parse_TPMI_YES_NO(buffer, &value->exclusive_session, value_bytes);
   4212   if (result) {
   4213     return result;
   4214   }
   4215 
   4216   result = Parse_TPM2B_DIGEST(buffer, &value->session_digest, value_bytes);
   4217   if (result) {
   4218     return result;
   4219   }
   4220   return result;
   4221 }
   4222 
   4223 TPM_RC Serialize_TPMS_CREATION_INFO(const TPMS_CREATION_INFO& value,
   4224                                     std::string* buffer) {
   4225   TPM_RC result = TPM_RC_SUCCESS;
   4226   VLOG(3) << __func__;
   4227 
   4228   result = Serialize_TPM2B_NAME(value.object_name, buffer);
   4229   if (result) {
   4230     return result;
   4231   }
   4232 
   4233   result = Serialize_TPM2B_DIGEST(value.creation_hash, buffer);
   4234   if (result) {
   4235     return result;
   4236   }
   4237   return result;
   4238 }
   4239 
   4240 TPM_RC Parse_TPMS_CREATION_INFO(std::string* buffer,
   4241                                 TPMS_CREATION_INFO* value,
   4242                                 std::string* value_bytes) {
   4243   TPM_RC result = TPM_RC_SUCCESS;
   4244   VLOG(3) << __func__;
   4245 
   4246   result = Parse_TPM2B_NAME(buffer, &value->object_name, value_bytes);
   4247   if (result) {
   4248     return result;
   4249   }
   4250 
   4251   result = Parse_TPM2B_DIGEST(buffer, &value->creation_hash, value_bytes);
   4252   if (result) {
   4253     return result;
   4254   }
   4255   return result;
   4256 }
   4257 
   4258 TPM_RC Serialize_TPMS_NV_CERTIFY_INFO(const TPMS_NV_CERTIFY_INFO& value,
   4259                                       std::string* buffer) {
   4260   TPM_RC result = TPM_RC_SUCCESS;
   4261   VLOG(3) << __func__;
   4262 
   4263   result = Serialize_TPM2B_NAME(value.index_name, buffer);
   4264   if (result) {
   4265     return result;
   4266   }
   4267 
   4268   result = Serialize_UINT16(value.offset, buffer);
   4269   if (result) {
   4270     return result;
   4271   }
   4272 
   4273   result = Serialize_TPM2B_MAX_NV_BUFFER(value.nv_contents, buffer);
   4274   if (result) {
   4275     return result;
   4276   }
   4277   return result;
   4278 }
   4279 
   4280 TPM_RC Parse_TPMS_NV_CERTIFY_INFO(std::string* buffer,
   4281                                   TPMS_NV_CERTIFY_INFO* value,
   4282                                   std::string* value_bytes) {
   4283   TPM_RC result = TPM_RC_SUCCESS;
   4284   VLOG(3) << __func__;
   4285 
   4286   result = Parse_TPM2B_NAME(buffer, &value->index_name, value_bytes);
   4287   if (result) {
   4288     return result;
   4289   }
   4290 
   4291   result = Parse_UINT16(buffer, &value->offset, value_bytes);
   4292   if (result) {
   4293     return result;
   4294   }
   4295 
   4296   result = Parse_TPM2B_MAX_NV_BUFFER(buffer, &value->nv_contents, value_bytes);
   4297   if (result) {
   4298     return result;
   4299   }
   4300   return result;
   4301 }
   4302 
   4303 TPM_RC Serialize_TPMU_ATTEST(const TPMU_ATTEST& value,
   4304                              TPMI_ST_ATTEST selector,
   4305                              std::string* buffer) {
   4306   TPM_RC result = TPM_RC_SUCCESS;
   4307   VLOG(3) << __func__;
   4308 
   4309   if (selector == TPM_ST_ATTEST_SESSION_AUDIT) {
   4310     result = Serialize_TPMS_SESSION_AUDIT_INFO(value.session_audit, buffer);
   4311     if (result) {
   4312       return result;
   4313     }
   4314   }
   4315 
   4316   if (selector == TPM_ST_ATTEST_QUOTE) {
   4317     result = Serialize_TPMS_QUOTE_INFO(value.quote, buffer);
   4318     if (result) {
   4319       return result;
   4320     }
   4321   }
   4322 
   4323   if (selector == TPM_ST_ATTEST_COMMAND_AUDIT) {
   4324     result = Serialize_TPMS_COMMAND_AUDIT_INFO(value.command_audit, buffer);
   4325     if (result) {
   4326       return result;
   4327     }
   4328   }
   4329 
   4330   if (selector == TPM_ST_ATTEST_CERTIFY) {
   4331     result = Serialize_TPMS_CERTIFY_INFO(value.certify, buffer);
   4332     if (result) {
   4333       return result;
   4334     }
   4335   }
   4336 
   4337   if (selector == TPM_ST_ATTEST_NV) {
   4338     result = Serialize_TPMS_NV_CERTIFY_INFO(value.nv, buffer);
   4339     if (result) {
   4340       return result;
   4341     }
   4342   }
   4343 
   4344   if (selector == TPM_ST_ATTEST_TIME) {
   4345     result = Serialize_TPMS_TIME_ATTEST_INFO(value.time, buffer);
   4346     if (result) {
   4347       return result;
   4348     }
   4349   }
   4350 
   4351   if (selector == TPM_ST_ATTEST_CREATION) {
   4352     result = Serialize_TPMS_CREATION_INFO(value.creation, buffer);
   4353     if (result) {
   4354       return result;
   4355     }
   4356   }
   4357   return result;
   4358 }
   4359 
   4360 TPM_RC Parse_TPMU_ATTEST(std::string* buffer,
   4361                          TPMI_ST_ATTEST selector,
   4362                          TPMU_ATTEST* value,
   4363                          std::string* value_bytes) {
   4364   TPM_RC result = TPM_RC_SUCCESS;
   4365   VLOG(3) << __func__;
   4366 
   4367   if (selector == TPM_ST_ATTEST_SESSION_AUDIT) {
   4368     result = Parse_TPMS_SESSION_AUDIT_INFO(buffer, &value->session_audit,
   4369                                            value_bytes);
   4370     if (result) {
   4371       return result;
   4372     }
   4373   }
   4374 
   4375   if (selector == TPM_ST_ATTEST_QUOTE) {
   4376     result = Parse_TPMS_QUOTE_INFO(buffer, &value->quote, value_bytes);
   4377     if (result) {
   4378       return result;
   4379     }
   4380   }
   4381 
   4382   if (selector == TPM_ST_ATTEST_COMMAND_AUDIT) {
   4383     result = Parse_TPMS_COMMAND_AUDIT_INFO(buffer, &value->command_audit,
   4384                                            value_bytes);
   4385     if (result) {
   4386       return result;
   4387     }
   4388   }
   4389 
   4390   if (selector == TPM_ST_ATTEST_CERTIFY) {
   4391     result = Parse_TPMS_CERTIFY_INFO(buffer, &value->certify, value_bytes);
   4392     if (result) {
   4393       return result;
   4394     }
   4395   }
   4396 
   4397   if (selector == TPM_ST_ATTEST_NV) {
   4398     result = Parse_TPMS_NV_CERTIFY_INFO(buffer, &value->nv, value_bytes);
   4399     if (result) {
   4400       return result;
   4401     }
   4402   }
   4403 
   4404   if (selector == TPM_ST_ATTEST_TIME) {
   4405     result = Parse_TPMS_TIME_ATTEST_INFO(buffer, &value->time, value_bytes);
   4406     if (result) {
   4407       return result;
   4408     }
   4409   }
   4410 
   4411   if (selector == TPM_ST_ATTEST_CREATION) {
   4412     result = Parse_TPMS_CREATION_INFO(buffer, &value->creation, value_bytes);
   4413     if (result) {
   4414       return result;
   4415     }
   4416   }
   4417   return result;
   4418 }
   4419 
   4420 TPM_RC Serialize_TPMS_ATTEST(const TPMS_ATTEST& value, std::string* buffer) {
   4421   TPM_RC result = TPM_RC_SUCCESS;
   4422   VLOG(3) << __func__;
   4423 
   4424   result = Serialize_TPM_GENERATED(value.magic, buffer);
   4425   if (result) {
   4426     return result;
   4427   }
   4428 
   4429   result = Serialize_TPMI_ST_ATTEST(value.type, buffer);
   4430   if (result) {
   4431     return result;
   4432   }
   4433 
   4434   result = Serialize_TPM2B_NAME(value.qualified_signer, buffer);
   4435   if (result) {
   4436     return result;
   4437   }
   4438 
   4439   result = Serialize_TPM2B_DATA(value.extra_data, buffer);
   4440   if (result) {
   4441     return result;
   4442   }
   4443 
   4444   result = Serialize_TPMS_CLOCK_INFO(value.clock_info, buffer);
   4445   if (result) {
   4446     return result;
   4447   }
   4448 
   4449   result = Serialize_UINT64(value.firmware_version, buffer);
   4450   if (result) {
   4451     return result;
   4452   }
   4453 
   4454   result = Serialize_TPMU_ATTEST(value.attested, value.type, buffer);
   4455   if (result) {
   4456     return result;
   4457   }
   4458   return result;
   4459 }
   4460 
   4461 TPM_RC Parse_TPMS_ATTEST(std::string* buffer,
   4462                          TPMS_ATTEST* value,
   4463                          std::string* value_bytes) {
   4464   TPM_RC result = TPM_RC_SUCCESS;
   4465   VLOG(3) << __func__;
   4466 
   4467   result = Parse_TPM_GENERATED(buffer, &value->magic, value_bytes);
   4468   if (result) {
   4469     return result;
   4470   }
   4471 
   4472   result = Parse_TPMI_ST_ATTEST(buffer, &value->type, value_bytes);
   4473   if (result) {
   4474     return result;
   4475   }
   4476 
   4477   result = Parse_TPM2B_NAME(buffer, &value->qualified_signer, value_bytes);
   4478   if (result) {
   4479     return result;
   4480   }
   4481 
   4482   result = Parse_TPM2B_DATA(buffer, &value->extra_data, value_bytes);
   4483   if (result) {
   4484     return result;
   4485   }
   4486 
   4487   result = Parse_TPMS_CLOCK_INFO(buffer, &value->clock_info, value_bytes);
   4488   if (result) {
   4489     return result;
   4490   }
   4491 
   4492   result = Parse_UINT64(buffer, &value->firmware_version, value_bytes);
   4493   if (result) {
   4494     return result;
   4495   }
   4496 
   4497   result =
   4498       Parse_TPMU_ATTEST(buffer, value->type, &value->attested, value_bytes);
   4499   if (result) {
   4500     return result;
   4501   }
   4502   return result;
   4503 }
   4504 
   4505 TPM_RC Serialize_TPM2B_ATTEST(const TPM2B_ATTEST& value, std::string* buffer) {
   4506   TPM_RC result = TPM_RC_SUCCESS;
   4507   VLOG(3) << __func__;
   4508 
   4509   result = Serialize_UINT16(value.size, buffer);
   4510   if (result) {
   4511     return result;
   4512   }
   4513 
   4514   if (arraysize(value.attestation_data) < value.size) {
   4515     return TPM_RC_INSUFFICIENT;
   4516   }
   4517   for (uint32_t i = 0; i < value.size; ++i) {
   4518     result = Serialize_BYTE(value.attestation_data[i], buffer);
   4519     if (result) {
   4520       return result;
   4521     }
   4522   }
   4523   return result;
   4524 }
   4525 
   4526 TPM_RC Parse_TPM2B_ATTEST(std::string* buffer,
   4527                           TPM2B_ATTEST* value,
   4528                           std::string* value_bytes) {
   4529   TPM_RC result = TPM_RC_SUCCESS;
   4530   VLOG(3) << __func__;
   4531 
   4532   result = Parse_UINT16(buffer, &value->size, value_bytes);
   4533   if (result) {
   4534     return result;
   4535   }
   4536 
   4537   if (arraysize(value->attestation_data) < value->size) {
   4538     return TPM_RC_INSUFFICIENT;
   4539   }
   4540   for (uint32_t i = 0; i < value->size; ++i) {
   4541     result = Parse_BYTE(buffer, &value->attestation_data[i], value_bytes);
   4542     if (result) {
   4543       return result;
   4544     }
   4545   }
   4546   return result;
   4547 }
   4548 
   4549 TPM2B_ATTEST Make_TPM2B_ATTEST(const std::string& bytes) {
   4550   TPM2B_ATTEST tpm2b;
   4551   CHECK(bytes.size() <= sizeof(tpm2b.attestation_data));
   4552   memset(&tpm2b, 0, sizeof(TPM2B_ATTEST));
   4553   tpm2b.size = bytes.size();
   4554   memcpy(tpm2b.attestation_data, bytes.data(), bytes.size());
   4555   return tpm2b;
   4556 }
   4557 
   4558 std::string StringFrom_TPM2B_ATTEST(const TPM2B_ATTEST& tpm2b) {
   4559   const char* char_buffer =
   4560       reinterpret_cast<const char*>(tpm2b.attestation_data);
   4561   return std::string(char_buffer, tpm2b.size);
   4562 }
   4563 
   4564 TPM_RC Serialize_TPMS_AUTH_COMMAND(const TPMS_AUTH_COMMAND& value,
   4565                                    std::string* buffer) {
   4566   TPM_RC result = TPM_RC_SUCCESS;
   4567   VLOG(3) << __func__;
   4568 
   4569   result = Serialize_TPMI_SH_AUTH_SESSION(value.session_handle, buffer);
   4570   if (result) {
   4571     return result;
   4572   }
   4573 
   4574   result = Serialize_TPM2B_NONCE(value.nonce, buffer);
   4575   if (result) {
   4576     return result;
   4577   }
   4578 
   4579   result = Serialize_TPMA_SESSION(value.session_attributes, buffer);
   4580   if (result) {
   4581     return result;
   4582   }
   4583 
   4584   result = Serialize_TPM2B_AUTH(value.hmac, buffer);
   4585   if (result) {
   4586     return result;
   4587   }
   4588   return result;
   4589 }
   4590 
   4591 TPM_RC Parse_TPMS_AUTH_COMMAND(std::string* buffer,
   4592                                TPMS_AUTH_COMMAND* value,
   4593                                std::string* value_bytes) {
   4594   TPM_RC result = TPM_RC_SUCCESS;
   4595   VLOG(3) << __func__;
   4596 
   4597   result =
   4598       Parse_TPMI_SH_AUTH_SESSION(buffer, &value->session_handle, value_bytes);
   4599   if (result) {
   4600     return result;
   4601   }
   4602 
   4603   result = Parse_TPM2B_NONCE(buffer, &value->nonce, value_bytes);
   4604   if (result) {
   4605     return result;
   4606   }
   4607 
   4608   result = Parse_TPMA_SESSION(buffer, &value->session_attributes, value_bytes);
   4609   if (result) {
   4610     return result;
   4611   }
   4612 
   4613   result = Parse_TPM2B_AUTH(buffer, &value->hmac, value_bytes);
   4614   if (result) {
   4615     return result;
   4616   }
   4617   return result;
   4618 }
   4619 
   4620 TPM_RC Serialize_TPMS_AUTH_RESPONSE(const TPMS_AUTH_RESPONSE& value,
   4621                                     std::string* buffer) {
   4622   TPM_RC result = TPM_RC_SUCCESS;
   4623   VLOG(3) << __func__;
   4624 
   4625   result = Serialize_TPM2B_NONCE(value.nonce, buffer);
   4626   if (result) {
   4627     return result;
   4628   }
   4629 
   4630   result = Serialize_TPMA_SESSION(value.session_attributes, buffer);
   4631   if (result) {
   4632     return result;
   4633   }
   4634 
   4635   result = Serialize_TPM2B_AUTH(value.hmac, buffer);
   4636   if (result) {
   4637     return result;
   4638   }
   4639   return result;
   4640 }
   4641 
   4642 TPM_RC Parse_TPMS_AUTH_RESPONSE(std::string* buffer,
   4643                                 TPMS_AUTH_RESPONSE* value,
   4644                                 std::string* value_bytes) {
   4645   TPM_RC result = TPM_RC_SUCCESS;
   4646   VLOG(3) << __func__;
   4647 
   4648   result = Parse_TPM2B_NONCE(buffer, &value->nonce, value_bytes);
   4649   if (result) {
   4650     return result;
   4651   }
   4652 
   4653   result = Parse_TPMA_SESSION(buffer, &value->session_attributes, value_bytes);
   4654   if (result) {
   4655     return result;
   4656   }
   4657 
   4658   result = Parse_TPM2B_AUTH(buffer, &value->hmac, value_bytes);
   4659   if (result) {
   4660     return result;
   4661   }
   4662   return result;
   4663 }
   4664 
   4665 TPM_RC Serialize_TPMU_SYM_KEY_BITS(const TPMU_SYM_KEY_BITS& value,
   4666                                    TPMI_ALG_SYM selector,
   4667                                    std::string* buffer) {
   4668   TPM_RC result = TPM_RC_SUCCESS;
   4669   VLOG(3) << __func__;
   4670 
   4671   if (selector == TPM_ALG_NULL) {
   4672     // Do nothing.
   4673   }
   4674 
   4675   if (selector == TPM_ALG_SM4) {
   4676     result = Serialize_TPMI_SM4_KEY_BITS(value.sm4, buffer);
   4677     if (result) {
   4678       return result;
   4679     }
   4680   }
   4681 
   4682   if (selector == TPM_ALG_AES) {
   4683     result = Serialize_TPMI_AES_KEY_BITS(value.aes, buffer);
   4684     if (result) {
   4685       return result;
   4686     }
   4687   }
   4688 
   4689   if (selector == TPM_ALG_XOR) {
   4690     result = Serialize_TPMI_ALG_HASH(value.xor_, buffer);
   4691     if (result) {
   4692       return result;
   4693     }
   4694   }
   4695   return result;
   4696 }
   4697 
   4698 TPM_RC Parse_TPMU_SYM_KEY_BITS(std::string* buffer,
   4699                                TPMI_ALG_SYM selector,
   4700                                TPMU_SYM_KEY_BITS* value,
   4701                                std::string* value_bytes) {
   4702   TPM_RC result = TPM_RC_SUCCESS;
   4703   VLOG(3) << __func__;
   4704 
   4705   if (selector == TPM_ALG_NULL) {
   4706     // Do nothing.
   4707   }
   4708 
   4709   if (selector == TPM_ALG_SM4) {
   4710     result = Parse_TPMI_SM4_KEY_BITS(buffer, &value->sm4, value_bytes);
   4711     if (result) {
   4712       return result;
   4713     }
   4714   }
   4715 
   4716   if (selector == TPM_ALG_AES) {
   4717     result = Parse_TPMI_AES_KEY_BITS(buffer, &value->aes, value_bytes);
   4718     if (result) {
   4719       return result;
   4720     }
   4721   }
   4722 
   4723   if (selector == TPM_ALG_XOR) {
   4724     result = Parse_TPMI_ALG_HASH(buffer, &value->xor_, value_bytes);
   4725     if (result) {
   4726       return result;
   4727     }
   4728   }
   4729   return result;
   4730 }
   4731 
   4732 TPM_RC Serialize_TPMU_SYM_MODE(const TPMU_SYM_MODE& value,
   4733                                TPMI_ALG_SYM selector,
   4734                                std::string* buffer) {
   4735   TPM_RC result = TPM_RC_SUCCESS;
   4736   VLOG(3) << __func__;
   4737 
   4738   if (selector == TPM_ALG_NULL) {
   4739     // Do nothing.
   4740   }
   4741 
   4742   if (selector == TPM_ALG_SM4) {
   4743     result = Serialize_TPMI_ALG_SYM_MODE(value.sm4, buffer);
   4744     if (result) {
   4745       return result;
   4746     }
   4747   }
   4748 
   4749   if (selector == TPM_ALG_AES) {
   4750     result = Serialize_TPMI_ALG_SYM_MODE(value.aes, buffer);
   4751     if (result) {
   4752       return result;
   4753     }
   4754   }
   4755 
   4756   if (selector == TPM_ALG_XOR) {
   4757     // Do nothing.
   4758   }
   4759   return result;
   4760 }
   4761 
   4762 TPM_RC Parse_TPMU_SYM_MODE(std::string* buffer,
   4763                            TPMI_ALG_SYM selector,
   4764                            TPMU_SYM_MODE* value,
   4765                            std::string* value_bytes) {
   4766   TPM_RC result = TPM_RC_SUCCESS;
   4767   VLOG(3) << __func__;
   4768 
   4769   if (selector == TPM_ALG_NULL) {
   4770     // Do nothing.
   4771   }
   4772 
   4773   if (selector == TPM_ALG_SM4) {
   4774     result = Parse_TPMI_ALG_SYM_MODE(buffer, &value->sm4, value_bytes);
   4775     if (result) {
   4776       return result;
   4777     }
   4778   }
   4779 
   4780   if (selector == TPM_ALG_AES) {
   4781     result = Parse_TPMI_ALG_SYM_MODE(buffer, &value->aes, value_bytes);
   4782     if (result) {
   4783       return result;
   4784     }
   4785   }
   4786 
   4787   if (selector == TPM_ALG_XOR) {
   4788     // Do nothing.
   4789   }
   4790   return result;
   4791 }
   4792 
   4793 TPM_RC Serialize_TPMU_SYM_DETAILS(const TPMU_SYM_DETAILS& value,
   4794                                   TPMI_ALG_SYM selector,
   4795                                   std::string* buffer) {
   4796   TPM_RC result = TPM_RC_SUCCESS;
   4797   VLOG(3) << __func__;
   4798   return result;
   4799 }
   4800 
   4801 TPM_RC Parse_TPMU_SYM_DETAILS(std::string* buffer,
   4802                               TPMI_ALG_SYM selector,
   4803                               TPMU_SYM_DETAILS* value,
   4804                               std::string* value_bytes) {
   4805   TPM_RC result = TPM_RC_SUCCESS;
   4806   VLOG(3) << __func__;
   4807   return result;
   4808 }
   4809 
   4810 TPM_RC Serialize_TPMT_SYM_DEF(const TPMT_SYM_DEF& value, std::string* buffer) {
   4811   TPM_RC result = TPM_RC_SUCCESS;
   4812   VLOG(3) << __func__;
   4813 
   4814   result = Serialize_TPMI_ALG_SYM(value.algorithm, buffer);
   4815   if (result) {
   4816     return result;
   4817   }
   4818 
   4819   result = Serialize_TPMU_SYM_KEY_BITS(value.key_bits, value.algorithm, buffer);
   4820   if (result) {
   4821     return result;
   4822   }
   4823 
   4824   result = Serialize_TPMU_SYM_MODE(value.mode, value.algorithm, buffer);
   4825   if (result) {
   4826     return result;
   4827   }
   4828 
   4829   result = Serialize_TPMU_SYM_DETAILS(value.details, value.algorithm, buffer);
   4830   if (result) {
   4831     return result;
   4832   }
   4833   return result;
   4834 }
   4835 
   4836 TPM_RC Parse_TPMT_SYM_DEF(std::string* buffer,
   4837                           TPMT_SYM_DEF* value,
   4838                           std::string* value_bytes) {
   4839   TPM_RC result = TPM_RC_SUCCESS;
   4840   VLOG(3) << __func__;
   4841 
   4842   result = Parse_TPMI_ALG_SYM(buffer, &value->algorithm, value_bytes);
   4843   if (result) {
   4844     return result;
   4845   }
   4846 
   4847   result = Parse_TPMU_SYM_KEY_BITS(buffer, value->algorithm, &value->key_bits,
   4848                                    value_bytes);
   4849   if (result) {
   4850     return result;
   4851   }
   4852 
   4853   result =
   4854       Parse_TPMU_SYM_MODE(buffer, value->algorithm, &value->mode, value_bytes);
   4855   if (result) {
   4856     return result;
   4857   }
   4858 
   4859   result = Parse_TPMU_SYM_DETAILS(buffer, value->algorithm, &value->details,
   4860                                   value_bytes);
   4861   if (result) {
   4862     return result;
   4863   }
   4864   return result;
   4865 }
   4866 
   4867 TPM_RC Serialize_TPMT_SYM_DEF_OBJECT(const TPMT_SYM_DEF_OBJECT& value,
   4868                                      std::string* buffer) {
   4869   TPM_RC result = TPM_RC_SUCCESS;
   4870   VLOG(3) << __func__;
   4871 
   4872   result = Serialize_TPMI_ALG_SYM_OBJECT(value.algorithm, buffer);
   4873   if (result) {
   4874     return result;
   4875   }
   4876 
   4877   result = Serialize_TPMU_SYM_KEY_BITS(value.key_bits, value.algorithm, buffer);
   4878   if (result) {
   4879     return result;
   4880   }
   4881 
   4882   result = Serialize_TPMU_SYM_MODE(value.mode, value.algorithm, buffer);
   4883   if (result) {
   4884     return result;
   4885   }
   4886 
   4887   result = Serialize_TPMU_SYM_DETAILS(value.details, value.algorithm, buffer);
   4888   if (result) {
   4889     return result;
   4890   }
   4891   return result;
   4892 }
   4893 
   4894 TPM_RC Parse_TPMT_SYM_DEF_OBJECT(std::string* buffer,
   4895                                  TPMT_SYM_DEF_OBJECT* value,
   4896                                  std::string* value_bytes) {
   4897   TPM_RC result = TPM_RC_SUCCESS;
   4898   VLOG(3) << __func__;
   4899 
   4900   result = Parse_TPMI_ALG_SYM_OBJECT(buffer, &value->algorithm, value_bytes);
   4901   if (result) {
   4902     return result;
   4903   }
   4904 
   4905   result = Parse_TPMU_SYM_KEY_BITS(buffer, value->algorithm, &value->key_bits,
   4906                                    value_bytes);
   4907   if (result) {
   4908     return result;
   4909   }
   4910 
   4911   result =
   4912       Parse_TPMU_SYM_MODE(buffer, value->algorithm, &value->mode, value_bytes);
   4913   if (result) {
   4914     return result;
   4915   }
   4916 
   4917   result = Parse_TPMU_SYM_DETAILS(buffer, value->algorithm, &value->details,
   4918                                   value_bytes);
   4919   if (result) {
   4920     return result;
   4921   }
   4922   return result;
   4923 }
   4924 
   4925 TPM_RC Serialize_TPM2B_SYM_KEY(const TPM2B_SYM_KEY& value,
   4926                                std::string* buffer) {
   4927   TPM_RC result = TPM_RC_SUCCESS;
   4928   VLOG(3) << __func__;
   4929 
   4930   result = Serialize_UINT16(value.size, buffer);
   4931   if (result) {
   4932     return result;
   4933   }
   4934 
   4935   if (arraysize(value.buffer) < value.size) {
   4936     return TPM_RC_INSUFFICIENT;
   4937   }
   4938   for (uint32_t i = 0; i < value.size; ++i) {
   4939     result = Serialize_BYTE(value.buffer[i], buffer);
   4940     if (result) {
   4941       return result;
   4942     }
   4943   }
   4944   return result;
   4945 }
   4946 
   4947 TPM_RC Parse_TPM2B_SYM_KEY(std::string* buffer,
   4948                            TPM2B_SYM_KEY* value,
   4949                            std::string* value_bytes) {
   4950   TPM_RC result = TPM_RC_SUCCESS;
   4951   VLOG(3) << __func__;
   4952 
   4953   result = Parse_UINT16(buffer, &value->size, value_bytes);
   4954   if (result) {
   4955     return result;
   4956   }
   4957 
   4958   if (arraysize(value->buffer) < value->size) {
   4959     return TPM_RC_INSUFFICIENT;
   4960   }
   4961   for (uint32_t i = 0; i < value->size; ++i) {
   4962     result = Parse_BYTE(buffer, &value->buffer[i], value_bytes);
   4963     if (result) {
   4964       return result;
   4965     }
   4966   }
   4967   return result;
   4968 }
   4969 
   4970 TPM2B_SYM_KEY Make_TPM2B_SYM_KEY(const std::string& bytes) {
   4971   TPM2B_SYM_KEY tpm2b;
   4972   CHECK(bytes.size() <= sizeof(tpm2b.buffer));
   4973   memset(&tpm2b, 0, sizeof(TPM2B_SYM_KEY));
   4974   tpm2b.size = bytes.size();
   4975   memcpy(tpm2b.buffer, bytes.data(), bytes.size());
   4976   return tpm2b;
   4977 }
   4978 
   4979 std::string StringFrom_TPM2B_SYM_KEY(const TPM2B_SYM_KEY& tpm2b) {
   4980   const char* char_buffer = reinterpret_cast<const char*>(tpm2b.buffer);
   4981   return std::string(char_buffer, tpm2b.size);
   4982 }
   4983 
   4984 TPM_RC Serialize_TPMS_SYMCIPHER_PARMS(const TPMS_SYMCIPHER_PARMS& value,
   4985                                       std::string* buffer) {
   4986   TPM_RC result = TPM_RC_SUCCESS;
   4987   VLOG(3) << __func__;
   4988 
   4989   result = Serialize_TPMT_SYM_DEF_OBJECT(value.sym, buffer);
   4990   if (result) {
   4991     return result;
   4992   }
   4993   return result;
   4994 }
   4995 
   4996 TPM_RC Parse_TPMS_SYMCIPHER_PARMS(std::string* buffer,
   4997                                   TPMS_SYMCIPHER_PARMS* value,
   4998                                   std::string* value_bytes) {
   4999   TPM_RC result = TPM_RC_SUCCESS;
   5000   VLOG(3) << __func__;
   5001 
   5002   result = Parse_TPMT_SYM_DEF_OBJECT(buffer, &value->sym, value_bytes);
   5003   if (result) {
   5004     return result;
   5005   }
   5006   return result;
   5007 }
   5008 
   5009 TPM_RC Serialize_TPM2B_SENSITIVE_DATA(const TPM2B_SENSITIVE_DATA& value,
   5010                                       std::string* buffer) {
   5011   TPM_RC result = TPM_RC_SUCCESS;
   5012   VLOG(3) << __func__;
   5013 
   5014   result = Serialize_UINT16(value.size, buffer);
   5015   if (result) {
   5016     return result;
   5017   }
   5018 
   5019   if (arraysize(value.buffer) < value.size) {
   5020     return TPM_RC_INSUFFICIENT;
   5021   }
   5022   for (uint32_t i = 0; i < value.size; ++i) {
   5023     result = Serialize_BYTE(value.buffer[i], buffer);
   5024     if (result) {
   5025       return result;
   5026     }
   5027   }
   5028   return result;
   5029 }
   5030 
   5031 TPM_RC Parse_TPM2B_SENSITIVE_DATA(std::string* buffer,
   5032                                   TPM2B_SENSITIVE_DATA* value,
   5033                                   std::string* value_bytes) {
   5034   TPM_RC result = TPM_RC_SUCCESS;
   5035   VLOG(3) << __func__;
   5036 
   5037   result = Parse_UINT16(buffer, &value->size, value_bytes);
   5038   if (result) {
   5039     return result;
   5040   }
   5041 
   5042   if (arraysize(value->buffer) < value->size) {
   5043     return TPM_RC_INSUFFICIENT;
   5044   }
   5045   for (uint32_t i = 0; i < value->size; ++i) {
   5046     result = Parse_BYTE(buffer, &value->buffer[i], value_bytes);
   5047     if (result) {
   5048       return result;
   5049     }
   5050   }
   5051   return result;
   5052 }
   5053 
   5054 TPM2B_SENSITIVE_DATA Make_TPM2B_SENSITIVE_DATA(const std::string& bytes) {
   5055   TPM2B_SENSITIVE_DATA tpm2b;
   5056   CHECK(bytes.size() <= sizeof(tpm2b.buffer));
   5057   memset(&tpm2b, 0, sizeof(TPM2B_SENSITIVE_DATA));
   5058   tpm2b.size = bytes.size();
   5059   memcpy(tpm2b.buffer, bytes.data(), bytes.size());
   5060   return tpm2b;
   5061 }
   5062 
   5063 std::string StringFrom_TPM2B_SENSITIVE_DATA(const TPM2B_SENSITIVE_DATA& tpm2b) {
   5064   const char* char_buffer = reinterpret_cast<const char*>(tpm2b.buffer);
   5065   return std::string(char_buffer, tpm2b.size);
   5066 }
   5067 
   5068 TPM_RC Serialize_TPMS_SENSITIVE_CREATE(const TPMS_SENSITIVE_CREATE& value,
   5069                                        std::string* buffer) {
   5070   TPM_RC result = TPM_RC_SUCCESS;
   5071   VLOG(3) << __func__;
   5072 
   5073   result = Serialize_TPM2B_AUTH(value.user_auth, buffer);
   5074   if (result) {
   5075     return result;
   5076   }
   5077 
   5078   result = Serialize_TPM2B_SENSITIVE_DATA(value.data, buffer);
   5079   if (result) {
   5080     return result;
   5081   }
   5082   return result;
   5083 }
   5084 
   5085 TPM_RC Parse_TPMS_SENSITIVE_CREATE(std::string* buffer,
   5086                                    TPMS_SENSITIVE_CREATE* value,
   5087                                    std::string* value_bytes) {
   5088   TPM_RC result = TPM_RC_SUCCESS;
   5089   VLOG(3) << __func__;
   5090 
   5091   result = Parse_TPM2B_AUTH(buffer, &value->user_auth, value_bytes);
   5092   if (result) {
   5093     return result;
   5094   }
   5095 
   5096   result = Parse_TPM2B_SENSITIVE_DATA(buffer, &value->data, value_bytes);
   5097   if (result) {
   5098     return result;
   5099   }
   5100   return result;
   5101 }
   5102 
   5103 TPM_RC Serialize_TPM2B_SENSITIVE_CREATE(const TPM2B_SENSITIVE_CREATE& value,
   5104                                         std::string* buffer) {
   5105   TPM_RC result = TPM_RC_SUCCESS;
   5106   VLOG(3) << __func__;
   5107 
   5108   std::string field_bytes;
   5109   result = Serialize_TPMS_SENSITIVE_CREATE(value.sensitive, &field_bytes);
   5110   if (result) {
   5111     return result;
   5112   }
   5113   std::string size_bytes;
   5114   result = Serialize_UINT16(field_bytes.size(), &size_bytes);
   5115   if (result) {
   5116     return result;
   5117   }
   5118   buffer->append(size_bytes + field_bytes);
   5119   return result;
   5120 }
   5121 
   5122 TPM_RC Parse_TPM2B_SENSITIVE_CREATE(std::string* buffer,
   5123                                     TPM2B_SENSITIVE_CREATE* value,
   5124                                     std::string* value_bytes) {
   5125   TPM_RC result = TPM_RC_SUCCESS;
   5126   VLOG(3) << __func__;
   5127 
   5128   result = Parse_UINT16(buffer, &value->size, value_bytes);
   5129   if (result) {
   5130     return result;
   5131   }
   5132 
   5133   result = Parse_TPMS_SENSITIVE_CREATE(buffer, &value->sensitive, value_bytes);
   5134   if (result) {
   5135     return result;
   5136   }
   5137   return result;
   5138 }
   5139 
   5140 TPM2B_SENSITIVE_CREATE Make_TPM2B_SENSITIVE_CREATE(
   5141     const TPMS_SENSITIVE_CREATE& inner) {
   5142   TPM2B_SENSITIVE_CREATE tpm2b;
   5143   tpm2b.size = sizeof(TPMS_SENSITIVE_CREATE);
   5144   tpm2b.sensitive = inner;
   5145   return tpm2b;
   5146 }
   5147 
   5148 TPM_RC Serialize_TPMS_SCHEME_XOR(const TPMS_SCHEME_XOR& value,
   5149                                  std::string* buffer) {
   5150   TPM_RC result = TPM_RC_SUCCESS;
   5151   VLOG(3) << __func__;
   5152 
   5153   result = Serialize_TPMI_ALG_HASH(value.hash_alg, buffer);
   5154   if (result) {
   5155     return result;
   5156   }
   5157 
   5158   result = Serialize_TPMI_ALG_KDF(value.kdf, buffer);
   5159   if (result) {
   5160     return result;
   5161   }
   5162   return result;
   5163 }
   5164 
   5165 TPM_RC Parse_TPMS_SCHEME_XOR(std::string* buffer,
   5166                              TPMS_SCHEME_XOR* value,
   5167                              std::string* value_bytes) {
   5168   TPM_RC result = TPM_RC_SUCCESS;
   5169   VLOG(3) << __func__;
   5170 
   5171   result = Parse_TPMI_ALG_HASH(buffer, &value->hash_alg, value_bytes);
   5172   if (result) {
   5173     return result;
   5174   }
   5175 
   5176   result = Parse_TPMI_ALG_KDF(buffer, &value->kdf, value_bytes);
   5177   if (result) {
   5178     return result;
   5179   }
   5180   return result;
   5181 }
   5182 
   5183 TPM_RC Serialize_TPMU_SCHEME_KEYEDHASH(const TPMU_SCHEME_KEYEDHASH& value,
   5184                                        TPMI_ALG_KEYEDHASH_SCHEME selector,
   5185                                        std::string* buffer) {
   5186   TPM_RC result = TPM_RC_SUCCESS;
   5187   VLOG(3) << __func__;
   5188 
   5189   if (selector == TPM_ALG_NULL) {
   5190     // Do nothing.
   5191   }
   5192 
   5193   if (selector == TPM_ALG_HMAC) {
   5194     result = Serialize_TPMS_SCHEME_HMAC(value.hmac, buffer);
   5195     if (result) {
   5196       return result;
   5197     }
   5198   }
   5199 
   5200   if (selector == TPM_ALG_XOR) {
   5201     result = Serialize_TPMS_SCHEME_XOR(value.xor_, buffer);
   5202     if (result) {
   5203       return result;
   5204     }
   5205   }
   5206   return result;
   5207 }
   5208 
   5209 TPM_RC Parse_TPMU_SCHEME_KEYEDHASH(std::string* buffer,
   5210                                    TPMI_ALG_KEYEDHASH_SCHEME selector,
   5211                                    TPMU_SCHEME_KEYEDHASH* value,
   5212                                    std::string* value_bytes) {
   5213   TPM_RC result = TPM_RC_SUCCESS;
   5214   VLOG(3) << __func__;
   5215 
   5216   if (selector == TPM_ALG_NULL) {
   5217     // Do nothing.
   5218   }
   5219 
   5220   if (selector == TPM_ALG_HMAC) {
   5221     result = Parse_TPMS_SCHEME_HMAC(buffer, &value->hmac, value_bytes);
   5222     if (result) {
   5223       return result;
   5224     }
   5225   }
   5226 
   5227   if (selector == TPM_ALG_XOR) {
   5228     result = Parse_TPMS_SCHEME_XOR(buffer, &value->xor_, value_bytes);
   5229     if (result) {
   5230       return result;
   5231     }
   5232   }
   5233   return result;
   5234 }
   5235 
   5236 TPM_RC Serialize_TPMT_KEYEDHASH_SCHEME(const TPMT_KEYEDHASH_SCHEME& value,
   5237                                        std::string* buffer) {
   5238   TPM_RC result = TPM_RC_SUCCESS;
   5239   VLOG(3) << __func__;
   5240 
   5241   result = Serialize_TPMI_ALG_KEYEDHASH_SCHEME(value.scheme, buffer);
   5242   if (result) {
   5243     return result;
   5244   }
   5245 
   5246   result = Serialize_TPMU_SCHEME_KEYEDHASH(value.details, value.scheme, buffer);
   5247   if (result) {
   5248     return result;
   5249   }
   5250   return result;
   5251 }
   5252 
   5253 TPM_RC Parse_TPMT_KEYEDHASH_SCHEME(std::string* buffer,
   5254                                    TPMT_KEYEDHASH_SCHEME* value,
   5255                                    std::string* value_bytes) {
   5256   TPM_RC result = TPM_RC_SUCCESS;
   5257   VLOG(3) << __func__;
   5258 
   5259   result = Parse_TPMI_ALG_KEYEDHASH_SCHEME(buffer, &value->scheme, value_bytes);
   5260   if (result) {
   5261     return result;
   5262   }
   5263 
   5264   result = Parse_TPMU_SCHEME_KEYEDHASH(buffer, value->scheme, &value->details,
   5265                                        value_bytes);
   5266   if (result) {
   5267     return result;
   5268   }
   5269   return result;
   5270 }
   5271 
   5272 TPM_RC Serialize_TPMS_SCHEME_ECDAA(const TPMS_SCHEME_ECDAA& value,
   5273                                    std::string* buffer) {
   5274   TPM_RC result = TPM_RC_SUCCESS;
   5275   VLOG(3) << __func__;
   5276 
   5277   result = Serialize_TPMI_ALG_HASH(value.hash_alg, buffer);
   5278   if (result) {
   5279     return result;
   5280   }
   5281 
   5282   result = Serialize_UINT16(value.count, buffer);
   5283   if (result) {
   5284     return result;
   5285   }
   5286   return result;
   5287 }
   5288 
   5289 TPM_RC Parse_TPMS_SCHEME_ECDAA(std::string* buffer,
   5290                                TPMS_SCHEME_ECDAA* value,
   5291                                std::string* value_bytes) {
   5292   TPM_RC result = TPM_RC_SUCCESS;
   5293   VLOG(3) << __func__;
   5294 
   5295   result = Parse_TPMI_ALG_HASH(buffer, &value->hash_alg, value_bytes);
   5296   if (result) {
   5297     return result;
   5298   }
   5299 
   5300   result = Parse_UINT16(buffer, &value->count, value_bytes);
   5301   if (result) {
   5302     return result;
   5303   }
   5304   return result;
   5305 }
   5306 
   5307 TPM_RC Serialize_TPMU_SIG_SCHEME(const TPMU_SIG_SCHEME& value,
   5308                                  TPMI_ALG_SIG_SCHEME selector,
   5309                                  std::string* buffer) {
   5310   TPM_RC result = TPM_RC_SUCCESS;
   5311   VLOG(3) << __func__;
   5312 
   5313   if (selector == TPM_ALG_HMAC) {
   5314     result = Serialize_TPMS_SCHEME_HMAC(value.hmac, buffer);
   5315     if (result) {
   5316       return result;
   5317     }
   5318   }
   5319 
   5320   if (selector == TPM_ALG_ECSCHNORR) {
   5321     result = Serialize_TPMS_SCHEME_ECSCHNORR(value.ec_schnorr, buffer);
   5322     if (result) {
   5323       return result;
   5324     }
   5325   }
   5326 
   5327   if (selector == TPM_ALG_RSAPSS) {
   5328     result = Serialize_TPMS_SCHEME_RSAPSS(value.rsapss, buffer);
   5329     if (result) {
   5330       return result;
   5331     }
   5332   }
   5333 
   5334   if (selector == TPM_ALG_ECDAA) {
   5335     result = Serialize_TPMS_SCHEME_ECDAA(value.ecdaa, buffer);
   5336     if (result) {
   5337       return result;
   5338     }
   5339   }
   5340 
   5341   if (selector == TPM_ALG_RSASSA) {
   5342     result = Serialize_TPMS_SCHEME_RSASSA(value.rsassa, buffer);
   5343     if (result) {
   5344       return result;
   5345     }
   5346   }
   5347 
   5348   if (selector == TPM_ALG_SM2) {
   5349     result = Serialize_TPMS_SCHEME_SM2(value.sm2, buffer);
   5350     if (result) {
   5351       return result;
   5352     }
   5353   }
   5354 
   5355   if (selector == TPM_ALG_ECDSA) {
   5356     result = Serialize_TPMS_SCHEME_ECDSA(value.ecdsa, buffer);
   5357     if (result) {
   5358       return result;
   5359     }
   5360   }
   5361 
   5362   if (selector == TPM_ALG_NULL) {
   5363     // Do nothing.
   5364   }
   5365   return result;
   5366 }
   5367 
   5368 TPM_RC Parse_TPMU_SIG_SCHEME(std::string* buffer,
   5369                              TPMI_ALG_SIG_SCHEME selector,
   5370                              TPMU_SIG_SCHEME* value,
   5371                              std::string* value_bytes) {
   5372   TPM_RC result = TPM_RC_SUCCESS;
   5373   VLOG(3) << __func__;
   5374 
   5375   if (selector == TPM_ALG_HMAC) {
   5376     result = Parse_TPMS_SCHEME_HMAC(buffer, &value->hmac, value_bytes);
   5377     if (result) {
   5378       return result;
   5379     }
   5380   }
   5381 
   5382   if (selector == TPM_ALG_ECSCHNORR) {
   5383     result =
   5384         Parse_TPMS_SCHEME_ECSCHNORR(buffer, &value->ec_schnorr, value_bytes);
   5385     if (result) {
   5386       return result;
   5387     }
   5388   }
   5389 
   5390   if (selector == TPM_ALG_RSAPSS) {
   5391     result = Parse_TPMS_SCHEME_RSAPSS(buffer, &value->rsapss, value_bytes);
   5392     if (result) {
   5393       return result;
   5394     }
   5395   }
   5396 
   5397   if (selector == TPM_ALG_ECDAA) {
   5398     result = Parse_TPMS_SCHEME_ECDAA(buffer, &value->ecdaa, value_bytes);
   5399     if (result) {
   5400       return result;
   5401     }
   5402   }
   5403 
   5404   if (selector == TPM_ALG_RSASSA) {
   5405     result = Parse_TPMS_SCHEME_RSASSA(buffer, &value->rsassa, value_bytes);
   5406     if (result) {
   5407       return result;
   5408     }
   5409   }
   5410 
   5411   if (selector == TPM_ALG_SM2) {
   5412     result = Parse_TPMS_SCHEME_SM2(buffer, &value->sm2, value_bytes);
   5413     if (result) {
   5414       return result;
   5415     }
   5416   }
   5417 
   5418   if (selector == TPM_ALG_ECDSA) {
   5419     result = Parse_TPMS_SCHEME_ECDSA(buffer, &value->ecdsa, value_bytes);
   5420     if (result) {
   5421       return result;
   5422     }
   5423   }
   5424 
   5425   if (selector == TPM_ALG_NULL) {
   5426     // Do nothing.
   5427   }
   5428   return result;
   5429 }
   5430 
   5431 TPM_RC Serialize_TPMT_SIG_SCHEME(const TPMT_SIG_SCHEME& value,
   5432                                  std::string* buffer) {
   5433   TPM_RC result = TPM_RC_SUCCESS;
   5434   VLOG(3) << __func__;
   5435 
   5436   result = Serialize_TPMI_ALG_SIG_SCHEME(value.scheme, buffer);
   5437   if (result) {
   5438     return result;
   5439   }
   5440 
   5441   result = Serialize_TPMU_SIG_SCHEME(value.details, value.scheme, buffer);
   5442   if (result) {
   5443     return result;
   5444   }
   5445   return result;
   5446 }
   5447 
   5448 TPM_RC Parse_TPMT_SIG_SCHEME(std::string* buffer,
   5449                              TPMT_SIG_SCHEME* value,
   5450                              std::string* value_bytes) {
   5451   TPM_RC result = TPM_RC_SUCCESS;
   5452   VLOG(3) << __func__;
   5453 
   5454   result = Parse_TPMI_ALG_SIG_SCHEME(buffer, &value->scheme, value_bytes);
   5455   if (result) {
   5456     return result;
   5457   }
   5458 
   5459   result = Parse_TPMU_SIG_SCHEME(buffer, value->scheme, &value->details,
   5460                                  value_bytes);
   5461   if (result) {
   5462     return result;
   5463   }
   5464   return result;
   5465 }
   5466 
   5467 TPM_RC Serialize_TPMS_SCHEME_OAEP(const TPMS_SCHEME_OAEP& value,
   5468                                   std::string* buffer) {
   5469   TPM_RC result = TPM_RC_SUCCESS;
   5470   VLOG(3) << __func__;
   5471 
   5472   result = Serialize_TPMI_ALG_HASH(value.hash_alg, buffer);
   5473   if (result) {
   5474     return result;
   5475   }
   5476   return result;
   5477 }
   5478 
   5479 TPM_RC Parse_TPMS_SCHEME_OAEP(std::string* buffer,
   5480                               TPMS_SCHEME_OAEP* value,
   5481                               std::string* value_bytes) {
   5482   TPM_RC result = TPM_RC_SUCCESS;
   5483   VLOG(3) << __func__;
   5484 
   5485   result = Parse_TPMI_ALG_HASH(buffer, &value->hash_alg, value_bytes);
   5486   if (result) {
   5487     return result;
   5488   }
   5489   return result;
   5490 }
   5491 
   5492 TPM_RC Serialize_TPMS_SCHEME_ECDH(const TPMS_SCHEME_ECDH& value,
   5493                                   std::string* buffer) {
   5494   TPM_RC result = TPM_RC_SUCCESS;
   5495   VLOG(3) << __func__;
   5496 
   5497   result = Serialize_TPMI_ALG_HASH(value.hash_alg, buffer);
   5498   if (result) {
   5499     return result;
   5500   }
   5501   return result;
   5502 }
   5503 
   5504 TPM_RC Parse_TPMS_SCHEME_ECDH(std::string* buffer,
   5505                               TPMS_SCHEME_ECDH* value,
   5506                               std::string* value_bytes) {
   5507   TPM_RC result = TPM_RC_SUCCESS;
   5508   VLOG(3) << __func__;
   5509 
   5510   result = Parse_TPMI_ALG_HASH(buffer, &value->hash_alg, value_bytes);
   5511   if (result) {
   5512     return result;
   5513   }
   5514   return result;
   5515 }
   5516 
   5517 TPM_RC Serialize_TPMS_SCHEME_MGF1(const TPMS_SCHEME_MGF1& value,
   5518                                   std::string* buffer) {
   5519   TPM_RC result = TPM_RC_SUCCESS;
   5520   VLOG(3) << __func__;
   5521 
   5522   result = Serialize_TPMI_ALG_HASH(value.hash_alg, buffer);
   5523   if (result) {
   5524     return result;
   5525   }
   5526   return result;
   5527 }
   5528 
   5529 TPM_RC Parse_TPMS_SCHEME_MGF1(std::string* buffer,
   5530                               TPMS_SCHEME_MGF1* value,
   5531                               std::string* value_bytes) {
   5532   TPM_RC result = TPM_RC_SUCCESS;
   5533   VLOG(3) << __func__;
   5534 
   5535   result = Parse_TPMI_ALG_HASH(buffer, &value->hash_alg, value_bytes);
   5536   if (result) {
   5537     return result;
   5538   }
   5539   return result;
   5540 }
   5541 
   5542 TPM_RC Serialize_TPMS_SCHEME_KDF1_SP800_56a(
   5543     const TPMS_SCHEME_KDF1_SP800_56a& value,
   5544     std::string* buffer) {
   5545   TPM_RC result = TPM_RC_SUCCESS;
   5546   VLOG(3) << __func__;
   5547 
   5548   result = Serialize_TPMI_ALG_HASH(value.hash_alg, buffer);
   5549   if (result) {
   5550     return result;
   5551   }
   5552   return result;
   5553 }
   5554 
   5555 TPM_RC Parse_TPMS_SCHEME_KDF1_SP800_56a(std::string* buffer,
   5556                                         TPMS_SCHEME_KDF1_SP800_56a* value,
   5557                                         std::string* value_bytes) {
   5558   TPM_RC result = TPM_RC_SUCCESS;
   5559   VLOG(3) << __func__;
   5560 
   5561   result = Parse_TPMI_ALG_HASH(buffer, &value->hash_alg, value_bytes);
   5562   if (result) {
   5563     return result;
   5564   }
   5565   return result;
   5566 }
   5567 
   5568 TPM_RC Serialize_TPMS_SCHEME_KDF2(const TPMS_SCHEME_KDF2& value,
   5569                                   std::string* buffer) {
   5570   TPM_RC result = TPM_RC_SUCCESS;
   5571   VLOG(3) << __func__;
   5572 
   5573   result = Serialize_TPMI_ALG_HASH(value.hash_alg, buffer);
   5574   if (result) {
   5575     return result;
   5576   }
   5577   return result;
   5578 }
   5579 
   5580 TPM_RC Parse_TPMS_SCHEME_KDF2(std::string* buffer,
   5581                               TPMS_SCHEME_KDF2* value,
   5582                               std::string* value_bytes) {
   5583   TPM_RC result = TPM_RC_SUCCESS;
   5584   VLOG(3) << __func__;
   5585 
   5586   result = Parse_TPMI_ALG_HASH(buffer, &value->hash_alg, value_bytes);
   5587   if (result) {
   5588     return result;
   5589   }
   5590   return result;
   5591 }
   5592 
   5593 TPM_RC Serialize_TPMS_SCHEME_KDF1_SP800_108(
   5594     const TPMS_SCHEME_KDF1_SP800_108& value,
   5595     std::string* buffer) {
   5596   TPM_RC result = TPM_RC_SUCCESS;
   5597   VLOG(3) << __func__;
   5598 
   5599   result = Serialize_TPMI_ALG_HASH(value.hash_alg, buffer);
   5600   if (result) {
   5601     return result;
   5602   }
   5603   return result;
   5604 }
   5605 
   5606 TPM_RC Parse_TPMS_SCHEME_KDF1_SP800_108(std::string* buffer,
   5607                                         TPMS_SCHEME_KDF1_SP800_108* value,
   5608                                         std::string* value_bytes) {
   5609   TPM_RC result = TPM_RC_SUCCESS;
   5610   VLOG(3) << __func__;
   5611 
   5612   result = Parse_TPMI_ALG_HASH(buffer, &value->hash_alg, value_bytes);
   5613   if (result) {
   5614     return result;
   5615   }
   5616   return result;
   5617 }
   5618 
   5619 TPM_RC Serialize_TPMU_KDF_SCHEME(const TPMU_KDF_SCHEME& value,
   5620                                  TPMI_ALG_KDF selector,
   5621                                  std::string* buffer) {
   5622   TPM_RC result = TPM_RC_SUCCESS;
   5623   VLOG(3) << __func__;
   5624 
   5625   if (selector == TPM_ALG_KDF1_SP800_56a) {
   5626     result = Serialize_TPMS_SCHEME_KDF1_SP800_56a(value.kdf1_sp800_56a, buffer);
   5627     if (result) {
   5628       return result;
   5629     }
   5630   }
   5631 
   5632   if (selector == TPM_ALG_MGF1) {
   5633     result = Serialize_TPMS_SCHEME_MGF1(value.mgf1, buffer);
   5634     if (result) {
   5635       return result;
   5636     }
   5637   }
   5638 
   5639   if (selector == TPM_ALG_KDF1_SP800_108) {
   5640     result = Serialize_TPMS_SCHEME_KDF1_SP800_108(value.kdf1_sp800_108, buffer);
   5641     if (result) {
   5642       return result;
   5643     }
   5644   }
   5645 
   5646   if (selector == TPM_ALG_KDF2) {
   5647     result = Serialize_TPMS_SCHEME_KDF2(value.kdf2, buffer);
   5648     if (result) {
   5649       return result;
   5650     }
   5651   }
   5652 
   5653   if (selector == TPM_ALG_NULL) {
   5654     // Do nothing.
   5655   }
   5656   return result;
   5657 }
   5658 
   5659 TPM_RC Parse_TPMU_KDF_SCHEME(std::string* buffer,
   5660                              TPMI_ALG_KDF selector,
   5661                              TPMU_KDF_SCHEME* value,
   5662                              std::string* value_bytes) {
   5663   TPM_RC result = TPM_RC_SUCCESS;
   5664   VLOG(3) << __func__;
   5665 
   5666   if (selector == TPM_ALG_KDF1_SP800_56a) {
   5667     result = Parse_TPMS_SCHEME_KDF1_SP800_56a(buffer, &value->kdf1_sp800_56a,
   5668                                               value_bytes);
   5669     if (result) {
   5670       return result;
   5671     }
   5672   }
   5673 
   5674   if (selector == TPM_ALG_MGF1) {
   5675     result = Parse_TPMS_SCHEME_MGF1(buffer, &value->mgf1, value_bytes);
   5676     if (result) {
   5677       return result;
   5678     }
   5679   }
   5680 
   5681   if (selector == TPM_ALG_KDF1_SP800_108) {
   5682     result = Parse_TPMS_SCHEME_KDF1_SP800_108(buffer, &value->kdf1_sp800_108,
   5683                                               value_bytes);
   5684     if (result) {
   5685       return result;
   5686     }
   5687   }
   5688 
   5689   if (selector == TPM_ALG_KDF2) {
   5690     result = Parse_TPMS_SCHEME_KDF2(buffer, &value->kdf2, value_bytes);
   5691     if (result) {
   5692       return result;
   5693     }
   5694   }
   5695 
   5696   if (selector == TPM_ALG_NULL) {
   5697     // Do nothing.
   5698   }
   5699   return result;
   5700 }
   5701 
   5702 TPM_RC Serialize_TPMT_KDF_SCHEME(const TPMT_KDF_SCHEME& value,
   5703                                  std::string* buffer) {
   5704   TPM_RC result = TPM_RC_SUCCESS;
   5705   VLOG(3) << __func__;
   5706 
   5707   result = Serialize_TPMI_ALG_KDF(value.scheme, buffer);
   5708   if (result) {
   5709     return result;
   5710   }
   5711 
   5712   result = Serialize_TPMU_KDF_SCHEME(value.details, value.scheme, buffer);
   5713   if (result) {
   5714     return result;
   5715   }
   5716   return result;
   5717 }
   5718 
   5719 TPM_RC Parse_TPMT_KDF_SCHEME(std::string* buffer,
   5720                              TPMT_KDF_SCHEME* value,
   5721                              std::string* value_bytes) {
   5722   TPM_RC result = TPM_RC_SUCCESS;
   5723   VLOG(3) << __func__;
   5724 
   5725   result = Parse_TPMI_ALG_KDF(buffer, &value->scheme, value_bytes);
   5726   if (result) {
   5727     return result;
   5728   }
   5729 
   5730   result = Parse_TPMU_KDF_SCHEME(buffer, value->scheme, &value->details,
   5731                                  value_bytes);
   5732   if (result) {
   5733     return result;
   5734   }
   5735   return result;
   5736 }
   5737 
   5738 TPM_RC Serialize_TPMU_ASYM_SCHEME(const TPMU_ASYM_SCHEME& value,
   5739                                   TPMI_ALG_ASYM_SCHEME selector,
   5740                                   std::string* buffer) {
   5741   TPM_RC result = TPM_RC_SUCCESS;
   5742   VLOG(3) << __func__;
   5743 
   5744   if (selector == TPM_ALG_RSAES) {
   5745     // Do nothing.
   5746   }
   5747 
   5748   if (selector == TPM_ALG_ECSCHNORR) {
   5749     result = Serialize_TPMS_SCHEME_ECSCHNORR(value.ec_schnorr, buffer);
   5750     if (result) {
   5751       return result;
   5752     }
   5753   }
   5754 
   5755   if (selector == TPM_ALG_NULL) {
   5756     // Do nothing.
   5757   }
   5758 
   5759   if (selector == TPM_ALG_ECDH) {
   5760     result = Serialize_TPMS_SCHEME_ECDH(value.ecdh, buffer);
   5761     if (result) {
   5762       return result;
   5763     }
   5764   }
   5765 
   5766   if (selector == TPM_ALG_OAEP) {
   5767     result = Serialize_TPMS_SCHEME_OAEP(value.oaep, buffer);
   5768     if (result) {
   5769       return result;
   5770     }
   5771   }
   5772 
   5773   if (selector == TPM_ALG_RSAPSS) {
   5774     result = Serialize_TPMS_SCHEME_RSAPSS(value.rsapss, buffer);
   5775     if (result) {
   5776       return result;
   5777     }
   5778   }
   5779 
   5780   if (selector == TPM_ALG_ECDAA) {
   5781     result = Serialize_TPMS_SCHEME_ECDAA(value.ecdaa, buffer);
   5782     if (result) {
   5783       return result;
   5784     }
   5785   }
   5786 
   5787   if (selector == TPM_ALG_RSASSA) {
   5788     result = Serialize_TPMS_SCHEME_RSASSA(value.rsassa, buffer);
   5789     if (result) {
   5790       return result;
   5791     }
   5792   }
   5793 
   5794   if (selector == TPM_ALG_SM2) {
   5795     result = Serialize_TPMS_SCHEME_SM2(value.sm2, buffer);
   5796     if (result) {
   5797       return result;
   5798     }
   5799   }
   5800 
   5801   if (selector == TPM_ALG_ECDSA) {
   5802     result = Serialize_TPMS_SCHEME_ECDSA(value.ecdsa, buffer);
   5803     if (result) {
   5804       return result;
   5805     }
   5806   }
   5807   return result;
   5808 }
   5809 
   5810 TPM_RC Parse_TPMU_ASYM_SCHEME(std::string* buffer,
   5811                               TPMI_ALG_ASYM_SCHEME selector,
   5812                               TPMU_ASYM_SCHEME* value,
   5813                               std::string* value_bytes) {
   5814   TPM_RC result = TPM_RC_SUCCESS;
   5815   VLOG(3) << __func__;
   5816 
   5817   if (selector == TPM_ALG_RSAES) {
   5818     // Do nothing.
   5819   }
   5820 
   5821   if (selector == TPM_ALG_ECSCHNORR) {
   5822     result =
   5823         Parse_TPMS_SCHEME_ECSCHNORR(buffer, &value->ec_schnorr, value_bytes);
   5824     if (result) {
   5825       return result;
   5826     }
   5827   }
   5828 
   5829   if (selector == TPM_ALG_NULL) {
   5830     // Do nothing.
   5831   }
   5832 
   5833   if (selector == TPM_ALG_ECDH) {
   5834     result = Parse_TPMS_SCHEME_ECDH(buffer, &value->ecdh, value_bytes);
   5835     if (result) {
   5836       return result;
   5837     }
   5838   }
   5839 
   5840   if (selector == TPM_ALG_OAEP) {
   5841     result = Parse_TPMS_SCHEME_OAEP(buffer, &value->oaep, value_bytes);
   5842     if (result) {
   5843       return result;
   5844     }
   5845   }
   5846 
   5847   if (selector == TPM_ALG_RSAPSS) {
   5848     result = Parse_TPMS_SCHEME_RSAPSS(buffer, &value->rsapss, value_bytes);
   5849     if (result) {
   5850       return result;
   5851     }
   5852   }
   5853 
   5854   if (selector == TPM_ALG_ECDAA) {
   5855     result = Parse_TPMS_SCHEME_ECDAA(buffer, &value->ecdaa, value_bytes);
   5856     if (result) {
   5857       return result;
   5858     }
   5859   }
   5860 
   5861   if (selector == TPM_ALG_RSASSA) {
   5862     result = Parse_TPMS_SCHEME_RSASSA(buffer, &value->rsassa, value_bytes);
   5863     if (result) {
   5864       return result;
   5865     }
   5866   }
   5867 
   5868   if (selector == TPM_ALG_SM2) {
   5869     result = Parse_TPMS_SCHEME_SM2(buffer, &value->sm2, value_bytes);
   5870     if (result) {
   5871       return result;
   5872     }
   5873   }
   5874 
   5875   if (selector == TPM_ALG_ECDSA) {
   5876     result = Parse_TPMS_SCHEME_ECDSA(buffer, &value->ecdsa, value_bytes);
   5877     if (result) {
   5878       return result;
   5879     }
   5880   }
   5881   return result;
   5882 }
   5883 
   5884 TPM_RC Serialize_TPMT_ASYM_SCHEME(const TPMT_ASYM_SCHEME& value,
   5885                                   std::string* buffer) {
   5886   TPM_RC result = TPM_RC_SUCCESS;
   5887   VLOG(3) << __func__;
   5888 
   5889   result = Serialize_TPMI_ALG_ASYM_SCHEME(value.scheme, buffer);
   5890   if (result) {
   5891     return result;
   5892   }
   5893 
   5894   result = Serialize_TPMU_ASYM_SCHEME(value.details, value.scheme, buffer);
   5895   if (result) {
   5896     return result;
   5897   }
   5898   return result;
   5899 }
   5900 
   5901 TPM_RC Parse_TPMT_ASYM_SCHEME(std::string* buffer,
   5902                               TPMT_ASYM_SCHEME* value,
   5903                               std::string* value_bytes) {
   5904   TPM_RC result = TPM_RC_SUCCESS;
   5905   VLOG(3) << __func__;
   5906 
   5907   result = Parse_TPMI_ALG_ASYM_SCHEME(buffer, &value->scheme, value_bytes);
   5908   if (result) {
   5909     return result;
   5910   }
   5911 
   5912   result = Parse_TPMU_ASYM_SCHEME(buffer, value->scheme, &value->details,
   5913                                   value_bytes);
   5914   if (result) {
   5915     return result;
   5916   }
   5917   return result;
   5918 }
   5919 
   5920 TPM_RC Serialize_TPMT_RSA_SCHEME(const TPMT_RSA_SCHEME& value,
   5921                                  std::string* buffer) {
   5922   TPM_RC result = TPM_RC_SUCCESS;
   5923   VLOG(3) << __func__;
   5924 
   5925   result = Serialize_TPMI_ALG_RSA_SCHEME(value.scheme, buffer);
   5926   if (result) {
   5927     return result;
   5928   }
   5929 
   5930   result = Serialize_TPMU_ASYM_SCHEME(value.details, value.scheme, buffer);
   5931   if (result) {
   5932     return result;
   5933   }
   5934   return result;
   5935 }
   5936 
   5937 TPM_RC Parse_TPMT_RSA_SCHEME(std::string* buffer,
   5938                              TPMT_RSA_SCHEME* value,
   5939                              std::string* value_bytes) {
   5940   TPM_RC result = TPM_RC_SUCCESS;
   5941   VLOG(3) << __func__;
   5942 
   5943   result = Parse_TPMI_ALG_RSA_SCHEME(buffer, &value->scheme, value_bytes);
   5944   if (result) {
   5945     return result;
   5946   }
   5947 
   5948   result = Parse_TPMU_ASYM_SCHEME(buffer, value->scheme, &value->details,
   5949                                   value_bytes);
   5950   if (result) {
   5951     return result;
   5952   }
   5953   return result;
   5954 }
   5955 
   5956 TPM_RC Serialize_TPMT_RSA_DECRYPT(const TPMT_RSA_DECRYPT& value,
   5957                                   std::string* buffer) {
   5958   TPM_RC result = TPM_RC_SUCCESS;
   5959   VLOG(3) << __func__;
   5960 
   5961   result = Serialize_TPMI_ALG_RSA_DECRYPT(value.scheme, buffer);
   5962   if (result) {
   5963     return result;
   5964   }
   5965 
   5966   result = Serialize_TPMU_ASYM_SCHEME(value.details, value.scheme, buffer);
   5967   if (result) {
   5968     return result;
   5969   }
   5970   return result;
   5971 }
   5972 
   5973 TPM_RC Parse_TPMT_RSA_DECRYPT(std::string* buffer,
   5974                               TPMT_RSA_DECRYPT* value,
   5975                               std::string* value_bytes) {
   5976   TPM_RC result = TPM_RC_SUCCESS;
   5977   VLOG(3) << __func__;
   5978 
   5979   result = Parse_TPMI_ALG_RSA_DECRYPT(buffer, &value->scheme, value_bytes);
   5980   if (result) {
   5981     return result;
   5982   }
   5983 
   5984   result = Parse_TPMU_ASYM_SCHEME(buffer, value->scheme, &value->details,
   5985                                   value_bytes);
   5986   if (result) {
   5987     return result;
   5988   }
   5989   return result;
   5990 }
   5991 
   5992 TPM_RC Serialize_TPM2B_PUBLIC_KEY_RSA(const TPM2B_PUBLIC_KEY_RSA& value,
   5993                                       std::string* buffer) {
   5994   TPM_RC result = TPM_RC_SUCCESS;
   5995   VLOG(3) << __func__;
   5996 
   5997   result = Serialize_UINT16(value.size, buffer);
   5998   if (result) {
   5999     return result;
   6000   }
   6001 
   6002   if (arraysize(value.buffer) < value.size) {
   6003     return TPM_RC_INSUFFICIENT;
   6004   }
   6005   for (uint32_t i = 0; i < value.size; ++i) {
   6006     result = Serialize_BYTE(value.buffer[i], buffer);
   6007     if (result) {
   6008       return result;
   6009     }
   6010   }
   6011   return result;
   6012 }
   6013 
   6014 TPM_RC Parse_TPM2B_PUBLIC_KEY_RSA(std::string* buffer,
   6015                                   TPM2B_PUBLIC_KEY_RSA* value,
   6016                                   std::string* value_bytes) {
   6017   TPM_RC result = TPM_RC_SUCCESS;
   6018   VLOG(3) << __func__;
   6019 
   6020   result = Parse_UINT16(buffer, &value->size, value_bytes);
   6021   if (result) {
   6022     return result;
   6023   }
   6024 
   6025   if (arraysize(value->buffer) < value->size) {
   6026     return TPM_RC_INSUFFICIENT;
   6027   }
   6028   for (uint32_t i = 0; i < value->size; ++i) {
   6029     result = Parse_BYTE(buffer, &value->buffer[i], value_bytes);
   6030     if (result) {
   6031       return result;
   6032     }
   6033   }
   6034   return result;
   6035 }
   6036 
   6037 TPM2B_PUBLIC_KEY_RSA Make_TPM2B_PUBLIC_KEY_RSA(const std::string& bytes) {
   6038   TPM2B_PUBLIC_KEY_RSA tpm2b;
   6039   CHECK(bytes.size() <= sizeof(tpm2b.buffer));
   6040   memset(&tpm2b, 0, sizeof(TPM2B_PUBLIC_KEY_RSA));
   6041   tpm2b.size = bytes.size();
   6042   memcpy(tpm2b.buffer, bytes.data(), bytes.size());
   6043   return tpm2b;
   6044 }
   6045 
   6046 std::string StringFrom_TPM2B_PUBLIC_KEY_RSA(const TPM2B_PUBLIC_KEY_RSA& tpm2b) {
   6047   const char* char_buffer = reinterpret_cast<const char*>(tpm2b.buffer);
   6048   return std::string(char_buffer, tpm2b.size);
   6049 }
   6050 
   6051 TPM_RC Serialize_TPM2B_PRIVATE_KEY_RSA(const TPM2B_PRIVATE_KEY_RSA& value,
   6052                                        std::string* buffer) {
   6053   TPM_RC result = TPM_RC_SUCCESS;
   6054   VLOG(3) << __func__;
   6055 
   6056   result = Serialize_UINT16(value.size, buffer);
   6057   if (result) {
   6058     return result;
   6059   }
   6060 
   6061   if (arraysize(value.buffer) < value.size) {
   6062     return TPM_RC_INSUFFICIENT;
   6063   }
   6064   for (uint32_t i = 0; i < value.size; ++i) {
   6065     result = Serialize_BYTE(value.buffer[i], buffer);
   6066     if (result) {
   6067       return result;
   6068     }
   6069   }
   6070   return result;
   6071 }
   6072 
   6073 TPM_RC Parse_TPM2B_PRIVATE_KEY_RSA(std::string* buffer,
   6074                                    TPM2B_PRIVATE_KEY_RSA* value,
   6075                                    std::string* value_bytes) {
   6076   TPM_RC result = TPM_RC_SUCCESS;
   6077   VLOG(3) << __func__;
   6078 
   6079   result = Parse_UINT16(buffer, &value->size, value_bytes);
   6080   if (result) {
   6081     return result;
   6082   }
   6083 
   6084   if (arraysize(value->buffer) < value->size) {
   6085     return TPM_RC_INSUFFICIENT;
   6086   }
   6087   for (uint32_t i = 0; i < value->size; ++i) {
   6088     result = Parse_BYTE(buffer, &value->buffer[i], value_bytes);
   6089     if (result) {
   6090       return result;
   6091     }
   6092   }
   6093   return result;
   6094 }
   6095 
   6096 TPM2B_PRIVATE_KEY_RSA Make_TPM2B_PRIVATE_KEY_RSA(const std::string& bytes) {
   6097   TPM2B_PRIVATE_KEY_RSA tpm2b;
   6098   CHECK(bytes.size() <= sizeof(tpm2b.buffer));
   6099   memset(&tpm2b, 0, sizeof(TPM2B_PRIVATE_KEY_RSA));
   6100   tpm2b.size = bytes.size();
   6101   memcpy(tpm2b.buffer, bytes.data(), bytes.size());
   6102   return tpm2b;
   6103 }
   6104 
   6105 std::string StringFrom_TPM2B_PRIVATE_KEY_RSA(
   6106     const TPM2B_PRIVATE_KEY_RSA& tpm2b) {
   6107   const char* char_buffer = reinterpret_cast<const char*>(tpm2b.buffer);
   6108   return std::string(char_buffer, tpm2b.size);
   6109 }
   6110 
   6111 TPM_RC Serialize_TPM2B_ECC_PARAMETER(const TPM2B_ECC_PARAMETER& value,
   6112                                      std::string* buffer) {
   6113   TPM_RC result = TPM_RC_SUCCESS;
   6114   VLOG(3) << __func__;
   6115 
   6116   result = Serialize_UINT16(value.size, buffer);
   6117   if (result) {
   6118     return result;
   6119   }
   6120 
   6121   if (arraysize(value.buffer) < value.size) {
   6122     return TPM_RC_INSUFFICIENT;
   6123   }
   6124   for (uint32_t i = 0; i < value.size; ++i) {
   6125     result = Serialize_BYTE(value.buffer[i], buffer);
   6126     if (result) {
   6127       return result;
   6128     }
   6129   }
   6130   return result;
   6131 }
   6132 
   6133 TPM_RC Parse_TPM2B_ECC_PARAMETER(std::string* buffer,
   6134                                  TPM2B_ECC_PARAMETER* value,
   6135                                  std::string* value_bytes) {
   6136   TPM_RC result = TPM_RC_SUCCESS;
   6137   VLOG(3) << __func__;
   6138 
   6139   result = Parse_UINT16(buffer, &value->size, value_bytes);
   6140   if (result) {
   6141     return result;
   6142   }
   6143 
   6144   if (arraysize(value->buffer) < value->size) {
   6145     return TPM_RC_INSUFFICIENT;
   6146   }
   6147   for (uint32_t i = 0; i < value->size; ++i) {
   6148     result = Parse_BYTE(buffer, &value->buffer[i], value_bytes);
   6149     if (result) {
   6150       return result;
   6151     }
   6152   }
   6153   return result;
   6154 }
   6155 
   6156 TPM2B_ECC_PARAMETER Make_TPM2B_ECC_PARAMETER(const std::string& bytes) {
   6157   TPM2B_ECC_PARAMETER tpm2b;
   6158   CHECK(bytes.size() <= sizeof(tpm2b.buffer));
   6159   memset(&tpm2b, 0, sizeof(TPM2B_ECC_PARAMETER));
   6160   tpm2b.size = bytes.size();
   6161   memcpy(tpm2b.buffer, bytes.data(), bytes.size());
   6162   return tpm2b;
   6163 }
   6164 
   6165 std::string StringFrom_TPM2B_ECC_PARAMETER(const TPM2B_ECC_PARAMETER& tpm2b) {
   6166   const char* char_buffer = reinterpret_cast<const char*>(tpm2b.buffer);
   6167   return std::string(char_buffer, tpm2b.size);
   6168 }
   6169 
   6170 TPM_RC Serialize_TPMS_ECC_POINT(const TPMS_ECC_POINT& value,
   6171                                 std::string* buffer) {
   6172   TPM_RC result = TPM_RC_SUCCESS;
   6173   VLOG(3) << __func__;
   6174 
   6175   result = Serialize_TPM2B_ECC_PARAMETER(value.x, buffer);
   6176   if (result) {
   6177     return result;
   6178   }
   6179 
   6180   result = Serialize_TPM2B_ECC_PARAMETER(value.y, buffer);
   6181   if (result) {
   6182     return result;
   6183   }
   6184   return result;
   6185 }
   6186 
   6187 TPM_RC Parse_TPMS_ECC_POINT(std::string* buffer,
   6188                             TPMS_ECC_POINT* value,
   6189                             std::string* value_bytes) {
   6190   TPM_RC result = TPM_RC_SUCCESS;
   6191   VLOG(3) << __func__;
   6192 
   6193   result = Parse_TPM2B_ECC_PARAMETER(buffer, &value->x, value_bytes);
   6194   if (result) {
   6195     return result;
   6196   }
   6197 
   6198   result = Parse_TPM2B_ECC_PARAMETER(buffer, &value->y, value_bytes);
   6199   if (result) {
   6200     return result;
   6201   }
   6202   return result;
   6203 }
   6204 
   6205 TPM_RC Serialize_TPM2B_ECC_POINT(const TPM2B_ECC_POINT& value,
   6206                                  std::string* buffer) {
   6207   TPM_RC result = TPM_RC_SUCCESS;
   6208   VLOG(3) << __func__;
   6209 
   6210   std::string field_bytes;
   6211   result = Serialize_TPMS_ECC_POINT(value.point, &field_bytes);
   6212   if (result) {
   6213     return result;
   6214   }
   6215   std::string size_bytes;
   6216   result = Serialize_UINT16(field_bytes.size(), &size_bytes);
   6217   if (result) {
   6218     return result;
   6219   }
   6220   buffer->append(size_bytes + field_bytes);
   6221   return result;
   6222 }
   6223 
   6224 TPM_RC Parse_TPM2B_ECC_POINT(std::string* buffer,
   6225                              TPM2B_ECC_POINT* value,
   6226                              std::string* value_bytes) {
   6227   TPM_RC result = TPM_RC_SUCCESS;
   6228   VLOG(3) << __func__;
   6229 
   6230   result = Parse_UINT16(buffer, &value->size, value_bytes);
   6231   if (result) {
   6232     return result;
   6233   }
   6234 
   6235   result = Parse_TPMS_ECC_POINT(buffer, &value->point, value_bytes);
   6236   if (result) {
   6237     return result;
   6238   }
   6239   return result;
   6240 }
   6241 
   6242 TPM2B_ECC_POINT Make_TPM2B_ECC_POINT(const TPMS_ECC_POINT& inner) {
   6243   TPM2B_ECC_POINT tpm2b;
   6244   tpm2b.size = sizeof(TPMS_ECC_POINT);
   6245   tpm2b.point = inner;
   6246   return tpm2b;
   6247 }
   6248 
   6249 TPM_RC Serialize_TPMT_ECC_SCHEME(const TPMT_ECC_SCHEME& value,
   6250                                  std::string* buffer) {
   6251   TPM_RC result = TPM_RC_SUCCESS;
   6252   VLOG(3) << __func__;
   6253 
   6254   result = Serialize_TPMI_ALG_ECC_SCHEME(value.scheme, buffer);
   6255   if (result) {
   6256     return result;
   6257   }
   6258 
   6259   result = Serialize_TPMU_SIG_SCHEME(value.details, value.scheme, buffer);
   6260   if (result) {
   6261     return result;
   6262   }
   6263   return result;
   6264 }
   6265 
   6266 TPM_RC Parse_TPMT_ECC_SCHEME(std::string* buffer,
   6267                              TPMT_ECC_SCHEME* value,
   6268                              std::string* value_bytes) {
   6269   TPM_RC result = TPM_RC_SUCCESS;
   6270   VLOG(3) << __func__;
   6271 
   6272   result = Parse_TPMI_ALG_ECC_SCHEME(buffer, &value->scheme, value_bytes);
   6273   if (result) {
   6274     return result;
   6275   }
   6276 
   6277   result = Parse_TPMU_SIG_SCHEME(buffer, value->scheme, &value->details,
   6278                                  value_bytes);
   6279   if (result) {
   6280     return result;
   6281   }
   6282   return result;
   6283 }
   6284 
   6285 TPM_RC Serialize_TPMS_ALGORITHM_DETAIL_ECC(
   6286     const TPMS_ALGORITHM_DETAIL_ECC& value,
   6287     std::string* buffer) {
   6288   TPM_RC result = TPM_RC_SUCCESS;
   6289   VLOG(3) << __func__;
   6290 
   6291   result = Serialize_TPM_ECC_CURVE(value.curve_id, buffer);
   6292   if (result) {
   6293     return result;
   6294   }
   6295 
   6296   result = Serialize_UINT16(value.key_size, buffer);
   6297   if (result) {
   6298     return result;
   6299   }
   6300 
   6301   result = Serialize_TPMT_KDF_SCHEME(value.kdf, buffer);
   6302   if (result) {
   6303     return result;
   6304   }
   6305 
   6306   result = Serialize_TPMT_ECC_SCHEME(value.sign, buffer);
   6307   if (result) {
   6308     return result;
   6309   }
   6310 
   6311   result = Serialize_TPM2B_ECC_PARAMETER(value.p, buffer);
   6312   if (result) {
   6313     return result;
   6314   }
   6315 
   6316   result = Serialize_TPM2B_ECC_PARAMETER(value.a, buffer);
   6317   if (result) {
   6318     return result;
   6319   }
   6320 
   6321   result = Serialize_TPM2B_ECC_PARAMETER(value.b, buffer);
   6322   if (result) {
   6323     return result;
   6324   }
   6325 
   6326   result = Serialize_TPM2B_ECC_PARAMETER(value.g_x, buffer);
   6327   if (result) {
   6328     return result;
   6329   }
   6330 
   6331   result = Serialize_TPM2B_ECC_PARAMETER(value.g_y, buffer);
   6332   if (result) {
   6333     return result;
   6334   }
   6335 
   6336   result = Serialize_TPM2B_ECC_PARAMETER(value.n, buffer);
   6337   if (result) {
   6338     return result;
   6339   }
   6340 
   6341   result = Serialize_TPM2B_ECC_PARAMETER(value.h, buffer);
   6342   if (result) {
   6343     return result;
   6344   }
   6345   return result;
   6346 }
   6347 
   6348 TPM_RC Parse_TPMS_ALGORITHM_DETAIL_ECC(std::string* buffer,
   6349                                        TPMS_ALGORITHM_DETAIL_ECC* value,
   6350                                        std::string* value_bytes) {
   6351   TPM_RC result = TPM_RC_SUCCESS;
   6352   VLOG(3) << __func__;
   6353 
   6354   result = Parse_TPM_ECC_CURVE(buffer, &value->curve_id, value_bytes);
   6355   if (result) {
   6356     return result;
   6357   }
   6358 
   6359   result = Parse_UINT16(buffer, &value->key_size, value_bytes);
   6360   if (result) {
   6361     return result;
   6362   }
   6363 
   6364   result = Parse_TPMT_KDF_SCHEME(buffer, &value->kdf, value_bytes);
   6365   if (result) {
   6366     return result;
   6367   }
   6368 
   6369   result = Parse_TPMT_ECC_SCHEME(buffer, &value->sign, value_bytes);
   6370   if (result) {
   6371     return result;
   6372   }
   6373 
   6374   result = Parse_TPM2B_ECC_PARAMETER(buffer, &value->p, value_bytes);
   6375   if (result) {
   6376     return result;
   6377   }
   6378 
   6379   result = Parse_TPM2B_ECC_PARAMETER(buffer, &value->a, value_bytes);
   6380   if (result) {
   6381     return result;
   6382   }
   6383 
   6384   result = Parse_TPM2B_ECC_PARAMETER(buffer, &value->b, value_bytes);
   6385   if (result) {
   6386     return result;
   6387   }
   6388 
   6389   result = Parse_TPM2B_ECC_PARAMETER(buffer, &value->g_x, value_bytes);
   6390   if (result) {
   6391     return result;
   6392   }
   6393 
   6394   result = Parse_TPM2B_ECC_PARAMETER(buffer, &value->g_y, value_bytes);
   6395   if (result) {
   6396     return result;
   6397   }
   6398 
   6399   result = Parse_TPM2B_ECC_PARAMETER(buffer, &value->n, value_bytes);
   6400   if (result) {
   6401     return result;
   6402   }
   6403 
   6404   result = Parse_TPM2B_ECC_PARAMETER(buffer, &value->h, value_bytes);
   6405   if (result) {
   6406     return result;
   6407   }
   6408   return result;
   6409 }
   6410 
   6411 TPM_RC Serialize_TPMS_SIGNATURE_RSASSA(const TPMS_SIGNATURE_RSASSA& value,
   6412                                        std::string* buffer) {
   6413   TPM_RC result = TPM_RC_SUCCESS;
   6414   VLOG(3) << __func__;
   6415 
   6416   result = Serialize_TPMI_ALG_HASH(value.hash, buffer);
   6417   if (result) {
   6418     return result;
   6419   }
   6420 
   6421   result = Serialize_TPM2B_PUBLIC_KEY_RSA(value.sig, buffer);
   6422   if (result) {
   6423     return result;
   6424   }
   6425   return result;
   6426 }
   6427 
   6428 TPM_RC Parse_TPMS_SIGNATURE_RSASSA(std::string* buffer,
   6429                                    TPMS_SIGNATURE_RSASSA* value,
   6430                                    std::string* value_bytes) {
   6431   TPM_RC result = TPM_RC_SUCCESS;
   6432   VLOG(3) << __func__;
   6433 
   6434   result = Parse_TPMI_ALG_HASH(buffer, &value->hash, value_bytes);
   6435   if (result) {
   6436     return result;
   6437   }
   6438 
   6439   result = Parse_TPM2B_PUBLIC_KEY_RSA(buffer, &value->sig, value_bytes);
   6440   if (result) {
   6441     return result;
   6442   }
   6443   return result;
   6444 }
   6445 
   6446 TPM_RC Serialize_TPMS_SIGNATURE_RSAPSS(const TPMS_SIGNATURE_RSAPSS& value,
   6447                                        std::string* buffer) {
   6448   TPM_RC result = TPM_RC_SUCCESS;
   6449   VLOG(3) << __func__;
   6450 
   6451   result = Serialize_TPMI_ALG_HASH(value.hash, buffer);
   6452   if (result) {
   6453     return result;
   6454   }
   6455 
   6456   result = Serialize_TPM2B_PUBLIC_KEY_RSA(value.sig, buffer);
   6457   if (result) {
   6458     return result;
   6459   }
   6460   return result;
   6461 }
   6462 
   6463 TPM_RC Parse_TPMS_SIGNATURE_RSAPSS(std::string* buffer,
   6464                                    TPMS_SIGNATURE_RSAPSS* value,
   6465                                    std::string* value_bytes) {
   6466   TPM_RC result = TPM_RC_SUCCESS;
   6467   VLOG(3) << __func__;
   6468 
   6469   result = Parse_TPMI_ALG_HASH(buffer, &value->hash, value_bytes);
   6470   if (result) {
   6471     return result;
   6472   }
   6473 
   6474   result = Parse_TPM2B_PUBLIC_KEY_RSA(buffer, &value->sig, value_bytes);
   6475   if (result) {
   6476     return result;
   6477   }
   6478   return result;
   6479 }
   6480 
   6481 TPM_RC Serialize_TPMS_SIGNATURE_ECDSA(const TPMS_SIGNATURE_ECDSA& value,
   6482                                       std::string* buffer) {
   6483   TPM_RC result = TPM_RC_SUCCESS;
   6484   VLOG(3) << __func__;
   6485 
   6486   result = Serialize_TPMI_ALG_HASH(value.hash, buffer);
   6487   if (result) {
   6488     return result;
   6489   }
   6490 
   6491   result = Serialize_TPM2B_ECC_PARAMETER(value.signature_r, buffer);
   6492   if (result) {
   6493     return result;
   6494   }
   6495 
   6496   result = Serialize_TPM2B_ECC_PARAMETER(value.signature_s, buffer);
   6497   if (result) {
   6498     return result;
   6499   }
   6500   return result;
   6501 }
   6502 
   6503 TPM_RC Parse_TPMS_SIGNATURE_ECDSA(std::string* buffer,
   6504                                   TPMS_SIGNATURE_ECDSA* value,
   6505                                   std::string* value_bytes) {
   6506   TPM_RC result = TPM_RC_SUCCESS;
   6507   VLOG(3) << __func__;
   6508 
   6509   result = Parse_TPMI_ALG_HASH(buffer, &value->hash, value_bytes);
   6510   if (result) {
   6511     return result;
   6512   }
   6513 
   6514   result = Parse_TPM2B_ECC_PARAMETER(buffer, &value->signature_r, value_bytes);
   6515   if (result) {
   6516     return result;
   6517   }
   6518 
   6519   result = Parse_TPM2B_ECC_PARAMETER(buffer, &value->signature_s, value_bytes);
   6520   if (result) {
   6521     return result;
   6522   }
   6523   return result;
   6524 }
   6525 
   6526 TPM_RC Serialize_TPMU_SIGNATURE(const TPMU_SIGNATURE& value,
   6527                                 TPMI_ALG_SIG_SCHEME selector,
   6528                                 std::string* buffer) {
   6529   TPM_RC result = TPM_RC_SUCCESS;
   6530   VLOG(3) << __func__;
   6531 
   6532   if (selector == TPM_ALG_HMAC) {
   6533     result = Serialize_TPMT_HA(value.hmac, buffer);
   6534     if (result) {
   6535       return result;
   6536     }
   6537   }
   6538 
   6539   if (selector == TPM_ALG_ECSCHNORR) {
   6540     result = Serialize_TPMS_SIGNATURE_ECDSA(value.ecschnorr, buffer);
   6541     if (result) {
   6542       return result;
   6543     }
   6544   }
   6545 
   6546   if (selector == TPM_ALG_RSAPSS) {
   6547     result = Serialize_TPMS_SIGNATURE_RSAPSS(value.rsapss, buffer);
   6548     if (result) {
   6549       return result;
   6550     }
   6551   }
   6552 
   6553   if (selector == TPM_ALG_ECDAA) {
   6554     result = Serialize_TPMS_SIGNATURE_ECDSA(value.ecdaa, buffer);
   6555     if (result) {
   6556       return result;
   6557     }
   6558   }
   6559 
   6560   if (selector == TPM_ALG_RSASSA) {
   6561     result = Serialize_TPMS_SIGNATURE_RSASSA(value.rsassa, buffer);
   6562     if (result) {
   6563       return result;
   6564     }
   6565   }
   6566 
   6567   if (selector == TPM_ALG_SM2) {
   6568     result = Serialize_TPMS_SIGNATURE_ECDSA(value.sm2, buffer);
   6569     if (result) {
   6570       return result;
   6571     }
   6572   }
   6573 
   6574   if (selector == TPM_ALG_ECDSA) {
   6575     result = Serialize_TPMS_SIGNATURE_ECDSA(value.ecdsa, buffer);
   6576     if (result) {
   6577       return result;
   6578     }
   6579   }
   6580 
   6581   if (selector == TPM_ALG_NULL) {
   6582     // Do nothing.
   6583   }
   6584   return result;
   6585 }
   6586 
   6587 TPM_RC Parse_TPMU_SIGNATURE(std::string* buffer,
   6588                             TPMI_ALG_SIG_SCHEME selector,
   6589                             TPMU_SIGNATURE* value,
   6590                             std::string* value_bytes) {
   6591   TPM_RC result = TPM_RC_SUCCESS;
   6592   VLOG(3) << __func__;
   6593 
   6594   if (selector == TPM_ALG_HMAC) {
   6595     result = Parse_TPMT_HA(buffer, &value->hmac, value_bytes);
   6596     if (result) {
   6597       return result;
   6598     }
   6599   }
   6600 
   6601   if (selector == TPM_ALG_ECSCHNORR) {
   6602     result = Parse_TPMS_SIGNATURE_ECDSA(buffer, &value->ecschnorr, value_bytes);
   6603     if (result) {
   6604       return result;
   6605     }
   6606   }
   6607 
   6608   if (selector == TPM_ALG_RSAPSS) {
   6609     result = Parse_TPMS_SIGNATURE_RSAPSS(buffer, &value->rsapss, value_bytes);
   6610     if (result) {
   6611       return result;
   6612     }
   6613   }
   6614 
   6615   if (selector == TPM_ALG_ECDAA) {
   6616     result = Parse_TPMS_SIGNATURE_ECDSA(buffer, &value->ecdaa, value_bytes);
   6617     if (result) {
   6618       return result;
   6619     }
   6620   }
   6621 
   6622   if (selector == TPM_ALG_RSASSA) {
   6623     result = Parse_TPMS_SIGNATURE_RSASSA(buffer, &value->rsassa, value_bytes);
   6624     if (result) {
   6625       return result;
   6626     }
   6627   }
   6628 
   6629   if (selector == TPM_ALG_SM2) {
   6630     result = Parse_TPMS_SIGNATURE_ECDSA(buffer, &value->sm2, value_bytes);
   6631     if (result) {
   6632       return result;
   6633     }
   6634   }
   6635 
   6636   if (selector == TPM_ALG_ECDSA) {
   6637     result = Parse_TPMS_SIGNATURE_ECDSA(buffer, &value->ecdsa, value_bytes);
   6638     if (result) {
   6639       return result;
   6640     }
   6641   }
   6642 
   6643   if (selector == TPM_ALG_NULL) {
   6644     // Do nothing.
   6645   }
   6646   return result;
   6647 }
   6648 
   6649 TPM_RC Serialize_TPMT_SIGNATURE(const TPMT_SIGNATURE& value,
   6650                                 std::string* buffer) {
   6651   TPM_RC result = TPM_RC_SUCCESS;
   6652   VLOG(3) << __func__;
   6653 
   6654   result = Serialize_TPMI_ALG_SIG_SCHEME(value.sig_alg, buffer);
   6655   if (result) {
   6656     return result;
   6657   }
   6658 
   6659   result = Serialize_TPMU_SIGNATURE(value.signature, value.sig_alg, buffer);
   6660   if (result) {
   6661     return result;
   6662   }
   6663   return result;
   6664 }
   6665 
   6666 TPM_RC Parse_TPMT_SIGNATURE(std::string* buffer,
   6667                             TPMT_SIGNATURE* value,
   6668                             std::string* value_bytes) {
   6669   TPM_RC result = TPM_RC_SUCCESS;
   6670   VLOG(3) << __func__;
   6671 
   6672   result = Parse_TPMI_ALG_SIG_SCHEME(buffer, &value->sig_alg, value_bytes);
   6673   if (result) {
   6674     return result;
   6675   }
   6676 
   6677   result = Parse_TPMU_SIGNATURE(buffer, value->sig_alg, &value->signature,
   6678                                 value_bytes);
   6679   if (result) {
   6680     return result;
   6681   }
   6682   return result;
   6683 }
   6684 
   6685 TPM_RC Serialize_TPM2B_ENCRYPTED_SECRET(const TPM2B_ENCRYPTED_SECRET& value,
   6686                                         std::string* buffer) {
   6687   TPM_RC result = TPM_RC_SUCCESS;
   6688   VLOG(3) << __func__;
   6689 
   6690   result = Serialize_UINT16(value.size, buffer);
   6691   if (result) {
   6692     return result;
   6693   }
   6694 
   6695   if (arraysize(value.secret) < value.size) {
   6696     return TPM_RC_INSUFFICIENT;
   6697   }
   6698   for (uint32_t i = 0; i < value.size; ++i) {
   6699     result = Serialize_BYTE(value.secret[i], buffer);
   6700     if (result) {
   6701       return result;
   6702     }
   6703   }
   6704   return result;
   6705 }
   6706 
   6707 TPM_RC Parse_TPM2B_ENCRYPTED_SECRET(std::string* buffer,
   6708                                     TPM2B_ENCRYPTED_SECRET* value,
   6709                                     std::string* value_bytes) {
   6710   TPM_RC result = TPM_RC_SUCCESS;
   6711   VLOG(3) << __func__;
   6712 
   6713   result = Parse_UINT16(buffer, &value->size, value_bytes);
   6714   if (result) {
   6715     return result;
   6716   }
   6717 
   6718   if (arraysize(value->secret) < value->size) {
   6719     return TPM_RC_INSUFFICIENT;
   6720   }
   6721   for (uint32_t i = 0; i < value->size; ++i) {
   6722     result = Parse_BYTE(buffer, &value->secret[i], value_bytes);
   6723     if (result) {
   6724       return result;
   6725     }
   6726   }
   6727   return result;
   6728 }
   6729 
   6730 TPM2B_ENCRYPTED_SECRET Make_TPM2B_ENCRYPTED_SECRET(const std::string& bytes) {
   6731   TPM2B_ENCRYPTED_SECRET tpm2b;
   6732   CHECK(bytes.size() <= sizeof(tpm2b.secret));
   6733   memset(&tpm2b, 0, sizeof(TPM2B_ENCRYPTED_SECRET));
   6734   tpm2b.size = bytes.size();
   6735   memcpy(tpm2b.secret, bytes.data(), bytes.size());
   6736   return tpm2b;
   6737 }
   6738 
   6739 std::string StringFrom_TPM2B_ENCRYPTED_SECRET(
   6740     const TPM2B_ENCRYPTED_SECRET& tpm2b) {
   6741   const char* char_buffer = reinterpret_cast<const char*>(tpm2b.secret);
   6742   return std::string(char_buffer, tpm2b.size);
   6743 }
   6744 
   6745 TPM_RC Serialize_TPMS_KEYEDHASH_PARMS(const TPMS_KEYEDHASH_PARMS& value,
   6746                                       std::string* buffer) {
   6747   TPM_RC result = TPM_RC_SUCCESS;
   6748   VLOG(3) << __func__;
   6749 
   6750   result = Serialize_TPMT_KEYEDHASH_SCHEME(value.scheme, buffer);
   6751   if (result) {
   6752     return result;
   6753   }
   6754   return result;
   6755 }
   6756 
   6757 TPM_RC Parse_TPMS_KEYEDHASH_PARMS(std::string* buffer,
   6758                                   TPMS_KEYEDHASH_PARMS* value,
   6759                                   std::string* value_bytes) {
   6760   TPM_RC result = TPM_RC_SUCCESS;
   6761   VLOG(3) << __func__;
   6762 
   6763   result = Parse_TPMT_KEYEDHASH_SCHEME(buffer, &value->scheme, value_bytes);
   6764   if (result) {
   6765     return result;
   6766   }
   6767   return result;
   6768 }
   6769 
   6770 TPM_RC Serialize_TPMS_ASYM_PARMS(const TPMS_ASYM_PARMS& value,
   6771                                  std::string* buffer) {
   6772   TPM_RC result = TPM_RC_SUCCESS;
   6773   VLOG(3) << __func__;
   6774 
   6775   result = Serialize_TPMT_SYM_DEF_OBJECT(value.symmetric, buffer);
   6776   if (result) {
   6777     return result;
   6778   }
   6779 
   6780   result = Serialize_TPMT_ASYM_SCHEME(value.scheme, buffer);
   6781   if (result) {
   6782     return result;
   6783   }
   6784   return result;
   6785 }
   6786 
   6787 TPM_RC Parse_TPMS_ASYM_PARMS(std::string* buffer,
   6788                              TPMS_ASYM_PARMS* value,
   6789                              std::string* value_bytes) {
   6790   TPM_RC result = TPM_RC_SUCCESS;
   6791   VLOG(3) << __func__;
   6792 
   6793   result = Parse_TPMT_SYM_DEF_OBJECT(buffer, &value->symmetric, value_bytes);
   6794   if (result) {
   6795     return result;
   6796   }
   6797 
   6798   result = Parse_TPMT_ASYM_SCHEME(buffer, &value->scheme, value_bytes);
   6799   if (result) {
   6800     return result;
   6801   }
   6802   return result;
   6803 }
   6804 
   6805 TPM_RC Serialize_TPMS_RSA_PARMS(const TPMS_RSA_PARMS& value,
   6806                                 std::string* buffer) {
   6807   TPM_RC result = TPM_RC_SUCCESS;
   6808   VLOG(3) << __func__;
   6809 
   6810   result = Serialize_TPMT_SYM_DEF_OBJECT(value.symmetric, buffer);
   6811   if (result) {
   6812     return result;
   6813   }
   6814 
   6815   result = Serialize_TPMT_RSA_SCHEME(value.scheme, buffer);
   6816   if (result) {
   6817     return result;
   6818   }
   6819 
   6820   result = Serialize_TPMI_RSA_KEY_BITS(value.key_bits, buffer);
   6821   if (result) {
   6822     return result;
   6823   }
   6824 
   6825   result = Serialize_UINT32(value.exponent, buffer);
   6826   if (result) {
   6827     return result;
   6828   }
   6829   return result;
   6830 }
   6831 
   6832 TPM_RC Parse_TPMS_RSA_PARMS(std::string* buffer,
   6833                             TPMS_RSA_PARMS* value,
   6834                             std::string* value_bytes) {
   6835   TPM_RC result = TPM_RC_SUCCESS;
   6836   VLOG(3) << __func__;
   6837 
   6838   result = Parse_TPMT_SYM_DEF_OBJECT(buffer, &value->symmetric, value_bytes);
   6839   if (result) {
   6840     return result;
   6841   }
   6842 
   6843   result = Parse_TPMT_RSA_SCHEME(buffer, &value->scheme, value_bytes);
   6844   if (result) {
   6845     return result;
   6846   }
   6847 
   6848   result = Parse_TPMI_RSA_KEY_BITS(buffer, &value->key_bits, value_bytes);
   6849   if (result) {
   6850     return result;
   6851   }
   6852 
   6853   result = Parse_UINT32(buffer, &value->exponent, value_bytes);
   6854   if (result) {
   6855     return result;
   6856   }
   6857   return result;
   6858 }
   6859 
   6860 TPM_RC Serialize_TPMS_ECC_PARMS(const TPMS_ECC_PARMS& value,
   6861                                 std::string* buffer) {
   6862   TPM_RC result = TPM_RC_SUCCESS;
   6863   VLOG(3) << __func__;
   6864 
   6865   result = Serialize_TPMT_SYM_DEF_OBJECT(value.symmetric, buffer);
   6866   if (result) {
   6867     return result;
   6868   }
   6869 
   6870   result = Serialize_TPMT_ECC_SCHEME(value.scheme, buffer);
   6871   if (result) {
   6872     return result;
   6873   }
   6874 
   6875   result = Serialize_TPMI_ECC_CURVE(value.curve_id, buffer);
   6876   if (result) {
   6877     return result;
   6878   }
   6879 
   6880   result = Serialize_TPMT_KDF_SCHEME(value.kdf, buffer);
   6881   if (result) {
   6882     return result;
   6883   }
   6884   return result;
   6885 }
   6886 
   6887 TPM_RC Parse_TPMS_ECC_PARMS(std::string* buffer,
   6888                             TPMS_ECC_PARMS* value,
   6889                             std::string* value_bytes) {
   6890   TPM_RC result = TPM_RC_SUCCESS;
   6891   VLOG(3) << __func__;
   6892 
   6893   result = Parse_TPMT_SYM_DEF_OBJECT(buffer, &value->symmetric, value_bytes);
   6894   if (result) {
   6895     return result;
   6896   }
   6897 
   6898   result = Parse_TPMT_ECC_SCHEME(buffer, &value->scheme, value_bytes);
   6899   if (result) {
   6900     return result;
   6901   }
   6902 
   6903   result = Parse_TPMI_ECC_CURVE(buffer, &value->curve_id, value_bytes);
   6904   if (result) {
   6905     return result;
   6906   }
   6907 
   6908   result = Parse_TPMT_KDF_SCHEME(buffer, &value->kdf, value_bytes);
   6909   if (result) {
   6910     return result;
   6911   }
   6912   return result;
   6913 }
   6914 
   6915 TPM_RC Serialize_TPMU_PUBLIC_PARMS(const TPMU_PUBLIC_PARMS& value,
   6916                                    TPMI_ALG_PUBLIC selector,
   6917                                    std::string* buffer) {
   6918   TPM_RC result = TPM_RC_SUCCESS;
   6919   VLOG(3) << __func__;
   6920 
   6921   if (selector == TPM_ALG_KEYEDHASH) {
   6922     result = Serialize_TPMS_KEYEDHASH_PARMS(value.keyed_hash_detail, buffer);
   6923     if (result) {
   6924       return result;
   6925     }
   6926   }
   6927 
   6928   if (selector == TPM_ALG_RSA) {
   6929     result = Serialize_TPMS_RSA_PARMS(value.rsa_detail, buffer);
   6930     if (result) {
   6931       return result;
   6932     }
   6933   }
   6934 
   6935   if (selector == TPM_ALG_SYMCIPHER) {
   6936     result = Serialize_TPMS_SYMCIPHER_PARMS(value.sym_detail, buffer);
   6937     if (result) {
   6938       return result;
   6939     }
   6940   }
   6941 
   6942   if (selector == TPM_ALG_ECC) {
   6943     result = Serialize_TPMS_ECC_PARMS(value.ecc_detail, buffer);
   6944     if (result) {
   6945       return result;
   6946     }
   6947   }
   6948   return result;
   6949 }
   6950 
   6951 TPM_RC Parse_TPMU_PUBLIC_PARMS(std::string* buffer,
   6952                                TPMI_ALG_PUBLIC selector,
   6953                                TPMU_PUBLIC_PARMS* value,
   6954                                std::string* value_bytes) {
   6955   TPM_RC result = TPM_RC_SUCCESS;
   6956   VLOG(3) << __func__;
   6957 
   6958   if (selector == TPM_ALG_KEYEDHASH) {
   6959     result = Parse_TPMS_KEYEDHASH_PARMS(buffer, &value->keyed_hash_detail,
   6960                                         value_bytes);
   6961     if (result) {
   6962       return result;
   6963     }
   6964   }
   6965 
   6966   if (selector == TPM_ALG_RSA) {
   6967     result = Parse_TPMS_RSA_PARMS(buffer, &value->rsa_detail, value_bytes);
   6968     if (result) {
   6969       return result;
   6970     }
   6971   }
   6972 
   6973   if (selector == TPM_ALG_SYMCIPHER) {
   6974     result =
   6975         Parse_TPMS_SYMCIPHER_PARMS(buffer, &value->sym_detail, value_bytes);
   6976     if (result) {
   6977       return result;
   6978     }
   6979   }
   6980 
   6981   if (selector == TPM_ALG_ECC) {
   6982     result = Parse_TPMS_ECC_PARMS(buffer, &value->ecc_detail, value_bytes);
   6983     if (result) {
   6984       return result;
   6985     }
   6986   }
   6987   return result;
   6988 }
   6989 
   6990 TPM_RC Serialize_TPMT_PUBLIC_PARMS(const TPMT_PUBLIC_PARMS& value,
   6991                                    std::string* buffer) {
   6992   TPM_RC result = TPM_RC_SUCCESS;
   6993   VLOG(3) << __func__;
   6994 
   6995   result = Serialize_TPMI_ALG_PUBLIC(value.type, buffer);
   6996   if (result) {
   6997     return result;
   6998   }
   6999 
   7000   result = Serialize_TPMU_PUBLIC_PARMS(value.parameters, value.type, buffer);
   7001   if (result) {
   7002     return result;
   7003   }
   7004   return result;
   7005 }
   7006 
   7007 TPM_RC Parse_TPMT_PUBLIC_PARMS(std::string* buffer,
   7008                                TPMT_PUBLIC_PARMS* value,
   7009                                std::string* value_bytes) {
   7010   TPM_RC result = TPM_RC_SUCCESS;
   7011   VLOG(3) << __func__;
   7012 
   7013   result = Parse_TPMI_ALG_PUBLIC(buffer, &value->type, value_bytes);
   7014   if (result) {
   7015     return result;
   7016   }
   7017 
   7018   result = Parse_TPMU_PUBLIC_PARMS(buffer, value->type, &value->parameters,
   7019                                    value_bytes);
   7020   if (result) {
   7021     return result;
   7022   }
   7023   return result;
   7024 }
   7025 
   7026 TPM_RC Serialize_TPMU_PUBLIC_ID(const TPMU_PUBLIC_ID& value,
   7027                                 TPMI_ALG_PUBLIC selector,
   7028                                 std::string* buffer) {
   7029   TPM_RC result = TPM_RC_SUCCESS;
   7030   VLOG(3) << __func__;
   7031 
   7032   if (selector == TPM_ALG_KEYEDHASH) {
   7033     result = Serialize_TPM2B_DIGEST(value.keyed_hash, buffer);
   7034     if (result) {
   7035       return result;
   7036     }
   7037   }
   7038 
   7039   if (selector == TPM_ALG_RSA) {
   7040     result = Serialize_TPM2B_PUBLIC_KEY_RSA(value.rsa, buffer);
   7041     if (result) {
   7042       return result;
   7043     }
   7044   }
   7045 
   7046   if (selector == TPM_ALG_SYMCIPHER) {
   7047     result = Serialize_TPM2B_DIGEST(value.sym, buffer);
   7048     if (result) {
   7049       return result;
   7050     }
   7051   }
   7052 
   7053   if (selector == TPM_ALG_ECC) {
   7054     result = Serialize_TPMS_ECC_POINT(value.ecc, buffer);
   7055     if (result) {
   7056       return result;
   7057     }
   7058   }
   7059   return result;
   7060 }
   7061 
   7062 TPM_RC Parse_TPMU_PUBLIC_ID(std::string* buffer,
   7063                             TPMI_ALG_PUBLIC selector,
   7064                             TPMU_PUBLIC_ID* value,
   7065                             std::string* value_bytes) {
   7066   TPM_RC result = TPM_RC_SUCCESS;
   7067   VLOG(3) << __func__;
   7068 
   7069   if (selector == TPM_ALG_KEYEDHASH) {
   7070     result = Parse_TPM2B_DIGEST(buffer, &value->keyed_hash, value_bytes);
   7071     if (result) {
   7072       return result;
   7073     }
   7074   }
   7075 
   7076   if (selector == TPM_ALG_RSA) {
   7077     result = Parse_TPM2B_PUBLIC_KEY_RSA(buffer, &value->rsa, value_bytes);
   7078     if (result) {
   7079       return result;
   7080     }
   7081   }
   7082 
   7083   if (selector == TPM_ALG_SYMCIPHER) {
   7084     result = Parse_TPM2B_DIGEST(buffer, &value->sym, value_bytes);
   7085     if (result) {
   7086       return result;
   7087     }
   7088   }
   7089 
   7090   if (selector == TPM_ALG_ECC) {
   7091     result = Parse_TPMS_ECC_POINT(buffer, &value->ecc, value_bytes);
   7092     if (result) {
   7093       return result;
   7094     }
   7095   }
   7096   return result;
   7097 }
   7098 
   7099 TPM_RC Serialize_TPMT_PUBLIC(const TPMT_PUBLIC& value, std::string* buffer) {
   7100   TPM_RC result = TPM_RC_SUCCESS;
   7101   VLOG(3) << __func__;
   7102 
   7103   result = Serialize_TPMI_ALG_PUBLIC(value.type, buffer);
   7104   if (result) {
   7105     return result;
   7106   }
   7107 
   7108   result = Serialize_TPMI_ALG_HASH(value.name_alg, buffer);
   7109   if (result) {
   7110     return result;
   7111   }
   7112 
   7113   result = Serialize_TPMA_OBJECT(value.object_attributes, buffer);
   7114   if (result) {
   7115     return result;
   7116   }
   7117 
   7118   result = Serialize_TPM2B_DIGEST(value.auth_policy, buffer);
   7119   if (result) {
   7120     return result;
   7121   }
   7122 
   7123   result = Serialize_TPMU_PUBLIC_PARMS(value.parameters, value.type, buffer);
   7124   if (result) {
   7125     return result;
   7126   }
   7127 
   7128   result = Serialize_TPMU_PUBLIC_ID(value.unique, value.type, buffer);
   7129   if (result) {
   7130     return result;
   7131   }
   7132   return result;
   7133 }
   7134 
   7135 TPM_RC Parse_TPMT_PUBLIC(std::string* buffer,
   7136                          TPMT_PUBLIC* value,
   7137                          std::string* value_bytes) {
   7138   TPM_RC result = TPM_RC_SUCCESS;
   7139   VLOG(3) << __func__;
   7140 
   7141   result = Parse_TPMI_ALG_PUBLIC(buffer, &value->type, value_bytes);
   7142   if (result) {
   7143     return result;
   7144   }
   7145 
   7146   result = Parse_TPMI_ALG_HASH(buffer, &value->name_alg, value_bytes);
   7147   if (result) {
   7148     return result;
   7149   }
   7150 
   7151   result = Parse_TPMA_OBJECT(buffer, &value->object_attributes, value_bytes);
   7152   if (result) {
   7153     return result;
   7154   }
   7155 
   7156   result = Parse_TPM2B_DIGEST(buffer, &value->auth_policy, value_bytes);
   7157   if (result) {
   7158     return result;
   7159   }
   7160 
   7161   result = Parse_TPMU_PUBLIC_PARMS(buffer, value->type, &value->parameters,
   7162                                    value_bytes);
   7163   if (result) {
   7164     return result;
   7165   }
   7166 
   7167   result =
   7168       Parse_TPMU_PUBLIC_ID(buffer, value->type, &value->unique, value_bytes);
   7169   if (result) {
   7170     return result;
   7171   }
   7172   return result;
   7173 }
   7174 
   7175 TPM_RC Serialize_TPM2B_PUBLIC(const TPM2B_PUBLIC& value, std::string* buffer) {
   7176   TPM_RC result = TPM_RC_SUCCESS;
   7177   VLOG(3) << __func__;
   7178 
   7179   std::string field_bytes;
   7180   result = Serialize_TPMT_PUBLIC(value.public_area, &field_bytes);
   7181   if (result) {
   7182     return result;
   7183   }
   7184   std::string size_bytes;
   7185   result = Serialize_UINT16(field_bytes.size(), &size_bytes);
   7186   if (result) {
   7187     return result;
   7188   }
   7189   buffer->append(size_bytes + field_bytes);
   7190   return result;
   7191 }
   7192 
   7193 TPM_RC Parse_TPM2B_PUBLIC(std::string* buffer,
   7194                           TPM2B_PUBLIC* value,
   7195                           std::string* value_bytes) {
   7196   TPM_RC result = TPM_RC_SUCCESS;
   7197   VLOG(3) << __func__;
   7198 
   7199   result = Parse_UINT16(buffer, &value->size, value_bytes);
   7200   if (result) {
   7201     return result;
   7202   }
   7203 
   7204   result = Parse_TPMT_PUBLIC(buffer, &value->public_area, value_bytes);
   7205   if (result) {
   7206     return result;
   7207   }
   7208   return result;
   7209 }
   7210 
   7211 TPM2B_PUBLIC Make_TPM2B_PUBLIC(const TPMT_PUBLIC& inner) {
   7212   TPM2B_PUBLIC tpm2b;
   7213   tpm2b.size = sizeof(TPMT_PUBLIC);
   7214   tpm2b.public_area = inner;
   7215   return tpm2b;
   7216 }
   7217 
   7218 TPM_RC Serialize_TPM2B_PRIVATE_VENDOR_SPECIFIC(
   7219     const TPM2B_PRIVATE_VENDOR_SPECIFIC& value,
   7220     std::string* buffer) {
   7221   TPM_RC result = TPM_RC_SUCCESS;
   7222   VLOG(3) << __func__;
   7223 
   7224   result = Serialize_UINT16(value.size, buffer);
   7225   if (result) {
   7226     return result;
   7227   }
   7228 
   7229   if (arraysize(value.buffer) < value.size) {
   7230     return TPM_RC_INSUFFICIENT;
   7231   }
   7232   for (uint32_t i = 0; i < value.size; ++i) {
   7233     result = Serialize_BYTE(value.buffer[i], buffer);
   7234     if (result) {
   7235       return result;
   7236     }
   7237   }
   7238   return result;
   7239 }
   7240 
   7241 TPM_RC Parse_TPM2B_PRIVATE_VENDOR_SPECIFIC(std::string* buffer,
   7242                                            TPM2B_PRIVATE_VENDOR_SPECIFIC* value,
   7243                                            std::string* value_bytes) {
   7244   TPM_RC result = TPM_RC_SUCCESS;
   7245   VLOG(3) << __func__;
   7246 
   7247   result = Parse_UINT16(buffer, &value->size, value_bytes);
   7248   if (result) {
   7249     return result;
   7250   }
   7251 
   7252   if (arraysize(value->buffer) < value->size) {
   7253     return TPM_RC_INSUFFICIENT;
   7254   }
   7255   for (uint32_t i = 0; i < value->size; ++i) {
   7256     result = Parse_BYTE(buffer, &value->buffer[i], value_bytes);
   7257     if (result) {
   7258       return result;
   7259     }
   7260   }
   7261   return result;
   7262 }
   7263 
   7264 TPM2B_PRIVATE_VENDOR_SPECIFIC Make_TPM2B_PRIVATE_VENDOR_SPECIFIC(
   7265     const std::string& bytes) {
   7266   TPM2B_PRIVATE_VENDOR_SPECIFIC tpm2b;
   7267   CHECK(bytes.size() <= sizeof(tpm2b.buffer));
   7268   memset(&tpm2b, 0, sizeof(TPM2B_PRIVATE_VENDOR_SPECIFIC));
   7269   tpm2b.size = bytes.size();
   7270   memcpy(tpm2b.buffer, bytes.data(), bytes.size());
   7271   return tpm2b;
   7272 }
   7273 
   7274 std::string StringFrom_TPM2B_PRIVATE_VENDOR_SPECIFIC(
   7275     const TPM2B_PRIVATE_VENDOR_SPECIFIC& tpm2b) {
   7276   const char* char_buffer = reinterpret_cast<const char*>(tpm2b.buffer);
   7277   return std::string(char_buffer, tpm2b.size);
   7278 }
   7279 
   7280 TPM_RC Serialize_TPMU_SENSITIVE_COMPOSITE(const TPMU_SENSITIVE_COMPOSITE& value,
   7281                                           TPMI_ALG_PUBLIC selector,
   7282                                           std::string* buffer) {
   7283   TPM_RC result = TPM_RC_SUCCESS;
   7284   VLOG(3) << __func__;
   7285 
   7286   if (selector == TPM_ALG_KEYEDHASH) {
   7287     result = Serialize_TPM2B_SENSITIVE_DATA(value.bits, buffer);
   7288     if (result) {
   7289       return result;
   7290     }
   7291   }
   7292 
   7293   if (selector == TPM_ALG_RSA) {
   7294     result = Serialize_TPM2B_PRIVATE_KEY_RSA(value.rsa, buffer);
   7295     if (result) {
   7296       return result;
   7297     }
   7298   }
   7299 
   7300   if (selector == TPM_ALG_SYMCIPHER) {
   7301     result = Serialize_TPM2B_SYM_KEY(value.sym, buffer);
   7302     if (result) {
   7303       return result;
   7304     }
   7305   }
   7306 
   7307   if (selector == TPM_ALG_ECC) {
   7308     result = Serialize_TPM2B_ECC_PARAMETER(value.ecc, buffer);
   7309     if (result) {
   7310       return result;
   7311     }
   7312   }
   7313   return result;
   7314 }
   7315 
   7316 TPM_RC Parse_TPMU_SENSITIVE_COMPOSITE(std::string* buffer,
   7317                                       TPMI_ALG_PUBLIC selector,
   7318                                       TPMU_SENSITIVE_COMPOSITE* value,
   7319                                       std::string* value_bytes) {
   7320   TPM_RC result = TPM_RC_SUCCESS;
   7321   VLOG(3) << __func__;
   7322 
   7323   if (selector == TPM_ALG_KEYEDHASH) {
   7324     result = Parse_TPM2B_SENSITIVE_DATA(buffer, &value->bits, value_bytes);
   7325     if (result) {
   7326       return result;
   7327     }
   7328   }
   7329 
   7330   if (selector == TPM_ALG_RSA) {
   7331     result = Parse_TPM2B_PRIVATE_KEY_RSA(buffer, &value->rsa, value_bytes);
   7332     if (result) {
   7333       return result;
   7334     }
   7335   }
   7336 
   7337   if (selector == TPM_ALG_SYMCIPHER) {
   7338     result = Parse_TPM2B_SYM_KEY(buffer, &value->sym, value_bytes);
   7339     if (result) {
   7340       return result;
   7341     }
   7342   }
   7343 
   7344   if (selector == TPM_ALG_ECC) {
   7345     result = Parse_TPM2B_ECC_PARAMETER(buffer, &value->ecc, value_bytes);
   7346     if (result) {
   7347       return result;
   7348     }
   7349   }
   7350   return result;
   7351 }
   7352 
   7353 TPM_RC Serialize_TPMT_SENSITIVE(const TPMT_SENSITIVE& value,
   7354                                 std::string* buffer) {
   7355   TPM_RC result = TPM_RC_SUCCESS;
   7356   VLOG(3) << __func__;
   7357 
   7358   result = Serialize_TPMI_ALG_PUBLIC(value.sensitive_type, buffer);
   7359   if (result) {
   7360     return result;
   7361   }
   7362 
   7363   result = Serialize_TPM2B_AUTH(value.auth_value, buffer);
   7364   if (result) {
   7365     return result;
   7366   }
   7367 
   7368   result = Serialize_TPM2B_DIGEST(value.seed_value, buffer);
   7369   if (result) {
   7370     return result;
   7371   }
   7372 
   7373   result = Serialize_TPMU_SENSITIVE_COMPOSITE(value.sensitive,
   7374                                               value.sensitive_type, buffer);
   7375   if (result) {
   7376     return result;
   7377   }
   7378   return result;
   7379 }
   7380 
   7381 TPM_RC Parse_TPMT_SENSITIVE(std::string* buffer,
   7382                             TPMT_SENSITIVE* value,
   7383                             std::string* value_bytes) {
   7384   TPM_RC result = TPM_RC_SUCCESS;
   7385   VLOG(3) << __func__;
   7386 
   7387   result = Parse_TPMI_ALG_PUBLIC(buffer, &value->sensitive_type, value_bytes);
   7388   if (result) {
   7389     return result;
   7390   }
   7391 
   7392   result = Parse_TPM2B_AUTH(buffer, &value->auth_value, value_bytes);
   7393   if (result) {
   7394     return result;
   7395   }
   7396 
   7397   result = Parse_TPM2B_DIGEST(buffer, &value->seed_value, value_bytes);
   7398   if (result) {
   7399     return result;
   7400   }
   7401 
   7402   result = Parse_TPMU_SENSITIVE_COMPOSITE(buffer, value->sensitive_type,
   7403                                           &value->sensitive, value_bytes);
   7404   if (result) {
   7405     return result;
   7406   }
   7407   return result;
   7408 }
   7409 
   7410 TPM_RC Serialize_TPM2B_SENSITIVE(const TPM2B_SENSITIVE& value,
   7411                                  std::string* buffer) {
   7412   TPM_RC result = TPM_RC_SUCCESS;
   7413   VLOG(3) << __func__;
   7414 
   7415   std::string field_bytes;
   7416   result = Serialize_TPMT_SENSITIVE(value.sensitive_area, &field_bytes);
   7417   if (result) {
   7418     return result;
   7419   }
   7420   std::string size_bytes;
   7421   result = Serialize_UINT16(field_bytes.size(), &size_bytes);
   7422   if (result) {
   7423     return result;
   7424   }
   7425   buffer->append(size_bytes + field_bytes);
   7426   return result;
   7427 }
   7428 
   7429 TPM_RC Parse_TPM2B_SENSITIVE(std::string* buffer,
   7430                              TPM2B_SENSITIVE* value,
   7431                              std::string* value_bytes) {
   7432   TPM_RC result = TPM_RC_SUCCESS;
   7433   VLOG(3) << __func__;
   7434 
   7435   result = Parse_UINT16(buffer, &value->size, value_bytes);
   7436   if (result) {
   7437     return result;
   7438   }
   7439 
   7440   result = Parse_TPMT_SENSITIVE(buffer, &value->sensitive_area, value_bytes);
   7441   if (result) {
   7442     return result;
   7443   }
   7444   return result;
   7445 }
   7446 
   7447 TPM2B_SENSITIVE Make_TPM2B_SENSITIVE(const TPMT_SENSITIVE& inner) {
   7448   TPM2B_SENSITIVE tpm2b;
   7449   tpm2b.size = sizeof(TPMT_SENSITIVE);
   7450   tpm2b.sensitive_area = inner;
   7451   return tpm2b;
   7452 }
   7453 
   7454 TPM_RC Serialize__PRIVATE(const _PRIVATE& value, std::string* buffer) {
   7455   TPM_RC result = TPM_RC_SUCCESS;
   7456   VLOG(3) << __func__;
   7457 
   7458   result = Serialize_TPM2B_DIGEST(value.integrity_outer, buffer);
   7459   if (result) {
   7460     return result;
   7461   }
   7462 
   7463   result = Serialize_TPM2B_DIGEST(value.integrity_inner, buffer);
   7464   if (result) {
   7465     return result;
   7466   }
   7467 
   7468   result = Serialize_TPMT_SENSITIVE(value.sensitive, buffer);
   7469   if (result) {
   7470     return result;
   7471   }
   7472   return result;
   7473 }
   7474 
   7475 TPM_RC Parse__PRIVATE(std::string* buffer,
   7476                       _PRIVATE* value,
   7477                       std::string* value_bytes) {
   7478   TPM_RC result = TPM_RC_SUCCESS;
   7479   VLOG(3) << __func__;
   7480 
   7481   result = Parse_TPM2B_DIGEST(buffer, &value->integrity_outer, value_bytes);
   7482   if (result) {
   7483     return result;
   7484   }
   7485 
   7486   result = Parse_TPM2B_DIGEST(buffer, &value->integrity_inner, value_bytes);
   7487   if (result) {
   7488     return result;
   7489   }
   7490 
   7491   result = Parse_TPMT_SENSITIVE(buffer, &value->sensitive, value_bytes);
   7492   if (result) {
   7493     return result;
   7494   }
   7495   return result;
   7496 }
   7497 
   7498 TPM_RC Serialize_TPM2B_PRIVATE(const TPM2B_PRIVATE& value,
   7499                                std::string* buffer) {
   7500   TPM_RC result = TPM_RC_SUCCESS;
   7501   VLOG(3) << __func__;
   7502 
   7503   result = Serialize_UINT16(value.size, buffer);
   7504   if (result) {
   7505     return result;
   7506   }
   7507 
   7508   if (arraysize(value.buffer) < value.size) {
   7509     return TPM_RC_INSUFFICIENT;
   7510   }
   7511   for (uint32_t i = 0; i < value.size; ++i) {
   7512     result = Serialize_BYTE(value.buffer[i], buffer);
   7513     if (result) {
   7514       return result;
   7515     }
   7516   }
   7517   return result;
   7518 }
   7519 
   7520 TPM_RC Parse_TPM2B_PRIVATE(std::string* buffer,
   7521                            TPM2B_PRIVATE* value,
   7522                            std::string* value_bytes) {
   7523   TPM_RC result = TPM_RC_SUCCESS;
   7524   VLOG(3) << __func__;
   7525 
   7526   result = Parse_UINT16(buffer, &value->size, value_bytes);
   7527   if (result) {
   7528     return result;
   7529   }
   7530 
   7531   if (arraysize(value->buffer) < value->size) {
   7532     return TPM_RC_INSUFFICIENT;
   7533   }
   7534   for (uint32_t i = 0; i < value->size; ++i) {
   7535     result = Parse_BYTE(buffer, &value->buffer[i], value_bytes);
   7536     if (result) {
   7537       return result;
   7538     }
   7539   }
   7540   return result;
   7541 }
   7542 
   7543 TPM2B_PRIVATE Make_TPM2B_PRIVATE(const std::string& bytes) {
   7544   TPM2B_PRIVATE tpm2b;
   7545   CHECK(bytes.size() <= sizeof(tpm2b.buffer));
   7546   memset(&tpm2b, 0, sizeof(TPM2B_PRIVATE));
   7547   tpm2b.size = bytes.size();
   7548   memcpy(tpm2b.buffer, bytes.data(), bytes.size());
   7549   return tpm2b;
   7550 }
   7551 
   7552 std::string StringFrom_TPM2B_PRIVATE(const TPM2B_PRIVATE& tpm2b) {
   7553   const char* char_buffer = reinterpret_cast<const char*>(tpm2b.buffer);
   7554   return std::string(char_buffer, tpm2b.size);
   7555 }
   7556 
   7557 TPM_RC Serialize__ID_OBJECT(const _ID_OBJECT& value, std::string* buffer) {
   7558   TPM_RC result = TPM_RC_SUCCESS;
   7559   VLOG(3) << __func__;
   7560 
   7561   result = Serialize_TPM2B_DIGEST(value.integrity_hmac, buffer);
   7562   if (result) {
   7563     return result;
   7564   }
   7565 
   7566   result = Serialize_TPM2B_DIGEST(value.enc_identity, buffer);
   7567   if (result) {
   7568     return result;
   7569   }
   7570   return result;
   7571 }
   7572 
   7573 TPM_RC Parse__ID_OBJECT(std::string* buffer,
   7574                         _ID_OBJECT* value,
   7575                         std::string* value_bytes) {
   7576   TPM_RC result = TPM_RC_SUCCESS;
   7577   VLOG(3) << __func__;
   7578 
   7579   result = Parse_TPM2B_DIGEST(buffer, &value->integrity_hmac, value_bytes);
   7580   if (result) {
   7581     return result;
   7582   }
   7583 
   7584   result = Parse_TPM2B_DIGEST(buffer, &value->enc_identity, value_bytes);
   7585   if (result) {
   7586     return result;
   7587   }
   7588   return result;
   7589 }
   7590 
   7591 TPM_RC Serialize_TPM2B_ID_OBJECT(const TPM2B_ID_OBJECT& value,
   7592                                  std::string* buffer) {
   7593   TPM_RC result = TPM_RC_SUCCESS;
   7594   VLOG(3) << __func__;
   7595 
   7596   result = Serialize_UINT16(value.size, buffer);
   7597   if (result) {
   7598     return result;
   7599   }
   7600 
   7601   if (arraysize(value.credential) < value.size) {
   7602     return TPM_RC_INSUFFICIENT;
   7603   }
   7604   for (uint32_t i = 0; i < value.size; ++i) {
   7605     result = Serialize_BYTE(value.credential[i], buffer);
   7606     if (result) {
   7607       return result;
   7608     }
   7609   }
   7610   return result;
   7611 }
   7612 
   7613 TPM_RC Parse_TPM2B_ID_OBJECT(std::string* buffer,
   7614                              TPM2B_ID_OBJECT* value,
   7615                              std::string* value_bytes) {
   7616   TPM_RC result = TPM_RC_SUCCESS;
   7617   VLOG(3) << __func__;
   7618 
   7619   result = Parse_UINT16(buffer, &value->size, value_bytes);
   7620   if (result) {
   7621     return result;
   7622   }
   7623 
   7624   if (arraysize(value->credential) < value->size) {
   7625     return TPM_RC_INSUFFICIENT;
   7626   }
   7627   for (uint32_t i = 0; i < value->size; ++i) {
   7628     result = Parse_BYTE(buffer, &value->credential[i], value_bytes);
   7629     if (result) {
   7630       return result;
   7631     }
   7632   }
   7633   return result;
   7634 }
   7635 
   7636 TPM2B_ID_OBJECT Make_TPM2B_ID_OBJECT(const std::string& bytes) {
   7637   TPM2B_ID_OBJECT tpm2b;
   7638   CHECK(bytes.size() <= sizeof(tpm2b.credential));
   7639   memset(&tpm2b, 0, sizeof(TPM2B_ID_OBJECT));
   7640   tpm2b.size = bytes.size();
   7641   memcpy(tpm2b.credential, bytes.data(), bytes.size());
   7642   return tpm2b;
   7643 }
   7644 
   7645 std::string StringFrom_TPM2B_ID_OBJECT(const TPM2B_ID_OBJECT& tpm2b) {
   7646   const char* char_buffer = reinterpret_cast<const char*>(tpm2b.credential);
   7647   return std::string(char_buffer, tpm2b.size);
   7648 }
   7649 
   7650 TPM_RC Serialize_TPMS_NV_PUBLIC(const TPMS_NV_PUBLIC& value,
   7651                                 std::string* buffer) {
   7652   TPM_RC result = TPM_RC_SUCCESS;
   7653   VLOG(3) << __func__;
   7654 
   7655   result = Serialize_TPMI_RH_NV_INDEX(value.nv_index, buffer);
   7656   if (result) {
   7657     return result;
   7658   }
   7659 
   7660   result = Serialize_TPMI_ALG_HASH(value.name_alg, buffer);
   7661   if (result) {
   7662     return result;
   7663   }
   7664 
   7665   result = Serialize_TPMA_NV(value.attributes, buffer);
   7666   if (result) {
   7667     return result;
   7668   }
   7669 
   7670   result = Serialize_TPM2B_DIGEST(value.auth_policy, buffer);
   7671   if (result) {
   7672     return result;
   7673   }
   7674 
   7675   result = Serialize_UINT16(value.data_size, buffer);
   7676   if (result) {
   7677     return result;
   7678   }
   7679   return result;
   7680 }
   7681 
   7682 TPM_RC Parse_TPMS_NV_PUBLIC(std::string* buffer,
   7683                             TPMS_NV_PUBLIC* value,
   7684                             std::string* value_bytes) {
   7685   TPM_RC result = TPM_RC_SUCCESS;
   7686   VLOG(3) << __func__;
   7687 
   7688   result = Parse_TPMI_RH_NV_INDEX(buffer, &value->nv_index, value_bytes);
   7689   if (result) {
   7690     return result;
   7691   }
   7692 
   7693   result = Parse_TPMI_ALG_HASH(buffer, &value->name_alg, value_bytes);
   7694   if (result) {
   7695     return result;
   7696   }
   7697 
   7698   result = Parse_TPMA_NV(buffer, &value->attributes, value_bytes);
   7699   if (result) {
   7700     return result;
   7701   }
   7702 
   7703   result = Parse_TPM2B_DIGEST(buffer, &value->auth_policy, value_bytes);
   7704   if (result) {
   7705     return result;
   7706   }
   7707 
   7708   result = Parse_UINT16(buffer, &value->data_size, value_bytes);
   7709   if (result) {
   7710     return result;
   7711   }
   7712   return result;
   7713 }
   7714 
   7715 TPM_RC Serialize_TPM2B_NV_PUBLIC(const TPM2B_NV_PUBLIC& value,
   7716                                  std::string* buffer) {
   7717   TPM_RC result = TPM_RC_SUCCESS;
   7718   VLOG(3) << __func__;
   7719 
   7720   std::string field_bytes;
   7721   result = Serialize_TPMS_NV_PUBLIC(value.nv_public, &field_bytes);
   7722   if (result) {
   7723     return result;
   7724   }
   7725   std::string size_bytes;
   7726   result = Serialize_UINT16(field_bytes.size(), &size_bytes);
   7727   if (result) {
   7728     return result;
   7729   }
   7730   buffer->append(size_bytes + field_bytes);
   7731   return result;
   7732 }
   7733 
   7734 TPM_RC Parse_TPM2B_NV_PUBLIC(std::string* buffer,
   7735                              TPM2B_NV_PUBLIC* value,
   7736                              std::string* value_bytes) {
   7737   TPM_RC result = TPM_RC_SUCCESS;
   7738   VLOG(3) << __func__;
   7739 
   7740   result = Parse_UINT16(buffer, &value->size, value_bytes);
   7741   if (result) {
   7742     return result;
   7743   }
   7744 
   7745   result = Parse_TPMS_NV_PUBLIC(buffer, &value->nv_public, value_bytes);
   7746   if (result) {
   7747     return result;
   7748   }
   7749   return result;
   7750 }
   7751 
   7752 TPM2B_NV_PUBLIC Make_TPM2B_NV_PUBLIC(const TPMS_NV_PUBLIC& inner) {
   7753   TPM2B_NV_PUBLIC tpm2b;
   7754   tpm2b.size = sizeof(TPMS_NV_PUBLIC);
   7755   tpm2b.nv_public = inner;
   7756   return tpm2b;
   7757 }
   7758 
   7759 TPM_RC Serialize_TPM2B_CONTEXT_SENSITIVE(const TPM2B_CONTEXT_SENSITIVE& value,
   7760                                          std::string* buffer) {
   7761   TPM_RC result = TPM_RC_SUCCESS;
   7762   VLOG(3) << __func__;
   7763 
   7764   result = Serialize_UINT16(value.size, buffer);
   7765   if (result) {
   7766     return result;
   7767   }
   7768 
   7769   if (arraysize(value.buffer) < value.size) {
   7770     return TPM_RC_INSUFFICIENT;
   7771   }
   7772   for (uint32_t i = 0; i < value.size; ++i) {
   7773     result = Serialize_BYTE(value.buffer[i], buffer);
   7774     if (result) {
   7775       return result;
   7776     }
   7777   }
   7778   return result;
   7779 }
   7780 
   7781 TPM_RC Parse_TPM2B_CONTEXT_SENSITIVE(std::string* buffer,
   7782                                      TPM2B_CONTEXT_SENSITIVE* value,
   7783                                      std::string* value_bytes) {
   7784   TPM_RC result = TPM_RC_SUCCESS;
   7785   VLOG(3) << __func__;
   7786 
   7787   result = Parse_UINT16(buffer, &value->size, value_bytes);
   7788   if (result) {
   7789     return result;
   7790   }
   7791 
   7792   if (arraysize(value->buffer) < value->size) {
   7793     return TPM_RC_INSUFFICIENT;
   7794   }
   7795   for (uint32_t i = 0; i < value->size; ++i) {
   7796     result = Parse_BYTE(buffer, &value->buffer[i], value_bytes);
   7797     if (result) {
   7798       return result;
   7799     }
   7800   }
   7801   return result;
   7802 }
   7803 
   7804 TPM2B_CONTEXT_SENSITIVE Make_TPM2B_CONTEXT_SENSITIVE(const std::string& bytes) {
   7805   TPM2B_CONTEXT_SENSITIVE tpm2b;
   7806   CHECK(bytes.size() <= sizeof(tpm2b.buffer));
   7807   memset(&tpm2b, 0, sizeof(TPM2B_CONTEXT_SENSITIVE));
   7808   tpm2b.size = bytes.size();
   7809   memcpy(tpm2b.buffer, bytes.data(), bytes.size());
   7810   return tpm2b;
   7811 }
   7812 
   7813 std::string StringFrom_TPM2B_CONTEXT_SENSITIVE(
   7814     const TPM2B_CONTEXT_SENSITIVE& tpm2b) {
   7815   const char* char_buffer = reinterpret_cast<const char*>(tpm2b.buffer);
   7816   return std::string(char_buffer, tpm2b.size);
   7817 }
   7818 
   7819 TPM_RC Serialize_TPMS_CONTEXT_DATA(const TPMS_CONTEXT_DATA& value,
   7820                                    std::string* buffer) {
   7821   TPM_RC result = TPM_RC_SUCCESS;
   7822   VLOG(3) << __func__;
   7823 
   7824   result = Serialize_TPM2B_DIGEST(value.integrity, buffer);
   7825   if (result) {
   7826     return result;
   7827   }
   7828 
   7829   result = Serialize_TPM2B_CONTEXT_SENSITIVE(value.encrypted, buffer);
   7830   if (result) {
   7831     return result;
   7832   }
   7833   return result;
   7834 }
   7835 
   7836 TPM_RC Parse_TPMS_CONTEXT_DATA(std::string* buffer,
   7837                                TPMS_CONTEXT_DATA* value,
   7838                                std::string* value_bytes) {
   7839   TPM_RC result = TPM_RC_SUCCESS;
   7840   VLOG(3) << __func__;
   7841 
   7842   result = Parse_TPM2B_DIGEST(buffer, &value->integrity, value_bytes);
   7843   if (result) {
   7844     return result;
   7845   }
   7846 
   7847   result =
   7848       Parse_TPM2B_CONTEXT_SENSITIVE(buffer, &value->encrypted, value_bytes);
   7849   if (result) {
   7850     return result;
   7851   }
   7852   return result;
   7853 }
   7854 
   7855 TPM_RC Serialize_TPM2B_CONTEXT_DATA(const TPM2B_CONTEXT_DATA& value,
   7856                                     std::string* buffer) {
   7857   TPM_RC result = TPM_RC_SUCCESS;
   7858   VLOG(3) << __func__;
   7859 
   7860   result = Serialize_UINT16(value.size, buffer);
   7861   if (result) {
   7862     return result;
   7863   }
   7864 
   7865   if (arraysize(value.buffer) < value.size) {
   7866     return TPM_RC_INSUFFICIENT;
   7867   }
   7868   for (uint32_t i = 0; i < value.size; ++i) {
   7869     result = Serialize_BYTE(value.buffer[i], buffer);
   7870     if (result) {
   7871       return result;
   7872     }
   7873   }
   7874   return result;
   7875 }
   7876 
   7877 TPM_RC Parse_TPM2B_CONTEXT_DATA(std::string* buffer,
   7878                                 TPM2B_CONTEXT_DATA* value,
   7879                                 std::string* value_bytes) {
   7880   TPM_RC result = TPM_RC_SUCCESS;
   7881   VLOG(3) << __func__;
   7882 
   7883   result = Parse_UINT16(buffer, &value->size, value_bytes);
   7884   if (result) {
   7885     return result;
   7886   }
   7887 
   7888   if (arraysize(value->buffer) < value->size) {
   7889     return TPM_RC_INSUFFICIENT;
   7890   }
   7891   for (uint32_t i = 0; i < value->size; ++i) {
   7892     result = Parse_BYTE(buffer, &value->buffer[i], value_bytes);
   7893     if (result) {
   7894       return result;
   7895     }
   7896   }
   7897   return result;
   7898 }
   7899 
   7900 TPM2B_CONTEXT_DATA Make_TPM2B_CONTEXT_DATA(const std::string& bytes) {
   7901   TPM2B_CONTEXT_DATA tpm2b;
   7902   CHECK(bytes.size() <= sizeof(tpm2b.buffer));
   7903   memset(&tpm2b, 0, sizeof(TPM2B_CONTEXT_DATA));
   7904   tpm2b.size = bytes.size();
   7905   memcpy(tpm2b.buffer, bytes.data(), bytes.size());
   7906   return tpm2b;
   7907 }
   7908 
   7909 std::string StringFrom_TPM2B_CONTEXT_DATA(const TPM2B_CONTEXT_DATA& tpm2b) {
   7910   const char* char_buffer = reinterpret_cast<const char*>(tpm2b.buffer);
   7911   return std::string(char_buffer, tpm2b.size);
   7912 }
   7913 
   7914 TPM_RC