@@ -748,7 +748,7 @@ void id_get_metadata(json::JSON &meta_json, bool locked /*=true*/)
748748 meta_json = json::JSON ();
749749 goto cleanup;
750750 }
751- meta_json = json::JSON::Load (std::string ( reinterpret_cast < char *>( p_data + strlen (TEE_PRIVATE_TAG)) , data_len) );
751+ meta_json = json::JSON::Load (p_data + strlen (TEE_PRIVATE_TAG), data_len);
752752 if (meta_json.size () == 0 )
753753 {
754754 goto cleanup;
@@ -905,28 +905,116 @@ crust_status_t id_store_metadata()
905905 crust_status_t crust_status = CRUST_SUCCESS;
906906 std::string hex_id_key_str = hexstring_safe (&id_key_pair, sizeof (id_key_pair));
907907
908+ // Calculate metadata volumn
909+ size_t meta_len = 0 ;
910+ for (auto it : wl->srd_path2hashs_m )
911+ {
912+ meta_len += it.second .size () * (64 + 3 );
913+ }
914+ meta_len += wl->srd_path2hashs_m .size () * (128 + 4 );
915+ meta_len += strlen (TEE_PRIVATE_TAG) + 5
916+ + strlen (ID_WORKLOAD) + 5
917+ + strlen (ID_KEY_PAIR) + 5
918+ + strlen (ID_REPORT_SLOT) + 5
919+ + strlen (ID_CHAIN_ACCOUNT_ID) + 5
920+ + strlen (ID_FILE) + 5 ;
921+ size_t file_item_len = strlen (FILE_HASH) + 3 + 64 + 3
922+ + strlen (FILE_OLD_HASH) + 3 + 64 + 3
923+ + strlen (FILE_SIZE) + 3 + 14 + 1
924+ + strlen (FILE_OLD_SIZE) + 3 + 14 + 1
925+ + strlen (FILE_BLOCK_NUM) + 3 + 14 + 4
926+ + strlen (FILE_STATUS) + 16 + 4
927+ + 2 ;
928+ meta_len += wl->checked_files .size () * file_item_len;
929+ uint8_t *meta_buf = (uint8_t *)enc_malloc (meta_len);
930+ if (meta_buf == NULL )
931+ {
932+ return CRUST_MALLOC_FAILED;
933+ }
934+ memset (meta_buf, 0 , meta_len);
935+ size_t offset = 0 ;
936+
908937 // ----- Store metadata ----- //
909- std::string meta_str (TEE_PRIVATE_TAG);
910- meta_str.append (" {" );
938+ memcpy (meta_buf, TEE_PRIVATE_TAG, strlen (TEE_PRIVATE_TAG));
939+ offset += strlen (TEE_PRIVATE_TAG);
940+ memcpy (meta_buf + offset, " {" , 1 );
941+ offset += 1 ;
911942 // Append srd
912- meta_str.append (" \" " ).append (ID_WORKLOAD).append (" \" :" );
913- wl->serialize_srd (meta_str);
914- meta_str.append (" ," );
943+ std::string wl_title;
944+ wl_title.append (" \" " ).append (ID_WORKLOAD).append (" \" :{" );
945+ memcpy (meta_buf + offset, wl_title.c_str (), wl_title.size ());
946+ offset += wl_title.size ();
947+ size_t i = 0 ;
948+ for (auto it = wl->srd_path2hashs_m .begin (); it != wl->srd_path2hashs_m .end (); it++, i++)
949+ {
950+ std::string path_title;
951+ path_title.append (" \" " ).append (it->first ).append (" \" :[" );
952+ memcpy (meta_buf + offset, path_title.c_str (), path_title.size ());
953+ offset += path_title.size ();
954+ for (size_t j = 0 ; j < it->second .size (); j++)
955+ {
956+ std::string hash_str;
957+ hash_str.append (" \" " ).append (hexstring_safe (it->second [j], HASH_LENGTH)).append (" \" " );
958+ memcpy (meta_buf + offset, hash_str.c_str (), hash_str.size ());
959+ offset += hash_str.size ();
960+ if (j != it->second .size () - 1 )
961+ {
962+ memcpy (meta_buf + offset, " ," , 1 );
963+ offset += 1 ;
964+ }
965+ }
966+ memcpy (meta_buf + offset, " ]" , 1 );
967+ offset += 1 ;
968+ if (i != wl->srd_path2hashs_m .size () - 1 )
969+ {
970+ memcpy (meta_buf + offset, " ," , 1 );
971+ offset += 1 ;
972+ }
973+ }
974+ memcpy (meta_buf + offset, " }," , 2 );
975+ offset += 2 ;
915976 // Append id key pair
916- meta_str.append (" \" " ).append (ID_KEY_PAIR).append (" \" :" )
977+ std::string key_pair_str;
978+ key_pair_str.append (" \" " ).append (ID_KEY_PAIR).append (" \" :" )
917979 .append (" \" " ).append (hex_id_key_str).append (" \" ," );
980+ memcpy (meta_buf + offset, key_pair_str.c_str (), key_pair_str.size ());
981+ offset += key_pair_str.size ();
918982 // Append report slot
919- meta_str.append (" \" " ).append (ID_REPORT_SLOT).append (" \" :" )
983+ std::string report_slot_str;
984+ report_slot_str.append (" \" " ).append (ID_REPORT_SLOT).append (" \" :" )
920985 .append (" \" " ).append (std::to_string (report_slot)).append (" \" ," );
986+ memcpy (meta_buf + offset, report_slot_str.c_str (), report_slot_str.size ());
987+ offset += report_slot_str.size ();
921988 // Append chain account id
922- meta_str.append (" \" " ).append (ID_CHAIN_ACCOUNT_ID).append (" \" :" )
989+ std::string account_id_str;
990+ account_id_str.append (" \" " ).append (ID_CHAIN_ACCOUNT_ID).append (" \" :" )
923991 .append (" \" " ).append (g_chain_account_id).append (" \" ," );
992+ memcpy (meta_buf + offset, account_id_str.c_str (), account_id_str.size ());
993+ offset += account_id_str.size ();
924994 // Append files
925- meta_str.append (" \" " ).append (ID_FILE).append (" \" :" );
926- wl->serialize_file (meta_str);
927- meta_str.append (" }" );
995+ std::string file_title;
996+ file_title.append (" \" " ).append (ID_FILE).append (" \" :[" );
997+ memcpy (meta_buf + offset, file_title.c_str (), file_title.size ());
998+ offset += file_title.size ();
999+ for (size_t i = 0 ; i < wl->checked_files .size (); i++)
1000+ {
1001+ std::string file_str = wl->checked_files [i].dump ();
1002+ remove_char (file_str, ' \n ' );
1003+ remove_char (file_str, ' \\ ' );
1004+ remove_char (file_str, ' ' );
1005+ memcpy (meta_buf + offset, file_str.c_str (), file_str.size ());
1006+ offset += file_str.size ();
1007+ if (i != wl->checked_files .size () - 1 )
1008+ {
1009+ memcpy (meta_buf + offset, " ," , 1 );
1010+ offset += 1 ;
1011+ }
1012+ }
1013+ memcpy (meta_buf + offset, " ]}" , 2 );
1014+ offset += 2 ;
9281015
929- crust_status = persist_set (ID_METADATA, reinterpret_cast <const uint8_t *>(meta_str.c_str ()), meta_str.size ());
1016+ crust_status = persist_set (ID_METADATA, meta_buf, offset);
1017+ free (meta_buf);
9301018
9311019 sgx_thread_mutex_unlock (&g_metadata_mutex);
9321020
@@ -968,14 +1056,13 @@ crust_status_t id_restore_metadata()
9681056 log_warn (" Wait for srd info, code:%lx\n " , crust_status);
9691057 }
9701058 // Restore meaningful files
971- wl->checked_files .clear ();
9721059 if (meta_json.hasKey (ID_FILE)
9731060 && meta_json[ID_FILE].JSONType () == json::JSON::Class::Array)
9741061 {
975- json::JSON m_files = meta_json[ID_FILE];
976- for (int i = 0 ; i < m_files .size (); i++)
1062+ wl-> checked_files . resize ( meta_json[ID_FILE]. size ()) ;
1063+ for (int i = 0 ; i < meta_json[ID_FILE] .size (); i++)
9771064 {
978- wl->checked_files . push_back (m_files [i]) ;
1065+ wl->checked_files [i] = meta_json[ID_FILE][i] ;
9791066 }
9801067 }
9811068 // Restore id key pair
0 commit comments