From 527c94c06bd0e59e2bd89da9f5f0682899a1f9cf Mon Sep 17 00:00:00 2001 From: Takashi Kojo Date: Sun, 18 Jun 2017 09:45:52 +0900 Subject: [PATCH] add test_wolfSSL_msgCb --- src/ssl.c | 29 +++++++------ tests/api.c | 95 ++++++++++++++++++++++++++++++++++++++++++- wolfssl/error-ssl.h | 2 +- wolfssl/openssl/ssl.h | 3 +- wolfssl/ssl.h | 8 ++-- 5 files changed, 114 insertions(+), 23 deletions(-) diff --git a/src/ssl.c b/src/ssl.c index 698b0c9c0..f11de54be 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -5873,8 +5873,16 @@ int wolfSSL_CertManagerDisableOCSPStapling(WOLFSSL_CERT_MANAGER* cm) #endif return ret; } - - +#if defined(SESSION_CERTS) +STACK_OF(WOLFSSL_X509)* wolfSSL_get_peer_cert_chain(const WOLFSSL* ssl) +{ + WOLFSSL_ENTER("wolfSSL_get_peer_cert_chain"); + if ((ssl == NULL) || (ssl->session.chain.count == 0)) + return NULL; + else + return (STACK_OF(WOLFSSL_X509)* )&ssl->session.chain; +} +#endif #ifdef HAVE_OCSP @@ -24993,15 +25001,6 @@ int wolfSSL_version(WOLFSSL* ssl) return WOLFSSL_FAILURE; } -STACK_OF(WOLFSSL_X509)* wolfSSL_get_peer_cert_chain(const WOLFSSL* ssl) -{ - WOLFSSL_ENTER("wolfSSL_get_peer_cert_chain"); - if (ssl == NULL) - return NULL; - else - return (STACK_OF(WOLFSSL_X509)* )&ssl->session.chain; -} - WOLFSSL_CTX* wolfSSL_get_SSL_CTX(WOLFSSL* ssl) { WOLFSSL_ENTER("wolfSSL_get_SSL_CTX"); @@ -26403,20 +26402,20 @@ int wolfSSL_set_msg_callback(WOLFSSL *ssl, SSL_Msg_Cb cb) } #ifndef NO_WOLFSSL_STUB -int wolfSSL_CTX_set_msg_callback_arg(WOLFSSL_CTX *ctx, void* arg) +void wolfSSL_CTX_set_msg_callback_arg(WOLFSSL_CTX *ctx, void* arg) { WOLFSSL_STUB("SSL_CTX_set_msg_callback_arg"); (void)ctx; (void)arg; - return WOLFSSL_FAILURE; + return; } #endif -int wolfSSL_set_msg_callback_arg(WOLFSSL *ssl, void* arg) +void wolfSSL_set_msg_callback_arg(WOLFSSL *ssl, void* arg) { WOLFSSL_ENTER("wolfSSL_set_msg_callback_arg"); ssl->protoMsgCtx = arg; - return SSL_SUCCESS; + return; } void *wolfSSL_OPENSSL_memdup(const void *data, size_t siz, const char* file, int line) diff --git a/tests/api.c b/tests/api.c index ccedaebc5..3f0c1403f 100644 --- a/tests/api.c +++ b/tests/api.c @@ -45,6 +45,8 @@ #include /* compatibility layer */ #include #include +#include "examples/server/server.h" + /* for testing compatibility layer callbacks */ #ifndef NO_MD5 #include @@ -10345,9 +10347,10 @@ static void test_wolfSSL_BN(void) #endif /* defined(OPENSSL_EXTRA) && !defined(NO_ASN) */ } +#define TEST_ARG 0x1234 #if defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && \ !defined(NO_FILESYSTEM) && !defined(NO_RSA) -#define TEST_ARG 0x1234 + static void msg_cb(int write_p, int version, int content_type, const void *buf, size_t len, SSL *ssl, void *arg) { (void)write_p; @@ -10360,6 +10363,91 @@ static void msg_cb(int write_p, int version, int content_type, const void *buf, } #endif +#if defined(OPENSSL_EXTRA) +static int folk_testServer(THREAD_TYPE *serverThread, tcp_ready *ready) +{ + static char **svr_argv ; +#ifdef WOLFSSL_TIRTOS + func_args svrArgs = {0}; + svrArgs.argc = 1; + svrArgs.argv = svr_argv; +#else + func_args svrArgs = { 1, svr_argv, 0, NULL, NULL}; +#endif + + InitTcpReady(ready); + /* start server */ + svrArgs.signal = ready; + start_thread(server_test, &svrArgs, serverThread); + wait_tcp_ready(&svrArgs); + printf("Server folked\n"); + return SSL_SUCCESS; +} + +static int join_testServer(THREAD_TYPE *serverThread, tcp_ready *ready) +{ + printf("Joining server\n"); + join_thread(*serverThread); + +#ifdef WOLFSSL_TIRTOS + fdCloseSession(Task_self()); +#endif + FreeTcpReady(ready); + + return SSL_SUCCESS; +} +#endif + +static void test_wolfSSL_msgCb(void){ + #if defined(OPENSSL_EXTRA) + SSL* ssl; + SSL_CTX* ctx; + #if defined(SESSION_CERTS) + STACK_OF(WOLFSSL_X509)* chain; + #endif + THREAD_TYPE serverThread; + tcp_ready ready; + SOCKET_T sockfd = WOLFSSL_SOCKET_INVALID; + const char testMsg[] = "Hello Server"; + #define BUF_SIZE 100 + char recvBuff[BUF_SIZE]; + + printf(testingFmt, "test_wolfSSL_Get_others()"); + + AssertNotNull(ctx = SSL_CTX_new(wolfTLSv1_2_client_method())); + AssertTrue(wolfSSL_CTX_load_verify_locations(ctx, caCertFile,0) + == SSL_SUCCESS); + AssertTrue(wolfSSL_CTX_use_certificate_chain_file(ctx, cliCertFile) + == SSL_SUCCESS); + AssertTrue(wolfSSL_CTX_use_PrivateKey_file(ctx, cliKeyFile, SSL_FILETYPE_PEM) + == SSL_SUCCESS); + + AssertTrue(folk_testServer(&serverThread, &ready) == SSL_SUCCESS); + + AssertNotNull(ssl = SSL_new(ctx)); + AssertTrue(SSL_set_msg_callback(ssl, msg_cb) == SSL_SUCCESS); + SSL_set_msg_callback_arg(ssl, (void*)TEST_ARG); +#if defined(SESSION_CERTS) + AssertNull(chain = SSL_get_peer_cert_chain(ssl)); +#endif + tcp_connect(&sockfd, wolfSSLIP, wolfSSLPort, 0, 0, ssl); + AssertTrue(wolfSSL_set_fd(ssl, sockfd) == SSL_SUCCESS); + + AssertTrue(wolfSSL_connect(ssl) == SSL_SUCCESS); +#if defined(SESSION_CERTS) + AssertTrue((chain = SSL_get_peer_cert_chain(ssl)) != NULL); +#endif + AssertTrue(wolfSSL_write(ssl, testMsg, (int)strlen(testMsg)) == + (int)strlen(testMsg)); + AssertTrue(wolfSSL_read(ssl, recvBuff, sizeof(recvBuff)) > 0); + + AssertTrue(join_testServer (&serverThread, &ready) == SSL_SUCCESS); + + printf(resultFmt, passed); + + #endif +} + static void test_wolfSSL_set_options(void) { #if defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && \ @@ -10395,7 +10483,7 @@ static void test_wolfSSL_set_options(void) SSL_OP_NO_COMPRESSION) == SSL_OP_NO_COMPRESSION); AssertTrue(SSL_set_msg_callback(ssl, msg_cb) == SSL_SUCCESS); - AssertTrue(SSL_set_msg_callback_arg(ssl, arg) == SSL_SUCCESS); + SSL_set_msg_callback_arg(ssl, arg); AssertTrue(SSL_CTX_set_alpn_protos(ctx, protos, len) == SSL_SUCCESS); @@ -11349,6 +11437,9 @@ void ApiTest(void) test_wolfSSL_EVP_MD_hmac_signing(); test_wolfSSL_CTX_add_extra_chain_cert(); test_wolfSSL_ERR_peek_last_error_line(); + test_wolfSSL_set_options(); + test_wolfSSL_X509_STORE_CTX(); + test_wolfSSL_msgCb(); test_wolfSSL_X509_STORE_set_flags(); test_wolfSSL_X509_LOOKUP_load_file(); test_wolfSSL_X509_NID(); diff --git a/wolfssl/error-ssl.h b/wolfssl/error-ssl.h index facab69a9..204bbb6aa 100644 --- a/wolfssl/error-ssl.h +++ b/wolfssl/error-ssl.h @@ -181,7 +181,7 @@ enum wolfSSL_ErrorCodes { }; -#ifdef WOLFSSL_CALLBACKS +#if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA) enum { MIN_PARAM_ERR = UNSUPPORTED_SUITE, MAX_PARAM_ERR = MIN_PARAM_ERR - 10 diff --git a/wolfssl/openssl/ssl.h b/wolfssl/openssl/ssl.h index fc702ded2..03a831bfc 100644 --- a/wolfssl/openssl/ssl.h +++ b/wolfssl/openssl/ssl.h @@ -434,6 +434,7 @@ typedef WOLFSSL_X509_STORE_CTX X509_STORE_CTX; #define SSL_CTX_set_session_id_context wolfSSL_CTX_set_session_id_context #define SSL_get_peer_certificate wolfSSL_get_peer_certificate +#define SSL_get_peer_cert_chain wolfSSL_get_peer_cert_chain #define SSL_want_read wolfSSL_want_read #define SSL_want_write wolfSSL_want_write @@ -656,7 +657,7 @@ typedef WOLFSSL_X509_NAME_ENTRY X509_NAME_ENTRY; #define SSL_version wolfSSL_version #define SSL_get_state wolfSSL_get_state #define SSL_state_string_long wolfSSL_state_string_long -#define SSL_get_peer_cert_chain wolfSSL_get_peer_cert_chain + #define sk_X509_NAME_value wolfSSL_sk_X509_NAME_value #define sk_X509_value wolfSSL_sk_X509_value #define SSL_SESSION_get_ex_data wolfSSL_SESSION_get_ex_data diff --git a/wolfssl/ssl.h b/wolfssl/ssl.h index aad887fae..ff973dc54 100644 --- a/wolfssl/ssl.h +++ b/wolfssl/ssl.h @@ -2430,8 +2430,6 @@ WOLFSSL_API void* wolfSSL_sk_X509_NAME_value(const WOLF_STACK_OF(WOLFSSL_X509_NA WOLFSSL_API void* wolfSSL_sk_X509_value(WOLF_STACK_OF(WOLFSSL_X509)*, int); -WOLFSSL_API WOLF_STACK_OF(WOLFSSL_X509)* wolfSSL_get_peer_cert_chain(const WOLFSSL*); - WOLFSSL_API void* wolfSSL_SESSION_get_ex_data(const WOLFSSL_SESSION*, int); WOLFSSL_API int wolfSSL_SESSION_set_ex_data(WOLFSSL_SESSION*, int, void*); @@ -2505,8 +2503,10 @@ typedef void (*SSL_Msg_Cb)(int write_p, int version, int content_type, WOLFSSL_API int wolfSSL_CTX_set_msg_callback(WOLFSSL_CTX *ctx, SSL_Msg_Cb cb); WOLFSSL_API int wolfSSL_set_msg_callback(WOLFSSL *ssl, SSL_Msg_Cb cb); -WOLFSSL_API int wolfSSL_CTX_set_msg_callback_arg(WOLFSSL_CTX *ctx, void* arg); -WOLFSSL_API int wolfSSL_set_msg_callback_arg(WOLFSSL *ssl, void* arg); +WOLFSSL_API void wolfSSL_CTX_set_msg_callback_arg(WOLFSSL_CTX *ctx, void* arg); +WOLFSSL_API void wolfSSL_set_msg_callback_arg(WOLFSSL *ssl, void* arg); +WOLFSSL_API WOLF_STACK_OF(WOLFSSL_X509)* wolfSSL_get_peer_cert_chain(const WOLFSSL*); + #endif #ifdef OPENSSL_EXTRA