feat:
--READ smash_read_this.txt
This commit is contained in:
commit
1ddf693260
181 files changed
+66527
No files matched your search
@@ -0,0 +1,25 @@
|
||||
include_directories(
|
||||
.
|
||||
)
|
||||
|
||||
set(example_SRCS
|
||||
tls_client.c
|
||||
)
|
||||
|
||||
IF(WIN32)
|
||||
set_source_files_properties(${example_SRCS}
|
||||
PROPERTIES LANGUAGE CXX)
|
||||
ENDIF(WIN32)
|
||||
|
||||
configure_file(client_CA1_1.key client_CA1_1.key COPYONLY)
|
||||
configure_file(client_CA1_1.pem client_CA1_1.pem COPYONLY)
|
||||
configure_file(root_CA1.pem root_CA1.pem COPYONLY)
|
||||
configure_file(server_CA1_1.pem server_CA1_1.pem COPYONLY)
|
||||
|
||||
add_executable(tls_client
|
||||
${example_SRCS}
|
||||
)
|
||||
|
||||
target_link_libraries(tls_client
|
||||
lib60870
|
||||
)
|
||||
@@ -0,0 +1,20 @@
|
||||
LIB60870_HOME=../..
|
||||
|
||||
PROJECT_BINARY_NAME = tls_client
|
||||
PROJECT_SOURCES = tls_client.c
|
||||
|
||||
include $(LIB60870_HOME)/make/target_system.mk
|
||||
include $(LIB60870_HOME)/make/stack_includes.mk
|
||||
|
||||
all: $(PROJECT_BINARY_NAME)
|
||||
|
||||
include $(LIB60870_HOME)/make/common_targets.mk
|
||||
|
||||
|
||||
$(PROJECT_BINARY_NAME): $(PROJECT_SOURCES) $(LIB_NAME)
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) -g -o $(PROJECT_BINARY_NAME) $(PROJECT_SOURCES) $(INCLUDES) $(LIB_NAME) $(LDLIBS)
|
||||
|
||||
clean:
|
||||
rm -f $(PROJECT_BINARY_NAME)
|
||||
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
-----BEGIN RSA PRIVATE KEY-----
|
||||
MIIEpQIBAAKCAQEA2PuXMNUYO43NbEvBmEAru/uL1JdU6gFuhMKLuZOPaOGjGhth
|
||||
JiDO9AsnUGzKAk3m9QZ/YhAzY9CiEeYsnGaPeI0OBdkgWmpz5k9Fw+bqaqlxYQTy
|
||||
Bw69/kYbwNyMmGsb8XqXKZvhPXdLoaxkVmS+AMlxVcN/7c2ldZGTTDrhBtJnfuPK
|
||||
rGmH9cFg+XVvUskPQsUIwJtn1sN+niZ++hkuiCzmoZ4A+m73QACltdcr7aNtHJmh
|
||||
aU/p1bmLIhYfbxGmyvm2faJ8htYuaRBj6DcZq44IyDGz2LThmdWzpIcYbovCzB2X
|
||||
Pn26b0BXsXBpN+ptf2xpAEDWDdzaR6Xp4BgJwQIDAQABAoIBAQDQGLJOlgBQlVWv
|
||||
CBSaNOj8t2nKsHwylL7uujoQ95DxUH0BO8L3Mz3n1Y6V1lAC172pvtqKLOlsUBov
|
||||
OmYMdVwhjH4nY65gqHmRJvPMxviI5Qqktn58AEp8w7Y4SAza3NaGyECTGjlxnqi9
|
||||
XD06khGbZZa5Xu6hHboSwFPZJxrLU1jaopJUgFG+p9oUgiSp5cfGDwAsU9JELmkP
|
||||
MVF0GWedpypBBKi9JsniOulr1USpNZN2rzEkkxwY0QQttw3E9dgheIsut7dUYWLz
|
||||
9NLKcRWIK/Y29NzS6Urye8lUTHHBrXgk5pUcdN3vuY7mkleqIn5tYY6xf93/5/VA
|
||||
jF+HcgolAoGBAPDhS986xppbfLmrresIUUZKxk2s/Vg+vHPLX0SJFF7Uhy8nMYoJ
|
||||
JqfG2mS+/tiM/wPBglVhsrlsfnDIag7Brqx7sjH2OHO6VX8jQPYgOuCbNwp7uL1w
|
||||
bG82R5rujcxxFAtMVAM3zYz9sNGSu8u7M/U3kfTBwtntFJ6iPC60REbjAoGBAOaa
|
||||
SdtX0bOQAYDM4moEDVnRPMHp8lZAjqKphGqTDrGOqU4usNW8+ZNBhn3vF1+n2Gq5
|
||||
KY2IWSF0j71jqpOXahW0EBoXpcTLs5JBWet8J5vKzbpN8Uq8TvTABn67G1F/DZub
|
||||
FOiCDy/Kku4yWT2aUqNwS07va7gzFhyyjMl/JWoLAoGAATpEtriH9pVsx012r3H1
|
||||
aBRNemvdRqvbLgPlUmYYcntGzRi4CeoOBmDfEBBhIB1n108PKPw8evFwm4aJ89VM
|
||||
3JgsylBk7UIP2XwGgrqbUjW4TBdhU6XVB6QRLVr14grZfU1ASFvqckOAuTC0QE+N
|
||||
7jwARG0QXyf0KPLOt7Y3et0CgYEAhJcd9EJQTsB0PMyROofN7WDDYHPVZQaFfL2f
|
||||
Z2/auPjgHBX4k0yu6553aB17AQMPCn4giEJnjTbqFukhgO9EjeoUgAwswjSlsWhl
|
||||
/WJLm+ZF1+NM473WYB+xHFkU4gz9lATdRrrRZJdDWDYW3bbH4TWF94LuGuE0y5dW
|
||||
H909c/UCgYEAiYY/TTZvfEsQvCo4Rv6qg7cI2/OdGwGhMmtziYy4SIAAm0Ga2s3R
|
||||
L7Kq72In+nbaDIUD2zTSGQmwTm3B0C73vIUAXvupcl28nE5px0YNV6NZJaaFSV66
|
||||
hP1CgPBYe6KjnVufOiqhcnDdJQ6XdqK0tblj+cavkZgW+UdeqVBXCFQ=
|
||||
-----END RSA PRIVATE KEY-----
|
||||
@@ -0,0 +1,20 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIDWzCCAkMCFFTJkICEIidmnrisIFxZ99KKLhDFMA0GCSqGSIb3DQEBCwUAMGox
|
||||
CzAJBgNVBAYTAkRFMQswCQYDVQQIDAJCVzERMA8GA1UEBwwIRnJlaWJ1cmcxGzAZ
|
||||
BgNVBAoMEk1aIEF1dG9tYXRpb24gR21iSDEMMAoGA1UECwwDUiZEMRAwDgYDVQQD
|
||||
DAdyb290X0NBMB4XDTIyMDMxODA5MzMxOFoXDTIyMDQxNzA5MzMxOFowajELMAkG
|
||||
A1UEBhMCREUxCzAJBgNVBAgMAkJXMREwDwYDVQQHDAhGcmVpYnVyZzEbMBkGA1UE
|
||||
CgwSTVogQXV0b21hdGlvbiBHbWJIMQwwCgYDVQQLDANSJkQxEDAOBgNVBAMMB2Ns
|
||||
aWVudDEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDY+5cw1Rg7jc1s
|
||||
S8GYQCu7+4vUl1TqAW6Ewou5k49o4aMaG2EmIM70CydQbMoCTeb1Bn9iEDNj0KIR
|
||||
5iycZo94jQ4F2SBaanPmT0XD5upqqXFhBPIHDr3+RhvA3IyYaxvxepcpm+E9d0uh
|
||||
rGRWZL4AyXFVw3/tzaV1kZNMOuEG0md+48qsaYf1wWD5dW9SyQ9CxQjAm2fWw36e
|
||||
Jn76GS6ILOahngD6bvdAAKW11yvto20cmaFpT+nVuYsiFh9vEabK+bZ9onyG1i5p
|
||||
EGPoNxmrjgjIMbPYtOGZ1bOkhxhui8LMHZc+fbpvQFexcGk36m1/bGkAQNYN3NpH
|
||||
pengGAnBAgMBAAEwDQYJKoZIhvcNAQELBQADggEBADSnrKdPqeUr3F1MIk6P8SKo
|
||||
yR1VrPmNCljaC1i3realDlG+7jlPHfTCkwZwlEfKGa/yANJAw4hv+2tR5m4CsgMB
|
||||
x6FkKG9p6NTXyv4gXZeLa3ivqFqz7awTVMBf1C1VVeTi/H2kvHSBRmbj6Z5p7/MN
|
||||
9E1t5NsgbKKfbj4hQD+f7r6zgFdgTK8C5OYT2ijYryFl1Qqrl5CYPpswm3vL0KkM
|
||||
e3RMOBqamkFqr4OCZw5juNpGrp3bK3dLF+N6Ceb+PGnS0YU29NpUXo64lzIxdwxs
|
||||
NDqbFMYXEXGKqUDVQAuj1374M85Cvqlso0Jenc+hWN2/kfAgHGE1Ne3sD9oJg5w=
|
||||
-----END CERTIFICATE-----
|
||||
@@ -0,0 +1,22 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIDtTCCAp2gAwIBAgIUJysTAOCqE3IaNO1QgtOPxMq6M8EwDQYJKoZIhvcNAQEL
|
||||
BQAwajELMAkGA1UEBhMCREUxCzAJBgNVBAgMAkJXMREwDwYDVQQHDAhGcmVpYnVy
|
||||
ZzEbMBkGA1UECgwSTVogQXV0b21hdGlvbiBHbWJIMQwwCgYDVQQLDANSJkQxEDAO
|
||||
BgNVBAMMB3Jvb3RfQ0EwHhcNMjIwMzE4MDkyNzEwWhcNMzIwMzE1MDkyNzEwWjBq
|
||||
MQswCQYDVQQGEwJERTELMAkGA1UECAwCQlcxETAPBgNVBAcMCEZyZWlidXJnMRsw
|
||||
GQYDVQQKDBJNWiBBdXRvbWF0aW9uIEdtYkgxDDAKBgNVBAsMA1ImRDEQMA4GA1UE
|
||||
AwwHcm9vdF9DQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOMyaDaT
|
||||
+a4DT0s2NCrjUN8coLPfFrLRdN0Gx0hRViuLUFxd001jXruRgXKt2g8lR+YnzUeA
|
||||
PQHbcIfRQhL+jy/ZMXpmz4Nrl7vyOWFdu8nBKU6c7y9LmSGbnOJZjDXwlX6ERwui
|
||||
qFzAvRA6YXbPN8gY0B3Ou+T/mjkWN9L1x+V+7bGs9rVIoM78fVyM2FERBfsBtT76
|
||||
QVQv3KZ+a9EOLxqcZ/nGqsFFysFOSkiRC6Cy4mC5CSik9S5D7X9lz/bdga7O+hqd
|
||||
SKfir6YMlQGV37JPqmz69N6vvb9UOX/G989T4qdVB/zQOvMdcIWXkqb3vSAXYi/c
|
||||
ClVS1Pymsy/MXQ0CAwEAAaNTMFEwHQYDVR0OBBYEFGYgIECdrhTsmgCKpVM0RHeC
|
||||
kFUmMB8GA1UdIwQYMBaAFGYgIECdrhTsmgCKpVM0RHeCkFUmMA8GA1UdEwEB/wQF
|
||||
MAMBAf8wDQYJKoZIhvcNAQELBQADggEBACsiuHFQjqOglenp/fcNbU034m/vvkyV
|
||||
SZXau9amXBWdeTEpc1HaPOYO7jFFnu/QoH6AbGZkpL0yWZJA2rf102AkOdAe6E0g
|
||||
2H77/hHoHVCfxOiOl3+icsLXJ4VXqV2vmUOEVnWfHRtej4My6avT9uCNMO2bw9hm
|
||||
56RAZrs82T9Mpg/1XQ9YUO1q4/JfP/+dCzPXAdwJ/h2cJ/q6Q9g1gRns8IzVlGOZ
|
||||
0ZBQCLqLl8vUei+t6YgjyBbeNCz4CEcmXKIJeqMB1jhpsgr6BBMTNTU2Q60b9fzU
|
||||
OCGLw94EnKYtHWGy2WHMFNbwkNCR0/jwhxKkU0HXy1aNMUBWp99M7P8=
|
||||
-----END CERTIFICATE-----
|
||||
@@ -0,0 +1,20 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIDWzCCAkMCFFTJkICEIidmnrisIFxZ99KKLhDIMA0GCSqGSIb3DQEBCwUAMGox
|
||||
CzAJBgNVBAYTAkRFMQswCQYDVQQIDAJCVzERMA8GA1UEBwwIRnJlaWJ1cmcxGzAZ
|
||||
BgNVBAoMEk1aIEF1dG9tYXRpb24gR21iSDEMMAoGA1UECwwDUiZEMRAwDgYDVQQD
|
||||
DAdyb290X0NBMB4XDTIyMDUyNjEwNDc0NFoXDTMwMDgxMjEwNDc0NFowajELMAkG
|
||||
A1UEBhMCREUxCzAJBgNVBAgMAkJXMREwDwYDVQQHDAhGcmVpYnVyZzEbMBkGA1UE
|
||||
CgwSTVogQXV0b21hdGlvbiBHbWJIMQwwCgYDVQQLDANSJkQxEDAOBgNVBAMMB3Nl
|
||||
cnZlcjEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDYUV+nESoiZ3TU
|
||||
D1D5xxNEOuhWnPzjR6S1evjlXRFCSnPzNK4i/kZc+oFfBKApeyiOguQJgr5WaVfg
|
||||
ZDrFduUAoB39+VRL5ZWxSr2Qv1y53fR3BgqHZXj9Ob829SJmxhXdvn/xF9SljBU0
|
||||
Fb95Jxs1etUc2SIGtwgm2LGu4qzIf52tyQ/sriP4BmHjcsawro1j6ml/nAcFy0ZY
|
||||
U4IV0lKtptyTih6bzTsI4pf0+FN8Pzs6eMFByp0eS6zxZk/9IadlX7pzWTRI3g7Q
|
||||
TgxqGlaSvwPZmOxuEYUhbwBTg12huyiEKVYBnQwNHU3iijSyPgeBjaEZHYBtH/lj
|
||||
YsfiRFylAgMBAAEwDQYJKoZIhvcNAQELBQADggEBANPRnvfByVoKwfMcQYUnYT6l
|
||||
5OhYt8f2tQfoa0EXirP0O2xG052ZBl3Z5ZzBCcsq1zveaPoeqXFl6HjqIqURB5NS
|
||||
imJIi7kB7o6C2z19yxOndPm3urKGyfvxtSy2iyzTMZ8eL8RFMJC5DVV+n5Y+1EgC
|
||||
pYIu//I0ojnFOemEJXVjfxQhiUbx6Nw8HalHOhW1i017XcOWMKji/lwHfWF2PFmn
|
||||
pIWZCFPCUtHzBUkXCRzn9ESeMDcMXN6qLb2wGJkRUDw+Ls1RGJd6dnB811vOuOd+
|
||||
QQc8lyyBZ1byARcxQ8lAtof6Mv7Yzebv1OxRr7NcrV/+ujnSFyJWKrJdcMx7+10=
|
||||
-----END CERTIFICATE-----
|
||||
@@ -0,0 +1,210 @@
|
||||
#include "cs104_connection.h"
|
||||
#include "hal_thread.h"
|
||||
#include "hal_time.h"
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
static void
|
||||
connectionHandler(void* parameter, CS104_Connection connection, CS104_ConnectionEvent event)
|
||||
{
|
||||
switch (event)
|
||||
{
|
||||
case CS104_CONNECTION_OPENED:
|
||||
printf("Connection established\n");
|
||||
break;
|
||||
case CS104_CONNECTION_CLOSED:
|
||||
printf("Connection closed\n");
|
||||
break;
|
||||
case CS104_CONNECTION_FAILED:
|
||||
printf("Failed to connect\n");
|
||||
break;
|
||||
case CS104_CONNECTION_STARTDT_CON_RECEIVED:
|
||||
printf("Received STARTDT_CON\n");
|
||||
break;
|
||||
case CS104_CONNECTION_STOPDT_CON_RECEIVED:
|
||||
printf("Received STOPDT_CON\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* CS101_ASDUReceivedHandler implementation
|
||||
*
|
||||
* For CS104 the address parameter has to be ignored
|
||||
*/
|
||||
static bool
|
||||
asduReceivedHandler(void* parameter, int address, CS101_ASDU asdu)
|
||||
{
|
||||
printf("RECVD ASDU type: %s(%i) elements: %i\n", TypeID_toString(CS101_ASDU_getTypeID(asdu)),
|
||||
CS101_ASDU_getTypeID(asdu), CS101_ASDU_getNumberOfElements(asdu));
|
||||
|
||||
if (CS101_ASDU_getTypeID(asdu) == M_ME_TE_1)
|
||||
{
|
||||
printf(" measured scaled values with CP56Time2a timestamp:\n");
|
||||
|
||||
int i;
|
||||
|
||||
for (i = 0; i < CS101_ASDU_getNumberOfElements(asdu); i++)
|
||||
{
|
||||
MeasuredValueScaledWithCP56Time2a io = (MeasuredValueScaledWithCP56Time2a)CS101_ASDU_getElement(asdu, i);
|
||||
|
||||
if (io)
|
||||
{
|
||||
printf(" IOA: %i value: %i\n", InformationObject_getObjectAddress((InformationObject)io),
|
||||
MeasuredValueScaled_getValue((MeasuredValueScaled)io));
|
||||
|
||||
MeasuredValueScaledWithCP56Time2a_destroy(io);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (CS101_ASDU_getTypeID(asdu) == M_SP_NA_1)
|
||||
{
|
||||
printf(" single point information:\n");
|
||||
|
||||
int i;
|
||||
|
||||
for (i = 0; i < CS101_ASDU_getNumberOfElements(asdu); i++)
|
||||
{
|
||||
SinglePointInformation io = (SinglePointInformation)CS101_ASDU_getElement(asdu, i);
|
||||
|
||||
if (io)
|
||||
{
|
||||
printf(" IOA: %i value: %i\n", InformationObject_getObjectAddress((InformationObject)io),
|
||||
SinglePointInformation_getValue((SinglePointInformation)io));
|
||||
|
||||
SinglePointInformation_destroy(io);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static void
|
||||
securityEventHandler(void* parameter, TLSEventLevel eventLevel, int eventCode, const char* msg, TLSConnection con)
|
||||
{
|
||||
(void)parameter;
|
||||
|
||||
char peerAddrBuf[60];
|
||||
char* peerAddr = NULL;
|
||||
const char* tlsVersion = "unknown";
|
||||
|
||||
if (con)
|
||||
{
|
||||
peerAddr = TLSConnection_getPeerAddress(con, peerAddrBuf);
|
||||
tlsVersion = TLSConfigVersion_toString(TLSConnection_getTLSVersion(con));
|
||||
}
|
||||
|
||||
printf("[SECURITY EVENT] %s (t: %i, c: %i, version: %s remote-ip: %s)\n", msg, eventLevel, eventCode, tlsVersion,
|
||||
peerAddr);
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, char** argv)
|
||||
{
|
||||
char* hostname = "127.0.0.1";
|
||||
|
||||
if (argc > 1)
|
||||
{
|
||||
hostname = argv[1];
|
||||
}
|
||||
|
||||
TLSConfiguration tlsConfig = TLSConfiguration_create();
|
||||
|
||||
TLSConfiguration_setEventHandler(tlsConfig, securityEventHandler, NULL);
|
||||
|
||||
TLSConfiguration_setChainValidation(tlsConfig, true);
|
||||
TLSConfiguration_setAllowOnlyKnownCertificates(tlsConfig, true);
|
||||
|
||||
TLSConfiguration_setOwnKeyFromFile(tlsConfig, "client_CA1_1.key", NULL);
|
||||
TLSConfiguration_setOwnCertificateFromFile(tlsConfig, "client_CA1_1.pem");
|
||||
TLSConfiguration_addCACertificateFromFile(tlsConfig, "root_CA1.pem");
|
||||
|
||||
TLSConfiguration_addAllowedCertificateFromFile(tlsConfig, "server_CA1_1.pem");
|
||||
|
||||
// TLSConfiguration_setMaxTlsVersion(tlsConfig, TLS_VERSION_TLS_1_1);
|
||||
|
||||
CS104_Connection con = CS104_Connection_createSecure(hostname, IEC_60870_5_104_DEFAULT_TLS_PORT, tlsConfig);
|
||||
|
||||
CS104_Connection_setConnectionHandler(con, connectionHandler, NULL);
|
||||
CS104_Connection_setASDUReceivedHandler(con, asduReceivedHandler, NULL);
|
||||
|
||||
if (CS104_Connection_connect(con))
|
||||
{
|
||||
printf("Connected!\n");
|
||||
|
||||
CS104_Connection_sendStartDT(con);
|
||||
|
||||
Thread_sleep(1000);
|
||||
|
||||
CS104_Connection_sendInterrogationCommand(con, CS101_COT_ACTIVATION, 1, IEC60870_QOI_STATION);
|
||||
|
||||
Thread_sleep(1000);
|
||||
|
||||
InformationObject sc = (InformationObject)SingleCommand_create(NULL, 5000, true, false, 0);
|
||||
|
||||
printf("Send control command C_SC_NA_1\n");
|
||||
CS104_Connection_sendProcessCommand(con, C_SC_NA_1, CS101_COT_ACTIVATION, 1, sc);
|
||||
|
||||
InformationObject_destroy(sc);
|
||||
|
||||
/* Send clock synchronization command */
|
||||
struct sCP56Time2a newTime;
|
||||
|
||||
CP56Time2a_createFromMsTimestamp(&newTime, Hal_getTimeInMs());
|
||||
|
||||
printf("Send time sync command\n");
|
||||
CS104_Connection_sendClockSyncCommand(con, 1, &newTime);
|
||||
|
||||
Thread_sleep(1000);
|
||||
|
||||
printf("Close connection\n");
|
||||
|
||||
CS104_Connection_close(con);
|
||||
}
|
||||
else
|
||||
printf("Connect failed!\n");
|
||||
|
||||
printf("Waiting...\n");
|
||||
Thread_sleep(5000);
|
||||
|
||||
if (CS104_Connection_connect(con))
|
||||
{
|
||||
printf("Connected!\n");
|
||||
|
||||
CS104_Connection_sendStartDT(con);
|
||||
|
||||
Thread_sleep(1000);
|
||||
|
||||
CS104_Connection_sendInterrogationCommand(con, CS101_COT_ACTIVATION, 1, IEC60870_QOI_STATION);
|
||||
|
||||
Thread_sleep(1000);
|
||||
|
||||
InformationObject sc = (InformationObject)SingleCommand_create(NULL, 5000, true, false, 0);
|
||||
|
||||
printf("Send control command C_SC_NA_1\n");
|
||||
CS104_Connection_sendProcessCommand(con, C_SC_NA_1, CS101_COT_ACTIVATION, 1, sc);
|
||||
|
||||
InformationObject_destroy(sc);
|
||||
|
||||
/* Send clock synchronization command */
|
||||
struct sCP56Time2a newTime;
|
||||
|
||||
CP56Time2a_createFromMsTimestamp(&newTime, Hal_getTimeInMs());
|
||||
|
||||
printf("Send time sync command\n");
|
||||
CS104_Connection_sendClockSyncCommand(con, 1, &newTime);
|
||||
|
||||
Thread_sleep(1000);
|
||||
|
||||
printf("Close connection\n");
|
||||
}
|
||||
else
|
||||
printf("Connect failed!\n");
|
||||
|
||||
Thread_sleep(1000);
|
||||
|
||||
CS104_Connection_destroy(con);
|
||||
|
||||
TLSConfiguration_destroy(tlsConfig);
|
||||
}
|
||||
Reference in new issue
Block a user