Source code for tpm2_pytss.TCTI

# SPDX-License-Identifier: BSD-2

from ._libtpm2_pytss import ffi

from .internal.utils import _chkrc


[docs]class TCTI: def __init__(self, ctx): self._v1 = ffi.cast("TSS2_TCTI_CONTEXT_COMMON_V1 *", ctx) if self._v1.version == 2: self._v2 = ffi.cast("TSS2_TCTI_CONTEXT_COMMON_V2 *", ctx) else: self._v2 = None self._ctx = ctx @property def _tcti_context(self): return self._ctx @property def magic(self): return self._v1.magic @property def version(self): return self._v1.version
[docs] def transmit(self, command): cmd = ffi.new("uint8_t []", command) clen = len(command) _chkrc(self._v1.transmit(self._ctx, clen, cmd))
[docs] def receive(self, size=-1, timeout=-1): if size == -1: size = 4096 resp = ffi.new("uint8_t []", b"\x00" * size) rsize = ffi.new("size_t *", size) _chkrc(self._v1.receive(self._ctx, rsize, resp, timeout)) return bytes(ffi.buffer(resp, rsize[0]))
[docs] def finalize(self): self._v1.finalize(self._ctx)
[docs] def cancel(self): _chkrc(self._v1.cancel(self._ctx))
[docs] def get_poll_handles(self): nhandles = ffi.new("size_t *", 0) _chkrc(self._v1.getPollHandles(self._ctx, ffi.NULL, nhandles)) if nhandles[0] == 0: return () handles = ffi.new("TSS2_TCTI_POLL_HANDLE []", nhandles[0]) _chkrc(self._v1.getPollHandles(self._ctx, handles, nhandles)) rh = [] for i in range(0, nhandles[0]): rh.append(handles[i]) return tuple(rh)
[docs] def set_locality(self, locality): _chkrc(self._v1.setLocality(self._ctx, locality))
[docs] def make_sticky(self, handle, sticky): if self._v2 is None: raise RuntimeError("unsupported by TCTI API version") hptr = ffi.new("TPM2_HANDLE *", handle) _chkrc(self._v2.makeSticky(self._ctx, hptr, sticky)) return hptr[0]