Last active
July 10, 2019 20:52
-
-
Save aneury1/5530a3de0f2d2579bf7eaa5521764205 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/// 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