#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //#define HOST "im.pr.gov.br" //#define IP "200.189.113.148" #define HOST "localhost" #define IP "10.15.20.42" //#define HOST "im.celepar.parana" //#define IP "10.15.20.219" #define PORT "5222" int tls = 0; void Read(void * fd, void *buf, int count) { if ( tls == 0 ) read(*(int *) fd, buf, (ssize_t)count); else SSL_read((SSL *) fd, buf, count); } void Write(void * fd, void *buf, int count) { if ( tls == 0 ) write(*(int *) fd, buf, (ssize_t)count); else SSL_write((SSL *) fd, buf, count); } int main(void) { struct sockaddr_in socketaddr; int socketfd, nHostPort; int err, i, unit; extern int tls; char buff[4096]; char * _xml = (char)NULL, * xml_connect = {""}, * xml_starttls = {""}; /*SSL PART*/ SSL_METHOD *meth; SSL_CTX *ctx; SSL *myssl; /*SSL PART*/ _xml = (char *) malloc(sizeof(xml_connect)); if ( (nHostPort = strtol(PORT, 0, 10)) == 0 ) { printf("\n\n\n"); printf("\ncould not make a socket\n"); return 0; } socketfd = socket(AF_INET, SOCK_STREAM, 0); socketaddr.sin_family = AF_INET; //socketaddr.sin_addr.s_addr = INADDR_ANY;//inet_addr(IP); socketaddr.sin_addr.s_addr = inet_addr(IP); socketaddr.sin_port = htons(nHostPort); OpenSSL_add_all_algorithms(); SSL_library_init(); SSL_load_error_strings(); meth=TLSv1_client_method(); ctx=SSL_CTX_new(meth); if (!ctx) { printf("Error creating the context.\n"); exit(0); } err = connect(socketfd, (struct sockaddr*)&socketaddr, sizeof(socketaddr)); //fcntl(socketfd, F_SETFL, fcntl(socketfd, F_GETFL, 0) | O_NDELAY | O_NONBLOCK); if ( err < 0 ) { printf("Socket returned error #%d,program terminated\n", err); exit(0); } sprintf(_xml, xml_connect, HOST); Write(&socketfd, _xml, strlen(_xml)); //usleep(500); Read (&socketfd, buff, sizeof(buff)); printf("%s\n\n", buff); bzero(buff, 4096); puts("-----------\n"); /* read (socketfd, buff, sizeof(buff)); printf("%s\n\n", buff); bzero(buff, 4096); puts("-----------\n"); */ sprintf(_xml, xml_starttls); Write(&socketfd, _xml, strlen(_xml)); //usleep(500); Read (&socketfd, buff, sizeof(buff)); printf("%s\n\n", buff); bzero(buff, 4096); SSL_CTX_set_verify(ctx,SSL_VERIFY_NONE,NULL); /*Create new ssl object*/ myssl=SSL_new(ctx); if(!myssl){ printf("Error creating SSL structure.\n"); exit(0); } /*Bind the socket to the SSL structure*/ SSL_set_fd(myssl,socketfd); /*Connect to the server, SSL layer.*/ err=SSL_connect(myssl); printf("SSL error #%d in accept,program terminated\n",err); /*Check for error in connect.*/ if (err<1) { err=SSL_get_error(myssl,err); printf("SSL error #%d in accept,program terminated\n",err); printf("%d -- %d\n\n", SSL_ERROR_WANT_READ, SSL_ERROR_WANT_WRITE); if(err==5){printf("sockerrno is:\n");} close(socketfd); SSL_CTX_free(ctx); exit(0); } tls = 1; /*Print out connection details*/ printf("SSL connection on socket %x,Version: %s, Cipher: %s\n\n\n", socketfd, SSL_get_version(myssl), SSL_get_cipher(myssl)); sprintf(_xml, xml_connect, HOST); SSL_write(myssl, _xml, strlen(_xml)); usleep(10000); SSL_read(myssl, buff, sizeof(buff)); printf("%s\n\n", buff); bzero(buff, 4096); usleep(10000); SSL_read(myssl, buff, sizeof(buff)); printf("%s\n\n", buff); bzero(buff, 4096); SSL_clear(myssl); SSL_shutdown(myssl); SSL_free(myssl); SSL_CTX_free(ctx); fflush(stdin); fflush(stdout); exit(0); }