int main(int argc, char **argv) { int32 id; sslConn_t *svrConn, *clnConn; #ifdef ENABLE_PERF_TIMING int32 perfIter; uint32 clnTime, svrTime; #endif /* ENABLE_PERF_TIMING */ if (matrixSslOpen() < 0) { fprintf(stderr, "matrixSslOpen failed, exiting..."); } svrConn = psMalloc(PEERSEC_NO_POOL, sizeof(sslConn_t)); clnConn = psMalloc(PEERSEC_NO_POOL, sizeof(sslConn_t)); memset(svrConn, 0, sizeof(sslConn_t)); memset(clnConn, 0, sizeof(sslConn_t)); for (id = 0; ciphers[id].cipherId > 0; id++) { matrixSslInitSessionId(clientSessionId); _psTraceStr("Testing %s suite\n", ciphers[id].name); /* Standard Handshake */ _psTrace(" Standard handshake test\n"); #ifdef ENABLE_PERF_TIMING /* Each matrixSsl call in the handshake is wrapped by a timer. The data exchange phase is not being included in the time */ clnTime = svrTime = 0; for (perfIter = 0; perfIter < CONN_ITER; perfIter++) { #endif /* ENABLE_PERF_TIMING */ if (initializeHandshake(clnConn, svrConn, ciphers[id], &clientSessionId) < 0) { _psTrace(" FAILED: initializing Standard handshake\n"); goto LBL_FREE; } if (performHandshake(clnConn, svrConn) < 0) { _psTrace(" FAILED: Standard handshake\n"); goto LBL_FREE; } else { testTrace(" PASSED: Standard handshake"); if (exchangeAppData(clnConn, svrConn) < 0) { _psTrace(" but FAILED to exchange application data\n"); } else { testTrace("\n"); } } #ifdef ENABLE_PERF_TIMING clnTime += clnConn->runningTime; svrTime += svrConn->runningTime; /* Have to reset conn for full handshake... except last time through */ if (perfIter + 1 != CONN_ITER) { matrixSslDeleteSession(clnConn->ssl); matrixSslDeleteSession(svrConn->ssl); matrixSslInitSessionId(clientSessionId); } } /* iteration loop close */ _psTraceInt("CLIENT: %d " TIME_UNITS, (int32)clnTime/CONN_ITER); _psTraceInt("SERVER: %d " TIME_UNITS, (int32)svrTime/CONN_ITER); // _psTrace("Press any key to continue tests"); _psTrace("\n==========\n"); // getchar(); #endif /* ENABLE_PERF_TIMING */ #ifdef SSL_REHANDSHAKES_ENABLED /* Re-Handshake (full handshake over existing connection) */ _psTrace(" Re-handshake test (client-initiated)\n"); if (initializeReHandshake(clnConn, svrConn, ciphers[id].cipherId) < 0) { _psTrace(" FAILED: initializing Re-handshake\n"); goto LBL_FREE; } if (performHandshake(clnConn, svrConn) < 0) { _psTrace(" FAILED: Re-handshake\n"); goto LBL_FREE; } else { testTrace(" PASSED: Re-handshake"); if (exchangeAppData(clnConn, svrConn) < 0) { _psTrace(" but FAILED to exchange application data\n"); } else { testTrace("\n"); } } #else _psTrace(" Re-handshake tests are disabled (ENABLE_SECURE_REHANDSHAKES)\n"); #endif /* Resumed handshake (fast handshake over new connection) */ _psTrace(" Resumed handshake test (new connection)\n"); #ifdef ENABLE_PERF_TIMING clnTime = svrTime = 0; for (perfIter = 0; perfIter < CONN_ITER; perfIter++) { #endif /* ENABLE_PERF_TIMING */ if (initializeResumedHandshake(clnConn, svrConn, ciphers[id]) < 0) { _psTrace(" FAILED: initializing Resumed handshake\n"); goto LBL_FREE; } if (performHandshake(clnConn, svrConn) < 0) { _psTrace(" FAILED: Resumed handshake\n"); goto LBL_FREE; } else { testTrace(" PASSED: Resumed handshake"); if (exchangeAppData(clnConn, svrConn) < 0) { _psTrace(" but FAILED to exchange application data\n"); } else { testTrace("\n"); } } #ifdef ENABLE_PERF_TIMING clnTime += clnConn->runningTime; svrTime += svrConn->runningTime; /* Have to reset conn for full handshake */ } /* iteration loop */ _psTraceInt("CLIENT: %d " TIME_UNITS, (int32)clnTime/CONN_ITER); _psTraceInt("SERVER: %d " TIME_UNITS, (int32)svrTime/CONN_ITER); _psTrace("Press any key to continue tests"); _psTrace("\n==========\n"); // getchar(); #endif /* ENABLE_PERF_TIMING */ #ifdef SSL_REHANDSHAKES_ENABLED /* Re-handshake initiated by server (full handshake over existing conn) */ _psTrace(" Re-handshake test (server initiated)\n"); if (initializeServerInitiatedReHandshake(clnConn, svrConn, ciphers[id].cipherId) < 0) { _psTrace(" FAILED: initializing Re-handshake\n"); goto LBL_FREE; } if (performHandshake(svrConn, clnConn) < 0) { _psTrace(" FAILED: Re-handshake\n"); goto LBL_FREE; } else { testTrace(" PASSED: Re-handshake"); if (exchangeAppData(clnConn, svrConn) < 0) { _psTrace(" but FAILED to exchange application data\n"); } else { testTrace("\n"); } } /* Resumed re-handshake (fast handshake over existing connection) */ _psTrace(" Resumed Re-handshake test (client initiated)\n"); if (initializeResumedReHandshake(clnConn, svrConn, ciphers[id].cipherId) < 0) { _psTrace(" FAILED: initializing Resumed Re-handshake\n"); goto LBL_FREE; } if (performHandshake(clnConn, svrConn) < 0) { _psTrace(" FAILED: Resumed Re-handshake\n"); goto LBL_FREE; } else { testTrace(" PASSED: Resumed Re-handshake"); if (exchangeAppData(clnConn, svrConn) < 0) { _psTrace(" but FAILED to exchange application data\n"); } else { testTrace("\n"); } } /* Resumed re-handshake initiated by server (fast handshake over conn) */ _psTrace(" Resumed Re-handshake test (server initiated)\n"); if (initializeServerInitiatedResumedReHandshake(clnConn, svrConn, ciphers[id].cipherId) < 0) { _psTrace(" FAILED: initializing Resumed Re-handshake\n"); goto LBL_FREE; } if (performHandshake(svrConn, clnConn) < 0) { _psTrace(" FAILED: Resumed Re-handshake\n"); goto LBL_FREE; } else { testTrace(" PASSED: Resumed Re-handshake"); if (exchangeAppData(clnConn, svrConn) < 0) { _psTrace(" but FAILED to exchange application data\n"); } else { testTrace("\n"); } } /* Re-handshaking with "upgraded" parameters */ _psTrace(" Change cert callback Re-handshake test\n"); if (initializeUpgradeCertCbackReHandshake(clnConn, svrConn, ciphers[id].cipherId) < 0) { _psTrace(" FAILED: init upgrade certCback Re-handshake\n"); goto LBL_FREE; } if (performHandshake(clnConn, svrConn) < 0) { _psTrace(" FAILED: Upgrade cert callback Re-handshake\n"); goto LBL_FREE; } else { testTrace(" PASSED: Upgrade cert callback Re-handshake"); if (exchangeAppData(clnConn, svrConn) < 0) { _psTrace(" but FAILED to exchange application data\n"); } else { testTrace("\n"); } } /* Upgraded keys */ _psTrace(" Change keys Re-handshake test\n"); if (initializeUpgradeKeysReHandshake(clnConn, svrConn, ciphers[id].cipherId) < 0) { _psTrace(" FAILED: init upgrade keys Re-handshake\n"); goto LBL_FREE; } if (performHandshake(clnConn, svrConn) < 0) { _psTrace(" FAILED: Upgrade keys Re-handshake\n"); goto LBL_FREE; } else { testTrace(" PASSED: Upgrade keys Re-handshake"); if (exchangeAppData(clnConn, svrConn) < 0) { _psTrace(" but FAILED to exchange application data\n"); } else { testTrace("\n"); } } /* Change cipher spec test. Changing to a hardcoded RSA suite so this will not work on suites that don't have RSA material loaded */ if (ciphers[id].rsa == 1) { _psTrace(" Change cipher suite Re-handshake test\n"); if (initializeChangeCipherReHandshake(clnConn, svrConn, ciphers[id].cipherId) < 0) { _psTrace(" FAILED: init change cipher Re-handshake\n"); goto LBL_FREE; } if (performHandshake(clnConn, svrConn) < 0) { _psTrace(" FAILED: Change cipher suite Re-handshake\n"); goto LBL_FREE; } else { testTrace(" PASSED: Change cipher suite Re-handshake"); if (exchangeAppData(clnConn, svrConn) < 0) { _psTrace(" but FAILED to exchange application data\n"); } else { testTrace("\n"); } } } #endif /* !SSL_REHANDSHAKES_ENABLED */ LBL_FREE: freeSessionAndConnection(svrConn); freeSessionAndConnection(clnConn); } psFree(svrConn); psFree(clnConn); matrixSslClose(); #ifdef WIN32 _psTrace("Press any key to close"); getchar(); #endif return PS_SUCCESS; }
int main(int argc, char *argv[]) { int rv; int numbytes; pthread_t thread1, thread2, thread3; int iret1, iret2, iret3; if (argc != 3) { fprintf(stderr,"usage: client hostname port\n"); exit(1); } //set timer info struct timeval tv; tv.tv_sec = 10; /* 30 Secs Timeout */ tv.tv_usec = 0; // Not init'ing this can cause strange errors memset(&hints, 0, sizeof hints); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_DGRAM; if ((rv = getaddrinfo(argv[1], argv[2], &hints, &servinfo)) != 0) { fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv)); return 1; } // loop through all the results and make a socket for(p = servinfo; p != NULL; p = p->ai_next) { if ((sockfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1) { perror("talker: socket"); continue; } break; } if (p == NULL) { fprintf(stderr, "talker: failed to bind socket\n"); return 2; } setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv,sizeof(struct timeval)); //inititalize the handshake. initializeHandshake(); iret1 = pthread_create( &thread1, NULL, sendPacket, NULL); iret2 = pthread_create( &thread2, NULL, receivePacket, NULL); iret3 = pthread_create( &thread3, NULL, application, NULL); freeaddrinfo(servinfo); pthread_join( thread1, NULL); pthread_join( thread2, NULL); pthread_join( thread3, NULL); printf("Thread 1 returns: %d\n", iret1); printf("Thread 2 returns: %d\n", iret2); printf("Thread 3 returns: %d\n", iret3); close(sockfd); return 0; }