1 2 /* 3 * Licensed Materials - Property of IBM 4 * 5 * trousers - An open source TCG Software Stack 6 * 7 * (C) Copyright International Business Machines Corp. 2004-2006 8 * 9 */ 10 11 12 #include <stdlib.h> 13 #include <stdio.h> 14 #include <string.h> 15 16 #include "trousers/tss.h" 17 #include "trousers/trousers.h" 18 #include "trousers_types.h" 19 #include "trousers_types.h" 20 #include "spi_utils.h" 21 #include "capabilities.h" 22 #include "tsplog.h" 23 #include "tcs_tsp.h" 24 #include "tspps.h" 25 #include "tcsd_wrap.h" 26 #include "tcsd.h" 27 #include "obj.h" 28 29 30 TSS_RESULT 31 Tspi_Context_GetCapability(TSS_HCONTEXT tspContext, /* in */ 32 TSS_FLAG capArea, /* in */ 33 UINT32 ulSubCapLength, /* in */ 34 BYTE * rgbSubCap, /* in */ 35 UINT32 * pulRespDataLength, /* out */ 36 BYTE ** prgbRespData) /* out */ 37 { 38 TSS_RESULT result; 39 40 if (prgbRespData == NULL || pulRespDataLength == NULL ) 41 return TSPERR(TSS_E_BAD_PARAMETER); 42 43 if (rgbSubCap == NULL && ulSubCapLength != 0) 44 return TSPERR(TSS_E_BAD_PARAMETER); 45 46 if (ulSubCapLength > sizeof(UINT32)) 47 return TSPERR(TSS_E_BAD_PARAMETER); 48 49 if (!obj_is_context(tspContext)) 50 return TSPERR(TSS_E_INVALID_HANDLE); 51 52 switch (capArea) { 53 case TSS_TSPCAP_ALG: 54 case TSS_TSPCAP_RETURNVALUE_INFO: 55 case TSS_TSPCAP_PLATFORM_INFO: 56 case TSS_TSPCAP_MANUFACTURER: 57 if (ulSubCapLength != sizeof(UINT32) || !rgbSubCap) 58 return TSPERR(TSS_E_BAD_PARAMETER); 59 /* fall through */ 60 case TSS_TSPCAP_VERSION: 61 case TSS_TSPCAP_PERSSTORAGE: 62 result = internal_GetCap(tspContext, capArea, 63 rgbSubCap ? *(UINT32 *)rgbSubCap : 0, 64 pulRespDataLength, 65 prgbRespData); 66 break; 67 case TSS_TCSCAP_ALG: 68 if (ulSubCapLength != sizeof(UINT32) || !rgbSubCap) 69 return TSPERR(TSS_E_BAD_PARAMETER); 70 /* fall through */ 71 case TSS_TCSCAP_VERSION: 72 case TSS_TCSCAP_CACHING: 73 case TSS_TCSCAP_PERSSTORAGE: 74 case TSS_TCSCAP_MANUFACTURER: 75 case TSS_TCSCAP_TRANSPORT: 76 case TSS_TCSCAP_PLATFORM_CLASS: 77 result = RPC_GetCapability(tspContext, capArea, ulSubCapLength, rgbSubCap, 78 pulRespDataLength, prgbRespData); 79 break; 80 default: 81 LogDebug("Invalid capArea: 0x%x", capArea); 82 result = TSPERR(TSS_E_BAD_PARAMETER); 83 break; 84 } 85 86 return result; 87 } 88