tmp equ 0x11 dcf equ 0x12 ; 84bit DCF input 0000 0ff6 xorlw 0xf6 ; Platzhalter für Goto/Call 0001 0c40 movlw 0x40 ; outer loop ? 0002 0030 movwf 0x10 0003 0c04 movlw 0x04 ; 4 rounds, 0004 0031 movwf tmp loop: 0005 0403 clrc 0006 0612 btfsc dcf,0 ; carry=bit0 , DCF[0:9] wird rotiert ! 0007 0503 setc 0008 033b rrf dcf+9,f 0009 033a rrf dcf+8,f 000a 0339 rrf dcf+7,f 000b 0338 rrf dcf+6,f 000c 0337 rrf dcf+5,f 000d 0336 rrf dcf+4,f 000e 0335 rrf dcf+3,f 000f 0334 rrf dcf+2,f 0010 0333 rrf dcf+1,f 0011 0332 rrf dcf,f 0012 021b movfw dcf+9 0013 0e19 andlw 0x19 0014 003c movwf dcf+10 ; dcf[10]=dcf[9] & 0x19 0015 0218 movfw dcf+6 0016 0e06 andlw 0x06 0017 01bc xorwf dcf+10,f; dcf[10]^=dcf[6]&6 0018 0217 movfw dcf+5 0019 0ed4 andlw 0xd4 001a 01bc xorwf dcf+10,f; dcf[10]^=dcf[5]&0xd4 001b 0214 movfw dcf+2 001c 0e08 andlw 0x08 001d 01bc xorwf dcf+10,f; dcf[10]^=dcf[2]&8 001e 0213 movfw dcf+1 001f 0e3c andlw 0x3c 0020 01bc xorwf dcf+10,f; dcf[10]^=dcf[1]&0x3c 0021 021c movfw dcf+10 0022 033c rrf dcf+10,f 0023 033c rrf dcf+10,f 0024 033c rrf dcf+10,f 0025 033c rrf dcf+10,f 0026 01bc xorwf dcf+10,f; dcf[10]^=(*(uint16_t*)(&dcf[9])>>4)&0x1f)|((dcf[10]<<5)&0xe0) 0027 021c movfw dcf+10 ; das lässt sich nicht so leicht in C umwandeln, da src von carry verschwunden. 0028 033c rrf dcf+10,f 0029 033c rrf dcf+10,f 002a 01bc xorwf dcf+10,f; rotiert dcf[10] um 2 bits nach rechts, mit Daten vor Xor in Carry und Xort es mit sich selbst 002b 021c movfw dcf+10 002c 033c rrf dcf+10,f 002d 019c xorwf dcf+10,w; dasselbe mit nur 1 bit rotierung 002e 0e01 andlw 0x01; das ist interessant, Ergebnis des ganzen, 002f 01b2 xorwf dcf,f ; und verwende es. 0030 02f1 decfsz tmp,f 0031 0a05 goto loop 0032 04a4 bcf 0x04,5; bank0, ich vermute es wird hier in bank1 gearbeitet, netter Nebeneffekt: ; bei Start, also in Bank0 wird automatisch der Bereich gelöscht. Vermute stark, daß das gewollt ist, und die richtigen Daten auf ; bank1 reingeschoben werden. Bei Einschalten würde sich dann in Bank0 automatisch eine reproduzierbarer Zufallswert sein, mit dem ; die Daten dann noch zusätzlich ge'xort werden, ohne diesen Wert expliziet laden zu müssen. Dies lässt die Vermutung stark aufkommen, ; daß das ein 508 mit nur 512 words Code ist, kann aber nicht sein, also wieso diese Acrobazie?. ; Angenommen ca 600 lookup-Werte, dann könnte ich mir sowas vorstellen, da dann nur mehr wenig Code zur Verfügung steht. ; Andererseits Port handling: 70 words, crypto 200 words, parity-correction, 60 words, keytable 256 words, main 30 words, delay 10 words, : da bleibt noch massenhaft übrig, wenn mit solchen Klimmzügen wie indirekte Initialisierung gearbeitet wird, um Platz zu sparen. ; wäre natürlich möglich, daß noch andere Interfaces sowei Alarmauswertung usw mit drin sind, welche mittels auswechseln des Xors auf pos 0 ; freigeschaltet wird. 0033 0212 movfw dcf 0034 05a4 bsf 0x04,5 0035 01b2 xorwf dcf,f 0036 04a4 bcf 0x04,5 0037 0213 movfw dcf+1 0038 05a4 bsf 0x04,5 0039 01b3 xorwf dcf+1,f 003a 04a4 bcf 0x04,5 003b 0214 movfw dcf+2 003c 05a4 bsf 0x04,5 003d 01b4 xorwf dcf+2,f 003e 04a4 bcf 0x04,5 003f 0215 movfw dcf+3 0040 0000 nop ; anscheinend wird hier der 4 byte code, standard Blockgröße, konnte doch ein Standard-Crypto sein, anstatt der lookup-Geschichte, ; mit einem LSR ge-xor´t von dem wir jetzt den Init-Wert haben, sowie den Alg, und wie er appliziert wird. ; Wenn die Fit in Crypto sind, dann wird das 64x durchlaufen, sowie dann eine Addition appliziert, oder auch in jedem Durchlauf. ; ansonsten ist der Crypto rechnerisch angreifbar und unsicher. ; Sollte ein standard Crypto verwendet worden sein, Xtea, tea, ... . kann der Code größer sein, und durch diesen LSR zusätzlich eine constante ; hidding. Es wäre wichtig auszutesten, sei es in Strohmaufnahme, ev geplanter WDT-Timeout, sowie auch mit Test von sequenziellen input ; diese in zufälliger Weise dem Chip wiederzugeben, so ca 20 Stück, ob das gleich funktioniert wie die sequenzielle Wiedergabe. --- 03fe 0000 nop OSCAL = 4 03ff 0c04 movlw 0x04 ID 0F0F0F0F 0400 000f __idlocs0 0x0f 0401 000f __idlocs1 0x0f 0402 000f __idlocs2 0x0f 0403 000f __idlocs3 0x0f FUSE 0fff 0ff6 __fuses 0x0ff6 (MCLR on, /CP on, WDT on, INTRC) HEX: :020000040000FA :10000000F60F400C3000040C310003041206030507 :100010003B033A033903380337033603350334030C :10002000330332031B02190E3C001802060EBC01FA :100030001702D40EBC011402080EBC0113023C0EC0 :10004000BC011C023C033C033C033C03BC011C02FE :100050003C033C03BC011C023C039C01010EB201A9 :10006000F102050AA4041202A405B201A4041302B9 :10007000A405B301A4041402A405B401A404150248 :100080000000000000000000000000000000000070 --- :1007F0000000000000000000000000000000040CE9 :080800000F000F000F000F00B4 :021FFE00F60FDC :00000001FF