示例#1
0
 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()
示例#2
0
 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)
示例#3
0
 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()
示例#4
0
    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)
示例#8
0
    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)
示例#9
0
 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
示例#11
0
    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)
示例#12
0
    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
示例#13
0
    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)
示例#14
0
    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()
示例#15
0
    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()
        }])
示例#16
0
    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()
示例#18
0
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)
示例#19
0
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()
示例#20
0
    def captureInit(self):
        self.checkMode()
        CWCoreAPI.getInstance().getScope().advancedSettings.cwEXTRA.setGPIOState(state=self.standby, IONumber=self.pin)

        if self.triglocation == 0:
            self.trigger()
示例#21
0
    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()
示例#23
0
def getLastKey():
    """Return the last key used in captureN
    """
    api = CWCoreAPI.getInstance()
    return api.getLastKey()
示例#24
0
 def savePOI(self):
     poiDict = {"poi":self.poiArray, "partitiontype":self.parent.partObject.partMethod.__class__.__name__}
     CWCoreAPI.getInstance().project().addDataConfig(poiDict, "Template Data", "Points of Interest")
示例#25
0
 def __init__(self):
     AuxiliaryTemplate.__init__(self)
     self.api = CWCoreAPI.getInstance()
示例#26
0
def getLastExpected():
    """Return the last input text used in captureN
    """
    api = CWCoreAPI.getInstance()
    return api.getLastExpected()