Sorry, this mail will be long with a C code program attached. If you don't want to read, it dooesn't matter, but if somebody want to help me and read it and try to solve my problem,  tkank you in advance.

The question is: as I have written in my previous mail, I have modified the cli.cpp and serv.cpp to get client authentication. I have done that in the same way than server authentication, that it seems the logic way to do that, but it doesn't work. I have spent all the week trying to solve it but I haven't got it yet. So if somebody is so kind to read it and try to detect an error, it will help me, if not it doesn't matter, as I already say it.
 

in red it is my modifications for the client authentication:

/* CLIENT */

/* This program have been done from cli.cpp */

/*---------------------------------------------------------*/
/* 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]> */
/*---------------------------------------------------------*/

#include <stdio.h>
#include <memory.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>

#include <openssl/crypto.h>
#include <openssl/x509.h>
#include <openssl/pem.h>
#include <openssl/ssl.h>
#include <openssl/err.h>

#define CERTF  "//home/serra/OpenSSL/opensslsun/clientcert.pem"
#define KEYF  "//home/serra/OpenSSL/opensslsun/clientkey.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], randfname [4096];
  SSL_METHOD *meth;
  FILE *fd;
  int i;
 
  SSLeay_add_ssl_algorithms();
  meth = SSLv2_client_method();
  SSL_load_error_strings();
  ctx = SSL_CTX_new (meth);

  CHK_NULL(ctx);
/* to get client authentication */

 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);
  }
/* finish modification */
 

  CHK_SSL(err);
 
  /* ----------------------------------------------- */
  /* Create a socket and connect to server using normal socket calls. */
 
  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");
 
  if (!RAND_file_name(randfname, 4096)) {
  printf("Can't get rand file name: set env var RANDOM\n");
  exit (1);
  }
  if (!RAND_load_file(randfname, -1)) {
  printf("Can't load random bytes\n");
  exit(1);
  }

  /* ----------------------------------------------- */
  /* Now we have TCP conncetion. Start SSL negotiation. */
 
  ssl = SSL_new (ctx);                         CHK_NULL(ssl);
  SSL_set_fd (ssl, sd);
  err = SSL_connect (ssl);                     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);
 
  if (!RAND_write_file(randfname)) {
    printf("Can't write random state\n");
    exit(1);
  }
 

  /* modification to read a file */
  err = SSL_read (ssl, buf, sizeof(buf) - 1);       CHK_SSL(err);
  buf[err] = '\0';
  printf ("Got %d chars:'%s'\n", err, buf);
  fd=fopen("file.out","w");
  if (fd==NULL) printf("cannot open file");

  i=0;
  while ((buf[i]!='\0') || (i==4096))
  {
   fputc(buf[i],fd);
   i++;
  }
  if (fclose(fd)!=0) printf("cannot close file");

  /*end of modification*/

  /*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. */
 
  close (sd);
  SSL_free (ssl);
  SSL_CTX_free (ctx);
}
/* EOF - cli.cpp */
 

--------------------------------------------------------
 
 
 

/*  SERVER  */
 

/* 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]> */

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <memory.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>

#include <openssl/rsa.h>       /* SSLeay stuff */
#include <openssl/crypto.h>
#include <openssl/x509.h>
#include <openssl/pem.h>
#include <openssl/ssl.h>
#include <openssl/err.h>
 

/* define HOME to be dir for key and cert files... */
#define HOME "./"
/* Make these what you want for cert & key files */
/*#define CERTF  HOME "foo-cert.pem"*/
/*#define KEYF  HOME  "foo-cert.pem"*/
#define CERTF  "//home/serra/OpenSSL/opensslsun/mycert.pem"
#define KEYF  "//home/serra/OpenSSL/opensslsun/mykey.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); }

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

 
  /* 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 */

  listen_sd = socket (AF_INET, SOCK_STREAM, 0);   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");
  close (listen_sd);

  printf ("Connection from %x, 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);
  SSL_set_fd (ssl, sd);
  err = SSL_accept (ssl);                        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 */
  /* I haven't modified anything from here, does it work this getting client's certificate? */
  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");

/* I alway ge Client does... as client_cert is NULL */

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

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

  /* modification to see how to transmit a file */

  fd = fopen("file.txt","r");
  if (fd==NULL) printf("cannot open file");
  i=0;
  while(!feof(fd))
    {
     buf[i]=fgetc(fd);
     i++;
    }
  if (fclose(fd)!=0) printf("cannot close file");

  err = SSL_write (ssl, buf, sizeof(buf));           CHK_SSL(err);

  /*finish modification  */

 
  /*err = SSL_write (ssl, "I hear you.", strlen("I hear you."));  CHK_SSL(err);*/
 

  /* Clean up. */

  close (sd);
  SSL_free (ssl);
  SSL_CTX_free (ctx);
}
/* EOF - serv.cpp */
 

-------------------------------------------------------------------
 
 
 
 

THANK YOU VERY MUCH

-- 
Albert SERRA 
===========================================
Integrated Systems Laboratory (DE/LSI-EPFL)
email: [EMAIL PROTECTED]
 
begin:vcard 
n:Serra Pages;Albert
x-mozilla-html:FALSE
version:2.1
email;internet:[EMAIL PROTECTED]
adr;quoted-printable:;;Residence Marcolet =0D=0APre-Fontaine 12 Ch. 23;1023 Crissier; ;;Switzerland
x-mozilla-cpt:;0
fn:Albert Serra Pages
end:vcard

Reply via email to