// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package tls

import (
	"crypto/rsa";
	"io";
	"os";
)

const (
	// maxTLSCiphertext is the maximum length of a plaintext payload.
	maxTLSPlaintext	= 16384;
	// maxTLSCiphertext is the maximum length payload after compression and encryption.
	maxTLSCiphertext	= 16384 + 2048;
	// maxHandshakeMsg is the largest single handshake message that we'll buffer.
	maxHandshakeMsg	= 65536;
)


// TLS record types.
type recordType uint8

const (
	recordTypeChangeCipherSpec	recordType	= 20;
	recordTypeAlert			recordType	= 21;
	recordTypeHandshake		recordType	= 22;
	recordTypeApplicationData	recordType	= 23;
)

// TLS handshake message types.
const (
	typeClientHello		uint8	= 1;
	typeServerHello		uint8	= 2;
	typeCertificate		uint8	= 11;
	typeServerHelloDone	uint8	= 14;
	typeClientKeyExchange	uint8	= 16;
	typeFinished		uint8	= 20;
)

// TLS cipher suites.
var (
	TLS_RSA_WITH_RC4_128_SHA uint16 = 5;
)

// TLS compression types.
var (
	compressionNone uint8 = 0;
)

type ConnectionState struct {
	HandshakeComplete	bool;
	CipherSuite		string;
	Error			alertType;
}

// A Config structure is used to configure a TLS client or server. After one
// has been passed to a TLS function it must not be modified.
type Config struct {
	// Rand provides the source of entropy for nonces and RSA blinding.
	Rand	io.Reader;
	// Time returns the current time as the number of seconds since the epoch.
	Time		func() int64;
	Certificates	[]Certificate;
}

type Certificate struct {
	Certificate	[][]byte;
	PrivateKey	*rsa.PrivateKey;
}

// A TLS record.
type record struct {
	contentType	recordType;
	major, minor	uint8;
	payload		[]byte;
}

type handshakeMessage interface {
	marshal() []byte;
}

type encryptor interface {
	// XORKeyStream xors the contents of the slice with bytes from the key stream.
	XORKeyStream(buf []byte);
}

// mutualVersion returns the protocol version to use given the advertised
// version of the peer.
func mutualVersion(theirMajor, theirMinor uint8) (major, minor uint8, ok bool) {
	// We don't deal with peers < TLS 1.0 (aka version 3.1).
	if theirMajor < 3 || theirMajor == 3 && theirMinor < 1 {
		return 0, 0, false
	}
	major = 3;
	minor = 2;
	if theirMinor < minor {
		minor = theirMinor
	}
	ok = true;
	return;
}

// A nop implements the NULL encryption and MAC algorithms.
type nop struct{}

func (nop) XORKeyStream(buf []byte)	{}

func (nop) Write(buf []byte) (int, os.Error)	{ return len(buf), nil }

func (nop) Sum() []byte	{ return nil }

func (nop) Reset()	{}

func (nop) Size() int	{ return 0 }
