X-Git-Url: http://git.rot13.org/?p=goodfet;a=blobdiff_plain;f=client%2FGoodFETGlitch.py;h=49db85c77cc1a229408f7c1b4967bb1c62b2efd3;hp=7e997cb281d200d9d1c9e8866815611769d1ea84;hb=d9ad4e6c499d53a2472c330637456a9662c76e2e;hpb=ede679b09a09781692fe15a4b3ca76e965378d91 diff --git a/client/GoodFETGlitch.py b/client/GoodFETGlitch.py index 7e997cb..49db85c 100644 --- a/client/GoodFETGlitch.py +++ b/client/GoodFETGlitch.py @@ -75,15 +75,24 @@ class GoodFETGlitch(GoodFET): return range(min,max,1); #If we get here, there are no points. Return empty set. return []; - def buildglitchvoltages(self): + def crunch(self): """This builds tables for glitching voltage ranges from the training set.""" - print "Precomputing glitching ranges. This might take a while."; + print "Precomputing glitching ranges. This might take a long while."; + print "Times..."; sys.stdout.flush(); - self.db.execute("create temporary table glitchrange(time integer primary key asc,max,min);"); + self.db.execute("drop table if exists glitchrange;"); + self.db.execute("create table glitchrange(time integer primary key asc,max,min);"); self.db.execute("insert into glitchrange(time,max,min) select distinct time, 0, 0 from glitches;"); + self.db.commit(); + print "Maximums..."; + sys.stdout.flush(); self.db.execute("update glitchrange set max=(select max(vcc) from glitches where glitches.time=glitchrange.time and count=0);"); + self.db.commit(); + print "Minimums..."; + sys.stdout.flush(); self.db.execute("update glitchrange set min=(select min(vcc) from glitches where glitches.time=glitchrange.time and count>0);"); - + self.db.commit(); + print "Ranges calculated."; def graphx11(self): try: import Gnuplot, Gnuplot.PlotItems, Gnuplot.funcutils @@ -118,7 +127,7 @@ class GoodFETGlitch(GoodFET): g('set term png'); g('set output "timevcc.png"'); g(script_timevcc); - def explore(self,tstart=0,tstop=-1, trials=5): + def explore(self,tstart=0,tstop=-1, trials=1): """Exploration phase. Uses thresholds to find exploitable points.""" gnd=0; self.scansetup(1); #Lock the chip, place key in eeprom. @@ -126,11 +135,20 @@ class GoodFETGlitch(GoodFET): tstop=self.client.glitchstarttime(); times=range(tstart,tstop); random.shuffle(times); - self.buildglitchvoltages(); + #self.crunch(); count=0.0; - total=1.0*len(t); - for t in times: - voltages=self.glitchvoltages(t); + total=1.0*len(times); + + c=self.db.cursor(); + c.execute("select time,min,max from glitchrange where max-min>0;"); + rows=c.fetchall(); + c.close(); + random.shuffle(rows); + for r in rows: + t=r[0]; + min=r[1]; + max=r[2]; + voltages=range(min,max,1); count=count+1.0; print "%02.02f Exploring %04i points in t=%04i." % (count/total,len(voltages),t); sys.stdout.flush(); @@ -199,10 +217,10 @@ class GoodFETGlitch(GoodFET): rows=c.fetchall(); for a in rows: return True; + c.close(); return False; def scanat(self,lock,trials,vcc,gnd,time): client=self.client; - db=self.db; client.glitchRate(time); client.glitchVoltages(gnd, vcc); #drop voltage target gcount=0; @@ -227,7 +245,7 @@ class GoodFETGlitch(GoodFET): scount+=1; #print "values (%i,%i,%i,%i,%i);" % ( # time,vcc,gnd,gcount,scount); - if(lock>0): + if(lock==0): self.db.execute("insert into glitches(time,vcc,gnd,trials,glitchcount,count,lock)" "values (%i,%i,%i,%i,%i,%i,%i);" % ( time,vcc,gnd,trials,gcount,scount,lock));