AES Reverseengineering

Begonnen von jab, 12 Februar 2014, 13:51:29

Vorheriges Thema - Nächstes Thema

jab

Hi zusammen,

um das Thema getrennt vom OTA Firmwareupdate zu behandeln hier ein neuer Thread. Es gibt zwei Ziele:
- Den genauen Algorithmus finden
- Den default AES Key finden
Aktuell wissen wir, dass der Key gehashed (md5) von der Windowssoftware übertragen wird. Die Länge ist somit 32 Byte in Hex = 128Bit.

Folgende Angriffsvektoren haben wir:
- rfd aus der CCU2. Das ist ein C++ Binary mit Debugsymbols das sich gut debuggen lässt. Man kann das generelle Vorgehen gut verstehen. Außerdem spricht es den internen Funkchip der CCU2 an. Ggf ist AES hier anders implementiert als beim USB Stick und HMLAN
- Firmware Update des HM-USB-CFG2. Möglicherweise ist der Key enthalten. Vielleicht liegt er auch im EEPROM. Ggf kann man das EEPROM mit einem selbstgeschrieben Update extrahieren
- Update des HM-CC-TC-DN. Firmware liegt unverschlüsselt vor. Leider ist es ein STM8 Controller und dafür gibt es keinen ordentlichen Debugger. Man sollte die AES Implementierung finden. Der Key kann auch im EEPROM sein
- Update des Regensensors. Möglicherweise ein AVR Controller. Man sollte die AES Implementierung finden. Der Key kann auch im EEPROM sein.
- Ausprobieren. Ggf ist es der md5("") also d41d8cd98f00b204e9800998ecf8427e. Oder md5("eq3") / md5("homematic")

Weitere Ideen?


Gruß,
Jan


mgernoth

Hi,

so dann versuche ich mal Zusammenzufassen, was ich vor einiger Zeit herausgefunden habe:

Zitat von: jab am 12 Februar 2014, 13:51:29
- Den genauen Algorithmus finden

Der Signatur-Algorithmus ist mir immernoch schleierhaft, der Key-Exchange-Algorithmus ist aber ganz normales AES. Wenn man den alten Key kennt und die Funkkommunikation mitschneidet, kann man den KEX entschlüsseln.

Mitgesniffed hatte ich damals den Funkverkehr eines hmcfgusb bei den folgenden Kommandos, wobei sowohl der alte wie auch der neue Key "00000000000000000000000000000000" waren:


SCAB06FA0,00,00000000,01,017F0709,04A00468EA141ED0170102
SCAB06FA0,00,00000000,01,017F0709,04A00468EA141ED0170103


Natürlich habe ich mir nicht den ganzen Funkverkehr aufgehoben, sondern nur die AES-Teile der beiden Messages :-(


"2F029A0991B5C5C77FFD6824D7906AB2", #kex 0000 with 0000 0102 SCAB06FA0,00,00000000,01,017F0709,04A00468EA141ED0170102
"16A3345D535B6285DAA3639836C716D0", #kex 0000 with 0000 0103 SCAB06FA0,00,00000000,01,017F0709,04A00468EA141ED0170103


Das ganze jetzt in Perl entschlüsselt:


#!/usr/bin/perl -w

use Digest::MD5 qw(md5);

my @keys = (
        #unpack('H*', md5('')),
        "00000000000000000000000000000000",
        #...
        );

my @msgs = (
        "2F029A0991B5C5C77FFD6824D7906AB2", #kex 0000 with 0000 0102 SCAB06FA0,00,00000000,01,017F0709,04A00468EA141ED0170102
        "16A3345D535B6285DAA3639836C716D0", #kex 0000 with 0000 0103 SCAB06FA0,00,00000000,01,017F0709,04A00468EA141ED0170103
        );

use Crypt::Rijndael;
use Data::Hexdumper;

foreach $key (@keys) {
        print "Key: ${key}\n";
        my $cipher=Crypt::Rijndael->new(pack("H*", $key), Crypt::Rijndael::MODE_ECB());

        foreach my $msg (@msgs) {
                my $d = $cipher->decrypt(pack("H*", $msg));
                my $e = $cipher->encrypt(pack("H*", $msg));

                print "d: ".hexdump($d);
        }
}


Führt zu folgendem Ergebnis:


Key: 00000000000000000000000000000000
d:   0x0000 : 01 04 00 00 00 00 00 00 00 00 E8 7E 7E 29 6F A5 : ...........~~)o.
d:   0x0000 : 01 05 00 00 00 00 00 00 00 00 9B FA 7E 29 6F A5 : ............~)o.


Hier sieht man die Übertragung des neuen Keys in den zwei Nachrichten (1. Hälfte und 2. Hälfte des Keys)

Zitat
- rfd aus der CCU2. Das ist ein C++ Binary mit Debugsymbols das sich gut debuggen lässt. Man kann das generelle Vorgehen gut verstehen. Außerdem spricht es den internen Funkchip der CCU2 an. Ggf ist AES hier anders implementiert als beim USB Stick und HMLAN

Das AES steckt bei der CCU2 IIRC im Atmel, der da noch auf dem Mainboard ist. Diesen kann man nicht auslesen, das hatte ich probiert.

Zitat
- Firmware Update des HM-USB-CFG2. Möglicherweise ist der Key enthalten. Vielleicht liegt er auch im EEPROM. Ggf kann man das EEPROM mit einem selbstgeschrieben Update extrahieren

Die extrahierte Firmwaredatei ist kein gültiger ARM-Code, egal wie ich objdump versuche zu überzeugen sie zu lesen. Das Firmwareformat ist das gleiche wie beim HM-CC-RT-DN (Also HEX-Blöcke mit Längenangaben davor).

Zitat
- Update des HM-CC-TC-DN. Firmware liegt unverschlüsselt vor. Leider ist es ein STM8 Controller und dafür gibt es keinen ordentlichen Debugger. Man sollte die AES Implementierung finden. Der Key kann auch im EEPROM sein

Ich würde mich sehr freuen, wenn das Ding wirklich unverschlüsselt ist.

Zitat
- Ausprobieren. Ggf ist es der md5("") also d41d8cd98f00b204e9800998ecf8427e. Oder md5("eq3") / md5("homematic")

Die meisten offensichtlichen (also auch die drei) hatte ich damals ausprobiert, indem ich versucht habe die KEX vom Default-Key auf "00000000000000000000000000000000" zu entschlüsseln. Hat alles nicht geklappt. Der d41d... wäre ja auch zu einfach, der wird vom rfd ja beim starten gesetzt.

Gruß
  Michael

jab

Moin Michael,

[quote author=mgernoth link=topic=20121.msg136802#msg136802 date=1392213030]
Das AES steckt bei der CCU2 IIRC im Atmel, der da noch auf dem Mainboard ist. Diesen kann man nicht auslesen, das hatte ich probiert.

Schade. Müssen wir im Notfall wohl mal jemanden mit FIB besuchen und die Fuses kippen. Das ist allerdings eine längere Aktion.

Zitat von: mgernoth am 12 Februar 2014, 14:50:30
Die extrahierte Firmwaredatei ist kein gültiger ARM-Code, egal wie ich objdump versuche zu überzeugen sie zu lesen. Das Firmwareformat ist das gleiche wie beim HM-CC-RT-DN (Also HEX-Blöcke mit Längenangaben davor).

Ich würde mich sehr freuen, wenn das Ding wirklich unverschlüsselt ist.
Der Debugger findet Funktionen und Functioncalls. Ich habe mal spaßeshalber bei jedem Block ein Byte am Ende weggeschnitten und dann findet der Debugger gar nichts mehr. Von daher sieht mir das sehr intakt aus.

Zitat von: mgernoth am 12 Februar 2014, 14:50:30
Die meisten offensichtlichen (also auch die drei) hatte ich damals ausprobiert, indem ich versucht habe die KEX vom Default-Key auf "00000000000000000000000000000000" zu entschlüsseln. Hat alles nicht geklappt. Der d41d... wäre ja auch zu einfach, der wird vom rfd ja beim starten gesetzt.
d41d8cd98f00b204e9800998ecf8427e wird vom RFD gesetzt? Dann haben wir doch den default Key oder nicht?

Ich gucke mir später mal HM-CFG-USB2 an.


Gruß,
Jan

mgernoth

Hi,

Zitat von: jab am 12 Februar 2014, 15:04:41
Der Debugger findet Funktionen und Functioncalls. Ich habe mal spaßeshalber bei jedem Block ein Byte am Ende weggeschnitten und dann findet der Debugger gar nichts mehr. Von daher sieht mir das sehr intakt aus.

Welchen Debugger für STM8 benutzt Du?

Zitat
d41d8cd98f00b204e9800998ecf8427e wird vom RFD gesetzt?

Ja, wenn man einen hmland an eine ccu2 koppelt kann man im Debug folgendes bewundern:


LAN > Y03,00,D41D8CD98F00B204E9800998ECF8427E


Zitat
Dann haben wir doch den default Key oder nicht?

Dann hätte ich damit den KEX von Default auf was anderes entschlüsseln können müssen, das ging aber leider nicht.

Zitat
Ich gucke mir später mal HM-CFG-USB2 an.

Hoffentlich hast Du mehr Glück.

Gruß
  Michael

betateilchen

Zitat von: jab am 12 Februar 2014, 13:51:29- Update des HM-CC-TC-DN. Firmware liegt unverschlüsselt vor.

Um keine Verwirrung zu stiften: Du meinst sicher den HM-CC-RT-DN ;)

Hat sich eigentlich mal jemand Gedanken darüber gemacht, ob es einen Zusammenhang zwischen HM-Id, Seriennummer und dem Default-AES-Key geben könnte?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

mgernoth

Zitat von: jab am 12 Februar 2014, 15:04:41
Schade. Müssen wir im Notfall wohl mal jemanden mit FIB besuchen und die Fuses kippen. Das ist allerdings eine längere Aktion.

Mir ist gerade wieder eingefallen, dass das Firmware-Update für den Atmel im Filesystem der CCU2 liegt...


[/mnt/firmware]# ls -l
...
-rwxr-xr-x  1 root root  57880 Feb  4 10:09 coprocessor_update.eq3
...


Evtl. ist das ja einfach Plain :-)

Gruß
  Michael

betateilchen

#6
Zitat von: jab am 12 Februar 2014, 13:51:29- Update des Regensensors. Möglicherweise ein AVR Controller.

Nein, ein STM8L151C8U6


-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Samsi

Man könnte theoretisch 2 eeprom Inhalte von den Unterputz-Funkschaltern vergleichen, indem man bei beiden sign aktiviert, zwei unterschiedliche Schlüssel anlernt, alle sonstigen register gleich setzt und dann eine custom firmware installiert  die das eeprom ausliest und seriell ausgibt, wie  jab schon vorgeschlagen hat. Danach kann man dann zwar nur noch die FW von jab installieren, aber da existiert wenigstens schon etwas das annähernd fertig ist.

Noch besser wären 3 Aktoren , 2 mit gleichem bekannten AES key und einer mit dem default AES key. Weil ja auch bei gleichem AES key unterschiedet sich ja der EEPROM inhalt wegen der unterschiedlichen Seriennnumer und HMID, so kann man das etwas eingrenzen was die Seriennummer ist.

Sobald die Firmware perfekt ist, will ich ohnehin noch drei weitere dieser Aktoren neu flashen.

Grüße
FHEM 5.5 / BBB Debian Wheezy

Homematic CFG-LAN

HM-Sec-MDIR / HM-Sec-SD / HM-Sec-WDS / HM-LC-Sw2-FM / HM-Sec-SC / HM-LC-Sw1PBU-FM / HM-SCI-3-FM / HM-Sec-Key / HM-RC-Key3-B / HM-LC-Dim1TPBU-FM /  HM-CC-RT-DN / HM-PBI-4-FM / HM-RC-Key4-2 / HM-ES-PMSw1-Pl / HM-LC-Sw4-WM

jab

#8
Moin,



@Michael:
ja habe ich mir gerade auch angesehen. Das liegt da. Ich bin mir aktuell nicht mehr so 100% sicher ob das plain ist oder nicht. Die Entropie ist wirklich fast maximal bei dem Ding (siehe Bild). Allerdings ist die bei der Asksin Firmware auch nicht viel drunter (schon etwas aber da sind auch noch Strings für Serialausgabe drin). Der Debugger mag die Firmware auch.

@Samsi: Das funktioniert nur wenn die EESave Fuse gesetzt ist. Ansonsten ist das interne EEPROM beim programmieren weg. Allerdings gibt es auf manchen Geräten ein externes. Da kommt man sicher dran. Das nutzen wir aktuell in der Customfirmware auch nicht. Ich sollte das auf meinen Geräten auslesen können.

Ich habe mir gerade mal rfd angesehen. AES wird im CFB Mode verwendet (http://de.wikipedia.org/wiki/Cipher_Feedback_Mode). Die Methode um den Key zu generieren ist gigantisch. Viel memcpy und ganz am Anfang spielt er definitiv mit der Serial Number.

Ansonsten kann RFChannel im rfd auch AES sprechen. Und die Funktionen sind einfach:

.text:0002B654 ; AES_encrypt_block(unsigned char *, unsigned char *)
.text:0002B654                 EXPORT _Z17AES_encrypt_blockPhS_
.text:0002B654 _Z17AES_encrypt_blockPhS_               ; CODE XREF: RFChannel::performCBCAuthentification(BidcosFrame &)+280p
.text:0002B654                                         ; RFChannel::performCBCAuthentification(BidcosFrame &)+724p
.text:0002B654
.text:0002B654 var_40          = -0x40
.text:0002B654 var_3C          = -0x3C
.text:0002B654 var_38          = -0x38
.text:0002B654 var_34          = -0x34
.text:0002B654 var_30          = -0x30
.text:0002B654 var_2C          = -0x2C
.text:0002B654
.text:0002B654                 STMFD   SP!, {R4-R11,LR}
.text:0002B658                 LDRB    R3, [R0,#9]
.text:0002B65C                 LDRB    R5, [R0,#0xA]
.text:0002B660                 SUB     SP, SP, #0x1C
.text:0002B664                 LDR     R4, =_ZL10CurrentKey ; CurrentKey
.text:0002B668                 LDRB    LR, [R0,#4]
.text:0002B66C                 STR     R3, [SP,#0x40+var_40]
.text:0002B670                 STR     R5, [SP,#0x40+var_3C]
.text:0002B674                 LDRB    R3, [R0,#0xB]
.text:0002B678                 LDRB    R5, [R0,#0xC]
.text:0002B67C                 LDRB    R12, [R0,#5]
.text:0002B680                 LDRB    R2, [R0,#6]
.text:0002B684                 LDRB    R10, [R0]
.text:0002B688                 LDRB    R8, [R0,#1]
.text:0002B68C                 LDRB    R7, [R0,#2]
.text:0002B690                 LDRB    R6, [R0,#3]
.text:0002B694                 LDRB    R9, [R0,#7]
.text:0002B698                 LDRB    R11, [R0,#8]
.text:0002B69C                 STRB    LR, [R4,#(_ZL5State+1 - 0x9DA98)]
.text:0002B6A0                 STR     R3, [SP,#0x40+var_38]
.text:0002B6A4                 LDR     LR, [SP,#0x40+var_40]
.text:0002B6A8                 LDRB    R3, [R0,#0xD]
.text:0002B6AC                 STR     R5, [SP,#0x40+var_34]
.text:0002B6B0                 LDRB    R5, [R0,#0xE]
.text:0002B6B4                 STRB    R12, [R4,#(_ZL5State+5 - 0x9DA98)]
.text:0002B6B8                 STRB    R2, [R4,#(_ZL5State+9 - 0x9DA98)]
.text:0002B6BC                 STRB    R10, [R4,#(_ZL5State - 0x9DA98)] ; State
.text:0002B6C0                 STRB    R8, [R4,#(_ZL5State+4 - 0x9DA98)]
.text:0002B6C4                 STRB    R7, [R4,#(_ZL5State+8 - 0x9DA98)]
.text:0002B6C8                 STRB    R6, [R4,#(_ZL5State+0xC - 0x9DA98)]
.text:0002B6CC                 STRB    R9, [R4,#(_ZL5State+0xD - 0x9DA98)]
.text:0002B6D0                 STRB    R11, [R4,#(_ZL5State+2 - 0x9DA98)]
.text:0002B6D4                 STR     R3, [SP,#0x40+var_30]
.text:0002B6D8                 STR     R5, [SP,#0x40+var_2C]
.text:0002B6DC                 LDRB    R3, [R0,#0xF]
.text:0002B6E0                 STRB    LR, [R4,#(_ZL5State+6 - 0x9DA98)]
.text:0002B6E4                 LDR     R10, [SP,#0x40+var_3C]
.text:0002B6E8                 LDR     R9, [SP,#0x40+var_38]
.text:0002B6EC                 LDR     R8, [SP,#0x40+var_34]
.text:0002B6F0                 LDR     R7, [SP,#0x40+var_30]
.text:0002B6F4                 LDR     R6, [SP,#0x40+var_2C]
.text:0002B6F8                 STRB    R3, [R4,#(_ZL5State+0xF - 0x9DA98)]
.text:0002B6FC                 MOV     R0, #0
.text:0002B700                 STRB    R10, [R4,#(_ZL5State+0xA - 0x9DA98)]
.text:0002B704                 STRB    R9, [R4,#(_ZL5State+0xE - 0x9DA98)]
.text:0002B708                 STRB    R8, [R4,#(_ZL5State+3 - 0x9DA98)]
.text:0002B70C                 STRB    R7, [R4,#(_ZL5State+7 - 0x9DA98)]
.text:0002B710                 STRB    R6, [R4,#(_ZL5State+0xB - 0x9DA98)]
.text:0002B714                 MOV     R5, R1
.text:0002B718                 BL      _ZL8LoadKeysh   ; LoadKeys(uchar)
.text:0002B71C                 BL      _ZL11AddRoundKeyv ; AddRoundKey(void)
.text:0002B720                 BL      _Z8SubBytesv    ; SubBytes(void)
.text:0002B724                 BL      _Z9ShiftRowsv   ; ShiftRows(void)
.text:0002B728                 BL      _Z10MixColumnsv ; MixColumns(void)
.text:0002B72C                 MOV     R0, #1
.text:0002B730                 BL      _ZL8LoadKeysh   ; LoadKeys(uchar)
.text:0002B734                 BL      _ZL11AddRoundKeyv ; AddRoundKey(void)
.text:0002B738                 BL      _Z8SubBytesv    ; SubBytes(void)
.text:0002B73C                 BL      _Z9ShiftRowsv   ; ShiftRows(void)
.text:0002B740                 BL      _Z10MixColumnsv ; MixColumns(void)
.text:0002B744                 MOV     R0, #2
.text:0002B748                 BL      _ZL8LoadKeysh   ; LoadKeys(uchar)
.text:0002B74C                 BL      _ZL11AddRoundKeyv ; AddRoundKey(void)
.text:0002B750                 BL      _Z8SubBytesv    ; SubBytes(void)
.text:0002B754                 BL      _Z9ShiftRowsv   ; ShiftRows(void)
.text:0002B758                 BL      _Z10MixColumnsv ; MixColumns(void)
.text:0002B75C                 MOV     R0, #3
.text:0002B760                 BL      _ZL8LoadKeysh   ; LoadKeys(uchar)
.text:0002B764                 BL      _ZL11AddRoundKeyv ; AddRoundKey(void)
.text:0002B768                 BL      _Z8SubBytesv    ; SubBytes(void)
.text:0002B76C                 BL      _Z9ShiftRowsv   ; ShiftRows(void)
.text:0002B770                 BL      _Z10MixColumnsv ; MixColumns(void)
.text:0002B774                 MOV     R0, #4
.text:0002B778                 BL      _ZL8LoadKeysh   ; LoadKeys(uchar)
.text:0002B77C                 BL      _ZL11AddRoundKeyv ; AddRoundKey(void)
.text:0002B780                 BL      _Z8SubBytesv    ; SubBytes(void)
.text:0002B784                 BL      _Z9ShiftRowsv   ; ShiftRows(void)
.text:0002B788                 BL      _Z10MixColumnsv ; MixColumns(void)
.text:0002B78C                 MOV     R0, #5
.text:0002B790                 BL      _ZL8LoadKeysh   ; LoadKeys(uchar)
.text:0002B794                 BL      _ZL11AddRoundKeyv ; AddRoundKey(void)
.text:0002B798                 BL      _Z8SubBytesv    ; SubBytes(void)
.text:0002B79C                 BL      _Z9ShiftRowsv   ; ShiftRows(void)
.text:0002B7A0                 BL      _Z10MixColumnsv ; MixColumns(void)
.text:0002B7A4                 MOV     R0, #6
.text:0002B7A8                 BL      _ZL8LoadKeysh   ; LoadKeys(uchar)
.text:0002B7AC                 BL      _ZL11AddRoundKeyv ; AddRoundKey(void)
.text:0002B7B0                 BL      _Z8SubBytesv    ; SubBytes(void)
.text:0002B7B4                 BL      _Z9ShiftRowsv   ; ShiftRows(void)
.text:0002B7B8                 BL      _Z10MixColumnsv ; MixColumns(void)
.text:0002B7BC                 MOV     R0, #7
.text:0002B7C0                 BL      _ZL8LoadKeysh   ; LoadKeys(uchar)
.text:0002B7C4                 BL      _ZL11AddRoundKeyv ; AddRoundKey(void)
.text:0002B7C8                 BL      _Z8SubBytesv    ; SubBytes(void)
.text:0002B7CC                 BL      _Z9ShiftRowsv   ; ShiftRows(void)
.text:0002B7D0                 BL      _Z10MixColumnsv ; MixColumns(void)
.text:0002B7D4                 MOV     R0, #8
.text:0002B7D8                 BL      _ZL8LoadKeysh   ; LoadKeys(uchar)
.text:0002B7DC                 BL      _ZL11AddRoundKeyv ; AddRoundKey(void)
.text:0002B7E0                 BL      _Z8SubBytesv    ; SubBytes(void)
.text:0002B7E4                 BL      _Z9ShiftRowsv   ; ShiftRows(void)
.text:0002B7E8                 BL      _Z10MixColumnsv ; MixColumns(void)
.text:0002B7EC                 MOV     R0, #9
.text:0002B7F0                 BL      _ZL8LoadKeysh   ; LoadKeys(uchar)
.text:0002B7F4                 BL      _ZL11AddRoundKeyv ; AddRoundKey(void)
.text:0002B7F8                 BL      _Z8SubBytesv    ; SubBytes(void)
.text:0002B7FC                 BL      _Z9ShiftRowsv   ; ShiftRows(void)
.text:0002B800                 MOV     R0, #0xA
.text:0002B804                 BL      _ZL8LoadKeysh   ; LoadKeys(uchar)
.text:0002B808                 BL      _ZL11AddRoundKeyv ; AddRoundKey(void)
.text:0002B80C                 LDRB    R3, [R4,#(_ZL5State+0xE - 0x9DA98)]
.text:0002B810                 LDRB    R11, [R4,#(_ZL5State+6 - 0x9DA98)]
.text:0002B814                 STR     R3, [SP,#0x40+var_40]
.text:0002B818                 LDRB    R3, [R4,#(_ZL5State+3 - 0x9DA98)]
.text:0002B81C                 LDRB    R12, [R4,#(_ZL5State+5 - 0x9DA98)]
.text:0002B820                 LDRB    R1, [R4,#(_ZL5State+0xD - 0x9DA98)]
.text:0002B824                 STR     R3, [SP,#0x40+var_3C]
.text:0002B828                 LDRB    R3, [R4,#(_ZL5State+7 - 0x9DA98)]
.text:0002B82C                 STR     R11, [SP,#0x40+var_30]
.text:0002B830                 LDRB    R0, [R4,#(_ZL5State+9 - 0x9DA98)]
.text:0002B834                 LDRB    R2, [R4,#(_ZL5State+2 - 0x9DA98)]
.text:0002B838                 LDRB    R9, [R4,#(_ZL5State - 0x9DA98)] ; State
.text:0002B83C                 LDRB    R10, [R4,#(_ZL5State+4 - 0x9DA98)]
.text:0002B840                 LDRB    R8, [R4,#(_ZL5State+8 - 0x9DA98)]
.text:0002B844                 LDRB    R7, [R4,#(_ZL5State+0xC - 0x9DA98)]
.text:0002B848                 LDRB    R6, [R4,#(_ZL5State+1 - 0x9DA98)]
.text:0002B84C                 LDRB    R11, [R4,#(_ZL5State+0xA - 0x9DA98)]
.text:0002B850                 STR     R3, [SP,#0x40+var_38]
.text:0002B854                 STRB    R12, [R5,#5]
.text:0002B858                 LDRB    R3, [R4,#(_ZL5State+0xB - 0x9DA98)]
.text:0002B85C                 STRB    R1, [R5,#7]
.text:0002B860                 LDR     R12, [SP,#0x40+var_30]
.text:0002B864                 LDR     R1, [SP,#0x40+var_40]
.text:0002B868                 STR     R3, [SP,#0x40+var_34]
.text:0002B86C                 LDRB    R4, [R4,#(_ZL5State+0xF - 0x9DA98)]
.text:0002B870                 STRB    R0, [R5,#6]
.text:0002B874                 STRB    R2, [R5,#8]
.text:0002B878                 STRB    R9, [R5]
.text:0002B87C                 STRB    R10, [R5,#1]
.text:0002B880                 STRB    R8, [R5,#2]
.text:0002B884                 STRB    R7, [R5,#3]
.text:0002B888                 STRB    R6, [R5,#4]
.text:0002B88C                 STRB    R12, [R5,#9]
.text:0002B890                 STRB    R11, [R5,#0xA]
.text:0002B894                 STRB    R1, [R5,#0xB]
.text:0002B898                 LDR     R0, [SP,#0x40+var_3C]
.text:0002B89C                 LDR     R3, [SP,#0x40+var_38]
.text:0002B8A0                 LDR     R2, [SP,#0x40+var_34]
.text:0002B8A4                 STRB    R0, [R5,#0xC]
.text:0002B8A8                 STRB    R3, [R5,#0xD]
.text:0002B8AC                 STRB    R2, [R5,#0xE]
.text:0002B8B0                 STRB    R4, [R5,#0xF]
.text:0002B8B4                 ADD     SP, SP, #0x1C
.text:0002B8B8                 LDMFD   SP!, {R4-R11,PC}
.text:0002B8B8 ; End of function AES_encrypt_block(uchar *,uchar *)



.text:0002C878 ; AES_decrypt_block(unsigned char *, unsigned char *)
.text:0002C878                 EXPORT _Z17AES_decrypt_blockPhS_
.text:0002C878 _Z17AES_decrypt_blockPhS_
.text:0002C878
.text:0002C878 var_40          = -0x40
.text:0002C878 var_3C          = -0x3C
.text:0002C878 var_38          = -0x38
.text:0002C878 var_34          = -0x34
.text:0002C878 var_30          = -0x30
.text:0002C878 var_2C          = -0x2C
.text:0002C878
.text:0002C878                 STMFD   SP!, {R4-R11,LR}
.text:0002C87C                 LDRB    R3, [R0,#9]
.text:0002C880                 LDRB    R5, [R0,#0xA]
.text:0002C884                 SUB     SP, SP, #0x1C
.text:0002C888                 LDR     R4, =_ZL10CurrentKey ; CurrentKey
.text:0002C88C                 LDRB    LR, [R0,#4]
.text:0002C890                 STR     R3, [SP,#0x40+var_40]
.text:0002C894                 STR     R5, [SP,#0x40+var_3C]
.text:0002C898                 LDRB    R3, [R0,#0xB]
.text:0002C89C                 LDRB    R5, [R0,#0xC]
.text:0002C8A0                 LDRB    R12, [R0,#5]
.text:0002C8A4                 LDRB    R2, [R0,#6]
.text:0002C8A8                 LDRB    R10, [R0]
.text:0002C8AC                 LDRB    R8, [R0,#1]
.text:0002C8B0                 LDRB    R7, [R0,#2]
.text:0002C8B4                 LDRB    R6, [R0,#3]
.text:0002C8B8                 LDRB    R9, [R0,#7]
.text:0002C8BC                 LDRB    R11, [R0,#8]
.text:0002C8C0                 STRB    LR, [R4,#(_ZL5State+1 - 0x9DA98)]
.text:0002C8C4                 STR     R3, [SP,#0x40+var_38]
.text:0002C8C8                 LDR     LR, [SP,#0x40+var_40]
.text:0002C8CC                 LDRB    R3, [R0,#0xD]
.text:0002C8D0                 STR     R5, [SP,#0x40+var_34]
.text:0002C8D4                 LDRB    R5, [R0,#0xE]
.text:0002C8D8                 STRB    R12, [R4,#(_ZL5State+5 - 0x9DA98)]
.text:0002C8DC                 STRB    R2, [R4,#(_ZL5State+9 - 0x9DA98)]
.text:0002C8E0                 STRB    R10, [R4,#(_ZL5State - 0x9DA98)] ; State
.text:0002C8E4                 STRB    R8, [R4,#(_ZL5State+4 - 0x9DA98)]
.text:0002C8E8                 STRB    R7, [R4,#(_ZL5State+8 - 0x9DA98)]
.text:0002C8EC                 STRB    R6, [R4,#(_ZL5State+0xC - 0x9DA98)]
.text:0002C8F0                 STRB    R9, [R4,#(_ZL5State+0xD - 0x9DA98)]
.text:0002C8F4                 STRB    R11, [R4,#(_ZL5State+2 - 0x9DA98)]
.text:0002C8F8                 STR     R3, [SP,#0x40+var_30]
.text:0002C8FC                 STR     R5, [SP,#0x40+var_2C]
.text:0002C900                 LDRB    R3, [R0,#0xF]
.text:0002C904                 STRB    LR, [R4,#(_ZL5State+6 - 0x9DA98)]
.text:0002C908                 LDR     R10, [SP,#0x40+var_3C]
.text:0002C90C                 LDR     R9, [SP,#0x40+var_38]
.text:0002C910                 LDR     R8, [SP,#0x40+var_34]
.text:0002C914                 LDR     R7, [SP,#0x40+var_30]
.text:0002C918                 LDR     R6, [SP,#0x40+var_2C]
.text:0002C91C                 STRB    R3, [R4,#(_ZL5State+0xF - 0x9DA98)]
.text:0002C920                 MOV     R0, #0xA
.text:0002C924                 STRB    R10, [R4,#(_ZL5State+0xA - 0x9DA98)]
.text:0002C928                 STRB    R9, [R4,#(_ZL5State+0xE - 0x9DA98)]
.text:0002C92C                 STRB    R8, [R4,#(_ZL5State+3 - 0x9DA98)]
.text:0002C930                 STRB    R7, [R4,#(_ZL5State+7 - 0x9DA98)]
.text:0002C934                 STRB    R6, [R4,#(_ZL5State+0xB - 0x9DA98)]
.text:0002C938                 MOV     R5, R1
.text:0002C93C                 BL      _ZL8LoadKeysh   ; LoadKeys(uchar)
.text:0002C940                 BL      _ZL11AddRoundKeyv ; AddRoundKey(void)
.text:0002C944                 BL      _Z12InvShiftRowsv ; InvShiftRows(void)
.text:0002C948                 BL      _Z11InvSubBytesv ; InvSubBytes(void)
.text:0002C94C                 MOV     R0, #9
.text:0002C950                 BL      _ZL8LoadKeysh   ; LoadKeys(uchar)
.text:0002C954                 BL      _ZL11AddRoundKeyv ; AddRoundKey(void)
.text:0002C958                 BL      _Z13InvMixColumnsv ; InvMixColumns(void)
.text:0002C95C                 BL      _Z12InvShiftRowsv ; InvShiftRows(void)
.text:0002C960                 BL      _Z11InvSubBytesv ; InvSubBytes(void)
.text:0002C964                 MOV     R0, #8
.text:0002C968                 BL      _ZL8LoadKeysh   ; LoadKeys(uchar)
.text:0002C96C                 BL      _ZL11AddRoundKeyv ; AddRoundKey(void)
.text:0002C970                 BL      _Z13InvMixColumnsv ; InvMixColumns(void)
.text:0002C974                 BL      _Z12InvShiftRowsv ; InvShiftRows(void)
.text:0002C978                 BL      _Z11InvSubBytesv ; InvSubBytes(void)
.text:0002C97C                 MOV     R0, #7
.text:0002C980                 BL      _ZL8LoadKeysh   ; LoadKeys(uchar)
.text:0002C984                 BL      _ZL11AddRoundKeyv ; AddRoundKey(void)
.text:0002C988                 BL      _Z13InvMixColumnsv ; InvMixColumns(void)
.text:0002C98C                 BL      _Z12InvShiftRowsv ; InvShiftRows(void)
.text:0002C990                 BL      _Z11InvSubBytesv ; InvSubBytes(void)
.text:0002C994                 MOV     R0, #6
.text:0002C998                 BL      _ZL8LoadKeysh   ; LoadKeys(uchar)
.text:0002C99C                 BL      _ZL11AddRoundKeyv ; AddRoundKey(void)
.text:0002C9A0                 BL      _Z13InvMixColumnsv ; InvMixColumns(void)
.text:0002C9A4                 BL      _Z12InvShiftRowsv ; InvShiftRows(void)
.text:0002C9A8                 BL      _Z11InvSubBytesv ; InvSubBytes(void)
.text:0002C9AC                 MOV     R0, #5
.text:0002C9B0                 BL      _ZL8LoadKeysh   ; LoadKeys(uchar)
.text:0002C9B4                 BL      _ZL11AddRoundKeyv ; AddRoundKey(void)
.text:0002C9B8                 BL      _Z13InvMixColumnsv ; InvMixColumns(void)
.text:0002C9BC                 BL      _Z12InvShiftRowsv ; InvShiftRows(void)
.text:0002C9C0                 BL      _Z11InvSubBytesv ; InvSubBytes(void)
.text:0002C9C4                 MOV     R0, #4
.text:0002C9C8                 BL      _ZL8LoadKeysh   ; LoadKeys(uchar)
.text:0002C9CC                 BL      _ZL11AddRoundKeyv ; AddRoundKey(void)
.text:0002C9D0                 BL      _Z13InvMixColumnsv ; InvMixColumns(void)
.text:0002C9D4                 BL      _Z12InvShiftRowsv ; InvShiftRows(void)
.text:0002C9D8                 BL      _Z11InvSubBytesv ; InvSubBytes(void)
.text:0002C9DC                 MOV     R0, #3
.text:0002C9E0                 BL      _ZL8LoadKeysh   ; LoadKeys(uchar)
.text:0002C9E4                 BL      _ZL11AddRoundKeyv ; AddRoundKey(void)
.text:0002C9E8                 BL      _Z13InvMixColumnsv ; InvMixColumns(void)
.text:0002C9EC                 BL      _Z12InvShiftRowsv ; InvShiftRows(void)
.text:0002C9F0                 BL      _Z11InvSubBytesv ; InvSubBytes(void)
.text:0002C9F4                 MOV     R0, #2
.text:0002C9F8                 BL      _ZL8LoadKeysh   ; LoadKeys(uchar)
.text:0002C9FC                 BL      _ZL11AddRoundKeyv ; AddRoundKey(void)
.text:0002CA00                 BL      _Z13InvMixColumnsv ; InvMixColumns(void)
.text:0002CA04                 BL      _Z12InvShiftRowsv ; InvShiftRows(void)
.text:0002CA08                 BL      _Z11InvSubBytesv ; InvSubBytes(void)
.text:0002CA0C                 MOV     R0, #1
.text:0002CA10                 BL      _ZL8LoadKeysh   ; LoadKeys(uchar)
.text:0002CA14                 BL      _ZL11AddRoundKeyv ; AddRoundKey(void)
.text:0002CA18                 BL      _Z13InvMixColumnsv ; InvMixColumns(void)
.text:0002CA1C                 BL      _Z12InvShiftRowsv ; InvShiftRows(void)
.text:0002CA20                 BL      _Z11InvSubBytesv ; InvSubBytes(void)
.text:0002CA24                 MOV     R0, #0
.text:0002CA28                 BL      _ZL8LoadKeysh   ; LoadKeys(uchar)
.text:0002CA2C                 BL      _ZL11AddRoundKeyv ; AddRoundKey(void)
.text:0002CA30                 LDRB    R3, [R4,#(_ZL5State+0xE - 0x9DA98)]
.text:0002CA34                 LDRB    R11, [R4,#(_ZL5State+6 - 0x9DA98)]
.text:0002CA38                 STR     R3, [SP,#0x40+var_40]
.text:0002CA3C                 LDRB    R3, [R4,#(_ZL5State+3 - 0x9DA98)]
.text:0002CA40                 LDRB    R12, [R4,#(_ZL5State+5 - 0x9DA98)]
.text:0002CA44                 LDRB    R1, [R4,#(_ZL5State+0xD - 0x9DA98)]
.text:0002CA48                 STR     R3, [SP,#0x40+var_3C]
.text:0002CA4C                 LDRB    R3, [R4,#(_ZL5State+7 - 0x9DA98)]
.text:0002CA50                 STR     R11, [SP,#0x40+var_30]
.text:0002CA54                 LDRB    R0, [R4,#(_ZL5State+9 - 0x9DA98)]
.text:0002CA58                 LDRB    R2, [R4,#(_ZL5State+2 - 0x9DA98)]
.text:0002CA5C                 LDRB    R9, [R4,#(_ZL5State - 0x9DA98)] ; State
.text:0002CA60                 LDRB    R10, [R4,#(_ZL5State+4 - 0x9DA98)]
.text:0002CA64                 LDRB    R8, [R4,#(_ZL5State+8 - 0x9DA98)]
.text:0002CA68                 LDRB    R7, [R4,#(_ZL5State+0xC - 0x9DA98)]
.text:0002CA6C                 LDRB    R6, [R4,#(_ZL5State+1 - 0x9DA98)]
.text:0002CA70                 LDRB    R11, [R4,#(_ZL5State+0xA - 0x9DA98)]
.text:0002CA74                 STR     R3, [SP,#0x40+var_38]
.text:0002CA78                 STRB    R12, [R5,#5]
.text:0002CA7C                 LDRB    R3, [R4,#(_ZL5State+0xB - 0x9DA98)]
.text:0002CA80                 STRB    R1, [R5,#7]
.text:0002CA84                 LDR     R12, [SP,#0x40+var_30]
.text:0002CA88                 LDR     R1, [SP,#0x40+var_40]
.text:0002CA8C                 STR     R3, [SP,#0x40+var_34]
.text:0002CA90                 LDRB    R4, [R4,#(_ZL5State+0xF - 0x9DA98)]
.text:0002CA94                 STRB    R0, [R5,#6]
.text:0002CA98                 STRB    R2, [R5,#8]
.text:0002CA9C                 STRB    R9, [R5]
.text:0002CAA0                 STRB    R10, [R5,#1]
.text:0002CAA4                 STRB    R8, [R5,#2]
.text:0002CAA8                 STRB    R7, [R5,#3]
.text:0002CAAC                 STRB    R6, [R5,#4]
.text:0002CAB0                 STRB    R12, [R5,#9]
.text:0002CAB4                 STRB    R11, [R5,#0xA]
.text:0002CAB8                 STRB    R1, [R5,#0xB]
.text:0002CABC                 LDR     R0, [SP,#0x40+var_3C]
.text:0002CAC0                 LDR     R3, [SP,#0x40+var_38]
.text:0002CAC4                 LDR     R2, [SP,#0x40+var_34]
.text:0002CAC8                 STRB    R0, [R5,#0xC]
.text:0002CACC                 STRB    R3, [R5,#0xD]
.text:0002CAD0                 STRB    R2, [R5,#0xE]
.text:0002CAD4                 STRB    R4, [R5,#0xF]
.text:0002CAD8                 ADD     SP, SP, #0x1C
.text:0002CADC                 LDMFD   SP!, {R4-R11,PC}
.text:0002CADC ; End of function AES_decrypt_block(uchar *,uchar *)



.text:0002AD24 ; AES_inti_key(unsigned char *)
.text:0002AD24                 EXPORT _Z12AES_inti_keyPh
.text:0002AD24 _Z12AES_inti_keyPh                      ; CODE XREF: RFChannel::performCBCAuthentification(BidcosFrame &)+268p
.text:0002AD24                                         ; RFChannel::performCBCAuthentification(BidcosFrame &)+70Cp
.text:0002AD24
.text:0002AD24 var_E8          = -0xE8
.text:0002AD24 var_E4          = -0xE4
.text:0002AD24 var_E0          = -0xE0
.text:0002AD24 var_DC          = -0xDC
.text:0002AD24 var_D8          = -0xD8
.text:0002AD24 var_D4          = -0xD4
.text:0002AD24 var_D0          = -0xD0
.text:0002AD24 var_CF          = -0xCF
.text:0002AD24 var_CE          = -0xCE
.text:0002AD24 var_CD          = -0xCD
.text:0002AD24 var_CC          = -0xCC
.text:0002AD24 var_CB          = -0xCB
.text:0002AD24 var_CA          = -0xCA
.text:0002AD24 var_C9          = -0xC9
.text:0002AD24 var_C8          = -0xC8
.text:0002AD24 var_C7          = -0xC7
.text:0002AD24 var_C6          = -0xC6
.text:0002AD24 var_C5          = -0xC5
.text:0002AD24 var_C4          = -0xC4
.text:0002AD24 var_C3          = -0xC3
.text:0002AD24 var_C2          = -0xC2
.text:0002AD24 var_C1          = -0xC1
.text:0002AD24
.text:0002AD24                 STMFD   SP!, {R4-R11}
.text:0002AD28                 LDRB    R2, [R0,#9]
.text:0002AD2C                 LDRB    R7, [R0,#3]
.text:0002AD30                 LDRB    R1, [R0,#0xA]
.text:0002AD34                 LDRB    R3, [R0,#0xB]
.text:0002AD38                 SUB     SP, SP, #0xC8
.text:0002AD3C                 STR     R2, [SP,#0xE8+var_E8]
.text:0002AD40                 LDRB    R8, [R0,#2]
.text:0002AD44                 LDRB    R6, [R0,#4]
.text:0002AD48                 LDRB    R5, [R0,#5]
.text:0002AD4C                 LDRB    R4, [R0,#6]
.text:0002AD50                 LDRB    R12, [R0,#7]
.text:0002AD54                 LDRB    R2, [R0,#0xC]
.text:0002AD58                 LDRB    R9, [R0]
.text:0002AD5C                 LDRB    R10, [R0,#1]
.text:0002AD60                 LDRB    R11, [R0,#8]
.text:0002AD64                 STR     R1, [SP,#0xE8+var_E4]
.text:0002AD68                 STR     R3, [SP,#0xE8+var_E0]
.text:0002AD6C                 LDRB    R1, [R0,#0xD]
.text:0002AD70                 LDRB    R3, [R0,#0xE]
.text:0002AD74                 STRB    R7, [SP,#0xE8+var_CD]
.text:0002AD78                 LDR     R7, [SP,#0xE8+var_E8]
.text:0002AD7C                 STR     R2, [SP,#0xE8+var_DC]
.text:0002AD80                 STR     R1, [SP,#0xE8+var_D8]
.text:0002AD84                 STR     R3, [SP,#0xE8+var_D4]
.text:0002AD88                 LDRB    R0, [R0,#0xF]
.text:0002AD8C                 STRB    R8, [SP,#0xE8+var_CE]
.text:0002AD90                 STRB    R6, [SP,#0xE8+var_CC]
.text:0002AD94                 STRB    R5, [SP,#0xE8+var_CB]
.text:0002AD98                 STRB    R4, [SP,#0xE8+var_CA]
.text:0002AD9C                 STRB    R12, [SP,#0xE8+var_C9]
.text:0002ADA0                 STRB    R9, [SP,#0xE8+var_D0]
.text:0002ADA4                 STRB    R10, [SP,#0xE8+var_CF]
.text:0002ADA8                 STRB    R11, [SP,#0xE8+var_C8]
.text:0002ADAC                 LDR     R1, =_ZTI9RFChannel ; `typeinfo for'RFChannel
.text:0002ADB0                 STRB    R7, [SP,#0xE8+var_C7]
.text:0002ADB4                 LDR     R5, [SP,#0xE8+var_E4]
.text:0002ADB8                 LDR     R6, [SP,#0xE8+var_E0]
.text:0002ADBC                 LDR     R8, [SP,#0xE8+var_DC]
.text:0002ADC0                 LDR     R12, [SP,#0xE8+var_D8]
.text:0002ADC4                 LDR     R4, [SP,#0xE8+var_D4]
.text:0002ADC8                 ADD     R3, SP, #0xE8+var_D0
.text:0002ADCC                 MOV     R2, #4
.text:0002ADD0                 STRB    R5, [SP,#0xE8+var_C6]
.text:0002ADD4                 STRB    R6, [SP,#0xE8+var_C5]
.text:0002ADD8                 STRB    R8, [SP,#0xE8+var_C4]
.text:0002ADDC                 STRB    R12, [SP,#0xE8+var_C3]
.text:0002ADE0                 STRB    R4, [SP,#0xE8+var_C2]
.text:0002ADE4                 STRB    R0, [SP,#0xE8+var_C1]
.text:0002ADE8
.text:0002ADE8 loc_2ADE8                               ; CODE XREF: AES_inti_key(uchar *)+1E4j
.text:0002ADE8                 ADD     R6, SP, #0xE8+var_D0
.text:0002ADEC                 SUB     R5, R2, #1
.text:0002ADF0                 LDRB    R7, [R6,R5,LSL#2]
.text:0002ADF4                 ADD     R11, R6, R5,LSL#2
.text:0002ADF8                 ADD     R4, R1, R7
.text:0002ADFC                 LDRB    R5, [R11,#2]
.text:0002AE00                 ADD     R12, R6, R2,LSL#2
.text:0002AE04                 STR     R4, [SP,#0xE8+var_E8]
.text:0002AE08                 LDRB    R6, [R11,#1]
.text:0002AE0C                 LDRB    R4, [R11,#3]
.text:0002AE10                 AND     R8, R2, #0xFF
.text:0002AE14                 TST     R2, #3
.text:0002AE18                 ADD     R0, R2, #1
.text:0002AE1C                 ADD     R9, R1, R6
.text:0002AE20                 ADD     R10, R1, R5
.text:0002AE24                 ADD     R11, R1, R4
.text:0002AE28                 ADD     R8, R1, R8,LSR#2
.text:0002AE2C                 BNE     loc_2AE4C
.text:0002AE30                 LDRB    R6, [R10,#0xC]
.text:0002AE34                 LDR     R10, [SP,#0xE8+var_E8]
.text:0002AE38                 LDRB    R9, [R9,#0xC]
.text:0002AE3C                 LDRB    R7, [R8,#0x10B]
.text:0002AE40                 LDRB    R5, [R11,#0xC]
.text:0002AE44                 LDRB    R4, [R10,#0xC]
.text:0002AE48                 EOR     R7, R9, R7
.text:0002AE4C
.text:0002AE4C loc_2AE4C                               ; CODE XREF: AES_inti_key(uchar *)+108j
.text:0002AE4C                 LDRB    R8, [R3,#2]
.text:0002AE50                 LDRB    R9, [R3]
.text:0002AE54                 LDRB    R10, [R3,#1]
.text:0002AE58                 LDRB    R11, [R3,#3]
.text:0002AE5C                 EOR     R5, R5, R8
.text:0002AE60                 EOR     R6, R6, R10
.text:0002AE64                 EOR     R11, R4, R11
.text:0002AE68                 EOR     R7, R7, R9
.text:0002AE6C                 ADD     R8, SP, #0xE8+var_D0
.text:0002AE70                 TST     R0, #3
.text:0002AE74                 STRB    R6, [R3,#0x11]
.text:0002AE78                 STRB    R7, [R3,#0x10]
.text:0002AE7C                 STRB    R5, [R3,#0x12]
.text:0002AE80                 STRB    R11, [R3,#0x13]
.text:0002AE84                 AND     R6, R0, #0xFF
.text:0002AE88                 LDRB    R5, [R8,R2,LSL#2]
.text:0002AE8C                 LDRB    R4, [R12,#2]
.text:0002AE90                 LDRB    R2, [R12,#1]
.text:0002AE94                 ADD     R3, R3, #4
.text:0002AE98                 LDRB    R12, [R12,#3]
.text:0002AE9C                 BNE     loc_2AECC
.text:0002AEA0                 ADD     R7, R1, R2
.text:0002AEA4                 ADD     R6, R1, R6,LSR#2
.text:0002AEA8                 ADD     R2, R1, R4
.text:0002AEAC                 ADD     R9, R1, R12
.text:0002AEB0                 ADD     R8, R1, R5
.text:0002AEB4                 LDRB    R10, [R7,#0xC]
.text:0002AEB8                 LDRB    R5, [R6,#0x10B]
.text:0002AEBC                 LDRB    R2, [R2,#0xC]
.text:0002AEC0                 LDRB    R4, [R9,#0xC]
.text:0002AEC4                 LDRB    R12, [R8,#0xC]
.text:0002AEC8                 EOR     R5, R10, R5
.text:0002AECC
.text:0002AECC loc_2AECC                               ; CODE XREF: AES_inti_key(uchar *)+178j
.text:0002AECC                 LDRB    R7, [R3]
.text:0002AED0                 LDRB    R6, [R3,#1]
.text:0002AED4                 EOR     R9, R5, R7
.text:0002AED8                 LDRB    R10, [R3,#2]
.text:0002AEDC                 LDRB    R5, [R3,#3]
.text:0002AEE0                 EOR     R8, R2, R6
.text:0002AEE4                 ADD     R2, R0, #1
.text:0002AEE8                 EOR     R11, R4, R10
.text:0002AEEC                 EOR     R0, R12, R5
.text:0002AEF0                 CMP     R2, #0x2C
.text:0002AEF4                 STRB    R9, [R3,#0x10]
.text:0002AEF8                 STRB    R8, [R3,#0x11]
.text:0002AEFC                 STRB    R11, [R3,#0x12]
.text:0002AF00                 STRB    R0, [R3,#0x13]
.text:0002AF04                 ADD     R3, R3, #4
.text:0002AF08                 BNE     loc_2ADE8
.text:0002AF0C                 LDR     R0, =_ZL10CurrentKey ; CurrentKey
.text:0002AF10                 MOV     R7, #0
.text:0002AF14                 MOV     R1, R7
.text:0002AF18
.text:0002AF18 loc_2AF18                               ; CODE XREF: AES_inti_key(uchar *)+258j
.text:0002AF18                 ADD     R4, SP, #0xE8+var_D0
.text:0002AF1C                 MOV     R11, R4
.text:0002AF20                 ADD     R6, R7, #4
.text:0002AF24                 LDRB    R9, [R4,R7]!
.text:0002AF28                 LDRB    R5, [R11,R6]!
.text:0002AF2C                 LDRB    R7, [R4,#3]
.text:0002AF30                 LDRB    R10, [R4,#1]
.text:0002AF34                 LDRB    R8, [R4,#2]
.text:0002AF38                 LDRB    R12, [R11,#2]
.text:0002AF3C                 LDRB    R4, [R11,#1]
.text:0002AF40                 LDRB    R11, [R11,#3]
.text:0002AF44                 ADD     R2, R0, R1,LSL#2
.text:0002AF48                 ADD     R3, R1, #1
.text:0002AF4C                 ADD     R1, R1, #2
.text:0002AF50                 ADD     R3, R0, R3,LSL#2
.text:0002AF54                 CMP     R1, #0x2C
.text:0002AF58                 STRB    R7, [R2,#0x13]
.text:0002AF5C                 STRB    R9, [R2,#0x10]
.text:0002AF60                 STRB    R10, [R2,#0x11]
.text:0002AF64                 STRB    R8, [R2,#0x12]
.text:0002AF68                 ADD     R7, R6, #4
.text:0002AF6C                 STRB    R5, [R3,#0x10]
.text:0002AF70                 STRB    R4, [R3,#0x11]
.text:0002AF74                 STRB    R12, [R3,#0x12]
.text:0002AF78                 STRB    R11, [R3,#0x13]
.text:0002AF7C                 BNE     loc_2AF18
.text:0002AF80                 ADD     SP, SP, #0xC8
.text:0002AF84                 LDMFD   SP!, {R4-R11}
.text:0002AF88                 BX      LR
.text:0002AF88 ; End of function AES_inti_key(uchar *)


jab

So der Post war zu lang. Der vermutlich relevante Teil noch mal hier:

.text:0002F748                 ADD     R1, R4, #0x14
.text:0002F74C                 ADD     R0, SP, #0x70+var_48
.text:0002F750                 BL      _ZNSsC1ERKSs    ; std::string::string(std::string  const&)
.text:0002F754                 MOV     R0, #1
.text:0002F758                 MOV     R1, #0x49
.text:0002F75C                 ADD     R2, SP, #0x70+var_2C
.text:0002F760                 BL      _ZNSs12_S_constructEjcRKSaIcE ; std::string::_S_construct(uint,char,std::allocator<char>  const&)
.text:0002F764                 STR     R0, [SP,#0x70+var_44]
.text:0002F768                 MOV     R0, R6
.text:0002F76C                 BL      _ZNK11BidcosFrame16GetSenderAddressEv ; BidcosFrame::GetSenderAddress(void)
.text:0002F770                 MOV     R1, R0
.text:0002F774                 ADD     R0, SP, #0x70+var_40
.text:0002F778                 BL      _ZN3HM2L37convertBidcosAddressToBigEndianStringEi ; HM2::convertBidcosAddressToBigEndianString(int)
.text:0002F77C                 LDR     R1, [SP,#0x70+var_40]
.text:0002F780                 ADD     R12, SP, #0x70+var_44
.text:0002F784                 MOV     R0, R12
.text:0002F788                 LDR     R2, [R1,#-0xC]
.text:0002F78C                 STR     R12, [SP,#0x70+var_60]
.text:0002F790                 BL      _ZNSs6appendEPKcj ; std::string::append(char  const*,uint)
.text:0002F794                 MOV     R0, R6
.text:0002F798                 BL      _ZNK11BidcosFrame18GetReceiverAddressEv ; BidcosFrame::GetReceiverAddress(void)
.text:0002F79C                 MOV     R1, R0
.text:0002F7A0                 ADD     R0, SP, #0x70+var_3C
.text:0002F7A4                 BL      _ZN3HM2L37convertBidcosAddressToBigEndianStringEi ; HM2::convertBidcosAddressToBigEndianString(int)
.text:0002F7A8                 ADD     R0, SP, #0x70+var_40
.text:0002F7AC                 ADD     R1, SP, #0x70+var_3C
.text:0002F7B0                 BL      _ZNSs6assignERKSs ; std::string::assign(std::string  const&)
.text:0002F7B4                 ADD     R0, SP, #0x70+var_3C
.text:0002F7B8                 BL      _ZNSsD1Ev       ; std::string::~string()
.text:0002F7BC                 LDR     R1, [SP,#0x70+var_40]
.text:0002F7C0                 LDR     R0, [SP,#0x70+var_60]
.text:0002F7C4                 LDR     R2, [R1,#-0xC]
.text:0002F7C8                 BL      _ZNSs6appendEPKcj ; std::string::append(char  const*,uint)
.text:0002F7CC                 ADD     R0, SP, #0x70+var_38
.text:0002F7D0                 LDR     R1, [SP,#0x70+var_64]
.text:0002F7D4                 BL      _ZN3HM2L37convertBidcosAddressToBigEndianStringEi ; HM2::convertBidcosAddressToBigEndianString(int)
.text:0002F7D8                 ADD     R0, SP, #0x70+var_40
.text:0002F7DC                 ADD     R1, SP, #0x70+var_38
.text:0002F7E0                 BL      _ZNSs6assignERKSs ; std::string::assign(std::string  const&)
.text:0002F7E4                 ADD     R0, SP, #0x70+var_38
.text:0002F7E8                 BL      _ZNSsD1Ev       ; std::string::~string()
.text:0002F7EC                 LDR     R1, [SP,#0x70+var_40]
.text:0002F7F0                 LDR     R0, [SP,#0x70+var_60]
.text:0002F7F4                 LDR     R2, [R1,#-0xC]
.text:0002F7F8                 BL      _ZNSs6appendEPKcj ; std::string::append(char  const*,uint)
.text:0002F7FC                 LDR     R0, [SP,#0x70+var_60]
.text:0002F800                 MOV     R1, #5
.text:0002F804                 MOV     R2, #0
.text:0002F808                 BL      _ZNSs6appendEjc ; std::string::append(uint,char)
.text:0002F80C                 LDR     R0, [SP,#0x70+var_60]
.text:0002F810                 MOV     R1, #1
.text:0002F814                 MOV     R2, #5
.text:0002F818                 BL      _ZNSs6appendEjc ; std::string::append(uint,char)
.text:0002F81C                 LDR     R0, [SP,#0x70+var_48]
.text:0002F820                 BL      _Z12AES_inti_keyPh ; AES_inti_key(uchar *)
.text:0002F824                 MOV     R0, #0x10
.text:0002F828                 BL      _Znaj           ; operator new[](uint)
.text:0002F82C                 MOV     R1, R0
.text:0002F830                 MOV     R8, R0
.text:0002F834                 LDR     R0, [SP,#0x70+var_44]
.text:0002F838                 BL      _Z17AES_encrypt_blockPhS_ ; AES_encrypt_block(uchar *,uchar *)
.text:0002F83C                 MOV     R0, R6


Gruß,
Jan

mgernoth

#10
Zitat von: jab am 12 Februar 2014, 16:23:25
So der Post war zu lang. Der vermutlich relevante Teil noch mal hier:

Uhh, Wow :-)

Klasse :-)

Mal sehen ob ich noch ein paar Logs mit bekannten Keys wiederfinde, dann mache ich mich mal ans re-implementieren und verifizieren.

EDIT: habe in meinen Aufzeichnungen das hier gefunden:

#key: geheim
#A0F4DA03E68EA141ED0171ED017400160
#A0E4D80021ED01768EA140101000025
#A194EA00468EA141ED0172D01F41F2E52AB28F506E381A5AEAB73
#A114EA0021ED01768EA14047D5101811D1A02
#A194EA00368EA141ED0177BDB0CAFF9DE94D634A934389B92B69C
#A0E4E80021ED01768EA14002AE9B166
#A194FA00468EA141ED0172CADD1AC0170B67761637687E99048C4
#A114FA0021ED01768EA14047844BF6BE59002
#A194FA00368EA141ED017C7986D967898B43A536F2E46223456AD
#A0E4F80021ED01768EA1400B1AB6556


Gruß
  Michael

jab

Abend,

so ich habe mir mal meinen HM-LC-Sw1PBU-FM angeschaut und das externe EEPROM ausgelesen. An das interne kommt man bei dem Gerät nicht da EESave leider nicht gesetzt ist. Sieht aber nicht sonderlich spannend aus:

0: 0 0 32 64 0 FF 0 FF 1 64 66 0 0 32 64 0 FF 0 FF 21 64 66 1 DF FF FF FF FF FF FF FF FF
32: 0 0 32 64 0 FF 0 FF 1 13 33 0 0 32 64 0 FF 0 FF 21 13 33 1 D7 FF FF FF FF FF FF FF FF
64: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
96: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
128: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
160: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
192: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
224: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
256: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
288: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
320: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
352: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
384: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
416: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
448: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
480: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
512: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
544: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
576: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
608: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
640: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
672: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
704: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
736: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
768: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
800: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
832: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
864: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
896: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
928: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
960: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
992: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
1024: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
1056: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
1088: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
1120: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
1152: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
1184: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
1216: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
1248: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
1280: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
1312: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
1344: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
1376: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
1408: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
1440: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
1472: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
1504: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
1536: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
1568: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
1600: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
1632: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
1664: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
1696: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
1728: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
1760: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
1792: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
1824: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
1856: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
1888: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
1920: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
1952: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
1984: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
2016: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
2048: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
2080: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
2112: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
2144: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
2176: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
2208: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
2240: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
2272: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
2304: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
2336: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
2368: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
2400: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
2432: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
2464: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
2496: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
2528: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
2560: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
2592: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
2624: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
2656: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
2688: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
2720: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
2752: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
2784: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
2816: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
2848: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
2880: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
2912: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
2944: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
2976: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3008: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3040: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3072: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3104: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3136: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3168: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3200: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3232: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3264: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3296: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3328: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3360: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3392: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3424: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3456: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3488: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3520: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3552: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3584: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3616: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3648: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3680: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3712: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3744: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3776: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3808: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3840: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3872: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3904: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3936: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3968: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
4000: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
4032: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
4064: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF AB CD

Sieht mir fast ein wenig wie die Register aus. Habe das Gerät nie mit der Originalfirmware benutzt. Dürfte also Defaultsetting sein.


Gruß,
Jan

martinp876

Hi,

Hinweis: ich denke ich habe (einen Teil mehr ) begriffen wie HMLAN mit AES umgeht. Man kann je device einstellen, dass HMLAN vor jeden ACK (so das Device eins fordert) den key überprüft.
Eingebaut habe ich bisher zum Beobachten ein Reading "aesCommToDev".
Sollte bei remotes eingeschaltet sein...
Der fertige umbau zur sinnvollen nutzung steht noch aus

Gruss Martin

jab

Hi Martin,

streng genommen war der Thread für AES im Funk gedacht. Weißt du da mehr über den Algorithmus bzw über was genau die Signatur gebaut wird?

Den HMLAN Teil habe ich nur rausgesucht, weil sie da möglicherweise einfach genau das gleiche benutzen und es uns weiterhelfen kann. Da geht es um die Verschlüsselung der Nachrichten zwischen HMLAN und der CCU2 (zumindest wenn ich das richtig verstanden habe).

rfd macht wirklich viel AES. Da sind mindestens zwei Verschiedene AES Funktionen drin. Von daher kann man da evtl noch mehr verstehen. Leider fehlt uns bisher noch recht viel Wissen.


Gruß,
Jan

mgernoth

Hi,

Zitat von: jab am 16 Februar 2014, 20:55:52
Den HMLAN Teil habe ich nur rausgesucht, weil sie da möglicherweise einfach genau das gleiche benutzen und es uns weiterhelfen kann. Da geht es um die Verschlüsselung der Nachrichten zwischen HMLAN und der CCU2 (zumindest wenn ich das richtig verstanden habe).

Die AES-Verschlüsselung zwischen HMLAN und CCU ist sehr einfach, siehe: http://forum.fhem.de/index.php?topic=12954.0

Da wird tatsächlich nur der aufgedruckte Schlüssel benutzt und kein Transaktionsspezifischer.

Gruß
  Michael

jab

Hi Michael,

das sieht ja super aus. Das wusste ich nicht. Danke dir! Dann war mein Debugging mit IDA ja redundant eigentlich und bestätigt das eigentlich nur. Warum ist das eigentlich noch nicht in FHEM eingebaut?

Ok dann back to track: Was wissen wir über den Funk AES?
- Nachricht wird gesendet (1)
- ACK wird gesendet mit Signing Flag (?) (2)
- AES Signatur wird gesendet (3)

Jetzt die Frage: Was wird signiert? Die Nachricht (1), wenn ja was aus der Nachricht? Oder gibt es irgendeine Challenge im ACK (2)?

Wissen wir über den Algorithmus? Irgendwelche Erkenntnisse? IVs? Randomseeds? Wir haben ja keinen vernünftigen Random auf den Controllern.


Gruß,
Jan

martinp876

hi,

klar rede ich von funk.
Ich denke das flag entdeckt zu haben, mit dem HMLAN einem device nur antwortet, wenn es vorher "die AES-frage" beantworten kann.
Es betrifft also die Kommunikation zwischen FHEM und den Devices. virtuellen aktoren sind aussen vor! Die lassen sich so nicht bedienen.
natuerlich geht es nicht fuer CUL, da braucht es den Algorythmus, den ihr sucht.

Gruss Martin

ulli

Hallo zusammen,

Was ist eigentlich aus dem Thema geworden? Wäre sehr interessiert daran um es für einen keymatic nutzen zu können.

Grüße ulli

nobody42

Nur mal als Einwurf: auf dem 30C3 wurde auch Homematic behandelt.
Infos bekommt man bestimmt von den Autoren, wenn man nett fragt.

http://media.ccc.de/browse/congress/2013/30C3_-_5444_-_en_-_saal_g_-_201312301600_-_attacking_homematic_-_sathya_-_malli.html#video


mgernoth

Hallo,

ich denke hier sollte es auch rein:

Zu AES-Key siehe auch Pastebin-Link im 2. Beitrag des folgenden aus dem Homegear-Forum: https://forum.homegear.eu/viewtopic.php?t=217#p1485

Gruss
  Michael

mgernoth

Hallo,


fhem> set COC hmPairForSec 30
2015-06-07 15:50:48 CUL COC hmPairForSec 30
2015-06-07 15:50:54 Global global DEFINED HM_1ED017
2015-06-07 15:50:54 Global global DEFINED FileLog_HM_1ED017
2015-06-07 15:50:54 Global global SAVE
2015-06-07 15:50:54 CUL COC SND L:10 N:02 F:A0 CMD:01 SRC:68EA14 DST:HM_1ED017 00050000000000 (CONFIG_START CHANNEL:0x00 PEER_ADDRESS:0x000000 PEER_CHANNEL:0x00 PARAM_LIST:0x00) (,BIDI,RPTEN)
2015-06-07 15:50:54 CUL_HM HM_1ED017 D-firmware: 1.9
2015-06-07 15:50:54 CUL_HM HM_1ED017 D-serialNr: JEQ0697776
2015-06-07 15:50:54 CUL_HM HM_1ED017 R-pairCentral: set_0x68EA14
2015-06-07 15:50:54 CUL COC RCV L:0A N:02 F:80 CMD:02 SRC:HM_1ED017 DST:68EA14 00 (ACK) (,RPTEN)
2015-06-07 15:50:54 CUL COC SND L:13 N:03 F:A0 CMD:01 SRC:68EA14 DST:HM_1ED017 000802010A680BEA0C14 (CONFIG_WRITE_INDEX CHANNEL:0x00 DATA: 02:01 0A:68 0B:EA 0C:14) (,BIDI,RPTEN)
2015-06-07 15:50:54 CUL COC RCV L:0A N:03 F:80 CMD:02 SRC:HM_1ED017 DST:68EA14 00 (ACK) (,RPTEN)
2015-06-07 15:50:55 CUL COC SND L:0B N:04 F:A0 CMD:01 SRC:68EA14 DST:HM_1ED017 0006 (CONFIG_END CHANNEL:0x00) (,BIDI,RPTEN)
2015-06-07 15:50:55 CUL COC RCV L:0A N:04 F:80 CMD:02 SRC:HM_1ED017 DST:68EA14 00 (ACK) (,RPTEN)

fhem> set HM_1ED017 getConfig
...

fhem> set HM_1ED017 on
2015-06-07 15:54:18 CUL_HM HM_1ED017 set_on
2015-06-07 15:54:18 CUL COC SND L:0E N:0F F:A0 CMD:11 SRC:68EA14 DST:HM_1ED017 0201C80000 (SET CHANNEL:0x01 VALUE:0xC8 RAMPTIME:2) (,BIDI,RPTEN)
2015-06-07 15:54:18 CUL COC RCV L:0E N:0F F:80 CMD:02 SRC:HM_1ED017 DST:68EA14 0101C80021 (ACK_STATUS CHANNEL:0x01 STATUS:0xC8 UP:0 DOWN:0 LOWBAT:0 RSSI:-33) (,RPTEN)
2015-06-07 15:54:18 CUL_HM HM_1ED017 deviceMsg: on (to COC)
2015-06-07 15:54:18 CUL_HM HM_1ED017 level: 100
2015-06-07 15:54:18 CUL_HM HM_1ED017 pct: 100
2015-06-07 15:54:18 CUL_HM HM_1ED017 on
2015-06-07 15:54:18 CUL_HM HM_1ED017 timedOn: off

fhem> set HM_1ED017 sign on
2015-06-07 15:54:32 CUL_HM HM_1ED017 R-sign: set_on
2015-06-07 15:54:32 CUL COC SND L:10 N:10 F:A0 CMD:01 SRC:68EA14 DST:HM_1ED017 01050000000001 (CONFIG_START CHANNEL:0x01 PEER_ADDRESS:0x000000 PEER_CHANNEL:0x00 PARAM_LIST:0x01) (,BIDI,RPTEN)
2015-06-07 15:54:32 CUL COC RCV L:0A N:10 F:80 CMD:02 SRC:HM_1ED017 DST:68EA14 00 (ACK) (,RPTEN)
2015-06-07 15:54:32 CUL COC SND L:0D N:11 F:A0 CMD:01 SRC:68EA14 DST:HM_1ED017 01080801 (CONFIG_WRITE_INDEX CHANNEL:0x01 DATA: 08:01) (,BIDI,RPTEN)
2015-06-07 15:54:32 CUL COC RCV L:0A N:11 F:80 CMD:02 SRC:HM_1ED017 DST:68EA14 00 (ACK) (,RPTEN)
2015-06-07 15:54:32 CUL COC SND L:0B N:12 F:A0 CMD:01 SRC:68EA14 DST:HM_1ED017 0106 (CONFIG_END CHANNEL:0x01) (,BIDI,RPTEN)
2015-06-07 15:54:32 CUL COC RCV L:0A N:12 F:80 CMD:02 SRC:HM_1ED017 DST:68EA14 00 (ACK) (,RPTEN)

fhem> set HM_1ED017 off
2015-06-07 15:56:56 CUL_HM HM_1ED017 set_off
2015-06-07 15:56:56 CUL COC SND L:0E N:22 F:A0 CMD:11 SRC:68EA14 DST:HM_1ED017 0201000000 (SET CHANNEL:0x01 VALUE:0x00 RAMPTIME:2) (,BIDI,RPTEN)
2015-06-07 15:56:57 CUL COC RCV L:11 N:22 F:A0 CMD:02 SRC:HM_1ED017 DST:68EA14 04FCBAE287E31E00 (AES_req Para1:0xFCBA Para2:0xE287 Para3:0xE31E keyNo:0x00) (,BIDI,RPTEN)
2015-06-07 15:56:57 CUL COC SND L:0A N:22 F:80 CMD:02 SRC:68EA14 DST:HM_1ED017 00 (ACK) (,RPTEN)
2015-06-07 15:56:57 CUL_HM HM_1ED017 aesKeyNbr: 00
2015-06-07 15:56:57 CUL COC RCV L:19 N:22 F:A0 CMD:03 SRC:68EA14 DST:HM_1ED017 3B2C43920C729737C2A232AB169C586F (AES reply DATA:0x3B2C43920C729737C2A232AB169C586F) (,BIDI,RPTEN)
2015-06-07 15:56:57 CUL COC RCV L:19 N:22 F:A0 CMD:03 SRC:68EA14 DST:HM_1ED017 3B2C43920C729737C2A232AB169C586F (AES reply DATA:0x3B2C43920C729737C2A232AB169C586F) (,BIDI,RPTEN)
2015-06-07 15:56:57 CUL COC UNKNOWNCODE A1922A00368EA141ED0173B2C43920C729737C2A232AB169C586F::-48:COC
2015-06-07 15:56:57 CUL COC RCV L:12 N:22 F:80 CMD:02 SRC:HM_1ED017 DST:68EA14 0101000036F17BA8A9 (ACK_STATUS CHANNEL:0x01 STATUS:0x00 UP:0 DOWN:0 LOWBAT:0 RSSI:-54) (,RPTEN)
2015-06-07 15:56:57 CUL_HM HM_1ED017 deviceMsg: off (to COC)
2015-06-07 15:56:57 CUL_HM HM_1ED017 level: 0
2015-06-07 15:56:57 CUL_HM HM_1ED017 pct: 0
2015-06-07 15:56:57 CUL_HM HM_1ED017 off
2015-06-07 15:56:57 CUL_HM HM_1ED017 timedOn: off


More to come :-)

frank

cool. dein coc spricht aes?  8)
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

mgernoth

#22
Zitat von: frank am 07 Juni 2015, 16:20:23
cool. dein coc spricht aes?  8)

Nein, die rfbee mit culfw am Beaglebone daneben :-)
War der einfachste proof-of-concept Aufbau.

Gruss
  Michael

Ralli

Top. Respekt!

Damit dürfte es ja tatsächlich möglich sein

1) AES in Homematic komplett in fhem zu implementieren und komplett auf die Win-Software zu verzichten
2) AES in die culfw einzubauen und somit CULs, COCs und wie sie alle heißen ebenfalls statt HM-CFG-USB oder HMLAN nutzen zu müssen.

Gruß,
Ralli

Proxmox 8.2 Cluster mit HP ED800G2i7, Intel NUC11TNHi7+NUC7i5BNH, virtualisiertes fhem 6.3 dev, virtualisierte RaspberryMatic (3.75.7.20240420) mit HB-RF-ETH 1.3.0 / RPI-RF-MOD, HM-LAN-GW (1.1.5) und HMW-GW, FRITZBOX 7490 (07.57), FBDECT, Siri und Alexa

mgernoth

#24
Hallo,

so, was lange währt ... ;-)

https://git.zerfleddert.de/hmcfgusb/AES/

Das AES habe ich in meinem Testaufbau nicht in der culfw implementiert (da würde es gar nicht mehr reinpassen), sondern in einem kleinen Perlskript, welches (wie Fhem) mit dem CUL (Rfbee) redet.

Aber das sollte direkt in 10_CUL_HM implementiert werden, mein Testhack ist nicht mehr als genau das, ein übler Hack der einfach alle AES Signaturrequests beantwortet.
Nachdem ich gestern den ganzen Tag mit dem Finden des Algorithmus verbracht habe, hatte ich heute keine Lust und Zeit mehr es richtig zu implementieren. Ausserdem muss ich dazu wahrscheinlich Martin ziemlich löchern, da mir doch viel Wissen über die Internals von 10_CUL_HM.pm fehlt (wie komme ich z.B. an das zuletzt an das Gerät gesendete Frame, bzw. geht das überhaupt).

Gruß
  Michael

trilu

respekt!!!!!!!
ich muss mir das mal genauer anschauen und verstehen, vielleicht bekomme ich es ja in die Newasksin rein....
wäre der hammer, damit hätte man eine komplett emulation :-)

mgernoth

Hallo,

ich habe jetzt mal das Challenge-Response in 10_CUL_HM.pm reingehackt und einen Diff hier angehaengt. Damit kann man jetzt AES-Geraete bedienen (bisher nur mit statisch konfiguriertem Defaultkey).

Leider fehlt mir mehr Wissen ueber die Internas von CUL_HM um das schoen zu machen, evtl. kann Martin sich das mal anschauen und es so hinbauen, dass es zum Rest von CUL_HM passt, man den Schluessel auch setzen kann (z.Zt wird bei einer Schluesselnummer != 00 ein Fehler ausgegeben und dann trotzdem der hartkodierte Defaultschluessel verwendet) und in der Response die ersten 6 Bytes auf einen Zeitstempel gesetzt werden. Und das ganze sollte nur ausgefuehrt werden, wenn es auch wirklich von einem CUL-Device empfangen wurde...


2015-06-08 23:53:03 CUL_HM Steckdose_Test set_toggle
2015-06-08 23:53:03 CUL COC SND L:0E N:01 F:A0 CMD:11 SRC:68EA14 DST:Steckdose_Test 0201000000 (SET CHANNEL:0x01 VALUE:0x00 RAMPTIME:2) (,BIDI,RPTEN)
2015-06-08 23:53:03 CUL COC RCV L:11 N:01 F:A0 CMD:02 SRC:Steckdose_Test DST:68EA14 0463906CE1765E00 (AES_req Para1:0x6390 Para2:0x6CE1 Para3:0x765E keyNo:0x00) (,BIDI,RPTEN)
2015-06-08 23:53:03 CUL COC SND L:19 N:01 F:A0 CMD:03 SRC:68EA14 DST:Steckdose_Test ce1968c7333714ffc23603be6db057d1 (AES reply DATA:0xce1968c7333714ffc23603be6db057d1) (,BIDI,RPTEN)
2015-06-08 23:53:03 CUL COC SND L:0A N:01 F:80 CMD:02 SRC:68EA14 DST:Steckdose_Test 00 (ACK) (,RPTEN)
2015-06-08 23:53:03 CUL_HM Steckdose_Test CUL_HM signing request for As0E01A01168EA141ED0170201000000 challenge:  63906CE1765E kNo: 00
2015-06-08 23:53:03 CUL_HM Steckdose_Test aesKeyNbr: 00
2015-06-08 23:53:03 CUL COC RCV L:12 N:01 F:80 CMD:02 SRC:Steckdose_Test DST:68EA14 010100001EE57EFEE6 (ACK_STATUS CHANNEL:0x01 STATUS:0x00 UP:0 DOWN:0 LOWBAT:0 RSSI:-30) (,RPTEN)
2015-06-08 23:53:03 CUL_HM Steckdose_Test deviceMsg: off (to COC)
2015-06-08 23:53:03 CUL_HM Steckdose_Test level: 0
2015-06-08 23:53:03 CUL_HM Steckdose_Test pct: 0
2015-06-08 23:53:03 CUL_HM Steckdose_Test off
2015-06-08 23:53:03 CUL_HM Steckdose_Test timedOn: off


Gruss
  Michael

mgernoth

#27
Hallo,

so habe das ganze nochmal etwas aufgeraeumt und angehaengt.

Offene Punkte sind noch:

  • Wie kann man Schluessel fuer einen CUL definieren, oder soll das nur an der VCCU funktionieren?
  • Wie kann man dann auf diese Schluessel zugreifen (die muessen an den jeweiligen Schluesselindex im @keys-Array im ACK-AES)?
  • Wie kann das zusaetzlich generierte ACK (neben der Signing-response) unterbunden werden? Habe dazu in CUL_HM_parseCommon keine Moeglichkeit gefunden, auf @ack Einfluss zu nehmen.
  • Wie koennen die vom Geraet in der ACK-Nachricht zurueckgelieferten 4 Bytes mit den im Signierungsprozess erzeugten verglichen werden?

Gruss
  Michael

martinp876

man kann jetzt assignHmKey probieren.
testen muss man selbst. Die Kommandos kommen - ob es klappt muss man sehen. Sicher noch etwas docu zu leisten!

mgernoth

Hallo Martin,

Zitat von: martinp876 am 09 Juni 2015, 21:10:10
man kann jetzt assignHmKey probieren.
testen muss man selbst.

Funktioniert wunderbar, vielen Dank :-)

Zitat
Die Kommandos kommen - ob es klappt muss man sehen. Sicher noch etwas docu zu leisten!

Soll ich da ein/zwei Saetze schreiben?

Ich habe mal die neuesten Version der AES CUL-Implementierung angehaengt, es hat eine Interpretierung der Schluesselnummer als Hex gefehlt.

Viele Gruesse
  Michael

martinp876

Hat bei mir gestern nicht funktioniert. Liegt evtl daran, dass key 00 als der alte erkannt wurde, es aber nicht war. Ich werde eest am wo henende testen.
Ins wiki sollte eine erklaerung, wie man keys festlegt und aendert. Ich denke, das sollte in ein eigenes kapitel.
Das kommando werde ich noch erweitern, so dass man den alten key auch frei waehlen kann. Default bleibt das reading

mgernoth

Hallo Martin,

Zitat von: martinp876 am 10 Juni 2015, 21:32:59
Hat bei mir gestern nicht funktioniert. Liegt evtl daran, dass key 00 als der alte erkannt wurde, es aber nicht war.

Ja, wahrscheinlich.

Zitat
Ich werde eest am wo henende testen.

Falls Du auch meine CUL-AES-Implementierung testen willst, dann habe ich jetzt nochmal eine gefixte angehängt, die die Länge des IV auf 16 Byte beschränkt. Ansonsten will das AES nicht...

Zitat
Ins wiki sollte eine erklaerung, wie man keys festlegt und aendert. Ich denke, das sollte in ein eigenes kapitel.
Das kommando werde ich noch erweitern, so dass man den alten key auch frei waehlen kann. Default bleibt das reading

Ok, ich denke ich komme am WE dazu, da was dazu zu schreiben. Danke für Deine Arbeit :-)

Gruß
  Michael

All-Ex

#32
Hi zusammen,

ich habe (vermutlich erfolgreich) AES erstmal Testweise für einen Rollladenaktor mit FHEM Bordmitteln aktiviert, bin mir aber nicht so sicher, ob ich das alles richtig verstanden und richtig gemacht habe.

Das habe ich getan:

  • Einen 16-stelligen Hex-Schlüssel erzeugt (per Linux-Kommando, ergibt eine 32-stellige Zeichenkette: head -c16 /dev/urandom | md5sum)
  • Den Schlüssel ins HMLAN eingetragen:
    attr hmlan1 hmKey 01:geheimer hex-schlüssel
    attr hmlan1 hmKey2 02:geheimer hex-schlüssel
  • Den Schlüssel zum Rollladenaktor (HM-LC-Bl1PBU-FM) übertragen:
    set [device-name] assignHmKey
  • AES für das Gerät eingeschaltet:
    set [device-name] sign on
Das lief alles problemlos und das Rollo lässt sich weiterhin steuern.

Ein List auf das Rollo liefert (stark gekürzt):
Internals:
   lastMsg    No:18 - t:10 s:338BF7 d:8CF27A 0601B200
   protEvt_AESok 5 last_at:2015-06-27 20:25:34
   protLastRcv 2015-06-27 20:25:38
   protSnd    31 last_at:2015-06-27 20:25:38
   protState  CMDs_done
   Readings:
     2015-06-27 19:52:27   R-sign          on
     2015-06-27 19:52:37   aesKeyNbr       02


Für mich sieht das alles gut aus. Aber bevor ich das so für die weiteren Geräte mache, die Fragen:

Hab ich das richtig gemacht?
Und ist jetzt AES für das Gerät aktiviert?

Danke und viele Grüße,
Alex

frank

sniffe die aktionen nach "homematic-art", da sollte man es erkennen.
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

mgernoth

Zitat von: All-Ex am 27 Juni 2015, 20:28:50
Das habe ich getan:
...

  • Den Schlüssel ins HMLAN eingetragen:
    attr hmlan1 hmKey 01:geheimer hex-schlüssel
    attr hmlan1 hmKey2 02:geheimer hex-schlüssel

Warum und wann hast Du den Schluessel an Index 2 zusaetzlich eingetragen? War das vor oder nach dem assignHmKey? Eigentlich reicht es, ihn an Index 1 zu setzen.

Zitat

  • Den Schlüssel zum Rollladenaktor (HM-LC-Bl1PBU-FM) übertragen:
    set [device-name] assignHmKey
  • AES für das Gerät eingeschaltet:
    set [device-name] sign on
Hoert sich so an, als ob der eigene Schluessel gesetzt wurde.

Zitat

     2015-06-27 19:52:37   aesKeyNbr       02


AES wird mit dem eigenen Schluessel an Index 1 genutzt (aesKeyNbr hat immer den doppelten Wert des echten Index).

Zitat
Hab ich das richtig gemacht?
Und ist jetzt AES für das Gerät aktiviert?

Ja, nur der Schluessel an Index 2 ist komisch. War der schon beim assignHmKey gesetzt? Dann sollte aesKeyNbr eigentlich 04 sein...

Gruss
  Michael

All-Ex

Danke für Deine Antwort!

Zitat von: mgernoth am 27 Juni 2015, 23:33:51
Warum und wann hast Du den Schluessel an Index 2 zusaetzlich eingetragen? War das vor oder nach dem assignHmKey? Eigentlich reicht es, ihn an Index 1 zu setzen.
Ich habe es in der Reihenfolge wie oben angegeben gemacht, also erst 2 Schlüssel gesetzt, dann assignHmKey gemacht.

Den Schlüssel an Index 2 hab ich aufgrund eines Forumsbeitrags in einem anderen Thread gesetzt...

Zitat von: mgernoth am 24 Juni 2015, 21:10:05
Nein, eher so:


attr HMLAN1 hmKey 01:supergeheimerschlüssel
attr HMLAN1 hmKey2 02:supergeheimerschlüssel


Und ich wuerde nicht noch hoehere Indizes vergeben, das Geraet fragt nur nach Index 2.

Gruss
  Michael


Das trifft bei mir aber evtl. nicht zu, da ich vorher keine Verschlüsselung hatte. Ich möchte von unverschlüsselt auf verschlüsselt umstellen und nicht den Schlüssel wechseln.

Dann kann ich das hmKey2 Attribut ja wieder löschen oder?

Alex

All-Ex

Zitat von: frank am 27 Juni 2015, 22:00:30
sniffe die aktionen nach "homematic-art", da sollte man es erkennen.
Habe das Logging auf den Rollladenaktor (rollo.og.az, ID 338BF7) und das hmlan1 (ID 8CF27A) beschränkt: attr hmlan1 logIDs rollo.og.az,8CF27A

Wenn ich dem Rollo per FHEM ein Down sende, kommt das raus:
2015.06.28 08:44:14.503 0: HMLAN_Send:  hmlan1 S:S38E8C175 stat:  00 t:00000000 d:01 r:38E8C175 m:14 A011 8CF27A 338BF7 020120
2015.06.28 08:44:14.681 0: HMLAN_Parse: hmlan1 R:E338BF7   stat:0100 t:02EE9D80 d:FF r:FFD4     m:14 A002 338BF7 8CF27A 0419076C2173F502
2015.06.28 08:44:14.918 0: HMLAN_Parse: hmlan1 R:R38E8C175 stat:0021 t:02EE9D85 d:01 r:FFD4     m:14 8002 338BF7 8CF27A 0101342040E17C145C
2015.06.28 08:44:19.102 0: HMLAN_Parse: hmlan1 R:E338BF7   stat:0000 t:02EEAED4 d:FF r:FFD6     m:15 A410 338BF7 8CF27A 06012000


Woran sehe ich, ob AES aktiviert ist?

mgernoth

Hi,

Zitat von: All-Ex am 28 Juni 2015, 00:00:58
Ich habe es in der Reihenfolge wie oben angegeben gemacht, also erst 2 Schlüssel gesetzt, dann assignHmKey gemacht.

Ok. Interessant, dass der HMLAN dann den Key an Index 1 uebertragen hat. Komische eQ-3-Firmware...

Zitat
Den Schlüssel an Index 2 hab ich aufgrund eines Forumsbeitrags in einem anderen Thread gesetzt...

Das trifft bei mir aber evtl. nicht zu, da ich vorher keine Verschlüsselung hatte. Ich möchte von unverschlüsselt auf verschlüsselt umstellen und nicht den Schlüssel wechseln.

Ja, in dem Thread hat das Geraet explizit nach einem Schluessel an Index 2 gefragt, weswegen das notwenidg war. In Deinem Fall reicht der Index 1 (ich habe bei mir auch nur einen Schluessel an Index 1 definiert).

Zitat
Dann kann ich das hmKey2 Attribut ja wieder löschen oder?

Ja, genau.

Zitat von: All-Ex am 28 Juni 2015, 08:52:06

2015.06.28 08:44:14.681 0: HMLAN_Parse: hmlan1 R:E338BF7   stat:0100 t:02EE9D80 d:FF r:FFD4     m:14 A002 338BF7 8CF27A 0419076C2173F502


Letzte 8 Bytes: Challenge 19076C2173F5 fuer Key 1 (aesKeyNbr 02).

Zitat

2015.06.28 08:44:14.918 0: HMLAN_Parse: hmlan1 R:R38E8C175 stat:0021 t:02EE9D85 d:01 r:FFD4     m:14 8002 338BF7 8CF27A 0101342040E17C145C


stat: xx2x: AES accepted
Letzte 4 Byte: E17C145C - Crypto-Response des Geraets.

Zitat
Woran sehe ich, ob AES aktiviert ist?

Du siehst das daran, dass das Reading aesKeyNbr (kommt aus der Challenge-Nachricht) den erwarteten Wert hat, das Geraet geschaltet hat und der Status accepted ist (das landet im Reading aesCommToDev, ist dann auf ok).

Gruss
  Michael

Ralli

Gut. Nun nehmen wir an, wir haben

attr hmlan hmkey 01:abcdefg...

gesetzt und alle Geräte erfolgreich aktualisiert. Sie fordern brav den aesKeyNbr 02 an.

Wenn nun wiederum ein neuer Key gesetzt werden soll, machen wir das dann aber schon wie folgt?

attr hmlan hmkey2 02:gfedcba....

und ab dafür mit set xyz assignHmKey?
Gruß,
Ralli

Proxmox 8.2 Cluster mit HP ED800G2i7, Intel NUC11TNHi7+NUC7i5BNH, virtualisiertes fhem 6.3 dev, virtualisierte RaspberryMatic (3.75.7.20240420) mit HB-RF-ETH 1.3.0 / RPI-RF-MOD, HM-LAN-GW (1.1.5) und HMW-GW, FRITZBOX 7490 (07.57), FBDECT, Siri und Alexa

mgernoth

Hallo Ralli,

Zitat von: Ralli am 28 Juni 2015, 12:17:03
Wenn nun wiederum ein neuer Key gesetzt werden soll, machen wir das dann aber schon wie folgt?

attr hmlan hmkey2 02:gfedcba....

und ab dafür mit set xyz assignHmKey?

Ja.

Gruss
  Michael

Sebastian89

#40
Zitat von: mgernoth am 09 Juni 2015, 00:00:42
Hallo,

ich habe jetzt mal das Challenge-Response in 10_CUL_HM.pm reingehackt und einen Diff hier angehaengt. Damit kann man jetzt AES-Geraete bedienen (bisher nur mit statisch konfiguriertem Defaultkey).

Leider fehlt mir mehr Wissen ueber die Internas von CUL_HM um das schoen zu machen, evtl. kann Martin sich das mal anschauen und es so hinbauen, dass es zum Rest von CUL_HM passt, man den Schluessel auch setzen kann (z.Zt wird bei einer Schluesselnummer != 00 ein Fehler ausgegeben und dann trotzdem der hartkodierte Defaultschluessel verwendet) und in der Response die ersten 6 Bytes auf einen Zeitstempel gesetzt werden. Und das ganze sollte nur ausgefuehrt werden, wenn es auch wirklich von einem CUL-Device empfangen wurde...


2015-06-08 23:53:03 CUL_HM Steckdose_Test set_toggle
2015-06-08 23:53:03 CUL COC SND L:0E N:01 F:A0 CMD:11 SRC:68EA14 DST:Steckdose_Test 0201000000 (SET CHANNEL:0x01 VALUE:0x00 RAMPTIME:2) (,BIDI,RPTEN)
2015-06-08 23:53:03 CUL COC RCV L:11 N:01 F:A0 CMD:02 SRC:Steckdose_Test DST:68EA14 0463906CE1765E00 (AES_req Para1:0x6390 Para2:0x6CE1 Para3:0x765E keyNo:0x00) (,BIDI,RPTEN)
2015-06-08 23:53:03 CUL COC SND L:19 N:01 F:A0 CMD:03 SRC:68EA14 DST:Steckdose_Test ce1968c7333714ffc23603be6db057d1 (AES reply DATA:0xce1968c7333714ffc23603be6db057d1) (,BIDI,RPTEN)
2015-06-08 23:53:03 CUL COC SND L:0A N:01 F:80 CMD:02 SRC:68EA14 DST:Steckdose_Test 00 (ACK) (,RPTEN)
2015-06-08 23:53:03 CUL_HM Steckdose_Test CUL_HM signing request for As0E01A01168EA141ED0170201000000 challenge:  63906CE1765E kNo: 00
2015-06-08 23:53:03 CUL_HM Steckdose_Test aesKeyNbr: 00
2015-06-08 23:53:03 CUL COC RCV L:12 N:01 F:80 CMD:02 SRC:Steckdose_Test DST:68EA14 010100001EE57EFEE6 (ACK_STATUS CHANNEL:0x01 STATUS:0x00 UP:0 DOWN:0 LOWBAT:0 RSSI:-30) (,RPTEN)
2015-06-08 23:53:03 CUL_HM Steckdose_Test deviceMsg: off (to COC)
2015-06-08 23:53:03 CUL_HM Steckdose_Test level: 0
2015-06-08 23:53:03 CUL_HM Steckdose_Test pct: 0
2015-06-08 23:53:03 CUL_HM Steckdose_Test off
2015-06-08 23:53:03 CUL_HM Steckdose_Test timedOn: off


Gruss
  Michael

Guten Tag,

zu edukativen Zwecken versuche ich das HomeMatic AES komplett nachzuvollziehen und stehe dabei etwas auf dem Schlauch.
Das zitierte Beispiel von Michael konnte ich nachvollziehen, sobald ich das Verfahren aber im Anlernprozess meines optischen Fensterkontaktes anwenden will scheitere ich.

Zuerst nun die Details des Vorgangs, den Michael aufgezeichnet hat:
Schaltbefehl: 0E 01 A0 11 68EA14 1ED017 0201000000
Challenge-Paket vom Aktor/Sensor: 11 01 A0 02 1ED017 68EA14 04 63906CE1765E 00
Es wird der Default-Key verwendet.

CHALLENGE = 0x63906CE1765E
KEY = Default-Key XOR CHALLENGE = 0xc7731927c6c1d185f27c4e96fc273ae4
R = 0x2a0000000000 (+) 0x01a01168ea141ed01702 = 0x2a000000000001a01168ea141ed01702
R = AES_ECB(KEY, R) = 0xe57efee64eaac35ae7751856a1c7c3ed
PARAMS = 0x01000000
R = R XOR PARAMS = 0xe47efee64eaac35ae7751856a1c7c3ed
R = AES_ECB(KEY, R) = 0xce1968c7333714ffc23603be6db057d1

Dies ist so auch im Zitat ersichtlich.
Das gleiche jetzt für einen Fall meines Sensors. Ich möchte das Config-Start-Index Paket senden.
Schaltbefehl: 10 01 a0 01 b413fe 363c21 00050000000000
Challenge-Paket: 01 a0 02 363c21 b413fe 04 c97d08a5b9f5 00
Es wird der Default-Key verwendet.

CHALLENGE = 0xc97d08a5b9f5
KEY = Default-Key XOR CHALLENGE = 0x6d9e7d63096ad185f27c4e96fc273ae4
R = 0x2a0000000000 (+) 0x01a001b413fe363c2100 = 0x2a000000000001a001b413fe363c2100
R = AES_ECB(KEY, R) = 0x874b83b4cd9bdea06bdec2788cda1388
PARAMS = 0x050000000000
R = R XOR PARAMS = 0x824b83b4cd9bdea06bdec2788cda1388
R = AES_ECB(KEY, R) = 0xff2fb554a270978dfbabe531e968b151

Das Antwortpaket sieht dann so aus: 19 01 a0 03 b413fe 363c21 ff2fb554a270978dfbabe531e968b151
Darauf bekomme ich aber keinerlei Antwort mehr vom Sensor.
Ich wäre wirklich dankbar, wenn jemand eine Idee dazu hätte.

Mit freundlichen Grüßen
Sebastian

EDIT: copy&paste Fehler korrigiert

mgernoth

Hallo Sebastian,

Zitat
R = 0x2a0000000000 (+) 0x01a001b413fe363c2100 = 0x2a000000000001a01168ea141ed01702

Das glaube ich nicht, hier glaube ich an einen Copy&Paste Fehler ;-)

Zitat von: Sebastian89 am 23 September 2015, 12:28:56
Das gleiche jetzt für einen Fall meines Sensors. Ich möchte das Config-Start-Index Paket senden.
Schaltbefehl: 10 01 a0 01 b413fe 363c21 00050000000000
Challenge-Paket: 01 a0 02 363c21 b413fe 04 c97d08a5b9f5 00
Es wird der Default-Key verwendet.

CHALLENGE = 0xc97d08a5b9f5
KEY = Default-Key XOR CHALLENGE = 0x6d9e7d63096ad185f27c4e96fc273ae4
R = 0x2a0000000000 (+) 0x01a001b413fe363c2100 = 0x2a000000000001a001b413fe363c2100
R = AES_ECB(KEY, R) = 0x874b83b4cd9bdea06bdec2788cda1388
PARAMS = 0x050000000000
R = R XOR PARAMS = 0x824b83b4cd9bdea06bdec2788cda1388
R = AES_ECB(KEY, R) = 0xff2fb554a270978dfbabe531e968b151

Das Antwortpaket sieht dann so aus: 19 01 a0 03 b413fe 363c21 ff2fb554a270978dfbabe531e968b151

Wenn ich Deine Daten in meinen AES-Tester reinhacke bekomme ich folgendes:


msg  0x0000: 01 a0 01 b4 13 fe 36 3c 21 00 05 00 00 00 00 00   ......6<!.......

chl  0x0000: 01 a0 02 36 3c 21 b4 13 fe 04 c9 7d 08 a5 b9 f5   ...6<!.....}....
chl  0x0010: 00                                                .

rsp  0x0000: 01 a0 03 b4 13 fe 36 3c 21 ff 2f b5 54 a2 70 97   ......6<!./.T.p.
rsp  0x0010: 8d fb ab e5 31 e9 68 b1 51                        ....1.h.Q

key  0x0000: 6d 9e 7d 63 09 6a d1 85 f2 7c 4e 96 fc 27 3a e4   m.}c.j...|N..':.

IV   0x0000: 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................

P    0x0000: ff 2f b5 54 a2 70 97 8d fb ab e5 31 e9 68 b1 51   ./.T.p.....1.h.Q

Pd   0x0000: 82 4b 83 b4 cd 9b de a0 6b de c2 78 8c da 13 88   .K......k..x....

Pd^  0x0000: 87 4b 83 b4 cd 9b de a0 6b de c2 78 8c da 13 88   .K......k..x....

Pd^d 0x0000: 2a 00 00 00 00 00 01 a0 01 b4 13 fe 36 3c 21 00   *...........6<!.

exp  0x0000: 01 a0 01 b4 13 fe 36 3c 21 00                     ......6<!.

res  0x0000: 01 a0 01 b4 13 fe 36 3c 21 00                     ......6<!.


MATCH!

Please be so kind and add the following bytes to the ACK message: 874b83b4


Das sieht also erstmal ganz gut aus :-)

Zitat
Darauf bekomme ich aber keinerlei Antwort mehr vom Sensor.
Ich wäre wirklich dankbar, wenn jemand eine Idee dazu hätte.

Hmm, das ist merkwürdig, eigentlich sollte der Sensor das Frame so akzeptieren. Ich kann mir eigentlich nur vorstellen, dass da irgendwas mit dem Timing nicht passt. Mit meiner Implementierung habe ich schonmal einen SCo erfolgreich angelernt und konfiguriert und die würde das gleiche Ergebnis bringen (zumindest bis auf den Zeitstempel).

Viele Grüße
  Michael

Sebastian89

Hallo Michael,

vielen Dank für deine Mühe. Jegliche andere Kommunikation hat mit meinem Aufbau bisher super funktioniert, daher würde ich einen Timing-Fehler eigentlich ausschließen.
Hättest du vielleicht die Möglichkeit den Anlernprozess des optischen Fensterkontakts mit einem bekannten Key zu loggen? Das wäre ultra hilfreich :-)
Eins noch, beim Drücken der Anlerntaste am Sensor bestätigt dieser direkt mit grüner LED, ich hätte eigentlich erwartet, dass er bis zum Config-End wartet?

Danke und mit freundlichen Grüßen
Sebastian

mgernoth

Hallo Sebastian,

Zitat von: Sebastian89 am 23 September 2015, 13:13:53
Hättest du vielleicht die Möglichkeit den Anlernprozess des optischen Fensterkontakts mit einem bekannten Key zu loggen? Das wäre ultra hilfreich :-)

Anlernprozess mit Defaultkey:


2015.09.23 13:33:49.889 4: CUL_Parse: COC A 0D 00 8610 37BBCE 000000 0601C80E3B -44.5
2015.09.23 13:33:50.158 4: CUL_Parse: COC A 0C 01 8641 37BBCE 000000 0101C83B -44.5
2015.09.23 13:34:02.261 4: CUL_Parse: COC A 1A 02 8400 37BBCE 000000 1000C74D455130323833353135808101013F -42.5
2015.09.23 13:34:02.486 4: CUL_send:  COCAs 10 03 A001 68EA14 37BBCE 00050000000000
2015.09.23 13:34:02.666 4: CUL_Parse: COC A 11 03 A002 37BBCE 68EA14 040C8C3D87E2EA003C -44
2015.09.23 13:34:02.768 4: CUL_send:  COCAs 19 03 A003 68EA14 37BBCE bbc0f59a516ad75880ecb04da31a0b90
2015.09.23 13:34:02.948 4: CUL_Parse: COC A 0E 03 8002 37BBCE 68EA14 0084E3C08E3B -44.5
2015.09.23 13:34:03.049 4: CUL_send:  COCAs 13 04 A001 68EA14 37BBCE 000802010A680BEA0C14
2015.09.23 13:34:03.230 4: CUL_Parse: COC A 11 04 A002 37BBCE 68EA14 04664939D95741002B -52.5
2015.09.23 13:34:03.332 4: CUL_send:  COCAs 19 04 A003 68EA14 37BBCE ba9caa5967dd5c370fddd3e28d6d42d8
2015.09.23 13:34:03.512 4: CUL_Parse: COC A 0E 04 8002 37BBCE 68EA14 000680474037 -46.5
2015.09.23 13:34:03.613 4: CUL_send:  COCAs 0B 05 A001 68EA14 37BBCE 0006
2015.09.23 13:34:03.790 4: CUL_Parse: COC A 11 05 A002 37BBCE 68EA14 049032B7B781B40037 -46.5
2015.09.23 13:34:03.892 4: CUL_send:  COCAs 19 05 A003 68EA14 37BBCE 6dfa94dfe3861466d45323672e4ac76f
2015.09.23 13:34:04.093 4: CUL_Parse: COC A 0E 05 8002 37BBCE 68EA14 00828E667D37 -46.5


Zitat
Eins noch, beim Drücken der Anlerntaste am Sensor bestätigt dieser direkt mit grüner LED, ich hätte eigentlich erwartet, dass er bis zum Config-End wartet?

Hmm, er hat gerade bis zum Ende geblinkt, bilde ich mir ein.

Viele Gruesse
  Michael

Sebastian89

Hallo Michael,

vielen Dank für deine kompetente Hilfe.
Es gibt tatsächlich ein Timeout bzgl. der AES-Antwort. Ich sende jetzt etwas früher und alles funktioniert wie erwartet.

Mit freundlichen Grüßen
Sebastian

moritz

Moin, ich versuche gerade die eq3-Firmware-Dateien zu verstehen, bin soweit gekommen, dass diverse Dateien in dem gleichen groben Format sind:

Blöcke von "LLLL daten CCCC" wobei LLLL die länge der Daten ist, und CCCC ein crc16 über die Daten.

Die Daten sind immer vielfache von 16 lang.

Der erste Block ist meistens zwischen 12 und 17 *16 bytes lang, danach folgt immer ein 1*16 block abwechselnd mit einem 17*16 block - eine pagesize ist 16*16 bytes, ich vermute mal die 17*16 kommen daher durch einen AES IV header oder so etwas.

In dem Format sind die .eq3-Dateien sowie auch die CCU-Firmwares (hss_comm.enc etc.)

Kennt sich jemand damit aus hier zufällig?