Hello,

I am doing a client to send http code to a https server. I am probing
with the openssl s_server and I can send data to him, but when I try to
respond with some data to my client I receive no data at all. Perhaps it
had to be with my initialization of the SSL objects.

#include "sslModule.h"

SSL_METHOD     *method = NULL;
SSL_CTX        *ctx    = NULL;
SSL            *con    = NULL;
BIO            *bio    = NULL;
int            s;

int sslInit()
{
  char *fName = "sslInit";
  int returned;

  /* SSL library initialization */
  printf ("Initializing SSL library ...");
  SSL_library_init();

  /* Provide error messages */
  printf ("Loading error strings ...");
  SSL_load_error_strings();

  /* Actions to seed PRNG */
  printf ("Seeding PRNG ...");
  RAND_seed (rnd_seed, sizeof rnd_seed);
  returned = RAND_status();
  if (returned == 1)
    printf ("PRNG seeded with enough data\n");
  else
    printf ("PRNG not seeded\n");

  return returned;
}


int sslStartConnection(char *host, int port)
{
  char *fName = "sslStartConnection";
  int returned = 0, i, j;
  struct sockaddr_in ser_addr;
  STACK_OF(X509) *sk;
  STACK_OF(X509_NAME) *sk2;
  char buf[BUFSIZ];
  X509 *peer=NULL;
  char *p;
  SSL_CIPHER *c;
  static char *space="                ";
  X509_NAME *xn;

  /* Creation of a new SSL_CTX object as framework to establish TLS/SSL
enabled connections */
  printf ("Creating SSL_CTX object ...\n");
  method = SSLv23_client_method();
  ctx = SSL_CTX_new (method);
  if (ctx != NULL)
    printf ("SSL_CTX object creationg succeded\n");
  else
  {
    printf ("Can't create SSL_CTX object\n");
    return -1;
  }

  /* Create new SSL structure*/
  printf ("Creating SSL structure ...\n");
  con = SSL_new(ctx);
  if (con != NULL)
    printf ("SSL structure creation succeded\n");
  else
  {
    printf ("Can't create SSL structure\n");
    return -1;
  }

  /* Reset SSL object to allow a new connection */
  printf ("Reset SSL object tu allow a new connection ...\n");
  returned = SSL_clear(con);
  if (!returned)
  {
    printf ("Can't reset SSL object\n");
    return returned;
  }

  /* Open an internet socket and connect to server */
  printf ("Connecting to %s on port %d ...\n", host, port);
  if ((s = socket(AF_INET, SOCK_STREAM, 0)) == -1)
  {
    printf ("Error creating socket\n");
    return s;
  }

  ser_addr.sin_family = AF_INET;
  ser_addr.sin_addr.s_addr = inet_addr (host);
  ser_addr.sin_port = htons (port);
  if (connect (s, &ser_addr, sizeof(ser_addr)) == -1)
  {
    printf ("Error connecting\n");
    return -1;
  }

  printf ("Connected to server\n");


  returned = SSL_set_fd (con, s);
  if (returned < 1)
  {
    printf ("SSL_set_fd failed\n");
    return returned;
  }

  /* Creating bio */
  bio = BIO_new_socket(s, BIO_NOCLOSE);

  SSL_set_bio (con, bio, bio);
  SSL_set_connect_state(con);

  returned = SSL_connect(con);
  if (returned <= 0)
  {
    printf ("Handshake was not successful. Errno: %d\n", returned);
    return returned;
  }

  printf ("HANDSHAKE WAS SUCCESSFUL. CONGRATULATIONS!!! (returned =
%d)\n", returned);

  return 0;
}


int sslWrite(char *buf, int nbytes)
{
  char *fName = "sslWrite";
  int returned = 0;
  char *eBuffer;

  printf ("==>\n");

  printf ("%s", buf);
  returned = SSL_write (con, buf, nbytes);
  switch (SSL_get_error(con,returned))
  {
  case SSL_ERROR_NONE:
    printf ("SSL_ERROR_NONE\n");
    printf ("nbytes: %d - returned: %d", nbytes, returned);
    break;
  case SSL_ERROR_WANT_WRITE:
    printf("SSL_ERROR_WANT_WRITE write W BLOCK\n");
    break;
  case SSL_ERROR_WANT_READ:
    printf("SSL_ERROR_WANT_READ write R BLOCK\n");
    break;
  case SSL_ERROR_WANT_X509_LOOKUP:
    printf("SSL_ERROR_WANT_X509_LOOKUP write X BLOCK\n");
    break;
  case SSL_ERROR_ZERO_RETURN:
    printf ("SSL_ERROR_ZERO_RETURN\n");
    break;
  case SSL_ERROR_SYSCALL:
    printf("SSL_ERROR_SYSCALL write:errno=%d\n",
    get_last_socket_error());
    break;
  case SSL_ERROR_SSL:
    printf ("SSL_ERROR_SSL\n");
    break;
  }


  return returned;
}


int sslRead(char *buf)
{
  char *fName = "sslRead";
  int returned = 0;
  char eBuffer[BUFSIZ];

  printf ("<==\n");

  printf ("Reading some data ...\n");
  returned = SSL_read (con, buf, 1024);
  if (returned <= 0)
  {
    printf ("Error while reading from SSL connection. (returned: %d)\n",
returned);
    returned = SSL_get_error (con, returned);
    switch (SSL_get_error (con, returned))
    {
    case SSL_ERROR_NONE:
    case SSL_ERROR_WANT_WRITE:
      printf("SSL_ERROR_WANT_WRITE - read W BLOCK (returned: %d)\n",
returned);
      break;
    case SSL_ERROR_WANT_READ:
      printf("SSL_ERROR_WANT_READ - read R BLOCK (returned: %d)\n",
returned);
      break;
    case SSL_ERROR_WANT_X509_LOOKUP:
      printf("SSL_ERROR_WANT_X509_LOOKUP - read X BLOCK (returned:
%d)\n", returned);
      break;
    case SSL_ERROR_SYSCALL:
      printf("SSL_ERROR_SYSCALL - read:errno=%d (returned:
%d)\n",get_last_socket_error(), returned);
      break;
    case SSL_ERROR_ZERO_RETURN:
      printf("SSL_ERROR_ZERO_RETURN - closed (returned: %d)\n",
returned);
      break;
    case SSL_ERROR_SSL:
      printf("SSL_ERROR_SSL (returned: %d\n", returned);
      break;
    }
  }
  else
    printf ("%s\n", buf);

  return returned;
}


int sslEndConnection()
{
  char *fName = "sslEndConnection";
  int returned = 0;

  close (s);

  /* Free SSL structure */
  printf ("Free allocated SSL structure\n");
  SSL_free(con);

  /* Free SSL_CTX object */
  printf ("Free allocated SSL_CTX object\n");
  SSL_CTX_free(ctx);

  return 0;
}

int main(int argc, char *argv[])
{
  int returned;

  if (argc != 3)
  {
    printf ("Usage: testssl <host> <port>");
    return -1;
  }

  returned = sslInit();

  returned = sslStartConnection(argv[1], atoi(argv[2]));

  returned = sslWrite("GET / HTTP/1.0\r\n\r\n", 18); /* O whatelse data
*/

  returned = sslRead(); /* Reading anything!!! */

  returned = sslEndConnection();

  return 0;
}




______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
User Support Mailing List                    [EMAIL PROTECTED]
Automated List Manager                           [EMAIL PROTECTED]

Reply via email to