#ifndef _SSLHANDSHAKE_H_
#define _SSLHANDSHAKE_H_
#include "cryptType.h"
#include "sslRecord.h"
#ifdef __cplusplus
extern "C" {
#endif
typedef enum
{ SSL_HdskHelloRequest = 0,
SSL_HdskClientHello = 1,
SSL_HdskServerHello = 2,
SSL_HdskCert = 11,
SSL_HdskServerKeyExchange = 12,
SSL_HdskCertRequest = 13,
SSL_HdskServerHelloDone = 14,
SSL_HdskCertVerify = 15,
SSL_HdskClientKeyExchange = 16,
SSL_HdskFinished = 20,
SSL_HdskNoCertAlert = 100
} SSLHandshakeType;
typedef enum
{ SSL_read,
SSL_write
} CipherSide;
typedef enum
{
SSL_HdskStateUninit = 0,
SSL_HdskStateServerUninit,
SSL_HdskStateClientUninit,
SSL_HdskStateGracefulClose,
SSL_HdskStateErrorClose,
SSL_HdskStateNoNotifyClose,
SSL_HdskStateServerHello,
SSL_HdskStateServerHelloUnknownVersion,
SSL_HdskStateKeyExchange,
SSL_HdskStateCert,
SSL_HdskStateHelloDone,
SSL_HdskStateClientCert,
SSL_HdskStateClientKeyExchange,
SSL_HdskStateClientCertVerify,
SSL_HdskStateChangeCipherSpec,
SSL_HdskStateFinished,
SSL2_HdskStateClientMasterKey,
SSL2_HdskStateClientFinished,
SSL2_HdskStateServerHello,
SSL2_HdskStateServerVerify,
SSL2_HdskStateServerFinished,
SSL_HdskStateServerReady,
SSL_HdskStateClientReady
} SSLHandshakeState;
typedef struct
{ SSLHandshakeType type;
SSLBuffer contents;
} SSLHandshakeMsg;
#define SSL_Finished_Sender_Server 0x53525652
#define SSL_Finished_Sender_Client 0x434C4E54
typedef OSStatus (*EncodeMessageFunc)(SSLRecord &rec, SSLContext *ctx);
OSStatus SSLProcessHandshakeRecord(SSLRecord rec, SSLContext *ctx);
OSStatus SSLPrepareAndQueueMessage(EncodeMessageFunc msgFunc, SSLContext *ctx);
OSStatus SSLAdvanceHandshake(SSLHandshakeType processed, SSLContext *ctx);
OSStatus SSL3ReceiveSSL2ClientHello(SSLRecord rec, SSLContext *ctx);
OSStatus SSLEncodeChangeCipherSpec(SSLRecord &rec, SSLContext *ctx);
OSStatus SSLProcessChangeCipherSpec(SSLRecord rec, SSLContext *ctx);
OSStatus SSLDisposeCipherSuite(CipherContext *cipher, SSLContext *ctx);
OSStatus SSLEncodeCertificate(SSLRecord &certificate, SSLContext *ctx);
OSStatus SSLProcessCertificate(SSLBuffer message, SSLContext *ctx);
OSStatus SSLEncodeCertificateRequest(SSLRecord &request, SSLContext *ctx);
OSStatus SSLProcessCertificateRequest(SSLBuffer message, SSLContext *ctx);
OSStatus SSLEncodeCertificateVerify(SSLRecord &verify, SSLContext *ctx);
OSStatus SSLProcessCertificateVerify(SSLBuffer message, SSLContext *ctx);
OSStatus SSLEncodeServerHello(SSLRecord &serverHello, SSLContext *ctx);
OSStatus SSLProcessServerHello(SSLBuffer message, SSLContext *ctx);
OSStatus SSLEncodeClientHello(SSLRecord &clientHello, SSLContext *ctx);
OSStatus SSLProcessClientHello(SSLBuffer message, SSLContext *ctx);
OSStatus SSLInitMessageHashes(SSLContext *ctx);
OSStatus SSLEncodeServerKeyExchange(SSLRecord &keyExch, SSLContext *ctx);
OSStatus SSLProcessServerKeyExchange(SSLBuffer message, SSLContext *ctx);
OSStatus SSLEncodeKeyExchange(SSLRecord &keyExchange, SSLContext *ctx);
OSStatus SSLProcessKeyExchange(SSLBuffer keyExchange, SSLContext *ctx);
OSStatus SSLInitPendingCiphers(SSLContext *ctx);
OSStatus SSLEncodeFinishedMessage(SSLRecord &finished, SSLContext *ctx);
OSStatus SSLProcessFinished(SSLBuffer message, SSLContext *ctx);
OSStatus SSLEncodeServerHelloDone(SSLRecord &helloDone, SSLContext *ctx);
OSStatus SSLProcessServerHelloDone(SSLBuffer message, SSLContext *ctx);
OSStatus SSLCalculateFinishedMessage(SSLBuffer finished, SSLBuffer shaMsgState, SSLBuffer md5MsgState, UInt32 senderID, SSLContext *ctx);
#ifdef __cplusplus
}
#endif
#endif