Water's Home

Just another Life Style

0%

VS2017 OpenSSL x64 Compile & Test Source Code

Prepare

Windows 10 Pro 1709 Visual Studio 2017 openssl-1.1.0h.tar.gz ActivePerl-5.26.1.2601-MSWin32-x64-404865.exe

Install dmake

ppm install dmake

Compile OpenSSL x64 Release DLL

C:\>cd openssl-1.1.0h
C:\openssl-1.1.0h>perl Configure VC-WIN64A no-asm –prefix=C:/openssl –openssldir=C:/openssl/ssl
C:\openssl-1.1.0h>nmake
C:\openssl-1.1.0h>nmake test
C:\openssl-1.1.0h>nmake install
C:\openssl-1.1.0h>nmake clean

Have A Look

C:\openssl> . ├─bin │ libcrypto-1_1-x64.dll │ libssl-1_1-x64.dll │ ├─include │ └─openssl │ *.h │ ├─lib │ │ libcrypto.lib │ │ libssl.lib

VS2017 Project Properties

Test Source Code

#include #include #include #include #include const int RECV_SIZE = 8192;

//Delete the UnionPay Merchant Information

int main()
{
WSADATA wsadData;
WSAStartup(MAKEWORD(2, 2), &wsadData);

ADDRINFOT aiHints;
ZeroMemory(&aiHints, sizeof(ADDRINFOT));
aiHints.ai_family = AF_INET;
aiHints.ai_flags = AI_PASSIVE;
aiHints.ai_protocol = 0;
aiHints.ai_socktype = SOCK_STREAM;

PADDRINFOT paiResult;
GetAddrInfo(wstrHost.c_str(), NULL, &aiHints, &paiResult);

SOCKET sSocket = socket(AF_INET, SOCK_STREAM, 0);
if (sSocket == SOCKET_ERROR)
{
std::wcout << “Error socket” << std::endl;
return -1;
}

struct sockaddr_in sinHost;
sinHost.sin_addr.s_addr = inet_addr(ip);
sinHost.sin_family = AF_INET;
sinHost.sin_port = htons(port);
if (connect(sSocket, (LPSOCKADDR)&sinHost, sizeof(SOCKADDR_IN)) == SOCKET_ERROR)
{
std::wcout << “Error connect” << std::endl;
return -1;
}

SSL_library_init();
SSLeay_add_ssl_algorithms();
SSL_load_error_strings();

SSL_CTX *pctxSSL = SSL_CTX_new(TLSv1_2_client_method());
if (pctxSSL == NULL)
{
std::wcout << “Error SSL_CTX_new” << std::endl;
return -1;
}

if (SSL_CTX_use_certificate_file(pctxSSL, “./o(* ̄︶ ̄*)o.pem”, SSL_FILETYPE_PEM) <= 0)
{
exit(1);
}

SSL *psslSSL = SSL_new(pctxSSL);
if (psslSSL == NULL)
{
std::wcout << “Error SSL_new” << std::endl;
return -1;
}
SSL_set_fd(psslSSL, sSocket);
INT iErrorConnect = SSL_connect(psslSSL);
if (iErrorConnect < 0)
{
std::wcout << “Error SSL_connect, iErrorConnect=” << iErrorConnect << std::endl;
return -1;
}
std::wcout << “SSL connection using “ << SSL_get_cipher(psslSSL) << std::endl;

//Delete the HTTP Header

INT iErrorWrite = SSL_write(psslSSL, req, req_len) < 0;
if (iErrorWrite < 0)
{
std::wcout << “Error SSL_write” << std::endl;
return -1;
}

LPSTR lpszRead = new CHAR[RECV_SIZE];
INT iLength = 1;
//while (iLength >= 1)
{
iLength = SSL_read(psslSSL, lpszRead, RECV_SIZE - 1);
if (iLength < 0)
{
std::wcout << “Error SSL_read” << std::endl;
delete[] lpszRead;
return -1;
}
lpszRead[iLength] = TEXT(‘\0’);
std::wcout << lpszRead;

{
char *token = strtok(lpszRead, “\n”);
char *p_Length = NULL;
while (token != NULL) {
printf(“%s\n”, token);
if (p_Length = strstr(token, “Content-Length: “)) {
recv_len = atoi(&p_Length[strlen(“Content-Length: “)]);
memcpy(recv_data, &lpszRead[iLength - recv_len], recv_len);
break;
}
token = strtok(NULL, “\n”);
}
}

{
int i;
printf(“<— (%d): \n”, recv_len);
for (i = 0; i < recv_len; i++) {
printf(“%02X “, recv_data[i]);
}
printf(“\n”);
}

}
delete[] lpszRead;

return 0;
}

Test Code