--- /dev/null
+/*
+ * ringBufferThreads.h - SecureTransport client and server thread
+ * routines which use ringBufferIo for I/O (no sockets).
+ */
+
+#include <Security/SecureTransport.h>
+#include <Security/SecureTransportPriv.h>
+#include <clAppUtils/ringBufferIo.h>
+#include <CoreFoundation/CoreFoundation.h>
+
+#ifndef _RING_BUFFER_THREADS_H_
+#define _RING_BUFFER_THREADS_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define SHARED_SECRET_SIZE 32
+
+/*
+ * arguments to client thread and server pseudothread
+ */
+typedef struct {
+ unsigned xferSize; /* total bytes for client to write and server to
+ * read */
+ void *xferBuf; /* move to/from here */
+ unsigned chunkSize; /* size of xferBuf; client writes this much at
+ * a time */
+ RingBuffer *ringWrite; /* I/O writes to this... */
+ RingBuffer *ringRead; /* ...and reads from this */
+
+ /* client's goFlag is &(server's iAmReady); vice versa */
+ bool iAmReady; /* this thread is ready for handshake */
+ bool *goFlag; /* when both threads see this, they start
+ * their handshakes */
+ bool *abortFlag; /* anyone sets this on error */
+ /* everyone aborts when they see this true */
+ bool pauseOnError; /* call testError() on error */
+
+ char *hostName; /* optional for client */
+
+ /* EAP-specific stuff */
+ unsigned char sharedSecret[SHARED_SECRET_SIZE];
+ unsigned char *sessionTicket; /* for client only */
+ unsigned sessionTicketLen;
+
+ /*
+ * setMasterSecret indicates wheter we call SSLInternalSetMasterSecretFunction().
+ * If false, the server better have a signing identity in idArray.
+ */
+ bool setMasterSecret;
+ CFArrayRef idArray; /* optional, server only */
+ CFArrayRef trustedRoots; /* generally from server's idArray */
+
+ /* returned on success */
+ SSLProtocol negotiatedProt;
+ SSLCipherSuite negotiatedCipher;
+ Boolean sessionWasResumed;
+
+ CFAbsoluteTime startHandshake;
+ CFAbsoluteTime startData;
+ CFAbsoluteTime endData;
+} RingBufferArgs;
+
+/*
+ * Client thread - handshake and write sslArgs->xferSize bytes of data.
+ */
+void *rbClientThread(void *arg);
+
+/*
+ * Server function - like clientThread except it runs from the main thread.
+ * handshake and read sslArgs->xferSize bytes of data.
+ */
+OSStatus rbServerThread(RingBufferArgs *sslArgs);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _RING_BUFFER_THREADS_H_*/