github.com/n00py/Slackor@v0.0.0-20200610224921-d007fcea1740/impacket/tests/ImpactPacket/test_ethernet.py (about)

     1  #!/usr/bin/env python
     2  
     3  import sys
     4  sys.path.insert(0,"../..")
     5  
     6  from impacket.ImpactPacket import Ethernet, EthernetTag
     7  from array import array
     8  import unittest
     9  
    10  class TestEthernet(unittest.TestCase):
    11  
    12      def setUp(self):
    13          # Ethernet frame with a 802.1Q tag (TPID=0x8100, PCP=5, DEI=0, VID=3315)
    14          # and ethertype 0x0800 (IPv4)
    15          self.frame = b'\x54\xab\xa3\xb9\x38\x3d\xe2\xef\x8d\xc7\xa8\x5e\x81\x00\xac\xf3\x08\x00'
    16          self.eth = Ethernet(self.frame)
    17  
    18      def test_01(self):
    19          """Test Ethernet getters"""
    20          self.assertEqual(self.eth.get_packet(), self.frame)
    21          self.assertEqual(self.eth.get_header_size(), 18)
    22          self.assertEqual(self.eth.get_ether_type(), 0x0800)
    23  
    24          # Check source and destination MACs
    25          self.assertEqual(self.eth.get_ether_dhost(), array('B', self.frame[0:6]))
    26          self.assertEqual(self.eth.get_ether_shost(), array('B', self.frame[6:12]))
    27  
    28      def test_02(self):
    29          """Test Ethernet setters"""
    30          self.eth.set_ether_type(0x88cc)
    31          self.assertEqual(self.eth.get_ether_type(), 0x88cc)
    32  
    33          # Swap source and destination MACs
    34          dhost = self.eth.get_ether_dhost()
    35          shost = self.eth.get_ether_shost()
    36          self.eth.set_ether_dhost(shost)
    37          self.eth.set_ether_shost(dhost)
    38          self.assertEqual(self.eth.get_ether_dhost(), array('B', self.frame[6:12]))
    39          self.assertEqual(self.eth.get_ether_shost(), array('B', self.frame[0:6]))
    40  
    41      def test_03(self):
    42          """Test EthernetTag getters"""
    43          tag = self.eth.pop_tag()
    44          self.assertEqual(tag.get_buffer_as_string(),b'\x81\x00\xac\xf3')
    45          self.assertEqual(tag.get_tpid(), 0x8100)
    46          self.assertEqual(tag.get_pcp(), 5)
    47          self.assertEqual(tag.get_dei(), 0)
    48          self.assertEqual(tag.get_vid(), 3315)
    49  
    50      def test_04(self):
    51          """Test EthernetTag setters"""
    52          tag = self.eth.pop_tag()
    53          tag.set_tpid(0x88a8)
    54          tag.set_pcp(2)
    55          tag.set_dei(1)
    56          tag.set_vid(876)
    57          self.assertEqual(tag.get_buffer_as_string(), b'\x88\xa8\x53\x6c')
    58  
    59      def test_05(self):
    60          """Test manipulation with VLAN tags"""
    61          def check_tags(*tags):
    62              self.assertEqual(self.eth.tag_cnt, len(tags))
    63              self.assertEqual(self.eth.get_header_size(), 14 + 4*len(tags))
    64              self.assertEqual(self.eth.get_ether_type(), 0x0800)
    65              for i,tag in enumerate(tags):
    66                  self.assertEqual(self.eth.get_tag(i).get_buffer_as_string(), tag)
    67  
    68          # Add S-tag (outer tag, closest to the Ethernet header)
    69          self.eth.push_tag(EthernetTag(0x88a85001))
    70          check_tags(b'\x88\xa8\x50\x01', b'\x81\x00\xac\xf3')
    71  
    72          # Set C-tag (inner tag, closest to the payload) to default
    73          self.eth.set_tag(1, EthernetTag())
    74          check_tags(b'\x88\xa8\x50\x01', b'\x81\x00\x00\x00')
    75  
    76          # Insert a deprecated 802.1QinQ header between S-tag and C-tag
    77          self.eth.push_tag(EthernetTag(0x910054d2), index=1)
    78          check_tags(b'\x88\xa8\x50\x01', b'\x91\x00\x54\xd2', b'\x81\x00\x00\x00')
    79  
    80          # Test negative indices
    81          tags = {}
    82          for i in range(-3,3):
    83              tags[i] = self.eth.get_tag(i).get_buffer_as_string()
    84  
    85          self.assertEqual(tags[-1], tags[2])
    86          self.assertEqual(tags[-2], tags[1])
    87          self.assertEqual(tags[-3], tags[0])
    88  
    89          # Accessing non-existent tags raises IndexError
    90          self.assertRaises(IndexError, self.eth.get_tag, 3)
    91          self.assertRaises(IndexError, self.eth.get_tag, -4)
    92          self.assertRaises(IndexError, self.eth.set_tag, 3, EthernetTag())
    93          self.assertRaises(IndexError, self.eth.set_tag, -4, EthernetTag())
    94  
    95          # Test Ethernet constructor
    96          data = self.eth.get_buffer_as_string()
    97          eth_copy = Ethernet(data)
    98          self.assertEqual(eth_copy.tag_cnt, 3)
    99          self.assertEqual(eth_copy.get_header_size(), 26)
   100          self.assertEqual(eth_copy.get_ether_type(), 0x0800)
   101  
   102          # Remove the deprecated 802.1QinQ header and check resulting frame
   103          eth_copy.pop_tag(1)
   104          self.assertEqual(eth_copy.tag_cnt, 2)
   105          self.assertEqual(eth_copy.get_packet(), self.frame[:12] + tags[0] + tags[2] + self.frame[-2:])
   106  
   107  
   108  suite = unittest.TestLoader().loadTestsFromTestCase(TestEthernet)
   109  unittest.TextTestRunner(verbosity=1).run(suite)