Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions pcapkit/corekit/fields/strings.py
Original file line number Diff line number Diff line change
Expand Up @@ -348,4 +348,28 @@ class PaddingField(BytesField):
callback: Callback function to be called upon
:meth:`self.__call__ <pcapkit.corekit.fields.field.FieldBase.__call__>`.

Padding packs back as the octets it was given, so a schema unpacked from
non-zero padding rebuilds byte for byte. An absent or empty value packs as
zeros -- the default for a freshly built packet -- and a value of another
width is truncated or zero-filled to the field's, as :mod:`struct`'s ``s``
format does.

"""

def pack(self, value: 'Optional[bytes]', packet: 'dict[str, Any]') -> 'bytes': # pylint: disable=unused-argument
"""Pack field value into :obj:`bytes`.

Args:
value: Field value, i.e. the padding octets as captured.
packet: Packet data.

Returns:
Packed field value: ``value`` truncated or zero-filled to the
field's width, or that many zero octets if ``value`` is absent or
empty.

"""
length = self.length
if isinstance(value, (bytes, bytearray)) and value:
return bytes(value[:length]).ljust(length, b'\x00')
return bytes(length)
18 changes: 18 additions & 0 deletions pcapkit/protocols/application/httpv2.py
Original file line number Diff line number Diff line change
Expand Up @@ -611,6 +611,7 @@ def _read_http_data(self, schema: 'Schema_DataFrame', *,
reserved=header.stream['reserved'],
sid=header.stream['sid'],
data=schema.data,
padding=schema.padding if flag.PADDED else b'',
)
return data

Expand Down Expand Up @@ -669,6 +670,7 @@ def _read_http_headers(self, schema: 'Schema_HeadersFrame', *,
stream_dependency=schema.stream_dep['sid'] if flag.PRIORITY else 0,
weight=(schema.weight + 1) if flag.PRIORITY else 0,
fragment=schema.fragment,
padding=schema.padding if flag.PADDED else b'',
)
return data

Expand Down Expand Up @@ -878,6 +880,7 @@ def _read_http_push_promise(self, schema: 'Schema_PushPromiseFrame', *,
promised_reserved=schema.stream['reserved'],
promised_sid=schema.stream['sid'],
fragment=schema.fragment,
padding=schema.padding if flag.PADDED else b'',
)

return data
Expand Down Expand Up @@ -1088,6 +1091,7 @@ def _make_http_data(self, frame: 'Optional[Data_DataFrame]' = None, *,
padded: 'bool' = False,
pad_len: 'int' = 0,
data: 'bytes' = b'',
padding: 'bytes' = b'',
**kwargs: 'Any') -> 'tuple[Schema_DataFrame, Flags]':
"""Make HTTP/2 ``DATA`` frame.

Expand All @@ -1097,6 +1101,8 @@ def _make_http_data(self, frame: 'Optional[Data_DataFrame]' = None, *,
padded: Padded flag, implied by a non-zero ``pad_len``.
pad_len: Padding length.
data: Frame data.
padding: Padding octets, truncated or zero-filled to ``pad_len``
octets.
**kwargs: Arbitrary keyword arguments.

Returns:
Expand All @@ -1109,6 +1115,7 @@ def _make_http_data(self, frame: 'Optional[Data_DataFrame]' = None, *,

pad_len = frame.pad_len
data = frame.data
padding = getattr(frame, 'padding', b'')

flags = Schema_DataFrame.Flags(0)
if end_stream:
Expand All @@ -1119,6 +1126,7 @@ def _make_http_data(self, frame: 'Optional[Data_DataFrame]' = None, *,
return Schema_DataFrame(
pad_len=pad_len,
data=data,
padding=padding,
), flags

def _make_http_headers(self, frame: 'Optional[Data_HeadersFrame]' = None, *,
Expand All @@ -1130,6 +1138,7 @@ def _make_http_headers(self, frame: 'Optional[Data_HeadersFrame]' = None, *,
sid_dep: 'Optional[int]' = None,
weight: 'int' = 0,
fragment: 'bytes' = b'',
padding: 'bytes' = b'',
**kwargs: 'Any') -> 'tuple[Schema_HeadersFrame, Flags]':
"""Make HTTP/2 ``HEADERS`` frame.

Expand All @@ -1143,6 +1152,8 @@ def _make_http_headers(self, frame: 'Optional[Data_HeadersFrame]' = None, *,
sid_dep: Dependency stream identifier.
weight: Priority weight value.
fragment: Header block fragment.
padding: Padding octets, truncated or zero-filled to ``pad_len``
octets.
**kwargs: Arbitrary keyword arguments.

Returns:
Expand All @@ -1160,6 +1171,7 @@ def _make_http_headers(self, frame: 'Optional[Data_HeadersFrame]' = None, *,
sid_dep = frame.stream_dependency
weight = frame.weight
fragment = frame.fragment
padding = getattr(frame, 'padding', b'')
else:
priority = sid_dep is not None
sid_dep = sid_dep or 0
Expand All @@ -1182,6 +1194,7 @@ def _make_http_headers(self, frame: 'Optional[Data_HeadersFrame]' = None, *,
},
weight=weight - 1 if weight else 0,
fragment=fragment,
padding=padding,
), flags

def _make_http_priority(self, frame: 'Optional[Data_PriorityFrame]' = None, *,
Expand Down Expand Up @@ -1304,6 +1317,7 @@ def _make_http_push_promise(self, frame: 'Optional[Data_PushPromiseFrame]' = Non
promised_reserved: 'int' = 0,
promised_sid: 'int' = 0,
fragment: 'bytes' = b'',
padding: 'bytes' = b'',
**kwargs: 'Any') -> 'tuple[Schema_PushPromiseFrame, Flags]':
"""Make HTTP/2 ``PUSH_PROMISE`` frame.

Expand All @@ -1315,6 +1329,8 @@ def _make_http_push_promise(self, frame: 'Optional[Data_PushPromiseFrame]' = Non
promised_reserved: Reserved bit of the promised stream identifier.
promised_sid: Promised stream identifier.
fragment: Header block fragment.
padding: Padding octets, truncated or zero-filled to ``pad_len``
octets.
**kwargs: Arbitrary keyword arguments.

Returns:
Expand All @@ -1328,6 +1344,7 @@ def _make_http_push_promise(self, frame: 'Optional[Data_PushPromiseFrame]' = Non
promised_reserved = frame.promised_reserved
promised_sid = frame.promised_sid
fragment = frame.fragment
padding = getattr(frame, 'padding', b'')

flags = Schema_PushPromiseFrame.Flags(0)
if end_headers:
Expand All @@ -1342,6 +1359,7 @@ def _make_http_push_promise(self, frame: 'Optional[Data_PushPromiseFrame]' = Non
'sid': promised_sid,
},
fragment=fragment,
padding=padding,
), flags

def _make_http_ping(self, frame: 'Optional[Data_PingFrame]' = None, *,
Expand Down
2 changes: 2 additions & 0 deletions pcapkit/protocols/application/ospf.py
Original file line number Diff line number Diff line change
Expand Up @@ -392,6 +392,7 @@ def _read_encrypt_auth(self, schema: 'Schema_CryptographicAuthentication') -> 'D

"""
auth = Data_CryptographicAuthentication(
reserved=schema.reserved,
key_id=schema.key_id,
len=schema.len,
seq=schema.seq,
Expand Down Expand Up @@ -422,6 +423,7 @@ def _make_encrypt_auth(self,
return Schema_CryptographicAuthentication.unpack(auth_data) # type: ignore[call-arg,misc]
if isinstance(auth_data, Data_CryptographicAuthentication):
return Schema_CryptographicAuthentication(
reserved=getattr(auth_data, 'reserved', b'\x00\x00'),
key_id=auth_data.key_id,
len=auth_data.len,
seq=auth_data.seq,
Expand Down
12 changes: 9 additions & 3 deletions pcapkit/protocols/data/application/httpv2.py
Original file line number Diff line number Diff line change
Expand Up @@ -89,9 +89,11 @@ class DataFrame(HTTP):
pad_len: 'int'
#: Frame payload.
data: 'bytes'
#: Padding octets, as captured (empty unless ``PADDED``).
padding: 'bytes'

if TYPE_CHECKING:
def __init__(self, length: 'int', type: 'Frame', flags: 'DataFrameFlags', reserved: 'int', pad_len: 'int', sid: 'int', data: 'bytes') -> 'None': ... # pylint: disable=unused-argument,super-init-not-called,multiple-statements,line-too-long,redefined-builtin
def __init__(self, length: 'int', type: 'Frame', flags: 'DataFrameFlags', reserved: 'int', pad_len: 'int', sid: 'int', data: 'bytes', padding: 'bytes') -> 'None': ... # pylint: disable=unused-argument,super-init-not-called,multiple-statements,line-too-long,redefined-builtin


@info_final
Expand Down Expand Up @@ -127,9 +129,11 @@ class HeadersFrame(HTTP):
weight: 'int'
#: Header block fragment.
fragment: 'bytes'
#: Padding octets, as captured (empty unless ``PADDED``).
padding: 'bytes'

if TYPE_CHECKING:
def __init__(self, length: 'int', type: 'Frame', flags: 'HeadersFrameFlags', reserved: 'int', pad_len: 'int', sid: 'int', excl_dependency: 'bool', stream_dependency: 'int', weight: 'int', fragment: 'bytes') -> 'None': ... # pylint: disable=unused-argument,super-init-not-called,multiple-statements,line-too-long,redefined-builtin
def __init__(self, length: 'int', type: 'Frame', flags: 'HeadersFrameFlags', reserved: 'int', pad_len: 'int', sid: 'int', excl_dependency: 'bool', stream_dependency: 'int', weight: 'int', fragment: 'bytes', padding: 'bytes') -> 'None': ... # pylint: disable=unused-argument,super-init-not-called,multiple-statements,line-too-long,redefined-builtin


@info_final
Expand Down Expand Up @@ -237,9 +241,11 @@ class PushPromiseFrame(HTTP):
promised_sid: 'int'
#: Header block fragment.
fragment: 'bytes'
#: Padding octets, as captured (empty unless ``PADDED``).
padding: 'bytes'

if TYPE_CHECKING:
def __init__(self, length: 'int', type: 'Frame', flags: 'Flags', reserved: 'int', pad_len: 'int', sid: 'int', promised_reserved: 'int', promised_sid: 'int', fragment: 'bytes') -> 'None': ... # pylint: disable=unused-argument,super-init-not-called,multiple-statements,line-too-long,redefined-builtin
def __init__(self, length: 'int', type: 'Frame', flags: 'Flags', reserved: 'int', pad_len: 'int', sid: 'int', promised_reserved: 'int', promised_sid: 'int', fragment: 'bytes', padding: 'bytes') -> 'None': ... # pylint: disable=unused-argument,super-init-not-called,multiple-statements,line-too-long,redefined-builtin


@info_final
Expand Down
4 changes: 3 additions & 1 deletion pcapkit/protocols/data/application/ospf.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@
class CryptographicAuthentication(Data):
"""Data model for OSPF cryptographic authentication."""

#: The two reserved octets, as captured.
reserved: 'bytes'
#: Key ID.
key_id: 'int'
#: Authentication data length.
Expand All @@ -28,7 +30,7 @@ class CryptographicAuthentication(Data):
seq: 'int'

if TYPE_CHECKING:
def __init__(self, key_id: 'int', len: 'int', seq: 'int') -> 'None': ... # pylint: disable=unused-argument,super-init-not-called,multiple-statements,redefined-builtin
def __init__(self, reserved: 'bytes', key_id: 'int', len: 'int', seq: 'int') -> 'None': ... # pylint: disable=unused-argument,super-init-not-called,multiple-statements,redefined-builtin


@info_final
Expand Down
Loading
Loading