HWBTutorials/TRNG_attack/measurement.py

87 lines
2.5 KiB
Python

import oscilloscope
import serial
import serial.tools.list_ports
from time import sleep
SAMPLE_FREQ = 625*10**6
RO_CNT = 64
TRNG_PAIR_CNT = 64
def list_resources(resources: list, resource_name: str):
if not resources:
print('no', resource_name, 'available')
else:
print('available', resource_name + ':')
for resource_id in range(len(resources)):
print('[', resource_id, '] ', resources[resource_id])
def list_scopes():
found_oscilloscopes = oscilloscope.get_oscilloscopes()
list_resources(found_oscilloscopes, 'oscilloscopes')
def channel_meas(scope, n):
scope.command_check(":WAVeform:SOURce", 'CHANnel{}'.format(n))
trace = scope.query_binary(':WAVeform:DATA?')
return trace
# Infinite test run
# The cycle iterates over all ROs. Can be interrupted by pressing CTRL-C
def run(fpga_comm):
print ("Infinite run, press CTRL-C to break.")
try:
i = 0
while True:
fpga_comm.write(bytes([i,i]))
i = (i + 1) % RO_CNT
sleep(1)
except KeyboardInterrupt:
pass
def trng_read(scope, fpga_comm):
with open('data_info.txt', "w") as finfo, open ('data.bin', "wb") as fdata:
for i in range(TRNG_PAIR_CNT):
print('--------------------------MEAS {}-------------------------------'.format(i))
scope.write(':SINGle')
sleep(0.1)
fpga_comm.write(bytes([i,i]))
trace1 = channel_meas(scope, 1)
trace2 = channel_meas(scope, 2)
if i == 0:
tracelength = scope.query(':WAVeform:POINts?')
fs = scope.query(':ACQuire:SRATe?')
print(tracelength, file = finfo)
print(int(float(fs)), file = finfo)
fdata.write(trace1)
fdata.write(trace2)
val = fpga_comm.read(16)
print(val.hex())
print(val.hex(), file = finfo)
if __name__ == '__main__':
list_scopes()
ports = serial.tools.list_ports.comports()
list_resources(ports, "COM")
# modify the device numbers in the following two lines:
s = serial.Serial(ports[3].device, 923076)
scope = oscilloscope.Oscilloscope(5)
scope.setup_measurement()
# scope.save_conf('scope_setup.conf')
scope.load_conf('scope_setup.conf')
sleep(2) # wait for the oscilloscope to process the setup
# test run -- only TRNG, no recording
# run(s)
# measurement -- RESET the FPGA >first! (USB disconnect+connect)
trng_read(scope, s)