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

1"""Header packet data structure. 

2 

3""" 

4 

5from ...exceptions import Crypt4GHHeaderPacketException 

6 

7 

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. 

11 

12 """ 

13 

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 

32 

33 @property 

34 def is_data_encryption_parameters(self) -> bool: 

35 """A predicate for checking whether this packet contains DEK. 

36 

37 Returns: 

38 True if this packet was successfully decrypted and it is 

39 an encryption parameters type packet. 

40 

41 """ 

42 return self._content is not None and self._packet_type == 0 

43 

44 @property 

45 def data_encryption_key(self) -> bytes: 

46 """Getter for the symmetric encryption key. 

47 

48 Returns: 

49 32 bytes of the symmetric key. 

50 

51 Raises: 

52 Crypt4GHHeaderPacketException: if this packet does not contain DEK 

53 

54 """ 

55 if not self.is_data_encryption_parameters: 

56 raise Crypt4GHHeaderPacketException("No encryption key available.") 

57 return self._data_encryption_key 

58 

59 @property 

60 def is_edit_list(self) -> bool: 

61 """A predicate for checking whether this packet contains edit 

62 list. 

63 

64 Returns: 

65 True if it is a successfully decrypted edit list packet. 

66 

67 """ 

68 return self._content is not None and self._packet_type == 1 

69 

70 @property 

71 def is_readable(self) -> bool: 

72 """A predicate for checking whether the packet was 

73 successfully decrypted. 

74 

75 """ 

76 return self._content is not None 

77 

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. 

82 

83 """ 

84 return self._reader_key 

85 

86 @property 

87 def packet_data(self) -> bytes: 

88 """Returns the original packet data (for serialization).""" 

89 return self._packet_data 

90 

91 @property 

92 def packet_type(self) -> int: 

93 """Returns the numerical representation of packet type.""" 

94 return self._packet_type 

95 

96 @property 

97 def content(self) -> bytes: 

98 """Returns the encrypted packet content.""" 

99 return self._content 

100 

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. 

105 

106 """ 

107 return self._packet_length