def resetDevice(self): # Reset the target by reading its signature target = self.findParam('target').getValue() if target == 'xmega (PDI)': CWCoreAPI.getInstance().getScope().scopetype.dev.getCwliteXMEGA().readSignature() else: CWCoreAPI.getInstance().getScope().scopetype.dev.getCwliteAVR().readSignature()
def trigger(self, _=None): print "AUXIO: Trigger pin %d" % self.pin self.checkMode() CWCoreAPI.getInstance().getScope().advancedSettings.cwEXTRA.setGPIOState(state=(not self.standby), IONumber=self.pin) self.nonblockingSleep(self.triglength) CWCoreAPI.getInstance().getScope().advancedSettings.cwEXTRA.setGPIOState(state=self.standby, IONumber=self.pin) self.nonblockingSleep(self.postdelay)
def setPin(self, state, pin=None): if pin is None: pin = self.pin if state != True and state != False and state != None: raise ValueError("Invalid State %s" % str(state)) if pin < 4: CWCoreAPI.getInstance().getScope( ).advancedSettings.cwEXTRA.setGPIOState(state=state, IONumber=pin) elif pin == 100 or pin == 101 or pin == 102: if state == True: strstate = "High" elif state == False: strstate = "Low" else: strstate = "Disabled" if pin == 100: pinname = 'nRST' elif pin == 101: pinname = 'PDID' elif pin == 102: pinname = 'PDIC' CWCoreAPI.getInstance().setParameter([ 'CW Extra Settings', 'Target IOn GPIO Mode', '%s: GPIO' % pinname, strstate ]) else: raise ValueError("Invalid Pin %d" % pin)
def captureInit(self): self.checkMode() CWCoreAPI.getInstance().getScope( ).advancedSettings.cwEXTRA.setGPIOState(state=self.standby, IONumber=self.pin) if self.triglocation == 0: self.trigger()
def savePOI(self): poiDict = { "poi": self.poiArray, "partitiontype": self.parent.partObject.partMethod.__class__.__name__ } CWCoreAPI.getInstance().project().addDataConfig( poiDict, "Template Data", "Points of Interest")
def trigger(self, _=None): logging.info('AUXIO: Trigger pin %d' % self.pin) self.checkMode() CWCoreAPI.getInstance().getScope( ).advancedSettings.cwEXTRA.setGPIOState(state=(not self.standby), IONumber=self.pin) self.nonblockingSleep(self.triglength) CWCoreAPI.getInstance().getScope( ).advancedSettings.cwEXTRA.setGPIOState(state=self.standby, IONumber=self.pin) self.nonblockingSleep(self.postdelay)
def processTraces(self, _=None): tstart = self.findParam('tracerng').getValue()[0] tend = self.findParam('tracerng').getValue()[1] pstart = self.findParam('pointrng').getValue()[0] pend = self.findParam('pointrng').getValue()[1] trace = CWCoreAPI.getInstance().getNewTrace(self.findParam('tracefmt').getValue()) trace.config.setAttr("notes", "Recorded from \"%s\" output: Traces (%s,%s). Points (%s,%s)" % (self.findParam('Input').getValueKey(), tstart, tend, pstart, pend)) for tnum in range(tstart, tend+1): trace.addTrace(self.getTraceSource().getTrace(tnum)[pstart:pend+1], self.getTraceSource().getTextin(tnum), self.getTraceSource().getTextout(tnum), self.getTraceSource().getKnownKey(tnum)) trace.closeAll() CWCoreAPI.getInstance().project().traceManager().appendSegment(trace, enabled=False)
def wrapper(*args, **kwargs): gui_warning = "This api function is for use inside GUI Python Console" try: api = CWCoreAPI.getInstance() if api is None: raise Exception except: raise UserWarning(gui_warning) return func(api, *args, **kwargs)
def checkMode(self): cwa = CWCoreAPI.getInstance().getScope().advancedSettings.cwEXTRA if self.pin != self.lastPin: # Turn off last used pin if self.lastPin: cwa.setTargetIOMode(IONumber=self.lastPin, setting=0) # Setup new pin cwa.setTargetIOMode(IONumber=self.pin, setting=cwa.IOROUTE_GPIOE) # Don't do this again self.lastPin = self.pin
def __init__(self, name=None): PassiveTraceObserver.__init__(self) self.getParams().addChildren([ {'name':'Trace Format', 'key':'tracefmt', 'type':'list', 'values':CWCoreAPI.getInstance().valid_traces, 'value':None}, {'name':'Trace Range', 'key':'tracerng', 'type':'range', 'limits':(0, 0), 'value':(0, 0)}, {'name':'Point Range', 'key':'pointrng', 'type':'rangegraph', 'limits':(0, 0), 'value':(0, 0), 'graphwidget':ResultsBase.registeredObjects["Trace Output Plot"]}, {'name':'Save', 'type':'action', 'action':self.processTraces}, ]) self.findParam('input').setValue(TraceSource.registeredObjects["Trace Management"]) TraceSource.sigRegisteredObjectsChanged.connect(self.traceSourcesChanged) TraceSource.sigRegisteredObjectsChanged.connect(self.resetTraceLimits)
def processTraces(self, _=None): tstart = self.findParam('tracerng').getValue()[0] tend = self.findParam('tracerng').getValue()[1] pstart = self.findParam('pointrng').getValue()[0] pend = self.findParam('pointrng').getValue()[1] trace = CWCoreAPI.getInstance().getNewTrace( self.findParam('tracefmt').getValue()) trace.config.setAttr("scopeSampleRate", self._traceSource.getSampleRate()) trace.config.setAttr( "notes", "Recorded from \"%s\" output: Traces (%s,%s). Points (%s,%s)" % (self.findParam('Input').getValueKey(), tstart, tend, pstart, pend)) for tnum in range(tstart, tend + 1): trace.addTrace( self.getTraceSource().getTrace(tnum)[pstart:pend + 1], self.getTraceSource().getTextin(tnum), self.getTraceSource().getTextout(tnum), self.getTraceSource().getKnownKey(tnum)) trace.closeAll() CWCoreAPI.getInstance().project().traceManager().appendSegment( trace, enabled=False)
def __init__(self, parent): AutoScript.__init__(self) self._autoscript_init = False self.parent = parent self.poi = POI(self) self.poiDock = CWMainGUI.getInstance().addDock(self.poi, "Partition Comparison POI Table", area=Qt.TopDockWidgetArea) self.poiDock.hide() self.defineName() self._traces = None self.api = CWCoreAPI.getInstance() self.graph = GraphWidget() self.bselection = QToolBar() self.graph.addWidget(self.bselection) self.graphDock = CWMainGUI.getInstance().addDock(self.graph, "Partition Comparison Graph", area=Qt.TopDockWidgetArea) self.graphDock.hide()
def __init__(self): self._cwusb = NAEUSB() # Connect required modules up here self.fpga = FPGA(self._cwusb) self.xmega = XMEGAPDI(self._cwusb) self.avr = AVRISP(self._cwusb) self.usart = USART(self._cwusb) self.serialstm32f = STM32FSerial(cwserial=self.usart, cwapi=CWCoreAPI.getInstance()) self.getParams().addChildren([{ 'name': "CW-Lite XMEGA Programmer", 'tip': "Open XMEGA Programmer (ChipWhisperer-Lite Only)", 'type': "menu", "action": lambda _: self.getCwliteXMEGA().show() }, { 'name': "CW-Lite AVR Programmer", 'tip': "Open AVR Programmer (ChipWhisperer-Lite Only)", 'type': "menu", "action": lambda _: self.getCwliteAVR().show() }, { 'name': 'Serial STM32F Programmer', 'tip': "Open STM32F Programmer (Serial/ChipWhisperer)", 'type': "menu", "action": lambda _: self.getSerialSTM32F().show() }])
def __init__(self, name=None): PassiveTraceObserver.__init__(self) self.getParams().addChildren([ { 'name': 'Trace Format', 'key': 'tracefmt', 'type': 'list', 'values': CWCoreAPI.getInstance().valid_traces, 'value': None }, { 'name': 'Trace Range', 'key': 'tracerng', 'type': 'range', 'limits': (0, 0), 'value': (0, 0) }, { 'name': 'Point Range', 'key': 'pointrng', 'type': 'rangegraph', 'limits': (0, 0), 'value': (0, 0), 'graphwidget': ResultsBase.registeredObjects["Trace Output Plot"] }, { 'name': 'Save', 'type': 'action', 'action': self.processTraces }, ]) self.findParam('input').setValue( TraceSource.registeredObjects["Trace Management"]) TraceSource.sigRegisteredObjectsChanged.connect( self.traceSourcesChanged) TraceSource.sigRegisteredObjectsChanged.connect(self.resetTraceLimits)
def __init__(self, parent): AutoScript.__init__(self) self._autoscript_init = False self.parent = parent self.poi = POI(self) self.poiDock = CWMainGUI.getInstance().addDock( self.poi, "Partition Comparison POI Table", area=Qt.TopDockWidgetArea) self.poiDock.hide() self.defineName() self._traces = None self.api = CWCoreAPI.getInstance() self.graph = GraphWidget() self.bselection = QToolBar() self.graph.addWidget(self.bselection) self.graphDock = CWMainGUI.getInstance().addDock( self.graph, "Partition Comparison Graph", area=Qt.TopDockWidgetArea) self.graphDock.hide()
def captureN(scope=None, target=None, project=None, aux_list=None, ktp=None, N=1, seg_size=None): """Capture a number of traces, saving power traces and input/output text and keys to disk along the way. Args: scope: A connected scope object. If None, no power trace will be recorded - possibly helpful for testing target setups target: A connected target object. If None, no target commmands will be sent - assumed that aux commands or external boards are controlling target project: A ChipWhisperer project object. If None, no data will be saved - helpful when testing scope settings without saving aux_list: An AuxList object with auxiliary functions registered. If None, no auxiliary functions are run ktp: A key/text input object. Produces pairs of encryption key/input text for each capture. Can't be None as these values are required N: The number of traces to capture. seg_size: The number of traces to record in each segment. The data is saved to disk in a number of segments to avoid making one enormous data file. If None, a sane default is used. To emulate GUI capture: >>> cw.captureN(self.scope, self.target, self.project, self.aux_list, self.ktp, 50) """ api = CWCoreAPI.getInstance() api.captureM(scope=scope, target=target, project=project, aux_list=aux_list, ktp=ktp, N=N, seg_size=seg_size)
def auxList(): # TODO: this should create a fresh aux list # We can already access API one via self.aux_list api = CWCoreAPI.getInstance() return api.getAuxList()
def captureInit(self): self.checkMode() CWCoreAPI.getInstance().getScope().advancedSettings.cwEXTRA.setGPIOState(state=self.standby, IONumber=self.pin) if self.triglocation == 0: self.trigger()
def addTraces(self, traceSource, tracerange, progressBar=None, pointRange=None): keyround = self.keyround modeltype = self.modeltype brange = self.brange tdiff = self.findParam('reportinterval').getValue() numtraces = tracerange[1] - tracerange[0] if progressBar: progressBar.setMinimum(0) progressBar.setMaximum(len(brange) * 256 * (numtraces / tdiff + 1)) #r = Parallel(n_jobs=4)(delayed(traceOneSubkey)(bnum, pointRange, traces_all, numtraces, plaintexts, ciphertexts, keyround, modeltype, progressBar, self.model, pbcnt) for bnum in brange) #self.all_diffs, pb = zip(*r) cpa = [None] * (max(brange) + 1) for bnum in brange: cpa[bnum] = CPAProgressiveOneSubkey() # cpa[bnum] = MinDistOneSubkey() # cpa[bnum] = TemplateOneSubkey() brangeMap = [None] * (max(brange) + 1) i = 1 for bnum in brange: brangeMap[bnum] = i i += 1 skipPGE = self.findParam('checkpge').getValue() bf = self.findParam('itmode').getValue() == 'bf' #bf specifies a 'breadth-first' search. bf means we search across each #subkey by only the amount of traces specified. Depth-First means we #search each subkey completely, then move onto the next. if bf: brange_df = [0] brange_bf = brange else: brange_bf = [0] brange_df = brange #H = np.load('channelinfo-masked.npy') #H = np.load('csi-masked-newkey.npy') #H = np.load('channelinfo.npy') #mio = sio.loadmat('equalizer.mat') #H = mio['equaltotal'] # H = np.load('equalization.npy') # self.project() ? project = CWCoreAPI.getInstance().project() section = project.getDataConfig("Template Data", "Equalization Matrix") # section = project.getDataConfig("Template Data", "AOF Matrix") fname = project.convertDataFilepathAbs(section[0]["filename"]) H = np.load(fname) #for j in range(0, 16): #4 = 500-800 #test = H.copy() #for i in range(0, 5): # threshold = max(abs(test[j])) # test[j, abs(test[j,:]) >= threshold ] = 0 #print "%f %d"%(threshold, (abs(H[j,:]) > threshold).sum()) #H[j, abs(H[j,:]) < threshold] = 0 for bnum_df in brange_df: #CPAMemoryOneSubkey #CPASimpleOneSubkey #(self.all_diffs[bnum], pbcnt) = sCPAMemoryOneSubkey(bnum, pointRange, traces_all, numtraces, plaintexts, ciphertexts, keyround, modeltype, progressBar, self.model, pbcnt) tstart = 0 tend = tdiff while tstart < numtraces: pbcnt = 0 if tend > numtraces: tend = numtraces if tstart > numtraces: tstart = numtraces data = [] textins = [] textouts = [] knownkeys = [] for i in range(tstart, tend): # Handle Offset tnum = i + tracerange[0] d = traceSource.getTrace(tnum) if d is None: continue data.append(d) textins.append(traceSource.getTextin(tnum)) textouts.append(traceSource.getTextout(tnum)) knownkeys.append(traceSource.getKnownKey(tnum)) traces = np.array(data) textins = np.array(textins) textouts = np.array(textouts) for bnum_bf in brange_bf: if bf: bnum = bnum_bf else: bnum = bnum_df traces_fixed = np.dot(traces - traces.mean(axis=0), H[bnum]) + 4 skip = False if (self.stats.simplePGE(bnum) != 0) or (skipPGE == False): (data, pbcnt) = cpa[bnum].oneSubkey( bnum, pointRange, traces_fixed, tend - tstart, textins, textouts, keyround, modeltype, progressBar, self.model, pbcnt) self.stats.updateSubkey(bnum, data, tnum=tend) else: skip = True if skip: pbcnt = brangeMap[bnum] * 256 * (numtraces / tdiff + 1) if bf is False: tstart = numtraces tend += tdiff tstart += tdiff if self.sr is not None: self.sr()
def addTraces(self, tracedata, tracerange, progressBar=None, pointRange=None): keyround=self.keyround modeltype=self.modeltype brange=self.brange foundkey = [] self.all_diffs = range(0,16) tdiff = self.findParam('reportinterval').getValue() numtraces = tracerange[1] - tracerange[0] if progressBar: progressBar.setMinimum(0) progressBar.setMaximum(len(brange) * 256 * (numtraces/tdiff + 1)) #r = Parallel(n_jobs=4)(delayed(traceOneSubkey)(bnum, pointRange, traces_all, numtraces, plaintexts, ciphertexts, keyround, modeltype, progressBar, self.model, pbcnt) for bnum in brange) #self.all_diffs, pb = zip(*r) cpa = [None]*(max(brange)+1) for bnum in brange: cpa[bnum] = CPAProgressiveOneSubkey() # cpa[bnum] = MinDistOneSubkey() # cpa[bnum] = TemplateOneSubkey() brangeMap = [None]*(max(brange)+1) i = 1 for bnum in brange: brangeMap[bnum] = i i += 1 skipPGE = self.findParam('checkpge').getValue() bf = self.findParam('itmode').getValue() == 'bf' #bf specifies a 'breadth-first' search. bf means we search across each #subkey by only the amount of traces specified. Depth-First means we #search each subkey completely, then move onto the next. if bf: brange_df = [0] brange_bf = brange else: brange_bf = [0] brange_df = brange #H = np.load('channelinfo-masked.npy') #H = np.load('csi-masked-newkey.npy') #H = np.load('channelinfo.npy') #mio = sio.loadmat('equalizer.mat') #H = mio['equaltotal'] # H = np.load('equalization.npy') # self.project() ? project = CWCoreAPI.getInstance().project() section = project.getDataConfig("Template Data", "Equalization Matrix") # section = project.getDataConfig("Template Data", "AOF Matrix") fname = project.convertDataFilepathAbs(section[0]["filename"]) H = np.load(fname) #for j in range(0, 16): #4 = 500-800 #test = H.copy() #for i in range(0, 5): # threshold = max(abs(test[j])) # test[j, abs(test[j,:]) >= threshold ] = 0 #print "%f %d"%(threshold, (abs(H[j,:]) > threshold).sum()) #H[j, abs(H[j,:]) < threshold] = 0 for bnum_df in brange_df: #CPAMemoryOneSubkey #CPASimpleOneSubkey #(self.all_diffs[bnum], pbcnt) = sCPAMemoryOneSubkey(bnum, pointRange, traces_all, numtraces, plaintexts, ciphertexts, keyround, modeltype, progressBar, self.model, pbcnt) tstart = 0 tend = tdiff while tstart < numtraces: pbcnt = 0 if tend > numtraces: tend = numtraces if tstart > numtraces: tstart = numtraces data = [] textins = [] textouts = [] knownkeys = [] for i in range(tstart, tend): # Handle Offset tnum = i + tracerange[0] d = tracedata.getTrace(tnum) if d is None: continue data.append(d) textins.append(tracedata.getTextin(tnum)) textouts.append(tracedata.getTextout(tnum)) knownkeys.append(tracedata.getKnownKey(tnum)) traces = np.array(data) textins = np.array(textins) textouts = np.array(textouts) for bnum_bf in brange_bf: if bf: bnum = bnum_bf else: bnum = bnum_df traces_fixed = np.dot(traces - traces.mean(axis=0), H[bnum]) + 4 skip = False if (self.stats.simplePGE(bnum) != 0) or (skipPGE == False): (data, pbcnt) = cpa[bnum].oneSubkey(bnum, pointRange, traces_fixed, tend - tstart, textins, textouts, keyround, modeltype, progressBar, self.model, pbcnt) self.stats.updateSubkey(bnum, data, tnum=tend) else: skip = True if skip: pbcnt = brangeMap[bnum] * 256 * (numtraces/tdiff + 1) if bf is False: tstart = numtraces tend += tdiff tstart += tdiff if self.sr is not None: self.sr()
def getLastKey(): """Return the last key used in captureN """ api = CWCoreAPI.getInstance() return api.getLastKey()
def savePOI(self): poiDict = {"poi":self.poiArray, "partitiontype":self.parent.partObject.partMethod.__class__.__name__} CWCoreAPI.getInstance().project().addDataConfig(poiDict, "Template Data", "Points of Interest")
def __init__(self): AuxiliaryTemplate.__init__(self) self.api = CWCoreAPI.getInstance()
def getLastExpected(): """Return the last input text used in captureN """ api = CWCoreAPI.getInstance() return api.getLastExpected()