Hi,
I'm currently working on a project for a class in shcool, i need to develop a basic client to interact with the openssl server, using a trustore and CA's.
I simply run the openssl server with this command (I must be in /certs folder) in one terminal:
openssl s_server -cert crt.pem -key key.pem
and then I run my code to emulate the client:
Code:
#include "openssl/ssl.h"
#include "openssl/bio.h"
#include "openssl/err.h"
#include "stdio.h"
#include "string.h"
int main(int argc, char *argv[])
{
BIO * bio;
SSL * ssl;
SSL_CTX * ctx;
char buffer1[1024], buffer2[1024];
int j,p;
char *hostname, *port;
/* Verificar se foram colocados todos os argumentos */
if ( argc != 3 )
{
printf("Sintaxe: %s <hostname> <portnum>\n", argv[0]);
exit(0);
}
hostname = argv[1];
port = argv[2];
/* Preparar a biblioteca */
SSL_library_init();
ERR_load_BIO_strings();
SSL_load_error_strings(); /* Para o registo e msgs de erro */
OpenSSL_add_all_algorithms();
ENGINE_load_builtin_engines();
/* Criar o contexto */
ctx = SSL_CTX_new(SSLv23_client_method());
/* Carregar o trust store */
if(! SSL_CTX_load_verify_locations(ctx, "/root/Desktop/Trab2_cr/certs/TrustStore.pem", NULL))
{
fprintf(stderr, "Erro ao carregar o trust store\n");
ERR_print_errors_fp(stderr);
SSL_CTX_free(ctx);
return 0;
}
/* Realizar a ligaçao ao servidor */
bio = BIO_new_ssl_connect(ctx);
/* Ligar a flag SSL_MODE_AUTO_RETRY */
BIO_get_ssl(bio, & ssl);
SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY);
/* Criar e configurar a ligaçao */
BIO_set_conn_hostname(bio, hostname);
BIO_set_conn_port(bio, port);
if(BIO_do_connect(bio) <= 0)
{
fprintf(stderr, "Erro ao tentar ligar ao servidor\n");
ERR_print_errors_fp(stderr);
BIO_free_all(bio);
SSL_CTX_free(ctx);
return 0;
}
/* Validar o certificado do servidor */
if(SSL_get_verify_result(ssl) != X509_V_OK)
{
fprintf(stderr, "Erro ao validar o certificado: %i\n", SSL_get_verify_result(ssl));
BIO_free_all(bio);
SSL_CTX_free(ctx);
return 0;
}
printf("Ligado com encriptacao do tipo %s \n", SSL_get_cipher(ssl));
/* Enviar/receber mensagens */
for(;;)
{
/* Enviar msg*/
scanf("%s", buffer1);
j = BIO_write(bio, buffer1, strlen(buffer1));
if(j <= 0)
break;
buffer1[j] = 0;
/* Receber msg */
p = BIO_read(bio, buffer2, 1023);
if(p <= 0)
break;
buffer2[p] = 0;
printf("%s\n", buffer2);
}
/* Close the connection and free the context */
BIO_free_all(bio);
SSL_CTX_free(ctx);
return 0;
}
The problem with this is that,when I send a message to server I must wait for his reply, or else things get messed up because of the for() cycle:
Code:
/* Send/receive messages */
for(;;)
{
/* Enviar msg*/
scanf("%s", buffer1);
j = BIO_write(bio, buffer1, strlen(buffer1));
if(j <= 0)
break;
buffer1[j] = 0;
/* Receber msg */
p = BIO_read(bio, buffer2, 1023);
if(p <= 0)
break;
buffer2[p] = 0;
printf("%s\n", buffer2);
}
Do any of the experts have any sugestion to change this in a way that i don't need to wait for the server reply?!
I don't want my homework done, I just want sugestions so that i can then try to figure it out by my own.
Thanks in advance.
PS- sorry for the formating on the code, did my best for align it manually.