Пример #1
0
 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:]
Пример #2
0
 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:]
Пример #3
0
 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:]
Пример #4
0
 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
Пример #5
0
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
Пример #6
0
    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
Пример #7
0
 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()
Пример #8
0
 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)
Пример #9
0
 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
Пример #10
0
 def pack(self) -> bytes:
     return PackableInt(2, self.index).pack()
Пример #11
0
 def pack(self) -> bytes:
     return Vector(2, self.identity).pack() + PackableInt(4, self.obfuscated_ticket_age).pack()
Пример #12
0
 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()
Пример #13
0
 def pack(self) -> bytes:
     return self.content_type.pack(
     ) + self.legacy_record_version.pack() + PackableInt(
         2, len(self.encrypted_record)).pack() + self.encrypted_record