summaryrefslogtreecommitdiff
path: root/common/lib/scammer/cm.py
diff options
context:
space:
mode:
Diffstat (limited to 'common/lib/scammer/cm.py')
-rw-r--r--common/lib/scammer/cm.py187
1 files changed, 187 insertions, 0 deletions
diff --git a/common/lib/scammer/cm.py b/common/lib/scammer/cm.py
new file mode 100644
index 0000000000..e83ffe4dfe
--- /dev/null
+++ b/common/lib/scammer/cm.py
@@ -0,0 +1,187 @@
+#!/usr/bin/python
+
+#############################################################################
+# Copyright (C) 2011 Spidcom
+#
+# All CM MME.
+#############################################################################
+
+from scapy.all import Packet
+from scapy.fields import *
+from common import HPAV_CCO_LEVEL, HPAV_PEKS, HPAV_PID, HPAV_KEY_TYPE
+from common import HPAV_RESULT
+from commonfields import *
+from scammer import MMEPayload
+
+class CM_UNASSOCIATED_STA_IND (MMEPayload):
+ """Handles the CM_UNASSOCIATED_STA.IND MME. """
+ name = "HomePlug AV CM_UNASSOCIATED_STA.IND"
+ fields_desc = [
+ HPAVNIDField ("nid", 0),
+ ByteEnumField ("cco_cap", 0, HPAV_CCO_LEVEL),
+ ]
+
+class CM_ENCRYPTED_PAYLOAD_IND (MMEPayload):
+ """Handles the CM_ENCRYPTED_PAYLOAD.IND MME."""
+ name = "HomePlug AV CM_ENCRYPTED_PAYLOAD.IND """
+ fields_desc = [
+ ByteEnumField ("peks", 0, HPAV_PEKS),
+ ByteField ("avln_status", 0),
+ ByteEnumField ("pid", 0, HPAV_PID),
+ LEShortField ("prn", 0),
+ ByteField ("pmn", 0),
+ BitField ("uuid", 0, 128),
+ ByteField ("length", 0),
+ ]
+
+class CM_BRG_INFO_REQ (MMEPayload):
+ """Handles the CM_BRG_INFO.REQ MME."""
+ name = "HomePlug AV CM_BRG_INFO.REQ """
+ fields_desc = [
+ ]
+
+class CM_BRG_INFO_CNF_bda (Packet):
+ """Handles CM_BRG_INFO.CNF bridge entry."""
+ name = "HomePlug AV CM_BRG_INFO.CNF bridge entry"""
+ fields_desc = [
+ MACField ("mac", ETHER_ANY),
+ ]
+
+ def extract_padding(self, s):
+ return "",s
+
+class CM_BRG_INFO_CNF (MMEPayload):
+ """Handles the CM_BRG_INFO.CNF MME."""
+ name = "HomePlug AV CM_BRG_INFO.CNF """
+ fields_desc = [
+ ByteField ("bsf", 0),
+ ByteField ("btei", 0),
+ FieldLenField ("nbda", None, count_of="bdas", fmt="B"),
+ PacketListField ("bdas", None, CM_BRG_INFO_CNF_bda,
+ count_from = lambda p: p.nbda),
+ ]
+
+class CM_SC_JOIN_REQ (MMEPayload):
+ """Handles the CM_SC_JOIN.REQ MME."""
+ name = "HomePlug AV CM_SC_JOIN.REQ """
+ fields_desc = [
+ BitField ("cco_cap", 0, 2),
+ BitField ("rsvd", 0, 6),
+ ]
+
+class CM_SC_JOIN_CNF (MMEPayload):
+ """Handles the CM_SC_JOIN.CNF MME."""
+ name = "HomePlug AV CM_SC_JOIN.CNF """
+ fields_desc = [
+ HPAVNIDField ("nid", 0),
+ BitField ("avln_status", 0, 1),
+ BitField ("cco_cap", 0, 2),
+ BitField ("proxy_cap", 0, 1),
+ BitField ("backup_cco_cap", 0, 1),
+ BitField ("cco_status", 0, 1),
+ BitField ("pco_status", 0, 1),
+ BitField ("backup_cco_status", 0, 1),
+ ]
+
+class CM_GET_KEY_REQ (MMEPayload):
+ """Handles the CM_GET_KEY.REQ MME."""
+ name = "HomePlug AV CM_GET_KEY.REQ """
+ fields_desc = [
+ ByteEnumField ("req_type", 0, {0: "DIRECT", 1: "RELAYED"}),
+ ByteEnumField ("req_keytype", 0, HPAV_KEY_TYPE),
+ HPAVNIDField ("nid", 0),
+ IntField ("my_nonce", 0),
+ ByteField ("pid", 0),
+ LEShortField ("prn", 0),
+ ByteField ("pmn", 0),
+ ConditionalField (StrLenField ("hash_key", "", length_from=384),
+ lambda p:p.req_keytype==4),
+ ]
+
+class CM_GET_KEY_CNF (MMEPayload):
+ """Handles the CM_GET_KEY.CNF MME."""
+ name = "HomePlug AV CM_GET_KEY.CNF """
+ fields_desc = [
+ ByteEnumField ("result", 0, HPAV_RESULT),
+ ByteEnumField ("req_keytype", 0, HPAV_KEY_TYPE),
+ IntField ("my_nonce", 0),
+ IntField ("your_nonce", 0),
+ HPAVNIDField ("nid", 0),
+ ByteField ("eks", 0),
+ ByteField ("pid", 0),
+ LEShortField ("prn", 0),
+ ByteField ("pmn", 0),
+ ConditionalField (BitField ("key", 0, 176),
+ lambda p:p.req_keytype!=4),
+ ConditionalField (BitField ("hash_key", 0, 3072),
+ lambda p:p.req_keytype==4),
+ ]
+
+class CM_NW_STATS_REQ (MMEPayload):
+ """Handles the CM_NW_STATS.REQ MME."""
+ name = "HomePlug AV CM_NW_STATS.REQ """
+ fields_desc = [
+ ]
+
+class CM_NW_STATS_CNF_station (Packet):
+ """Handles the CM_NW_STATS.CNF MME."""
+ name = "HomePlug AV CM_NW_STATS.CNF """
+ fields_desc = [
+ MACField ("mac", 0),
+ ByteField ("avgphydr_tx", 0),
+ ByteField ("avgphydr_rx", 0),
+ ]
+
+ def extract_padding(self, s):
+ return "",s
+
+class CM_NW_STATS_CNF (MMEPayload):
+ """Handles the CM_NW_STATS.CNF MME."""
+ name = "HomePlug AV CM_NW_STATS.CNF """
+ fields_desc = [
+ FieldLenField("num", None, count_of="stations",fmt="B"),
+ PacketListField ("stations", None, CM_NW_STATS_CNF_station,
+ count_from = lambda p: p.num)
+ ]
+
+class CM_NW_INFO_REQ (MMEPayload):
+ """Handles the CM_NW_INFO.REQ MME."""
+ name = "HomePlug AV CM_NW_INFO.REQ """
+ fields_desc = [
+ ]
+
+class CM_NW_INFO_CNF_nwinfo (Packet):
+ """Handles CM_NW_INFO_CNF.CNF network information entry."""
+ name = "HomePlug AV CM_NW_INFO_CNF.CNF network information entry"""
+ fields_desc = [
+ HPAVNIDField ("nid", 0),
+ ByteField ("snid", 0),
+ ByteField ("tei", 0),
+ ByteEnumField ("stationrole", 0, {
+ 0: "STA",
+ 1: "PROXY_COORDINATOR",
+ 2: "CCO" }),
+ MACField ("mac", ETHER_ANY),
+ ByteEnumField ("access", 0, {
+ 0: "IN_HOME",
+ 1: "ACCESS"
+ })
+ ]
+
+ def extract_padding(self, s):
+ return "",s
+
+class CM_NW_INFO_CNF (MMEPayload):
+ """Handles the CM_NW_INFO_CNF.CNF MME."""
+ name = "HomePlug AV CM_BRG_INFO.CNF """
+ fields_desc = [
+ FieldLenField ("numnws", None, count_of="nwinfo", fmt="B"),
+ PacketListField ("nwinfo", None, CM_NW_INFO_CNF_nwinfo,
+ count_from = lambda p: p.numnws),
+ ]
+
+if __name__ == '__main__':
+ # CM_UNASSOCIATED_STA_IND
+ m = CM_UNASSOCIATED_STA_IND (nid=0x123456789abc, cco_cap = 0)
+ p = CM_UNASSOCIATED_STA_IND (str (m))
+ p.show ()