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)