Package dpkt :: Module aim
[hide private]
[frames] | no frames]

Source Code for Module dpkt.aim

  1  # $Id: aim.py 23 2006-11-08 15:45:33Z dugsong $ 
  2  # -*- coding: utf-8 -*- 
  3   
  4  """AOL Instant Messenger.""" 
  5  from __future__ import absolute_import 
  6   
  7  import struct 
  8   
  9  from . import dpkt 
 10   
 11  # OSCAR: http://iserverd1.khstu.ru/oscar/ 
 12   
 13   
14 -class FLAP(dpkt.Packet):
15 """Frame Layer Protocol. 16 17 See more about the FLAP on \ 18 https://en.wikipedia.org/wiki/OSCAR_protocol#FLAP_header 19 20 Attributes: 21 __hdr__: Header fields of FLAP. 22 data: Message data. 23 """ 24 25 __hdr__ = ( 26 ('ast', 'B', 0x2a), # '*' 27 ('type', 'B', 0), 28 ('seq', 'H', 0), 29 ('len', 'H', 0) 30 ) 31
32 - def unpack(self, buf):
33 dpkt.Packet.unpack(self, buf) 34 if self.ast != 0x2a: 35 raise dpkt.UnpackError('invalid FLAP header') 36 if len(self.data) < self.len: 37 raise dpkt.NeedData('%d left, %d needed' % (len(self.data), self.len))
38 39
40 -class SNAC(dpkt.Packet):
41 """Simple Network Atomic Communication. 42 43 See more about the SNAC on \ 44 https://en.wikipedia.org/wiki/OSCAR_protocol#SNAC_data 45 46 Attributes: 47 __hdr__: Header fields of SNAC. 48 """ 49 50 __hdr__ = ( 51 ('family', 'H', 0), 52 ('subtype', 'H', 0), 53 ('flags', 'H', 0), 54 ('reqid', 'I', 0) 55 )
56 57
58 -def tlv(buf):
59 n = 4 60 try: 61 t, l = struct.unpack('>HH', buf[:n]) 62 except struct.error: 63 raise dpkt.UnpackError('invalid type, length fields') 64 v = buf[n:n + l] 65 if len(v) < l: 66 raise dpkt.NeedData('%d left, %d needed' % (len(v), l)) 67 buf = buf[n + l:] 68 return t, l, v, buf
69 70 # TOC 1.0: http://jamwt.com/Py-TOC/PROTOCOL 71 72 # TOC 2.0: http://www.firestuff.org/projects/firetalk/doc/toc2.txt 73
74 -def testAIM():
75 testdata = b'*\x02\xac\xf3\x00\x81\x00\x03\x00\x0b\x00\x00\xfaEUd\x0eusrnameremoved\x00\x00\x00\n\x00\x01\x00\x02\x12\x90\x00D\x00\x01\x00\x00\x03\x00\x04X\x90T6\x00E\x00\x04\x00\x00\x0f\x93\x00!\x00\x08\x00\x85\x00}\x00}\x00\x00\x00A\x00\x01\x00\x007\x00\x04\x00\x00\x00\x00\x00\r\x00\x00\x00\x19\x00\x00\x00\x1d\x00$\x00\x00\x00\x05\x02\x01\xd2\x04r\x00\x01\x00\x05\x02\x01\xd2\x04r\x00\x03\x00\x05+\x00\x00*\xcc\x00\x81\x00\x05+\x00\x00\x13\xf1' 76 77 flap = FLAP(testdata) 78 assert flap.ast == 0x2a 79 assert flap.type == 0x02 80 assert flap.seq == 44275 81 assert flap.len == 129 82 assert flap.data == b'\x00\x03\x00\x0b\x00\x00\xfaEUd\x0eusrnameremoved\x00\x00\x00\n\x00\x01\x00\x02\x12\x90\x00D\x00\x01\x00\x00\x03\x00\x04X\x90T6\x00E\x00\x04\x00\x00\x0f\x93\x00!\x00\x08\x00\x85\x00}\x00}\x00\x00\x00A\x00\x01\x00\x007\x00\x04\x00\x00\x00\x00\x00\r\x00\x00\x00\x19\x00\x00\x00\x1d\x00$\x00\x00\x00\x05\x02\x01\xd2\x04r\x00\x01\x00\x05\x02\x01\xd2\x04r\x00\x03\x00\x05+\x00\x00*\xcc\x00\x81\x00\x05+\x00\x00\x13\xf1' 83 84 snac = SNAC(flap.data) 85 assert snac.family == 3 86 assert snac.subtype == 11 87 assert snac.flags == 0 88 assert snac.reqid == 0xfa455564 89 assert snac.data == b'\x0eusrnameremoved\x00\x00\x00\n\x00\x01\x00\x02\x12\x90\x00D\x00\x01\x00\x00\x03\x00\x04X\x90T6\x00E\x00\x04\x00\x00\x0f\x93\x00!\x00\x08\x00\x85\x00}\x00}\x00\x00\x00A\x00\x01\x00\x007\x00\x04\x00\x00\x00\x00\x00\r\x00\x00\x00\x19\x00\x00\x00\x1d\x00$\x00\x00\x00\x05\x02\x01\xd2\x04r\x00\x01\x00\x05\x02\x01\xd2\x04r\x00\x03\x00\x05+\x00\x00*\xcc\x00\x81\x00\x05+\x00\x00\x13\xf1' 90 91 #skip over the buddyname and TLV count in Oncoming Buddy message 92 tlvdata = snac.data[19:] 93 94 tlvCount = 0 95 while tlvdata: 96 t, l, v, tlvdata = tlv(tlvdata) 97 tlvCount += 1 98 if tlvCount == 1: 99 # just check function return for first TLV 100 assert t == 0x01 101 assert l == 2 102 assert v == b'\x12\x90' 103 assert tlvdata == b'\x00D\x00\x01\x00\x00\x03\x00\x04X\x90T6\x00E\x00\x04\x00\x00\x0f\x93\x00!\x00\x08\x00\x85\x00}\x00}\x00\x00\x00A\x00\x01\x00\x007\x00\x04\x00\x00\x00\x00\x00\r\x00\x00\x00\x19\x00\x00\x00\x1d\x00$\x00\x00\x00\x05\x02\x01\xd2\x04r\x00\x01\x00\x05\x02\x01\xd2\x04r\x00\x03\x00\x05+\x00\x00*\xcc\x00\x81\x00\x05+\x00\x00\x13\xf1' 104 105 # make sure we extracted 10 TLVs 106 assert tlvCount == 10
107 108
109 -def testExceptions():
110 testdata = b'xxxxxx' 111 try: 112 flap = FLAP(testdata) 113 except dpkt.UnpackError as e: 114 assert str(e) == 'invalid FLAP header' 115 testdata = b'*\x02\x12\x34\x00\xff' 116 try: 117 flap = FLAP(testdata) 118 except dpkt.NeedData as e: 119 assert str(e) == '0 left, 255 needed' 120 try: 121 t, l, v, _ = tlv(b'x') 122 except dpkt.UnpackError as e: 123 assert str(e) == 'invalid type, length fields' 124 125 try: 126 t, l, v, _ = tlv(b'\x00\x01\x00\xff') 127 except dpkt.NeedData as e: 128 assert str(e) == '0 left, 255 needed'
129