class CPAProgressive(AutoScript, QObject): """ CPA Attack done as a loop, but using an algorithm which can progressively add traces & give output stats """ paramListUpdated = Signal(list) def __init__(self, targetModel, leakageFunction, showScriptParameter=None, parent=None): super(CPAProgressive, self).__init__() resultsParams = [{'name':'Iteration Mode', 'key':'itmode', 'type':'list', 'values':{'Depth-First':'df', 'Breadth-First':'bf'}, 'value':'bf'}, {'name':'Skip when PGE=0', 'key':'checkpge', 'type':'bool', 'value':False}, ] self.params = Parameter.create(name='Progressive CPA', type='group', children=resultsParams) if showScriptParameter is not None: self.showScriptParameter = showScriptParameter # print self.showScriptParameter ExtendedParameter.setupExtended(self.params, self) self.model = targetModel self.leakage = leakageFunction self.sr = None self.stats = DataTypeDiffs() self.updateScript() def updateScript(self, ignored=None): # self.addFunction('init', 'setReportingInterval', '%d' % self.findParam('reportinterval').value()) pass def paramList(self): return [self.params] def setTargetBytes(self, brange): self.brange = brange def setKeyround(self, keyround): self.keyround = keyround def setDirection(self, dir): self._direction = dir def setModeltype(self, modeltype): self.modeltype = modeltype def setReportingInterval(self, ri): self._reportingInterval = ri def addTraces(self, traces, plaintexts, ciphertexts, knownkeys=None, progressBar=None, pointRange=None): keyround=self.keyround brange=self.brange traces_all = np.array(traces) plaintexts =np.array(plaintexts) ciphertexts =np.array(ciphertexts) foundkey = [] self.all_diffs = range(0,16) numtraces = len(traces_all[:,0]) if progressBar: pbcnt = 0 progressBar.setMinimum(0) progressBar.setMaximum(len(brange) * 256 * (numtraces / self._reportingInterval + 1)) pbcnt = 0 #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) #pbcnt = 0 cpa = [None]*(max(brange)+1) for bnum in brange: cpa[bnum] = CPAProgressiveOneSubkey() brangeMap = [None]*(max(brange)+1) i = 1 for bnum in brange: brangeMap[bnum] = i i += 1 skipPGE = False # self.findParam('checkpge').value() bf = True # self.findParam('itmode').value() == '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 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 = self._reportingInterval while tstart < numtraces: if tend > numtraces: tend = numtraces if tstart > numtraces: tstart = numtraces for bnum_bf in brange_bf: if bf: bnum = bnum_bf else: bnum = bnum_df skip = False if (self.stats.simplePGE(bnum) != 0) or (skipPGE == False): (data, pbcnt) = cpa[bnum].oneSubkey(bnum, pointRange, traces_all[tstart:tend], tend - tstart, plaintexts[tstart:tend], ciphertexts[tstart:tend], keyround, self.leakage, progressBar, self.model, pbcnt, self._direction, knownkeys) self.stats.updateSubkey(bnum, data, tnum=tend) else: skip = True if progressBar.wasSkipped() or skip: progressBar.clearSkipped() pbcnt = brangeMap[bnum] * 256 * (numtraces / self._reportingInterval + 1) if bf is False: tstart = numtraces tend += self._reportingInterval tstart += self._reportingInterval if self.sr is not None: self.sr() def getStatistics(self): return self.stats def setStatsReadyCallback(self, sr): self.sr = sr
class CPAExperimentalChannelinfo(QObject): """ CPA Attack done as a loop, but using an algorithm which can progressively add traces & give output stats """ paramListUpdated = Signal(list) def __init__(self, model, showScriptParameter=None, parent=None): super(CPAExperimentalChannelinfo, self).__init__() resultsParams = [ { 'name': 'Reporting Interval', 'key': 'reportinterval', 'type': 'int', 'value': 100 }, { 'name': 'Iteration Mode', 'key': 'itmode', 'type': 'list', 'values': { 'Depth-First': 'df', 'Breadth-First': 'bf' }, 'value': 'bf' }, { 'name': 'Skip when PGE=0', 'key': 'checkpge', 'type': 'bool', 'value': False }, ] self.params = Parameter.create(name='Progressive CPA', type='group', children=resultsParams) ExtendedParameter.setupExtended(self.params, self) self.model = model self.sr = None self._parent = parent # print self._parent.parent self.stats = DataTypeDiffs() def paramList(self): return [self.params] def setByteList(self, brange): self.brange = brange 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').value() numtraces = tracerange[1] - tracerange[0] if progressBar: pbcnt = 0 progressBar.setMinimum(0) progressBar.setMaximum(len(brange) * 256 * (numtraces / tdiff + 1)) pbcnt = 0 #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) #pbcnt = 0 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').value() bf = self.findParam('itmode').value() == '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 = self._parent.parent().proj 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: 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 progressBar.wasSkipped() or skip: progressBar.clearSkipped() 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() if progressBar is not None: pbcnt = 0 def getStatistics(self): return self.stats def setStatsReadyCallback(self, sr): self.sr = sr
class CPAProgressive(AutoScript, QObject): """ CPA Attack done as a loop, but using an algorithm which can progressively add traces & give output stats """ paramListUpdated = Signal(list) def __init__(self, targetModel, leakageFunction, showScriptParameter=None, parent=None): super(CPAProgressive, self).__init__() resultsParams = [{'name':'Iteration Mode', 'key':'itmode', 'type':'list', 'values':{'Depth-First':'df', 'Breadth-First':'bf'}, 'value':'bf'}, {'name':'Skip when PGE=0', 'key':'checkpge', 'type':'bool', 'value':False}, ] self.params = Parameter.create(name='Progressive CPA', type='group', children=resultsParams) if showScriptParameter is not None: self.showScriptParameter = showScriptParameter # print self.showScriptParameter ExtendedParameter.setupExtended(self.params, self) self.model = targetModel self.leakage = leakageFunction self.sr = None self.stats = DataTypeDiffs() self.updateScript() def updateScript(self, ignored=None): # self.addFunction('init', 'setReportingInterval', '%d' % self.findParam('reportinterval').value()) pass def paramList(self): return [self.params] def setTargetBytes(self, brange): self.brange = brange def setReportingInterval(self, ri): self._reportingInterval = ri def addTraces(self, tracedata, tracerange, progressBar=None, pointRange=None): brange=self.brange self.all_diffs = range(0,16) numtraces = tracerange[1] - tracerange[0] if progressBar: pbcnt = 0 progressBar.setMinimum(0) progressBar.setMaximum(len(brange) * 256 * (numtraces / self._reportingInterval + 1)) pbcnt = 0 cpa = [None]*(max(brange)+1) for bnum in brange: cpa[bnum] = CPAProgressiveOneSubkey() brangeMap = [None]*(max(brange)+1) i = 1 for bnum in brange: brangeMap[bnum] = i i += 1 skipPGE = False # self.findParam('checkpge').value() bf = True # self.findParam('itmode').value() == '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 for bnum_df in brange_df: tstart = 0 tend = self._reportingInterval while tstart < numtraces: 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) # knownkeys = np.array(knownkeys) for bnum_bf in brange_bf: if bf: bnum = bnum_bf else: bnum = bnum_df skip = False if (self.stats.simplePGE(bnum) != 0) or (skipPGE == False): if isinstance(pointRange, list): bptrange = pointRange[bnum] else: bptrange = pointRange (data, pbcnt) = cpa[bnum].oneSubkey(bnum, bptrange, traces, tend - tstart, textins, textouts, knownkeys, progressBar, self.model, self.leakage, cpa[bnum].modelstate, pbcnt) self.stats.updateSubkey(bnum, data, tnum=tend) else: skip = True if progressBar.wasSkipped() or skip: progressBar.clearSkipped() pbcnt = brangeMap[bnum] * 256 * (numtraces / self._reportingInterval + 1) if bf is False: tstart = numtraces tend += self._reportingInterval tstart += self._reportingInterval if self.sr is not None: self.sr() def getStatistics(self): return self.stats def setStatsReadyCallback(self, sr): self.sr = sr def processKnownKey(self, inpkey): if hasattr(self.model, 'processKnownKey'): return self.model.processKnownKey(self.leakage, inpkey) else: return inpkey
class CPAExperimentalChannelinfo(QObject): """ CPA Attack done as a loop, but using an algorithm which can progressively add traces & give output stats """ paramListUpdated = Signal(list) def __init__(self, model, showScriptParameter=None, parent=None): super(CPAExperimentalChannelinfo, self).__init__() resultsParams = [{'name':'Reporting Interval', 'key':'reportinterval', 'type':'int', 'value':100}, {'name':'Iteration Mode', 'key':'itmode', 'type':'list', 'values':{'Depth-First':'df', 'Breadth-First':'bf'}, 'value':'bf'}, {'name':'Skip when PGE=0', 'key':'checkpge', 'type':'bool', 'value':False}, ] self.params = Parameter.create(name='Progressive CPA', type='group', children=resultsParams) ExtendedParameter.setupExtended(self.params, self) self.model = model self.sr = None self._parent = parent # print self._parent.parent self.stats = DataTypeDiffs() def paramList(self): return [self.params] def setByteList(self, brange): self.brange = brange 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').value() numtraces = tracerange[1] - tracerange[0] if progressBar: pbcnt = 0 progressBar.setMinimum(0) progressBar.setMaximum(len(brange) * 256 * (numtraces/tdiff + 1)) pbcnt = 0 #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) #pbcnt = 0 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').value() bf = self.findParam('itmode').value() == '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 = self._parent.parent().proj 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: 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 progressBar.wasSkipped() or skip: progressBar.clearSkipped() 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() if progressBar is not None: pbcnt = 0 def getStatistics(self): return self.stats def setStatsReadyCallback(self, sr): self.sr = sr