Skip to content

Instantly share code, notes, and snippets.

@aneury1
Last active July 10, 2019 20:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save aneury1/5530a3de0f2d2579bf7eaa5521764205 to your computer and use it in GitHub Desktop.
Save aneury1/5530a3de0f2d2579bf7eaa5521764205 to your computer and use it in GitHub Desktop.
/// another dummy tcpclient
///g++ client.cpp -oclient -lwsock32 -lws2_32 -lssl -lcrypto
///g++ client.cpp -oclient -lssl -lcrypto
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <openssl/crypto.h>
#include <openssl/x509.h>
#include <openssl/pem.h>
#include <openssl/ssl.h>
#include <openssl/err.h>
#include <openssl/applink.c>
#include <stdlib.h>
#include <stdio.h>
#include <string>
using std::string;
// Need to link with Ws2_32.lib, Mswsock.lib, and Advapi32.lib
#pragma comment (lib, "Ws2_32.lib")
#pragma comment (lib, "Mswsock.lib")
#pragma comment (lib, "AdvApi32.lib")
#define DEFAULT_BUFLEN 512
#define DEFAULT_PORT "22"
SSL_CTX* ctx;
SSL* ssl;
X509* server_cert;
struct WinsockInitIO{
WinsockInitIO(){
WSADATA wsaData;
int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
if (iResult != 0) {
printf("WSAStartup failed with error: %d\n\n", iResult);
return ;
}
}
~WinsockInitIO(){
WSACleanup();
}
};
WinsockInitIO object;
SOCKET connecto_to(const char *address, const char *port)
{
SOCKET ConnectSocket = INVALID_SOCKET;
struct addrinfo *result = NULL,
*ptr = NULL,
hints;
char recvbuf[DEFAULT_BUFLEN]={0};
int iResult;
int recvbuflen = DEFAULT_BUFLEN;
if (address ==nullptr) {
printf("usage: %s server-name\n");
return -1;
}
ZeroMemory( &hints, sizeof(hints) );
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
iResult = getaddrinfo(address, ((port==nullptr)?DEFAULT_PORT:port), &hints, &result);
if ( iResult != 0 ) {
printf("getaddrinfo failed with error: %d\n", iResult);
return -1;
}
int point = 1;
for(ptr=result; ptr != NULL ;ptr=ptr->ai_next) {
ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol);
if (ConnectSocket == INVALID_SOCKET) {
printf("socket failed with error: %ld\n", WSAGetLastError());
return -1;
}
///inet_ntop(ptr->ai_family,ptr->ai_addr,ip,32);
sockaddr_in* addr=(sockaddr_in*)ptr->ai_addr;
char *ip = inet_ntoa(addr->sin_addr);
printf("IP To connect : %s\n",ip);
// Connect to server.
iResult = connect( ConnectSocket, ptr->ai_addr, (int)ptr->ai_addrlen);
if(iResult == 0){
printf("Connected\n");
freeaddrinfo(result);
return ConnectSocket;
}
if (iResult == SOCKET_ERROR) {
closesocket(ConnectSocket);
ConnectSocket = INVALID_SOCKET;
printf("Connect failed number=>%d\n\n", point++);
continue;
}
break;
}
freeaddrinfo(result);
if (ConnectSocket == INVALID_SOCKET) {
printf("Unable to connect to server!\n");
return -1;
}
return ConnectSocket;
}
SSL* initSSL(const char *address, const char *port,const char *cert_name){
SSL_library_init();
SSL_load_error_strings();
OpenSSL_add_all_algorithms();
ctx = SSL_CTX_new (SSLv23_method());
SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv3);
if(cert_name != NULL)
{
if(SSL_CTX_load_verify_locations(ctx, cert_name, NULL)!=1)
{
return(NULL);
}
if(SSL_CTX_set_default_verify_paths(ctx)!=1)
{
return(NULL);
}
// SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, cbVerifyCallBack);
// SSL_CTX_set_verify_depth(ctx, 3);
// SSL_CTX_set_info_callback(ctx, InfoCallBack);
}
SOCKET ret = connecto_to(address, port);
ssl = SSL_new(ctx);
SSL_set_fd (ssl, ret);
return ssl;
}
int ssl_send_all(SSL* so, const char *cmd)
{
int rc= SSL_write( so, cmd, strlen(cmd));
return rc;
}
string ssl_recv_all(SSL* so)
{
char buffer[16*1024]={0};
int rc = SSL_read (so, buffer, 16*1024);
string ret;
ret+=buffer;
return ret;
}
string recv_all(SOCKET so)
{
int iResult=0;
char recvbuf[8196]={0};
string ret;
do {
iResult = recv(so, recvbuf, 8196, 0);
if ( iResult > 0 )
{
printf("Bytes received: %d\n", iResult);
ret+=recvbuf;
memset(recvbuf,0,8196);
}
else if ( iResult == 0 )
printf("\nConnection closed\n");
else
printf("\n\nrecv failed with error: %d\n\n", WSAGetLastError());
} while( iResult > 0 );
return ret;
}
string send_request_command(SOCKET so, const char *cmd)
{
int iResult = send( so, cmd, (int)strlen(cmd), 0 );
if (iResult == SOCKET_ERROR) {
printf("send failed with error: %d\n", WSAGetLastError());
closesocket(so);
return "";
}
return recv_all(so);
}
int main(int argc, char **argv)
{
SOCKET ConnectSocket = connecto_to(argv[1], nullptr);
if(ConnectSocket==-1){
printf("Invalid socket");
return -1;
}
else
{
string send_buffer;
send_buffer +=
"POST /service HTTP/1.1\r\n"
"Host: localhost\r\n"
///"User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:67.0) Gecko/20100101 Firefox/67.0\r\n"
///"Accept: */*\r\n"
///"Accept-Language: es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3\r\n"
///"Accept-Encoding: gzip, deflate, br\r\n"
"Content-Type: application/json\r\n"
"Content-Length: 126\r\n"
///"Connection: keep-alive\r\n"
///"Pragma: no-cache\r\n"
///"Cache-Control: no-cache\r\n"
"{"
\"error \":1
"}";
printf("Request %s", send_buffer.c_str());
string res = send_request_command(ConnectSocket,send_buffer.c_str());
printf("Responde %s", res.c_str());
}
closesocket(ConnectSocket);
return 0;
}
#if 0
#include <winsock2.h>
#include <windows.h>
#include <ws2tcpip.h>
#include <openssl/crypto.h>
#include <openssl/x509.h>
#include <openssl/pem.h>
#include <openssl/ssl.h>
#include <openssl/err.h>
#include <openssl/applink.c>
SOCKET client = -1;
SSL* ssl = nullptr;
SSL_CTX *ctx = nullptr;
void init_client(){
#ifdef __WIN32__
WSAData data;
WSAStartup(MAKEWORD(2,2), &data);
#endif
SSL_library_init();
SSL_load_error_strings();
OpenSSL_add_all_algorithms();
ctx = SSL_CTX_new (TLSv1_2method());
SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv3);
///SSL_CTX_set_info_callback(this->pstSSLCTX, InfoCallBack);
}
#define DEFAULT_PORT 443
int connect_to_the_server(const char *uri, short port)
{
int iResult;
addrinfo *result = nullptr,*ptr = nullptr, hints;
ZeroMemory( &hints, sizeof(hints) );
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
iResult = getaddrinfo(uri, "443", &hints, &result);
if ( iResult != 0 )
return -1 ;
for(ptr=result; ptr != NULL ;ptr=ptr->ai_next)
{
client = socket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol);
sockaddr_in* addr=(sockaddr_in*)ptr->ai_addr;
char *ip = inet_ntoa(addr->sin_addr);
printf("IP To connect : %s\n",ip);
((sockaddr_in *)ptr->ai_addr)->sin_port= htons(port);
iResult = connect( client, ptr->ai_addr, (int)ptr->ai_addrlen);
if(iResult == 0){
printf("Connected\n");
freeaddrinfo(result);
break;
}
if (iResult == SOCKET_ERROR) {
closesocket(client);
client = INVALID_SOCKET;
printf("Connect failed\n\n");
continue;
}
client= INVALID_SOCKET;
}
if(client!=INVALID_SOCKET)
{
ssl = SSL_new(ctx);
SSL_set_fd (ssl, client);
SSL_connect(ssl);
return 0;
}
else
{
return -1;
}
}
#include <string>
#include <string.h>
using std::string;
int main(int argc, char *argv[])
{
init_client();
connect_to_the_server("lab.cardnet.com.do", 443);
const char *payload_test=
"POST /cws/fidelium/redeem HTTP/1.1\r\n"
"Host: lab.cardnet.com.do\r\n"
///"User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:67.0) Gecko/20100101 Firefox/67.0\r\n"
///"Accept: */*\r\n"
///"Accept-Language: es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3\r\n"
///"Accept-Encoding: gzip, deflate, br\r\n"
"Content-Type: application/json\r\n"
"Content-Length: 126\r\n"
//"Connection: keep-alive\r\n"
//"Pragma: no-cache\r\n"
//"Cache-Control: no-cache\r\n\r\n"
"{"
" \"fecha-hora\":\"2019-07-08 15:02:00\","
"\"comercio\":349000000,"
"\"terminal-id\": 45450335,"
"\"tarjeta\":\"48657251234562324\","
"\"monto\":580.00"
"}";
int err = SSL_write (ssl, payload_test, strlen(payload_test));
printf("\nError send %d\n", err);
int errcode = SSL_get_error(ssl, err);
switch(errcode)
{
case SSL_ERROR_NONE: break; // Cannot happen if err <=0
case SSL_ERROR_ZERO_RETURN: fprintf(stderr,"SSL connect returned0.");break;
case SSL_ERROR_WANT_READ: fprintf(stderr,"SSL connect: ReadError.");break;
case SSL_ERROR_WANT_WRITE: fprintf(stderr,"SSL connect: WriteError.");break;
case SSL_ERROR_WANT_CONNECT: fprintf(stderr,"SSL connect: Errorconnect."); break;
case SSL_ERROR_WANT_ACCEPT: fprintf(stderr,"SSL connect: Erroraccept."); break;
case SSL_ERROR_WANT_X509_LOOKUP: fprintf(stderr,"SSL connect error:X509 lookup."); break;
case SSL_ERROR_SYSCALL: fprintf(stderr,"SSL connect: Error in systemcall."); break;
case SSL_ERROR_SSL: fprintf(stderr,"SSL connect: Protocol Error.");
break;
default: fprintf(stderr,"Failed SSL connect.");
}
char bufff[8192]={0};
err = SSL_read (ssl, bufff, 8192);
bufff[8191]=0;
printf ("Got %d chars:'%s'\n", err, bufff);
SSL_shutdown (ssl); /* send SSL/TLS close_notify */
}
#endif
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment