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",
99 xio=(GWEN_SYNCIO_TLS *) p;
100 free(xio->localCertFile);
101 free(xio->localKeyFile);
102 free(xio->localTrustFile);
103 free(xio->dhParamFile);
112 GWEN_SYNCIO_TLS *xio;
119 oldF=xio->checkCertFn;
128 GWEN_SYNCIO_TLS *xio;
142 GWEN_SYNCIO_TLS *xio;
148 if (xio->checkCertFn) {
150 return xio->checkCertFn(sio, cert);
163 GWEN_SYNCIO_TLS *xio;
169 return xio->localCertFile;
176 GWEN_SYNCIO_TLS *xio;
182 free(xio->localCertFile);
184 xio->localCertFile=strdup(s);
186 xio->localCertFile=
NULL;
193 GWEN_SYNCIO_TLS *xio;
199 return xio->localKeyFile;
206 GWEN_SYNCIO_TLS *xio;
212 free(xio->localKeyFile);
214 xio->localKeyFile=strdup(s);
216 xio->localKeyFile=
NULL;
223 GWEN_SYNCIO_TLS *xio;
229 return xio->localTrustFile;
236 GWEN_SYNCIO_TLS *xio;
242 free(xio->localTrustFile);
244 xio->localTrustFile=strdup(s);
246 xio->localTrustFile=
NULL;
253 GWEN_SYNCIO_TLS *xio;
259 return xio->dhParamFile;
266 GWEN_SYNCIO_TLS *xio;
272 free(xio->dhParamFile);
274 xio->dhParamFile=strdup(s);
276 xio->dhParamFile=
NULL;
283 GWEN_SYNCIO_TLS *xio;
289 return xio->hostName;
296 GWEN_SYNCIO_TLS *xio;
304 xio->hostName=strdup(s);
313 GWEN_SYNCIO_TLS *xio;
319 return xio->peerCertDescr;
356 #if GWEN_TLS_USE_SYSTEM_CERTIFICATES 358 static int GWEN_SyncIo_Tls_AddCaCertFolder(
GWEN_SYNCIO *sio,
const char *folder)
360 GWEN_SYNCIO_TLS *xio;
362 int successfullTustFileCount=0;
368 if (folder && *folder) {
375 "Error reading list of certificate files (%d) in folder [%s]",
387 rv=gnutls_certificate_set_x509_trust_file(xio->credentials,
389 GNUTLS_X509_FMT_PEM);
392 "gnutls_certificate_set_x509_trust_file(%s): %d (%s)",
393 s, rv, gnutls_strerror(rv));
397 successfullTustFileCount++;
407 if (successfullTustFileCount==0) {
411 return successfullTustFileCount;
420 GWEN_SYNCIO_TLS *xio;
423 const char *custom_ciphers;
424 const char *errPos=
NULL;
436 rv=gnutls_init(&xio->session, GNUTLS_SERVER);
440 rv=gnutls_init(&xio->session, GNUTLS_CLIENT);
448 custom_ciphers=getenv(
"GWEN_TLS_CIPHER_PRIORITIES");
450 if (custom_ciphers && *custom_ciphers) {
452 rv=gnutls_priority_set_direct(xio->session, custom_ciphers, &errPos);
453 if (rv!=GNUTLS_E_SUCCESS) {
455 custom_ciphers, gnutls_strerror(rv), rv, errPos?errPos:
"");
456 gnutls_deinit(xio->session);
462 rv=gnutls_set_default_priority(xio->session);
463 if (rv!=GNUTLS_E_SUCCESS) {
465 gnutls_deinit(xio->session);
471 gnutls_handshake_set_max_packet_length(xio->session, 64*1024);
476 gnutls_certificate_server_set_request(xio->session, GNUTLS_CERT_REQUIRE);
479 rv=gnutls_certificate_allocate_credentials(&xio->credentials);
482 gnutls_deinit(xio->session);
487 if (xio->localCertFile && xio->localKeyFile) {
488 rv=gnutls_certificate_set_x509_key_file(xio->credentials,
491 GNUTLS_X509_FMT_PEM);
495 gnutls_certificate_free_credentials(xio->credentials);
496 gnutls_deinit(xio->session);
504 #if GWEN_TLS_USE_SYSTEM_CERTIFICATES 515 if (trustFileSet==0) {
517 rv=gnutls_certificate_set_x509_system_trust(xio->credentials);
529 if (trustFileSet==0) {
531 const char *defaultFile =
"ca-bundle.crt";
539 if (strcat_s(defaultPath,
sizeof(defaultPath),
"\\share\\gwenhywfar")) {
552 "Using default ca-bundle from [%s]",
555 rv=gnutls_certificate_set_x509_trust_file(xio->credentials,
557 GNUTLS_X509_FMT_PEM);
560 "gnutls_certificate_set_x509_trust_file(%s): %d (%s)",
576 if (trustFileSet==0) {
578 const char *sCertFile=
NULL;
590 if (sCertFile && *sCertFile) {
591 rv=gnutls_certificate_set_x509_trust_file(xio->credentials, sCertFile, GNUTLS_X509_FMT_PEM);
593 DBG_WARN(
GWEN_LOGDOMAIN,
"gnutls_certificate_set_x509_trust_file(%s): %d (%s)", sCertFile, rv, gnutls_strerror(rv));
606 if (trustFileSet==0) {
609 rv=GWEN_SyncIo_Tls_AddCaCertFolder(sio,
"/usr/share/ca-certificates");
622 if (trustFileSet==0) {
630 if (trustFileSet==0) {
637 if (xio->localTrustFile) {
638 rv=gnutls_certificate_set_x509_trust_file(xio->credentials,
640 GNUTLS_X509_FMT_PEM);
643 "gnutls_certificate_set_x509_trust_file(%s): %d (%s)",
644 (xio->localTrustFile)?(xio->localTrustFile):
"-none-",
645 rv, gnutls_strerror(rv));
646 gnutls_certificate_free_credentials(xio->credentials);
647 gnutls_deinit(xio->session);
652 "Added %d trusted certs", rv);
657 if (xio->dhParamFile) {
665 gnutls_certificate_free_credentials(xio->credentials);
666 gnutls_deinit(xio->session);
671 gnutls_dh_params_t dh_params=
NULL;
673 rv=gnutls_dh_params_init(&dh_params);
677 gnutls_certificate_free_credentials(xio->credentials);
678 gnutls_deinit(xio->session);
685 rv=gnutls_dh_params_import_pkcs3(dh_params, &d, GNUTLS_X509_FMT_PEM);
689 gnutls_certificate_free_credentials(xio->credentials);
690 gnutls_deinit(xio->session);
695 gnutls_certificate_set_dh_params(xio->credentials, dh_params);
700 rv=gnutls_credentials_set(xio->session, GNUTLS_CRD_CERTIFICATE, xio->credentials);
703 gnutls_certificate_free_credentials(xio->credentials);
704 gnutls_deinit(xio->session);
709 gnutls_transport_set_ptr(xio->session, (gnutls_transport_ptr_t)sio);
712 #if GNUTLS_VERSION_NUMBER < 0x020c00 719 gnutls_transport_set_lowat(xio->session, 0);
731 GWEN_SYNCIO_TLS *xio;
738 gnutls_certificate_free_credentials(xio->credentials);
739 gnutls_deinit(xio->session);
748 GWEN_SYNCIO_TLS *xio;
749 const gnutls_datum_t *cert_list;
750 unsigned int cert_list_size;
768 if (xio->peerCertDescr) {
770 xio->peerCertDescr=
NULL;
772 xio->peerCertFlags=0;
785 gnutls_certificate_set_verify_flags(xio->credentials,
786 GNUTLS_VERIFY_ALLOW_X509_V1_CA_CRT);
788 rv=gnutls_certificate_verify_peers2(xio->session, &status);
795 if (gnutls_certificate_type_get(xio->session)!=GNUTLS_CRT_X509) {
802 if (status & GNUTLS_CERT_SIGNER_NOT_FOUND) {
805 I18N(
"Signer not found"));
809 if (status & GNUTLS_CERT_INVALID) {
812 I18N(
"Certificate is not trusted"));
816 if (status & GNUTLS_CERT_REVOKED) {
819 I18N(
"Certificate has been revoked"));
823 cert_list=gnutls_certificate_get_peers(xio->session, &cert_list_size);
824 if (cert_list==
NULL || cert_list_size==0) {
829 for (i=0; i<cert_list_size; i++) {
830 gnutls_x509_crt_t cert;
833 rv=gnutls_x509_crt_init(&cert);
839 rv=gnutls_x509_crt_import(cert, &cert_list[0], GNUTLS_X509_FMT_DER);
842 gnutls_x509_crt_deinit(cert);
847 gnutls_datum_t n= {
NULL, 0};
848 gnutls_datum_t e= {
NULL, 0};
851 rv=gnutls_x509_crt_get_pk_rsa_raw(cert, &n, &e);
863 if (n.data && n.size) {
870 if (e.data && e.size) {
886 rv=gnutls_x509_crt_get_fingerprint(cert, GNUTLS_DIG_MD5, buffer1, &size);
890 gnutls_x509_crt_deinit(cert);
898 size, dbuf, 2,
':', 0)) {
900 "Could not convert fingerprint to hex");
909 size=
sizeof(buffer1);
910 rv=gnutls_x509_crt_get_fingerprint(cert, GNUTLS_DIG_SHA1, buffer1, &size);
914 gnutls_x509_crt_deinit(cert);
922 size, dbuf, 2,
':', 0)) {
924 "Could not convert fingerprint to hex");
933 size=
sizeof(buffer1);
934 rv=gnutls_x509_crt_get_fingerprint(cert, GNUTLS_DIG_SHA512, buffer1, &size);
938 gnutls_x509_crt_deinit(cert);
946 size, dbuf, 2,
':', 0)) {
948 "Could not convert fingerprint to hex");
959 if (!gnutls_x509_crt_check_hostname(cert, xio->hostName)) {
961 "Certificate was not issued for this host");
963 I18N(
"Certificate was not issued for this host"));
972 "Hostname is not set, unable to verify the sender");
974 I18N(
"No hostname to verify the sender!"));
980 t=gnutls_x509_crt_get_activation_time(cert);
1001 t=gnutls_x509_crt_get_expiration_time(cert);
1023 size=
sizeof(buffer1)-1;
1024 rv=gnutls_x509_crt_get_dn_by_oid(cert, GNUTLS_OID_X520_COMMON_NAME, 0, 0, buffer1, &size);
1027 if (xio->hostName && strcasecmp(xio->hostName, buffer1)!=0) {
1033 size=
sizeof(buffer1)-1;
1034 rv=gnutls_x509_crt_get_dn_by_oid(cert, GNUTLS_OID_X520_ORGANIZATION_NAME, 0, 0, buffer1, &size);
1038 size=
sizeof(buffer1)-1;
1039 rv=gnutls_x509_crt_get_dn_by_oid(cert, GNUTLS_OID_X520_ORGANIZATIONAL_UNIT_NAME, 0, 0, buffer1, &size);
1043 size=
sizeof(buffer1)-1;
1044 rv=gnutls_x509_crt_get_dn_by_oid(cert, GNUTLS_OID_X520_LOCALITY_NAME, 0, 0, buffer1, &size);
1048 size=
sizeof(buffer1)-1;
1049 rv=gnutls_x509_crt_get_dn_by_oid(cert, GNUTLS_OID_X520_STATE_OR_PROVINCE_NAME, 0, 0, buffer1, &size);
1053 size=
sizeof(buffer1)-1;
1054 rv=gnutls_x509_crt_get_dn_by_oid(cert, GNUTLS_OID_X520_COUNTRY_NAME, 0, 0, buffer1, &size);
1059 gnutls_x509_crt_deinit(cert);
1139 xio->peerCertDescr=certDescr;
1140 xio->peerCertFlags=errFlags;
1150 GWEN_SYNCIO_TLS *xio;
1166 #ifdef HAVE_GNUTLS_TRANSPORT_SET_ERRNO 1167 gnutls_transport_set_errno(xio->session, errno);
1172 #ifdef HAVE_GNUTLS_TRANSPORT_SET_ERRNO 1173 gnutls_transport_set_errno(xio->session, 0);
1187 GWEN_SYNCIO_TLS *xio;
1203 #ifdef HAVE_GNUTLS_TRANSPORT_SET_ERRNO 1204 gnutls_transport_set_errno(xio->session, errno);
1209 #ifdef HAVE_GNUTLS_TRANSPORT_SET_ERRNO 1210 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));
void GWEN_SslCertDescr_SetStateOrProvinceName(GWEN_SSLCERTDESCR *st, const char *d)
void GWEN_SyncIo_Tls_UndoPrepare(GWEN_SYNCIO *sio)
struct GWEN_TIME GWEN_TIME
int GWEN_Gui_ProgressLog(uint32_t id, GWEN_LOGGER_LEVEL level, const char *text)
struct GWEN_SSLCERTDESCR GWEN_SSLCERTDESCR
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
ssize_t GWEN_SyncIo_Tls_Push(gnutls_transport_ptr_t p, const void *buf, size_t len)
struct GWEN_STRINGLISTENTRYSTRUCT GWEN_STRINGLISTENTRY
int GWEN_SyncIo_Connect(GWEN_SYNCIO *sio)
#define GWEN_SSL_CERT_FLAGS_INVALID
void GWEN_DB_Dump(GWEN_DB_NODE *n, int insert)
void GWEN_SyncIo_SubFlags(GWEN_SYNCIO *sio, uint32_t fl)
#define GWEN_SYNCIO_TLS_FLAGS_ALLOW_V1_CA_CRT
struct GWEN_DB_NODE GWEN_DB_NODE
int GWEN_Buffer_AllocRoom(GWEN_BUFFER *bf, uint32_t size)
void GWEN_DB_Group_free(GWEN_DB_NODE *n)
uint32_t GWEN_Buffer_GetUsedBytes(const GWEN_BUFFER *bf)
GWENHYWFAR_API int GWEN_Directory_GetPrefixDirectory(char *buffer, unsigned int size)
void GWEN_SyncIo_Tls_SetLocalTrustFile(GWEN_SYNCIO *sio, const char *s)
int GWEN_SyncIo_Read(GWEN_SYNCIO *sio, uint8_t *buffer, uint32_t size)
void GWEN_Text_DumpString(const char *s, unsigned int l, unsigned int insert)
#define DBG_NOTICE(dbg_logger, format, args...)
void GWEN_SyncIo_Tls_SetDhParamFile(GWEN_SYNCIO *sio, const char *s)
const char * SYNCIO_TLS_SYSTEM_CERTFILES[]
GWEN_SYNCIO_WRITE_FN GWEN_SyncIo_SetWriteFn(GWEN_SYNCIO *sio, GWEN_SYNCIO_WRITE_FN fn)
const char * GWEN_SyncIo_Tls_GetRemoteHostName(const GWEN_SYNCIO *sio)
#define GWEN_FREE_OBJECT(varname)
void GWEN_SslCertDescr_SetOrganizationName(GWEN_SSLCERTDESCR *st, const char *d)
GWEN_SYNCIO_CONNECT_FN GWEN_SyncIo_SetConnectFn(GWEN_SYNCIO *sio, GWEN_SYNCIO_CONNECT_FN fn)
#define DBG_VERBOUS(dbg_logger, format, args...)
#define GWEN_SSL_CERT_FLAGS_EXPIRED
uint32_t GWEN_SyncIo_GetFlags(const GWEN_SYNCIO *sio)
const char * GWEN_SyncIo_Tls_GetDhParamFile(const GWEN_SYNCIO *sio)
void GWEN_SslCertDescr_SetPubKeyModulus(GWEN_SSLCERTDESCR *st, const char *d)
int GWEN_Buffer_AdjustUsedBytes(GWEN_BUFFER *bf)
const char * GWEN_SyncIo_Tls_GetLocalKeyFile(const GWEN_SYNCIO *sio)
#define DBG_WARN(dbg_logger, format, args...)
int GWEN_SyncIo_Tls_Internal_CheckCert(GWEN_SYNCIO *sio, const GWEN_SSLCERTDESCR *cert)
void GWEN_SyncIo_SetStatus(GWEN_SYNCIO *sio, GWEN_SYNCIO_STATUS st)
#define GWEN_SYNCIO_TLS_FLAGS_SECURE
const char * GWEN_SyncIo_Tls_GetLocalCertFile(const GWEN_SYNCIO *sio)
GWENHYWFAR_API int GWEN_Directory_GetMatchingFilesRecursively(const char *folder, GWEN_STRINGLIST *sl, const char *mask)
GWEN_BUFFER * GWEN_Buffer_new(char *buffer, uint32_t size, uint32_t used, int take)
GWEN_SYNCIO * GWEN_SyncIo_GetBaseIo(const GWEN_SYNCIO *sio)
void GWENHYWFAR_CB GWEN_SyncIo_Tls_FreeData(void *bp, void *p)
char * GWEN_Buffer_GetPosPointer(const GWEN_BUFFER *bf)
GWEN_STRINGLISTENTRY * GWEN_StringList_FirstEntry(const GWEN_STRINGLIST *sl)
void GWEN_Buffer_Reset(GWEN_BUFFER *bf)
const char * GWEN_StringListEntry_Data(const GWEN_STRINGLISTENTRY *se)
int GWEN_Buffer_IncrementPos(GWEN_BUFFER *bf, uint32_t i)
#define GWEN_SSL_CERT_FLAGS_OK
#define GWEN_ERROR_NOT_CONNECTED
void GWEN_StringList_free(GWEN_STRINGLIST *sl)
void GWEN_SslCertDescr_SetLocalityName(GWEN_SSLCERTDESCR *st, const char *d)
#define GWEN_SSL_CERT_FLAGS_SYSTEM
#define GWEN_SYNCIO_TLS_FLAGS_NEED_PEER_CERT
#define GWEN_NEW_OBJECT(typ, varname)
void GWEN_SslCertDescr_SetFingerPrintSha512(GWEN_SSLCERTDESCR *st, const char *d)
void GWEN_SslCertDescr_SetIsError(GWEN_SSLCERTDESCR *st, int d)
struct GWEN_SYNCIO GWEN_SYNCIO
void GWEN_SslCertDescr_SetPubKeyExponent(GWEN_SSLCERTDESCR *st, const char *d)
GWEN_SYNCIO * GWEN_SyncIo_Tls_new(GWEN_SYNCIO *baseIo)
int GWEN_StringList_AppendString(GWEN_STRINGLIST *sl, const char *s, int take, int checkDouble)
int GWEN_SyncIo_Tls_Prepare(GWEN_SYNCIO *sio)
int GWEN_Gui_ProgressLog2(uint32_t id, GWEN_LOGGER_LEVEL level, const char *fmt,...)
int GWEN_SyncIo_Tls_CheckCert(GWEN_SYNCIO *sio, const GWEN_SSLCERTDESCR *cert)
#define GWEN_ERROR_SSL_PREMATURE_CLOSE
void GWEN_SslCertDescr_SetCountryName(GWEN_SSLCERTDESCR *st, const char *d)
GWENHYWFAR_API int GWEN_Directory_FindFileInPaths(const GWEN_STRINGLIST *paths, const char *filePath, GWEN_BUFFER *fbuf)
#define GWEN_PATH_FLAGS_VARIABLE
GWEN_SSLCERTDESCR * GWEN_SyncIo_Tls_GetPeerCertDescr(const GWEN_SYNCIO *sio)
#define GWEN_SYNCIO_TLS_FLAGS_IGN_PREMATURE_CLOSE
#define GWEN_ERROR_SSL_SECURITY
struct GWEN_STRINGLISTSTRUCT GWEN_STRINGLIST
#define GWEN_ERROR_GENERIC
void GWEN_SyncIo_Tls_SetRemoteHostName(GWEN_SYNCIO *sio, const char *s)
#define GWEN_SYNCIO_FLAGS_PASSIVE
#define GWEN_SYNCIO_TLS_FLAGS_REQUEST_CERT
void GWEN_SyncIo_Tls_SetLocalKeyFile(GWEN_SYNCIO *sio, const char *s)
void GWEN_SslCertDescr_SetOrganizationalUnitName(GWEN_SSLCERTDESCR *st, const char *d)
GWEN_SYNCIO_STATUS GWEN_SyncIo_GetStatus(const GWEN_SYNCIO *sio)
int GWENHYWFAR_CB GWEN_SyncIo_Tls_Read(GWEN_SYNCIO *sio, uint8_t *buffer, uint32_t size)
int GWEN_SyncIo_Tls_GetPeerCert(GWEN_SYNCIO *sio)
ssize_t GWEN_SyncIo_Tls_Pull(gnutls_transport_ptr_t p, void *buf, size_t len)
void GWEN_Buffer_free(GWEN_BUFFER *bf)
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
GWENHYWFAR_API void GWEN_Time_free(GWEN_TIME *t)
int GWENHYWFAR_CB GWEN_SyncIo_Tls_Disconnect(GWEN_SYNCIO *sio)
void GWEN_SyncIo_AddFlags(GWEN_SYNCIO *sio, uint32_t fl)
#define GWEN_SYNCIO_TLS_FLAGS_ADD_TRUSTED_CAS
#define GWEN_SSL_CERT_FLAGS_SIGNER_NOT_FOUND
int GWENHYWFAR_CB(* GWEN_SIO_TLS_CHECKCERT_FN)(GWEN_SYNCIO *sio, const GWEN_SSLCERTDESCR *cert)
#define GWEN_SSL_CERT_FLAGS_BAD_HOSTNAME
#define DBG_ERROR(dbg_logger, format, args...)
void GWEN_SyncIo_Tls_SetLocalCertFile(GWEN_SYNCIO *sio, const char *s)
#define GWEN_SSL_CERT_FLAGS_REVOKED
#define GWEN_SYNCIO_TLS_TYPE
int GWEN_SslCertDescr_toDb(const GWEN_SSLCERTDESCR *st, GWEN_DB_NODE *db)
int GWEN_SyncIo_Disconnect(GWEN_SYNCIO *sio)
void GWEN_SslCertDescr_SetNotAfter(GWEN_SSLCERTDESCR *st, const GWEN_TIME *d)
GWEN_SYNCIO * GWEN_SyncIo_new(const char *typeName, GWEN_SYNCIO *baseIo)
GWEN_STRINGLISTENTRY * GWEN_StringListEntry_Next(const GWEN_STRINGLISTENTRY *se)
void GWEN_SyncIo_Tls_ShowCipherInfo(GWEN_SYNCIO *sio)
GWEN_SYNCIO_DISCONNECT_FN GWEN_SyncIo_SetDisconnectFn(GWEN_SYNCIO *sio, GWEN_SYNCIO_DISCONNECT_FN fn)
#define DBG_INFO(dbg_logger, format, args...)
GWEN_SIO_TLS_CHECKCERT_FN GWEN_SyncIo_Tls_SetCheckCertFn(GWEN_SYNCIO *sio, GWEN_SIO_TLS_CHECKCERT_FN f)
GWENHYWFAR_API int GWEN_Directory_GetPath(const char *path, unsigned int flags)
void GWEN_SslCertDescr_SetStatusText(GWEN_SSLCERTDESCR *st, const char *d)
int GWEN_SyncIo_Write(GWEN_SYNCIO *sio, const uint8_t *buffer, uint32_t size)
GWEN_DB_NODE * GWEN_DB_Group_new(const char *name)
int GWENHYWFAR_CB GWEN_SyncIo_Tls_Write(GWEN_SYNCIO *sio, const uint8_t *buffer, uint32_t size)
void GWEN_SslCertDescr_SetNotBefore(GWEN_SSLCERTDESCR *st, const GWEN_TIME *d)
#define GWEN_INHERIT(bt, t)
GWEN_SYNCIO_READ_FN GWEN_SyncIo_SetReadFn(GWEN_SYNCIO *sio, GWEN_SYNCIO_READ_FN fn)
#define GWEN_ERROR_NO_DATA
GWENHYWFAR_API GWEN_TIME * GWEN_Time_fromSeconds(uint32_t s)
#define GWEN_INHERIT_SETDATA(bt, t, element, data, fn)
int GWENHYWFAR_CB GWEN_SyncIo_Tls_Connect(GWEN_SYNCIO *sio)
int GWEN_Gui_CheckCert(const GWEN_SSLCERTDESCR *cd, GWEN_SYNCIO *sio, uint32_t guiid)
GWEN_STRINGLIST * GWEN_StringList_new(void)
void GWEN_SslCertDescr_SetFingerPrint(GWEN_SSLCERTDESCR *st, const char *d)
#define GWEN_PATH_FLAGS_NAMEMUSTEXIST
void GWEN_SslCertDescr_free(GWEN_SSLCERTDESCR *st)
int GWEN_Text_ToHexBuffer(const char *src, unsigned l, GWEN_BUFFER *buf, unsigned int groupsize, char delimiter, int skipLeadingZeroes)
GWEN_SSLCERTDESCR * GWEN_SslCertDescr_new(void)
#define GWEN_SSL_CERT_FLAGS_BAD_DATA
int GWEN_Buffer_AppendString(GWEN_BUFFER *bf, const char *buffer)
int GWEN_SyncIo_Tls__readFile(const char *fname, GWEN_BUFFER *buf)
#define GWEN_INHERIT_GETDATA(bt, t, element)
void GWEN_SslCertDescr_SetCommonName(GWEN_SSLCERTDESCR *st, const char *d)
#define GWEN_SSL_CERT_FLAGS_NOT_ACTIVE
const char * GWEN_SyncIo_Tls_GetLocalTrustFile(const GWEN_SYNCIO *sio)
void GWEN_SslCertDescr_SetFingerPrintSha1(GWEN_SSLCERTDESCR *st, const char *d)
void GWEN_SslCertDescr_SetStatusFlags(GWEN_SSLCERTDESCR *st, uint32_t d)