Hallo,
im Rahmen meines Studium muss ich Keccak (neue SHA-3 Hashfunktion) in
AVR Assembler programmieren und auf einer ATMega 163 Smartcard zum
laufen bringen. Das Programm ist soweit fertig (ca. 1000 Zeilen Code und
recht langsam, da ich wenig Wert auf Optimierung gelegt habe). Im AVR
Studio liefert mir das Programm auch die richtigen Ergebnisse. Auf der
Smartcard jedoch stürzt das Programm ab.
kleine Info:
Keccak besteht aus 24 Runden a 5 Funktionen (theta,rho,pi,chi,iota).
Auf der Smartcard funktionieren 4 Runden und die Smartcard liefert mir
auch die richtigen Ergebnisse zurück. Sobald ich aber 5 Runden Keccak
ausführen lasse, stürzt mein Java Programm (Kommunikation mit Smartcard)
mit einer Fehlermeldung ab (siehe Anhang). Meine Vermutung ist, dass die
Smartcard irgendwann "überlastet" ist. Um dies zu bestätigen habe ich
nur die 1. Funktion (theta) öfter als 24 mal ausühren lassen. 130
Ausführungen von Theta macht die Smartcard problemlos mit. Bei 140
Ausführungen von theta bekomme ich wieder die gleiche Fehlermeldung.
Ist es denkbar, dass ich mit meiner Vermutung richtig liege? Im Anhang
die Fehlermeldung des Java Programms.
foobar schrieb:> 130 Ausführungen von Theta macht die Smartcard problemlos mit. Bei 140> Ausführungen von theta bekomme ich wieder die gleiche Fehlermeldung.
Riecht nach Stack-Überlauf.
Vielleicht irgendwo ein push zuviel und ein pop zu wenig.
mfg.
Thomas Eckmann schrieb:> Vielleicht irgendwo ein push zuviel und ein pop zu wenig.
oder ein (r)jmp statt einem ret(i) oder ...
Eventuell einfach ab und zu mal den Stackpointer auslesen und ausgeben?
Hallo,
vielen dank für die Antworten.
push/pop Anweisungen gibt es nur am anfang und ende des ganzen
Programmes. Die c Funktionen zum umgehen mit den APDU's usw wurden schon
vorgegeben (Betriebssystem). Die Grundstruktur meiner bla.s Datei sieht
ungefähr so aus:
.global sha3_init
.type sha3_init,@function
sha3_init:
push r0
.
.
.
push r31
Anweisungen um die 768 Byte freien SRAM (vorgegeben) auf 0 setzen
pop r31
.
.
.
pop r0
.global sha3_hash
.type sha3_hash,@function
sha3_hash:
push r0
.
.
.
push r32
-Labels zum umgehen mit den APDU's
-eventuell zum Padding springen
-Label keccak
theta
rho
pi
chi
iota
jmp keccak wenn noch nicht 24 mal ausgeführt wurde
-eventuell noch Rest der Nachricht speichern
-Label Padding
pop r0
.
.
.
pop r31
Es gibt keinerlei Unterfunktionen sondern nur Labels (ja stümperhaft
aber egal) und wie gesagt push und pop Anweisungen nur am anfang und am
Ende des ganzen Programmes aber nicht im Label keccak.
Ich bin für jede Hilfe dankbar, aber ich weiß es ist schwer ohne
Sourcecode...wobei das kein Sinn macht diesen zu posten...bei so viel
Code...da blickt eh keiner durch. :D
foobar schrieb:> Anweisungen um die 768 Byte freien SRAM (vorgegeben) auf 0 setzen
Hast Du auch Anweisungen, um Dir den RAM erstmal zuweisen zu lassen?
Du kannst nicht einfach irgendwo im RAM rumpfuschen, daß nimmt Dir C
sehr übel.
Warum überhaupt Assembler, wenn drumrum schon alles in C ist?
Im Asssembler ist man nur in Ausnahmefällen schneller oder sparsamer und
das auch nur als sehr erfahrener Programmierer. Dafür braucht man um den
Faktor 10..100 länger zum Schreiben des Programms.
Hast Du mal in der Jave-Doku nachgesehen, was diese Fehlernummmer
bedeutet?
Vielleicht ein Timeout.
Vielleicht schlägt ja der Watchdog des AVR zu.
Ist der ATmega163 nicht schon über 10 Jahre obsolet?
Studienarbeiten mit Bauteilen aus dem Museum sollte ein guter Betreuer
nicht vergeben.
Zu meiner Zeit mußte man in der Einleitung den praktischen Nutzen
darlegen, d.h. eine zeitgemäße Lösung mit zeitgemäßen Bauteilen.
Der ATmega163 hat ja nur 1kB RAM, da wird die Luft nach Abzug der 768
Byte aber reichlich dünne.
Peter
Nunja der RAM wird ja in einer eigenen Funktion sha3_init auf 0 gesetzt
und diese Funktion macht auch keinerlei Probleme. auch im AVR Studio
Simulator klappt das alles wunderbar. Uns wurde gesagt, dass wir in der
init Funktion alle Bytes auf 0 setzen sollen und das 768 KB an RAM frei
verfügbar ist. Ich benötige von den 768 Byte 602 Byte (3x200 Byte Status
+ 2 "Magic Bytes")
Warum Assembler? Ganz einfach, weil das so vorgegeben ist. :) Und auch
der ATMega 163 ist nunmal vorgegeben...dagegen kann ich nichts machen.
Nach der Fehlermeldung hatte ich früher (Hatte den Fehler schonmal in
einer Hausaufgabe, diese Aufgabe ist sozusagen die Endaufgabe, um das
Projekt zu besehen) schon mal gegoogelt aber ncihts weiter gefunden.
Es wäre halt schade, wenn ich das Projekt nciht bestehe, da das Programm
an sich korrekt läuft...aber die Vorgabe ist eben, dass es auf der
Smartcard laufen soll.
Hat der ATMega 163 sowas wie einer Sicherheitsmaßnahme z.B. im Fall
einer Endlosschleife?Kann ja sein, dass die Berechnung zu lange dauert
bis ein Ergebenis zurückgeliefert wird und die Smartcard daher denkt,
dass eine Endlosschleife vorhanden ist. Ist das der Watchdog?
Bau doch einfach mal in ein funktionierendes Programm ein relativ langes
Delay ein. Wenn es dann zu Problemen kommt schlägt entweder der Watchdog
zu, oder die PC-Seite läuft in einen Timeout
Das Programm(In abgewandelter Form meine Schleife um den RAM auf 0 zu
setzen + Multiplikation 2-er Zahlen damit die Schleife länger braucht)
bringt den gleichen Fehler. Also scheint es am Watchdog oder einem
Timeout zu liegen. Dagegen kann ich ja höchstwahrscheinlich nichts
machen...so wie ich das seh.
Muss ich halt sehen wie ich das mit den Verantwortlichen abkläre.
danke für die kompetente Hilfe. :)
Watchdog ist im Datenblatt beschrieben und lässt sich per Software
entweder deaktivieren oder immer wieder füttern.
Du könntest dem Watchdog z.B. nach jeder Runde des
Verschlüsselungsalgorithmus bescheid sagen, dass du noch am Leben bist.
Hallo,
da sehr viele eine Lösung eingereicht haben, die nur teilweise läuft
haben wir 10 Tage verlängerung bekommen....ich bin also wahrscheinlich
nicht der einzige dem das so geht. Ich werde das mit dem Watchdog
ausprobieren und berichten ob es funktioniert hat.
> da ich wenig Wert auf Optimierung gelegt habe
Legt denn Dein Dozent Wert darauf? In einer praktischen Anwendung kommt
es häufig darauf an, eine Aufgabe schnell genug zu erledigen. Zum
Beispiel darf eine Interrupt Routine meist nicht länger dauern, als der
Zeitabstand zwischen zwei Interrupts.
Vielleicht hat der Dozent einen Watchdog eingebaut, um solch eine
Einschränkung vorzugeben, und nun sollst Du den Code soweit optimieren,
dass er mit der Zeitlichen Beschränkung zurecht kommt.
Hallo,
es wurde zwar gesagt, dass die effizienteste Lösung "ausgezeichnet"
wird, aber es wurden keine speziellen Vorgaben bzgl.
Ausführungsgeschwindigkeit oder Codegröße gemacht.
Ich habe nun versucht den WDT zu deaktivieren, laut:
http://www.avrbeginners.net/architecture/wdt/wdt.html
Habe jedoch statt out sts verwendet, da avr-gcc sonst meckert (number
must be positive and less than 64)
Allerdings hilft das auch nicht oder irgendwas am Code zum Ausschalten
des WDT ist falsch. Könnte in dem Fall jemand mal einen korrekten Code
posten?
Ich habe übrigens folgendes herausgefunden:
Wenn einmal der Fehler 0x45d in sha3_hash aufgetreten ist und das
Programm auf der Smartcard neu gestartet wird, dann wird sofort bei der
sha3_init Funktion der Fehler 0x45d ausgelöst. Erst wenn ich die
Smartcard vom Reader entferne und wieder anstecke, wird sha3_init ohne
Fehler ausgeführt und der Fehler tritt wieder nach einiger Rechenzeit in
sha3_hash auf. Vielleicht hilft das ja.
Den Watchdog kannst Du doch ganz einfach triggern, notfalls im
Timerinterrupt.
Vermutlich wird es aber ein Timeout der PC-Software sein, den man
hochsetzen muß.