package faketls

import (
	
	
	
	

	
)

// Sanity limit for the number of extra handshake records before
// ChangeCipherSpec.
const maxHandshakeRecords = 16

// readServerHello reads faketls ServerHello.
func ( io.Reader,  [32]byte,  []byte) error {
	 := bytes.NewBuffer(nil)
	 = io.TeeReader(, )

	,  := readRecord()
	if  != nil {
		return errors.Wrap(, "handshake record")
	}
	if .Type != RecordTypeHandshake {
		return errors.New("unexpected record type")
	}

	// `$record_header = type 1 byte + version 2 bytes + payload_length 2 bytes = 5 bytes`
	// `$server_hello_header = type 1 bytes + version 2 bytes + length 3 bytes = 6 bytes`
	// `$offset = $record_header + $server_hello_header = 11 bytes`
	const  = 11
	const  =  + 32
	if .Len() <  {
		return errors.New("handshake record is too short")
	}

	 := false
	for  := 0;  < maxHandshakeRecords; ++ {
		,  := readRecord()
		if  != nil {
			return errors.Wrap(, "change cipher record")
		}

		switch .Type {
		case RecordTypeHandshake:
			continue
		case RecordTypeChangeCipherSpec:
			 = true
		default:
			return errors.New("unexpected record type")
		}

		break
	}

	if ! {
		return errors.New("unexpected record type")
	}

	,  := readRecord()
	if  != nil {
		return errors.Wrap(, "cert record")
	}
	if .Type != RecordTypeApplication {
		return errors.New("unexpected record type")
	}

	 := .Bytes()
	var  [32]byte
	copy([:], [:])
	// Fill original digest by zeros.
	var  [32]byte
	copy([:], [:])

	 := hmac.New(sha256.New, )
	if ,  := .Write([:]);  != nil {
		return errors.Wrap(, "hmac write")
	}
	if ,  := .Write();  != nil {
		return errors.Wrap(, "hmac write")
	}
	if !bytes.Equal(.Sum(nil), [:]) {
		return errors.New("hmac digest mismatch")
	}

	return nil
}