Home | History | Annotate | Download | only in contrib
      1 #! /usr/bin/env python
      2 
      3 # This file is part of Scapy
      4 # Scapy is free software: you can redistribute it and/or modify
      5 # it under the terms of the GNU General Public License as published by
      6 # the Free Software Foundation, either version 2 of the License, or
      7 # any later version.
      8 #
      9 # Scapy is distributed in the hope that it will be useful,
     10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
     11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
     12 # GNU General Public License for more details.
     13 #
     14 # You should have received a copy of the GNU General Public License
     15 # along with Scapy. If not, see <http://www.gnu.org/licenses/>.
     16 
     17 ## Copyright (C) 2009 Adline Stephane <adline.stephane (at] gmail.com>
     18 ##
     19 
     20 # Partial support of RFC3971
     21 # scapy.contrib.description = SEND (ICMPv6)
     22 # scapy.contrib.status = loads
     23 
     24 from __future__ import absolute_import
     25 import socket
     26 
     27 from scapy.packet import *
     28 from scapy.fields import *
     29 from scapy.layers.inet6 import icmp6typescls, _ICMPv6NDGuessPayload, Net6
     30 
     31 send_icmp6typescls = { 11: "ICMPv6NDOptCGA",
     32                        12: "ICMPv6NDOptRsaSig",
     33                        13: "ICMPv6NDOptTmstp",
     34                        14: "ICMPv6NDOptNonce"
     35                      }
     36 icmp6typescls.update(send_icmp6typescls)
     37 
     38 class HashField(Field):
     39     def __init__(self, name, default):
     40         Field.__init__(self, name, default, "16s")
     41     def h2i(self, pkt, x):
     42         if isinstance(x, str):
     43             try:
     44                 x = in6_ptop(x)
     45             except socket.error:
     46                 x = Net6(x)
     47         elif isinstance(x, list):
     48             x = [Net6(e) for e in x]
     49         return x
     50     def i2m(self, pkt, x):
     51         return inet_pton(socket.AF_INET6, x)
     52     def m2i(self, pkt, x):
     53         return inet_ntop(socket.AF_INET6, x)
     54     def any2i(self, pkt, x):
     55         return self.h2i(pkt,x)
     56     def i2repr(self, pkt, x):
     57         return self.i2h(pkt, x)    # No specific information to return
     58 
     59 class ICMPv6NDOptNonce(_ICMPv6NDGuessPayload, Packet):
     60     name = "ICMPv6NDOptNonce"
     61     fields_desc = [ ByteField("type",14),
     62                     FieldLenField("len",None,length_of="data",fmt="B", adjust = lambda pkt,x: (x)/8),
     63                     StrLenField("nonce","", length_from = lambda pkt: pkt.len*8-2) ]
     64 
     65 class ICMPv6NDOptTmstp(_ICMPv6NDGuessPayload, Packet):
     66     name = "ICMPv6NDOptTmstp"
     67     fields_desc = [ ByteField("type",13),
     68                     ByteField("len",2),
     69                     BitField("reserved",0, 48),
     70                     LongField("timestamp", None) ]
     71 
     72 class ICMPv6NDOptRsaSig(_ICMPv6NDGuessPayload, Packet):
     73     name = "ICMPv6NDOptRsaSig"
     74     fields_desc = [ ByteField("type",12),
     75                     FieldLenField("len",None,length_of="data",fmt="B", adjust = lambda pkt,x: (x)/8),
     76                     ShortField("reserved",0),
     77                     HashField("key_hash",None),
     78                     StrLenField("signature_pad", "", length_from = lambda pkt: pkt.len*8-20) ]
     79 
     80 class ICMPv6NDOptCGA(_ICMPv6NDGuessPayload, Packet):
     81     name = "ICMPv6NDOptCGA"
     82     fields_desc = [ ByteField("type",11),
     83                     FieldLenField("len",None,length_of="data",fmt="B", adjust = lambda pkt,x: (x)/8),
     84                     ByteField("padlength",0),
     85                     ByteField("reserved",0),
     86                     StrLenField("CGA_PARAMS", "", length_from = lambda pkt: pkt.len*8 - pkt.padlength - 4),
     87                     StrLenField("padding", None, length_from = lambda pkt: pkt.padlength) ]
     88 
     89 if __name__ == "__main__":
     90     from scapy.all import *
     91     interact(mydict=globals(), mybanner="SEND add-on")
     92