type_length_value.cpp 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541
  1. /*
  2. * Copyright (C) 2011-2017 Intel Corporation. All rights reserved.
  3. *
  4. * Redistribution and use in source and binary forms, with or without
  5. * modification, are permitted provided that the following conditions
  6. * are met:
  7. *
  8. * * Redistributions of source code must retain the above copyright
  9. * notice, this list of conditions and the following disclaimer.
  10. * * Redistributions in binary form must reproduce the above copyright
  11. * notice, this list of conditions and the following disclaimer in
  12. * the documentation and/or other materials provided with the
  13. * distribution.
  14. * * Neither the name of Intel Corporation nor the names of its
  15. * contributors may be used to endorse or promote products derived
  16. * from this software without specific prior written permission.
  17. *
  18. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  19. * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  20. * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  21. * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  22. * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  23. * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  24. * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  25. * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  26. * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  27. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  28. * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  29. *
  30. */
  31. /**
  32. * File: type_length_value.cpp
  33. * Description: Cpp file for code to decoding/encoding of the TLV, the type length value encoding format of Provision Message
  34. */
  35. #include "type_length_value.h"
  36. #include "sgx.h"
  37. #include "se_wrapper.h"
  38. #include "oal/oal.h"
  39. #include <assert.h>
  40. //Function to write tlv header into a msg according to tlv info, the input buffer size should be at least MAX_TLV_HEADER_SIZE
  41. static tlv_status_t write_tlv_header(uint8_t *msg, const tlv_info_t *info)
  42. {
  43. uint8_t type = info->type;
  44. if(info->size>UINT16_MAX ||info->header_size == LARGE_TLV_HEADER_SIZE){//6 bytes header
  45. uint32_t size = info->size; //4 bytes in size field
  46. type |= FOUR_BYTES_SIZE_TYPE;
  47. msg[0] = type;
  48. msg[1] = info->version;
  49. size = _htonl(size);
  50. if(memcpy_s(&msg[2], sizeof(uint32_t), &size, sizeof(size))!=0){
  51. AESM_DBG_ERROR("memcpy failed");
  52. return TLV_UNKNOWN_ERROR;
  53. }
  54. }else{//4 bytes header
  55. uint16_t size = (uint16_t)info->size;//2 bytes in size field
  56. msg[0] = type;
  57. msg[1] = info->version;
  58. size = _htons(size);
  59. if(memcpy_s(&msg[2], sizeof(uint16_t), &size, sizeof(size))!=0){
  60. AESM_DBG_ERROR("memcpy failed");
  61. return TLV_UNKNOWN_ERROR;
  62. }
  63. }
  64. return TLV_SUCCESS;
  65. }
  66. //Function to read the first tlv info from msg and return length in bytes of the TLV header (so it provides offset of TLV payload)
  67. // the function return 0 on error
  68. static uint32_t read_tlv_info(const tlv_msg_t& msg, tlv_info_t *info)
  69. {
  70. if(msg.msg_size<SMALL_TLV_HEADER_SIZE){//The TLV header has at least 4 bytes
  71. return 0;
  72. }
  73. //read TLV type and version, the highest bit of type to tell whether size is 2 or 4 bytes is removed
  74. info->type = GET_TLV_TYPE(msg.msg_buf[0]);
  75. info->version = msg.msg_buf[1];
  76. if(IS_FOUR_BYTES_SIZE_TYPE(msg.msg_buf[0])){//four bytes or two bytes of size
  77. if(msg.msg_size<LARGE_TLV_HEADER_SIZE)return 0;
  78. (void)memcpy_s(&info->size, sizeof(info->size), &msg.msg_buf[2], sizeof(uint32_t));
  79. info->size = _ntohl(info->size);
  80. info->payload = msg.msg_buf+LARGE_TLV_HEADER_SIZE;
  81. info->header_size = LARGE_TLV_HEADER_SIZE;
  82. return LARGE_TLV_HEADER_SIZE;//6 bytes TLV header
  83. }else{
  84. uint16_t size = 0;
  85. (void)memcpy_s(&size, sizeof(uint16_t), &msg.msg_buf[2], sizeof(uint16_t));
  86. info->size = (uint32_t)_ntohs(size); //reorder to form little endian size value and extended by 0
  87. info->payload = msg.msg_buf+SMALL_TLV_HEADER_SIZE;
  88. info->header_size = SMALL_TLV_HEADER_SIZE;
  89. return SMALL_TLV_HEADER_SIZE; //4 bytes TLV header
  90. }
  91. }
  92. static bool decode_one_tlv(tlv_msg_t& msg, tlv_info_t *info)
  93. {
  94. if(msg.msg_size<SMALL_TLV_HEADER_SIZE)return false;
  95. uint32_t header_size = read_tlv_info(msg, info);
  96. if(header_size == 0) return false;
  97. uint32_t total_size = header_size + info->size;
  98. if(msg.msg_size<total_size)return false;
  99. msg.msg_buf += total_size;
  100. msg.msg_size -= total_size;
  101. return true;
  102. }
  103. static uint8_t get_tlv_header_size_from_payload_size(uint32_t payload_size)
  104. {
  105. if(payload_size>UINT16_MAX){//6 bytes TLV header
  106. if(payload_size>UINT32_MAX-LARGE_TLV_HEADER_SIZE)//overflow of uint32_t, return 0 to indicate error
  107. return 0;
  108. return LARGE_TLV_HEADER_SIZE;
  109. }else{
  110. return SMALL_TLV_HEADER_SIZE;//4 bytes TLV header
  111. }
  112. }
  113. uint32_t get_tlv_header_size(const tlv_info_t *info)
  114. {
  115. assert(info->header_size == LARGE_TLV_HEADER_SIZE||
  116. info->header_size == SMALL_TLV_HEADER_SIZE);
  117. return info->header_size;
  118. }
  119. uint32_t get_tlv_total_size(const tlv_info_t &info)
  120. {
  121. return get_tlv_header_size(&info)+info.size;
  122. }
  123. static uint32_t calc_one_tlv_size(const tlv_info_t& infos)
  124. {
  125. uint32_t the_size = 0;
  126. if(infos.header_size == UNKNOWN_TLV_HEADER_SIZE)
  127. the_size = get_tlv_total_size(infos.size);
  128. else
  129. the_size = get_tlv_total_size(infos);
  130. return the_size;
  131. }
  132. static tlv_status_t tlv_msg_init_one_tlv(tlv_info_t* infos, const tlv_msg_t& tlv_msg)
  133. {
  134. uint16_t hsize;
  135. tlv_status_t status = TLV_SUCCESS;
  136. if(infos->header_size == UNKNOWN_TLV_HEADER_SIZE)
  137. hsize = get_tlv_header_size_from_payload_size(infos->size); //TLV header size
  138. else
  139. hsize = (uint8_t)infos->header_size;
  140. uint32_t tsize = hsize+infos->size; //size of header and payload
  141. if(tlv_msg.msg_size<tsize)return TLV_INSUFFICIENT_MEMORY;
  142. if((status=write_tlv_header(tlv_msg.msg_buf , infos))!=TLV_SUCCESS)
  143. return status; //initialize the header of the tlv but the payload is not initialized
  144. infos->header_size = hsize;
  145. infos->payload = tlv_msg.msg_buf + hsize; //initialize the payload of the tlv_info
  146. if(tsize<tlv_msg.msg_size){
  147. return TLV_MORE_TLVS;
  148. }
  149. return TLV_SUCCESS;
  150. }
  151. uint8_t *cipher_text_tlv_get_key_id(const tlv_info_t& info)
  152. {
  153. assert(info.type == TLV_CIPHER_TEXT && info.size>=1);
  154. assert(info.payload!=NULL);
  155. return info.payload;
  156. }
  157. tlv_msg_t cipher_text_tlv_get_encrypted_text(const tlv_info_t& info)
  158. {
  159. assert(info.type == TLV_CIPHER_TEXT && info.size>=1);
  160. assert(info.payload!=NULL);
  161. tlv_msg_t tlv_msg;
  162. tlv_msg.msg_buf = info.payload+1;
  163. tlv_msg.msg_size = info.size -1;
  164. return tlv_msg;
  165. }
  166. tlv_iv_t *block_cipher_tlv_get_iv(const tlv_info_t& info)
  167. {
  168. assert(info.type == TLV_BLOCK_CIPHER_TEXT && info.size >= IV_SIZE);
  169. assert(info.payload!=NULL);
  170. return reinterpret_cast<tlv_iv_t *>(info.payload);
  171. }
  172. tlv_msg_t block_cipher_tlv_get_encrypted_text(const tlv_info_t& info)
  173. {
  174. assert(info.type == TLV_BLOCK_CIPHER_TEXT && info.size >= IV_SIZE);
  175. assert(info.payload!=NULL);
  176. tlv_msg_t tlv_msg;
  177. tlv_msg.msg_buf = info.payload + IV_SIZE;
  178. tlv_msg.msg_size = info.size - IV_SIZE;
  179. return tlv_msg;
  180. }
  181. fmsp_t *platform_info_tlv_get_fmsp(const tlv_info_t& info)
  182. {
  183. assert(info.type == TLV_PLATFORM_INFO && info.size == PLATFORM_INFO_TLV_PAYLOAD_SIZE());
  184. assert(info.payload!=NULL);
  185. return reinterpret_cast<fmsp_t *>(info.payload+sizeof(psvn_t)+sizeof(sgx_isv_svn_t)+sizeof(CUR_PCE_ID));
  186. }
  187. psvn_t *platform_info_tlv_get_psvn(const tlv_info_t& info)
  188. {
  189. assert(info.type == TLV_PLATFORM_INFO && info.size == PLATFORM_INFO_TLV_PAYLOAD_SIZE());
  190. assert(info.payload!=NULL);
  191. return reinterpret_cast<psvn_t *>(info.payload);
  192. }
  193. tlv_status_t TLVsMsg::init_from_tlv_msg(const tlv_msg_t& tlv_msg)
  194. {
  195. clear();
  196. msg.msg_size = tlv_msg.msg_size;
  197. msg.msg_buf = (uint8_t *)malloc(msg.msg_size);
  198. if(msg.msg_buf == NULL){
  199. msg.msg_size = 0;
  200. AESM_DBG_ERROR("malloc failed");
  201. return TLV_OUT_OF_MEMORY_ERROR;
  202. }
  203. if(memcpy_s(msg.msg_buf, msg.msg_size, tlv_msg.msg_buf, tlv_msg.msg_size)!=0){
  204. AESM_DBG_ERROR("memcpy failed");
  205. return TLV_UNKNOWN_ERROR;
  206. }
  207. tlv_msg_t tlv_tmp = msg;
  208. tlv_info_t one_info;
  209. tlv_info_t *new_info = NULL;
  210. while(tlv_tmp.msg_size>0){
  211. if(decode_one_tlv(tlv_tmp, &one_info)){
  212. tlv_status_t ret = create_new_info(new_info);
  213. if(ret != TLV_SUCCESS) return ret;
  214. if(memcpy_s(new_info, sizeof(*new_info), &one_info, sizeof(one_info))!=0){
  215. AESM_DBG_ERROR("memcpy failed");
  216. return TLV_UNKNOWN_ERROR;
  217. }
  218. #ifdef DBG_LOG
  219. char dbg_str[256];
  220. aesm_dbg_format_hex(new_info->payload, new_info->size, dbg_str, 256);
  221. AESM_DBG_TRACE("Decode One TLV: type (tlv %d), size %u, version %d, payload:%s",new_info->type, new_info->size, (int)new_info->version,dbg_str);
  222. #endif
  223. }else{
  224. return TLV_INVALID_MSG_ERROR;
  225. }
  226. }
  227. return TLV_SUCCESS;
  228. }
  229. tlv_status_t TLVsMsg::init_from_buffer(const uint8_t *msg_buf, uint32_t msg_size)
  230. {
  231. tlv_msg_t tlv_msg;
  232. tlv_msg.msg_buf=const_cast<uint8_t *>(msg_buf);
  233. tlv_msg.msg_size = msg_size;
  234. return init_from_tlv_msg(tlv_msg);
  235. }
  236. tlv_status_t TLVsMsg::alloc_more_buffer(uint32_t new_size, tlv_msg_t& new_buf)
  237. {
  238. if(msg.msg_buf == NULL){
  239. assert(msg.msg_size==0);
  240. msg.msg_buf = (uint8_t *)malloc(new_size);
  241. if(msg.msg_buf == NULL){
  242. return TLV_OUT_OF_MEMORY_ERROR;
  243. }
  244. msg.msg_size = new_size;
  245. new_buf = msg;
  246. }else{
  247. uint8_t *old_p = msg.msg_buf;
  248. uint8_t *p = (uint8_t *)malloc(msg.msg_size+new_size);
  249. if(p==NULL){
  250. return (TLV_OUT_OF_MEMORY_ERROR);
  251. }
  252. if(0!=memcpy_s(p,msg.msg_size+new_size, old_p, msg.msg_size)){
  253. free(p);
  254. return TLV_UNKNOWN_ERROR;
  255. }
  256. size_t i;
  257. for(i=0;i<num_infos;++i){
  258. infos[i].payload = p + (infos[i].payload - old_p);//update payload
  259. }
  260. new_buf.msg_buf = p + msg.msg_size;
  261. new_buf.msg_size = new_size;
  262. msg.msg_buf = p;
  263. msg.msg_size += new_size;
  264. free(old_p);
  265. }
  266. return TLV_SUCCESS;
  267. }
  268. #ifdef DBG_LOG
  269. #define ADD_TLV_DBG_INFO \
  270. {\
  271. char dbg_str[256]; \
  272. aesm_dbg_format_hex(new_info->payload, new_info->size, dbg_str, 256);\
  273. AESM_DBG_INFO("create TLV: type (tlv %d), size %u, version %d, payload %s", new_info->type, new_info->size, (int)new_info->version, dbg_str);\
  274. }
  275. #else
  276. #define ADD_TLV_DBG_INFO
  277. #endif
  278. tlv_status_t TLVsMsg::add_cipher_text(const uint8_t *text, uint32_t len, uint8_t key_id)
  279. {
  280. tlv_info_t one_info;
  281. one_info.header_size = UNKNOWN_TLV_HEADER_SIZE;
  282. one_info.payload = NULL;
  283. one_info.size = CIPHER_TEXT_TLV_PAYLOAD_SIZE(len);
  284. one_info.type = TLV_CIPHER_TEXT;
  285. one_info.version = TLV_VERSION_1;
  286. uint32_t size = ::calc_one_tlv_size(one_info);
  287. tlv_msg_t new_buf;
  288. tlv_info_t *new_info = NULL;
  289. tlv_status_t ret = alloc_more_buffer(size, new_buf);
  290. if(ret != TLV_SUCCESS)
  291. return ret;
  292. ret = create_new_info(new_info);
  293. if(ret != TLV_SUCCESS)
  294. return ret;
  295. if((ret = ::tlv_msg_init_one_tlv(&one_info, new_buf)) !=TLV_SUCCESS){
  296. return ret;
  297. }
  298. *cipher_text_tlv_get_key_id(one_info)=key_id;
  299. new_buf = cipher_text_tlv_get_encrypted_text(one_info);
  300. if(memcpy_s(new_buf.msg_buf, new_buf.msg_size, text, len)!=0){
  301. return TLV_UNKNOWN_ERROR;
  302. }
  303. if(memcpy_s(new_info, sizeof(*new_info), &one_info, sizeof(one_info))!=0){
  304. return TLV_UNKNOWN_ERROR;
  305. }
  306. ADD_TLV_DBG_INFO
  307. return TLV_SUCCESS;
  308. }
  309. tlv_status_t TLVsMsg::add_block_cipher_text(const uint8_t iv[IV_SIZE],const uint8_t *text, uint32_t len)
  310. {
  311. tlv_info_t one_info;
  312. one_info.header_size = UNKNOWN_TLV_HEADER_SIZE;
  313. one_info.payload = NULL;
  314. one_info.size = BLOCK_CIPHER_TEXT_TLV_PAYLOAD_SIZE(len);
  315. one_info.type = TLV_BLOCK_CIPHER_TEXT;
  316. one_info.version = TLV_VERSION_1;
  317. uint32_t size = ::calc_one_tlv_size(one_info);
  318. tlv_msg_t new_buf;
  319. tlv_info_t *new_info = NULL;
  320. tlv_status_t ret = alloc_more_buffer(size, new_buf);
  321. if(ret != TLV_SUCCESS)
  322. return ret;
  323. ret = create_new_info(new_info);
  324. if(ret != TLV_SUCCESS)
  325. return ret;
  326. if((ret=::tlv_msg_init_one_tlv(&one_info, new_buf))!=TLV_SUCCESS){
  327. return ret;
  328. }
  329. new_buf = block_cipher_tlv_get_encrypted_text(one_info);
  330. if(len>0&&text!=NULL){
  331. if(memcpy_s(new_buf.msg_buf, new_buf.msg_size, text, len)!=0){
  332. return (TLV_UNKNOWN_ERROR);
  333. }
  334. }
  335. if(memcpy_s(block_cipher_tlv_get_iv(one_info), IV_SIZE, iv, IV_SIZE)!=0){
  336. return (TLV_UNKNOWN_ERROR);
  337. }
  338. if(memcpy_s(new_info, sizeof(*new_info), &one_info, sizeof(one_info))!=0){
  339. return TLV_UNKNOWN_ERROR;
  340. }
  341. ADD_TLV_DBG_INFO
  342. return TLV_SUCCESS;
  343. }
  344. tlv_status_t TLVsMsg::add_block_cipher_info(const uint8_t sk[SK_SIZE])
  345. {
  346. tlv_info_t one_info;
  347. one_info.header_size = UNKNOWN_TLV_HEADER_SIZE;
  348. one_info.payload = NULL;
  349. one_info.size = BLOCK_CIPHER_INFO_TLV_PAYLOAD_SIZE();
  350. one_info.type = TLV_BLOCK_CIPHER_INFO;
  351. one_info.version = TLV_VERSION_1;
  352. uint32_t size = ::calc_one_tlv_size(one_info);
  353. tlv_msg_t new_buf;
  354. tlv_info_t *new_info = NULL;
  355. tlv_status_t ret = alloc_more_buffer(size, new_buf);
  356. if(ret!=TLV_SUCCESS)
  357. return ret;
  358. ret = create_new_info(new_info);
  359. if(ret!=TLV_SUCCESS)
  360. return ret;
  361. if((ret=::tlv_msg_init_one_tlv(&one_info, new_buf))!=TLV_SUCCESS){
  362. return ret;
  363. }
  364. if(memcpy_s(one_info.payload, one_info.size, sk, SK_SIZE)!=0){
  365. return (TLV_UNKNOWN_ERROR);
  366. }
  367. if(memcpy_s(new_info, sizeof(*new_info),&one_info, sizeof(one_info))!=0)
  368. return TLV_UNKNOWN_ERROR;
  369. ADD_TLV_DBG_INFO
  370. return TLV_SUCCESS;
  371. }
  372. #define ADD_TLV_BY_DATA_SIZE(data_type, data, data_size) \
  373. tlv_info_t one_info; \
  374. one_info.header_size = UNKNOWN_TLV_HEADER_SIZE; \
  375. one_info.payload = NULL;\
  376. one_info.size = data_size;\
  377. one_info.type = data_type; \
  378. one_info.version = TLV_VERSION_1; \
  379. uint32_t size = ::calc_one_tlv_size(one_info);\
  380. tlv_msg_t new_buf; \
  381. tlv_info_t *new_info = NULL; \
  382. tlv_status_t ret = alloc_more_buffer(size, new_buf); \
  383. if(ret!=TLV_SUCCESS){ \
  384. return ret; \
  385. } \
  386. ret = create_new_info(new_info); \
  387. if(ret != TLV_SUCCESS) \
  388. return ret; \
  389. if((ret=::tlv_msg_init_one_tlv(&one_info, new_buf))!=TLV_SUCCESS){ \
  390. return ret; \
  391. }\
  392. if(memcpy_s(one_info.payload, one_info.size, data, data_size)!=0){\
  393. return (TLV_UNKNOWN_ERROR);\
  394. }\
  395. if(memcpy_s(new_info, sizeof(*new_info), &one_info, sizeof(one_info))!=0) \
  396. return TLV_UNKNOWN_ERROR; \
  397. ADD_TLV_DBG_INFO \
  398. return TLV_SUCCESS;
  399. tlv_status_t TLVsMsg::add_mac(const uint8_t mac[MAC_SIZE])
  400. {
  401. ADD_TLV_BY_DATA_SIZE(TLV_MESSAGE_AUTHENTICATION_CODE, mac, MAC_SIZE)
  402. }
  403. tlv_status_t TLVsMsg::add_nonce(const uint8_t *nonce, uint32_t nonce_size)
  404. {
  405. ADD_TLV_BY_DATA_SIZE(TLV_NONCE, nonce, nonce_size)
  406. }
  407. tlv_status_t TLVsMsg::add_epid_gid(const GroupId& gid)
  408. {
  409. ADD_TLV_BY_DATA_SIZE(TLV_EPID_GID, &gid, sizeof(GroupId))
  410. }
  411. tlv_status_t TLVsMsg::add_quote(const uint8_t *quote_data, uint32_t quote_size)
  412. {
  413. ADD_TLV_BY_DATA_SIZE(TLV_QUOTE, quote_data, quote_size)
  414. }
  415. tlv_status_t TLVsMsg::add_x509_csr(const uint8_t *csr_data, uint32_t csr_size)
  416. {
  417. ADD_TLV_BY_DATA_SIZE(TLV_X509_CSR_TLV, csr_data, csr_size)
  418. }
  419. tlv_status_t TLVsMsg::add_quote_signature(const uint8_t *quote_signature, uint32_t sign_size)
  420. {
  421. tlv_info_t one_info;
  422. one_info.header_size = LARGE_TLV_HEADER_SIZE;//always use large tlv for sigrl and epid sig
  423. one_info.payload = NULL;
  424. one_info.size = sign_size;
  425. one_info.type = TLV_QUOTE_SIG;
  426. one_info.version = TLV_VERSION_1;
  427. uint32_t size = ::calc_one_tlv_size(one_info);
  428. tlv_msg_t new_buf;
  429. tlv_info_t *new_info = NULL;
  430. tlv_status_t ret = alloc_more_buffer(size, new_buf);
  431. if(ret!=TLV_SUCCESS)
  432. return ret;
  433. ret = create_new_info(new_info);
  434. if(ret!=TLV_SUCCESS)
  435. return ret;
  436. if((ret=::tlv_msg_init_one_tlv(&one_info, new_buf))!=TLV_SUCCESS){
  437. return (TLV_UNKNOWN_ERROR);
  438. }
  439. if(memcpy_s(one_info.payload, one_info.size, quote_signature, sign_size)!=0){
  440. return (TLV_UNKNOWN_ERROR);
  441. }
  442. if(memcpy_s(new_info, sizeof(*new_info),&one_info, sizeof(one_info))!=0)
  443. return TLV_UNKNOWN_ERROR;
  444. ADD_TLV_DBG_INFO
  445. return TLV_SUCCESS;
  446. }
  447. tlv_status_t TLVsMsg::add_es_selector(uint8_t protocol, uint8_t selector_id)
  448. {
  449. uint8_t buf[2];
  450. buf[0]=protocol;
  451. buf[1]=selector_id;
  452. ADD_TLV_BY_DATA_SIZE(TLV_ES_SELECTOR, buf, static_cast<uint32_t>(2*sizeof(uint8_t)))
  453. }
  454. tlv_status_t TLVsMsg::add_psid(const psid_t *psid)
  455. {
  456. ADD_TLV_BY_DATA_SIZE(TLV_PS_ID, psid, sizeof(psid_t))
  457. }
  458. tlv_status_t TLVsMsg::add_platform_info(const bk_platform_info_t& pi)
  459. {
  460. ADD_TLV_BY_DATA_SIZE(TLV_PLATFORM_INFO, &pi, sizeof(pi))
  461. }
  462. tlv_status_t TLVsMsg::add_flags(const flags_t *flags)
  463. {
  464. ADD_TLV_BY_DATA_SIZE(TLV_FLAGS, flags, sizeof(flags_t))
  465. }
  466. tlv_status_t TLVsMsg::add_pce_report_sign(const sgx_report_body_t& report, const uint8_t ecdsa_sign[64])
  467. {
  468. tlv_info_t one_info;
  469. one_info.header_size = LARGE_TLV_HEADER_SIZE;
  470. one_info.payload = NULL;
  471. one_info.size = static_cast<uint32_t>(sizeof(report)+64);
  472. one_info.type = TLV_SE_REPORT;
  473. one_info.version = TLV_VERSION_1;
  474. uint32_t size = ::calc_one_tlv_size(one_info);
  475. tlv_msg_t new_buf;
  476. tlv_info_t *new_info = NULL;
  477. tlv_status_t ret = alloc_more_buffer(size, new_buf);
  478. if(ret!=TLV_SUCCESS){
  479. return ret;
  480. }
  481. ret = create_new_info(new_info);
  482. if(ret != TLV_SUCCESS)
  483. return ret;
  484. if((ret=::tlv_msg_init_one_tlv(&one_info, new_buf))!=TLV_SUCCESS){
  485. return ret;
  486. }
  487. if(memcpy_s(one_info.payload, one_info.size, &report, sizeof(report))!=0){
  488. return (TLV_UNKNOWN_ERROR);
  489. }
  490. if(memcpy_s(one_info.payload+sizeof(report), one_info.size-sizeof(report), ecdsa_sign, 64)!=0){
  491. return (TLV_UNKNOWN_ERROR);
  492. }
  493. if(memcpy_s(new_info, sizeof(*new_info), &one_info, sizeof(one_info))!=0)
  494. return TLV_UNKNOWN_ERROR;
  495. ADD_TLV_DBG_INFO
  496. return TLV_SUCCESS;
  497. }