Coverage for oarepo_c4gh/crypt4gh/common/header_packet.py: 100%
39 statements
« prev ^ index » next coverage.py v7.10.2, created at 2025-08-07 12:05 +0000
« prev ^ index » next coverage.py v7.10.2, created at 2025-08-07 12:05 +0000
1"""Header packet data structure.
3"""
5from ...exceptions import Crypt4GHHeaderPacketException
8class HeaderPacket:
9 """Represents a single Crypt4GH header packet. If it was possible
10 to decrypt it, the parsed contents are made available as well.
12 """
14 def __init__(
15 self,
16 packet_length,
17 packet_data,
18 content,
19 reader_key,
20 packet_type,
21 data_encryption_method,
22 data_encryption_key,
23 ):
24 """Initializes the packet structure with all fields given."""
25 self._packet_length = packet_length
26 self._packet_data = packet_data
27 self._content = content
28 self._reader_key = reader_key
29 self._packet_type = packet_type
30 self._data_encryption_method = data_encryption_method
31 self._data_encryption_key = data_encryption_key
33 @property
34 def is_data_encryption_parameters(self) -> bool:
35 """A predicate for checking whether this packet contains DEK.
37 Returns:
38 True if this packet was successfully decrypted and it is
39 an encryption parameters type packet.
41 """
42 return self._content is not None and self._packet_type == 0
44 @property
45 def data_encryption_key(self) -> bytes:
46 """Getter for the symmetric encryption key.
48 Returns:
49 32 bytes of the symmetric key.
51 Raises:
52 Crypt4GHHeaderPacketException: if this packet does not contain DEK
54 """
55 if not self.is_data_encryption_parameters:
56 raise Crypt4GHHeaderPacketException("No encryption key available.")
57 return self._data_encryption_key
59 @property
60 def is_edit_list(self) -> bool:
61 """A predicate for checking whether this packet contains edit
62 list.
64 Returns:
65 True if it is a successfully decrypted edit list packet.
67 """
68 return self._content is not None and self._packet_type == 1
70 @property
71 def is_readable(self) -> bool:
72 """A predicate for checking whether the packet was
73 successfully decrypted.
75 """
76 return self._content is not None
78 @property
79 def reader_key(self) -> bytes:
80 """Returns public key used for decrypting this header packet
81 or None if the decryption was not successful.
83 """
84 return self._reader_key
86 @property
87 def packet_data(self) -> bytes:
88 """Returns the original packet data (for serialization)."""
89 return self._packet_data
91 @property
92 def packet_type(self) -> int:
93 """Returns the numerical representation of packet type."""
94 return self._packet_type
96 @property
97 def content(self) -> bytes:
98 """Returns the encrypted packet content."""
99 return self._content
101 @property
102 def length(self) -> int:
103 """Returns the packet length in bytes - including the packet
104 length 4-byte value at the beginning.
106 """
107 return self._packet_length