| 761 | |
| 762 | |
| 763 | class ZigbeeAppCommandPayload(Packet): |
| 764 | name = "Zigbee Application Layer Command Payload" |
| 765 | fields_desc = [ |
| 766 | ByteEnumField("cmd_identifier", 1, { |
| 767 | 1: "APS_CMD_SKKE_1", |
| 768 | 2: "APS_CMD_SKKE_2", |
| 769 | 3: "APS_CMD_SKKE_3", |
| 770 | 4: "APS_CMD_SKKE_4", |
| 771 | 5: "APS_CMD_TRANSPORT_KEY", |
| 772 | 6: "APS_CMD_UPDATE_DEVICE", |
| 773 | 7: "APS_CMD_REMOVE_DEVICE", |
| 774 | 8: "APS_CMD_REQUEST_KEY", |
| 775 | 9: "APS_CMD_SWITCH_KEY", |
| 776 | # TODO: implement 10 to 13 |
| 777 | 10: "APS_CMD_EA_INIT_CHLNG", |
| 778 | 11: "APS_CMD_EA_RSP_CHLNG", |
| 779 | 12: "APS_CMD_EA_INIT_MAC_DATA", |
| 780 | 13: "APS_CMD_EA_RSP_MAC_DATA", |
| 781 | 14: "APS_CMD_TUNNEL", |
| 782 | 15: "APS_CMD_VERIFY_KEY", |
| 783 | 16: "APS_CMD_CONFIRM_KEY" |
| 784 | }), |
| 785 | # SKKE Commands |
| 786 | ConditionalField(dot15d4AddressField("initiator", 0, |
| 787 | adjust=lambda pkt, x: 8), |
| 788 | lambda pkt: pkt.cmd_identifier in [1, 2, 3, 4]), |
| 789 | ConditionalField(dot15d4AddressField("responder", 0, |
| 790 | adjust=lambda pkt, x: 8), |
| 791 | lambda pkt: pkt.cmd_identifier in [1, 2, 3, 4]), |
| 792 | ConditionalField(StrFixedLenField("data", 0, length=16), |
| 793 | lambda pkt: pkt.cmd_identifier in [1, 2, 3, 4]), |
| 794 | # Confirm-key command |
| 795 | ConditionalField( |
| 796 | ByteEnumField("status", 0, _ApsStatusValues), |
| 797 | lambda pkt: pkt.cmd_identifier == 16), |
| 798 | # Common fields |
| 799 | ConditionalField( |
| 800 | ByteEnumField("key_type", 0, _TransportKeyKeyTypes), |
| 801 | lambda pkt: pkt.cmd_identifier in [5, 8, 15, 16]), |
| 802 | ConditionalField(dot15d4AddressField("address", 0, |
| 803 | adjust=lambda pkt, x: 8), |
| 804 | lambda pkt: pkt.cmd_identifier in [6, 7, 15, 16]), |
| 805 | # Transport-key Command |
| 806 | ConditionalField( |
| 807 | StrFixedLenField("key", None, 16), |
| 808 | lambda pkt: pkt.cmd_identifier == 5), |
| 809 | ConditionalField( |
| 810 | ByteField("key_seqnum", 0), |
| 811 | lambda pkt: (pkt.cmd_identifier == 5 and |
| 812 | pkt.key_type in [0x01, 0x05])), |
| 813 | ConditionalField( |
| 814 | dot15d4AddressField("dest_addr", 0, adjust=lambda pkt, x: 8), |
| 815 | lambda pkt: ((pkt.cmd_identifier == 5 and |
| 816 | pkt.key_type not in [0x02, 0x03]) or |
| 817 | pkt.cmd_identifier == 14)), |
| 818 | ConditionalField( |
| 819 | dot15d4AddressField("src_addr", 0, adjust=lambda pkt, x: 8), |
| 820 | lambda pkt: (pkt.cmd_identifier == 5 and |
nothing calls this directly
no test coverage detected
searching dependent graphs…