def unpack(self, data: bytes) -> bytes: self.handshake_type, data = HandshakeType.unpack(data) size = PackableInt(3, 0) data = size.unpack(data) assert len(data) >= size.value, f"incomplete handshake" self.handshake_data = data[:size.value] return data[size.value:]
def unpack(self, data: bytes) -> bytes: self.content_type, data = ContentType.unpack(data) data = self.legacy_record_version.unpack(data) size = PackableInt(2, 0) data = size.unpack(data) assert len(data) >= size.value, "TLSPlaintext length not match body" self.data = data[:size.value] return data[size.value:]
def unpack(self, data: bytes) -> bytes: self.content_type, data = ContentType.unpack(data) assert self.content_type in (ContentType.application_data, ContentType.change_cipher_spec), \ f"TLSCiphertext error type:{self.content_type}" data = self.legacy_record_version.unpack(data) size = PackableInt(2, 0) data = size.unpack(data) assert len(data) >= size.value, "TLSCiphertext length not match body" self.encrypted_record = data[:size.value] return data[size.value:]
def __init__(self, cipher_suite: CipherSuite, psk: bytes = None, ecdhe: bytes = None): self._cipher_suite = cipher_suite self._algorithm: hashes.HashAlgorithm = self.hash_algorithm() self._backend = default_backend() self._psk = psk self._ecdhe = ecdhe self._hkdf = HKDF(self._algorithm) self._early_secret: bytes = None self._ext_binder_key: bytes = None self._res_binder_key: bytes = None self._client_early_traffic_secret: bytes = None self._early_exporter_master_secret: bytes = None self._handshake_secret: bytes = None self._client_handshake_traffic_secret: bytes = None self._server_handshake_traffic_secret: bytes = None self._master_secret: bytes = None self._client_application_traffic_secret_0: bytes = None self._client_application_traffic_secret_N: bytes = None self._server_application_traffic_secret_0: bytes = None self._server_application_traffic_secret_N: bytes = None self._exporter_master_secret: bytes = None self._resumption_master_secret: bytes = None self._handshake_read_seq: PackableInt = PackableInt(8, 0) self._application_read_seq: PackableInt = PackableInt(8, 0) self._early_write_seq: PackableInt = PackableInt(8, 0) self._handshake_write_seq: PackableInt = PackableInt(8, 0) self._application_write_seq: PackableInt = PackableInt(8, 0) self._client_early_traffic_write_key: bytes = None self._client_early_traffic_write_iv: bytes = None self._client_handshake_traffic_write_key: bytes = None self._client_handshake_traffic_write_iv: bytes = None self._server_handshake_traffic_write_key: bytes = None self._server_handshake_traffic_write_iv: bytes = None self._client_application_traffic_write_key: bytes = None self._client_application_traffic_write_iv: bytes = None self._server_application_traffic_write_key: bytes = None self._server_application_traffic_write_iv: bytes = None self._client_handshake_finished_key: bytes = None self._server_handshake_finished_key: bytes = None self._post_handshake_finished_key: bytes = None
class HkdfLabel(Protocol): def __init__(self, length: int, label: bytes, context: bytes): self.length = PackableInt(2, length) self.label = Vector(1, b"tls13 " + label) self.context = Vector(1, context) def pack(self) -> bytes: return self.length.pack() + self.label.pack() + self.context.pack() def unpack(self, data: bytes) -> bytes: pass
def unpack(self, data: bytes) -> bytes: ticket_lifetime_int = PackableInt(4, 0) data = ticket_lifetime_int.unpack(data) self.ticket_lifetime = ticket_lifetime_int.value ticket_age_add_int = PackableInt(4, 0) data = ticket_age_add_int.unpack(data) self.ticket_age_add = ticket_age_add_int.value ticket_nonce_vec = Vector(1) data = ticket_nonce_vec.unpack(data) self.ticket_nonce = ticket_nonce_vec.data ticket_vec = Vector(2) data = ticket_vec.unpack(data) self.ticket = ticket_vec.data ext_vec = Vector(2) data = ext_vec.unpack(data) ext_data: bytes = ext_vec.data extensions = [] while len(ext_data) > 0: ext = Extension() ext_data = ext.unpack(ext_data) extension = Extension.construct(ext.ext_type) if extension: ext.ext: Vector extension.unpack(ext.ext.data) ext.ext = extension extensions.append(ext) self.extensions = tuple(extensions) return data
def pack(self) -> bytes: return PackableInt(4, self.ticket_lifetime).pack() + PackableInt(4, self.ticket_age_add).pack() \ + Vector(1, self.ticket_nonce).pack() + Vector(2, self.ticket).pack() + Vector(2, self.extensions).pack()
def __init__(self, length: int, label: bytes, context: bytes): self.length = PackableInt(2, length) self.label = Vector(1, b"tls13 " + label) self.context = Vector(1, context)
def max_early_data_size(self): size = PackableInt(4, 0) if len(self.early_data_size) == 4: size.unpack(self.early_data_size) return size.value
def pack(self) -> bytes: return PackableInt(2, self.index).pack()
def pack(self) -> bytes: return Vector(2, self.identity).pack() + PackableInt(4, self.obfuscated_ticket_age).pack()
def _additional_data(self, expansion_len=0) -> bytes: return self.content_type.pack() + self.legacy_record_version.pack() \ + PackableInt(2, len(self.encrypted_record) + expansion_len).pack()
def pack(self) -> bytes: return self.content_type.pack( ) + self.legacy_record_version.pack() + PackableInt( 2, len(self.encrypted_record)).pack() + self.encrypted_record