Documentation
use crate::aead::TlsAead;
use crate::cipher_suites::{CipherSuite, TurtlsCipherList};
use crate::client_hello::RANDOM_BYTES_LEN;
use crate::extensions::versions::ProtocolVersion;
use crate::extensions::{self, TurtlsExts};
use crate::state::{GlobalState, UnprotShakeState};
use crate::TurtlsAlert;

pub(crate) const MIN_LEN: usize = size_of::<ProtocolVersion>()
    + RANDOM_BYTES_LEN
    + 3
    + size_of::<CipherSuite>()
    + 1
    + TurtlsExts::LEN_SIZE;

pub(crate) fn server_hello_client(
    ser_hel: &[u8],
    unprot_state: &mut UnprotShakeState,
    global_state: &mut GlobalState,
) -> Result<TlsAead, TurtlsAlert> {
    if ser_hel.len() < MIN_LEN {
        return Err(TurtlsAlert::DecodeError);
    }

    let mut pos = size_of::<ProtocolVersion>() + RANDOM_BYTES_LEN;

    let leg_session_id_len = ser_hel[pos];

    if leg_session_id_len > 32 {
        return Err(TurtlsAlert::DecodeError);
    }
    pos += size_of_val(&leg_session_id_len) + leg_session_id_len as usize;

    unprot_state.ciphers.suites &= TurtlsCipherList::parse_singular(
        ser_hel[pos..][..size_of::<CipherSuite>()]
            .try_into()
            .unwrap(),
    )
    .suites;
    pos += size_of::<CipherSuite>();

    pos += 1;

    extensions::parse_ser_hel_exts(&ser_hel[pos..], unprot_state, global_state)
}