Encapsulated Security Payload See https://tools.ietf.org/rfc/rfc4303.txt
| 117 | |
| 118 | |
| 119 | class ESP(Packet): |
| 120 | """ |
| 121 | Encapsulated Security Payload |
| 122 | |
| 123 | See https://tools.ietf.org/rfc/rfc4303.txt |
| 124 | """ |
| 125 | name = 'ESP' |
| 126 | |
| 127 | fields_desc = [ |
| 128 | XIntField('spi', 0x00000001), |
| 129 | IntField('seq', 0), |
| 130 | XStrField('data', None), |
| 131 | ] |
| 132 | |
| 133 | @classmethod |
| 134 | def dispatch_hook(cls, _pkt=None, *args, **kargs): |
| 135 | if _pkt: |
| 136 | if len(_pkt) >= 4 and struct.unpack("!I", _pkt[0:4])[0] == 0x00: |
| 137 | return NON_ESP |
| 138 | elif len(_pkt) == 1 and struct.unpack("!B", _pkt)[0] == 0xff: |
| 139 | return NAT_KEEPALIVE |
| 140 | else: |
| 141 | return ESP |
| 142 | return cls |
| 143 | |
| 144 | overload_fields = { |
| 145 | IP: {'proto': socket.IPPROTO_ESP}, |
| 146 | IPv6: {'nh': socket.IPPROTO_ESP}, |
| 147 | IPv6ExtHdrHopByHop: {'nh': socket.IPPROTO_ESP}, |
| 148 | IPv6ExtHdrDestOpt: {'nh': socket.IPPROTO_ESP}, |
| 149 | IPv6ExtHdrRouting: {'nh': socket.IPPROTO_ESP}, |
| 150 | } |
| 151 | |
| 152 | |
| 153 | class NON_ESP(Packet): # RFC 3948, section 2.2 |