Bodo Moeller wrote: > >>> I just realized I have to accept either SSLV2 or SSLV3 (or TLS) > >>> connections, so I switched from SSLv3_server_method() to > >>> SSLv23_server_method(). But oops, that doesn't support SSL_peek()! > >>> What to do? > > >> Use SSL_accept first. It will change the SSL object's method > >> during the handshake. > > > Like this? Or are there unpleasant consequences to this > > (e.g. does SSL_accept block, or something silly like that)? > > This does seem to work in my one little test. > > Why modify the library? Simply call SSL_accept() in the application. To make SSL_peek() more analogous to SSL_read(). The doc for SSL_read() states "If necessary, SSL_read() will negotiate a TLS/SSL session, if not already explicitly performed by SSL_connect() or SSL_accept()." If SSL_read() can do it, SSL_peek() should, too. And it does, except for SSL23. > (Your are right that it is strange that the SSL23_methods support > SSL_read but not SSL_peek, but this should be fixed in s23_lib.c > and not in s23_srvr.c.) Your wish is my command. How about this patch? It's not complete, since it doesn't deal with client mode, but it does the server side nicely. - Dan diff -Naur openssl-0.9.6/ssl/s23_lib.c openssl/ssl/s23_lib.c --- openssl-0.9.6/ssl/s23_lib.c Wed Mar 7 12:50:37 2001 +++ openssl/ssl/s23_lib.c Wed Mar 7 21:31:58 2001 @@ -195,6 +195,24 @@ } } +/* Only used until ssl23_accept finishes, + * at which point SSL_peek(s, ...) will resolve + * to either ssl2_peek or ssl3_peek. + */ +int ssl23_srvr_peek(SSL *s, char *buf, int len) + { + int ret; + + /* can't call peek until accept decides whether it's v2 or v3 */ + ret=ssl23_accept(s); + if (ret > 0) + { + /* don't know whether it's v2 or v3, so use the polymorphic call */ + ret=SSL_peek(s, buf, len); + } + return(ret); + } + static int ssl23_write(SSL *s, const void *buf, int len) { int n; diff -Naur openssl-0.9.6/ssl/s23_srvr.c openssl/ssl/s23_srvr.c --- openssl-0.9.6/ssl/s23_srvr.c Wed Mar 7 09:58:57 2001 +++ openssl/ssl/s23_srvr.c Wed Mar 7 21:31:58 2001 @@ -90,6 +90,7 @@ (char *)sslv23_base_method(),sizeof(SSL_METHOD)); SSLv23_server_data.ssl_accept=ssl23_accept; SSLv23_server_data.get_ssl_method=ssl23_get_server_method; + SSLv23_server_data.ssl_peek=ssl23_srvr_peek; init=0; } return(&SSLv23_server_data); diff -Naur openssl-0.9.6/ssl/ssl_locl.h openssl/ssl/ssl_locl.h --- openssl-0.9.6/ssl/ssl_locl.h Wed Mar 7 21:22:52 2001 +++ openssl/ssl/ssl_locl.h Wed Mar 7 21:31:58 2001 @@ -525,6 +525,7 @@ int ssl23_connect(SSL *s); int ssl23_read_bytes(SSL *s, int n); int ssl23_write_bytes(SSL *s); +int ssl23_srvr_peek(SSL *s, char *buf, int len); int tls1_new(SSL *s); void tls1_free(SSL *s); ______________________________________________________________________ OpenSSL Project http://www.openssl.org Development Mailing List [EMAIL PROTECTED] Automated List Manager [EMAIL PROTECTED]