Implementierung der ZWAVE Command Class SECURITY (0x98, AES Verschlüsselung)

Begonnen von A.Harrenberg, 27 Juni 2015, 21:25:37

Vorheriges Thema - Nächstes Thema

A.Harrenberg

Hi Rudi,

weiterer Vorschlag:
die eigentliche foreach Schleife mit parseHook in eine kleine Funktion auslagern, und DREI %parseHook definieren
Dann diese Funktion mit den verschiedenen Hooks aufrufen:

-> %zwave_parseHookPreOnly (wird vor dem normalen Parsen ausgeführt, falls !=0 wird der Rest übersprungen)
-> %zwave_parseHookPre (wird vor dem normalen Parsen ausgeführt)
das normale Parsen
-> %zwave_parseHookPost (wie bisher nach dem normalen Parsen)

Ich kann die möglichen Anwendungsfälle bisher nicht wirklich abschätzen, ich bin momentan noch nicht mal sicher ob sich die SECURE-Inklusion programmtechnisch damit wirklich vereinfachen lässt, aber mit so einem Konstrukt wäre man schon SEHR flexibel. Damit könnte man für jeden Parse eine Alternative oder eine Pre und/oder Post Behandlung definieren.

AssociationRequestAll lässt sich aktuell aber nicht so einfach nach vorne schieben, da fehlt ja dann die normale Auswertung, außerdem wird im ParseHook momentan kein $matched incrementiert, da kriegt man dann ein "UNPARSED"... Schau ich mir aber noch mal an...

Gruß,
Andreas.
FB 7360, Homematic und ZWave
Support for ZWave-SECURITY

A.Harrenberg

Hi Rudi,

ich habe das jetzt mit den drei Hooks mal so umgesetzt...
Kannst Du Dir ja bei Gelegenheit mal anschauen. AssociationRequestAll funktioniert damit jedenfalls weiterhin, allerdings nur wenn das normale Parsen auch ausgeführt wird.
Ich schau jetzt mal ob sich das für die SECURE-Inclusion als brauchbar erweist.

Gruß,
Andreas.
FB 7360, Homematic und ZWave
Support for ZWave-SECURITY

rudolfkoenig

Sorry, aber 3 Hooks sind mir 2 zu viel, insb. wenn ich nicht weiss, ob sie je benoetigt werden.

Ich habe die parseHook Aufrufe vor dem normalen Parse geholt, und jetzt ist auch eine "Veto" Funktionalitaet drin, was sich aber von deinem "matched" unterscheidet: die aufgerufene Funktion muss 1 (bzw. != 0) zurueckliefern, damit es keine weitere Verarbeitung gibt. associationRequestAll funktioniert weiterhin.

A.Harrenberg

Hi Rudi,

also ich bin eigentlich gerade dabe den Ablauf der Secure-Inklusion umzubauen und habe dazu bereits HookOnly und HookPost genutzt... Wobei ich auf HookPost aber wahrscheinlich verzichten kann, das würde auch mit HookPre funktionieren...

Wenn die Funktion von HookOnly mit dem "Veto" möglich ist, dann sollte ich das anpassen können.

Ich werde mir das mal ansehen allerdings wird das DIFF dazu sehr wüst aussehen.

Gruß,
Andreas.


FB 7360, Homematic und ZWave
Support for ZWave-SECURITY

rudolfkoenig

ZitatWenn die Funktion von HookOnly mit dem "Veto" möglich ist, dann sollte ich das anpassen können.
Sicher, einfach 1 zurueckliefern, dann wird kein Event generiert.
Ist zwar noch nicht getestet, aber wenn es nicht gehen sollte, dann wird es umgehend gefixt.

A.Harrenberg

Hi Rudi,

so, habe jetzt mal ein wenig im Security-Code und bei den Befehlen aufgeräumt...
Patch ist angehängt, aber nicht erschrecken, der Diff sieht wilder aus als es ist... ;-)

Ich habe den Ablauf bei der Inklusion jetzt über zwave_parseHook Ketten gelöst und die ganzen Sonderbehandlungen in kleine Funktionen ausgelagert die dann von dem parseHook aufgerufen werden. Das ist wesentlich aufgeräumter als die "Krücke" mit dem $hash->secstatus counter...

Das Initiieren der secure-Inklusion in ZWave_Parse mit den ganzen Sicherheitsabfragen habe ich jetzt in die secureInclusion funktion geschoben, damit sieht ZWave_Parse schon mal viel aufgeräumter aus.

Außerdem habe ich fast alle Befehle aus SET wieder ausgebaut und schreibe die jetzt direkt mit addToSendStack. Damit entfallen dann die unnötigen und eigentlich nicht nutzbaren Befehle im Menü. Außerdem spare ich mir da den ganzen Ablauf in ZWave_Cmd.

Dokumentationsblock ist auch angepasst.

Gruß,
Andreas.
FB 7360, Homematic und ZWave
Support for ZWave-SECURITY

rudolfkoenig


rudolfkoenig

Wollte meine ersten Schritte mit SECURITY machen, und bin dabei gleich auf 3 Probeme gestossen:

- der Aeotec SmartSwitch 6 meldet kein SECURITY im NIF. Wenn man nach der Version der Klasse 98 fragt, dann kommt 1 zurueck, pepper sagt, dass der as6 Security kann, und meine Experimente bestaetigen das auch. Frage: wie ermoeglichen wir ein Secure inclusion? Meine beste Idee ist "set zwNode addNode onSecForce". Bessere Ideen? Zum Experimentieren habe ich die Pruefung auf SECURITY in classes abgeschaltet (und natuerlich nicht eingecheckt).

- die Laenge der Nachricht bei secNetworkkeySet ist 93 Bytes, das geht mit ZWCUL nicht, da das Firmware versucht die komplette Nachricht ins CC1101 Puffer (64 Bytes) zu stecken. Ich fuerchte, da muss ich was umbauen, damit das funktionieren kann.

- Secure-Inclusion ging schief, weil der AS6 zweimal ein Nonce angefordert hat. Er hat danach auch jeweils eine mit dem (vermutlich) "richtigen" Nonce verschluesselte Meldung zurueckgeschickt, FHEM hat aber beide Nachrichten verworfen, weil die Erste nicht mit dem letzten Nonce verschluesselt war, und die Zweite, weil beim Verwerfen der ersten Nachricht die zweite Nonce vernichtet wurde. @Andreas: soll ich das anschauen, oder willst du?

- Interessanter Fakt: removeNode braucht keine funktionierende Verschluesselung, aber immerhin einen Knopfdruck :)

Nexus1211

Hallo Rudi,

beim Inkludieren in Secure Mode bitte den Knopf 2 Mal hintereinander (innerhalb einer Sekunde) drücken statt 1 Mal für normale Inklusion.
Hoffe das hilft

A.Harrenberg

Hi Rudi,
Zitat von: rudolfkoenig am 13 März 2016, 20:34:44
Wollte meine ersten Schritte mit SECURITY machen, und bin dabei gleich auf 3 Probeme gestossen:

- der Aeotec SmartSwitch 6 meldet kein SECURITY im NIF. Wenn man nach der Version der Klasse 98 fragt, dann kommt 1 zurueck, pepper sagt, dass der as6 Security kann, und meine Experimente bestaetigen das auch. Frage: wie ermoeglichen wir ein Secure inclusion? Meine beste Idee ist "set zwNode addNode onSecForce". Bessere Ideen? Zum Experimentieren habe ich die Pruefung auf SECURITY in classes abgeschaltet (und natuerlich nicht eingecheckt).
Ich hoffe das erledigt sich wenn das mit dem "zwei mal drücken" funktionieren sollte und das Ding dann auch Security meldet.

Zitat von: rudolfkoenig am 13 März 2016, 20:34:44
- die Laenge der Nachricht bei secNetworkkeySet ist 93 Bytes, das geht mit ZWCUL nicht, da das Firmware versucht die komplette Nachricht ins CC1101 Puffer (64 Bytes) zu stecken. Ich fuerchte, da muss ich was umbauen, damit das funktionieren kann.
Oh, in der Tat sind die Nachrichten mit Security recht lang. Das Empfangen von langen, zweigeteilten Nachrichten ist ja implementiert, das teilen in zwei lange Nachrichten momentan allerdings noch nicht. Das mit dem Buffer von ZWCul ist natürlich jetzt aufwändiger. Für den Empfangsbuffer wird mMn GDO2 genutzt, ist GDO0 verbunden und könnte dann für den Sendbuffer verwendet werden?

Zitat von: rudolfkoenig am 13 März 2016, 20:34:44
- Secure-Inclusion ging schief, weil der AS6 zweimal ein Nonce angefordert hat. Er hat danach auch jeweils eine mit dem (vermutlich) "richtigen" Nonce verschluesselte Meldung zurueckgeschickt, FHEM hat aber beide Nachrichten verworfen, weil die Erste nicht mit dem letzten Nonce verschluesselt war, und die Zweite, weil beim Verwerfen der ersten Nachricht die zweite Nonce vernichtet wurde. @Andreas: soll ich das anschauen, oder willst du?
Momentan habe ich leider keine Zeit mich darum zu kümmern... Ich bin eben erst aus dem Ski-Urlaub zurückgekommen und habe jetzt noch drei Tage Zeit eine längere Dienstreise vorzubereiten. Danach bin ich dann bis Anfang Mai nicht da... Danach könnte ich mich wieder darum kümmern, voher geht nicht.

Der Ablauf mit den Nonce ist nicht wirklich "sicher". Ich speichere immer nur die letzte, wenn da eine andere Übertragung dazwischen kommt dann geht das ziemlich sicher schief...

Gruß,
Andreas.
FB 7360, Homematic und ZWave
Support for ZWave-SECURITY

rudolfkoenig

Doppelclick fuer Secure-Inclusion bei der AS6 funktioniert, danke fuer den Hinweis. Und die letzten sendStack Aenderungen scheinen bei Security keinen Schaden zu verursachen: schalten klappt, auch ein "get versionClassAll" geht problemlos und schnell ueber die Buehne.