AES Reverseengineering

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

Vorheriges Thema - Nächstes Thema

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.4 Cluster mit HP ED800G2i7, Intel NUC11TNHi7+NUC7i5BNH, virtualisiertes fhem 6.4 dev, virtualisierte RaspberryMatic (3.81.5.20250527) mit HB-RF-ETH 1.3.0 / RPI-RF-MOD, HM-LAN-GW (1.4.1) und HMW-GW, FRITZBOX 7490 (07.59), 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