]> git.saurik.com Git - apple/security.git/blobdiff - SecurityTests/clxutils/clAppUtils/sslRingBufferThreads.cpp
Security-57031.1.35.tar.gz
[apple/security.git] / SecurityTests / clxutils / clAppUtils / sslRingBufferThreads.cpp
diff --git a/SecurityTests/clxutils/clAppUtils/sslRingBufferThreads.cpp b/SecurityTests/clxutils/clAppUtils/sslRingBufferThreads.cpp
new file mode 100644 (file)
index 0000000..fc80520
--- /dev/null
@@ -0,0 +1,304 @@
+/* 
+ * sslRingBufferThreads.cpp - SecureTransport client and server thread
+ *             routines which use ringBufferIo for I/O (no sockets).
+ */
+#include "sslRingBufferThreads.h"
+#include <stdlib.h>
+#include <pthread.h>
+#include <stdio.h>
+#include <strings.h>
+#include <clAppUtils/sslAppUtils.h>
+#include <utilLib/common.h>
+
+#define LOG_TOP_IO     0
+#if            LOG_TOP_IO      
+
+static void logWrite(
+       char *who,
+       size_t written)
+{
+       pthread_mutex_lock(&printfMutex);
+       printf("+++ %s wrote %4lu bytes\n", who, (unsigned long)written);
+       pthread_mutex_unlock(&printfMutex);
+}
+
+static void logRead(
+       char *who,
+       size_t bytesRead)
+{
+       pthread_mutex_lock(&printfMutex);
+       printf("+++ %s  read %4lu bytes\n", who, (unsigned long)bytesRead);
+       pthread_mutex_unlock(&printfMutex);
+}
+
+#else  /* LOG_TOP_IO */
+#define logWrite(who, w)
+#define logRead(who, r)
+#endif /* LOG_TOP_IO */
+
+/* client thread - handshake and write a ton of data */
+void *sslRbClientThread(void *arg)
+{
+       SslRingBufferArgs       *sslArgs = (SslRingBufferArgs *)arg;
+    OSStatus            ortn;
+    SSLContextRef       ctx = NULL;
+       RingBuffers                     ringBufs = {sslArgs->ringRead, sslArgs->ringWrite};
+        unsigned toMove = 0;
+        unsigned thisMove;
+
+       ortn = SSLNewContext(false, &ctx);
+       if(ortn) {
+               printSslErrStr("SSLNewContext", ortn);
+               goto cleanup;
+       } 
+       ortn = SSLSetIOFuncs(ctx, ringReadFunc, ringWriteFunc);
+       if(ortn) {
+               printSslErrStr("SSLSetIOFuncs", ortn);
+               goto cleanup;
+       } 
+       ortn = SSLSetConnection(ctx, (SSLConnectionRef)&ringBufs);
+       if(ortn) {
+               printSslErrStr("SSLSetConnection", ortn);
+               goto cleanup;
+       }
+       ortn = SSLSetEnabledCiphers(ctx, &sslArgs->cipherSuite, 1);
+       if(ortn) {
+               printSslErrStr("SSLSetEnabledCiphers", ortn);
+               goto cleanup;
+       }
+       if(sslArgs->idArray) {
+               ortn = SSLSetCertificate(ctx, sslArgs->idArray);
+               if(ortn) {
+                       printSslErrStr("SSLSetCertificate", ortn);
+                       goto cleanup;
+               }
+       }
+       if(sslArgs->trustedRoots) {
+               ortn = SSLSetTrustedRoots(ctx, sslArgs->trustedRoots, true);
+               if(ortn) {
+                       printSslErrStr("SSLSetTrustedRoots", ortn);
+                       goto cleanup;
+               }
+       }
+       SSLSetProtocolVersionEnabled(ctx, kSSLProtocolAll, false);
+       ortn = SSLSetProtocolVersionEnabled(ctx, sslArgs->prot, true);
+       if(ortn) {
+               printSslErrStr("SSLSetProtocolVersionEnabled", ortn);
+               goto cleanup;
+       }
+
+       /* tell main thread we're ready; wait for sync flag */
+       sslArgs->iAmReady = true;
+       while(!(*sslArgs->goFlag)) {
+               if(*sslArgs->abortFlag) {
+                       goto cleanup;
+               }
+       }
+       
+       /* GO handshake */
+       sslArgs->startHandshake = CFAbsoluteTimeGetCurrent();
+       do {   
+               ortn = SSLHandshake(ctx);
+               if(*sslArgs->abortFlag) {
+                       goto cleanup;
+               }
+    } while (ortn == errSSLWouldBlock);
+
+       if(ortn) {
+               printSslErrStr("SSLHandshake", ortn);
+               goto cleanup;
+       }
+
+       SSLGetNegotiatedCipher(ctx, &sslArgs->negotiatedCipher);
+       SSLGetNegotiatedProtocolVersion(ctx, &sslArgs->negotiatedProt);
+
+       sslArgs->startData = CFAbsoluteTimeGetCurrent();
+
+       toMove = sslArgs->xferSize;
+       
+       if(toMove == 0) {
+               sslArgs->endData = sslArgs->startData;
+               goto cleanup;
+       }
+       
+       /* GO data xfer */
+       do {
+               thisMove = sslArgs->chunkSize;
+               if(thisMove > toMove) {
+                       thisMove = toMove;
+               }
+               size_t moved;
+               ortn = SSLWrite(ctx, sslArgs->xferBuf, thisMove, &moved);
+               /* should never fail - implemented as blocking */
+               if(ortn) {
+                       printSslErrStr("SSLWrite", ortn);
+                       goto cleanup;
+               }
+               logWrite("client", moved);
+               if(!sslArgs->runForever) {
+                       toMove -= moved;
+               }
+               if(*sslArgs->abortFlag) {
+                       goto cleanup;
+               }
+       } while(toMove || sslArgs->runForever);
+
+       sslArgs->endData = CFAbsoluteTimeGetCurrent();
+       
+cleanup:
+       if(ortn) {
+               *sslArgs->abortFlag = true;
+       }
+       if(*sslArgs->abortFlag && sslArgs->pauseOnError) {
+               /* abort for any reason - freeze! */
+               testError(CSSM_FALSE);
+       }
+       if(ctx) {
+               SSLClose(ctx);
+               SSLDisposeContext(ctx);
+       }
+       if(ortn) {
+               printf("***Client thread returning %lu\n", (unsigned long)ortn);
+       }
+       pthread_exit((void*)ortn);
+       /* NOT REACHED */
+       return (void *)ortn;
+
+}
+
+/* server function - like clientThread except it runs from the main thread */
+/* handshake and read a ton of data */
+OSStatus sslRbServerThread(SslRingBufferArgs *sslArgs)
+{
+    OSStatus            ortn;
+    SSLContextRef       ctx = NULL;
+       RingBuffers                     ringBufs = {sslArgs->ringRead, sslArgs->ringWrite};
+        unsigned toMove = 0;
+        unsigned thisMove;
+
+       ortn = SSLNewContext(true, &ctx);
+       if(ortn) {
+               printSslErrStr("SSLNewContext", ortn);
+               goto cleanup;
+       } 
+       ortn = SSLSetIOFuncs(ctx, ringReadFunc, ringWriteFunc);
+       if(ortn) {
+               printSslErrStr("SSLSetIOFuncs", ortn);
+               goto cleanup;
+       } 
+       ortn = SSLSetConnection(ctx, (SSLConnectionRef)&ringBufs);
+       if(ortn) {
+               printSslErrStr("SSLSetConnection", ortn);
+               goto cleanup;
+       }
+       ortn = SSLSetEnabledCiphers(ctx, &sslArgs->cipherSuite, 1);
+       if(ortn) {
+               printSslErrStr("SSLSetEnabledCiphers", ortn);
+               goto cleanup;
+       }
+       if(sslArgs->idArray) {
+               ortn = SSLSetCertificate(ctx, sslArgs->idArray);
+               if(ortn) {
+                       printSslErrStr("SSLSetCertificate", ortn);
+                       goto cleanup;
+               }
+       }
+       if(sslArgs->trustedRoots) {
+               ortn = SSLSetTrustedRoots(ctx, sslArgs->trustedRoots, true);
+               if(ortn) {
+                       printSslErrStr("SSLSetTrustedRoots", ortn);
+                       goto cleanup;
+               }
+       }
+       SSLSetProtocolVersionEnabled(ctx, kSSLProtocolAll, false);
+       ortn = SSLSetProtocolVersionEnabled(ctx, sslArgs->prot, true);
+       if(ortn) {
+               printSslErrStr("SSLSetProtocolVersionEnabled", ortn);
+               goto cleanup;
+       }
+       
+       /* tell client thread we're ready; wait for sync flag */
+       sslArgs->iAmReady = true;
+       while(!(*sslArgs->goFlag)) {
+               if(*sslArgs->abortFlag) {
+                       goto cleanup;
+               }
+       }
+       
+       /* GO handshake */
+       sslArgs->startHandshake = CFAbsoluteTimeGetCurrent();
+       do {   
+               ortn = SSLHandshake(ctx);
+               if(*sslArgs->abortFlag) {
+                       goto cleanup;
+               }
+    } while (ortn == errSSLWouldBlock);
+
+       if(ortn) {
+               printSslErrStr("SSLHandshake", ortn);
+               goto cleanup;
+       }
+
+       SSLGetNegotiatedCipher(ctx, &sslArgs->negotiatedCipher);
+       SSLGetNegotiatedProtocolVersion(ctx, &sslArgs->negotiatedProt);
+
+       sslArgs->startData = CFAbsoluteTimeGetCurrent();
+
+       toMove = sslArgs->xferSize;
+       
+       if(toMove == 0) {
+               sslArgs->endData = sslArgs->startData;
+               goto cleanup;
+       }
+
+       /* GO data xfer */
+       do {
+               thisMove = sslArgs->xferSize;
+               if(thisMove > toMove) {
+                       thisMove = toMove;
+               }
+               size_t moved;
+               ortn = SSLRead(ctx, sslArgs->xferBuf, thisMove, &moved);
+               switch(ortn) {
+                       case noErr:
+                               break;
+                       case errSSLWouldBlock:
+                               /* cool, try again */
+                               ortn = noErr;
+                               break;
+                       default:
+                               break;
+               }
+               if(ortn) {
+                       printSslErrStr("SSLRead", ortn);
+                       goto cleanup;
+               }
+               logRead("server", moved);
+               if(!sslArgs->runForever) {
+                       toMove -= moved;
+               }
+               if(*sslArgs->abortFlag) {
+                       goto cleanup;
+               }
+       } while(toMove || sslArgs->runForever);
+
+       sslArgs->endData = CFAbsoluteTimeGetCurrent();
+       
+cleanup:
+       if(ortn) {
+               *sslArgs->abortFlag = true;
+       }
+       if(*sslArgs->abortFlag && sslArgs->pauseOnError) {
+               /* abort for any reason - freeze! */
+               testError(CSSM_FALSE);
+       }
+       if(ctx) {
+               SSLClose(ctx);
+               SSLDisposeContext(ctx);
+       }
+       if(ortn) {
+               printf("***Server thread returning %lu\n", (unsigned long)ortn);
+       }
+       return ortn;
+}