1
2
3 """Secure Sockets Layer / Transport Layer Security."""
4
5 import dpkt
6
7 -class SSL2(dpkt.Packet):
8 __hdr__ = (
9 ('len', 'H', 0),
10 ('msg', 's', ''),
11 ('pad', 's', ''),
12 )
14 dpkt.Packet.unpack(self, buf)
15 if self.len & 0x8000:
16 n = self.len = self.len & 0x7FFF
17 self.msg, self.data = self.data[:n], self.data[n:]
18 else:
19 n = self.len = self.len & 0x3FFF
20 padlen = ord(self.data[0])
21 self.msg = self.data[1:1+n]
22 self.pad = self.data[1+n:1+n+pad]
23 self.data = self.data[1+n+pad:]
24
25
26 SSL3_VERSION = 0x0300
27 TLS1_VERSION = 0x0301
28
29
30 SSL3_RT_CHANGE_CIPHER_SPEC = 20
31 SSL3_RT_ALERT = 21
32 SSL3_RT_HANDSHAKE = 22
33 SSL3_RT_APPLICATION_DATA = 23
34
35
36 SSL3_MT_HELLO_REQUEST = 0
37 SSL3_MT_CLIENT_HELLO = 1
38 SSL3_MT_SERVER_HELLO = 2
39 SSL3_MT_CERTIFICATE = 11
40 SSL3_MT_SERVER_KEY_EXCHANGE = 12
41 SSL3_MT_CERTIFICATE_REQUEST = 13
42 SSL3_MT_SERVER_DONE = 14
43 SSL3_MT_CERTIFICATE_VERIFY = 15
44 SSL3_MT_CLIENT_KEY_EXCHANGE = 16
45 SSL3_MT_FINISHED = 20
46
47 -class SSL3(dpkt.Packet):
48 __hdr__ = (
49 ('type', 'B', 0),
50 ('version', 'H', 0),
51 ('len', 'H', 0),
52 )
54 dpkt.Packet.unpack(self, buf)
55 if self.len <= len(self.data):
56 self.msg, self.data = self.data[:self.len], self.data[self.len:]
57
58 """
59 Byte 0 = SSL record type = 22 (SSL3_RT_HANDSHAKE)
60 Bytes 1-2 = SSL version (major/minor)
61 Bytes 3-4 = Length of data in the record (excluding the header itself).
62 Byte 5 = Handshake type
63 Bytes 6-8 = Length of data to follow in this record
64 Bytes 9-n = Command-specific data
65 """
66
67
70 v = buf[1:3]
71 if v == '\x03\x01' or v == '\x03\x00':
72 return SSL3(buf)
73 return SSL2(buf)
74