UINT32 tpm_get_free_session(BYTE type) { UINT32 i; for (i = 0; i < TPM_MAX_SESSIONS; i++) { if (read_TPM_STANY_DATA_sessions_type(i) == TPM_ST_INVALID) { write_TPM_STANY_DATA_sessions_type(i, type); if (type == TPM_ST_TRANSPORT) return INDEX_TO_TRANS_HANDLE(i); else return INDEX_TO_AUTH_HANDLE(i); } } return TPM_INVALID_HANDLE; }
static TPM_RESULT cap_handle(UINT32 subCapSize, BYTE *subCap, UINT32 *respSize, BYTE **resp) { UINT32 i, len, type; BYTE *ptr; /* maximum of { TPM_MAX_KEYS, TPM_MAX_SESSIONS } */ UINT32 list_size = (TPM_MAX_KEYS > TPM_MAX_SESSIONS) ? TPM_MAX_KEYS : TPM_MAX_SESSIONS; UINT32 handles[list_size]; TPM_KEY_HANDLE_LIST list = { 0, handles }; if (tpm_unmarshal_UINT32(&subCap, &subCapSize, &type)) return TPM_BAD_MODE; switch (type) { case TPM_RT_KEY: debug("[TPM_RT_KEY]"); for (i = 0; i < TPM_MAX_KEYS; i++) if (tpmData.permanent.data.keys[i].valid) { list.loaded++; list.handle[i] = INDEX_TO_KEY_HANDLE(i); } break; case TPM_RT_AUTH: debug("[TPM_RT_AUTH]"); for (i = 0; i < TPM_MAX_SESSIONS; i++) if (tpmData.stany.data.sessions[i].type == TPM_ST_OIAP || tpmData.stany.data.sessions[i].type == TPM_ST_OSAP) { list.loaded++; list.handle[i] = INDEX_TO_AUTH_HANDLE(i); } break; case TPM_RT_TRANS: debug("[TPM_RT_TRANS]"); for (i = 0; i < TPM_MAX_SESSIONS; i++) if (tpmData.stany.data.sessions[i].type == TPM_ST_TRANSPORT) { list.loaded++; list.handle[i] = INDEX_TO_TRANS_HANDLE(i); } break; /* removed since v1.2 rev 94 case TPM_RT_DELEGATE: debug("[TPM_RT_DELEGATE]"); break; */ case TPM_RT_COUNTER: debug("[TPM_RT_COUNTER]"); for (i = 0; i < TPM_MAX_COUNTERS; i++) if (tpmData.permanent.data.counters[i].valid) { list.loaded++; list.handle[i] = INDEX_TO_COUNTER_HANDLE(i); } break; case TPM_RT_CONTEXT: /* TODO: implement TPM_CAP_HANDLE for TPM_RT_CONTEXT */ default: return TPM_BAD_MODE; } /* marshal handle list */ len = *respSize = 2 + list.loaded * 4; ptr = *resp = tpm_malloc(len); if (ptr == NULL || tpm_marshal_TPM_KEY_HANDLE_LIST(&ptr, &len, &list)) { tpm_free(*resp); return TPM_FAIL; } return TPM_SUCCESS; }