--- /dev/null
+/*
+ * sslSession.cpp - basic 2-thread SSL server/client session
+ */
+#include <Security/SecureTransport.h>
+#include <Security/Security.h>
+#include <clAppUtils/sslAppUtils.h>
+#include <clAppUtils/ioSock.h>
+#include <clAppUtils/sslThreading.h>
+#include <security_cdsa_utils/cuFileIo.h>
+#include <utilLib/common.h>
+#include <security_cdsa_utils/cuPrintCert.h>
+#include <security_utilities/threading.h>
+#include <security_utilities/devrandom.h>
+
+#include <CoreServices/../Frameworks/CarbonCore.framework/Headers/MacErrors.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <time.h>
+#include <ctype.h>
+#include <sys/param.h>
+
+#define PORT_DEF 4000
+#define HOST_DEF "localhost"
+#define DH_PARAMS "dhParams_512.der"
+
+static void usage(char **argv)
+{
+ printf("Usage: %s server_kc [options]\n", argv[0]);
+ printf("options:\n");
+ printf(" P=port (default = %d)\n", PORT_DEF);
+ printf(" c=client_kc (default is none)\n");
+ printf(" d (DSA, default is RSA)\n");
+ printf(" f (D-H, default is RSA)\n");
+ printf(" a anchor File for client side (typically, the server's cert)\n");
+ printf(" A anchor file for server side (typically, the client's cert)\n");
+ printf(" h hostname (default is %s)\n", HOST_DEF);
+ printf(" k (skip hostname check)\n");
+ printf(" b (non blocking I/O)\n");
+ printf(" u Require client authentication\n");
+ printf(" x Expect policy verify error on client side\n");
+ printf(" X Expect policy verify error on server side\n");
+ printf(" z=kc_pwd\n");
+ printf(" R (ringBuffer I/O)\n");
+ printf(" l=loops (default 1)\n");
+ printf(" q(uiet)\n");
+ printf(" v(erbose)\n");
+ exit(1);
+}
+
+#define IGNORE_SIGPIPE 1
+#if IGNORE_SIGPIPE
+#include <signal.h>
+
+void sigpipe(int sig)
+{
+}
+#endif /* IGNORE_SIGPIPE */
+
+static SSLCipherSuite ciphers[] = {
+ SSL_RSA_WITH_RC4_128_SHA, SSL_NO_SUCH_CIPHERSUITE
+};
+
+/*
+ * Default params for each test. Main() adjust this per cmd line
+ * args.
+ */
+SslAppTestParams serverDefaults =
+{
+ "no name here",
+ false, // skipHostNameCHeck
+ PORT_DEF,
+ NULL, NULL, // RingBuffers
+ false, // noProtSpec
+ kTLSProtocol1,
+ NULL, // acceptedProts - not used in this test
+ NULL, // myCerts - const
+ NULL, // password
+ true, // idIsTrustedRoot
+ false, // disableCertVerify
+ NULL, // anchorFile
+ false, // replaceAnchors
+ kNeverAuthenticate,
+ false, // resumeEnable
+ ciphers, // ciphers
+ false, // nonBlocking
+ NULL, // dhParams
+ 0, // dhParamsLen
+ noErr, // expectRtn
+ kTLSProtocol1, // expectVersion
+ kSSLClientCertNone,
+ SSL_CIPHER_IGNORE,
+ false, // quiet
+ false, // silent
+ false, // verbose
+ {0}, // lock
+ {0}, // cond
+ false, // serverReady
+ 0, // clientDone
+ false, // serverAbort
+ /* returned */
+ kSSLProtocolUnknown,
+ SSL_NULL_WITH_NULL_NULL,
+ kSSLClientCertNone,
+ noHardwareErr
+
+};
+
+SslAppTestParams clientDefaults =
+{
+ HOST_DEF,
+ false, // skipHostNameCHeck
+ PORT_DEF,
+ NULL, NULL, // RingBuffers
+ false, // noProtSpec
+ kTLSProtocol1,
+ NULL, // acceptedProts - not used in this test
+ NULL, // myCerts - const
+ NULL, // password
+ true, // idIsTrustedRoot
+ false, // disableCertVerify
+ NULL, // anchorFile
+ false, // replaceAnchors
+ kNeverAuthenticate,
+ false, // resumeEnable
+ NULL, // ciphers
+ false, // nonBlocking
+ NULL, // dhParams
+ 0, // dhParamsLen
+ noErr, // expectRtn
+ kTLSProtocol1, // expectVersion
+ kSSLClientCertNone,
+ SSL_CIPHER_IGNORE,
+ false, // quiet
+ false, // silent
+ false, // verbose
+ {0}, // lock
+ {0}, // cond
+ false, // serverReady
+ 0, // clientDone
+ false, // serverAbort
+ /* returned */
+ kSSLProtocolUnknown,
+ SSL_NULL_WITH_NULL_NULL,
+ kSSLClientCertNone,
+ noHardwareErr
+
+};
+
+int main(int argc, char **argv)
+{
+ int ourRtn = 0;
+ char *argp;
+ bool dhEnable = false;
+ unsigned loop;
+ unsigned loops = 1;
+ bool ringBufferIo = false;
+ RingBuffer serverToClientRing;
+ RingBuffer clientToServerRing;
+
+ if(argc < 2) {
+ usage(argv);
+ }
+ serverDefaults.myCertKcName = argv[1];
+ for(int arg=2; arg<argc; arg++) {
+ argp = argv[arg];
+ switch(argp[0]) {
+ case 'c':
+ clientDefaults.myCertKcName = &argp[2];
+ case 'q':
+ serverDefaults.quiet = clientDefaults.quiet = true;
+ break;
+ case 'v':
+ serverDefaults.verbose = clientDefaults.verbose = true;
+ break;
+ case 'p':
+ serverDefaults.port = clientDefaults.port = atoi(&argp[2]);
+ break;
+ case 'b':
+ serverDefaults.nonBlocking = clientDefaults.nonBlocking =
+ true;
+ break;
+ case 'd':
+ ciphers[0] = SSL_DH_DSS_WITH_3DES_EDE_CBC_SHA;
+ dhEnable = true;
+ break;
+ case 'f':
+ ciphers[0] = SSL_DH_anon_WITH_RC4_128_MD5;
+ dhEnable = true;
+ break;
+ case 'h':
+ if(++arg == argc) {
+ usage(argv);
+ }
+ clientDefaults.hostName=argv[arg];
+ break;
+ case 'k':
+ clientDefaults.skipHostNameCheck = true;
+ break;
+ case 'a':
+ if(++arg == argc) {
+ usage(argv);
+ }
+ clientDefaults.anchorFile = serverDefaults.anchorFile = argv[arg];
+ break;
+ case 'A':
+ if(++arg == argc) {
+ usage(argv);
+ }
+ serverDefaults.anchorFile = argv[arg];
+ break;
+ case 'z':
+ serverDefaults.password = &argp[2];
+ break;
+ case 'P':
+ serverDefaults.port = clientDefaults.port = atoi(&argp[2]);
+ break;
+ case 'u':
+ serverDefaults.authenticate = kAlwaysAuthenticate;
+ if(serverDefaults.expectCertState == kSSLClientCertNone) {
+ serverDefaults.expectCertState = kSSLClientCertSent;
+ }
+ /* else it was set by 'X' option */
+ if(clientDefaults.expectCertState == kSSLClientCertNone) {
+ clientDefaults.expectCertState = kSSLClientCertSent;
+ }
+ /* else...ditto */
+ break;
+ case 'x':
+ /* server side has bad cert */
+ clientDefaults.expectRtn = errSSLXCertChainInvalid;
+ serverDefaults.expectRtn = errSSLPeerCertUnknown;
+ break;
+ case 'X':
+ /* client side has bad cert */
+ serverDefaults.expectRtn = errSSLXCertChainInvalid;
+ clientDefaults.expectRtn = errSSLPeerCertUnknown;
+ serverDefaults.expectCertState = kSSLClientCertRejected;
+ clientDefaults.expectCertState = kSSLClientCertRejected;
+ break;
+ case 'R':
+ ringBufferIo = true;
+ break;
+ case 'l':
+ loops = atoi(&argp[2]);
+ break;
+ default:
+ usage(argv);
+ }
+ }
+
+ #if IGNORE_SIGPIPE
+ signal(SIGPIPE, sigpipe);
+ #endif
+
+ if(ringBufferIo) {
+ /* set up ring buffers */
+ ringBufSetup(&serverToClientRing, "serveToClient", DEFAULT_NUM_RB_BUFS, DEFAULT_BUF_RB_SIZE);
+ ringBufSetup(&clientToServerRing, "clientToServe", DEFAULT_NUM_RB_BUFS, DEFAULT_BUF_RB_SIZE);
+ serverDefaults.serverToClientRing = &serverToClientRing;
+ serverDefaults.clientToServerRing = &clientToServerRing;
+ clientDefaults.serverToClientRing = &serverToClientRing;
+ clientDefaults.clientToServerRing = &clientToServerRing;
+ }
+ if(dhEnable) {
+ /* snag D-H params */
+ if(readFile(DH_PARAMS, (unsigned char **)&serverDefaults.dhParams,
+ &serverDefaults.dhParamsLen)) {
+ printf("***Error reading Diffie-Hellman params."
+ " Patience, grasshopper.\n");
+ }
+ }
+ testStartBanner("sslSession", argc, argv);
+ for(loop=0; loop<loops; loop++) {
+ ourRtn = sslRunSession(&serverDefaults, &clientDefaults, NULL);
+ if(ourRtn) {
+ break;
+ }
+ }
+ if(!clientDefaults.quiet) {
+ if(ourRtn == 0) {
+ if(!serverDefaults.quiet) {
+ printf("===== %s test PASSED =====\n", argv[0]);
+ }
+ }
+ else {
+ printf("****FAIL: %d errors detected\n", ourRtn);
+ }
+ }
+
+ return ourRtn;
+}