8#include <botan/tls_messages.h>
10#include <botan/internal/tls_handshake_io.h>
11#include <botan/internal/tls_handshake_state.h>
22std::vector<uint8_t> finished_compute_verify(
const Handshake_State& state,
25 const uint8_t TLS_CLIENT_LABEL[] = {
26 0x63, 0x6C, 0x69, 0x65, 0x6E, 0x74, 0x20, 0x66, 0x69, 0x6E, 0x69,
27 0x73, 0x68, 0x65, 0x64 };
29 const uint8_t TLS_SERVER_LABEL[] = {
30 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x66, 0x69, 0x6E, 0x69,
31 0x73, 0x68, 0x65, 0x64 };
33 std::unique_ptr<KDF> prf(state.protocol_specific_prf());
35 std::vector<uint8_t> input;
36 std::vector<uint8_t> label;
38 label += std::make_pair(TLS_CLIENT_LABEL,
sizeof(TLS_CLIENT_LABEL));
40 label += std::make_pair(TLS_SERVER_LABEL,
sizeof(TLS_SERVER_LABEL));
42 input += state.hash().final(state.version(), state.ciphersuite().prf_algo());
44 return unlock(prf->derive_key(12, state.session_keys().master_secret(), input, label));
54 Connection_Side side) : m_verification_data(finished_compute_verify( state, side ))
62std::vector<uint8_t> Finished::serialize()
const
64 return m_verification_data;
79 std::vector<byte> computed_verify = finished_compute_verify(state, side);
81#if defined(BOTAN_UNSAFE_FUZZER_MODE)
84 return (m_verification_data.size() == computed_verify.size()) &&
Finished(Handshake_IO &io, Handshake_State &state, Connection_Side side)
bool verify(const Handshake_State &state, Connection_Side side) const
void update(const uint8_t in[], size_t length)
virtual std::vector< uint8_t > send(const Handshake_Message &msg)=0
std::vector< T > unlock(const secure_vector< T > &in)
bool constant_time_compare(const uint8_t x[], const uint8_t y[], size_t len)