I'm trying to set up the server and client model shipped with openssl v0.9.5a.
for win2000

The server application returns SSL_accept = 0 when the client does
SSL_connect. But the client returns SSL_connect = -1. Why?

Please if you got time, can anyone give me a hint on how to leap over this
obstacle?

Is there any other functioning client & server program which I could take part
of?

I’ve append parts of the client and the server applications downunder.

Thanks for taking time to answer this letter,
Roger Furtenheim


CLIENT APPLICATION:
/* cli.cpp  -  Minimal ssleay client for Unix
   30.9.1996, Sampo Kellomaki <[EMAIL PROTECTED]> */

/* mangled to work with SSLeay-0.9.0b and OpenSSL 0.9.2b
   Simplified to be even more minimal
   12/98 - 4/99 Wade Scholine <[EMAIL PROTECTED]> */

#define HOME "./"
#define CERTF  HOME "client.pem"
#define KEYF  HOME  "client.pem"


#define CHK_NULL(x)    if (( x )==NULL) { exit (1);                           
 }
#define CHK_ERR(err,s) if ((err)==-1  ) { perror(s); exit(1);                 
 }
#define CHK_SSL(err)   if ((err)==-1  ) { ERR_print_errors_fp(stderr);
exit(2); }


void main ()
{
        int err;
        int sd;
        struct sockaddr_in sa;
        SSL_CTX* ctx;
        SSL*     ssl;
        X509*    server_cert;
        char*    str;
        char     buf [4096];
        SSL_METHOD *meth;


        SSLeay_add_ssl_algorithms();
        meth = SSLv2_client_method();
        SSL_load_error_strings();
        ctx = SSL_CTX_new (meth);                        CHK_NULL(ctx);

        if (!ctx) 
        {
                ERR_print_errors_fp(stderr);
                exit(2);
        }

        if (SSL_CTX_use_certificate_file(ctx, CERTF, SSL_FILETYPE_PEM) <= 0)
        {
                ERR_print_errors_fp(stderr);
                exit(3);
        }
        
        if (SSL_CTX_use_PrivateKey_file(ctx, KEYF, SSL_FILETYPE_PEM) <= 0)
        {
                ERR_print_errors_fp(stderr);
                exit(4);
        }

        if (!SSL_CTX_check_private_key(ctx))
        {
                fprintf(stderr,"Private key does not match the certificate public 
key\n");
                exit(5);
        }

        /* ----------------------------------------------- */
        /* Create a socket and connect to server using normal socket calls. */

        sockInit(); 

        sd = socket (AF_INET, SOCK_STREAM, 0);       CHK_ERR(sd, "socket");
 
        memset (&sa, '\0', sizeof(sa));
        sa.sin_family      = AF_INET;
        sa.sin_addr.s_addr = inet_addr ("127.0.0.1");           /* Server IP           
 */
        sa.sin_port        = htons     (1111);          /* Server Port number   */
  
        err = connect(sd,
                      (struct sockaddr*) &sa,
                      sizeof(sa));

        CHK_ERR(err, "connect");

        /* ----------------------------------------------- */
        /* Now we have TCP conncetion. Start SSL negotiation. */
  
        ssl = SSL_new (ctx);                         
        CHK_NULL(ssl);    

        printf("SSL_set_fd: %d\n", SSL_set_fd (ssl, sd));
  
        err = SSL_connect (ssl);
        printf("SSL_connect: %d\n", err);

        CHK_SSL(err);
  
        /* Following two steps are optional and not required for
     data exchange to be successful. */
  
        /* Get the cipher - opt */

  printf ("SSL connection using %s\n", SSL_get_cipher (ssl));
  
  /* Get server's certificate (note: beware of dynamic allocation) - opt */

  server_cert = SSL_get_peer_certificate (ssl);       CHK_NULL(server_cert);
  printf ("Server certificate:\n");
  
  str = X509_NAME_oneline (X509_get_subject_name (server_cert),0,0);
  CHK_NULL(str);
  printf ("\t subject: %s\n", str);
  Free (str);

  str = X509_NAME_oneline (X509_get_issuer_name  (server_cert),0,0);
  CHK_NULL(str);
  printf ("\t issuer: %s\n", str);
  Free (str);

  /* We could do all sorts of certificate verification stuff here before
     deallocating the certificate. */

  X509_free (server_cert);
  
  /* --------------------------------------------------- */
  /* DATA EXCHANGE - Send a message and receive a reply. */

  err = SSL_write (ssl, "Hello World!", strlen("Hello World!")); 
CHK_SSL(err);
  
  err = SSL_read (ssl, buf, sizeof(buf) - 1);                    
CHK_SSL(err);
  buf[err] = '\0';
  printf ("Got %d chars:'%s'\n", err, buf);
  SSL_shutdown (ssl);  /* send SSL/TLS close_notify */

  /* Clean up. */

  closesocket (sd);
  SSL_free (ssl);
  SSL_CTX_free (ctx);
}






SERVER APPLICATION:
/* serv.cpp  -  Minimal ssleay server for Unix
   30.9.1996, Sampo Kellomaki <[EMAIL PROTECTED]> */


/* mangled to work with SSLeay-0.9.0b and OpenSSL 0.9.2b
   Simplified to be even more minimal
   12/98 - 4/99 Wade Scholine <[EMAIL PROTECTED]> */


#define HOME "./"
#define CERTF  HOME "server.pem"
#define KEYF  HOME  "server.pem"


#define CHK_NULL(x) if ((x)==NULL) exit (1)
#define CHK_ERR(err,s) if ((err)==-1) { perror(s); exit(1); }
#define CHK_SSL(err) if ((err)==-1) { ERR_print_errors_fp(stderr); exit(2); }

void main ()
{
        int err;
        int listen_sd;
        int sd;
        struct sockaddr_in sa_serv;
        struct sockaddr_in sa_cli;
        size_t client_len;
        SSL_CTX* ctx;
        SSL*     ssl;
        X509*    client_cert;
        char*    str;
        char     buf [4096];
        SSL_METHOD *meth;

  /* SSL preliminaries. We keep the certificate and key with the context. */

  SSL_load_error_strings();

  SSLeay_add_ssl_algorithms();

  meth = SSLv23_server_method();

  ctx = SSL_CTX_new (meth);

  if (!ctx) {
    ERR_print_errors_fp(stderr);
    exit(2);
  }

  if (SSL_CTX_use_certificate_file(ctx, CERTF, SSL_FILETYPE_PEM) <= 0) {
    ERR_print_errors_fp(stderr);
    exit(3);
  }

  if (SSL_CTX_use_PrivateKey_file(ctx, KEYF, SSL_FILETYPE_PEM) <= 0) {
    ERR_print_errors_fp(stderr);
    exit(4);
  }

  if (!SSL_CTX_check_private_key(ctx)) {
    fprintf(stderr,"Private key does not match the certificate public
key\n");
    exit(5);
  }


  /* ----------------------------------------------- */
  /* Prepare TCP socket for receiving connections */

 sockInit(); 


  listen_sd = socket (AF_INET, SOCK_STREAM, 0);   

  if(listen_sd == INVALID_SOCKET) { 
  printf("Can't create socket\n"); 
  sockEnd(); 
  return;
 }
  
  CHK_ERR(listen_sd, "socket");
  
  
  memset (&sa_serv, '\0', sizeof(sa_serv));
  sa_serv.sin_family      = AF_INET;
  sa_serv.sin_addr.s_addr = INADDR_ANY;
  sa_serv.sin_port        = htons (1111);          /* Server Port number */
  
  
  err = bind(listen_sd, (struct sockaddr*) &sa_serv,
             sizeof (sa_serv));                   CHK_ERR(err, "bind");
             

  /* Receive a TCP connection. */
             
  err = listen (listen_sd, 5);                    CHK_ERR(err, "listen");
  
  client_len = sizeof(sa_cli);
  sd = accept (listen_sd, (struct sockaddr*) &sa_cli, &client_len);
  CHK_ERR(sd, "accept");
  closesocket (listen_sd);

  printf ("Connection from %lx, port %x\n",
          sa_cli.sin_addr.s_addr, sa_cli.sin_port);
  
  /* ----------------------------------------------- */
  /* TCP connection is ready. Do server side SSL. */

  ssl = SSL_new (ctx);                           CHK_NULL(ssl);

// Set association between SSL and underlying file descriptor
  printf("SSL_set_fd: %d\n",SSL_set_fd (ssl, sd)); 

  err = SSL_accept (ssl);
  printf("SSL_accept: %d\n", err);

  CHK_SSL(err);
  
  /* Get the cipher - opt */
  
  printf ("SSL connection using %s\n", SSL_get_cipher (ssl));
  
  /* Get client's certificate (note: beware of dynamic allocation) - opt */

#if 0
  client_cert = SSL_get_peer_certificate (ssl);

  if (client_cert != NULL) {
    printf ("Client certificate:\n");
    
    str = X509_NAME_oneline (X509_get_subject_name (client_cert), 0, 0);
    CHK_NULL(str);
    printf ("\t subject: %s\n", str);
    Free (str);
    
    str = X509_NAME_oneline (X509_get_issuer_name  (client_cert), 0, 0);
    CHK_NULL(str);
    printf ("\t issuer: %s\n", str);
    Free (str);
    
    /* We could do all sorts of certificate verification stuff here before
       deallocating the certificate. */
    
    X509_free (client_cert);
  } else
    printf ("Client does not have certificate.\n");
#endif

  /* DATA EXCHANGE - Receive message and send reply. */

  err = SSL_read (ssl, buf, sizeof(buf) - 1);    
        printf("SSL_read\n");
  CHK_SSL(err);
        printf("CHK_SSL(err)\n");
  buf[err] = '\0';
    printf("buf\n");
  printf ("Got %d chars:'%s'\n", err, buf);
  
  err = SSL_write (ssl, "I hear you.", strlen("I hear you."));  CHK_SSL(err);

  /* Clean up. */

  closesocket (sd);
  SSL_free (ssl);
  SSL_CTX_free (ctx);
}



____________________________________________________________________
Get free email and a permanent address at http://www.netaddress.com/?N=1
______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
User Support Mailing List                    [EMAIL PROTECTED]
Automated List Manager                           [EMAIL PROTECTED]

Reply via email to