PageRenderTime 48ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/src/tspi/obj_encdata.c

https://github.com/srajiv/trousers
C | 485 lines | 372 code | 100 blank | 13 comment | 83 complexity | 7ed918bdcd189f563f184996d176f89f MD5 | raw file
  1. /*
  2. * Licensed Materials - Property of IBM
  3. *
  4. * trousers - An open source TCG Software Stack
  5. *
  6. * (C) Copyright International Business Machines Corp. 2005, 2007
  7. *
  8. */
  9. #include <stdlib.h>
  10. #include <stdio.h>
  11. #include <errno.h>
  12. #include <string.h>
  13. #include "trousers/tss.h"
  14. #include "trousers/trousers.h"
  15. #include "trousers_types.h"
  16. #include "spi_utils.h"
  17. #include "capabilities.h"
  18. #include "tsplog.h"
  19. #include "obj.h"
  20. TSS_RESULT
  21. obj_encdata_add(TSS_HCONTEXT tspContext, UINT32 type, TSS_HOBJECT *phObject)
  22. {
  23. TSS_RESULT result;
  24. struct tr_encdata_obj *encdata = calloc(1, sizeof(struct tr_encdata_obj));
  25. if (encdata == NULL) {
  26. LogError("malloc of %zd bytes failed.",
  27. sizeof(struct tr_encdata_obj));
  28. return TSPERR(TSS_E_OUTOFMEMORY);
  29. }
  30. /* add usage policy */
  31. if ((result = obj_context_get_policy(tspContext, TSS_POLICY_USAGE,
  32. &encdata->usagePolicy))) {
  33. free(encdata);
  34. return result;
  35. }
  36. encdata->type = type;
  37. if ((result = obj_list_add(&encdata_list, tspContext, 0, encdata, phObject))) {
  38. free(encdata);
  39. return result;
  40. }
  41. return TSS_SUCCESS;
  42. }
  43. TSS_BOOL
  44. obj_is_encdata(TSS_HOBJECT hObject)
  45. {
  46. TSS_BOOL answer = FALSE;
  47. if ((obj_list_get_obj(&encdata_list, hObject))) {
  48. answer = TRUE;
  49. obj_list_put(&encdata_list);
  50. }
  51. return answer;
  52. }
  53. TSS_RESULT
  54. obj_encdata_get_tsp_context(TSS_HENCDATA hEncdata, TSS_HCONTEXT *tspContext)
  55. {
  56. struct tsp_object *obj;
  57. if ((obj = obj_list_get_obj(&encdata_list, hEncdata)) == NULL)
  58. return TSPERR(TSS_E_INVALID_HANDLE);
  59. *tspContext = obj->tspContext;
  60. obj_list_put(&encdata_list);
  61. return TSS_SUCCESS;
  62. }
  63. TSS_RESULT
  64. obj_encdata_get_policy(TSS_HENCDATA hEncData, UINT32 policyType, TSS_HPOLICY *phPolicy)
  65. {
  66. struct tsp_object *obj;
  67. struct tr_encdata_obj *encdata;
  68. TSS_RESULT result = TSS_SUCCESS;
  69. if ((obj = obj_list_get_obj(&encdata_list, hEncData)) == NULL)
  70. return TSPERR(TSS_E_INVALID_HANDLE);
  71. encdata = (struct tr_encdata_obj *)obj->data;
  72. switch (policyType) {
  73. case TSS_POLICY_USAGE:
  74. *phPolicy = encdata->usagePolicy;
  75. break;
  76. default:
  77. result = TSPERR(TSS_E_BAD_PARAMETER);
  78. }
  79. obj_list_put(&encdata_list);
  80. return result;
  81. }
  82. TSS_RESULT
  83. obj_encdata_set_policy(TSS_HENCDATA hEncData, TSS_HPOLICY hPolicy)
  84. {
  85. struct tsp_object *obj;
  86. struct tr_encdata_obj *encdata;
  87. UINT32 policyType;
  88. TSS_RESULT result = TSS_SUCCESS;
  89. if ((result = obj_policy_get_type(hPolicy, &policyType)))
  90. return result;
  91. if ((obj = obj_list_get_obj(&encdata_list, hEncData)) == NULL)
  92. return TSPERR(TSS_E_INVALID_HANDLE);
  93. encdata = (struct tr_encdata_obj *)obj->data;
  94. switch (policyType) {
  95. case TSS_POLICY_USAGE:
  96. encdata->usagePolicy = hPolicy;
  97. break;
  98. default:
  99. result = TSPERR(TSS_E_BAD_PARAMETER);
  100. }
  101. obj_list_put(&encdata_list);
  102. return result;
  103. }
  104. TSS_RESULT
  105. obj_encdata_get_data(TSS_HENCDATA hEncData, UINT32 *size, BYTE **data)
  106. {
  107. struct tsp_object *obj;
  108. struct tr_encdata_obj *encdata;
  109. TSS_RESULT result = TSS_SUCCESS;
  110. if ((obj = obj_list_get_obj(&encdata_list, hEncData)) == NULL)
  111. return TSPERR(TSS_E_INVALID_HANDLE);
  112. encdata = (struct tr_encdata_obj *)obj->data;
  113. if (encdata->encryptedDataLength == 0) {
  114. result = TSPERR(TSS_E_INVALID_OBJ_ACCESS);
  115. goto done;
  116. } else {
  117. *data = calloc_tspi(obj->tspContext, encdata->encryptedDataLength);
  118. if (*data == NULL) {
  119. LogError("malloc of %d bytes failed.",
  120. encdata->encryptedDataLength);
  121. result = TSPERR(TSS_E_OUTOFMEMORY);
  122. goto done;
  123. }
  124. *size = encdata->encryptedDataLength;
  125. memcpy(*data, encdata->encryptedData, *size);
  126. }
  127. done:
  128. obj_list_put(&encdata_list);
  129. return result;
  130. }
  131. TSS_RESULT
  132. obj_encdata_get_pcr_digest(TSS_HENCDATA hEncData,
  133. TSS_FLAG pcrInfoType,
  134. TSS_FLAG dir,
  135. UINT32 *size,
  136. BYTE **data)
  137. {
  138. struct tsp_object *obj;
  139. struct tr_encdata_obj *encdata;
  140. TSS_RESULT result = TSS_SUCCESS;
  141. TPM_DIGEST *digest;
  142. UINT64 offset;
  143. if ((obj = obj_list_get_obj(&encdata_list, hEncData)) == NULL)
  144. return TSPERR(TSS_E_INVALID_HANDLE);
  145. encdata = (struct tr_encdata_obj *)obj->data;
  146. if (pcrInfoType != encdata->pcrInfoType) {
  147. result = TSPERR(TSS_E_INVALID_OBJ_ACCESS);
  148. goto done;
  149. }
  150. switch (pcrInfoType) {
  151. case TSS_PCRS_STRUCT_INFO:
  152. if (dir == TSS_TSPATTRIB_ENCDATAPCR_DIGEST_ATCREATION)
  153. digest = &encdata->pcrInfo.info11.digestAtCreation;
  154. else if (dir == TSS_TSPATTRIB_ENCDATAPCR_DIGEST_ATRELEASE)
  155. digest = &encdata->pcrInfo.info11.digestAtRelease;
  156. else {
  157. result = TSPERR(TSS_E_BAD_PARAMETER);
  158. goto done;
  159. }
  160. break;
  161. case TSS_PCRS_STRUCT_INFO_LONG:
  162. if (dir == TSS_TSPATTRIB_ENCDATAPCRLONG_DIGEST_ATCREATION)
  163. digest = &encdata->pcrInfo.infolong.digestAtCreation;
  164. else if (dir == TSS_TSPATTRIB_ENCDATAPCRLONG_DIGEST_ATRELEASE)
  165. digest = &encdata->pcrInfo.infolong.digestAtRelease;
  166. else {
  167. result = TSPERR(TSS_E_BAD_PARAMETER);
  168. goto done;
  169. }
  170. break;
  171. default:
  172. result = TSPERR(TSS_E_INVALID_OBJ_ACCESS);
  173. goto done;
  174. }
  175. *size = sizeof(TPM_DIGEST);
  176. if ((*data = calloc_tspi(obj->tspContext, *size)) == NULL) {
  177. LogError("malloc of %u bytes failed.", *size);
  178. *size = 0;
  179. result = TSPERR(TSS_E_OUTOFMEMORY);
  180. goto done;
  181. }
  182. offset = 0;
  183. Trspi_LoadBlob_DIGEST(&offset, *data, digest);
  184. done:
  185. obj_list_put(&encdata_list);
  186. return result;
  187. }
  188. TSS_RESULT
  189. obj_encdata_get_pcr_locality(TSS_HENCDATA hEncData, TSS_FLAG dir, UINT32 *locality)
  190. {
  191. struct tsp_object *obj;
  192. struct tr_encdata_obj *encdata;
  193. TSS_RESULT result = TSS_SUCCESS;
  194. if ((obj = obj_list_get_obj(&encdata_list, hEncData)) == NULL)
  195. return TSPERR(TSS_E_INVALID_HANDLE);
  196. encdata = (struct tr_encdata_obj *)obj->data;
  197. if (encdata->pcrInfoType == TSS_PCRS_STRUCT_INFO_LONG) {
  198. if (dir == TSS_TSPATTRIB_ENCDATAPCRLONG_LOCALITY_ATCREATION)
  199. *locality = encdata->pcrInfo.infolong.localityAtCreation;
  200. else if (dir == TSS_TSPATTRIB_ENCDATAPCRLONG_LOCALITY_ATRELEASE)
  201. *locality = encdata->pcrInfo.infolong.localityAtRelease;
  202. else
  203. result = TSPERR(TSS_E_BAD_PARAMETER);
  204. } else
  205. result = TSPERR(TSS_E_INVALID_OBJ_ACCESS);
  206. obj_list_put(&encdata_list);
  207. return result;
  208. }
  209. TSS_RESULT
  210. obj_encdata_get_pcr_selection(TSS_HENCDATA hEncData,
  211. TSS_FLAG pcrInfoType,
  212. TSS_FLAG dir,
  213. UINT32 *size,
  214. BYTE **data)
  215. {
  216. struct tsp_object *obj;
  217. struct tr_encdata_obj *encdata;
  218. TSS_RESULT result = TSS_SUCCESS;
  219. TPM_PCR_SELECTION *selection = NULL;
  220. UINT64 offset;
  221. if ((obj = obj_list_get_obj(&encdata_list, hEncData)) == NULL)
  222. return TSPERR(TSS_E_INVALID_HANDLE);
  223. encdata = (struct tr_encdata_obj *)obj->data;
  224. if (pcrInfoType != encdata->pcrInfoType) {
  225. result = TSPERR(TSS_E_INVALID_OBJ_ACCESS);
  226. goto done;
  227. }
  228. switch (pcrInfoType) {
  229. case TSS_PCRS_STRUCT_INFO:
  230. if (dir == TSS_TSPATTRIB_ENCDATAPCR_SELECTION)
  231. selection = &encdata->pcrInfo.info11.pcrSelection;
  232. break;
  233. case TSS_PCRS_STRUCT_INFO_LONG:
  234. if (dir == TSS_TSPATTRIB_ENCDATAPCRLONG_CREATION_SELECTION)
  235. selection = &encdata->pcrInfo.infolong.creationPCRSelection;
  236. else if (dir == TSS_TSPATTRIB_ENCDATAPCRLONG_RELEASE_SELECTION)
  237. selection = &encdata->pcrInfo.infolong.releasePCRSelection;
  238. else {
  239. result = TSPERR(TSS_E_INTERNAL_ERROR);
  240. goto done;
  241. }
  242. break;
  243. default:
  244. result = TSPERR(TSS_E_INVALID_OBJ_ACCESS);
  245. goto done;
  246. }
  247. *size = sizeof(UINT16) + selection->sizeOfSelect;
  248. if ((*data = calloc_tspi(obj->tspContext, *size)) == NULL) {
  249. LogError("malloc of %u bytes failed.", *size);
  250. *size = 0;
  251. result = TSPERR(TSS_E_OUTOFMEMORY);
  252. goto done;
  253. }
  254. offset = 0;
  255. Trspi_LoadBlob_PCR_SELECTION(&offset, *data, selection);
  256. done:
  257. obj_list_put(&encdata_list);
  258. return result;
  259. }
  260. TSS_RESULT
  261. obj_encdata_set_pcr_info(TSS_HENCDATA hEncData, UINT32 pcrInfoType, BYTE *info_blob)
  262. {
  263. struct tsp_object *obj;
  264. struct tr_encdata_obj *encdata;
  265. TSS_RESULT result = TSS_SUCCESS;
  266. UINT64 offset = 0;
  267. if ((obj = obj_list_get_obj(&encdata_list, hEncData)) == NULL)
  268. return TSPERR(TSS_E_INVALID_HANDLE);
  269. encdata = (struct tr_encdata_obj *)obj->data;
  270. switch (pcrInfoType) {
  271. case TSS_PCRS_STRUCT_INFO_LONG:
  272. result = Trspi_UnloadBlob_PCR_INFO_LONG(&offset, info_blob,
  273. &encdata->pcrInfo.infolong);
  274. break;
  275. case TSS_PCRS_STRUCT_INFO:
  276. result = Trspi_UnloadBlob_PCR_INFO(&offset, info_blob,
  277. &encdata->pcrInfo.info11);
  278. break;
  279. default:
  280. result = TSPERR(TSS_E_INVALID_OBJ_ACCESS);
  281. goto done;
  282. }
  283. encdata->pcrInfoType = pcrInfoType;
  284. /* XXX are we using this anywhere? */
  285. obj->flags |= TSS_OBJ_FLAG_PCRS;
  286. done:
  287. obj_list_put(&encdata_list);
  288. return result;
  289. }
  290. TSS_RESULT
  291. obj_encdata_set_data(TSS_HENCDATA hEncData, UINT32 size, BYTE *data)
  292. {
  293. struct tsp_object *obj;
  294. struct tr_encdata_obj *encdata;
  295. TSS_RESULT result = TSS_SUCCESS;
  296. if ((obj = obj_list_get_obj(&encdata_list, hEncData)) == NULL)
  297. return TSPERR(TSS_E_INVALID_HANDLE);
  298. encdata = (struct tr_encdata_obj *)obj->data;
  299. free(encdata->encryptedData);
  300. encdata->encryptedData = NULL;
  301. encdata->encryptedDataLength = 0;
  302. if (size > 0) {
  303. if ((encdata->encryptedData = malloc(size)) == NULL) {
  304. LogError("malloc of %u bytes failed.", size);
  305. result = TSPERR(TSS_E_OUTOFMEMORY);
  306. goto done;
  307. }
  308. encdata->encryptedDataLength = size;
  309. memcpy(encdata->encryptedData, data, size);
  310. }
  311. done:
  312. obj_list_put(&encdata_list);
  313. return result;
  314. }
  315. void
  316. encdata_free(void *data)
  317. {
  318. struct tr_encdata_obj *encdata = (struct tr_encdata_obj *)data;
  319. free(encdata->encryptedData);
  320. switch (encdata->pcrInfoType) {
  321. case TSS_PCRS_STRUCT_INFO:
  322. free(encdata->pcrInfo.info11.pcrSelection.pcrSelect);
  323. break;
  324. case TSS_PCRS_STRUCT_INFO_LONG:
  325. free(encdata->pcrInfo.infolong.creationPCRSelection.pcrSelect);
  326. free(encdata->pcrInfo.infolong.releasePCRSelection.pcrSelect);
  327. break;
  328. default:
  329. /* no PCR data was set */
  330. break;
  331. }
  332. free(encdata);
  333. }
  334. /* remove an individual encdata object from the encdata list with handle
  335. * equal to hObject */
  336. TSS_RESULT
  337. obj_encdata_remove(TSS_HOBJECT hObject, TSS_HCONTEXT tspContext)
  338. {
  339. TSS_RESULT result;
  340. if ((result = obj_list_remove(&encdata_list, &encdata_free, hObject, tspContext)))
  341. return result;
  342. return TSS_SUCCESS;
  343. }
  344. void
  345. obj_encdata_remove_policy_refs(TSS_HPOLICY hPolicy, TSS_HCONTEXT tspContext)
  346. {
  347. struct tsp_object *obj, *prev = NULL;
  348. struct obj_list *list = &encdata_list;
  349. struct tr_encdata_obj *encdata;
  350. pthread_mutex_lock(&list->lock);
  351. for (obj = list->head; obj; prev = obj, obj = obj->next) {
  352. if (obj->tspContext != tspContext)
  353. continue;
  354. encdata = (struct tr_encdata_obj *)obj->data;
  355. if (encdata->usagePolicy == hPolicy)
  356. encdata->usagePolicy = NULL_HPOLICY;
  357. }
  358. pthread_mutex_unlock(&list->lock);
  359. }
  360. #ifdef TSS_BUILD_SEALX
  361. TSS_RESULT
  362. obj_encdata_set_seal_protect_mode(TSS_HENCDATA hEncData, UINT32 protectMode)
  363. {
  364. struct tsp_object *obj;
  365. struct tr_encdata_obj *encdata;
  366. if ((obj = obj_list_get_obj(&encdata_list, hEncData)) == NULL)
  367. return TSPERR(TSS_E_INVALID_HANDLE);
  368. encdata = (struct tr_encdata_obj *)obj->data;
  369. encdata->protectMode = protectMode;
  370. obj_list_put(&encdata_list);
  371. return TSS_SUCCESS;
  372. }
  373. TSS_RESULT
  374. obj_encdata_get_seal_protect_mode(TSS_HENCDATA hEncData, UINT32 *protectMode)
  375. {
  376. struct tsp_object *obj;
  377. struct tr_encdata_obj *encdata;
  378. if ((obj = obj_list_get_obj(&encdata_list, hEncData)) == NULL)
  379. return TSPERR(TSS_E_INVALID_HANDLE);
  380. encdata = (struct tr_encdata_obj *)obj->data;
  381. *protectMode = encdata->protectMode;
  382. obj_list_put(&encdata_list);
  383. return TSS_SUCCESS;
  384. }
  385. #endif