]> granicus.if.org Git - libevent/commitdiff
Add a function to extract the SSL object from a bufferevent_openssl.
authorNick Mathewson <nickm@torproject.org>
Thu, 30 Jul 2009 20:41:00 +0000 (20:41 +0000)
committerNick Mathewson <nickm@torproject.org>
Thu, 30 Jul 2009 20:41:00 +0000 (20:41 +0000)
svn:r1395

bufferevent_openssl.c
include/event2/bufferevent_ssl.h
test/regress_ssl.c

index dd0b4edc385fc9aa2a19fb7695e17a5873d70dec..cbcfdf361db9deac45c3526ae918d72739c22446 100644 (file)
@@ -1005,6 +1005,15 @@ be_openssl_ctrl(struct bufferevent *bev,
        }
 }
 
+SSL *
+bufferevent_openssl_get_ssl(struct bufferevent *bufev)
+{
+       struct bufferevent_openssl *bev_ssl = upcast(bufev);
+       if (!bev_ssl)
+               return NULL;
+       return bev_ssl->ssl;
+}
+
 static struct bufferevent *
 bufferevent_openssl_new_impl(struct event_base *base,
     struct bufferevent *underlying,
index 060d6aeb2114589e531de3511e990c2528cc8b8b..540caad2e6e0135b1774428f07b7f534172940dc 100644 (file)
@@ -61,6 +61,10 @@ bufferevent_openssl_socket_new(struct event_base *base,
     struct ssl_st *ssl,
     enum bufferevent_ssl_state state,
     enum bufferevent_options options);
+
+struct ssl_st *
+bufferevent_openssl_get_ssl(struct bufferevent *bufev);
+
 #endif
 
 #ifdef __cplusplus
index 83e93d723895c30c8fccab3395dfa1248bfc1aca..d48bf2f1911c774463133d9c299e0121798af954 100644 (file)
@@ -176,9 +176,19 @@ static void
 eventcb(struct bufferevent *bev, short what, void *ctx)
 {
        TT_BLATHER(("Got event %d", (int)what));
-       if (what & BEV_EVENT_CONNECTED)
+       if (what & BEV_EVENT_CONNECTED) {
+               SSL *ssl;
+               X509 *peer_cert;
                ++n_connected;
-       else if (what & BEV_EVENT_EOF) {
+               ssl = bufferevent_openssl_get_ssl(bev);
+               tt_assert(ssl);
+               peer_cert = SSL_get_peer_certificate(ssl);
+               if (0==strcmp(ctx, "server")) {
+                       tt_assert(peer_cert == NULL);
+               } else {
+                       tt_assert(peer_cert != NULL);
+               }
+       } else if (what & BEV_EVENT_EOF) {
                TT_BLATHER(("Got a good EOF"));
                ++got_close;
                bufferevent_free(bev);
@@ -187,6 +197,8 @@ eventcb(struct bufferevent *bev, short what, void *ctx)
                ++got_error;
                bufferevent_free(bev);
        }
+end:
+       ;
 }
 
 static void
@@ -249,8 +261,10 @@ regress_bufferevent_openssl(void *arg)
        bufferevent_enable(bev1, EV_READ|EV_WRITE);
        bufferevent_enable(bev2, EV_READ|EV_WRITE);
 
-       bufferevent_setcb(bev1, respond_to_number, NULL, eventcb, NULL);
-       bufferevent_setcb(bev2, respond_to_number, NULL, eventcb, NULL);
+       bufferevent_setcb(bev1, respond_to_number, NULL, eventcb,
+           (void*)"client");
+       bufferevent_setcb(bev2, respond_to_number, NULL, eventcb,
+           (void*)"server");
 
        evbuffer_add_printf(bufferevent_get_output(bev1), "1\n");