blob: bfcbe0d7a16db9b6bf4dd0cfcb6bb0e0c7e38931 [file] [log] [blame]
#!/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)