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?
Nur so aus Interesse, du studierst nicht rein zufällig an der RUB?
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
Hallo, ja ich studiere ITS an der RUB.
1 | ldi r25,0 //setze X auf speicheradresse 0x60 |
2 | ldi r24,96 |
3 | mov xh,r25 |
4 | mov xl,r24 |
5 | |
6 | ldi r23,212 |
7 | ldi r22,0 |
8 | |
9 | ldi r19,2 |
10 | ldi r18,0 |
11 | ldi r17,4 |
12 | ldi r16,0 |
13 | |
14 | delete: |
15 | st x+,r17 |
16 | |
17 | mul r17,r19 |
18 | mov r4,r0 |
19 | mov r5,r1 |
20 | |
21 | mul r16,r18 |
22 | mov r2,r0 |
23 | mov r3,r1 |
24 | |
25 | mul r17,r18 |
26 | add r3,r0 |
27 | adc r4,r1 |
28 | adc r5,r20 |
29 | |
30 | mul r16,r19 |
31 | add r3,r0 |
32 | adc r4,r1 |
33 | adc r5,r20 |
34 | |
35 | subi r22,1 |
36 | sbci r23,0 |
37 | brne go_delete |
38 | jmp nothing |
39 | |
40 | go_delete: |
41 | jmp delete |
42 | |
43 | nothing: |
44 | nop |
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. :)
Hier nochmal das abgeänderte Programm, da ich ja beim 1. Speicher beschreiben will, der gar nicht existiert:
1 | ldi r23,212 |
2 | ldi r22,0 |
3 | |
4 | mul: |
5 | |
6 | ldi r19,2 |
7 | ldi r18,0 |
8 | ldi r17,4 |
9 | ldi r16,0 |
10 | |
11 | mul r17,r19 |
12 | mov r4,r0 |
13 | mov r5,r1 |
14 | |
15 | mul r16,r18 |
16 | mov r2,r0 |
17 | mov r3,r1 |
18 | |
19 | mul r17,r18 |
20 | add r3,r0 |
21 | adc r4,r1 |
22 | adc r5,r20 |
23 | |
24 | mul r16,r19 |
25 | add r3,r0 |
26 | adc r4,r1 |
27 | adc r5,r20 |
28 | |
29 | subi r22,1 |
30 | sbci r23,0 |
31 | brne go_mul |
32 | jmp nothing |
33 | |
34 | go_mul: |
35 | jmp mul |
36 | |
37 | nothing: |
38 | nop |
Ergebnis ist jedoch das gleiche.
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.
foobar schrieb: > Die c Funktionen zum umgehen mit den ... Du folgst bei Aufrufen auch brav der C-ABI des verwendeten Compilers?
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ß.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.