This Delphi code starts a minimal SSL server:

WSAStartup(MakeWord(1,1), WData);
SSL_library_init;
SSL_load_error_strings;
ctx := SSL_CTX_new(SSLv23_server_method);
SSL_CTX_use_certificate_chain_file(ctx, 'cert.pem');
SSL_CTX_use_PrivateKey_file(ctx, 'key.pem', 1);
SSL_CTX_check_private_key(ctx);
bio_ssl := BIO_new_ssl(ctx, 0);
bio_in := BIO_new_accept('443');
BIO_set_accept_bios(bio_in, bio_ssl);
BIO_do_accept(bio_in); // set up the socket
BIO_do_accept(bio_in); // wait for connection

Everything works fine on XP.  The code stays in the second
BIO_do_accept() waiting for a connection, and sending an HTTPS request
from a browser causes BIO_do_accept() to return.

On 32-bit Vista Home Premium and 64-bit Windows 7, the second
BIO_do_accept() hangs forever, and the browser can't connect.  Why?

The various definitions used are:

    const
      SSLEAY32DLL = 'ssleay32.dll';
      LIBEAY32DLL = 'libeay32.dll';
      LIBSSL32DLL = 'libssl32.dll';

    function SSL_CTX_check_private_key(ctx: Pointer): BOOL; cdecl;
external SSLEAY32DLL;
    function SSL_CTX_new(meth: Pointer): Pointer; cdecl; external SSLEAY32DLL;
    function SSL_CTX_use_certificate_chain_file(ctx: Pointer; FName:
PChar): Integer; cdecl; external SSLEAY32DLL;
    function SSL_CTX_use_PrivateKey_file(ctx: Pointer; FName: PChar;
AType: Integer): Integer; cdecl; external SSLEAY32DLL;
    procedure SSL_library_init; cdecl; external SSLEAY32DLL;
    procedure SSL_load_error_strings; cdecl; external SSLEAY32DLL;
    function SSLv23_server_method: Pointer; cdecl; external SSLEAY32DLL;

    function BIO_new_ssl(ctx: Pointer; client: Integer): Pointer;
cdecl; external LIBSSL32DLL;
    function BIO_new_accept(port: pchar): Pointer; cdecl; external LIBEAY32DLL;
    function BIO_ctrl(bp: Pointer; cmd: Integer; larg: Longint; parg:
Pointer): longint; cdecl; external LIBEAY32DLL;
    function BIO_set_accept_bios(b, bio: pointer): integer; const
BIO_C_SET_ACCEPT = 118; begin result := BIO_ctrl(b, BIO_C_SET_ACCEPT,
2, bio); end;
    function BIO_do_accept(b: pointer): integer; const
BIO_C_DO_STATE_MACHINE = 101; begin result := BIO_ctrl(b,
BIO_C_DO_STATE_MACHINE, 0, nil); end;

    var WData: TWSAData; ctx, bio_ssl, bio_in: pointer;

Changing the 32-bit .EXE's various compatibility modes (Windows XP,
Windows NT, etc) has no effect. I'm using OpenSSL 1.0.0d
(LIBEAY32.DLL, LIBSSL32.DLL, SSLEAY32.DLL).
______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
User Support Mailing List                    openssl-users@openssl.org
Automated List Manager                           majord...@openssl.org

Reply via email to