package faketls

import (
	
	
	
	

	

	
	
)

const clientHelloLength = 517

func ( *bin.Buffer,  [32]byte,  string,  [32]byte) ( int) {
	 := func( string) {
		.Buf = append(.Buf, ...)
	}
	 := func( int) {
		 = len(.Buf)
		.Expand()
	}
	 := func( int) {
		.Expand(0)
	}
	 := func() {
		.Buf = append(.Buf, [:]...)
	}
	 := func() {
		.Buf = append(.Buf, ...)
	}
	 := func() {
		.Buf = append(.Buf, [:]...)
	}
	var  []int
	 := func() {
		 = append(, .Len())
		.Expand(2)
	}
	 := func() {
		 := len() - 1
		 := []
		 = [:]

		 := .Len() -  + 2
		binary.BigEndian.PutUint16(.Buf[:], uint16())
	}

	("\x16\x03\x01\x02\x00\x01\x00\x01\xfc\x03\x03")
	(32)
	("\x20")
	()
	("\x00\x20")
	(0)
	("\x13\x01\x13\x02\x13\x03\xc0\x2b\xc0\x2f\xc0\x2c\xc0\x30\xcc\xa9" +
		"\xcc\xa8\xc0\x13\xc0\x14\x00\x9c\x00\x9d\x00\x2f\x00\x35\x01\x00" +
		"\x01\x93")
	(2)
	("\x00\x00\x00\x00")
	()
	()
	("\x00")
	()
	()
	()
	()
	()
	("\x00\x17\x00\x00\xff\x01\x00\x01\x00\x00\x0a\x00\x0a\x00\x08")
	(4)
	("\x00\x1d\x00\x17\x00\x18\x00\x0b\x00\x02\x01\x00\x00\x23\x00\x00" +
		"\x00\x10\x00\x0e\x00\x0c\x02\x68\x32\x08\x68\x74\x74\x70\x2f\x31" +
		"\x2e\x31\x00\x05\x00\x05\x01\x00\x00\x00\x00\x00\x0d\x00\x12\x00" +
		"\x10\x04\x03\x08\x04\x04\x01\x05\x03\x08\x05\x05\x01\x08\x06\x06" +
		"\x01\x00\x12\x00\x00\x00\x33\x00\x2b\x00\x29")
	(4)
	("\x00\x01\x00\x00\x1d\x00\x20")
	()
	("\x00\x2d\x00\x02\x01\x01\x00\x2b\x00\x0b\x0a")
	(6)
	("\x03\x04\x03\x03\x03\x02\x03\x01\x00\x1b\x00\x03\x02\x00\x02")
	(3)
	("\x00\x01\x00\x00\x15")

	if  := clientHelloLength - .Len();  > 0 {
		.Expand()
	}
	return 
}

// writeClientHello writes faketls ClientHello.
//
// See https://tools.ietf.org/html/rfc5246#section-7.4.1.1.
func (
	 io.Writer,
	 clock.Clock,
	 [32]byte,
	 string,
	 []byte,
) ( [32]byte,  error) {
	 := &bin.Buffer{
		Buf: make([]byte, 0, 576),
	}
	 := createClientHello(, , , [32]byte{})

	// https://github.com/tdlib/td/blob/27d3fdd09d90f6b77ecbcce50b1e86dc4b3dd366/td/mtproto/TlsInit.cpp#L380-L384
	 := hmac.New(sha256.New, )
	if ,  := .Write(.Buf);  != nil {
		return [32]byte{}, errors.Wrap(, "hmac write")
	}

	 := .Sum(nil)
	copy(.Buf[:+32], )
	// Overwrite last 4 bytes using final := original ^ timestamp.
	 := binary.LittleEndian.Uint32(.Buf[+28 : +32])
	 ^= uint32(.Now().Unix())
	binary.LittleEndian.PutUint32(.Buf[+28:+32], )

	// Copy ClientRandom for later use.
	copy([:], .Buf[:+32])
	_,  = .Write(.Buf)
	return , 
}