def compute_tls13_early_secrets(self):
        """
        Ciphers key and IV are updated accordingly for 0-RTT data.
        self.handshake_messages should be ClientHello only.
        """
        # we use the prcs rather than the pwcs in a totally arbitrary way
        if self.prcs is None:
            # too soon
            return

        hkdf = self.prcs.hkdf

        self.tls13_early_secret = hkdf.extract(None,
                                               self.tls13_psk_secret)

        bk = hkdf.derive_secret(self.tls13_early_secret,
                                b"external psk binder key",
                                # "resumption psk binder key",
                                b"")
        self.tls13_derived_secrets["binder_key"] = bk

        if len(self.handshake_messages) > 1:
            # these secrets are not defined in case of HRR
            return

        cets = hkdf.derive_secret(self.tls13_early_secret,
                                  b"client early traffic secret",
                                  b"".join(self.handshake_messages))
        self.tls13_derived_secrets["client_early_traffic_secret"] = cets

        ees = hkdf.derive_secret(self.tls13_early_secret,
                                 b"early exporter master secret",
                                 b"".join(self.handshake_messages))
        self.tls13_derived_secrets["early_exporter_secret"] = ees

        if self.connection_end == "server":
            self.prcs.tls13_derive_keys(cets)
        elif self.connection_end == "client":
            self.pwcs.tls13_derive_keys(cets)