#!/usr/bin/env python3 import os import sys import socket import subprocess import time import struct from array import array def toString(arr): return ' '.join('{:02x}'.format(x) for x in arr) def test_ReadPCR10(fd, is_tpm2): if is_tpm2: send_data = bytearray(b"\x80\x01\x00\x00\x00\x14\x00\x00\x01\x7e"\ b"\x00\x00\x00\x01\x00\x0b\x03\x00\x04\x00") exp_data = bytearray([0x80, 0x01, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x01, 0x00]) else: send_data = bytearray(b"\x00\xC1\x00\x00\x00\x0C\x00\x00\x00\x99"\ b"\x00\x01") exp_data = bytearray([0x00, 0xC4, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x26]) try: print("Sending data over ....") n = fd.send(send_data) print("Written %d bytes " % n) except socket.error as e: print("SocketError") fd.close() return False buf = fd.recv(1024) fd.close() if buf: if bytearray(buf) == exp_data: return True else: print("Unexpected reply:\n actual: %s\n expected: %s" % (toString(buf), toString(exp_data))) return False else: print("Null reply from swtpm") return False def test_SetDatafd(is_tpm2): fd, _fd = socket.socketpair(socket.AF_UNIX, socket.SOCK_STREAM) sock_path = os.getenv('SOCK_PATH') cmd_set_data_fd = bytearray([0x00, 0x00, 0x00, 0x10]) expected_res = bytearray([0x00, 0x00, 0x00, 0x00]) try: fds = array("i") fds.append(_fd.fileno()) ctrlfd = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) print("Connecting to server at : %s" % sock_path) ctrlfd.connect(sock_path) print("Sending data fd over ctrl fd...") if sys.version_info[0] < 3: sendmsg.send1msg(ctrlfd.fileno(), str(cmd_set_data_fd), 0, [(socket.SOL_SOCKET, sendmsg.SCM_RIGHTS, struct.pack("i", _fd.fileno()))]) else: ctrlfd.sendmsg([cmd_set_data_fd], [(socket.SOL_SOCKET, socket.SCM_RIGHTS, fds)]) except socket.error as e: print("SocketError: " + str(e)) ctrlfd.close() buf = ctrlfd.recv(4) print("Received bytes.. : %s" % buf) if buf: caps = bytearray(buf) if caps == expected_res: return test_ReadPCR10(fd, is_tpm2) else: print("Unexpected reply for CMD_SET_DATA_FD: \n" " actual: %s\n expected: %s" % (toString(caps), toString(expected_res))) return False else: print("Null reply from swtpm") return False if __name__ == "__main__": is_tpm2 = False if len(sys.argv) >= 2: is_tpm2 = sys.argv[1] == '--tpm2' try: if not test_SetDatafd(is_tpm2): res = 1 else: res = 0 except: print("__Exception: ", sys.exc_info()) res = -1 sys.exit(res)