--- /dev/null
+/*
+ * sslRingBufferThreads.h - SecureTransport client and server thread
+ * routines which use ringBufferIo for I/O (no sockets).
+ */
+
+#include <Security/SecureTransport.h>
+#include <clAppUtils/ringBufferIo.h>
+#include <CoreFoundation/CoreFoundation.h>
+
+#ifndef _SSL_RING_BUFFER_THREADS_H_
+#define _SSL_RING_BUFFER_THREADS_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * arguments to client thread and server pseudothread
+ */
+typedef struct {
+ CFArrayRef idArray; /* required for server, optional for client */
+ CFArrayRef trustedRoots; /* generally from server's idArray */
+ 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 */
+ bool runForever; /* if true, ignore xferSize and move data forever
+ * or until error */
+ SSLCipherSuite cipherSuite;
+ SSLProtocol prot;
+ 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 */
+
+ /* returned on success */
+ SSLProtocol negotiatedProt;
+ SSLCipherSuite negotiatedCipher;
+
+ CFAbsoluteTime startHandshake;
+ CFAbsoluteTime startData;
+ CFAbsoluteTime endData;
+} SslRingBufferArgs;
+
+/*
+ * Client thread - handshake and write sslArgs->xferSize bytes of data.
+ */
+void *sslRbClientThread(void *arg);
+
+/*
+ * Server function - like clientThread except it runs from the main thread.
+ * handshake and read sslArgs->xferSize bytes of data.
+ */
+OSStatus sslRbServerThread(SslRingBufferArgs *sslArgs);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SSL_RING_BUFFER_THREADS_H_*/