1/*
2 * ringBufferThreads.h - SecureTransport client and server thread
3 *		routines which use ringBufferIo for I/O (no sockets).
4 */
5
6#include <Security/SecureTransport.h>
7#include <Security/SecureTransportPriv.h>
8#include <clAppUtils/ringBufferIo.h>
9#include <CoreFoundation/CoreFoundation.h>
10
11#ifndef	_RING_BUFFER_THREADS_H_
12#define _RING_BUFFER_THREADS_H_
13
14#ifdef __cplusplus
15extern "C" {
16#endif
17
18#define SHARED_SECRET_SIZE		32
19
20/*
21 * arguments to client thread and server pseudothread
22 */
23typedef struct {
24	unsigned			xferSize;		/* total bytes for client to write and server to
25										 * read */
26	void				*xferBuf;		/* move to/from here */
27	unsigned			chunkSize;		/* size of xferBuf; client writes this much at
28										 *   a time */
29	RingBuffer			*ringWrite;		/* I/O writes to this... */
30	RingBuffer			*ringRead;		/* ...and reads from this */
31
32	/* client's goFlag is &(server's iAmReady); vice versa */
33	bool				iAmReady;		/* this thread is ready for handshake */
34	bool				*goFlag;		/* when both threads see this, they start
35										 * their handshakes */
36	bool				*abortFlag;		/* anyone sets this on error */
37										/* everyone aborts when they see this true */
38	bool				pauseOnError;	/* call testError() on error */
39
40	char				*hostName;		/* optional for client */
41
42	/* EAP-specific stuff */
43	unsigned char		sharedSecret[SHARED_SECRET_SIZE];
44	unsigned char		*sessionTicket;	/* for client only */
45	unsigned			sessionTicketLen;
46
47	/*
48 	 * setMasterSecret indicates wheter we call SSLInternalSetMasterSecretFunction().
49	 * If false, the server better have a signing identity in idArray.
50	 */
51	bool				setMasterSecret;
52	CFArrayRef			idArray;		/* optional, server only */
53	CFArrayRef			trustedRoots;	/* generally from server's idArray */
54
55	/* returned on success */
56	SSLProtocol			negotiatedProt;
57	SSLCipherSuite		negotiatedCipher;
58	Boolean				sessionWasResumed;
59
60	CFAbsoluteTime		startHandshake;
61	CFAbsoluteTime		startData;
62	CFAbsoluteTime		endData;
63} RingBufferArgs;
64
65/*
66 * Client thread - handshake and write sslArgs->xferSize bytes of data.
67 */
68void *rbClientThread(void *arg);
69
70/*
71 * Server function - like clientThread except it runs from the main thread.
72 * handshake and read sslArgs->xferSize bytes of data.
73 */
74OSStatus rbServerThread(RingBufferArgs *sslArgs);
75
76#ifdef __cplusplus
77}
78#endif
79
80#endif	/* _RING_BUFFER_THREADS_H_*/
81