29#define DISABLE_DEBUGLOG
35#include "syncio_tls_p.h"
38#include <gwenhywfar/misc.h>
39#include <gwenhywfar/debug.h>
40#include <gwenhywfar/gui.h>
41#include <gwenhywfar/gui.h>
42#include <gwenhywfar/pathmanager.h>
43#include <gwenhywfar/directory.h>
44#include <gwenhywfar/gwenhywfar.h>
45#include <gwenhywfar/text.h>
52#include <gnutls/gnutls.h>
53#include <gnutls/x509.h>
63 "/etc/ssl/certs/ca-certificates.crt",
64 "/etc/ssl/ca-bundle.pem",
100 xio=(GWEN_SYNCIO_TLS *) p;
101 free(xio->localCertFile);
102 free(xio->localKeyFile);
103 free(xio->localTrustFile);
104 free(xio->dhParamFile);
114 GWEN_SYNCIO_TLS *xio;
121 oldF=xio->checkCertFn;
131 GWEN_SYNCIO_TLS *xio;
145 GWEN_SYNCIO_TLS *xio;
151 if (xio->checkCertFn) {
153 return xio->checkCertFn(sio, cert);
166 GWEN_SYNCIO_TLS *xio;
172 return xio->localCertFile;
179 GWEN_SYNCIO_TLS *xio;
185 free(xio->localCertFile);
187 xio->localCertFile=strdup(s);
189 xio->localCertFile=
NULL;
196 GWEN_SYNCIO_TLS *xio;
202 return xio->localKeyFile;
209 GWEN_SYNCIO_TLS *xio;
215 free(xio->localKeyFile);
217 xio->localKeyFile=strdup(s);
219 xio->localKeyFile=
NULL;
226 GWEN_SYNCIO_TLS *xio;
232 return xio->localTrustFile;
239 GWEN_SYNCIO_TLS *xio;
245 free(xio->localTrustFile);
247 xio->localTrustFile=strdup(s);
249 xio->localTrustFile=
NULL;
256 GWEN_SYNCIO_TLS *xio;
262 return xio->dhParamFile;
269 GWEN_SYNCIO_TLS *xio;
275 free(xio->dhParamFile);
277 xio->dhParamFile=strdup(s);
279 xio->dhParamFile=
NULL;
286 GWEN_SYNCIO_TLS *xio;
292 return xio->hostName;
299 GWEN_SYNCIO_TLS *xio;
307 xio->hostName=strdup(s);
316 GWEN_SYNCIO_TLS *xio;
322 return xio->peerCertDescr;
359#if GWEN_TLS_USE_SYSTEM_CERTIFICATES
361static int GWEN_SyncIo_Tls_AddCaCertFolder(
GWEN_SYNCIO *sio,
const char *folder)
363 GWEN_SYNCIO_TLS *xio;
365 int successfullTustFileCount=0;
371 if (folder && *folder) {
378 "Error reading list of certificate files (%d) in folder [%s]",
390 rv=gnutls_certificate_set_x509_trust_file(xio->credentials,
392 GNUTLS_X509_FMT_PEM);
395 "gnutls_certificate_set_x509_trust_file(%s): %d (%s)",
396 s, rv, gnutls_strerror(rv));
400 successfullTustFileCount++;
410 if (successfullTustFileCount==0) {
414 return successfullTustFileCount;
423 GWEN_SYNCIO_TLS *xio;
426 const char *custom_ciphers;
427 const char *errPos=
NULL;
439 rv=gnutls_init(&xio->session, GNUTLS_SERVER);
443 rv=gnutls_init(&xio->session, GNUTLS_CLIENT);
451 custom_ciphers=getenv(
"GWEN_TLS_CIPHER_PRIORITIES");
453 if (custom_ciphers && *custom_ciphers) {
455 rv=gnutls_priority_set_direct(xio->session, custom_ciphers, &errPos);
456 if (rv!=GNUTLS_E_SUCCESS) {
458 custom_ciphers, gnutls_strerror(rv), rv, errPos?errPos:
"");
459 gnutls_deinit(xio->session);
465 rv=gnutls_set_default_priority(xio->session);
466 if (rv!=GNUTLS_E_SUCCESS) {
468 gnutls_deinit(xio->session);
474 gnutls_handshake_set_max_packet_length(xio->session, 64*1024);
479 gnutls_certificate_server_set_request(xio->session, GNUTLS_CERT_REQUIRE);
482 rv=gnutls_certificate_allocate_credentials(&xio->credentials);
485 gnutls_deinit(xio->session);
490 if (xio->localCertFile && xio->localKeyFile) {
491 rv=gnutls_certificate_set_x509_key_file(xio->credentials,
494 GNUTLS_X509_FMT_PEM);
498 gnutls_certificate_free_credentials(xio->credentials);
499 gnutls_deinit(xio->session);
509#if GWEN_TLS_USE_SYSTEM_CERTIFICATES
517 if (trustFileSet==0) {
519 rv=gnutls_certificate_set_x509_system_trust(xio->credentials);
532 if (trustFileSet==0) {
534 const char *defaultFile =
"ca-bundle.crt";
542 if (strcat_s(defaultPath,
sizeof(defaultPath),
"\\share\\gwenhywfar")) {
555 "Using default ca-bundle from [%s]",
558 rv=gnutls_certificate_set_x509_trust_file(xio->credentials,
560 GNUTLS_X509_FMT_PEM);
563 "gnutls_certificate_set_x509_trust_file(%s): %d (%s)",
579 if (trustFileSet==0) {
581 const char *sCertFile=
NULL;
593 if (sCertFile && *sCertFile) {
594 rv=gnutls_certificate_set_x509_trust_file(xio->credentials, sCertFile, GNUTLS_X509_FMT_PEM);
596 DBG_WARN(
GWEN_LOGDOMAIN,
"gnutls_certificate_set_x509_trust_file(%s): %d (%s)", sCertFile, rv, gnutls_strerror(rv));
609 if (trustFileSet==0) {
612 rv=GWEN_SyncIo_Tls_AddCaCertFolder(sio,
"/usr/share/ca-certificates");
625 if (trustFileSet==0) {
633 if (trustFileSet==0) {
639 if (xio->localTrustFile) {
640 rv=gnutls_certificate_set_x509_trust_file(xio->credentials,
642 GNUTLS_X509_FMT_PEM);
645 "gnutls_certificate_set_x509_trust_file(%s): %d (%s)",
646 (xio->localTrustFile)?(xio->localTrustFile):
"-none-",
647 rv, gnutls_strerror(rv));
648 gnutls_certificate_free_credentials(xio->credentials);
649 gnutls_deinit(xio->session);
654 "Added %d trusted certs", rv);
659 if (xio->dhParamFile) {
667 gnutls_certificate_free_credentials(xio->credentials);
668 gnutls_deinit(xio->session);
673 gnutls_dh_params_t dh_params=
NULL;
675 rv=gnutls_dh_params_init(&dh_params);
679 gnutls_certificate_free_credentials(xio->credentials);
680 gnutls_deinit(xio->session);
687 rv=gnutls_dh_params_import_pkcs3(dh_params, &d, GNUTLS_X509_FMT_PEM);
691 gnutls_certificate_free_credentials(xio->credentials);
692 gnutls_deinit(xio->session);
697 gnutls_certificate_set_dh_params(xio->credentials, dh_params);
702 rv=gnutls_credentials_set(xio->session, GNUTLS_CRD_CERTIFICATE, xio->credentials);
705 gnutls_certificate_free_credentials(xio->credentials);
706 gnutls_deinit(xio->session);
712 rv=gnutls_server_name_set(xio->session, GNUTLS_NAME_DNS, xio->hostName, strlen(xio->hostName));
713 if (rv!=GNUTLS_E_SUCCESS) {
719 gnutls_transport_set_ptr(xio->session, (gnutls_transport_ptr_t)sio);
722#if GNUTLS_VERSION_NUMBER < 0x020c00
729 gnutls_transport_set_lowat(xio->session, 0);
741 GWEN_SYNCIO_TLS *xio;
748 gnutls_certificate_free_credentials(xio->credentials);
749 gnutls_deinit(xio->session);
758 GWEN_SYNCIO_TLS *xio;
759 const gnutls_datum_t *cert_list;
760 unsigned int cert_list_size;
778 if (xio->peerCertDescr) {
780 xio->peerCertDescr=
NULL;
782 xio->peerCertFlags=0;
795 gnutls_certificate_set_verify_flags(xio->credentials,
796 GNUTLS_VERIFY_ALLOW_X509_V1_CA_CRT);
798 rv=gnutls_certificate_verify_peers2(xio->session, &status);
805 if (gnutls_certificate_type_get(xio->session)!=GNUTLS_CRT_X509) {
812 if (status & GNUTLS_CERT_SIGNER_NOT_FOUND) {
815 I18N(
"Signer not found"));
819 if (status & GNUTLS_CERT_INVALID) {
822 I18N(
"Certificate is not trusted"));
826 if (status & GNUTLS_CERT_REVOKED) {
829 I18N(
"Certificate has been revoked"));
833 cert_list=gnutls_certificate_get_peers(xio->session, &cert_list_size);
834 if (cert_list==
NULL || cert_list_size==0) {
839 for (i=0; i<(int) cert_list_size; i++) {
840 gnutls_x509_crt_t cert;
843 rv=gnutls_x509_crt_init(&cert);
849 rv=gnutls_x509_crt_import(cert, &cert_list[0], GNUTLS_X509_FMT_DER);
852 gnutls_x509_crt_deinit(cert);
857 gnutls_datum_t n= {
NULL, 0};
858 gnutls_datum_t e= {
NULL, 0};
861 rv=gnutls_x509_crt_get_pk_rsa_raw(cert, &n, &e);
873 if (n.data && n.size) {
880 if (e.data && e.size) {
896 rv=gnutls_x509_crt_get_fingerprint(cert, GNUTLS_DIG_MD5, buffer1, &size);
900 gnutls_x509_crt_deinit(cert);
908 size, dbuf, 2,
':', 0)) {
910 "Could not convert fingerprint to hex");
919 size=
sizeof(buffer1);
920 rv=gnutls_x509_crt_get_fingerprint(cert, GNUTLS_DIG_SHA1, buffer1, &size);
924 gnutls_x509_crt_deinit(cert);
932 size, dbuf, 2,
':', 0)) {
934 "Could not convert fingerprint to hex");
943 size=
sizeof(buffer1);
944 rv=gnutls_x509_crt_get_fingerprint(cert, GNUTLS_DIG_SHA512, buffer1, &size);
948 gnutls_x509_crt_deinit(cert);
956 size, dbuf, 2,
':', 0)) {
958 "Could not convert fingerprint to hex");
969 if (!gnutls_x509_crt_check_hostname(cert, xio->hostName)) {
971 "Certificate was not issued for this host");
973 I18N(
"Certificate was not issued for this host"));
982 "Hostname is not set, unable to verify the sender");
984 I18N(
"No hostname to verify the sender!"));
990 t=gnutls_x509_crt_get_activation_time(cert);
1011 t=gnutls_x509_crt_get_expiration_time(cert);
1033 size=
sizeof(buffer1)-1;
1034 rv=gnutls_x509_crt_get_dn_by_oid(cert, GNUTLS_OID_X520_COMMON_NAME, 0, 0, buffer1, &size);
1037 if (xio->hostName && strcasecmp(xio->hostName, buffer1)!=0) {
1043 size=
sizeof(buffer1)-1;
1044 rv=gnutls_x509_crt_get_dn_by_oid(cert, GNUTLS_OID_X520_ORGANIZATION_NAME, 0, 0, buffer1, &size);
1048 size=
sizeof(buffer1)-1;
1049 rv=gnutls_x509_crt_get_dn_by_oid(cert, GNUTLS_OID_X520_ORGANIZATIONAL_UNIT_NAME, 0, 0, buffer1, &size);
1053 size=
sizeof(buffer1)-1;
1054 rv=gnutls_x509_crt_get_dn_by_oid(cert, GNUTLS_OID_X520_LOCALITY_NAME, 0, 0, buffer1, &size);
1058 size=
sizeof(buffer1)-1;
1059 rv=gnutls_x509_crt_get_dn_by_oid(cert, GNUTLS_OID_X520_STATE_OR_PROVINCE_NAME, 0, 0, buffer1, &size);
1063 size=
sizeof(buffer1)-1;
1064 rv=gnutls_x509_crt_get_dn_by_oid(cert, GNUTLS_OID_X520_COUNTRY_NAME, 0, 0, buffer1, &size);
1069 gnutls_x509_crt_deinit(cert);
1149 xio->peerCertDescr=certDescr;
1150 xio->peerCertFlags=errFlags;
1160 GWEN_SYNCIO_TLS *xio;
1176 gnutls_transport_set_errno(xio->session, errno);
1180 gnutls_transport_set_errno(xio->session, 0);
1191 GWEN_SYNCIO_TLS *xio;
1207 gnutls_transport_set_errno(xio->session, errno);
1211 gnutls_transport_set_errno(xio->session, 0);
1221 GWEN_SYNCIO_TLS *xio;
1223 gnutls_kx_algorithm_t kx;
1235 s=gnutls_protocol_get_name(gnutls_protocol_get_version(xio->session));
1247 kx=gnutls_kx_get(xio->session);
1248 s=gnutls_kx_get_name(kx);
1259 s=gnutls_cipher_get_name(gnutls_cipher_get(xio->session));
1270 s=gnutls_mac_get_name(gnutls_mac_get(xio->session));
1286 switch (gnutls_cipher_get(xio->session)) {
1287 case GNUTLS_CIPHER_ARCFOUR_128:
1288 case GNUTLS_CIPHER_3DES_CBC:
1289 case GNUTLS_CIPHER_AES_128_CBC:
1290 case GNUTLS_CIPHER_ARCFOUR_40:
1291 case GNUTLS_CIPHER_CAMELLIA_128_CBC:
1294 case GNUTLS_CIPHER_AES_256_CBC:
1295 case GNUTLS_CIPHER_CAMELLIA_256_CBC:
1296 case GNUTLS_CIPHER_RC2_40_CBC:
1297 case GNUTLS_CIPHER_DES_CBC:
1298#ifdef GNUTLS_CIPHER_AES_192_CBC
1299 case GNUTLS_CIPHER_AES_192_CBC:
1310 GWEN_SYNCIO_TLS *xio;
1345 rv=gnutls_handshake(xio->session);
1347 while (rv==GNUTLS_E_AGAIN || rv==GNUTLS_E_INTERRUPTED);
1351 rv, gnutls_strerror(rv), gnutls_error_is_fatal(rv)?
"fatal":
"non-fatal");
1352 if (rv==GNUTLS_E_UNEXPECTED_PACKET_LENGTH) {
1355 I18N(
"A TLS handshake error occurred. "
1356 "If you are using AqBanking you should "
1357 "consider enabling the option "
1358 "\"force SSLv3\" in the user settings "
1364 I18N(
"TLS Handshake Error: %d (%s)"),
1366 gnutls_strerror(rv));
1418 GWEN_SYNCIO_TLS *xio;
1437 rv=gnutls_bye(xio->session, GNUTLS_SHUT_RDWR);
1439 while (rv==GNUTLS_E_AGAIN || rv==GNUTLS_E_INTERRUPTED);
1445 I18N(
"Error on gnutls_bye: %d (%s)"),
1447 gnutls_strerror(rv));
1466 GWEN_SYNCIO_TLS *xio;
1485 rv=gnutls_record_recv(xio->session, buffer, size);
1487 while (rv==GNUTLS_E_AGAIN || rv==GNUTLS_E_INTERRUPTED);
1494 I18N(
"Error on gnutls_record_recv: %d (%s)"),
1496 gnutls_strerror(rv));
1501#ifdef GNUTLS_E_PREMATURE_TERMINATION
1502 if (rv==GNUTLS_E_PREMATURE_TERMINATION) {
1516#ifdef GWEN_TLS_DEBUG
1527 const uint8_t *buffer,
1530 GWEN_SYNCIO_TLS *xio;
1538#ifdef GWEN_TLS_DEBUG
1554 rv=gnutls_record_send(xio->session, buffer, size);
1556 while (rv==GNUTLS_E_AGAIN || rv==GNUTLS_E_INTERRUPTED);
1562 I18N(
"Error on gnutls_record_send: %d (%s)"),
1564 gnutls_strerror(rv));
GWEN_BUFFER * GWEN_Buffer_new(char *buffer, uint32_t size, uint32_t used, int take)
int GWEN_Buffer_IncrementPos(GWEN_BUFFER *bf, uint32_t i)
void GWEN_Buffer_Reset(GWEN_BUFFER *bf)
int GWEN_Buffer_AdjustUsedBytes(GWEN_BUFFER *bf)
char * GWEN_Buffer_GetPosPointer(const GWEN_BUFFER *bf)
void GWEN_Buffer_free(GWEN_BUFFER *bf)
int GWEN_Buffer_AppendString(GWEN_BUFFER *bf, const char *buffer)
uint32_t GWEN_Buffer_GetUsedBytes(const GWEN_BUFFER *bf)
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
int GWEN_Buffer_AllocRoom(GWEN_BUFFER *bf, uint32_t size)
GWEN_DB_NODE * GWEN_DB_Group_new(const char *name)
void GWEN_DB_Dump(GWEN_DB_NODE *n, int insert)
void GWEN_DB_Group_free(GWEN_DB_NODE *n)
struct GWEN_DB_NODE GWEN_DB_NODE
#define DBG_WARN(dbg_logger, format, args...)
#define DBG_NOTICE(dbg_logger, format, args...)
#define DBG_VERBOUS(dbg_logger, format, args...)
#define DBG_INFO(dbg_logger, format, args...)
#define DBG_ERROR(dbg_logger, format, args...)
GWENHYWFAR_API int GWEN_Directory_GetPrefixDirectory(char *buffer, unsigned int size)
GWENHYWFAR_API int GWEN_Directory_GetMatchingFilesRecursively(const char *folder, GWEN_STRINGLIST *sl, const char *mask)
GWENHYWFAR_API int GWEN_Directory_FindFileInPaths(const GWEN_STRINGLIST *paths, const char *filePath, GWEN_BUFFER *fbuf)
GWENHYWFAR_API int GWEN_Directory_GetPath(const char *path, unsigned int flags)
#define GWEN_ERROR_SSL_SECURITY
#define GWEN_ERROR_NOT_CONNECTED
#define GWEN_ERROR_SSL_PREMATURE_CLOSE
#define GWEN_ERROR_GENERIC
#define GWEN_ERROR_NO_DATA
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
GWENHYWFAR_API int GWEN_Gui_CheckCert(const GWEN_SSLCERTDESCR *cert, GWEN_SYNCIO *sio, uint32_t guiid)
GWENHYWFAR_API int GWEN_Gui_ProgressLog(uint32_t id, GWEN_LOGGER_LEVEL level, const char *text)
GWENHYWFAR_API int GWEN_Gui_ProgressLog2(uint32_t id, GWEN_LOGGER_LEVEL level, const char *text,...)
struct GWEN_TIME GWEN_TIME
GWENHYWFAR_API void GWEN_Time_free(GWEN_TIME *t)
GWENHYWFAR_API GWEN_TIME * GWEN_Time_fromSeconds(uint32_t s)
#define GWEN_INHERIT_SETDATA(bt, t, element, data, fn)
#define GWEN_INHERIT(bt, t)
#define GWEN_INHERIT_GETDATA(bt, t, element)
@ GWEN_LoggerLevel_Warning
@ GWEN_LoggerLevel_Notice
#define GWEN_FREE_OBJECT(varname)
#define GWEN_NEW_OBJECT(typ, varname)
#define GWEN_PATH_FLAGS_VARIABLE
#define GWEN_PATH_FLAGS_NAMEMUSTEXIST
void GWEN_SslCertDescr_SetIsError(GWEN_SSLCERTDESCR *st, int d)
void GWEN_SslCertDescr_SetFingerPrintSha1(GWEN_SSLCERTDESCR *st, const char *d)
void GWEN_SslCertDescr_SetOrganizationName(GWEN_SSLCERTDESCR *st, const char *d)
GWEN_SSLCERTDESCR * GWEN_SslCertDescr_new(void)
void GWEN_SslCertDescr_SetNotAfter(GWEN_SSLCERTDESCR *st, const GWEN_TIME *d)
void GWEN_SslCertDescr_SetFingerPrint(GWEN_SSLCERTDESCR *st, const char *d)
void GWEN_SslCertDescr_SetPubKeyExponent(GWEN_SSLCERTDESCR *st, const char *d)
int GWEN_SslCertDescr_toDb(const GWEN_SSLCERTDESCR *st, GWEN_DB_NODE *db)
void GWEN_SslCertDescr_SetStatusFlags(GWEN_SSLCERTDESCR *st, uint32_t d)
void GWEN_SslCertDescr_SetCommonName(GWEN_SSLCERTDESCR *st, const char *d)
void GWEN_SslCertDescr_SetLocalityName(GWEN_SSLCERTDESCR *st, const char *d)
void GWEN_SslCertDescr_SetOrganizationalUnitName(GWEN_SSLCERTDESCR *st, const char *d)
void GWEN_SslCertDescr_SetNotBefore(GWEN_SSLCERTDESCR *st, const GWEN_TIME *d)
void GWEN_SslCertDescr_free(GWEN_SSLCERTDESCR *st)
void GWEN_SslCertDescr_SetCountryName(GWEN_SSLCERTDESCR *st, const char *d)
void GWEN_SslCertDescr_SetFingerPrintSha512(GWEN_SSLCERTDESCR *st, const char *d)
void GWEN_SslCertDescr_SetPubKeyModulus(GWEN_SSLCERTDESCR *st, const char *d)
void GWEN_SslCertDescr_SetStatusText(GWEN_SSLCERTDESCR *st, const char *d)
void GWEN_SslCertDescr_SetStateOrProvinceName(GWEN_SSLCERTDESCR *st, const char *d)
struct GWEN_SSLCERTDESCR GWEN_SSLCERTDESCR
#define GWEN_SSL_CERT_FLAGS_BAD_HOSTNAME
#define GWEN_SSL_CERT_FLAGS_OK
#define GWEN_SSL_CERT_FLAGS_NOT_ACTIVE
#define GWEN_SSL_CERT_FLAGS_REVOKED
#define GWEN_SSL_CERT_FLAGS_SIGNER_NOT_FOUND
#define GWEN_SSL_CERT_FLAGS_EXPIRED
#define GWEN_SSL_CERT_FLAGS_SYSTEM
#define GWEN_SSL_CERT_FLAGS_BAD_DATA
#define GWEN_SSL_CERT_FLAGS_INVALID
void GWEN_StringList_free(GWEN_STRINGLIST *sl)
const char * GWEN_StringListEntry_Data(const GWEN_STRINGLISTENTRY *se)
GWEN_STRINGLISTENTRY * GWEN_StringListEntry_Next(const GWEN_STRINGLISTENTRY *se)
int GWEN_StringList_AppendString(GWEN_STRINGLIST *sl, const char *s, int take, int checkDouble)
GWEN_STRINGLISTENTRY * GWEN_StringList_FirstEntry(const GWEN_STRINGLIST *sl)
GWEN_STRINGLIST * GWEN_StringList_new(void)
struct GWEN_STRINGLISTENTRYSTRUCT GWEN_STRINGLISTENTRY
struct GWEN_STRINGLISTSTRUCT GWEN_STRINGLIST
uint32_t GWEN_SyncIo_GetFlags(const GWEN_SYNCIO *sio)
int GWEN_SyncIo_Connect(GWEN_SYNCIO *sio)
void GWEN_SyncIo_AddFlags(GWEN_SYNCIO *sio, uint32_t fl)
GWEN_SYNCIO * GWEN_SyncIo_new(const char *typeName, GWEN_SYNCIO *baseIo)
int GWEN_SyncIo_Write(GWEN_SYNCIO *sio, const uint8_t *buffer, uint32_t size)
GWEN_SYNCIO_READ_FN GWEN_SyncIo_SetReadFn(GWEN_SYNCIO *sio, GWEN_SYNCIO_READ_FN fn)
GWEN_SYNCIO * GWEN_SyncIo_GetBaseIo(const GWEN_SYNCIO *sio)
GWEN_SYNCIO_DISCONNECT_FN GWEN_SyncIo_SetDisconnectFn(GWEN_SYNCIO *sio, GWEN_SYNCIO_DISCONNECT_FN fn)
void GWEN_SyncIo_SubFlags(GWEN_SYNCIO *sio, uint32_t fl)
GWEN_SYNCIO_WRITE_FN GWEN_SyncIo_SetWriteFn(GWEN_SYNCIO *sio, GWEN_SYNCIO_WRITE_FN fn)
GWEN_SYNCIO_STATUS GWEN_SyncIo_GetStatus(const GWEN_SYNCIO *sio)
int GWEN_SyncIo_Read(GWEN_SYNCIO *sio, uint8_t *buffer, uint32_t size)
GWEN_SYNCIO_CONNECT_FN GWEN_SyncIo_SetConnectFn(GWEN_SYNCIO *sio, GWEN_SYNCIO_CONNECT_FN fn)
void GWEN_SyncIo_SetStatus(GWEN_SYNCIO *sio, GWEN_SYNCIO_STATUS st)
int GWEN_SyncIo_Disconnect(GWEN_SYNCIO *sio)
#define GWEN_SYNCIO_FLAGS_PASSIVE
struct GWEN_SYNCIO GWEN_SYNCIO
@ GWEN_SyncIo_Status_Connected
@ GWEN_SyncIo_Status_Disconnected
int GWEN_SyncIo_Tls_CheckCert(GWEN_SYNCIO *sio, const GWEN_SSLCERTDESCR *cert)
GWEN_SIO_TLS_CHECKCERT_FN GWEN_SyncIo_Tls_SetCheckCertFn(GWEN_SYNCIO *sio, GWEN_SIO_TLS_CHECKCERT_FN f)
GWEN_SSLCERTDESCR * GWEN_SyncIo_Tls_GetPeerCertDescr(const GWEN_SYNCIO *sio)
int GWEN_SyncIo_Tls_GetPeerCert(GWEN_SYNCIO *sio)
void GWEN_SyncIo_Tls_UndoPrepare(GWEN_SYNCIO *sio)
int GWENHYWFAR_CB GWEN_SyncIo_Tls_Read(GWEN_SYNCIO *sio, uint8_t *buffer, uint32_t size)
const char * GWEN_SyncIo_Tls_GetLocalTrustFile(const GWEN_SYNCIO *sio)
ssize_t GWEN_SyncIo_Tls_Push(gnutls_transport_ptr_t p, const void *buf, size_t len)
GWEN_SYNCIO * GWEN_SyncIo_Tls_new(GWEN_SYNCIO *baseIo)
void GWENHYWFAR_CB GWEN_SyncIo_Tls_FreeData(GWEN_UNUSED void *bp, void *p)
const char * GWEN_SyncIo_Tls_GetLocalKeyFile(const GWEN_SYNCIO *sio)
void GWEN_SyncIo_Tls_SetLocalTrustFile(GWEN_SYNCIO *sio, const char *s)
void GWEN_SyncIo_Tls_SetLocalCertFile(GWEN_SYNCIO *sio, const char *s)
ssize_t GWEN_SyncIo_Tls_Pull(gnutls_transport_ptr_t p, void *buf, size_t len)
void GWEN_SyncIo_Tls_ShowCipherInfo(GWEN_SYNCIO *sio)
void GWEN_SyncIo_Tls_SetDhParamFile(GWEN_SYNCIO *sio, const char *s)
const char * GWEN_SyncIo_Tls_GetLocalCertFile(const GWEN_SYNCIO *sio)
void GWEN_SyncIo_Tls_SetLocalKeyFile(GWEN_SYNCIO *sio, const char *s)
void GWEN_SyncIo_Tls_SetRemoteHostName(GWEN_SYNCIO *sio, const char *s)
const char * SYNCIO_TLS_SYSTEM_CERTFILES[]
GWENHYWFAR_CB int GWEN_SyncIo_Tls_Internal_CheckCert(GWEN_SYNCIO *sio, const GWEN_SSLCERTDESCR *cert)
int GWEN_SyncIo_Tls__readFile(const char *fname, GWEN_BUFFER *buf)
const char * GWEN_SyncIo_Tls_GetRemoteHostName(const GWEN_SYNCIO *sio)
int GWEN_SyncIo_Tls_Prepare(GWEN_SYNCIO *sio)
int GWENHYWFAR_CB GWEN_SyncIo_Tls_Disconnect(GWEN_SYNCIO *sio)
int GWENHYWFAR_CB GWEN_SyncIo_Tls_Connect(GWEN_SYNCIO *sio)
int GWENHYWFAR_CB GWEN_SyncIo_Tls_Write(GWEN_SYNCIO *sio, const uint8_t *buffer, uint32_t size)
const char * GWEN_SyncIo_Tls_GetDhParamFile(const GWEN_SYNCIO *sio)
#define GWEN_SYNCIO_TLS_FLAGS_REQUEST_CERT
#define GWEN_SYNCIO_TLS_TYPE
#define GWEN_SYNCIO_TLS_FLAGS_ALLOW_V1_CA_CRT
#define GWEN_SYNCIO_TLS_FLAGS_IGN_PREMATURE_CLOSE
#define GWEN_SYNCIO_TLS_FLAGS_NEED_PEER_CERT
#define GWEN_SYNCIO_TLS_FLAGS_ADD_TRUSTED_CAS
#define GWEN_SYNCIO_TLS_FLAGS_SECURE
int GWENHYWFAR_CB(* GWEN_SIO_TLS_CHECKCERT_FN)(GWEN_SYNCIO *sio, const GWEN_SSLCERTDESCR *cert)
int GWEN_Text_ToHexBuffer(const char *src, unsigned l, GWEN_BUFFER *buf, unsigned int groupsize, char delimiter, int skipLeadingZeroes)
void GWEN_Text_DumpString(const char *s, unsigned int l, unsigned int insert)