/* echoclient.c */ #include "openssl/ssl.h" #include "../test.h" int main(int argc, char** argv) { SOCKET_T sockfd = 0; FILE* fin = stdin; FILE* fout = stdout; int inCreated = 0; int outCreated = 0; char send[1024]; char reply[1024]; SSL_METHOD* method = 0; SSL_CTX* ctx = 0; SSL* ssl = 0; #ifdef _WIN32 WSADATA wsd; WSAStartup(0x0002, &wsd); #endif if (argc >= 2) { fin = fopen(argv[1], "r"); inCreated = 1; } if (argc >= 3) { fout = fopen(argv[2], "w"); outCreated = 1; } if (!fin) err_sys("can't open input file"); if (!fout) err_sys("can't open output file"); tcp_connect(&sockfd); method = SSLv3_client_method(); ctx = SSL_CTX_new(method); if (SSL_CTX_load_verify_locations(ctx, caCert, 0) != SSL_SUCCESS) err_sys("can't load ca file"); ssl = SSL_new(ctx); SSL_set_fd(ssl, sockfd); if (SSL_connect(ssl) != SSL_SUCCESS) err_sys("SSL_connect failed"); while (fgets(send, sizeof(send), fin)) { int sendSz = strlen(send) + 1; if (SSL_write(ssl, send, sendSz) != sendSz) err_sys("SSL_write failed"); if (strncmp(send, "quit", 4) == 0) { fputs("sending server shutdown command: quit!\n", fout); break; } if (SSL_read(ssl, reply, sizeof(reply)) > 0) fputs(reply, fout); } SSL_shutdown(ssl); SSL_free(ssl); SSL_CTX_free(ctx); fflush(fout); if (inCreated) fclose(fin); if (outCreated) fclose(fout); #ifdef _WIN32 closesocket(sockfd); #else close(sockfd); #endif return 0; }