1
2
3
4 """AOL Instant Messenger."""
5 from __future__ import absolute_import
6
7 import struct
8
9 from . import dpkt
10
11
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
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
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
71
72
73
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
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
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
106 assert tlvCount == 10
107
108
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