diff --git a/templates/bluepill/openocd.cfg b/templates/bluepill/openocd.cfg index d70df06..d0732b8 100644 --- a/templates/bluepill/openocd.cfg +++ b/templates/bluepill/openocd.cfg @@ -21,6 +21,6 @@ source [find target/stm32f1x.cfg] #tpiu config internal swodump.stm32f103-generic.log uart off 72000000 -#reset_config srst_only srst_push_pull srst_nogate connect_assert_srst -reset_config none srst_push_pull srst_nogate +reset_config srst_only srst_push_pull srst_nogate connect_assert_srst +#reset_config none srst_push_pull srst_nogate diff --git a/templates/bluepill/test b/templates/bluepill/test index 7550a6e..f0817e8 100755 --- a/templates/bluepill/test +++ b/templates/bluepill/test @@ -2,197 +2,128 @@ import os import sys -import time -import struct -import serial import subprocess +import serial.tools.list_ports +from test_common import ( + LogicMultiplexerTimeMeasurements, + parse_nist_aead_test_vectors, + DeviceUnderTestAeadUARTP, + compare_dumps, + eprint, + run_nist_aead_test_line, +) +def get_serial(): + ports = serial.tools.list_ports.comports() + for port in ports: + print(port.serial_number) + devices = [ + p.device + for p in ports + if p.serial_number == 'FT2XCRZ1' + ] + devices.sort() + return serial.Serial( + devices[0], + baudrate=115200, + timeout=5) + + +class BluePill(DeviceUnderTestAeadUARTP): + RAM_SIZE = 0x5000 + + def __init__(self, build_dir): + DeviceUnderTestAeadUARTP.__init__(self, get_serial()) + + self.firmware_path = os.path.join( + build_dir, '.pio/build/bluepill_f103c8/firmware.elf') + self.ram_pattern_path = os.path.join( + build_dir, 'empty_ram.bin') + self.ram_dump_path = os.path.join( + build_dir, 'ram_dump.bin') + self.openocd_cfg_path = os.path.join( + build_dir, 'openocd.cfg') + + def flash(self): + # pipe = subprocess.PIPE + cmd = [ + 'openocd', '-f', 'openocd.cfg', '-c', + 'program %s verify reset exit' % self.firmware_path] + p = subprocess.Popen( + cmd, stdout=sys.stderr, stdin=sys.stdout) + stdout, stderr = p.communicate("") + eprint("Firmware flashed.") + + cmd = [ + 'openocd', '-f', self.openocd_cfg_path, '-c', + 'program %s reset exit 0x20000000' % self.ram_pattern_path] + p = subprocess.Popen( + cmd, stdout=sys.stderr, stdin=sys.stdout) + stdout, stderr = p.communicate("") + eprint("RAM flashed.") + + def dump_ram(self): + cmd = [ + 'openocd', '-f', self.openocd_cfg_path, + '-c', 'init', + '-c', 'halt', + '-c', 'dump_image %s 0x20000000 0x%x' % ( + self.ram_dump_path, BluePill.RAM_SIZE), + '-c', 'resume', + '-c', 'exit'] + p = subprocess.Popen( + cmd, stdout=sys.stderr, stdin=sys.stdout) + stdout, stderr = p.communicate("") + eprint("RAM dumped.") + with open(self.ram_dump_path, 'rb') as ram: + ram = ram.read() + if len(ram) != BluePill.RAM_SIZE: + raise Exception( + "RAM dump was %d bytes instead of %d" % + (len(ram), BluePill.RAM_SIZE)) + return ram -def eprint(*args, **kargs): - print(*args, file=sys.stderr, **kargs) +def main(argv): + if len(argv) != 3: + print("Usage: test LWC_AEAD_KAT.txt build_dir") + return 1 -def flash(): - pipe = subprocess.PIPE - cmd = ['openocd', '-f', 'openocd.cfg', '-c' 'program ' + - '.pio/build/bluepill_f103c8/firmware.elf verify reset exit'] - p = subprocess.Popen(cmd, - stdout=sys.stderr, stdin=sys.stdout) - stdout, stderr = p.communicate("") + kat = list(parse_nist_aead_test_vectors(argv[1])) + build_dir = argv[2] + dut = BluePill(build_dir) -def fill_ram(): - pipe = subprocess.PIPE - cmd = ['openocd', '-f', 'openocd.cfg', '-c' 'program ' + - 'empty_ram.bin reset exit 0x20000000'] - p = subprocess.Popen(cmd, - stdout=sys.stderr, stdin=sys.stdout) - stdout, stderr = p.communicate("") + try: + tool = LogicMultiplexerTimeMeasurements(0x0003) + tool.begin_measurement() + dut.flash() + dut.prepare() + sys.stdout.write("Board prepared\n") + sys.stdout.flush() -def get_serial(): - import serial.tools.list_ports - ports = serial.tools.list_ports.comports() - devices = [ p.device for p in ports ] - devices.sort() - return devices[-1] - - -class UARTP: - def __init__(self, ser): - UARTP.SYN = 0xf9 - UARTP.FIN = 0xf3 - self.ser = ser - - def uart_read(self): - r = self.ser.read(1) - if len(r) != 1: - raise Exception("Serial read error") - return r[0] - - def uart_write(self, c): - b = struct.pack("B", c) - r = self.ser.write(b) - if r != len(b): - raise Exception("Serial write error") - return r - - def send(self, buf): - self.uart_write(UARTP.SYN) - len_ind_0 = 0xff & len(buf) - len_ind_1 = 0xff & (len(buf) >> 7) - if len(buf) < 128: - self.uart_write(len_ind_0) - else: - self.uart_write(len_ind_0 | 0x80) - self.uart_write(len_ind_1) - fcs = 0 - for i in range(len(buf)): - info = buf[i] - fcs = (fcs + info) & 0xff - self.uart_write(buf[i]) - fcs = (0xff - fcs) & 0xff - self.uart_write(fcs) - self.uart_write(UARTP.FIN) - eprint("sent frame '%s'" % buf.hex()) - - def recv(self): - tag_old = UARTP.FIN - while 1: - tag = tag_old - while 1: - if tag_old == UARTP.FIN: - if tag == UARTP.SYN: - break - tag_old = tag - tag = self.uart_read() - tag_old = tag - - l = self.uart_read() - if l & 0x80: - l &= 0x7f - l |= self.uart_read() << 7 - - fcs = 0 - buf = [] - for i in range(l): - info = self.uart_read() - buf.append(info) - fcs = (fcs + info) & 0xff - fcs = (fcs + self.uart_read()) & 0xff - - tag = self.uart_read() - if fcs == 0xff: - if tag == UARTP.FIN: - buf = bytes(buf) - eprint("rcvd frame '%s'" % buf.hex()) - if len(buf) >= 1 and buf[0] == 0xde: - sys.stderr.buffer.write(buf[1:]) - sys.stderr.flush() - else: - return buf + dump_a = dut.dump_ram() -def main(argv): - eprint(argv[0]) - script_dir = os.path.split(argv[0])[0] - if len(script_dir) > 0: - os.chdir(script_dir) - - dev = get_serial() - ser = serial.Serial(dev, baudrate=115200, timeout=5) - uartp = UARTP(ser) - - flash() - fill_ram() - eprint("Flashed") - time.sleep(0.1) - - ser.setDTR(False) # IO0=HIGH - ser.setRTS(True) # EN=LOW, chip in reset - time.sleep(0.1) - ser.setDTR(False) # IO0=HIGH - ser.setRTS(False) # EN=HIGH, chip out of reset - time.sleep(1) - - def stdin_read(n): - b = sys.stdin.buffer.read(n) - if len(b) != n: - sys.exit(1) - return b - - def stdin_readvar(): - l = stdin_read(4) - (l, ) = struct.unpack("> 7) - if len(buf) < 128: - self.uart_write(len_ind_0) - else: - self.uart_write(len_ind_0 | 0x80) - self.uart_write(len_ind_1) - fcs = 0 - for i in range(len(buf)): - info = buf[i] - fcs = (fcs + info) & 0xff - self.uart_write(buf[i]) - fcs = (0xff - fcs) & 0xff - self.uart_write(fcs) - self.uart_write(UARTP.FIN) - eprint("sent frame '%s'" % buf.hex()) - - def recv(self): - tag_old = UARTP.FIN - while 1: - tag = tag_old - while 1: - if tag_old == UARTP.FIN: - if tag == UARTP.SYN: - break - tag_old = tag - tag = self.uart_read() - tag_old = tag - - l = self.uart_read() - if l & 0x80: - l &= 0x7f - l |= self.uart_read() << 7 - - fcs = 0 - buf = [] - for i in range(l): - info = self.uart_read() - buf.append(info) - fcs = (fcs + info) & 0xff - fcs = (fcs + self.uart_read()) & 0xff - - tag = self.uart_read() - if fcs == 0xff: - if tag == UARTP.FIN: - buf = bytes(buf) - eprint("rcvd frame '%s'" % buf.hex()) - if len(buf) >= 1 and buf[0] == 0xde: - sys.stderr.buffer.write(buf[1:]) - sys.stderr.flush() - else: - return buf def main(argv): - eprint(argv[0]) - script_dir = os.path.split(argv[0])[0] - if len(script_dir) > 0: - os.chdir(script_dir) - - dev = get_serial() - flash(dev) - eprint("Flashed") - time.sleep(0.1) - - ser = serial.Serial(dev, baudrate=500000, timeout=5) - uartp = UARTP(ser) - - ser.setDTR(False) # IO0=HIGH - ser.setRTS(True) # EN=LOW, chip in reset - time.sleep(0.1) - ser.setDTR(False) # IO0=HIGH - ser.setRTS(False) # EN=HIGH, chip out of reset - time.sleep(1) - - def stdin_read(n): - b = sys.stdin.buffer.read(n) - if len(b) != n: - sys.exit(1) - return b - - def stdin_readvar(): - l = stdin_read(4) - (l, ) = struct.unpack("