diff options
Diffstat (limited to 'doc/gnutls.info-3')
-rw-r--r-- | doc/gnutls.info-3 | 14926 |
1 files changed, 14926 insertions, 0 deletions
diff --git a/doc/gnutls.info-3 b/doc/gnutls.info-3 new file mode 100644 index 0000000..ecd772c --- /dev/null +++ b/doc/gnutls.info-3 @@ -0,0 +1,14926 @@ +This is gnutls.info, produced by makeinfo version 6.8 from gnutls.texi. + +This manual is last updated 9 February 2023 for version 3.7.9 of GnuTLS. + +Copyright (C) 2001-2023 Free Software Foundation, Inc.\\ Copyright (C) +2001-2023 Nikos Mavrogiannopoulos + + Permission is granted to copy, distribute and/or modify this + document under the terms of the GNU Free Documentation License, + Version 1.3 or any later version published by the Free Software + Foundation; with no Invariant Sections, no Front-Cover Texts, and + no Back-Cover Texts. A copy of the license is included in the + section entitled "GNU Free Documentation License". +INFO-DIR-SECTION Software libraries +START-INFO-DIR-ENTRY +* GnuTLS: (gnutls). GNU Transport Layer Security Library. +END-INFO-DIR-ENTRY + +INFO-DIR-SECTION System Administration +START-INFO-DIR-ENTRY +* certtool: (gnutls)certtool Invocation. Manipulate certificates and keys. +* gnutls-serv: (gnutls)gnutls-serv Invocation. GnuTLS test server. +* gnutls-cli: (gnutls)gnutls-cli Invocation. GnuTLS test client. +* gnutls-cli-debug: (gnutls)gnutls-cli-debug Invocation. GnuTLS debug client. +* psktool: (gnutls)psktool Invocation. Simple TLS-Pre-Shared-Keys manager. +* srptool: (gnutls)srptool Invocation. Simple SRP password tool. +END-INFO-DIR-ENTRY + + +File: gnutls.info, Node: Echo server with SRP authentication, Next: Echo server with anonymous authentication, Prev: Echo server with PSK authentication, Up: More advanced client and servers + +7.3.10 Echo server with SRP authentication +------------------------------------------ + +This is a server which supports SRP authentication. It is also possible +to combine this functionality with a certificate server. Here it is +separate for simplicity. + +/* This example code is placed in the public domain. */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <stdio.h> +#include <stdlib.h> +#include <errno.h> +#include <sys/types.h> +#include <sys/socket.h> +#include <arpa/inet.h> +#include <netinet/in.h> +#include <string.h> +#include <unistd.h> +#include <gnutls/gnutls.h> + +#define SRP_PASSWD "tpasswd" +#define SRP_PASSWD_CONF "tpasswd.conf" + +#define KEYFILE "key.pem" +#define CERTFILE "cert.pem" +#define CAFILE "/etc/ssl/certs/ca-certificates.crt" + +#define LOOP_CHECK(rval, cmd) \ + do { \ + rval = cmd; \ + } while(rval == GNUTLS_E_AGAIN || rval == GNUTLS_E_INTERRUPTED) + +/* This is a sample TLS-SRP echo server. + */ + +#define SOCKET_ERR(err,s) if(err==-1) {perror(s);return(1);} +#define MAX_BUF 1024 +#define PORT 5556 /* listen to 5556 port */ + +int main(void) +{ + int err, listen_sd; + int sd, ret; + struct sockaddr_in sa_serv; + struct sockaddr_in sa_cli; + socklen_t client_len; + char topbuf[512]; + gnutls_session_t session; + gnutls_srp_server_credentials_t srp_cred; + gnutls_certificate_credentials_t cert_cred; + char buffer[MAX_BUF + 1]; + int optval = 1; + char name[256]; + + strcpy(name, "Echo Server"); + + if (gnutls_check_version("3.1.4") == NULL) { + fprintf(stderr, "GnuTLS 3.1.4 or later is required for this example\n"); + exit(1); + } + + /* for backwards compatibility with gnutls < 3.3.0 */ + gnutls_global_init(); + + /* SRP_PASSWD a password file (created with the included srptool utility) + */ + gnutls_srp_allocate_server_credentials(&srp_cred); + gnutls_srp_set_server_credentials_file(srp_cred, SRP_PASSWD, + SRP_PASSWD_CONF); + + gnutls_certificate_allocate_credentials(&cert_cred); + gnutls_certificate_set_x509_trust_file(cert_cred, CAFILE, + GNUTLS_X509_FMT_PEM); + gnutls_certificate_set_x509_key_file(cert_cred, CERTFILE, KEYFILE, + GNUTLS_X509_FMT_PEM); + + /* TCP socket operations + */ + listen_sd = socket(AF_INET, SOCK_STREAM, 0); + SOCKET_ERR(listen_sd, "socket"); + + memset(&sa_serv, '\0', sizeof(sa_serv)); + sa_serv.sin_family = AF_INET; + sa_serv.sin_addr.s_addr = INADDR_ANY; + sa_serv.sin_port = htons(PORT); /* Server Port number */ + + setsockopt(listen_sd, SOL_SOCKET, SO_REUSEADDR, (void *) &optval, + sizeof(int)); + + err = + bind(listen_sd, (struct sockaddr *) &sa_serv, sizeof(sa_serv)); + SOCKET_ERR(err, "bind"); + err = listen(listen_sd, 1024); + SOCKET_ERR(err, "listen"); + + printf("%s ready. Listening to port '%d'.\n\n", name, PORT); + + client_len = sizeof(sa_cli); + for (;;) { + gnutls_init(&session, GNUTLS_SERVER); + gnutls_priority_set_direct(session, + "NORMAL" + ":-KX-ALL:+SRP:+SRP-DSS:+SRP-RSA", + NULL); + gnutls_credentials_set(session, GNUTLS_CRD_SRP, srp_cred); + /* for the certificate authenticated ciphersuites. + */ + gnutls_credentials_set(session, GNUTLS_CRD_CERTIFICATE, + cert_cred); + + /* We don't request any certificate from the client. + * If we did we would need to verify it. One way of + * doing that is shown in the "Verifying a certificate" + * example. + */ + gnutls_certificate_server_set_request(session, + GNUTLS_CERT_IGNORE); + + sd = accept(listen_sd, (struct sockaddr *) &sa_cli, + &client_len); + + printf("- connection from %s, port %d\n", + inet_ntop(AF_INET, &sa_cli.sin_addr, topbuf, + sizeof(topbuf)), ntohs(sa_cli.sin_port)); + + gnutls_transport_set_int(session, sd); + + LOOP_CHECK(ret, gnutls_handshake(session)); + if (ret < 0) { + close(sd); + gnutls_deinit(session); + fprintf(stderr, + "*** Handshake has failed (%s)\n\n", + gnutls_strerror(ret)); + continue; + } + printf("- Handshake was completed\n"); + printf("- User %s was connected\n", + gnutls_srp_server_get_username(session)); + + /* print_info(session); */ + + for (;;) { + LOOP_CHECK(ret, gnutls_record_recv(session, buffer, MAX_BUF)); + + if (ret == 0) { + printf + ("\n- Peer has closed the GnuTLS connection\n"); + break; + } else if (ret < 0 + && gnutls_error_is_fatal(ret) == 0) { + fprintf(stderr, "*** Warning: %s\n", + gnutls_strerror(ret)); + } else if (ret < 0) { + fprintf(stderr, "\n*** Received corrupted " + "data(%d). Closing the connection.\n\n", + ret); + break; + } else if (ret > 0) { + /* echo data back to the client + */ + gnutls_record_send(session, buffer, ret); + } + } + printf("\n"); + /* do not wait for the peer to close the connection. */ + LOOP_CHECK(ret, gnutls_bye(session, GNUTLS_SHUT_WR)); + + close(sd); + gnutls_deinit(session); + + } + close(listen_sd); + + gnutls_srp_free_server_credentials(srp_cred); + gnutls_certificate_free_credentials(cert_cred); + + gnutls_global_deinit(); + + return 0; + +} + + +File: gnutls.info, Node: Echo server with anonymous authentication, Next: Helper functions for TCP connections, Prev: Echo server with SRP authentication, Up: More advanced client and servers + +7.3.11 Echo server with anonymous authentication +------------------------------------------------ + +This example server supports anonymous authentication, and could be used +to serve the example client for anonymous authentication. + +/* This example code is placed in the public domain. */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <stdio.h> +#include <stdlib.h> +#include <errno.h> +#include <sys/types.h> +#include <sys/socket.h> +#include <arpa/inet.h> +#include <netinet/in.h> +#include <string.h> +#include <unistd.h> +#include <gnutls/gnutls.h> + +/* This is a sample TLS 1.0 echo server, for anonymous authentication only. + */ + + +#define SOCKET_ERR(err,s) if(err==-1) {perror(s);return(1);} +#define MAX_BUF 1024 +#define PORT 5556 /* listen to 5556 port */ + +int main(void) +{ + int err, listen_sd; + int sd, ret; + struct sockaddr_in sa_serv; + struct sockaddr_in sa_cli; + socklen_t client_len; + char topbuf[512]; + gnutls_session_t session; + gnutls_anon_server_credentials_t anoncred; + char buffer[MAX_BUF + 1]; + int optval = 1; + + if (gnutls_check_version("3.1.4") == NULL) { + fprintf(stderr, "GnuTLS 3.1.4 or later is required for this example\n"); + exit(1); + } + + /* for backwards compatibility with gnutls < 3.3.0 */ + gnutls_global_init(); + + gnutls_anon_allocate_server_credentials(&anoncred); + + gnutls_anon_set_server_known_dh_params(anoncred, GNUTLS_SEC_PARAM_MEDIUM); + + /* Socket operations + */ + listen_sd = socket(AF_INET, SOCK_STREAM, 0); + SOCKET_ERR(listen_sd, "socket"); + + memset(&sa_serv, '\0', sizeof(sa_serv)); + sa_serv.sin_family = AF_INET; + sa_serv.sin_addr.s_addr = INADDR_ANY; + sa_serv.sin_port = htons(PORT); /* Server Port number */ + + setsockopt(listen_sd, SOL_SOCKET, SO_REUSEADDR, (void *) &optval, + sizeof(int)); + + err = + bind(listen_sd, (struct sockaddr *) &sa_serv, sizeof(sa_serv)); + SOCKET_ERR(err, "bind"); + err = listen(listen_sd, 1024); + SOCKET_ERR(err, "listen"); + + printf("Server ready. Listening to port '%d'.\n\n", PORT); + + client_len = sizeof(sa_cli); + for (;;) { + gnutls_init(&session, GNUTLS_SERVER); + gnutls_priority_set_direct(session, + "NORMAL:+ANON-ECDH:+ANON-DH", + NULL); + gnutls_credentials_set(session, GNUTLS_CRD_ANON, anoncred); + + sd = accept(listen_sd, (struct sockaddr *) &sa_cli, + &client_len); + + printf("- connection from %s, port %d\n", + inet_ntop(AF_INET, &sa_cli.sin_addr, topbuf, + sizeof(topbuf)), ntohs(sa_cli.sin_port)); + + gnutls_transport_set_int(session, sd); + + do { + ret = gnutls_handshake(session); + } + while (ret < 0 && gnutls_error_is_fatal(ret) == 0); + + if (ret < 0) { + close(sd); + gnutls_deinit(session); + fprintf(stderr, + "*** Handshake has failed (%s)\n\n", + gnutls_strerror(ret)); + continue; + } + printf("- Handshake was completed\n"); + + /* see the Getting peer's information example */ + /* print_info(session); */ + + for (;;) { + ret = gnutls_record_recv(session, buffer, MAX_BUF); + + if (ret == 0) { + printf + ("\n- Peer has closed the GnuTLS connection\n"); + break; + } else if (ret < 0 + && gnutls_error_is_fatal(ret) == 0) { + fprintf(stderr, "*** Warning: %s\n", + gnutls_strerror(ret)); + } else if (ret < 0) { + fprintf(stderr, "\n*** Received corrupted " + "data(%d). Closing the connection.\n\n", + ret); + break; + } else if (ret > 0) { + /* echo data back to the client + */ + gnutls_record_send(session, buffer, ret); + } + } + printf("\n"); + /* do not wait for the peer to close the connection. + */ + gnutls_bye(session, GNUTLS_SHUT_WR); + + close(sd); + gnutls_deinit(session); + + } + close(listen_sd); + + gnutls_anon_free_server_credentials(anoncred); + + gnutls_global_deinit(); + + return 0; + +} + + +File: gnutls.info, Node: Helper functions for TCP connections, Next: Helper functions for UDP connections, Prev: Echo server with anonymous authentication, Up: More advanced client and servers + +7.3.12 Helper functions for TCP connections +------------------------------------------- + +Those helper function abstract away TCP connection handling from the +other examples. It is required to build some examples. + +/* This example code is placed in the public domain. */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <sys/types.h> +#include <sys/socket.h> +#include <arpa/inet.h> +#include <netinet/in.h> +#include <unistd.h> + +/* tcp.c */ +int tcp_connect(void); +void tcp_close(int sd); + +/* Connects to the peer and returns a socket + * descriptor. + */ +extern int tcp_connect(void) +{ + const char *PORT = "5556"; + const char *SERVER = "127.0.0.1"; + int err, sd; + struct sockaddr_in sa; + + /* connects to server + */ + sd = socket(AF_INET, SOCK_STREAM, 0); + + memset(&sa, '\0', sizeof(sa)); + sa.sin_family = AF_INET; + sa.sin_port = htons(atoi(PORT)); + inet_pton(AF_INET, SERVER, &sa.sin_addr); + + err = connect(sd, (struct sockaddr *) &sa, sizeof(sa)); + if (err < 0) { + fprintf(stderr, "Connect error\n"); + exit(1); + } + + return sd; +} + +/* closes the given socket descriptor. + */ +extern void tcp_close(int sd) +{ + shutdown(sd, SHUT_RDWR); /* no more receptions */ + close(sd); +} + + +File: gnutls.info, Node: Helper functions for UDP connections, Prev: Helper functions for TCP connections, Up: More advanced client and servers + +7.3.13 Helper functions for UDP connections +------------------------------------------- + +The UDP helper functions abstract away UDP connection handling from the +other examples. It is required to build the examples using UDP. + +/* This example code is placed in the public domain. */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <sys/types.h> +#include <sys/socket.h> +#include <arpa/inet.h> +#include <netinet/in.h> +#include <unistd.h> + +/* udp.c */ +int udp_connect(void); +void udp_close(int sd); + +/* Connects to the peer and returns a socket + * descriptor. + */ +extern int udp_connect(void) +{ + const char *PORT = "5557"; + const char *SERVER = "127.0.0.1"; + int err, sd; +#if defined(IP_DONTFRAG) || defined(IP_MTU_DISCOVER) + int optval; +#endif + struct sockaddr_in sa; + + /* connects to server + */ + sd = socket(AF_INET, SOCK_DGRAM, 0); + + memset(&sa, '\0', sizeof(sa)); + sa.sin_family = AF_INET; + sa.sin_port = htons(atoi(PORT)); + inet_pton(AF_INET, SERVER, &sa.sin_addr); + +#if defined(IP_DONTFRAG) + optval = 1; + setsockopt(sd, IPPROTO_IP, IP_DONTFRAG, + (const void *) &optval, sizeof(optval)); +#elif defined(IP_MTU_DISCOVER) + optval = IP_PMTUDISC_DO; + setsockopt(sd, IPPROTO_IP, IP_MTU_DISCOVER, + (const void *) &optval, sizeof(optval)); +#endif + + err = connect(sd, (struct sockaddr *) &sa, sizeof(sa)); + if (err < 0) { + fprintf(stderr, "Connect error\n"); + exit(1); + } + + return sd; +} + +/* closes the given socket descriptor. + */ +extern void udp_close(int sd) +{ + close(sd); +} + + +File: gnutls.info, Node: OCSP example, Next: Miscellaneous examples, Prev: More advanced client and servers, Up: GnuTLS application examples + +7.4 OCSP example +================ + +Generate OCSP request +--------------------- + +A small tool to generate OCSP requests. + +/* This example code is placed in the public domain. */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <gnutls/gnutls.h> +#include <gnutls/crypto.h> +#include <gnutls/ocsp.h> +#ifndef NO_LIBCURL +#include <curl/curl.h> +#endif +#include "read-file.h" + +size_t get_data(void *buffer, size_t size, size_t nmemb, void *userp); +static gnutls_x509_crt_t load_cert(const char *cert_file); +static void _response_info(const gnutls_datum_t * data); +static void +_generate_request(gnutls_datum_t * rdata, gnutls_x509_crt_t cert, + gnutls_x509_crt_t issuer, gnutls_datum_t *nonce); +static int +_verify_response(gnutls_datum_t * data, gnutls_x509_crt_t cert, + gnutls_x509_crt_t signer, gnutls_datum_t *nonce); + +/* This program queries an OCSP server. + It expects three files. argv[1] containing the certificate to + be checked, argv[2] holding the issuer for this certificate, + and argv[3] holding a trusted certificate to verify OCSP's response. + argv[4] is optional and should hold the server host name. + + For simplicity the libcurl library is used. + */ + +int main(int argc, char *argv[]) +{ + gnutls_datum_t ud, tmp; + int ret; + gnutls_datum_t req; + gnutls_x509_crt_t cert, issuer, signer; +#ifndef NO_LIBCURL + CURL *handle; + struct curl_slist *headers = NULL; +#endif + int v, seq; + const char *cert_file = argv[1]; + const char *issuer_file = argv[2]; + const char *signer_file = argv[3]; + char *hostname = NULL; + unsigned char noncebuf[23]; + gnutls_datum_t nonce = { noncebuf, sizeof(noncebuf) }; + + gnutls_global_init(); + + if (argc > 4) + hostname = argv[4]; + + ret = gnutls_rnd(GNUTLS_RND_NONCE, nonce.data, nonce.size); + if (ret < 0) + exit(1); + + cert = load_cert(cert_file); + issuer = load_cert(issuer_file); + signer = load_cert(signer_file); + + if (hostname == NULL) { + + for (seq = 0;; seq++) { + ret = + gnutls_x509_crt_get_authority_info_access(cert, + seq, + GNUTLS_IA_OCSP_URI, + &tmp, + NULL); + if (ret == GNUTLS_E_UNKNOWN_ALGORITHM) + continue; + if (ret == GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE) { + fprintf(stderr, + "No URI was found in the certificate.\n"); + exit(1); + } + if (ret < 0) { + fprintf(stderr, "error: %s\n", + gnutls_strerror(ret)); + exit(1); + } + + printf("CA issuers URI: %.*s\n", tmp.size, + tmp.data); + + hostname = malloc(tmp.size + 1); + if (!hostname) { + fprintf(stderr, "error: cannot allocate memory\n"); + exit(1); + } + memcpy(hostname, tmp.data, tmp.size); + hostname[tmp.size] = 0; + + gnutls_free(tmp.data); + break; + } + + } + + /* Note that the OCSP servers hostname might be available + * using gnutls_x509_crt_get_authority_info_access() in the issuer's + * certificate */ + + memset(&ud, 0, sizeof(ud)); + fprintf(stderr, "Connecting to %s\n", hostname); + + _generate_request(&req, cert, issuer, &nonce); + +#ifndef NO_LIBCURL + curl_global_init(CURL_GLOBAL_ALL); + + handle = curl_easy_init(); + if (handle == NULL) + exit(1); + + headers = + curl_slist_append(headers, + "Content-Type: application/ocsp-request"); + + curl_easy_setopt(handle, CURLOPT_HTTPHEADER, headers); + curl_easy_setopt(handle, CURLOPT_POSTFIELDS, (void *) req.data); + curl_easy_setopt(handle, CURLOPT_POSTFIELDSIZE, req.size); + curl_easy_setopt(handle, CURLOPT_URL, hostname); + curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, get_data); + curl_easy_setopt(handle, CURLOPT_WRITEDATA, &ud); + + ret = curl_easy_perform(handle); + if (ret != 0) { + fprintf(stderr, "curl[%d] error %d\n", __LINE__, ret); + exit(1); + } + + curl_easy_cleanup(handle); +#endif + + _response_info(&ud); + + v = _verify_response(&ud, cert, signer, &nonce); + + gnutls_x509_crt_deinit(cert); + gnutls_x509_crt_deinit(issuer); + gnutls_x509_crt_deinit(signer); + gnutls_global_deinit(); + + return v; +} + +static void _response_info(const gnutls_datum_t * data) +{ + gnutls_ocsp_resp_t resp; + int ret; + gnutls_datum buf; + + ret = gnutls_ocsp_resp_init(&resp); + if (ret < 0) + exit(1); + + ret = gnutls_ocsp_resp_import(resp, data); + if (ret < 0) + exit(1); + + ret = gnutls_ocsp_resp_print(resp, GNUTLS_OCSP_PRINT_FULL, &buf); + if (ret != 0) + exit(1); + + printf("%.*s", buf.size, buf.data); + gnutls_free(buf.data); + + gnutls_ocsp_resp_deinit(resp); +} + +static gnutls_x509_crt_t load_cert(const char *cert_file) +{ + gnutls_x509_crt_t crt; + int ret; + gnutls_datum_t data; + size_t size; + + ret = gnutls_x509_crt_init(&crt); + if (ret < 0) + exit(1); + + data.data = (void *) read_file(cert_file, RF_BINARY, &size); + data.size = size; + + if (!data.data) { + fprintf(stderr, "Cannot open file: %s\n", cert_file); + exit(1); + } + + ret = gnutls_x509_crt_import(crt, &data, GNUTLS_X509_FMT_PEM); + free(data.data); + if (ret < 0) { + fprintf(stderr, "Cannot import certificate in %s: %s\n", + cert_file, gnutls_strerror(ret)); + exit(1); + } + + return crt; +} + +static void +_generate_request(gnutls_datum_t * rdata, gnutls_x509_crt_t cert, + gnutls_x509_crt_t issuer, gnutls_datum_t *nonce) +{ + gnutls_ocsp_req_t req; + int ret; + + ret = gnutls_ocsp_req_init(&req); + if (ret < 0) + exit(1); + + ret = gnutls_ocsp_req_add_cert(req, GNUTLS_DIG_SHA1, issuer, cert); + if (ret < 0) + exit(1); + + + ret = gnutls_ocsp_req_set_nonce(req, 0, nonce); + if (ret < 0) + exit(1); + + ret = gnutls_ocsp_req_export(req, rdata); + if (ret != 0) + exit(1); + + gnutls_ocsp_req_deinit(req); + + return; +} + +static int +_verify_response(gnutls_datum_t * data, gnutls_x509_crt_t cert, + gnutls_x509_crt_t signer, gnutls_datum_t *nonce) +{ + gnutls_ocsp_resp_t resp; + int ret; + unsigned verify; + gnutls_datum_t rnonce; + + ret = gnutls_ocsp_resp_init(&resp); + if (ret < 0) + exit(1); + + ret = gnutls_ocsp_resp_import(resp, data); + if (ret < 0) + exit(1); + + ret = gnutls_ocsp_resp_check_crt(resp, 0, cert); + if (ret < 0) + exit(1); + + ret = gnutls_ocsp_resp_get_nonce(resp, NULL, &rnonce); + if (ret < 0) + exit(1); + + if (rnonce.size != nonce->size || memcmp(nonce->data, rnonce.data, + nonce->size) != 0) { + exit(1); + } + + ret = gnutls_ocsp_resp_verify_direct(resp, signer, &verify, 0); + if (ret < 0) + exit(1); + + printf("Verifying OCSP Response: "); + if (verify == 0) + printf("Verification success!\n"); + else + printf("Verification error!\n"); + + if (verify & GNUTLS_OCSP_VERIFY_SIGNER_NOT_FOUND) + printf("Signer cert not found\n"); + + if (verify & GNUTLS_OCSP_VERIFY_SIGNER_KEYUSAGE_ERROR) + printf("Signer cert keyusage error\n"); + + if (verify & GNUTLS_OCSP_VERIFY_UNTRUSTED_SIGNER) + printf("Signer cert is not trusted\n"); + + if (verify & GNUTLS_OCSP_VERIFY_INSECURE_ALGORITHM) + printf("Insecure algorithm\n"); + + if (verify & GNUTLS_OCSP_VERIFY_SIGNATURE_FAILURE) + printf("Signature failure\n"); + + if (verify & GNUTLS_OCSP_VERIFY_CERT_NOT_ACTIVATED) + printf("Signer cert not yet activated\n"); + + if (verify & GNUTLS_OCSP_VERIFY_CERT_EXPIRED) + printf("Signer cert expired\n"); + + gnutls_free(rnonce.data); + gnutls_ocsp_resp_deinit(resp); + + return verify; +} + +size_t get_data(void *buffer, size_t size, size_t nmemb, void *userp) +{ + gnutls_datum_t *ud = userp; + + size *= nmemb; + + ud->data = realloc(ud->data, size + ud->size); + if (ud->data == NULL) { + fprintf(stderr, "Not enough memory for the request\n"); + exit(1); + } + + memcpy(&ud->data[ud->size], buffer, size); + ud->size += size; + + return size; +} + + +File: gnutls.info, Node: Miscellaneous examples, Prev: OCSP example, Up: GnuTLS application examples + +7.5 Miscellaneous examples +========================== + +* Menu: + +* Checking for an alert:: +* X.509 certificate parsing example:: +* Listing the ciphersuites in a priority string:: +* PKCS12 structure generation example:: + + +File: gnutls.info, Node: Checking for an alert, Next: X.509 certificate parsing example, Up: Miscellaneous examples + +7.5.1 Checking for an alert +--------------------------- + +This is a function that checks if an alert has been received in the +current session. + +/* This example code is placed in the public domain. */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <stdio.h> +#include <stdlib.h> +#include <gnutls/gnutls.h> + +#include "examples.h" + +/* This function will check whether the given return code from + * a gnutls function (recv/send), is an alert, and will print + * that alert. + */ +void check_alert(gnutls_session_t session, int ret) +{ + int last_alert; + + if (ret == GNUTLS_E_WARNING_ALERT_RECEIVED + || ret == GNUTLS_E_FATAL_ALERT_RECEIVED) { + last_alert = gnutls_alert_get(session); + + /* The check for renegotiation is only useful if we are + * a server, and we had requested a rehandshake. + */ + if (last_alert == GNUTLS_A_NO_RENEGOTIATION && + ret == GNUTLS_E_WARNING_ALERT_RECEIVED) + printf("* Received NO_RENEGOTIATION alert. " + "Client Does not support renegotiation.\n"); + else + printf("* Received alert '%d': %s.\n", last_alert, + gnutls_alert_get_name(last_alert)); + } +} + + +File: gnutls.info, Node: X.509 certificate parsing example, Next: Listing the ciphersuites in a priority string, Prev: Checking for an alert, Up: Miscellaneous examples + +7.5.2 X.509 certificate parsing example +--------------------------------------- + +To demonstrate the X.509 parsing capabilities an example program is +listed below. That program reads the peer's certificate, and prints +information about it. + +/* This example code is placed in the public domain. */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <stdio.h> +#include <stdlib.h> +#include <gnutls/gnutls.h> +#include <gnutls/x509.h> + +#include "examples.h" + +static const char *bin2hex(const void *bin, size_t bin_size) +{ + static char printable[110]; + const unsigned char *_bin = bin; + char *print; + size_t i; + + if (bin_size > 50) + bin_size = 50; + + print = printable; + for (i = 0; i < bin_size; i++) { + sprintf(print, "%.2x ", _bin[i]); + print += 2; + } + + return printable; +} + +/* This function will print information about this session's peer + * certificate. + */ +void print_x509_certificate_info(gnutls_session_t session) +{ + char serial[40]; + char dn[256]; + size_t size; + unsigned int algo, bits; + time_t expiration_time, activation_time; + const gnutls_datum_t *cert_list; + unsigned int cert_list_size = 0; + gnutls_x509_crt_t cert; + gnutls_datum_t cinfo; + + /* This function only works for X.509 certificates. + */ + if (gnutls_certificate_type_get(session) != GNUTLS_CRT_X509) + return; + + cert_list = gnutls_certificate_get_peers(session, &cert_list_size); + + printf("Peer provided %d certificates.\n", cert_list_size); + + if (cert_list_size > 0) { + int ret; + + /* we only print information about the first certificate. + */ + gnutls_x509_crt_init(&cert); + + gnutls_x509_crt_import(cert, &cert_list[0], + GNUTLS_X509_FMT_DER); + + printf("Certificate info:\n"); + + /* This is the preferred way of printing short information about + a certificate. */ + + ret = + gnutls_x509_crt_print(cert, GNUTLS_CRT_PRINT_ONELINE, + &cinfo); + if (ret == 0) { + printf("\t%s\n", cinfo.data); + gnutls_free(cinfo.data); + } + + /* If you want to extract fields manually for some other reason, + below are popular example calls. */ + + expiration_time = + gnutls_x509_crt_get_expiration_time(cert); + activation_time = + gnutls_x509_crt_get_activation_time(cert); + + printf("\tCertificate is valid since: %s", + ctime(&activation_time)); + printf("\tCertificate expires: %s", + ctime(&expiration_time)); + + /* Print the serial number of the certificate. + */ + size = sizeof(serial); + gnutls_x509_crt_get_serial(cert, serial, &size); + + printf("\tCertificate serial number: %s\n", + bin2hex(serial, size)); + + /* Extract some of the public key algorithm's parameters + */ + algo = gnutls_x509_crt_get_pk_algorithm(cert, &bits); + + printf("Certificate public key: %s", + gnutls_pk_algorithm_get_name(algo)); + + /* Print the version of the X.509 + * certificate. + */ + printf("\tCertificate version: #%d\n", + gnutls_x509_crt_get_version(cert)); + + size = sizeof(dn); + gnutls_x509_crt_get_dn(cert, dn, &size); + printf("\tDN: %s\n", dn); + + size = sizeof(dn); + gnutls_x509_crt_get_issuer_dn(cert, dn, &size); + printf("\tIssuer's DN: %s\n", dn); + + gnutls_x509_crt_deinit(cert); + + } +} + + +File: gnutls.info, Node: Listing the ciphersuites in a priority string, Next: PKCS12 structure generation example, Prev: X.509 certificate parsing example, Up: Miscellaneous examples + +7.5.3 Listing the ciphersuites in a priority string +--------------------------------------------------- + +This is a small program to list the enabled ciphersuites by a priority +string. + +/* This example code is placed in the public domain. */ + +#include <config.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <gnutls/gnutls.h> + +static void print_cipher_suite_list(const char *priorities) +{ + size_t i; + int ret; + unsigned int idx; + const char *name; + const char *err; + unsigned char id[2]; + gnutls_protocol_t version; + gnutls_priority_t pcache; + + if (priorities != NULL) { + printf("Cipher suites for %s\n", priorities); + + ret = gnutls_priority_init(&pcache, priorities, &err); + if (ret < 0) { + fprintf(stderr, "Syntax error at: %s\n", err); + exit(1); + } + + for (i = 0;; i++) { + ret = + gnutls_priority_get_cipher_suite_index(pcache, + i, + &idx); + if (ret == GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE) + break; + if (ret == GNUTLS_E_UNKNOWN_CIPHER_SUITE) + continue; + + name = + gnutls_cipher_suite_info(idx, id, NULL, NULL, + NULL, &version); + + if (name != NULL) + printf("%-50s\t0x%02x, 0x%02x\t%s\n", + name, (unsigned char) id[0], + (unsigned char) id[1], + gnutls_protocol_get_name(version)); + } + + return; + } +} + +int main(int argc, char **argv) +{ + if (argc > 1) + print_cipher_suite_list(argv[1]); + return 0; +} + + +File: gnutls.info, Node: PKCS12 structure generation example, Prev: Listing the ciphersuites in a priority string, Up: Miscellaneous examples + +7.5.4 PKCS #12 structure generation example +------------------------------------------- + +This small program demonstrates the usage of the PKCS #12 API, by +generating such a structure. + +/* This example code is placed in the public domain. */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <stdio.h> +#include <stdlib.h> +#include <gnutls/gnutls.h> +#include <gnutls/pkcs12.h> + +#include "examples.h" + +#define OUTFILE "out.p12" + +/* This function will write a pkcs12 structure into a file. + * cert: is a DER encoded certificate + * pkcs8_key: is a PKCS #8 encrypted key (note that this must be + * encrypted using a PKCS #12 cipher, or some browsers will crash) + * password: is the password used to encrypt the PKCS #12 packet. + */ +int +write_pkcs12(const gnutls_datum_t * cert, + const gnutls_datum_t * pkcs8_key, const char *password) +{ + gnutls_pkcs12_t pkcs12; + int ret, bag_index; + gnutls_pkcs12_bag_t bag, key_bag; + char pkcs12_struct[10 * 1024]; + size_t pkcs12_struct_size; + FILE *fp; + + /* A good idea might be to use gnutls_x509_privkey_get_key_id() + * to obtain a unique ID. + */ + gnutls_datum_t key_id = { (void *) "\x00\x00\x07", 3 }; + + gnutls_global_init(); + + /* Firstly we create two helper bags, which hold the certificate, + * and the (encrypted) key. + */ + + gnutls_pkcs12_bag_init(&bag); + gnutls_pkcs12_bag_init(&key_bag); + + ret = + gnutls_pkcs12_bag_set_data(bag, GNUTLS_BAG_CERTIFICATE, cert); + if (ret < 0) { + fprintf(stderr, "ret: %s\n", gnutls_strerror(ret)); + return 1; + } + + /* ret now holds the bag's index. + */ + bag_index = ret; + + /* Associate a friendly name with the given certificate. Used + * by browsers. + */ + gnutls_pkcs12_bag_set_friendly_name(bag, bag_index, "My name"); + + /* Associate the certificate with the key using a unique key + * ID. + */ + gnutls_pkcs12_bag_set_key_id(bag, bag_index, &key_id); + + /* use weak encryption for the certificate. + */ + gnutls_pkcs12_bag_encrypt(bag, password, + GNUTLS_PKCS_USE_PKCS12_RC2_40); + + /* Now the key. + */ + + ret = gnutls_pkcs12_bag_set_data(key_bag, + GNUTLS_BAG_PKCS8_ENCRYPTED_KEY, + pkcs8_key); + if (ret < 0) { + fprintf(stderr, "ret: %s\n", gnutls_strerror(ret)); + return 1; + } + + /* Note that since the PKCS #8 key is already encrypted we don't + * bother encrypting that bag. + */ + bag_index = ret; + + gnutls_pkcs12_bag_set_friendly_name(key_bag, bag_index, "My name"); + + gnutls_pkcs12_bag_set_key_id(key_bag, bag_index, &key_id); + + + /* The bags were filled. Now create the PKCS #12 structure. + */ + gnutls_pkcs12_init(&pkcs12); + + /* Insert the two bags in the PKCS #12 structure. + */ + + gnutls_pkcs12_set_bag(pkcs12, bag); + gnutls_pkcs12_set_bag(pkcs12, key_bag); + + + /* Generate a message authentication code for the PKCS #12 + * structure. + */ + gnutls_pkcs12_generate_mac(pkcs12, password); + + pkcs12_struct_size = sizeof(pkcs12_struct); + ret = + gnutls_pkcs12_export(pkcs12, GNUTLS_X509_FMT_DER, + pkcs12_struct, &pkcs12_struct_size); + if (ret < 0) { + fprintf(stderr, "ret: %s\n", gnutls_strerror(ret)); + return 1; + } + + fp = fopen(OUTFILE, "w"); + if (fp == NULL) { + fprintf(stderr, "cannot open file\n"); + return 1; + } + fwrite(pkcs12_struct, 1, pkcs12_struct_size, fp); + fclose(fp); + + gnutls_pkcs12_bag_deinit(bag); + gnutls_pkcs12_bag_deinit(key_bag); + gnutls_pkcs12_deinit(pkcs12); + + return 0; +} + + +File: gnutls.info, Node: System-wide configuration of the library, Next: Using GnuTLS as a cryptographic library, Prev: GnuTLS application examples, Up: Top + +8 System-wide configuration of the library +****************************************** + +GnuTLS 3.6.9 introduced a system-wide configuration of the library which +can be used to disable or mark algorithms and protocols as insecure +system-wide, overriding the library defaults. The format of this +configuration file is of an INI file, with the hash ('#') allowed for +commenting. It intentionally does not allow switching algorithms or +protocols which were disabled or marked as insecure during compile time +to the secure set. This is to prevent the feature from being used to +attack the system. Unknown options or sections in the configuration +file are skipped unless the environment variable +'GNUTLS_SYSTEM_PRIORITY_FAIL_ON_INVALID' is set to 1, where it would +cause the library to exit on unknown options. + +The location of the default configuration file is '/etc/gnutls/config', +but its actual location may be overridden during compile time or at +run-time using the 'GNUTLS_SYSTEM_PRIORITY_FILE' environment variable. +The file used can be queried using *note +gnutls_get_system_config_file::. + + -- Function: const char * gnutls_get_system_config_file ( VOID) + + Returns the filename of the system wide configuration file to be + loaded by the library. + + *Returns:* a constant pointer to the config file path + + *Since:* 3.6.9 + +* Menu: + +* Application-specific priority strings:: +* Disabling algorithms and protocols:: +* Querying for disabled algorithms and protocols:: +* Overriding the parameter verification profile:: +* Overriding the default priority string:: +* Enabling/Disabling system/acceleration protocols:: + + +File: gnutls.info, Node: Application-specific priority strings, Next: Disabling algorithms and protocols, Up: System-wide configuration of the library + +8.1 Application-specific priority strings +========================================= + +It is possible to specify custom cipher priority strings, in addition to +the default priority strings ('NORMAL', 'PERFORMANCE', etc.). These can +be used either by individual applications, or even as the default option +if the library is compiled with the configuration option +'--with-default-priority-string'. In the latter case the defined +priority string will be used for applications using *note +gnutls_set_default_priority:: or *note +gnutls_set_default_priority_append::. + +The priority strings can be specified in the global section of the +configuration file, or in the section named '[priorities]'. The format +is ''KEYWORD = VALUE'', e.g., + +When used they may be followed by additional options that will be +appended to the system string (e.g., ''@EXAMPLE-PRIORITY:+SRP''). +''EXAMPLE-PRIORITY=NORMAL:+ARCFOUR-128''. Since version 3.5.1 +applications are allowed to specify fallback keywords such as +@KEYWORD1,@KEYWORD2, and the first valid keyword will be used. + +The following example configuration defines a priority string called +'@SYSTEM'. When set, its full settings can be queried using 'gnutls-cli +--priority @SYSTEM --list'. + + [priorities] + SYSTEM = NORMAL:-AES-128-CBC:-AES-256-CBC + + +File: gnutls.info, Node: Disabling algorithms and protocols, Next: Querying for disabled algorithms and protocols, Prev: Application-specific priority strings, Up: System-wide configuration of the library + +8.2 Disabling algorithms and protocols +====================================== + +The approach above works well to create consistent system-wide settings +for cooperative GnuTLS applications. When an application however does +not use the *note gnutls_set_default_priority:: or *note +gnutls_set_default_priority_append:: functions, the method is not +sufficient to prevent applications from using protocols or algorithms +forbidden by a local policy. The override method described below +enables the deprecation of algorithms and protocols system-wide for all +applications. + +The available options must be set in the '[overrides]' section of the +configuration file and can be + * 'insecure-sig-for-cert': to mark the signature algorithm as + insecure when used in certificates. + * 'insecure-sig': to mark the signature algorithm as insecure for any + use. + * 'insecure-hash': to mark the hash algorithm as insecure for digital + signature use (provides a more generic way to disable digital + signatures for broken hash algorithms). + * 'disabled-curve': to disable the specified elliptic curve. + * 'disabled-version': to disable the specified TLS versions. + * 'tls-disabled-cipher': to disable the specified ciphers for use in + the TLS or DTLS protocols. + * 'tls-disabled-mac': to disable the specified MAC algorithms for use + in the TLS or DTLS protocols. + * 'tls-disabled-group': to disable the specified group for use in the + TLS or DTLS protocols. + * 'tls-disabled-kx': to disable the specified key exchange algorithms + for use in the TLS or DTLS protocols (applies to TLS1.2 or + earlier). + +Each of the options can be repeated multiple times when multiple values +need to be disabled or enabled. + +The valid values for the options above can be found in the 'Protocols', +'Digests' 'PK-signatures', 'Protocols', 'Ciphers', and 'MACs' fields of +the output of 'gnutls-cli --list'. + +Sometimes the system administrator wants to enable only specific +algorithms, despite the library defaults. GnuTLS provides an +alternative mode of overriding: allowlisting. + +As shown below in the examples, it is hard to use this mode correctly, +as it requires understanding of how algorithms are used underneath by +the protocols. Allowlisting configuration mode is intended to be used +by the operating system vendors that prefer laying out the library +defaults exhaustively from scratch instead on depending on gnutls +presets, such as 'NORMAL'. Applications are then expected to optionally +disable or enable only a subset algorithms on top of the vendor-provided +configuration. + +In the allowlisting mode, all the algorithms are initially marked as +insecure or disabled, and shall be explicitly turned on by the options +listed below in the '[overrides]' section. As the allowlisting mode is +mutually exclusive to the blocklisting mode, the options listed above +for the blocklisting mode are forbidden in the allowlisting mode, and +vice versa. + + * 'secure-sig-for-cert': to mark the signature algorithm as secure + when used in certificates. + * 'secure-sig': to mark the signature algorithm as secure for any + use. + * 'secure-hash': to mark the hash algorithm as secure for digital + signature use (provides a more generic way to enable digital + signatures for broken hash algorithms). + * 'enabled-curve': to enable the specified elliptic curve. + * 'enabled-version': to enable the specified TLS versions. + * 'tls-enabled-cipher': to enable the specified ciphers for use in + the TLS or DTLS protocols. + * 'tls-enabled-mac': to enable the specified MAC algorithms for use + in the TLS or DTLS protocols. + * 'tls-enabled-group': to enable the specified group for use in the + TLS or DTLS protocols. + * 'tls-enabled-kx': to enable the specified key exchange algorithms + for use in the TLS or DTLS protocols (applies to TLS1.2 or + earlier). + +The allowlisting mode can be enabled by adding 'override-mode = +allowlist' in the '[global]' section. + +The following functions allow the applications to modify the setting. + +'INT *note gnutls_ecc_curve_set_enabled:: (gnutls_ecc_curve_t CURVE, unsigned int ENABLED)' +'INT *note gnutls_sign_set_secure:: (gnutls_sign_algorithm_t SIGN, unsigned int SECURE)' +'INT *note gnutls_sign_set_secure_for_certs:: (gnutls_sign_algorithm_t SIGN, unsigned int SECURE)' +'INT *note gnutls_digest_set_secure:: (gnutls_digest_algorithm_t DIG, unsigned int SECURE)' +'INT *note gnutls_protocol_set_enabled:: (gnutls_protocol_t VERSION, unsigned int ENABLED)' + +When the allowlisting mode is in effect, a '@SYSTEM' priority string is +automatically constructed from the options in the '[overrides]' section. +For this reason, the above functions should be called before the +'@SYSTEM' priority is used. + +8.2.1 Examples +-------------- + +The following example marks as insecure all digital signature algorithms +which depend on SHA384, as well as the RSA-SHA1 signature algorithm. + + [overrides] + insecure-hash = sha384 + insecure-sig = rsa-sha1 + +The following example marks RSA-SHA256 as insecure for use in +certificates and disables the TLS1.0 and TLS1.1 protocols. + + [overrides] + insecure-sig-for-cert = rsa-sha256 + disabled-version = tls1.0 + disabled-version = tls1.1 + +The following example disables the 'AES-128-CBC' and 'AES-256-CBC' +ciphers, the 'HMAC-SHA1' MAC algorithm and the 'GROUP-FFDHE8192' group +for TLS and DTLS protocols. + + [overrides] + tls-disabled-cipher = aes-128-cbc + tls-disabled-cipher = aes-256-cbc + tls-disabled-mac = sha1 + tls-disabled-group = group-ffdhe8192 + +The following example demonstrates the use of the allowlisting mode. +All the signature algorithms are disabled by default but 'RSA-SHA256'. +Note that the hash algorithm 'SHA256' also needs to be explicitly +enabled. + + [global] + override-mode = allowlist + + [overrides] + secure-hash = sha256 + secure-sig = rsa-sha256 + +To enable a TLS ciphersuite in the allowlist mode requires a more +verbose configuration, explicitly listing algorithm dependencies. The +following example enables TLS_AES_128_GCM_SHA256, using the SECP256R1 +curve for signing and key exchange. + + [global] + override-mode = allowlist + + [overrides] + secure-hash = sha256 + enabled-curve = secp256r1 + secure-sig = ecdsa-secp256r1-sha256 + enabled-version = tls1.3 + tls-enabled-cipher = aes-128-gcm + tls-enabled-mac = aead + tls-enabled-group = secp256r1 + + +File: gnutls.info, Node: Querying for disabled algorithms and protocols, Next: Overriding the parameter verification profile, Prev: Disabling algorithms and protocols, Up: System-wide configuration of the library + +8.3 Querying for disabled algorithms and protocols +================================================== + +When necessary applications can query whether a particular algorithm or +protocol has been marked as insecure or disabled system-wide. Digital +signatures can be queried using the following algorithms. +'UNSIGNED *note gnutls_sign_is_secure:: (gnutls_sign_algorithm_t ALGORITHM)' +'UNSIGNED *note gnutls_sign_is_secure2:: (gnutls_sign_algorithm_t ALGORITHM, unsigned int FLAGS)' + +Any disabled protocol versions or elliptic curves will not show up in +the lists provided by the following functions. + +'CONST GNUTLS_PROTOCOL_T * *note gnutls_protocol_list:: ( VOID)' +'CONST GNUTLS_GROUP_T * *note gnutls_group_list:: ( VOID)' +'CONST GNUTLS_ECC_CURVE_T * *note gnutls_ecc_curve_list:: ( VOID)' + +It is not possible to query for insecure hash algorithms directly (only +indirectly through the signature API). + + +File: gnutls.info, Node: Overriding the parameter verification profile, Next: Overriding the default priority string, Prev: Querying for disabled algorithms and protocols, Up: System-wide configuration of the library + +8.4 Overriding the parameter verification profile +================================================= + +When verifying a certificate or TLS session parameters, GnuTLS uses a +set of profiles associated with the session to determine whether the +parameters seen in the session are acceptable. For example, whether the +RSA public key size as seen on the wire, or the Diffie-Hellman +parameters for the session. These profiles are normally set using the +'%PROFILE' priority string (see *note Priority Strings:: and *note +Selecting cryptographic key sizes::). + +It is possible to set the low bar profile that applications cannot +override using the following. + + [overrides] + + # do not allow applications use the LOW or VERY-WEAK profiles. + min-verification-profile = legacy + + + +File: gnutls.info, Node: Overriding the default priority string, Next: Enabling/Disabling system/acceleration protocols, Prev: Overriding the parameter verification profile, Up: System-wide configuration of the library + +8.5 Overriding the default priority string +========================================== + +GnuTLS uses default priority string which is defined at compiled time. +Usually it is set to 'NORMAL'. This override allows to set the default +priority string to something more appropriate for a given deployment. + +Below example sets a more specific default priority string. + [overrides] + default-priority-string = SECURE128:-VERS-TLS-ALL:+VERS-TLS1.3 + + + +File: gnutls.info, Node: Enabling/Disabling system/acceleration protocols, Prev: Overriding the default priority string, Up: System-wide configuration of the library + +8.6 Enabling/Disabling system/acceleration protocols +==================================================== + +The following options can overwrite default behavior of protocols +system-wide. + [global] + ktls = true + + +8.6.1 Enabling KTLS +------------------- + +When GnuTLS is build with -–enable-ktls configuration, KTLS is disabled +by default. This can be enabled by setting 'ktls = true' in '[global]' +section. + + +File: gnutls.info, Node: Using GnuTLS as a cryptographic library, Next: Other included programs, Prev: System-wide configuration of the library, Up: Top + +9 Using GnuTLS as a cryptographic library +***************************************** + +GnuTLS is not a low-level cryptographic library, i.e., it does not +provide access to basic cryptographic primitives. However it abstracts +the internal cryptographic back-end (see *note Cryptographic Backend::), +providing symmetric crypto, hash and HMAC algorithms, as well access to +the random number generation. For a low-level crypto API the usage of +nettle (1) library is recommended. + +* Menu: + +* Symmetric algorithms:: +* Public key algorithms:: +* Cryptographic Message Syntax / PKCS7:: +* Hash and MAC functions:: +* Random number generation:: +* Overriding algorithms:: + + ---------- Footnotes ---------- + + (1) See <https://www.lysator.liu.se/~nisse/nettle/>. + + +File: gnutls.info, Node: Symmetric algorithms, Next: Public key algorithms, Up: Using GnuTLS as a cryptographic library + +9.1 Symmetric algorithms +======================== + +The available functions to access symmetric crypto algorithms operations +are listed in the sections below. The supported algorithms are the +algorithms required by the TLS protocol. They are listed in *note +Figure 9.1: gnutls_cipher_algorithm_t. Note that there two types of +ciphers, the ones providing an authenticated-encryption with associated +data (AEAD), and the legacy ciphers which provide raw access to the +ciphers. We recommend the use of the AEAD ciphers under the AEAD APIs +for new applications as they are designed to minimize the misuse of +cryptographic primitives. + +'GNUTLS_CIPHER_UNKNOWN' + Value to identify an unknown/unsupported algorithm. +'GNUTLS_CIPHER_NULL' + The NULL (identity) encryption algorithm. +'GNUTLS_CIPHER_ARCFOUR_128' + ARCFOUR stream cipher with 128-bit keys. +'GNUTLS_CIPHER_3DES_CBC' + 3DES in CBC mode. +'GNUTLS_CIPHER_AES_128_CBC' + AES in CBC mode with 128-bit keys. +'GNUTLS_CIPHER_AES_256_CBC' + AES in CBC mode with 256-bit keys. +'GNUTLS_CIPHER_ARCFOUR_40' + ARCFOUR stream cipher with 40-bit keys. +'GNUTLS_CIPHER_CAMELLIA_128_CBC' + Camellia in CBC mode with 128-bit keys. +'GNUTLS_CIPHER_CAMELLIA_256_CBC' + Camellia in CBC mode with 256-bit keys. +'GNUTLS_CIPHER_AES_192_CBC' + AES in CBC mode with 192-bit keys. +'GNUTLS_CIPHER_AES_128_GCM' + AES in GCM mode with 128-bit keys (AEAD). +'GNUTLS_CIPHER_AES_256_GCM' + AES in GCM mode with 256-bit keys (AEAD). +'GNUTLS_CIPHER_CAMELLIA_192_CBC' + Camellia in CBC mode with 192-bit keys. +'GNUTLS_CIPHER_SALSA20_256' + Salsa20 with 256-bit keys. +'GNUTLS_CIPHER_ESTREAM_SALSA20_256' + Estream's Salsa20 variant with 256-bit keys. +'GNUTLS_CIPHER_CAMELLIA_128_GCM' + CAMELLIA in GCM mode with 128-bit keys (AEAD). +'GNUTLS_CIPHER_CAMELLIA_256_GCM' + CAMELLIA in GCM mode with 256-bit keys (AEAD). +'GNUTLS_CIPHER_RC2_40_CBC' + RC2 in CBC mode with 40-bit keys. +'GNUTLS_CIPHER_DES_CBC' + DES in CBC mode (56-bit keys). +'GNUTLS_CIPHER_AES_128_CCM' + AES in CCM mode with 128-bit keys (AEAD). +'GNUTLS_CIPHER_AES_256_CCM' + AES in CCM mode with 256-bit keys (AEAD). +'GNUTLS_CIPHER_AES_128_CCM_8' + AES in CCM mode with 64-bit tag and 128-bit keys (AEAD). +'GNUTLS_CIPHER_AES_256_CCM_8' + AES in CCM mode with 64-bit tag and 256-bit keys (AEAD). +'GNUTLS_CIPHER_CHACHA20_POLY1305' + The Chacha20 cipher with the Poly1305 authenticator (AEAD). +'GNUTLS_CIPHER_GOST28147_TC26Z_CFB' + GOST 28147-89 (Magma) cipher in CFB mode with TC26 Z S-box. +'GNUTLS_CIPHER_GOST28147_CPA_CFB' + GOST 28147-89 (Magma) cipher in CFB mode with CryptoPro A S-box. +'GNUTLS_CIPHER_GOST28147_CPB_CFB' + GOST 28147-89 (Magma) cipher in CFB mode with CryptoPro B S-box. +'GNUTLS_CIPHER_GOST28147_CPC_CFB' + GOST 28147-89 (Magma) cipher in CFB mode with CryptoPro C S-box. +'GNUTLS_CIPHER_GOST28147_CPD_CFB' + GOST 28147-89 (Magma) cipher in CFB mode with CryptoPro D S-box. +'GNUTLS_CIPHER_AES_128_CFB8' + AES in CFB8 mode with 128-bit keys. +'GNUTLS_CIPHER_AES_192_CFB8' + AES in CFB8 mode with 192-bit keys. +'GNUTLS_CIPHER_AES_256_CFB8' + AES in CFB8 mode with 256-bit keys. +'GNUTLS_CIPHER_AES_128_XTS' + AES in XTS mode with 128-bit key + 128bit tweak key. +'GNUTLS_CIPHER_AES_256_XTS' + AES in XTS mode with 256-bit key + 256bit tweak key. Note that the + XTS ciphers are message oriented. The whole message needs to be + provided with a single call, because cipher-stealing requires to + know where the message actually terminates in order to be able to + compute where the stealing occurs. +'GNUTLS_CIPHER_GOST28147_TC26Z_CNT' + GOST 28147-89 (Magma) cipher in CNT mode with TC26 Z S-box. +'GNUTLS_CIPHER_CHACHA20_64' + Chacha20 cipher with 64-bit nonces and 64-bit block counters. +'GNUTLS_CIPHER_CHACHA20_32' + Chacha20 cipher with 96-bit nonces and 32-bit block counters. +'GNUTLS_CIPHER_AES_128_SIV' + AES in SIV mode with 128-bit key. +'GNUTLS_CIPHER_AES_256_SIV' + AES in SIV mode with 256-bit key. Note that the SIV ciphers can + only be used with the AEAD interface, and the IV plays a role as + the authentication tag while it is prepended to the cipher text. +'GNUTLS_CIPHER_AES_192_GCM' + AES in GCM mode with 192-bit keys (AEAD). +'GNUTLS_CIPHER_MAGMA_CTR_ACPKM' + GOST R 34.12-2015 (Magma) cipher in CTR-ACPKM mode. +'GNUTLS_CIPHER_KUZNYECHIK_CTR_ACPKM' + GOST R 34.12-2015 (Kuznyechik) cipher in CTR-ACPKM mode. +'GNUTLS_CIPHER_IDEA_PGP_CFB' + IDEA in CFB mode (placeholder - unsupported). +'GNUTLS_CIPHER_3DES_PGP_CFB' + 3DES in CFB mode (placeholder - unsupported). +'GNUTLS_CIPHER_CAST5_PGP_CFB' + CAST5 in CFB mode (placeholder - unsupported). +'GNUTLS_CIPHER_BLOWFISH_PGP_CFB' + Blowfish in CFB mode (placeholder - unsupported). +'GNUTLS_CIPHER_SAFER_SK128_PGP_CFB' + Safer-SK in CFB mode with 128-bit keys (placeholder - unsupported). +'GNUTLS_CIPHER_AES128_PGP_CFB' + AES in CFB mode with 128-bit keys (placeholder - unsupported). +'GNUTLS_CIPHER_AES192_PGP_CFB' + AES in CFB mode with 192-bit keys (placeholder - unsupported). +'GNUTLS_CIPHER_AES256_PGP_CFB' + AES in CFB mode with 256-bit keys (placeholder - unsupported). +'GNUTLS_CIPHER_TWOFISH_PGP_CFB' + Twofish in CFB mode (placeholder - unsupported). + + +Figure 9.1: The supported ciphers. + +Authenticated-encryption API +---------------------------- + +The AEAD API provides access to all ciphers supported by GnuTLS which +support authenticated encryption with associated data; these ciphers are +marked with the AEAD keyword on the table above. The AEAD cipher API is +particularly suitable for message or packet-encryption as it provides +authentication and encryption on the same API. See 'RFC5116' for more +information on authenticated encryption. + +'INT *note gnutls_aead_cipher_init:: (gnutls_aead_cipher_hd_t * HANDLE, gnutls_cipher_algorithm_t CIPHER, const gnutls_datum_t * KEY)' +'INT *note gnutls_aead_cipher_encrypt:: (gnutls_aead_cipher_hd_t HANDLE, const void * NONCE, size_t NONCE_LEN, const void * AUTH, size_t AUTH_LEN, size_t TAG_SIZE, const void * PTEXT, size_t PTEXT_LEN, void * CTEXT, size_t * CTEXT_LEN)' +'INT *note gnutls_aead_cipher_decrypt:: (gnutls_aead_cipher_hd_t HANDLE, const void * NONCE, size_t NONCE_LEN, const void * AUTH, size_t AUTH_LEN, size_t TAG_SIZE, const void * CTEXT, size_t CTEXT_LEN, void * PTEXT, size_t * PTEXT_LEN)' +'VOID *note gnutls_aead_cipher_deinit:: (gnutls_aead_cipher_hd_t HANDLE)' + +Because the encryption function above may be difficult to use with +scattered data, we provide the following API. + + -- Function: int gnutls_aead_cipher_encryptv (gnutls_aead_cipher_hd_t + HANDLE, const void * NONCE, size_t NONCE_LEN, const giovec_t * + AUTH_IOV, int AUTH_IOVCNT, size_t TAG_SIZE, const giovec_t * + IOV, int IOVCNT, void * CTEXT, size_t * CTEXT_LEN) + HANDLE: is a 'gnutls_aead_cipher_hd_t' type. + + NONCE: the nonce to set + + NONCE_LEN: The length of the nonce + + AUTH_IOV: additional data to be authenticated + + AUTH_IOVCNT: The number of buffers in 'auth_iov' + + TAG_SIZE: The size of the tag to use (use zero for the default) + + IOV: the data to be encrypted + + IOVCNT: The number of buffers in 'iov' + + CTEXT: the encrypted data including authentication tag + + CTEXT_LEN: the length of encrypted data (initially must hold the + maximum available size, including space for tag) + + This function will encrypt the provided data buffers using the + algorithm specified by the context. The output data will contain + the authentication tag. + + *Returns:* Zero or a negative error code on error. + + *Since:* 3.6.3 + +Legacy API +---------- + +The legacy API provides low-level access to all legacy ciphers supported +by GnuTLS, and some of the AEAD ciphers (e.g., AES-GCM and CHACHA20). +The restrictions of the nettle library implementation of the ciphers +apply verbatim to this API(1). + +'INT *note gnutls_cipher_init:: (gnutls_cipher_hd_t * HANDLE, gnutls_cipher_algorithm_t CIPHER, const gnutls_datum_t * KEY, const gnutls_datum_t * IV)' +'INT *note gnutls_cipher_encrypt2:: (gnutls_cipher_hd_t HANDLE, const void * PTEXT, size_t PTEXT_LEN, void * CTEXT, size_t CTEXT_LEN)' +'INT *note gnutls_cipher_decrypt2:: (gnutls_cipher_hd_t HANDLE, const void * CTEXT, size_t CTEXT_LEN, void * PTEXT, size_t PTEXT_LEN)' +'VOID *note gnutls_cipher_set_iv:: (gnutls_cipher_hd_t HANDLE, void * IV, size_t IVLEN)' +'VOID *note gnutls_cipher_deinit:: (gnutls_cipher_hd_t HANDLE)' + +'INT *note gnutls_cipher_add_auth:: (gnutls_cipher_hd_t HANDLE, const void * PTEXT, size_t PTEXT_SIZE)' +'INT *note gnutls_cipher_tag:: (gnutls_cipher_hd_t HANDLE, void * TAG, size_t TAG_SIZE)' +While the latter two functions allow the same API can be used with +authenticated encryption ciphers, it is recommended to use the following +functions which are solely for AEAD ciphers. The latter API is designed +to be simple to use and also hard to misuse, by handling the tag +verification and addition in transparent way. + + ---------- Footnotes ---------- + + (1) See the nettle manual +<https://www.lysator.liu.se/~nisse/nettle/nettle.html> + + +File: gnutls.info, Node: Public key algorithms, Next: Cryptographic Message Syntax / PKCS7, Prev: Symmetric algorithms, Up: Using GnuTLS as a cryptographic library + +9.2 Public key algorithms +========================= + +Public key cryptography algorithms such as RSA, DSA and ECDSA, are +accessed using the abstract key API in *note Abstract key types::. This +is a high level API with the advantage of transparently handling keys +stored in memory and keys present in smart cards. + +'INT *note gnutls_privkey_init:: (gnutls_privkey_t * KEY)' +'INT *note gnutls_privkey_import_url:: (gnutls_privkey_t KEY, const char * URL, unsigned int FLAGS)' +'INT *note gnutls_privkey_import_x509_raw:: (gnutls_privkey_t PKEY, const gnutls_datum_t * DATA, gnutls_x509_crt_fmt_t FORMAT, const char * PASSWORD, unsigned int FLAGS)' +'INT *note gnutls_privkey_sign_data:: (gnutls_privkey_t SIGNER, gnutls_digest_algorithm_t HASH, unsigned int FLAGS, const gnutls_datum_t * DATA, gnutls_datum_t * SIGNATURE)' +'INT *note gnutls_privkey_sign_hash:: (gnutls_privkey_t SIGNER, gnutls_digest_algorithm_t HASH_ALGO, unsigned int FLAGS, const gnutls_datum_t * HASH_DATA, gnutls_datum_t * SIGNATURE)' +'VOID *note gnutls_privkey_deinit:: (gnutls_privkey_t KEY)' + +'INT *note gnutls_pubkey_init:: (gnutls_pubkey_t * KEY)' +'INT *note gnutls_pubkey_import_url:: (gnutls_pubkey_t KEY, const char * URL, unsigned int FLAGS)' +'INT *note gnutls_pubkey_import_x509:: (gnutls_pubkey_t KEY, gnutls_x509_crt_t CRT, unsigned int FLAGS)' +'INT *note gnutls_pubkey_verify_data2:: (gnutls_pubkey_t PUBKEY, gnutls_sign_algorithm_t ALGO, unsigned int FLAGS, const gnutls_datum_t * DATA, const gnutls_datum_t * SIGNATURE)' +'INT *note gnutls_pubkey_verify_hash2:: (gnutls_pubkey_t KEY, gnutls_sign_algorithm_t ALGO, unsigned int FLAGS, const gnutls_datum_t * HASH, const gnutls_datum_t * SIGNATURE)' +'VOID *note gnutls_pubkey_deinit:: (gnutls_pubkey_t KEY)' + +Keys stored in memory can be imported using functions like *note +gnutls_privkey_import_x509_raw::, while keys on smart cards or HSMs +should be imported using their PKCS#11 URL with *note +gnutls_privkey_import_url::. + +If any of the smart card operations require PIN, that should be provided +either by setting the global PIN function (*note +gnutls_pkcs11_set_pin_function::), or better with the targeted to +structures functions such as *note gnutls_privkey_set_pin_function::. + +9.2.1 Key generation +-------------------- + +All supported key types (including RSA, DSA, ECDSA, Ed25519, Ed448) can +be generated with GnuTLS. They can be generated with the simpler *note +gnutls_privkey_generate:: or with the more advanced *note +gnutls_privkey_generate2::. + + -- Function: int gnutls_privkey_generate2 (gnutls_privkey_t PKEY, + gnutls_pk_algorithm_t ALGO, unsigned int BITS, unsigned int + FLAGS, const gnutls_keygen_data_st * DATA, unsigned DATA_SIZE) + PKEY: The private key + + ALGO: is one of the algorithms in 'gnutls_pk_algorithm_t' . + + BITS: the size of the modulus + + FLAGS: Must be zero or flags from 'gnutls_privkey_flags_t' . + + DATA: Allow specifying 'gnutls_keygen_data_st' types such as the + seed to be used. + + DATA_SIZE: The number of 'data' available. + + This function will generate a random private key. Note that this + function must be called on an initialized private key. + + The flag 'GNUTLS_PRIVKEY_FLAG_PROVABLE' instructs the key + generation process to use algorithms like Shawe-Taylor (from FIPS + PUB186-4) which generate provable parameters out of a seed for RSA + and DSA keys. On DSA keys the PQG parameters are generated using + the seed, while on RSA the two primes. To specify an explicit seed + (by default a random seed is used), use the 'data' with a + 'GNUTLS_KEYGEN_SEED' type. + + Note that when generating an elliptic curve key, the curve can be + substituted in the place of the bits parameter using the + 'GNUTLS_CURVE_TO_BITS()' macro. + + To export the generated keys in memory or in files it is + recommended to use the PKCS'8' form as it can handle all key types, + and can store additional parameters such as the seed, in case of + provable RSA or DSA keys. Generated keys can be exported in memory + using 'gnutls_privkey_export_x509()' , and then with + 'gnutls_x509_privkey_export2_pkcs8()' . + + If key generation is part of your application, avoid setting the + number of bits directly, and instead use + 'gnutls_sec_param_to_pk_bits()' . That way the generated keys will + adapt to the security levels of the underlying GnuTLS library. + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, + otherwise a negative error value. + + *Since:* 3.5.0 + + +File: gnutls.info, Node: Cryptographic Message Syntax / PKCS7, Next: Hash and MAC functions, Prev: Public key algorithms, Up: Using GnuTLS as a cryptographic library + +9.3 Cryptographic Message Syntax / PKCS7 +======================================== + +The CMS or PKCS #7 format is a commonly used format for digital +signatures. PKCS #7 is the name of the original standard when published +by RSA, though today the standard is adopted by IETF under the name CMS. + +The standards include multiple ways of signing a digital document, e.g., +by embedding the data into the signature, or creating detached +signatures of the data, including a timestamp, additional certificates +etc. In certain cases the same format is also used to transport lists +of certificates and CRLs. + +It is a relatively popular standard to sign structures, and is being +used to sign in PDF files, as well as for signing kernel modules and +other structures. + +In GnuTLS, the basic functions to initialize, deinitialize, import, +export or print information about a PKCS #7 structure are listed below. +'INT *note gnutls_pkcs7_init:: (gnutls_pkcs7_t * PKCS7)' +'VOID *note gnutls_pkcs7_deinit:: (gnutls_pkcs7_t PKCS7)' +'INT *note gnutls_pkcs7_export2:: (gnutls_pkcs7_t PKCS7, gnutls_x509_crt_fmt_t FORMAT, gnutls_datum_t * OUT)' +'INT *note gnutls_pkcs7_import:: (gnutls_pkcs7_t PKCS7, const gnutls_datum_t * DATA, gnutls_x509_crt_fmt_t FORMAT)' +'INT *note gnutls_pkcs7_print:: (gnutls_pkcs7_t PKCS7, gnutls_certificate_print_formats_t FORMAT, gnutls_datum_t * OUT)' + +The following functions allow the verification of a structure using +either a trust list, or individual certificates. The *note +gnutls_pkcs7_sign:: function is the data signing function. + +'INT *note gnutls_pkcs7_verify_direct:: (gnutls_pkcs7_t PKCS7, gnutls_x509_crt_t SIGNER, unsigned IDX, const gnutls_datum_t * DATA, unsigned FLAGS)' +'INT *note gnutls_pkcs7_verify:: (gnutls_pkcs7_t PKCS7, gnutls_x509_trust_list_t TL, gnutls_typed_vdata_st * VDATA, unsigned int VDATA_SIZE, unsigned IDX, const gnutls_datum_t * DATA, unsigned FLAGS)' + + -- Function: int gnutls_pkcs7_sign (gnutls_pkcs7_t PKCS7, + gnutls_x509_crt_t SIGNER, gnutls_privkey_t SIGNER_KEY, const + gnutls_datum_t * DATA, gnutls_pkcs7_attrs_t SIGNED_ATTRS, + gnutls_pkcs7_attrs_t UNSIGNED_ATTRS, gnutls_digest_algorithm_t + DIG, unsigned FLAGS) + PKCS7: should contain a 'gnutls_pkcs7_t' type + + SIGNER: the certificate to sign the structure + + SIGNER_KEY: the key to sign the structure + + DATA: The data to be signed or 'NULL' if the data are already + embedded + + SIGNED_ATTRS: Any additional attributes to be included in the + signed ones (or 'NULL' ) + + UNSIGNED_ATTRS: Any additional attributes to be included in the + unsigned ones (or 'NULL' ) + + DIG: The digest algorithm to use for signing + + FLAGS: Should be zero or one of 'GNUTLS_PKCS7' flags + + This function will add a signature in the provided PKCS '7' + structure for the provided data. Multiple signatures can be made + with different signers. + + The available flags are: 'GNUTLS_PKCS7_EMBED_DATA' , + 'GNUTLS_PKCS7_INCLUDE_TIME' , 'GNUTLS_PKCS7_INCLUDE_CERT' , and + 'GNUTLS_PKCS7_WRITE_SPKI' . They are explained in the + 'gnutls_pkcs7_sign_flags' definition. + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, + otherwise a negative error value. + + *Since:* 3.4.2 + +'GNUTLS_PKCS7_EMBED_DATA' + The signed data will be embedded in the structure. +'GNUTLS_PKCS7_INCLUDE_TIME' + The signing time will be included in the structure. +'GNUTLS_PKCS7_INCLUDE_CERT' + The signer's certificate will be included in the cert list. +'GNUTLS_PKCS7_WRITE_SPKI' + Use the signer's key identifier instead of name. + + +Figure 9.2: Flags applicable to gnutls_pkcs7_sign() + +Other helper functions which allow to access the signatures, or +certificates attached in the structure are listed below. + +'INT *note gnutls_pkcs7_get_signature_count:: (gnutls_pkcs7_t PKCS7)' +'INT *note gnutls_pkcs7_get_signature_info:: (gnutls_pkcs7_t PKCS7, unsigned IDX, gnutls_pkcs7_signature_info_st * INFO)' +'INT *note gnutls_pkcs7_get_crt_count:: (gnutls_pkcs7_t PKCS7)' +'INT *note gnutls_pkcs7_get_crt_raw2:: (gnutls_pkcs7_t PKCS7, unsigned INDX, gnutls_datum_t * CERT)' +'INT *note gnutls_pkcs7_get_crl_count:: (gnutls_pkcs7_t PKCS7)' +'INT *note gnutls_pkcs7_get_crl_raw2:: (gnutls_pkcs7_t PKCS7, unsigned INDX, gnutls_datum_t * CRL)' + +To append certificates, or CRLs in the structure the following functions +are provided. +'INT *note gnutls_pkcs7_set_crt_raw:: (gnutls_pkcs7_t PKCS7, const gnutls_datum_t * CRT)' +'INT *note gnutls_pkcs7_set_crt:: (gnutls_pkcs7_t PKCS7, gnutls_x509_crt_t CRT)' +'INT *note gnutls_pkcs7_set_crl_raw:: (gnutls_pkcs7_t PKCS7, const gnutls_datum_t * CRL)' +'INT *note gnutls_pkcs7_set_crl:: (gnutls_pkcs7_t PKCS7, gnutls_x509_crl_t CRL)' + + +File: gnutls.info, Node: Hash and MAC functions, Next: Random number generation, Prev: Cryptographic Message Syntax / PKCS7, Up: Using GnuTLS as a cryptographic library + +9.4 Hash and MAC functions +========================== + +The available operations to access hash functions and hash-MAC (HMAC) +algorithms are shown below. HMAC algorithms provided keyed hash +functionality. The supported MAC and HMAC algorithms are listed in +*note Figure 9.3: gnutls_mac_algorithm_t. Note that, despite the 'hmac' +part in the name of the MAC functions listed below, they can be used +either for HMAC or MAC operations. + +'GNUTLS_MAC_UNKNOWN' + Unknown MAC algorithm. +'GNUTLS_MAC_NULL' + NULL MAC algorithm (empty output). +'GNUTLS_MAC_MD5' + HMAC-MD5 algorithm. +'GNUTLS_MAC_SHA1' + HMAC-SHA-1 algorithm. +'GNUTLS_MAC_RMD160' + HMAC-RMD160 algorithm. +'GNUTLS_MAC_MD2' + HMAC-MD2 algorithm. +'GNUTLS_MAC_SHA256' + HMAC-SHA-256 algorithm. +'GNUTLS_MAC_SHA384' + HMAC-SHA-384 algorithm. +'GNUTLS_MAC_SHA512' + HMAC-SHA-512 algorithm. +'GNUTLS_MAC_SHA224' + HMAC-SHA-224 algorithm. +'GNUTLS_MAC_SHA3_224' + Reserved; unimplemented. +'GNUTLS_MAC_SHA3_256' + Reserved; unimplemented. +'GNUTLS_MAC_SHA3_384' + Reserved; unimplemented. +'GNUTLS_MAC_SHA3_512' + Reserved; unimplemented. +'GNUTLS_MAC_MD5_SHA1' + Combined MD5+SHA1 MAC placeholder. +'GNUTLS_MAC_GOSTR_94' + HMAC GOST R 34.11-94 algorithm. +'GNUTLS_MAC_STREEBOG_256' + HMAC GOST R 34.11-2001 (Streebog) algorithm, 256 bit. +'GNUTLS_MAC_STREEBOG_512' + HMAC GOST R 34.11-2001 (Streebog) algorithm, 512 bit. +'GNUTLS_MAC_AEAD' + MAC implicit through AEAD cipher. +'GNUTLS_MAC_UMAC_96' + The UMAC-96 MAC algorithm (requires nonce). +'GNUTLS_MAC_UMAC_128' + The UMAC-128 MAC algorithm (requires nonce). +'GNUTLS_MAC_AES_CMAC_128' + The AES-CMAC-128 MAC algorithm. +'GNUTLS_MAC_AES_CMAC_256' + The AES-CMAC-256 MAC algorithm. +'GNUTLS_MAC_AES_GMAC_128' + The AES-GMAC-128 MAC algorithm (requires nonce). +'GNUTLS_MAC_AES_GMAC_192' + The AES-GMAC-192 MAC algorithm (requires nonce). +'GNUTLS_MAC_AES_GMAC_256' + The AES-GMAC-256 MAC algorithm (requires nonce). +'GNUTLS_MAC_GOST28147_TC26Z_IMIT' + The GOST 28147-89 working in IMIT mode with TC26 Z S-box. +'GNUTLS_MAC_SHAKE_128' + Reserved; unimplemented. +'GNUTLS_MAC_SHAKE_256' + Reserved; unimplemented. +'GNUTLS_MAC_MAGMA_OMAC' + GOST R 34.12-2015 (Magma) in OMAC (CMAC) mode. +'GNUTLS_MAC_KUZNYECHIK_OMAC' + GOST R 34.12-2015 (Kuznyechik) in OMAC (CMAC) mode. + + +Figure 9.3: The supported MAC and HMAC algorithms. + +'INT *note gnutls_hmac_init:: (gnutls_hmac_hd_t * DIG, gnutls_mac_algorithm_t ALGORITHM, const void * KEY, size_t KEYLEN)' +'INT *note gnutls_hmac:: (gnutls_hmac_hd_t HANDLE, const void * PTEXT, size_t PTEXT_LEN)' +'VOID *note gnutls_hmac_output:: (gnutls_hmac_hd_t HANDLE, void * DIGEST)' +'VOID *note gnutls_hmac_deinit:: (gnutls_hmac_hd_t HANDLE, void * DIGEST)' +'UNSIGNED *note gnutls_hmac_get_len:: (gnutls_mac_algorithm_t ALGORITHM)' +'INT *note gnutls_hmac_fast:: (gnutls_mac_algorithm_t ALGORITHM, const void * KEY, size_t KEYLEN, const void * PTEXT, size_t PTEXT_LEN, void * DIGEST)' + +The available functions to access hash functions are shown below. The +supported hash functions are shown in *note Figure 9.4: +gnutls_digest_algorithm_t. + +'INT *note gnutls_hash_init:: (gnutls_hash_hd_t * DIG, gnutls_digest_algorithm_t ALGORITHM)' +'INT *note gnutls_hash:: (gnutls_hash_hd_t HANDLE, const void * PTEXT, size_t PTEXT_LEN)' +'VOID *note gnutls_hash_output:: (gnutls_hash_hd_t HANDLE, void * DIGEST)' +'VOID *note gnutls_hash_deinit:: (gnutls_hash_hd_t HANDLE, void * DIGEST)' +'UNSIGNED *note gnutls_hash_get_len:: (gnutls_digest_algorithm_t ALGORITHM)' +'INT *note gnutls_hash_fast:: (gnutls_digest_algorithm_t ALGORITHM, const void * PTEXT, size_t PTEXT_LEN, void * DIGEST)' +'INT *note gnutls_fingerprint:: (gnutls_digest_algorithm_t ALGO, const gnutls_datum_t * DATA, void * RESULT, size_t * RESULT_SIZE)' + +'GNUTLS_DIG_UNKNOWN' + Unknown hash algorithm. +'GNUTLS_DIG_NULL' + NULL hash algorithm (empty output). +'GNUTLS_DIG_MD5' + MD5 algorithm. +'GNUTLS_DIG_SHA1' + SHA-1 algorithm. +'GNUTLS_DIG_RMD160' + RMD160 algorithm. +'GNUTLS_DIG_MD2' + MD2 algorithm. +'GNUTLS_DIG_SHA256' + SHA-256 algorithm. +'GNUTLS_DIG_SHA384' + SHA-384 algorithm. +'GNUTLS_DIG_SHA512' + SHA-512 algorithm. +'GNUTLS_DIG_SHA224' + SHA-224 algorithm. +'GNUTLS_DIG_SHA3_224' + SHA3-224 algorithm. +'GNUTLS_DIG_SHA3_256' + SHA3-256 algorithm. +'GNUTLS_DIG_SHA3_384' + SHA3-384 algorithm. +'GNUTLS_DIG_SHA3_512' + SHA3-512 algorithm. +'GNUTLS_DIG_MD5_SHA1' + Combined MD5+SHA1 algorithm. +'GNUTLS_DIG_GOSTR_94' + GOST R 34.11-94 algorithm. +'GNUTLS_DIG_STREEBOG_256' + GOST R 34.11-2001 (Streebog) algorithm, 256 bit. +'GNUTLS_DIG_STREEBOG_512' + GOST R 34.11-2001 (Streebog) algorithm, 512 bit. +'GNUTLS_DIG_SHAKE_128' + Reserved; unimplemented. +'GNUTLS_DIG_SHAKE_256' + Reserved; unimplemented. + + +Figure 9.4: The supported hash algorithms. + + +File: gnutls.info, Node: Random number generation, Next: Overriding algorithms, Prev: Hash and MAC functions, Up: Using GnuTLS as a cryptographic library + +9.5 Random number generation +============================ + +Access to the random number generator is provided using the *note +gnutls_rnd:: function. It allows obtaining random data of various +levels. + +'GNUTLS_RND_NONCE' + Non-predictable random number. Fatal in parts of session if + broken, i.e., vulnerable to statistical analysis. +'GNUTLS_RND_RANDOM' + Pseudo-random cryptographic random number. Fatal in session if + broken. Example use: temporal keys. +'GNUTLS_RND_KEY' + Fatal in many sessions if broken. Example use: Long-term keys. + + +Figure 9.5: The random number levels. + + -- Function: int gnutls_rnd (gnutls_rnd_level_t LEVEL, void * DATA, + size_t LEN) + LEVEL: a security level + + DATA: place to store random bytes + + LEN: The requested size + + This function will generate random data and store it to output + buffer. The value of 'level' should be one of 'GNUTLS_RND_NONCE' , + 'GNUTLS_RND_RANDOM' and 'GNUTLS_RND_KEY' . See the manual and + 'gnutls_rnd_level_t' for detailed information. + + This function is thread-safe and also fork-safe. + + *Returns:* Zero on success, or a negative error code on error. + + *Since:* 2.12.0 + +See *note Random Number Generators-internals:: for more information on +the random number generator operation. + + +File: gnutls.info, Node: Overriding algorithms, Prev: Random number generation, Up: Using GnuTLS as a cryptographic library + +9.6 Overriding algorithms +========================= + +In systems which provide a hardware accelerated cipher implementation +that is not directly supported by GnuTLS, it is possible to utilize it. +There are functions which allow overriding the default cipher, digest +and MAC implementations. Those are described below. + +To override public key operations see *note Abstract private keys::. + + -- Function: int gnutls_crypto_register_cipher + (gnutls_cipher_algorithm_t ALGORITHM, int PRIORITY, + gnutls_cipher_init_func INIT, gnutls_cipher_setkey_func + SETKEY, gnutls_cipher_setiv_func SETIV, + gnutls_cipher_encrypt_func ENCRYPT, gnutls_cipher_decrypt_func + DECRYPT, gnutls_cipher_deinit_func DEINIT) + ALGORITHM: is the gnutls algorithm identifier + + PRIORITY: is the priority of the algorithm + + INIT: A function which initializes the cipher + + SETKEY: A function which sets the key of the cipher + + SETIV: A function which sets the nonce/IV of the cipher (non-AEAD) + + ENCRYPT: A function which performs encryption (non-AEAD) + + DECRYPT: A function which performs decryption (non-AEAD) + + DEINIT: A function which deinitializes the cipher + + This function will register a cipher algorithm to be used by + gnutls. Any algorithm registered will override the included + algorithms and by convention kernel implemented algorithms have + priority of 90 and CPU-assisted of 80. The algorithm with the + lowest priority will be used by gnutls. + + In the case the registered init or setkey functions return + 'GNUTLS_E_NEED_FALLBACK' , GnuTLS will attempt to use the next in + priority registered cipher. + + The functions which are marked as non-AEAD they are not required + when registering a cipher to be used with the new AEAD API + introduced in GnuTLS 3.4.0. Internally GnuTLS uses the new AEAD + API. + + *Deprecated:* since 3.7.0 it is no longer possible to override + cipher implementation + + *Returns:* 'GNUTLS_E_SUCCESS' on success, otherwise a negative + error code. + + *Since:* 3.4.0 + + -- Function: int gnutls_crypto_register_aead_cipher + (gnutls_cipher_algorithm_t ALGORITHM, int PRIORITY, + gnutls_cipher_init_func INIT, gnutls_cipher_setkey_func + SETKEY, gnutls_cipher_aead_encrypt_func AEAD_ENCRYPT, + gnutls_cipher_aead_decrypt_func AEAD_DECRYPT, + gnutls_cipher_deinit_func DEINIT) + ALGORITHM: is the gnutls AEAD cipher identifier + + PRIORITY: is the priority of the algorithm + + INIT: A function which initializes the cipher + + SETKEY: A function which sets the key of the cipher + + AEAD_ENCRYPT: Perform the AEAD encryption + + AEAD_DECRYPT: Perform the AEAD decryption + + DEINIT: A function which deinitializes the cipher + + This function will register a cipher algorithm to be used by + gnutls. Any algorithm registered will override the included + algorithms and by convention kernel implemented algorithms have + priority of 90 and CPU-assisted of 80. The algorithm with the + lowest priority will be used by gnutls. + + In the case the registered init or setkey functions return + 'GNUTLS_E_NEED_FALLBACK' , GnuTLS will attempt to use the next in + priority registered cipher. + + The functions registered will be used with the new AEAD API + introduced in GnuTLS 3.4.0. Internally GnuTLS uses the new AEAD + API. + + *Deprecated:* since 3.7.0 it is no longer possible to override + cipher implementation + + *Returns:* 'GNUTLS_E_SUCCESS' on success, otherwise a negative + error code. + + *Since:* 3.4.0 + + -- Function: int gnutls_crypto_register_mac (gnutls_mac_algorithm_t + ALGORITHM, int PRIORITY, gnutls_mac_init_func INIT, + gnutls_mac_setkey_func SETKEY, gnutls_mac_setnonce_func + SETNONCE, gnutls_mac_hash_func HASH, gnutls_mac_output_func + OUTPUT, gnutls_mac_deinit_func DEINIT, gnutls_mac_fast_func + HASH_FAST) + ALGORITHM: is the gnutls MAC identifier + + PRIORITY: is the priority of the algorithm + + INIT: A function which initializes the MAC + + SETKEY: A function which sets the key of the MAC + + SETNONCE: A function which sets the nonce for the mac (may be + 'NULL' for common MAC algorithms) + + HASH: Perform the hash operation + + OUTPUT: Provide the output of the MAC + + DEINIT: A function which deinitializes the MAC + + HASH_FAST: Perform the MAC operation in one go + + This function will register a MAC algorithm to be used by gnutls. + Any algorithm registered will override the included algorithms and + by convention kernel implemented algorithms have priority of 90 and + CPU-assisted of 80. The algorithm with the lowest priority will be + used by gnutls. + + *Deprecated:* since 3.7.0 it is no longer possible to override + cipher implementation + + *Returns:* 'GNUTLS_E_SUCCESS' on success, otherwise a negative + error code. + + *Since:* 3.4.0 + + -- Function: int gnutls_crypto_register_digest + (gnutls_digest_algorithm_t ALGORITHM, int PRIORITY, + gnutls_digest_init_func INIT, gnutls_digest_hash_func HASH, + gnutls_digest_output_func OUTPUT, gnutls_digest_deinit_func + DEINIT, gnutls_digest_fast_func HASH_FAST) + ALGORITHM: is the gnutls digest identifier + + PRIORITY: is the priority of the algorithm + + INIT: A function which initializes the digest + + HASH: Perform the hash operation + + OUTPUT: Provide the output of the digest + + DEINIT: A function which deinitializes the digest + + HASH_FAST: Perform the digest operation in one go + + This function will register a digest algorithm to be used by + gnutls. Any algorithm registered will override the included + algorithms and by convention kernel implemented algorithms have + priority of 90 and CPU-assisted of 80. The algorithm with the + lowest priority will be used by gnutls. + + *Deprecated:* since 3.7.0 it is no longer possible to override + cipher implementation + + *Returns:* 'GNUTLS_E_SUCCESS' on success, otherwise a negative + error code. + + *Since:* 3.4.0 + + +File: gnutls.info, Node: Other included programs, Next: Internal architecture of GnuTLS, Prev: Using GnuTLS as a cryptographic library, Up: Top + +10 Other included programs +************************** + +Included with GnuTLS are also a few command line tools that let you use +the library for common tasks without writing an application. The +applications are discussed in this chapter. + +* Menu: + +* gnutls-cli Invocation:: Invoking gnutls-cli +* gnutls-serv Invocation:: Invoking gnutls-serv +* gnutls-cli-debug Invocation:: Invoking gnutls-cli-debug + + +File: gnutls.info, Node: gnutls-cli Invocation, Next: gnutls-serv Invocation, Up: Other included programs + +Invoking gnutls-cli +=================== + +Simple client program to set up a TLS connection to some other computer. +It sets up a TLS connection and forwards data from the standard input to +the secured socket and vice versa. + +gnutls-cli help/usage ('-?') +---------------------------- + +The text printed is the same whether selected with the 'help' option +('--help') or the 'more-help' option ('--more-help'). 'more-help' will +print the usage text by passing it through a pager program. 'more-help' +is disabled on platforms without a working 'fork(2)' function. The +'PAGER' environment variable is used to select the program, defaulting +to 'more'. Both will exit with a status code of 0. + + gnutls-cli - GnuTLS client + Usage: gnutls-cli [ -<flag> [<val>] | --<name>[{=| }<val>] ]... [hostname] + + None: + + -d, --debug=num Enable debugging + - it must be in the range: + 0 to 9999 + -V, --verbose More verbose output + --tofu Enable trust on first use authentication + --strict-tofu Fail to connect if a certificate is unknown or a known certificate has changed + --dane Enable DANE certificate verification (DNSSEC) + --local-dns Use the local DNS server for DNSSEC resolving + --ca-verification Enable CA certificate verification + - enabled by default + - disabled as '--no-ca-verification' + --ocsp Enable OCSP certificate verification + -r, --resume Establish a session and resume + --earlydata=str Send early data on resumption from the specified file + -e, --rehandshake Establish a session and rehandshake + --sni-hostname=str Server's hostname for server name indication extension + --verify-hostname=str Server's hostname to use for validation + -s, --starttls Connect, establish a plain session and start TLS + --app-proto an alias for the 'starttls-proto' option + --starttls-proto=str The application protocol to be used to obtain the server's certificate (https, ftp, smtp, imap, ldap, xmpp, lmtp, pop3, nntp, sieve, postgres) + - prohibits the option 'starttls' + -u, --udp Use DTLS (datagram TLS) over UDP + --mtu=num Set MTU for datagram TLS + - it must be in the range: + 0 to 17000 + --crlf Send CR LF instead of LF + --fastopen Enable TCP Fast Open + --x509fmtder Use DER format for certificates to read from + --print-cert Print peer's certificate in PEM format + --save-cert=str Save the peer's certificate chain in the specified file in PEM format + --save-ocsp=str Save the peer's OCSP status response in the provided file + - prohibits the option 'save-ocsp-multi' + --save-ocsp-multi=str Save all OCSP responses provided by the peer in this file + - prohibits the option 'save-ocsp' + --save-server-trace=str Save the server-side TLS message trace in the provided file + --save-client-trace=str Save the client-side TLS message trace in the provided file + --dh-bits=num The minimum number of bits allowed for DH + --priority=str Priorities string + --x509cafile=str Certificate file or PKCS #11 URL to use + --x509crlfile=file CRL file to use + - file must pre-exist + --x509keyfile=str X.509 key file or PKCS #11 URL to use + --x509certfile=str X.509 Certificate file or PKCS #11 URL to use + - requires the option 'x509keyfile' + --rawpkkeyfile=str Private key file (PKCS #8 or PKCS #12) or PKCS #11 URL to use + --rawpkfile=str Raw public-key file to use + - requires the option 'rawpkkeyfile' + --srpusername=str SRP username to use + --srppasswd=str SRP password to use + --pskusername=str PSK username to use + --pskkey=str PSK key (in hex) to use + -p, --port=str The port or service to connect to + --insecure Don't abort program if server certificate can't be validated + --verify-allow-broken Allow broken algorithms, such as MD5 for certificate verification + --benchmark-ciphers Benchmark individual ciphers + --benchmark-tls-kx Benchmark TLS key exchange methods + --benchmark-tls-ciphers Benchmark TLS ciphers + -l, --list Print a list of the supported algorithms and modes + - prohibits the option 'port' + --priority-list Print a list of the supported priority strings + --noticket Don't allow session tickets + --srtp-profiles=str Offer SRTP profiles + --alpn=str Application layer protocol + --compress-cert=str Compress certificate + -b, --heartbeat Activate heartbeat support + --recordsize=num The maximum record size to advertise + - it must be in the range: + 0 to 4096 + --disable-sni Do not send a Server Name Indication (SNI) + --single-key-share Send a single key share under TLS1.3 + --post-handshake-auth Enable post-handshake authentication under TLS1.3 + --inline-commands Inline commands of the form ^<cmd>^ + --inline-commands-prefix=str Change the default delimiter for inline commands + --provider=file Specify the PKCS #11 provider library + - file must pre-exist + --fips140-mode Reports the status of the FIPS140-2 mode in gnutls library + --list-config Reports the configuration of the library + --logfile=str Redirect informational messages to a specific file + --keymatexport=str Label used for exporting keying material + --keymatexportsize=num Size of the exported keying material + --waitresumption Block waiting for the resumption data under TLS1.3 + --ca-auto-retrieve Enable automatic retrieval of missing CA certificates + + Version, usage and configuration options: + + -v, --version[=arg] output version information and exit + -h, --help display extended usage information and exit + -!, --more-help extended usage information passed thru pager + + Options are specified by doubled hyphens and their name or by a single + hyphen and the flag character. + Operands and options may be intermixed. They will be reordered. + + Simple client program to set up a TLS connection to some other computer. + It sets up a TLS connection and forwards data from the standard input to the secured socket and vice versa. + + Please send bug reports to: <bugs@gnutls.org> + + +debug option (-d). +------------------ + +This is the "enable debugging" option. This option takes a +ArgumentType.NUMBER argument. Specifies the debug level. + +tofu option. +------------ + +This is the "enable trust on first use authentication" option. This +option will, in addition to certificate authentication, perform +authentication based on previously seen public keys, a model similar to +SSH authentication. Note that when tofu is specified (PKI) and DANE +authentication will become advisory to assist the public key acceptance +process. + +strict-tofu option. +------------------- + +This is the "fail to connect if a certificate is unknown or a known +certificate has changed" option. This option will perform +authentication as with option -tofu; however, no questions shall be +asked whatsoever, neither to accept an unknown certificate nor a changed +one. + +dane option. +------------ + +This is the "enable dane certificate verification (dnssec)" option. +This option will, in addition to certificate authentication using the +trusted CAs, verify the server certificates using on the DANE +information available via DNSSEC. + +local-dns option. +----------------- + +This is the "use the local dns server for dnssec resolving" option. +This option will use the local DNS server for DNSSEC. This is disabled +by default due to many servers not allowing DNSSEC. + +ca-verification option. +----------------------- + +This is the "enable ca certificate verification" option. + +This option has some usage constraints. It: + * can be disabled with -no-ca-verification. + * It is enabled by default. + +This option can be used to enable or disable CA certificate +verification. It is to be used with the -dane or -tofu options. + +ocsp option. +------------ + +This is the "enable ocsp certificate verification" option. This option +will enable verification of the peer's certificate using ocsp + +resume option (-r). +------------------- + +This is the "establish a session and resume" option. Connect, establish +a session, reconnect and resume. + +rehandshake option (-e). +------------------------ + +This is the "establish a session and rehandshake" option. Connect, +establish a session and rehandshake immediately. + +sni-hostname option. +-------------------- + +This is the "server's hostname for server name indication extension" +option. This option takes a ArgumentType.STRING argument. Set +explicitly the server name used in the TLS server name indication +extension. That is useful when testing with servers setup on different +DNS name than the intended. If not specified, the provided hostname is +used. Even with this option server certificate verification still uses +the hostname passed on the main commandline. Use -verify-hostname to +change this. + +verify-hostname option. +----------------------- + +This is the "server's hostname to use for validation" option. This +option takes a ArgumentType.STRING argument. Set explicitly the server +name to be used when validating the server's certificate. + +starttls option (-s). +--------------------- + +This is the "connect, establish a plain session and start tls" option. +The TLS session will be initiated when EOF or a SIGALRM is received. + +app-proto option. +----------------- + +This is an alias for the 'starttls-proto' option, *note the +starttls-proto option documentation: gnutls-cli starttls-proto. + +starttls-proto option. +---------------------- + +This is the "the application protocol to be used to obtain the server's +certificate (https, ftp, smtp, imap, ldap, xmpp, lmtp, pop3, nntp, +sieve, postgres)" option. This option takes a ArgumentType.STRING +argument. + +This option has some usage constraints. It: + * must not appear in combination with any of the following options: + starttls. + +Specify the application layer protocol for STARTTLS. If the protocol is +supported, gnutls-cli will proceed to the TLS negotiation. + +save-ocsp-multi option. +----------------------- + +This is the "save all ocsp responses provided by the peer in this file" +option. This option takes a ArgumentType.STRING argument. + +This option has some usage constraints. It: + * must not appear in combination with any of the following options: + save-ocsp. + +The file will contain a list of PEM encoded OCSP status responses if any +were provided by the peer, starting with the one for the peer's server +certificate. + +dh-bits option. +--------------- + +This is the "the minimum number of bits allowed for dh" option. This +option takes a ArgumentType.NUMBER argument. This option sets the +minimum number of bits allowed for a Diffie-Hellman key exchange. You +may want to lower the default value if the peer sends a weak prime and +you get an connection error with unacceptable prime. + +priority option. +---------------- + +This is the "priorities string" option. This option takes a +ArgumentType.STRING argument. TLS algorithms and protocols to enable. +You can use predefined sets of ciphersuites such as PERFORMANCE, NORMAL, +PFS, SECURE128, SECURE256. The default is NORMAL. + +Check the GnuTLS manual on section "Priority strings" for more +information on the allowed keywords + +rawpkkeyfile option. +-------------------- + +This is the "private key file (pkcs #8 or pkcs #12) or pkcs #11 url to +use" option. This option takes a ArgumentType.STRING argument. In +order to instruct the application to negotiate raw public keys one must +enable the respective certificate types via the priority strings (i.e. +CTYPE-CLI-* and CTYPE-SRV-* flags). + +Check the GnuTLS manual on section "Priority strings" for more +information on how to set certificate types. + +rawpkfile option. +----------------- + +This is the "raw public-key file to use" option. This option takes a +ArgumentType.STRING argument. + +This option has some usage constraints. It: + * must appear in combination with the following options: + rawpkkeyfile. + +In order to instruct the application to negotiate raw public keys one +must enable the respective certificate types via the priority strings +(i.e. CTYPE-CLI-* and CTYPE-SRV-* flags). + +Check the GnuTLS manual on section "Priority strings" for more +information on how to set certificate types. + +ranges option. +-------------- + +This is the "use length-hiding padding to prevent traffic analysis" +option. When possible (e.g., when using CBC ciphersuites), use +length-hiding padding to prevent traffic analysis. + +*NOTE**: THIS OPTION IS DEPRECATED* + +benchmark-ciphers option. +------------------------- + +This is the "benchmark individual ciphers" option. By default the +benchmarked ciphers will utilize any capabilities of the local CPU to +improve performance. To test against the raw software implementation +set the environment variable GNUTLS_CPUID_OVERRIDE to 0x1. + +benchmark-tls-ciphers option. +----------------------------- + +This is the "benchmark tls ciphers" option. By default the benchmarked +ciphers will utilize any capabilities of the local CPU to improve +performance. To test against the raw software implementation set the +environment variable GNUTLS_CPUID_OVERRIDE to 0x1. + +list option (-l). +----------------- + +This is the "print a list of the supported algorithms and modes" option. + +This option has some usage constraints. It: + * must not appear in combination with any of the following options: + port. + +Print a list of the supported algorithms and modes. If a priority +string is given then only the enabled ciphersuites are shown. + +priority-list option. +--------------------- + +This is the "print a list of the supported priority strings" option. +Print a list of the supported priority strings. The ciphersuites +corresponding to each priority string can be examined using -l -p. + +noticket option. +---------------- + +This is the "don't allow session tickets" option. Disable the request +of receiving of session tickets under TLS1.2 or earlier + +alpn option. +------------ + +This is the "application layer protocol" option. This option takes a +ArgumentType.STRING argument. This option will set and enable the +Application Layer Protocol Negotiation (ALPN) in the TLS protocol. + +compress-cert option. +--------------------- + +This is the "compress certificate" option. This option takes a +ArgumentType.STRING argument. This option sets a supported compression +method for certificate compression. + +disable-extensions option. +-------------------------- + +This is the "disable all the tls extensions" option. This option +disables all TLS extensions. Deprecated option. Use the priority +string. + +*NOTE**: THIS OPTION IS DEPRECATED* + +single-key-share option. +------------------------ + +This is the "send a single key share under tls1.3" option. This option +switches the default mode of sending multiple key shares, to send a +single one (the top one). + +post-handshake-auth option. +--------------------------- + +This is the "enable post-handshake authentication under tls1.3" option. +This option enables post-handshake authentication when under TLS1.3. + +inline-commands option. +----------------------- + +This is the "inline commands of the form ^<cmd>^" option. Enable inline +commands of the form ^<cmd>^. The inline commands are expected to be in +a line by themselves. The available commands are: resume, rekey1 (local +rekey), rekey (rekey on both peers) and renegotiate. + +inline-commands-prefix option. +------------------------------ + +This is the "change the default delimiter for inline commands" option. +This option takes a ArgumentType.STRING argument. Change the default +delimiter (^) used for inline commands. The delimiter is expected to be +a single US-ASCII character (octets 0 - 127). This option is only +relevant if inline commands are enabled via the inline-commands option + +provider option. +---------------- + +This is the "specify the pkcs #11 provider library" option. This option +takes a ArgumentType.FILE argument. This will override the default +options in /etc/gnutls/pkcs11.conf + +logfile option. +--------------- + +This is the "redirect informational messages to a specific file" option. +This option takes a ArgumentType.STRING argument. Redirect +informational messages to a specific file. The file may be /dev/null +also to make the gnutls client quiet to use it in piped server +connections where only the server communication may appear on stdout. + +waitresumption option. +---------------------- + +This is the "block waiting for the resumption data under tls1.3" option. +This option makes the client to block waiting for the resumption data +under TLS1.3. The option has effect only when -resume is provided. + +ca-auto-retrieve option. +------------------------ + +This is the "enable automatic retrieval of missing ca certificates" +option. This option enables the client to automatically retrieve the +missing intermediate CA certificates in the certificate chain, based on +the Authority Information Access (AIA) extension. + +version option (-v). +-------------------- + +This is the "output version information and exit" option. This option +takes a ArgumentType.KEYWORD argument. Output version of program and +exit. The default mode is 'v', a simple version. The 'c' mode will +print copyright information and 'n' will print the full copyright +notice. + +help option (-h). +----------------- + +This is the "display extended usage information and exit" option. +Display usage information and exit. + +more-help option (-!). +---------------------- + +This is the "extended usage information passed thru pager" option. Pass +the extended usage information through a pager. + +gnutls-cli exit status +---------------------- + +One of the following exit values will be returned: +'0 (EXIT_SUCCESS)' + Successful program execution. +'1 (EXIT_FAILURE)' + The operation failed or the command syntax was not valid. + +gnutls-cli See Also +................... + +gnutls-cli-debug(1), gnutls-serv(1) + +gnutls-cli Examples +................... + +Connecting using PSK authentication +----------------------------------- + +To connect to a server using PSK authentication, you need to enable the +choice of PSK by using a cipher priority parameter such as in the +example below. + $ ./gnutls-cli -p 5556 localhost --pskusername psk_identity \ + --pskkey 88f3824b3e5659f52d00e959bacab954b6540344 \ + --priority NORMAL:-KX-ALL:+ECDHE-PSK:+DHE-PSK:+PSK + Resolving 'localhost'... + Connecting to '127.0.0.1:5556'... + - PSK authentication. + - Version: TLS1.1 + - Key Exchange: PSK + - Cipher: AES-128-CBC + - MAC: SHA1 + - Compression: NULL + - Handshake was completed + + - Simple Client Mode: +By keeping the -pskusername parameter and removing the -pskkey +parameter, it will query only for the password during the handshake. + +Connecting using raw public-key authentication +---------------------------------------------- + +To connect to a server using raw public-key authentication, you need to +enable the option to negotiate raw public-keys via the priority strings +such as in the example below. + $ ./gnutls-cli -p 5556 localhost --priority NORMAL:-CTYPE-CLI-ALL:+CTYPE-CLI-RAWPK \ + --rawpkkeyfile cli.key.pem \ + --rawpkfile cli.rawpk.pem + Processed 1 client raw public key pair... + Resolving 'localhost'... + Connecting to '127.0.0.1:5556'... + - Successfully sent 1 certificate(s) to server. + - Server has requested a certificate. + - Certificate type: X.509 + - Got a certificate list of 1 certificates. + - Certificate[0] info: + - skipped + - Description: (TLS1.3-Raw Public Key-X.509)-(ECDHE-SECP256R1)-(RSA-PSS-RSAE-SHA256)-(AES-256-GCM) + - Options: + - Handshake was completed + + - Simple Client Mode: + +Connecting to STARTTLS services +------------------------------- + +You could also use the client to connect to services with starttls +capability. + $ gnutls-cli --starttls-proto smtp --port 25 localhost + +Listing ciphersuites in a priority string +----------------------------------------- + +To list the ciphersuites in a priority string: + $ ./gnutls-cli --priority SECURE192 -l + Cipher suites for SECURE192 + TLS_ECDHE_ECDSA_AES_256_CBC_SHA384 0xc0, 0x24 TLS1.2 + TLS_ECDHE_ECDSA_AES_256_GCM_SHA384 0xc0, 0x2e TLS1.2 + TLS_ECDHE_RSA_AES_256_GCM_SHA384 0xc0, 0x30 TLS1.2 + TLS_DHE_RSA_AES_256_CBC_SHA256 0x00, 0x6b TLS1.2 + TLS_DHE_DSS_AES_256_CBC_SHA256 0x00, 0x6a TLS1.2 + TLS_RSA_AES_256_CBC_SHA256 0x00, 0x3d TLS1.2 + + Certificate types: CTYPE-X.509 + Protocols: VERS-TLS1.2, VERS-TLS1.1, VERS-TLS1.0, VERS-SSL3.0, VERS-DTLS1.0 + Compression: COMP-NULL + Elliptic curves: CURVE-SECP384R1, CURVE-SECP521R1 + PK-signatures: SIGN-RSA-SHA384, SIGN-ECDSA-SHA384, SIGN-RSA-SHA512, SIGN-ECDSA-SHA512 + +Connecting using a PKCS #11 token +--------------------------------- + +To connect to a server using a certificate and a private key present in +a PKCS #11 token you need to substitute the PKCS 11 URLs in the +x509certfile and x509keyfile parameters. + +Those can be found using "p11tool -list-tokens" and then listing all the +objects in the needed token, and using the appropriate. + $ p11tool --list-tokens + + Token 0: + URL: pkcs11:model=PKCS15;manufacturer=MyMan;serial=1234;token=Test + Label: Test + Manufacturer: EnterSafe + Model: PKCS15 + Serial: 1234 + + $ p11tool --login --list-certs "pkcs11:model=PKCS15;manufacturer=MyMan;serial=1234;token=Test" + + Object 0: + URL: pkcs11:model=PKCS15;manufacturer=MyMan;serial=1234;token=Test;object=client;type=cert + Type: X.509 Certificate + Label: client + ID: 2a:97:0d:58:d1:51:3c:23:07:ae:4e:0d:72:26:03:7d:99:06:02:6a + + $ MYCERT="pkcs11:model=PKCS15;manufacturer=MyMan;serial=1234;token=Test;object=client;type=cert" + $ MYKEY="pkcs11:model=PKCS15;manufacturer=MyMan;serial=1234;token=Test;object=client;type=private" + $ export MYCERT MYKEY + + $ gnutls-cli www.example.com --x509keyfile $MYKEY --x509certfile $MYCERT +Notice that the private key only differs from the certificate in the +type. + + +File: gnutls.info, Node: gnutls-serv Invocation, Next: gnutls-cli-debug Invocation, Prev: gnutls-cli Invocation, Up: Other included programs + +Invoking gnutls-serv +==================== + +Server program that listens to incoming TLS connections. + +gnutls-serv help/usage ('-?') +----------------------------- + +The text printed is the same whether selected with the 'help' option +('--help') or the 'more-help' option ('--more-help'). 'more-help' will +print the usage text by passing it through a pager program. 'more-help' +is disabled on platforms without a working 'fork(2)' function. The +'PAGER' environment variable is used to select the program, defaulting +to 'more'. Both will exit with a status code of 0. + + gnutls-serv - GnuTLS server + Usage: gnutls-serv [ -<flag> [<val>] | --<name>[{=| }<val>] ]... + + None: + + -d, --debug=num Enable debugging + - it must be in the range: + 0 to 9999 + --sni-hostname=str Server's hostname for server name extension + --sni-hostname-fatal Send fatal alert on sni-hostname mismatch + --alpn=str Specify ALPN protocol to be enabled by the server + --alpn-fatal Send fatal alert on non-matching ALPN name + --noticket Don't accept session tickets + --earlydata Accept early data + --maxearlydata=num The maximum early data size to accept + - it must be in the range: + 1 to 2147483648 + --nocookie Don't require cookie on DTLS sessions + -g, --generate Generate Diffie-Hellman parameters + -q, --quiet Suppress some messages + --nodb Do not use a resumption database + --http Act as an HTTP server + --echo Act as an Echo server + --crlf Do not replace CRLF by LF in Echo server mode + -u, --udp Use DTLS (datagram TLS) over UDP + --mtu=num Set MTU for datagram TLS + - it must be in the range: + 0 to 17000 + --srtp-profiles=str Offer SRTP profiles + -a, --disable-client-cert Do not request a client certificate + - prohibits the option 'require-client-cert' + -r, --require-client-cert Require a client certificate + --verify-client-cert If a client certificate is sent then verify it + --compress-cert=str Compress certificate + -b, --heartbeat Activate heartbeat support + --x509fmtder Use DER format for certificates to read from + --priority=str Priorities string + --dhparams=file DH params file to use + - file must pre-exist + --x509cafile=str Certificate file or PKCS #11 URL to use + --x509crlfile=file CRL file to use + - file must pre-exist + --x509keyfile=str X.509 key file or PKCS #11 URL to use + --x509certfile=str X.509 Certificate file or PKCS #11 URL to use + --rawpkkeyfile=str Private key file (PKCS #8 or PKCS #12) or PKCS #11 URL to use + --rawpkfile=str Raw public-key file to use + - requires the option 'rawpkkeyfile' + --srppasswd=file SRP password file to use + - file must pre-exist + --srppasswdconf=file SRP password configuration file to use + - file must pre-exist + --pskpasswd=file PSK password file to use + - file must pre-exist + --pskhint=str PSK identity hint to use + --ocsp-response=str The OCSP response to send to client + --ignore-ocsp-response-errors Ignore any errors when setting the OCSP response + -p, --port=num The port to connect to + -l, --list Print a list of the supported algorithms and modes + --provider=file Specify the PKCS #11 provider library + - file must pre-exist + --keymatexport=str Label used for exporting keying material + --keymatexportsize=num Size of the exported keying material + --recordsize=num The maximum record size to advertise + - it must be in the range: + 0 to 16384 + --httpdata=file The data used as HTTP response + - file must pre-exist + + Version, usage and configuration options: + + -v, --version[=arg] output version information and exit + -h, --help display extended usage information and exit + -!, --more-help extended usage information passed thru pager + + Options are specified by doubled hyphens and their name or by a single + hyphen and the flag character. + + Server program that listens to incoming TLS connections. + + Please send bug reports to: <bugs@gnutls.org> + + +debug option (-d). +------------------ + +This is the "enable debugging" option. This option takes a +ArgumentType.NUMBER argument. Specifies the debug level. + +sni-hostname option. +-------------------- + +This is the "server's hostname for server name extension" option. This +option takes a ArgumentType.STRING argument. Server name of type +host_name that the server will recognise as its own. If the server +receives client hello with different name, it will send a warning-level +unrecognized_name alert. + +alpn option. +------------ + +This is the "specify alpn protocol to be enabled by the server" option. +This option takes a ArgumentType.STRING argument. Specify the (textual) +ALPN protocol for the server to use. + +require-client-cert option (-r). +-------------------------------- + +This is the "require a client certificate" option. This option before +3.6.0 used to imply -verify-client-cert. Since 3.6.0 it will no longer +verify the certificate by default. + +verify-client-cert option. +-------------------------- + +This is the "if a client certificate is sent then verify it" option. Do +not require, but if a client certificate is sent then verify it and +close the connection if invalid. + +compress-cert option. +--------------------- + +This is the "compress certificate" option. This option takes a +ArgumentType.STRING argument. This option sets a supported compression +method for certificate compression. + +heartbeat option (-b). +---------------------- + +This is the "activate heartbeat support" option. Regularly ping client +via heartbeat extension messages + +priority option. +---------------- + +This is the "priorities string" option. This option takes a +ArgumentType.STRING argument. TLS algorithms and protocols to enable. +You can use predefined sets of ciphersuites such as PERFORMANCE, NORMAL, +SECURE128, SECURE256. The default is NORMAL. + +Check the GnuTLS manual on section "Priority strings" for more +information on allowed keywords + +x509keyfile option. +------------------- + +This is the "x.509 key file or pkcs #11 url to use" option. This option +takes a ArgumentType.STRING argument. Specify the private key file or +URI to use; it must correspond to the certificate specified in +-x509certfile. Multiple keys and certificates can be specified with +this option and in that case each occurrence of keyfile must be followed +by the corresponding x509certfile or vice-versa. + +x509certfile option. +-------------------- + +This is the "x.509 certificate file or pkcs #11 url to use" option. +This option takes a ArgumentType.STRING argument. Specify the +certificate file or URI to use; it must correspond to the key specified +in -x509keyfile. Multiple keys and certificates can be specified with +this option and in that case each occurrence of keyfile must be followed +by the corresponding x509certfile or vice-versa. + +x509dsakeyfile option. +---------------------- + +This is an alias for the 'x509keyfile' option, *note the x509keyfile +option documentation: gnutls-serv x509keyfile. + +x509dsacertfile option. +----------------------- + +This is an alias for the 'x509certfile' option, *note the x509certfile +option documentation: gnutls-serv x509certfile. + +x509ecckeyfile option. +---------------------- + +This is an alias for the 'x509keyfile' option, *note the x509keyfile +option documentation: gnutls-serv x509keyfile. + +x509ecccertfile option. +----------------------- + +This is an alias for the 'x509certfile' option, *note the x509certfile +option documentation: gnutls-serv x509certfile. + +rawpkkeyfile option. +-------------------- + +This is the "private key file (pkcs #8 or pkcs #12) or pkcs #11 url to +use" option. This option takes a ArgumentType.STRING argument. Specify +the private key file or URI to use; it must correspond to the raw +public-key specified in -rawpkfile. Multiple key pairs can be specified +with this option and in that case each occurrence of keyfile must be +followed by the corresponding rawpkfile or vice-versa. + +In order to instruct the application to negotiate raw public keys one +must enable the respective certificate types via the priority strings +(i.e. CTYPE-CLI-* and CTYPE-SRV-* flags). + +Check the GnuTLS manual on section "Priority strings" for more +information on how to set certificate types. + +rawpkfile option. +----------------- + +This is the "raw public-key file to use" option. This option takes a +ArgumentType.STRING argument. + +This option has some usage constraints. It: + * must appear in combination with the following options: + rawpkkeyfile. + +Specify the raw public-key file to use; it must correspond to the +private key specified in -rawpkkeyfile. Multiple key pairs can be +specified with this option and in that case each occurrence of keyfile +must be followed by the corresponding rawpkfile or vice-versa. + +In order to instruct the application to negotiate raw public keys one +must enable the respective certificate types via the priority strings +(i.e. CTYPE-CLI-* and CTYPE-SRV-* flags). + +Check the GnuTLS manual on section "Priority strings" for more +information on how to set certificate types. + +ocsp-response option. +--------------------- + +This is the "the ocsp response to send to client" option. This option +takes a ArgumentType.STRING argument. If the client requested an OCSP +response, return data from this file to the client. + +ignore-ocsp-response-errors option. +----------------------------------- + +This is the "ignore any errors when setting the ocsp response" option. +That option instructs gnutls to not attempt to match the provided OCSP +responses with the certificates. + +list option (-l). +----------------- + +This is the "print a list of the supported algorithms and modes" option. +Print a list of the supported algorithms and modes. If a priority +string is given then only the enabled ciphersuites are shown. + +provider option. +---------------- + +This is the "specify the pkcs #11 provider library" option. This option +takes a ArgumentType.FILE argument. This will override the default +options in /etc/gnutls/pkcs11.conf + +version option (-v). +-------------------- + +This is the "output version information and exit" option. This option +takes a ArgumentType.KEYWORD argument. Output version of program and +exit. The default mode is 'v', a simple version. The 'c' mode will +print copyright information and 'n' will print the full copyright +notice. + +help option (-h). +----------------- + +This is the "display extended usage information and exit" option. +Display usage information and exit. + +more-help option (-!). +---------------------- + +This is the "extended usage information passed thru pager" option. Pass +the extended usage information through a pager. + +gnutls-serv exit status +----------------------- + +One of the following exit values will be returned: +'0 (EXIT_SUCCESS)' + Successful program execution. +'1 (EXIT_FAILURE)' + The operation failed or the command syntax was not valid. + +gnutls-serv See Also +.................... + +gnutls-cli-debug(1), gnutls-cli(1) + +gnutls-serv Examples +.................... + +Running your own TLS server based on GnuTLS can be useful when debugging +clients and/or GnuTLS itself. This section describes how to use +'gnutls-serv' as a simple HTTPS server. + +The most basic server can be started as: + + gnutls-serv --http --priority "NORMAL:+ANON-ECDH:+ANON-DH" + +It will only support anonymous ciphersuites, which many TLS clients +refuse to use. + +The next step is to add support for X.509. First we generate a CA: + + $ certtool --generate-privkey > x509-ca-key.pem + $ echo 'cn = GnuTLS test CA' > ca.tmpl + $ echo 'ca' >> ca.tmpl + $ echo 'cert_signing_key' >> ca.tmpl + $ certtool --generate-self-signed --load-privkey x509-ca-key.pem \ + --template ca.tmpl --outfile x509-ca.pem + +Then generate a server certificate. Remember to change the dns_name +value to the name of your server host, or skip that command to avoid the +field. + + $ certtool --generate-privkey > x509-server-key.pem + $ echo 'organization = GnuTLS test server' > server.tmpl + $ echo 'cn = test.gnutls.org' >> server.tmpl + $ echo 'tls_www_server' >> server.tmpl + $ echo 'encryption_key' >> server.tmpl + $ echo 'signing_key' >> server.tmpl + $ echo 'dns_name = test.gnutls.org' >> server.tmpl + $ certtool --generate-certificate --load-privkey x509-server-key.pem \ + --load-ca-certificate x509-ca.pem --load-ca-privkey x509-ca-key.pem \ + --template server.tmpl --outfile x509-server.pem + +For use in the client, you may want to generate a client certificate as +well. + + $ certtool --generate-privkey > x509-client-key.pem + $ echo 'cn = GnuTLS test client' > client.tmpl + $ echo 'tls_www_client' >> client.tmpl + $ echo 'encryption_key' >> client.tmpl + $ echo 'signing_key' >> client.tmpl + $ certtool --generate-certificate --load-privkey x509-client-key.pem \ + --load-ca-certificate x509-ca.pem --load-ca-privkey x509-ca-key.pem \ + --template client.tmpl --outfile x509-client.pem + +To be able to import the client key/certificate into some applications, +you will need to convert them into a PKCS#12 structure. This also +encrypts the security sensitive key with a password. + + $ certtool --to-p12 --load-ca-certificate x509-ca.pem \ + --load-privkey x509-client-key.pem --load-certificate x509-client.pem \ + --outder --outfile x509-client.p12 + +For icing, we'll create a proxy certificate for the client too. + + $ certtool --generate-privkey > x509-proxy-key.pem + $ echo 'cn = GnuTLS test client proxy' > proxy.tmpl + $ certtool --generate-proxy --load-privkey x509-proxy-key.pem \ + --load-ca-certificate x509-client.pem --load-ca-privkey x509-client-key.pem \ + --load-certificate x509-client.pem --template proxy.tmpl \ + --outfile x509-proxy.pem + +Then start the server again: + + $ gnutls-serv --http \ + --x509cafile x509-ca.pem \ + --x509keyfile x509-server-key.pem \ + --x509certfile x509-server.pem + +Try connecting to the server using your web browser. Note that the +server listens to port 5556 by default. + +While you are at it, to allow connections using ECDSA, you can also +create a ECDSA key and certificate for the server. These credentials +will be used in the final example below. + + $ certtool --generate-privkey --ecdsa > x509-server-key-ecc.pem + $ certtool --generate-certificate --load-privkey x509-server-key-ecc.pem \ + --load-ca-certificate x509-ca.pem --load-ca-privkey x509-ca-key.pem \ + --template server.tmpl --outfile x509-server-ecc.pem + +The next step is to add support for SRP authentication. This requires +an SRP password file created with 'srptool'. To start the server with +SRP support: + + gnutls-serv --http --priority NORMAL:+SRP-RSA:+SRP \ + --srppasswdconf srp-tpasswd.conf \ + --srppasswd srp-passwd.txt + +Let's also start a server with support for PSK. This would require a +password file created with 'psktool'. + + gnutls-serv --http --priority NORMAL:+ECDHE-PSK:+PSK \ + --pskpasswd psk-passwd.txt + +If you want a server with support for raw public-keys we can also add +these credentials. Note however that there is no identity information +linked to these keys as is the case with regular x509 certificates. +Authentication must be done via different means. Also we need to +explicitly enable raw public-key certificates via the priority strings. + + gnutls-serv --http --priority NORMAL:+CTYPE-CLI-RAWPK:+CTYPE-SRV-RAWPK \ + --rawpkfile srv.rawpk.pem \ + --rawpkkeyfile srv.key.pem + +Finally, we start the server with all the earlier parameters and you get +this command: + + gnutls-serv --http --priority NORMAL:+PSK:+SRP:+CTYPE-CLI-RAWPK:+CTYPE-SRV-RAWPK \ + --x509cafile x509-ca.pem \ + --x509keyfile x509-server-key.pem \ + --x509certfile x509-server.pem \ + --x509keyfile x509-server-key-ecc.pem \ + --x509certfile x509-server-ecc.pem \ + --srppasswdconf srp-tpasswd.conf \ + --srppasswd srp-passwd.txt \ + --pskpasswd psk-passwd.txt \ + --rawpkfile srv.rawpk.pem \ + --rawpkkeyfile srv.key.pem + + +File: gnutls.info, Node: gnutls-cli-debug Invocation, Prev: gnutls-serv Invocation, Up: Other included programs + +Invoking gnutls-cli-debug +========================= + +TLS debug client. It sets up multiple TLS connections to a server and +queries its capabilities. It was created to assist in debugging GnuTLS, +but it might be useful to extract a TLS server's capabilities. It +connects to a TLS server, performs tests and print the server's +capabilities. If called with the '-V' parameter more checks will be +performed. Can be used to check for servers with special needs or bugs. + +gnutls-cli-debug help/usage ('-?') +---------------------------------- + +The text printed is the same whether selected with the 'help' option +('--help') or the 'more-help' option ('--more-help'). 'more-help' will +print the usage text by passing it through a pager program. 'more-help' +is disabled on platforms without a working 'fork(2)' function. The +'PAGER' environment variable is used to select the program, defaulting +to 'more'. Both will exit with a status code of 0. + + gnutls-cli-debug - GnuTLS debug client + Usage: gnutls-cli-debug [ -<flag> [<val>] | --<name>[{=| }<val>] ]... [hostname] + + None: + + -d, --debug=num Enable debugging + - it must be in the range: + 0 to 9999 + -V, --verbose More verbose output + -p, --port=num The port to connect to + - it must be in the range: + 0 to 65536 + --app-proto an alias for the 'starttls-proto' option + --starttls-proto=str The application protocol to be used to obtain the server's certificate (https, ftp, smtp, imap, ldap, xmpp, lmtp, pop3, nntp, sieve, postgres) + + Version, usage and configuration options: + + -v, --version[=arg] output version information and exit + -h, --help display extended usage information and exit + -!, --more-help extended usage information passed thru pager + + Options are specified by doubled hyphens and their name or by a single + hyphen and the flag character. + Operands and options may be intermixed. They will be reordered. + + TLS debug client. It sets up multiple TLS connections to + a server and queries its capabilities. It was created to assist in debugging + GnuTLS, but it might be useful to extract a TLS server's capabilities. + It connects to a TLS server, performs tests and print the server's + capabilities. If called with the `-V' parameter more checks will be performed. + Can be used to check for servers with special needs or bugs. + + Please send bug reports to: <bugs@gnutls.org> + + +debug option (-d). +------------------ + +This is the "enable debugging" option. This option takes a +ArgumentType.NUMBER argument. Specifies the debug level. + +app-proto option. +----------------- + +This is an alias for the 'starttls-proto' option, *note the +starttls-proto option documentation: gnutls-cli-debug starttls-proto. + +starttls-proto option. +---------------------- + +This is the "the application protocol to be used to obtain the server's +certificate (https, ftp, smtp, imap, ldap, xmpp, lmtp, pop3, nntp, +sieve, postgres)" option. This option takes a ArgumentType.STRING +argument. Specify the application layer protocol for STARTTLS. If the +protocol is supported, gnutls-cli will proceed to the TLS negotiation. + +version option (-v). +-------------------- + +This is the "output version information and exit" option. This option +takes a ArgumentType.KEYWORD argument. Output version of program and +exit. The default mode is 'v', a simple version. The 'c' mode will +print copyright information and 'n' will print the full copyright +notice. + +help option (-h). +----------------- + +This is the "display extended usage information and exit" option. +Display usage information and exit. + +more-help option (-!). +---------------------- + +This is the "extended usage information passed thru pager" option. Pass +the extended usage information through a pager. + +gnutls-cli-debug exit status +---------------------------- + +One of the following exit values will be returned: +'0 (EXIT_SUCCESS)' + Successful program execution. +'1 (EXIT_FAILURE)' + The operation failed or the command syntax was not valid. + +gnutls-cli-debug See Also +......................... + +gnutls-cli(1), gnutls-serv(1) + +gnutls-cli-debug Examples +......................... + + $ gnutls-cli-debug localhost + GnuTLS debug client 3.5.0 + Checking localhost:443 + for SSL 3.0 (RFC6101) support... yes + whether we need to disable TLS 1.2... no + whether we need to disable TLS 1.1... no + whether we need to disable TLS 1.0... no + whether %NO_EXTENSIONS is required... no + whether %COMPAT is required... no + for TLS 1.0 (RFC2246) support... yes + for TLS 1.1 (RFC4346) support... yes + for TLS 1.2 (RFC5246) support... yes + fallback from TLS 1.6 to... TLS1.2 + for RFC7507 inappropriate fallback... yes + for HTTPS server name... Local + for certificate chain order... sorted + for safe renegotiation (RFC5746) support... yes + for Safe renegotiation support (SCSV)... no + for encrypt-then-MAC (RFC7366) support... no + for ext master secret (RFC7627) support... no + for heartbeat (RFC6520) support... no + for version rollback bug in RSA PMS... dunno + for version rollback bug in Client Hello... no + whether the server ignores the RSA PMS version... yes + whether small records (512 bytes) are tolerated on handshake... yes + whether cipher suites not in SSL 3.0 spec are accepted... yes + whether a bogus TLS record version in the client hello is accepted... yes + whether the server understands TLS closure alerts... partially + whether the server supports session resumption... yes + for anonymous authentication support... no + for ephemeral Diffie-Hellman support... no + for ephemeral EC Diffie-Hellman support... yes + ephemeral EC Diffie-Hellman group info... SECP256R1 + for AES-128-GCM cipher (RFC5288) support... yes + for AES-128-CCM cipher (RFC6655) support... no + for AES-128-CCM-8 cipher (RFC6655) support... no + for AES-128-CBC cipher (RFC3268) support... yes + for CAMELLIA-128-GCM cipher (RFC6367) support... no + for CAMELLIA-128-CBC cipher (RFC5932) support... no + for 3DES-CBC cipher (RFC2246) support... yes + for ARCFOUR 128 cipher (RFC2246) support... yes + for MD5 MAC support... yes + for SHA1 MAC support... yes + for SHA256 MAC support... yes + for ZLIB compression support... no + for max record size (RFC6066) support... no + for OCSP status response (RFC6066) support... no + for OpenPGP authentication (RFC6091) support... no + +You could also use the client to debug services with starttls +capability. + $ gnutls-cli-debug --starttls-proto smtp --port 25 localhost + + +File: gnutls.info, Node: Internal architecture of GnuTLS, Next: Upgrading from previous versions, Prev: Other included programs, Up: Top + +11 Internal Architecture of GnuTLS +********************************** + +This chapter is to give a brief description of the way GnuTLS works. +The focus is to give an idea to potential developers and those who want +to know what happens inside the black box. + +* Menu: + +* The TLS Protocol:: +* TLS Handshake Protocol:: +* TLS Authentication Methods:: +* TLS Hello Extension Handling:: +* Cryptographic Backend:: +* Random Number Generators-internals:: +* FIPS140-2 mode:: + + +File: gnutls.info, Node: The TLS Protocol, Next: TLS Handshake Protocol, Up: Internal architecture of GnuTLS + +11.1 The TLS Protocol +===================== + +The main use case for the TLS protocol is shown in *note Figure 11.1: +fig-client-server. A user of a library implementing the protocol +expects no less than this functionality, i.e., to be able to set +parameters such as the accepted security level, perform a negotiation +with the peer and be able to exchange data. + + + + + +Figure 11.1: TLS protocol use case. + + +File: gnutls.info, Node: TLS Handshake Protocol, Next: TLS Authentication Methods, Prev: The TLS Protocol, Up: Internal architecture of GnuTLS + +11.2 TLS Handshake Protocol +=========================== + +The GnuTLS handshake protocol is implemented as a state machine that +waits for input or returns immediately when the non-blocking transport +layer functions are used. The main idea is shown in *note Figure 11.2: +fig-gnutls-handshake. + + + + + +Figure 11.2: GnuTLS handshake state machine. + +Also the way the input is processed varies per ciphersuite. Several +implementations of the internal handlers are available and *note +gnutls_handshake:: only multiplexes the input to the appropriate +handler. For example a PSK ciphersuite has a different implementation +of the 'process_client_key_exchange' than a certificate ciphersuite. We +illustrate the idea in *note Figure 11.3: fig-gnutls-handshake-sequence. + + + + + +Figure 11.3: GnuTLS handshake process sequence. + + +File: gnutls.info, Node: TLS Authentication Methods, Next: TLS Hello Extension Handling, Prev: TLS Handshake Protocol, Up: Internal architecture of GnuTLS + +11.3 TLS Authentication Methods +=============================== + +In GnuTLS authentication methods can be implemented quite easily. Since +the required changes to add a new authentication method affect only the +handshake protocol, a simple interface is used. An authentication +method needs to implement the functions shown below. + +typedef struct +{ + const char *name; + int (*gnutls_generate_server_certificate) (gnutls_session_t, gnutls_buffer_st*); + int (*gnutls_generate_client_certificate) (gnutls_session_t, gnutls_buffer_st*); + int (*gnutls_generate_server_kx) (gnutls_session_t, gnutls_buffer_st*); + int (*gnutls_generate_client_kx) (gnutls_session_t, gnutls_buffer_st*); + int (*gnutls_generate_client_cert_vrfy) (gnutls_session_t, gnutls_buffer_st *); + int (*gnutls_generate_server_certificate_request) (gnutls_session_t, + gnutls_buffer_st *); + + int (*gnutls_process_server_certificate) (gnutls_session_t, opaque *, + size_t); + int (*gnutls_process_client_certificate) (gnutls_session_t, opaque *, + size_t); + int (*gnutls_process_server_kx) (gnutls_session_t, opaque *, size_t); + int (*gnutls_process_client_kx) (gnutls_session_t, opaque *, size_t); + int (*gnutls_process_client_cert_vrfy) (gnutls_session_t, opaque *, size_t); + int (*gnutls_process_server_certificate_request) (gnutls_session_t, + opaque *, size_t); +} mod_auth_st; + +Those functions are responsible for the interpretation of the handshake +protocol messages. It is common for such functions to read data from +one or more 'credentials_t' structures(1) and write data, such as +certificates, usernames etc. to 'auth_info_t' structures. + +Simple examples of existing authentication methods can be seen in +'auth/psk.c' for PSK ciphersuites and 'auth/srp.c' for SRP ciphersuites. +After implementing these functions the structure holding its pointers +has to be registered in 'gnutls_algorithms.c' in the +'_gnutls_kx_algorithms' structure. + + ---------- Footnotes ---------- + + (1) such as the 'gnutls_certificate_credentials_t' structures + + +File: gnutls.info, Node: TLS Hello Extension Handling, Next: Cryptographic Backend, Prev: TLS Authentication Methods, Up: Internal architecture of GnuTLS + +11.4 TLS Extension Handling +=========================== + +As with authentication methods, adding TLS hello extensions can be done +quite easily by implementing the interface shown below. + +typedef int (*gnutls_ext_recv_func) (gnutls_session_t session, + const unsigned char *data, size_t len); +typedef int (*gnutls_ext_send_func) (gnutls_session_t session, + gnutls_buffer_st *extdata); + +Here there are two main functions, one for parsing the received +extension data and one for formatting the extension data that must be +send. These functions have to check internally whether they operate +within a client or a server session. + +A simple example of an extension handler can be seen in 'lib/ext/srp.c' +in GnuTLS' source code. After implementing these functions, the +extension has to be registered. Registering an extension can be done in +two ways. You can create a GnuTLS internal extension and register it in +'hello_ext.c' or write an external extension (not inside GnuTLS but +inside an application using GnuTLS) and register it via the exported +functions *note gnutls_session_ext_register:: or *note +gnutls_ext_register::. + +Adding a new TLS hello extension +-------------------------------- + +Adding support for a new TLS hello extension is done from time to time, +and the process to do so is not difficult. Here are the steps you need +to follow if you wish to do this yourself. For the sake of discussion, +let's consider adding support for the hypothetical TLS extension +'foobar'. The following section is about adding an hello extension to +GnuTLS itself. For custom application extensions you should check the +exported functions *note gnutls_session_ext_register:: or *note +gnutls_ext_register::. + +Add 'configure' option like '--enable-foobar' or '--disable-foobar'. +.................................................................... + +This step is useful when the extension code is large and it might be +desirable under some circumstances to be able to leave out the extension +during compilation of GnuTLS. If you don't need this kind of feature +this step can be safely skipped. + +Whether to choose enable or disable depends on whether you intend to +make the extension be enabled by default. Look at existing checks +(i.e., SRP, authz) for how to model the code. For example: + + AC_MSG_CHECKING([whether to disable foobar support]) + AC_ARG_ENABLE(foobar, + AS_HELP_STRING([--disable-foobar], + [disable foobar support]), + ac_enable_foobar=no) + if test x$ac_enable_foobar != xno; then + AC_MSG_RESULT(no) + AC_DEFINE(ENABLE_FOOBAR, 1, [enable foobar]) + else + ac_full=0 + AC_MSG_RESULT(yes) + fi + AM_CONDITIONAL(ENABLE_FOOBAR, test "$ac_enable_foobar" != "no") + +These lines should go in 'lib/m4/hooks.m4'. + +Add an extension identifier to 'extensions_t' in 'gnutls_int.h'. +................................................................ + +A good name for the identifier would be GNUTLS_EXTENSION_FOOBAR. If the +extension that you are implementing is an extension that is officially +registered by IANA then it is recommended to use its official name such +that the extension can be correctly identified by other developers. +Check with <https://www.iana.org/assignments/tls-extensiontype-values> +for registered extensions. + +Register the extension in 'lib/hello_ext.c'. +............................................ + +In order for the extension to be executed you need to register it in the +'static hello_ext_entry_st const *extfunc[]' list in 'lib/hello_ext.c'. + +A typical entry would be: + + #ifdef ENABLE_FOOBAR + [GNUTLS_EXTENSION_FOOBAR] = &ext_mod_foobar, + #endif + +Also for every extension you need to create an 'hello_ext_entry_st' that +describes the extension. This structure is placed in the designated c +file for your extension and its name is used in the registration entry +as depicted above. + +The structure of 'hello_ext_entry_st' is as follows: + const hello_ext_entry_st ext_mod_foobar = { + .name = "FOOBAR", + .tls_id = 255, + .gid = GNUTLS_EXTENSION_FOOBAR, + .parse_type = GNUTLS_EXT_TLS, + .validity = GNUTLS_EXT_FLAG_CLIENT_HELLO | + GNUTLS_EXT_FLAG_TLS12_SERVER_HELLO | + GNUTLS_EXT_FLAG_TLS13_SERVER_HELLO | + GNUTLS_EXT_FLAG_TLS, + .recv_func = _gnutls_foobar_recv_params, + .send_func = _gnutls_foobar_send_params, + .pack_func = _gnutls_foobar_pack, + .unpack_func = _gnutls_foobar_unpack, + .deinit_func = _gnutls_foobar_deinit, + .cannot_be_overriden = 1 + }; + +The GNUTLS_EXTENSION_FOOBAR is the identifier that you've added to +'gnutls_int.h' earlier. The '.tls_id' should contain the number that +IANA has assigned to this extension, or an unassigned number of your +choice if this is an unregistered extension. In the rest of this +structure you specify the functions to handle the extension data. The +'receive' function will be called upon reception of the data and will be +used to parse or interpret the extension data. The 'send' function will +be called prior to sending the extension data on the wire and will be +used to format the data such that it can be send over the wire. The +'pack' and 'unpack' functions will be used to prepare the data for +storage in case of session resumption (and vice versa). The 'deinit' +function will be called to deinitialize the extension's private +parameters, if any. + +Look at 'gnutls_ext_parse_type_t' and 'gnutls_ext_flags_t' for a +complete list of available flags. + +Note that the conditional 'ENABLE_FOOBAR' definition should only be used +if step 1 with the 'configure' options has taken place. + +Add new files that implement the hello extension. +................................................. + +To keep things structured every extension should have its own files. +The functions that you should (at least) add are those referenced in the +struct from the previous step. Use descriptive file names such as +'lib/ext/foobar.c' and for the corresponding header 'lib/ext/foobar.h'. +As a starter, you could add this: + + int + _gnutls_foobar_recv_params (gnutls_session_t session, const uint8_t * data, + size_t data_size) + { + return 0; + } + + int + _gnutls_foobar_send_params (gnutls_session_t session, gnutls_buffer_st* data) + { + return 0; + } + + int + _gnutls_foobar_pack (extension_priv_data_t epriv, gnutls_buffer_st * ps) + { + /* Append the extension's internal state to buffer */ + return 0; + } + + int + _gnutls_foobar_unpack (gnutls_buffer_st * ps, extension_priv_data_t * epriv) + { + /* Read the internal state from buffer */ + return 0; + } + +The '_gnutls_foobar_recv_params' function is responsible for parsing +incoming extension data (both in the client and server). + +The '_gnutls_foobar_send_params' function is responsible for formatting +extension data such that it can be send over the wire (both in the +client and server). It should append data to provided buffer and return +a positive (or zero) number on success or a negative error code. +Previous to 3.6.0 versions of GnuTLS required that function to return +the number of bytes that were written. If zero is returned and no bytes +are appended the extension will not be sent. If a zero byte extension +is to be sent this function must return 'GNUTLS_E_INT_RET_0'. + +If you receive length fields that don't match, return +'GNUTLS_E_UNEXPECTED_PACKET_LENGTH'. If you receive invalid data, +return 'GNUTLS_E_RECEIVED_ILLEGAL_PARAMETER'. You can use other error +codes from the list in *note Error codes::. Return 0 on success. + +An extension typically stores private information in the 'session' data +for later usage. That can be done using the functions +'_gnutls_hello_ext_set_datum' and '_gnutls_hello_ext_get_datum'. You +can check simple examples at 'lib/ext/max_record.c' and +'lib/ext/server_name.c' extensions. That private information can be +saved and restored across session resumption if the following functions +are set: + +The '_gnutls_foobar_pack' function is responsible for packing internal +extension data to save them in the session resumption storage. + +The '_gnutls_foobar_unpack' function is responsible for restoring +session data from the session resumption storage. + +When the internal data is stored using the +'_gnutls_hello_ext_set_datum', then you can rely on the default pack and +unpack functions: '_gnutls_hello_ext_default_pack' and +'_gnutls_hello_ext_default_unpack'. + +Recall that both for the client and server, the send and receive +functions most likely will need to do different things depending on +which mode they are in. It may be useful to make this distinction +explicit in the code. Thus, for example, a better template than above +would be: + + int + _gnutls_foobar_recv_params (gnutls_session_t session, + const uint8_t * data, + size_t data_size) + { + if (session->security_parameters.entity == GNUTLS_CLIENT) + return foobar_recv_client (session, data, data_size); + else + return foobar_recv_server (session, data, data_size); + } + + int + _gnutls_foobar_send_params (gnutls_session_t session, + gnutls_buffer_st * data) + { + if (session->security_parameters.entity == GNUTLS_CLIENT) + return foobar_send_client (session, data); + else + return foobar_send_server (session, data); + } + +The functions used would be declared as 'static' functions, of the +appropriate prototype, in the same file. + +When adding the new extension files, you'll need to add them to +'lib/ext/Makefile.am' as well, for example: + + if ENABLE_FOOBAR + libgnutls_ext_la_SOURCES += ext/foobar.c ext/foobar.h + endif + +Add API functions to use the extension. +....................................... + +It might be desirable to allow users of the extension to request the use +of the extension, or set extension specific data. This can be +implemented by adding extension specific function calls that can be +added to 'includes/gnutls/gnutls.h', as long as the LGPLv2.1+ applies. +The implementation of these functions should lie in the +'lib/ext/foobar.c' file. + +To make the API available in the shared library you need to add the +added symbols in 'lib/libgnutls.map', so that the symbols are exported +properly. + +When writing GTK-DOC style documentation for your new APIs, don't forget +to add 'Since:' tags to indicate the GnuTLS version the API was +introduced in. + +Adding a new Supplemental Data Handshake Message +------------------------------------------------ + +TLS handshake extensions allow to send so called supplemental data +handshake messages [*note RFC4680::]. This short section explains how +to implement a supplemental data handshake message for a given TLS +extension. + +First of all, modify your extension 'foobar' in the way, to instruct the +handshake process to send and receive supplemental data, as shown below. + + int + _gnutls_foobar_recv_params (gnutls_session_t session, const opaque * data, + size_t _data_size) + { + ... + gnutls_supplemental_recv(session, 1); + ... + } + + int + _gnutls_foobar_send_params (gnutls_session_t session, gnutls_buffer_st *extdata) + { + ... + gnutls_supplemental_send(session, 1); + ... + } + +Furthermore you'll need two new functions '_foobar_supp_recv_params' and +'_foobar_supp_send_params', which must conform to the following +prototypes. + + typedef int (*gnutls_supp_recv_func)(gnutls_session_t session, + const unsigned char *data, + size_t data_size); + typedef int (*gnutls_supp_send_func)(gnutls_session_t session, + gnutls_buffer_t buf); + +The following example code shows how to send a "Hello World" string in +the supplemental data handshake message. + + int + _foobar_supp_recv_params(gnutls_session_t session, const opaque *data, size_t _data_size) + { + uint8_t len = _data_size; + unsigned char *msg; + + msg = gnutls_malloc(len); + if (msg == NULL) return GNUTLS_E_MEMORY_ERROR; + + memcpy(msg, data, len); + msg[len]='\0'; + + /* do something with msg */ + gnutls_free(msg); + + return len; + } + + int + _foobar_supp_send_params(gnutls_session_t session, gnutls_buffer_t buf) + { + unsigned char *msg = "hello world"; + int len = strlen(msg); + + if (gnutls_buffer_append_data(buf, msg, len) < 0) + abort(); + + return len; + } + +Afterwards, register the new supplemental data using *note +gnutls_session_supplemental_register::, or *note +gnutls_supplemental_register:: at some point in your program. + + +File: gnutls.info, Node: Cryptographic Backend, Next: Random Number Generators-internals, Prev: TLS Hello Extension Handling, Up: Internal architecture of GnuTLS + +11.5 Cryptographic Backend +========================== + +Today most new processors, either for embedded or desktop systems +include either instructions intended to speed up cryptographic +operations, or a co-processor with cryptographic capabilities. Taking +advantage of those is a challenging task for every cryptographic +application or library. GnuTLS handles the cryptographic provider in a +modular way, following a layered approach to access cryptographic +operations as in *note Figure 11.4: fig-crypto-layers. + + + + + +Figure 11.4: GnuTLS cryptographic back-end design. + +The TLS layer uses a cryptographic provider layer, that will in turn +either use the default crypto provider - a software crypto library, or +use an external crypto provider, if available in the local system. The +reason of handling the external cryptographic provider in GnuTLS and not +delegating it to the cryptographic libraries, is that none of the +supported cryptographic libraries support '/dev/crypto' or CPU-optimized +cryptography in an efficient way. + +Cryptographic library layer +--------------------------- + +The Cryptographic library layer, currently supports only libnettle. +Older versions of GnuTLS used to support libgcrypt, but it was switched +with nettle mainly for performance reasons(1) and secondary because it +is a simpler library to use. In the future other cryptographic +libraries might be supported as well. + +External cryptography provider +------------------------------ + +Systems that include a cryptographic co-processor, typically come with +kernel drivers to utilize the operations from software. For this reason +GnuTLS provides a layer where each individual algorithm used can be +replaced by another implementation, i.e., the one provided by the +driver. The FreeBSD, OpenBSD and Linux kernels(2) include already a +number of hardware assisted implementations, and also provide an +interface to access them, called '/dev/crypto'. GnuTLS will take +advantage of this interface if compiled with special options. That is +because in most systems where hardware-assisted cryptographic operations +are not available, using this interface might actually harm performance. + +In systems that include cryptographic instructions with the CPU's +instructions set, using the kernel interface will introduce an unneeded +layer. For this reason GnuTLS includes such optimizations found in +popular processors such as the AES-NI or VIA PADLOCK instruction sets. +This is achieved using a mechanism that detects CPU capabilities and +overrides parts of crypto back-end at runtime. The next section +discusses the registration of a detected algorithm optimization. For +more information please consult the GnuTLS source code in +'lib/accelerated/'. + +Overriding specific algorithms +.............................. + +When an optimized implementation of a single algorithm is available, say +a hardware assisted version of AES-CBC then the following functions, +from 'crypto.h', can be used to register those algorithms. + + * *note gnutls_crypto_register_cipher::: To register a cipher + algorithm. + + * *note gnutls_crypto_register_aead_cipher::: To register an AEAD + cipher algorithm. + + * *note gnutls_crypto_register_mac::: To register a MAC algorithm. + + * *note gnutls_crypto_register_digest::: To register a hash + algorithm. + +Those registration functions will only replace the specified algorithm +and leave the rest of subsystem intact. + +Protecting keys through isolation +--------------------------------- + +For asymmetric or public keys, GnuTLS supports PKCS #11 which allows +operation without access to long term keys, in addition to CPU +offloading. For more information see *note Hardware security modules +and abstract key types::. + + ---------- Footnotes ---------- + + (1) See +<https://lists.gnu.org/archive/html/gnutls-devel/2011-02/msg00079.html>. + + (2) Check <https://home.gna.org/cryptodev-linux/> for the Linux +kernel implementation of '/dev/crypto'. + + +File: gnutls.info, Node: Random Number Generators-internals, Next: FIPS140-2 mode, Prev: Cryptographic Backend, Up: Internal architecture of GnuTLS + +11.6 Random Number Generators +============================= + +About the generators +-------------------- + +GnuTLS provides two random generators. The default, and the AES-DRBG +random generator which is only used when the library is compiled with +support for FIPS140-2 and the system is in FIPS140-2 mode. + +The default generator - inner workings +-------------------------------------- + +The random number generator levels in 'gnutls_rnd_level_t' map to two +CHACHA-based random generators which are initially seeded using the OS +random device, e.g., '/dev/urandom' or 'getrandom()'. These random +generators are unique per thread, and are automatically re-seeded when a +fork is detected. + +The reason the CHACHA cipher was selected for the GnuTLS' PRNG is the +fact that CHACHA is considered a secure and fast stream cipher, and is +already defined for use in TLS protocol. As such, the utilization of it +would not stress the CPU caches, and would allow for better performance +on busy servers, irrespective of their architecture (e.g., even if AES +is not available with an optimized instruction set). + +The generators are unique per thread to allow lock-free operation. That +induces a cost of around 140-bytes for the state of the generators per +thread, on threads that would utilize *note gnutls_rnd::. At the same +time it allows fast and lock-free access to the generators. The +lock-free access benefits servers which utilize more than 4 threads, +while imposes no cost on single threaded processes. + +On the first call to *note gnutls_rnd:: the generators are seeded with +two independent keys obtained from the OS random device. Their seed is +used to output a fixed amount of bytes before re-seeding; the number of +bytes output varies per generator. + +One generator is dedicated for the 'GNUTLS_RND_NONCE' level, and the +second is shared for the 'GNUTLS_RND_KEY' and 'GNUTLS_RND_RANDOM' +levels. For the rest of this section we refer to the first as the nonce +generator and the second as the key generator. + +The nonce generator will reseed after outputting a fixed amount of bytes +(typically few megabytes), or after few hours of operation without +reaching the limit has passed. It is being re-seed using the key +generator to obtain a new key for the CHACHA cipher, which is mixed with +its old one. + +Similarly, the key generator, will also re-seed after a fixed amount of +bytes is generated (typically less than the nonce), and will also +re-seed based on time, i.e., after few hours of operation without +reaching the limit for a re-seed. For its re-seed it mixes mixes data +obtained from the OS random device with the previous key. + +Although the key generator used to provide data for the +'GNUTLS_RND_RANDOM' and 'GNUTLS_RND_KEY' levels is identical, when used +with the 'GNUTLS_RND_KEY' level a re-key of the PRNG using its own +output, is additionally performed. That ensures that the recovery of +the PRNG state will not be sufficient to recover previously generated +values. + +The AES-DRBG generator - inner workings +--------------------------------------- + +Similar with the default generator, the random number generator levels +in 'gnutls_rnd_level_t' map to two AES-DRBG random generators which are +initially seeded using the OS random device, e.g., '/dev/urandom' or +'getrandom()'. These random generators are unique per thread, and are +automatically re-seeded when a fork is detected. + +The AES-DRBG generator is based on the AES cipher in counter mode and is +re-seeded after a fixed amount of bytes are generated. + +Defense against PRNG attacks +---------------------------- + +This section describes the counter-measures available in the +Pseudo-random number generator (PRNG) of GnuTLS for known attacks as +described in [*note PRNGATTACKS::]. Note that, the attacks on a PRNG +such as state-compromise, assume a quite powerful adversary which has in +practice access to the PRNG state. + +Cryptanalytic +............. + +To defend against cryptanalytic attacks GnuTLS' PRNG is a stream cipher +designed to defend against the same attacks. As such, GnuTLS' PRNG +strength with regards to this attack relies on the underlying crypto +block, which at the time of writing is CHACHA. That is easily +replaceable in the future if attacks are found to be possible in that +cipher. + +Input-based attacks +................... + +These attacks assume that the attacker can influence the input that is +used to form the state of the PRNG. To counter these attacks GnuTLS does +not gather input from the system environment but rather relies on the OS +provided random generator. That is the '/dev/urandom' or +'getentropy'/'getrandom' system calls. As such, GnuTLS' PRNG is as +strong as the system random generator can assure with regards to +input-based attacks. + +State-compromise: Backtracking +.............................. + +A backtracking attack, assumes that an adversary obtains at some point +of time access to the generator state, and wants to recover past bytes. +As the GnuTLS generator is fine-tuned to provide multiple levels, such +an attack mainly concerns levels 'GNUTLS_RND_RANDOM' and +'GNUTLS_RND_KEY', since 'GNUTLS_RND_NONCE' is intended to output +non-secret data. The 'GNUTLS_RND_RANDOM' generator at the time of +writing can output 2MB prior to being re-seeded thus this is its upper +bound for previously generated data recovered using this attack. That +assumes that the state of the operating system random generator is +unknown to the attacker, and we carry that assumption on the next +paragraphs. The usage of 'GNUTLS_RND_KEY' level ensures that no +backtracking is possible for all output data, by re-keying the PRNG +using its own output. + +Such an attack reflects the real world scenario where application's +memory is temporarily compromised, while the kernel's memory is +inaccessible. + +State-compromise: Permanent Compromise Attack +............................................. + +A permanent compromise attack implies that once an attacker compromises +the state of GnuTLS' random generator at a specific time, future and +past outputs from the generator are compromised. For past outputs the +previous paragraph applies. For future outputs, both the +'GNUTLS_RND_RANDOM' and the 'GNUTLS_RND_KEY' will recover after 2MB of +data have been generated or few hours have passed (two at the time of +writing). Similarly the 'GNUTLS_RND_NONCE' level generator will recover +after several megabytes of output is generated, or its re-key time is +reached. + +State-compromise: Iterative guessing +.................................... + +This attack assumes that after an attacker obtained the PRNG state at +some point, is able to recover the state at a later time by observing +outputs of the PRNG. That is countered by switching the key to +generators using a combination of a fresh key and the old one (using +XOR), at re-seed time. All levels are immune to such attack after a +re-seed. + +State-compromise: Meet-in-the-Middle +.................................... + +This attack assumes that the attacker obtained the PRNG state at two +distinct times, and being able to recover the state at the third time +after observing the output of the PRNG. Given the approach described on +the above paragraph, all levels are immune to such attack. + + +File: gnutls.info, Node: FIPS140-2 mode, Prev: Random Number Generators-internals, Up: Internal architecture of GnuTLS + +11.7 FIPS140-2 mode +=================== + +GnuTLS can operate in a special mode for FIPS140-2. That mode of +operation is for the conformance to NIST's FIPS140-2 publication, which +consists of policies for cryptographic modules (such as software +libraries). Its implementation in GnuTLS is designed for Red Hat +Enterprise Linux, and can only be enabled when the library is explicitly +compiled with the '-enable-fips140-mode' configure option. + +There are two distinct library states with regard to FIPS140-2: the +FIPS140-2 mode is _installed_ if '/etc/system-fips' is present, and the +FIPS140-2 mode is _enabled_ if '/proc/sys/crypto/fips_enabled' contains +'1', which is typically set with the "fips=1" kernel command line +option. + +When the FIPS140-2 mode is installed, the operation of the library is +modified as follows. + + * The random generator used switches to DRBG-AES + * The integrity of the GnuTLS and dependent libraries is checked on + startup + * Algorithm self-tests are run on library load + +When the FIPS140-2 mode is enabled, The operation of the library is in +addition modified as follows. + + * Only approved by FIPS140-2 algorithms are enabled + * Only approved by FIPS140-2 key lengths are allowed for key + generation + * Any cryptographic operation will be refused if any of the + self-tests failed + +There are also few environment variables which modify that operation. +The environment variable 'GNUTLS_SKIP_FIPS_INTEGRITY_CHECKS' will +disable the library integrity tests on startup, and the variable +'GNUTLS_FORCE_FIPS_MODE' can be set to force a value from *note Figure +11.5: gnutls_fips_mode_t, i.e., '1' will enable the FIPS140-2 mode, +while '0' will disable it. + +The integrity checks for the dependent libraries and GnuTLS are +performed using '.hmac' files which are present at the same path as the +library. The key for the operations can be provided on compile-time +with the configure option '-with-fips140-key'. The MAC algorithm used +is HMAC-SHA256. + +On runtime an application can verify whether the library is in FIPS140-2 +mode using the *note gnutls_fips140_mode_enabled:: function. + +Relaxing FIPS140-2 requirements +------------------------------- + +The library by default operates in a strict enforcing mode, ensuring +that all constraints imposed by the FIPS140-2 specification are +enforced. However the application can relax these requirements via +*note gnutls_fips140_set_mode:: which can switch to alternative modes as +in *note Figure 11.5: gnutls_fips_mode_t. + +'GNUTLS_FIPS140_DISABLED' + The FIPS140-2 mode is disabled. +'GNUTLS_FIPS140_STRICT' + The default mode; all forbidden operations will cause an operation + failure via error code. +'GNUTLS_FIPS140_SELFTESTS' + A transient state during library initialization. That state cannot + be set or seen by applications. +'GNUTLS_FIPS140_LAX' + The library still uses the FIPS140-2 relevant algorithms but all + forbidden by FIPS140-2 operations are allowed; this is useful when + the application is aware of the followed security policy, and needs + to utilize disallowed operations for other reasons (e.g., + compatibility). +'GNUTLS_FIPS140_LOG' + Similarly to 'GNUTLS_FIPS140_LAX' , it allows forbidden operations; + any use of them results to a message to the audit callback + functions. + + +Figure 11.5: The 'gnutls_fips_mode_t' enumeration. + +The intention of this API is to be used by applications which may run in +FIPS140-2 mode, while they utilize few algorithms not in the allowed +set, e.g., for non-security related purposes. In these cases +applications should wrap the non-compliant code within blocks like the +following. + + GNUTLS_FIPS140_SET_LAX_MODE(); + + _gnutls_hash_fast(GNUTLS_DIG_MD5, buffer, sizeof(buffer), output); + + GNUTLS_FIPS140_SET_STRICT_MODE(); + +The 'GNUTLS_FIPS140_SET_LAX_MODE' and 'GNUTLS_FIPS140_SET_STRICT_MODE' +are macros to simplify the following sequence of calls. + + if (gnutls_fips140_mode_enabled()) + gnutls_fips140_set_mode(GNUTLS_FIPS140_LAX, GNUTLS_FIPS140_SET_MODE_THREAD); + + _gnutls_hash_fast(GNUTLS_DIG_MD5, buffer, sizeof(buffer), output); + + if (gnutls_fips140_mode_enabled()) + gnutls_fips140_set_mode(GNUTLS_FIPS140_STRICT, GNUTLS_FIPS140_SET_MODE_THREAD); + +The reason of the 'GNUTLS_FIPS140_SET_MODE_THREAD' flag in the previous +calls is to localize the change in the mode. Note also, that such a +block has no effect when the library is not operating under FIPS140-2 +mode, and thus it can be considered a no-op. + +Applications could also switch FIPS140-2 mode explicitly off, by calling + gnutls_fips140_set_mode(GNUTLS_FIPS140_LAX, 0); + +Service indicator +----------------- + +The above restrictions may not cover all the requirements in every usage +context, and as the FIPS140 standard evolves (like FIPS140-3), GnuTLS +may not be able to add new restrictions without breaking compatibility. + +Therefore an additional set of API functions is provided to communicate +with the user whether any approved mode of operations is performed +within a given context. + +'INT *note gnutls_fips140_context_init:: (gnutls_fips140_context_t * CONTEXT)' +'VOID *note gnutls_fips140_context_deinit:: (gnutls_fips140_context_t CONTEXT)' +'INT *note gnutls_fips140_push_context:: (gnutls_fips140_context_t CONTEXT)' +'INT *note gnutls_fips140_pop_context:: ( VOID)' + +The 'gnutls_fips140_context_t' represents the FIPS140-2 mode of +operation. It can be attached to the current execution thread with +*note gnutls_fips140_push_context:: and its internal state will be +updated until it is detached with *note gnutls_fips140_pop_context::. +Afterwards *note gnutls_fips140_get_operation_state:: allows the user to +examine whether any approved (or non-approved) security function is +invoked. + + -- Function: gnutls_fips140_operation_state_t + gnutls_fips140_get_operation_state (gnutls_fips140_context_t + CONTEXT) + CONTEXT: a 'gnutls_fips140_context_t' + + Get the previous operation state of 'context' in terms of FIPS. + + *Returns:* a 'gnutls_fips140_operation_state_t' + + *Since:* 3.7.3 + + +File: gnutls.info, Node: Upgrading from previous versions, Next: Support, Prev: Internal architecture of GnuTLS, Up: Top + +Appendix A Upgrading from previous versions +******************************************* + +The GnuTLS library typically maintains binary and source code +compatibility across versions. The releases that have the major version +increased break binary compatibility but source compatibility is +provided. This section lists exceptional cases where changes to +existing code are required due to library changes. + +Upgrading to 2.12.x from previous versions +========================================== + +GnuTLS 2.12.x is binary compatible with previous versions but changes +the semantics of 'gnutls_transport_set_lowat', which might cause +breakage in applications that relied on its default value be 1. Two +fixes are proposed: + * Quick fix. Explicitly call 'gnutls_transport_set_lowat (session, + 1);' after *note gnutls_init::. + * Long term fix. Because later versions of gnutls abolish the + functionality of using the system call 'select' to check for gnutls + pending data, the function *note gnutls_record_check_pending:: has + to be used to achieve the same functionality as described in *note + Asynchronous operation::. + +Upgrading to 3.0.x from 2.12.x +============================== + +GnuTLS 3.0.x is source compatible with previous versions except for the +functions listed below. + +Old function Replacement + +------------------------------------------------------------------- +'gnutls_transport_set_lowat'To replace its functionality the function + *note gnutls_record_check_pending:: has + to be used, as described in + *note Asynchronous operation:: + +'gnutls_session_get_server_random',They are replaced by the safer function +'gnutls_session_get_client_random'*note gnutls_session_get_random:: + +'gnutls_session_get_master_secret'Replaced by the keying material exporters + discussed in + *note Deriving keys for other applications/protocols:: + +'gnutls_transport_set_global_errno'Replaced by using the system's errno + facility or + *note gnutls_transport_set_errno::. + +'gnutls_x509_privkey_verify_data'Replaced by + *note gnutls_pubkey_verify_data2::. + +'gnutls_certificate_verify_peers'Replaced by + *note gnutls_certificate_verify_peers2::. + +'gnutls_psk_netconf_derive_key'Removed. The key derivation function was + never standardized. + +'gnutls_session_set_finished_function'Removed. + +'gnutls_ext_register' Removed. Extension registration API is + now internal to allow easier changes in + the API. + +'gnutls_certificate_get_x509_crls',Removed to allow updating the internal +'gnutls_certificate_get_x509_cas'structures. Replaced by + *note gnutls_certificate_get_issuer::. + +'gnutls_certificate_get_openpgp_keyring'Removed. + +'gnutls_ia_' Removed. The inner application + extensions were completely removed (they + failed to be standardized). + + +Upgrading to 3.1.x from 3.0.x +============================= + +GnuTLS 3.1.x is source and binary compatible with GnuTLS 3.0.x releases. +Few functions have been deprecated and are listed below. + +Old function Replacement + +------------------------------------------------------------------- +'gnutls_pubkey_verify_hash'The function + *note gnutls_pubkey_verify_hash2:: is + provided and is functionally equivalent + and safer to use. + +'gnutls_pubkey_verify_data'The function + *note gnutls_pubkey_verify_data2:: is + provided and is functionally equivalent + and safer to use. + + +Upgrading to 3.2.x from 3.1.x +============================= + +GnuTLS 3.2.x is source and binary compatible with GnuTLS 3.1.x releases. +Few functions have been deprecated and are listed below. + +Old function Replacement + +------------------------------------------------------------------- +'gnutls_privkey_sign_raw_data'The function + *note gnutls_privkey_sign_hash:: is + equivalent when the flag + 'GNUTLS_PRIVKEY_SIGN_FLAG_TLS1_RSA' is + specified. + + +Upgrading to 3.3.x from 3.2.x +============================= + +GnuTLS 3.3.x is source and binary compatible with GnuTLS 3.2.x releases; +however there few changes in semantics which are listed below. + +Old function Replacement + +------------------------------------------------------------------- +'gnutls_global_init' No longer required. The library is + initialized using a constructor. + +'gnutls_global_deinit' No longer required. The library is + deinitialized using a destructor. + + +Upgrading to 3.4.x from 3.3.x +============================= + +GnuTLS 3.4.x is source compatible with GnuTLS 3.3.x releases; however, +several deprecated functions were removed, and are listed below. + +Old function Replacement + +------------------------------------------------------------------- +Priority string The following string emulates the 3.3.x +"NORMAL" has been behavior +modified "NORMAL:+VERS-SSL3.0:+ARCFOUR-128:+DHE-DSS:+SIGN-DSA-SHA512:+SIGN-DSA-SHA256:+SIGN-DSA-SHA1" + +'gnutls_certificate_client_set_retrieve_function',*note gnutls_certificate_set_retrieve_function:: +'gnutls_certificate_server_set_retrieve_function' +'gnutls_certificate_set_rsa_export_params',No replacement; the library does not +'gnutls_rsa_export_get_modulus_bits',support the RSA-EXPORT ciphersuites. +'gnutls_rsa_export_get_pubkey', +'gnutls_rsa_params_cpy', +'gnutls_rsa_params_deinit', +'gnutls_rsa_params_export_pkcs1', +'gnutls_rsa_params_export_raw', +'gnutls_rsa_params_generate2', +'gnutls_rsa_params_import_pkcs1', +'gnutls_rsa_params_import_raw', +'gnutls_rsa_params_init' +'gnutls_pubkey_verify_hash',*note gnutls_pubkey_verify_hash2::. + +'gnutls_pubkey_verify_data',*note gnutls_pubkey_verify_data2::. + +'gnutls_x509_crt_get_verify_algorithm',No replacement; a similar function is + *note gnutls_x509_crt_get_signature_algorithm::. + +'gnutls_pubkey_get_verify_algorithm',No replacement; a similar function is + *note gnutls_pubkey_get_preferred_hash_algorithm::. + +'gnutls_certificate_type_set_priority',*note gnutls_priority_set_direct::. +'gnutls_cipher_set_priority', +'gnutls_compression_set_priority', +'gnutls_kx_set_priority', +'gnutls_mac_set_priority', +'gnutls_protocol_set_priority' +'gnutls_sign_callback_get',*note gnutls_privkey_import_ext3:: +'gnutls_sign_callback_set' +'gnutls_x509_crt_verify_hash'*note gnutls_pubkey_verify_hash2:: + +'gnutls_x509_crt_verify_data'*note gnutls_pubkey_verify_data2:: + +'gnutls_privkey_sign_raw_data'*note gnutls_privkey_sign_hash:: with the + flag GNUTLS_PRIVKEY_SIGN_FLAG_TLS1_RSA + + +Upgrading to 3.6.x from 3.5.x +============================= + +GnuTLS 3.6.x is source and binary compatible with GnuTLS 3.5.x releases; +however, there are minor differences, listed below. + +Old functionality Replacement + +------------------------------------------------------------------- +The priority strings TLS compression is no longer available. +"+COMP" are a no-op +The SSL 3.0 protocol SSL 3.0 is no longer compiled in by +is a no-op default. It is a legacy protocol which + is completely eliminated from public + internet. As such it was removed to + reduce the attack vector for applications + using the library. + +The hash function TLS 1.3 no longer uses SHA2-224, and it +SHA2-224 is a no-op was never a widespread hash algorithm. +for TLS1.2 As such it was removed for simplicity. + +The SRP key exchange The SRP key exchange is restricted to +accepted parameters [*note TLSSRP::] spec parameters to +outside the protect clients from MitM attacks. +[*note TLSSRP::] +spec +The No longer use 'gnutls_compression_get', +compression-related 'gnutls_compression_get_name', +functions are 'gnutls_compression_list', and +deprecated 'gnutls_compression_get_id'. + +*note gnutls_x509_crt_sign::,These signing functions will no longer +*note gnutls_x509_crl_sign::,sign using SHA1, but with a secure hash +*note gnutls_x509_crq_sign::algorithm. + +*note gnutls_certificate_set_ocsp_status_request_file::This function will return an error if the + loaded response doesn't match any of the + present certificates. To revert to + previous semantics set the + 'GNUTLS_CERTIFICATE_SKIP_OCSP_RESPONSE_CHECK' + flag using + *note gnutls_certificate_set_flags::. + +The callback It is replaced with +*note gnutls_privkey_import_ext3::*note gnutls_privkey_import_ext4:: +is not flexible +enough for new +signature algorithms +such as RSA-PSS +Re-handshake It is replaced by separate key update and +functionality is not re-authentication functionality which can +applicable under TLS be accessed directly via +1.3. *note gnutls_session_key_update:: and + *note gnutls_reauth::. + +TLS session The TLS session identifiers are +identifiers are not persistent across resumption only on +shared with the server side and can be obtained as before +server under TLS via *note gnutls_session_get_id2::. +1.3. +*note gnutls_pkcs11_privkey_generate3::,These functions no longer create an +*note gnutls_pkcs11_copy_secret_key::,exportable key by default; they require +*note gnutls_pkcs11_copy_x509_privkey2::the flag + 'GNUTLS_PKCS11_OBJ_FLAG_MARK_NOT_SENSITIVE' + to do so. + +*note gnutls_db_set_retrieve_function::,These functions are no longer relevant +*note gnutls_db_set_store_function::,under TLS 1.3; resumption under TLS 1.3 +*note gnutls_db_set_remove_function::is done via session tickets, c.f. + *note gnutls_session_ticket_enable_server::. + +*note gnutls_session_get_data2::,These functions may introduce a slight +*note gnutls_session_get_data::delay under TLS 1.3 for few milliseconds. + Check output of + *note gnutls_session_get_flags:: for + GNUTLS_SFLAGS_SESSION_TICKET before + calling this function to avoid delays. + To work efficiently under TLS 1.3 this + function requires the application setting + *note gnutls_transport_set_pull_timeout_function::. + +SRP and RSA-PSK key SRP and RSA-PSK key exchanges are not +exchanges are not supported in TLS 1.3, so when these key +supported under TLS exchanges are present in a priority +1.3 string, TLS 1.3 is disabled. + +Anonymous key There is no anonymous key exchange +exchange is not supported under TLS 1.3, so if an +supported under TLS anonymous key exchange method is set in a +1.3 priority string, and no certificate + credentials are set in the client or + server, TLS 1.3 will not be negotiated. + +ECDHE-PSK and In the priority strings, both 'ECDHEPSK' +DHE-PSK keywords and 'DHEPSK' indicate the intent to +have the same support an ephemeral key exchange with +meaning under TLS the pre-shared key. The parameters of +1.3 the key exchange are negotiated with the + supported groups specified in the + priority string. + +Authentication-only Ciphersuites with the 'NULL' cipher +ciphersuites are not (i.e., authentication-only) are not +supported under TLS supported in TLS 1.3, so when they are +1.3 specified in a priority string, TLS 1.3 + is disabled. + +Supplemental data is The TLS supplemental data handshake +not supported under message (RFC 4680) is not supported under +TLS 1.3 TLS 1.3, so if the application calls + *note gnutls_supplemental_register:: or + *note gnutls_session_supplemental_register::, + TLS 1.3 is disabled. + +The The macro was non-functional and because +GNUTLS_X509_NO_WELL_DEFINED_EXPIRATIONof the nature of the definition of the +macro is a no-op no-well-defined date for certificates (a + real date), it will not be fixed or + re-introduced. + + + +File: gnutls.info, Node: Support, Next: Error codes, Prev: Upgrading from previous versions, Up: Top + +Appendix B Support +****************** + +* Menu: + +* Getting help:: +* Commercial Support:: +* Bug Reports:: +* Contributing:: +* Certification:: + + +File: gnutls.info, Node: Getting help, Next: Commercial Support, Up: Support + +B.1 Getting Help +================ + +A mailing list where users may help each other exists, and you can reach +it by sending e-mail to <gnutls-help@gnutls.org>. Archives of the +mailing list discussions, and an interface to manage subscriptions, is +available through the World Wide Web at +<https://lists.gnutls.org/pipermail/gnutls-help/>. + +A mailing list for developers are also available, see +<https://www.gnutls.org/lists.html>. Bug reports should be sent to +<bugs@gnutls.org>, see *note Bug Reports::. + + +File: gnutls.info, Node: Commercial Support, Next: Bug Reports, Prev: Getting help, Up: Support + +B.2 Commercial Support +====================== + +Commercial support is available for users of GnuTLS. See +<https://www.gnutls.org/commercial.html> for more information. + + +File: gnutls.info, Node: Bug Reports, Next: Contributing, Prev: Commercial Support, Up: Support + +B.3 Bug Reports +=============== + +If you think you have found a bug in GnuTLS, please investigate it and +report it. + + * Please make sure that the bug is really in GnuTLS, and preferably + also check that it hasn't already been fixed in the latest version. + + * You have to send us a test case that makes it possible for us to + reproduce the bug. + + * You also have to explain what is wrong; if you get a crash, or if + the results printed are not good and in that case, in what way. + Make sure that the bug report includes all information you would + need to fix this kind of bug for someone else. + +Please make an effort to produce a self-contained report, with something +definite that can be tested or debugged. Vague queries or piecemeal +messages are difficult to act on and don't help the development effort. + +If your bug report is good, we will do our best to help you to get a +corrected version of the software; if the bug report is poor, we won't +do anything about it (apart from asking you to send better bug reports). + +If you think something in this manual is unclear, or downright +incorrect, or if the language needs to be improved, please also send a +note. + +Send your bug report to: + + 'bugs@gnutls.org' + + +File: gnutls.info, Node: Contributing, Next: Certification, Prev: Bug Reports, Up: Support + +B.4 Contributing +================ + +If you want to submit a patch for inclusion - from solving a typo you +discovered, up to adding support for a new feature - you should submit +it as a bug report, using the process in *note Bug Reports::. There are +some things that you can do to increase the chances for it to be +included in the official package. + +Unless your patch is very small (say, under 10 lines) we require that +you assign the copyright of your work to the Free Software Foundation. +This is to protect the freedom of the project. If you have not already +signed papers, we will send you the necessary information when you +submit your contribution. + +For contributions that doesn't consist of actual programming code, the +only guidelines are common sense. For code contributions, a number of +style guides will help you: + + * Coding Style. Follow the GNU Standards document. + + If you normally code using another coding standard, there is no + problem, but you should use 'indent' to reformat the code before + submitting your work. + + * Use the unified diff format 'diff -u'. + + * Return errors. No reason whatsoever should abort the execution of + the library. Even memory allocation errors, e.g. when malloc + return NULL, should work although result in an error code. + + * Design with thread safety in mind. Don't use global variables. + Don't even write to per-handle global variables unless the + documented behaviour of the function you write is to write to the + per-handle global variable. + + * Avoid using the C math library. It causes problems for embedded + implementations, and in most situations it is very easy to avoid + using it. + + * Document your functions. Use comments before each function + headers, that, if properly formatted, are extracted into Texinfo + manuals and GTK-DOC web pages. + + * Supply a ChangeLog and NEWS entries, where appropriate. + + +File: gnutls.info, Node: Certification, Prev: Contributing, Up: Support + +B.5 Certification +================= + +There are certifications from national or international bodies which +"prove" to an auditor that the crypto component follows some best +practices, such as unit testing and reliance on well known crypto +primitives. + +GnuTLS has support for the FIPS 140-2 certification under Red Hat +Enterprise Linux. See *note FIPS140-2 mode:: for more information. + + +File: gnutls.info, Node: Error codes, Next: Supported ciphersuites, Prev: Support, Up: Top + +Appendix C Error Codes and Descriptions +*************************************** + +The error codes used throughout the library are described below. The +return code 'GNUTLS_E_SUCCESS' indicates a successful operation, and is +guaranteed to have the value 0, so you can use it in logical +expressions. + +0 GNUTLS_E_SUCCESS Success. +-3 GNUTLS_E_UNKNOWN_COMPRESSION_ALGORITHMCould not negotiate a + supported compression + method. +-6 GNUTLS_E_UNKNOWN_CIPHER_TYPE The cipher type is + unsupported. +-7 GNUTLS_E_LARGE_PACKET The transmitted packet is + too large (EMSGSIZE). +-8 GNUTLS_E_UNSUPPORTED_VERSION_PACKETA packet with illegal or + unsupported version was + received. +-9 GNUTLS_E_UNEXPECTED_PACKET_LENGTHError decoding the + received TLS packet. +-10 GNUTLS_E_INVALID_SESSION The specified session has + been invalidated for some + reason. +-12 GNUTLS_E_FATAL_ALERT_RECEIVED A TLS fatal alert has + been received. +-15 GNUTLS_E_UNEXPECTED_PACKET An unexpected TLS packet + was received. +-16 GNUTLS_E_WARNING_ALERT_RECEIVEDA TLS warning alert has + been received. +-18 GNUTLS_E_ERROR_IN_FINISHED_PACKETAn error was encountered + at the TLS Finished + packet calculation. +-19 GNUTLS_E_UNEXPECTED_HANDSHAKE_PACKETAn unexpected TLS + handshake packet was + received. +-21 GNUTLS_E_UNKNOWN_CIPHER_SUITE Could not negotiate a + supported cipher suite. +-22 GNUTLS_E_UNWANTED_ALGORITHM An algorithm that is not + enabled was negotiated. +-23 GNUTLS_E_MPI_SCAN_FAILED The scanning of a large + integer has failed. +-24 GNUTLS_E_DECRYPTION_FAILED Decryption has failed. +-25 GNUTLS_E_MEMORY_ERROR Internal error in memory + allocation. +-26 GNUTLS_E_DECOMPRESSION_FAILED Decompression of the TLS + record packet has failed. +-27 GNUTLS_E_COMPRESSION_FAILED Compression of the TLS + record packet has failed. +-28 GNUTLS_E_AGAIN Resource temporarily + unavailable, try again. +-29 GNUTLS_E_EXPIRED The session or + certificate has expired. +-30 GNUTLS_E_DB_ERROR Error in Database + backend. +-31 GNUTLS_E_SRP_PWD_ERROR Error in password/key + file. +-32 GNUTLS_E_INSUFFICIENT_CREDENTIALSInsufficient credentials + for that request. +-33 GNUTLS_E_HASH_FAILED Hashing has failed. +-34 GNUTLS_E_BASE64_DECODING_ERRORBase64 decoding error. +-35 GNUTLS_E_MPI_PRINT_FAILED Could not export a large + integer. +-37 GNUTLS_E_REHANDSHAKE Rehandshake was requested + by the peer. +-38 GNUTLS_E_GOT_APPLICATION_DATA TLS Application data were + received, while expecting + handshake data. +-39 GNUTLS_E_RECORD_LIMIT_REACHED The upper limit of record + packet sequence numbers + has been reached. Wow! +-40 GNUTLS_E_ENCRYPTION_FAILED Encryption has failed. +-43 GNUTLS_E_CERTIFICATE_ERROR Error in the certificate. +-44 GNUTLS_E_PK_ENCRYPTION_FAILED Public key encryption has + failed. +-45 GNUTLS_E_PK_DECRYPTION_FAILED Public key decryption has + failed. +-46 GNUTLS_E_PK_SIGN_FAILED Public key signing has + failed. +-47 GNUTLS_E_X509_UNSUPPORTED_CRITICAL_EXTENSIONUnsupported critical + extension in X.509 + certificate. +-48 GNUTLS_E_KEY_USAGE_VIOLATION Key usage violation in + certificate has been + detected. +-49 GNUTLS_E_NO_CERTIFICATE_FOUND No certificate was found. +-50 GNUTLS_E_INVALID_REQUEST The request is invalid. +-51 GNUTLS_E_SHORT_MEMORY_BUFFER The given memory buffer + is too short to hold + parameters. +-52 GNUTLS_E_INTERRUPTED Function was interrupted. +-53 GNUTLS_E_PUSH_ERROR Error in the push + function. +-54 GNUTLS_E_PULL_ERROR Error in the pull + function. +-55 GNUTLS_E_RECEIVED_ILLEGAL_PARAMETERAn illegal parameter has + been received. +-56 GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLEThe requested data were + not available. +-57 GNUTLS_E_PKCS1_WRONG_PAD Wrong padding in PKCS1 + packet. +-58 GNUTLS_E_RECEIVED_ILLEGAL_EXTENSIONAn illegal TLS extension + was received. +-59 GNUTLS_E_INTERNAL_ERROR GnuTLS internal error. +-60 GNUTLS_E_CERTIFICATE_KEY_MISMATCHThe certificate and the + given key do not match. +-61 GNUTLS_E_UNSUPPORTED_CERTIFICATE_TYPEThe certificate type is + not supported. +-62 GNUTLS_E_X509_UNKNOWN_SAN Unknown Subject + Alternative name in X.509 + certificate. +-63 GNUTLS_E_DH_PRIME_UNACCEPTABLEThe Diffie-Hellman prime + sent by the server is not + acceptable (not long + enough). +-64 GNUTLS_E_FILE_ERROR Error while reading file. +-67 GNUTLS_E_ASN1_ELEMENT_NOT_FOUNDASN1 parser: Element was + not found. +-68 GNUTLS_E_ASN1_IDENTIFIER_NOT_FOUNDASN1 parser: Identifier + was not found +-69 GNUTLS_E_ASN1_DER_ERROR ASN1 parser: Error in DER + parsing. +-70 GNUTLS_E_ASN1_VALUE_NOT_FOUND ASN1 parser: Value was + not found. +-71 GNUTLS_E_ASN1_GENERIC_ERROR ASN1 parser: Generic + parsing error. +-72 GNUTLS_E_ASN1_VALUE_NOT_VALID ASN1 parser: Value is not + valid. +-73 GNUTLS_E_ASN1_TAG_ERROR ASN1 parser: Error in + TAG. +-74 GNUTLS_E_ASN1_TAG_IMPLICIT ASN1 parser: error in + implicit tag +-75 GNUTLS_E_ASN1_TYPE_ANY_ERROR ASN1 parser: Error in + type 'ANY'. +-76 GNUTLS_E_ASN1_SYNTAX_ERROR ASN1 parser: Syntax + error. +-77 GNUTLS_E_ASN1_DER_OVERFLOW ASN1 parser: Overflow in + DER parsing. +-78 GNUTLS_E_TOO_MANY_EMPTY_PACKETSToo many empty record + packets have been + received. +-79 GNUTLS_E_OPENPGP_UID_REVOKED The OpenPGP User ID is + revoked. +-80 GNUTLS_E_UNKNOWN_PK_ALGORITHM An unknown public key + algorithm was + encountered. +-81 GNUTLS_E_TOO_MANY_HANDSHAKE_PACKETSToo many handshake + packets have been + received. +-82 GNUTLS_E_RECEIVED_DISALLOWED_NAMEA disallowed SNI server + name has been received. +-84 GNUTLS_E_NO_TEMPORARY_RSA_PARAMSNo temporary RSA + parameters were found. +-86 GNUTLS_E_NO_COMPRESSION_ALGORITHMSNo supported compression + algorithms have been + found. +-87 GNUTLS_E_NO_CIPHER_SUITES No supported cipher + suites have been found. +-88 GNUTLS_E_OPENPGP_GETKEY_FAILEDCould not get OpenPGP + key. +-89 GNUTLS_E_PK_SIG_VERIFY_FAILED Public key signature + verification has failed. +-90 GNUTLS_E_ILLEGAL_SRP_USERNAME The SRP username supplied + is illegal. +-91 GNUTLS_E_SRP_PWD_PARSING_ERRORParsing error in + password/key file. +-93 GNUTLS_E_NO_TEMPORARY_DH_PARAMSNo temporary DH + parameters were found. +-94 GNUTLS_E_OPENPGP_FINGERPRINT_UNSUPPORTEDThe OpenPGP fingerprint + is not supported. +-95 GNUTLS_E_X509_UNSUPPORTED_ATTRIBUTEThe certificate has + unsupported attributes. +-96 GNUTLS_E_UNKNOWN_HASH_ALGORITHMThe hash algorithm is + unknown. +-97 GNUTLS_E_UNKNOWN_PKCS_CONTENT_TYPEThe PKCS structure's + content type is unknown. +-98 GNUTLS_E_UNKNOWN_PKCS_BAG_TYPEThe PKCS structure's bag + type is unknown. +-99 GNUTLS_E_INVALID_PASSWORD The given password + contains invalid + characters. +-100 GNUTLS_E_MAC_VERIFY_FAILED The Message + Authentication Code + verification failed. +-101 GNUTLS_E_CONSTRAINT_ERROR Some constraint limits + were reached. +-104 GNUTLS_E_IA_VERIFY_FAILED Verifying TLS/IA phase + checksum failed +-105 GNUTLS_E_UNKNOWN_ALGORITHM The specified algorithm + or protocol is unknown. +-106 GNUTLS_E_UNSUPPORTED_SIGNATURE_ALGORITHMThe signature algorithm + is not supported. +-107 GNUTLS_E_SAFE_RENEGOTIATION_FAILEDSafe renegotiation + failed. +-108 GNUTLS_E_UNSAFE_RENEGOTIATION_DENIEDUnsafe renegotiation + denied. +-109 GNUTLS_E_UNKNOWN_SRP_USERNAME The username supplied is + unknown. +-110 GNUTLS_E_PREMATURE_TERMINATIONThe TLS connection was + non-properly terminated. +-111 GNUTLS_E_MALFORMED_CIDR CIDR name constraint is + malformed in size or + structure. +-112 GNUTLS_E_CERTIFICATE_REQUIRED Certificate is required. +-201 GNUTLS_E_BASE64_ENCODING_ERRORBase64 encoding error. +-202 GNUTLS_E_INCOMPATIBLE_GCRYPT_LIBRARYThe crypto library + version is too old. +-203 GNUTLS_E_INCOMPATIBLE_LIBTASN1_LIBRARYThe tasn1 library version + is too old. +-204 GNUTLS_E_OPENPGP_KEYRING_ERRORError loading the + keyring. +-205 GNUTLS_E_X509_UNSUPPORTED_OID The OID is not supported. +-206 GNUTLS_E_RANDOM_FAILED Failed to acquire random + data. +-207 GNUTLS_E_BASE64_UNEXPECTED_HEADER_ERRORBase64 unexpected header + error. +-208 GNUTLS_E_OPENPGP_SUBKEY_ERROR Could not find OpenPGP + subkey. +-209 GNUTLS_E_CRYPTO_ALREADY_REGISTEREDThere is already a crypto + algorithm with lower + priority. +-210 GNUTLS_E_HANDSHAKE_TOO_LARGE The handshake data size + is too large. +-211 GNUTLS_E_CRYPTODEV_IOCTL_ERRORError interfacing with + /dev/crypto +-212 GNUTLS_E_CRYPTODEV_DEVICE_ERRORError opening /dev/crypto +-213 GNUTLS_E_CHANNEL_BINDING_NOT_AVAILABLEChannel binding data not + available +-214 GNUTLS_E_BAD_COOKIE The cookie was bad. +-215 GNUTLS_E_OPENPGP_PREFERRED_KEY_ERRORThe OpenPGP key has not a + preferred key set. +-216 GNUTLS_E_INCOMPAT_DSA_KEY_WITH_TLS_PROTOCOLThe given DSA key is + incompatible with the + selected TLS protocol. +-217 GNUTLS_E_INSUFFICIENT_SECURITYOne of the involved + algorithms has + insufficient security + level. +-292 GNUTLS_E_HEARTBEAT_PONG_RECEIVEDA heartbeat pong message + was received. +-293 GNUTLS_E_HEARTBEAT_PING_RECEIVEDA heartbeat ping message + was received. +-294 GNUTLS_E_UNRECOGNIZED_NAME The SNI host name not + recognised. +-300 GNUTLS_E_PKCS11_ERROR PKCS #11 error. +-301 GNUTLS_E_PKCS11_LOAD_ERROR PKCS #11 initialization + error. +-302 GNUTLS_E_PARSING_ERROR Error in parsing. +-303 GNUTLS_E_PKCS11_PIN_ERROR Error in provided PIN. +-305 GNUTLS_E_PKCS11_SLOT_ERROR PKCS #11 error in slot +-306 GNUTLS_E_LOCKING_ERROR Thread locking error +-307 GNUTLS_E_PKCS11_ATTRIBUTE_ERRORPKCS #11 error in + attribute +-308 GNUTLS_E_PKCS11_DEVICE_ERROR PKCS #11 error in device +-309 GNUTLS_E_PKCS11_DATA_ERROR PKCS #11 error in data +-310 GNUTLS_E_PKCS11_UNSUPPORTED_FEATURE_ERRORPKCS #11 unsupported + feature +-311 GNUTLS_E_PKCS11_KEY_ERROR PKCS #11 error in key +-312 GNUTLS_E_PKCS11_PIN_EXPIRED PKCS #11 PIN expired +-313 GNUTLS_E_PKCS11_PIN_LOCKED PKCS #11 PIN locked +-314 GNUTLS_E_PKCS11_SESSION_ERROR PKCS #11 error in session +-315 GNUTLS_E_PKCS11_SIGNATURE_ERRORPKCS #11 error in + signature +-316 GNUTLS_E_PKCS11_TOKEN_ERROR PKCS #11 error in token +-317 GNUTLS_E_PKCS11_USER_ERROR PKCS #11 user error +-318 GNUTLS_E_CRYPTO_INIT_FAILED The initialization of + crypto backend has + failed. +-319 GNUTLS_E_TIMEDOUT The operation timed out +-320 GNUTLS_E_USER_ERROR The operation was + cancelled due to user + error +-321 GNUTLS_E_ECC_NO_SUPPORTED_CURVESNo supported ECC curves + were found +-322 GNUTLS_E_ECC_UNSUPPORTED_CURVEThe curve is unsupported +-323 GNUTLS_E_PKCS11_REQUESTED_OBJECT_NOT_AVAILBLEThe requested PKCS #11 + object is not available +-324 GNUTLS_E_CERTIFICATE_LIST_UNSORTEDThe provided X.509 + certificate list is not + sorted (in subject to + issuer order) +-325 GNUTLS_E_ILLEGAL_PARAMETER An illegal parameter was + found. +-326 GNUTLS_E_NO_PRIORITIES_WERE_SETNo or insufficient + priorities were set. +-327 GNUTLS_E_X509_UNSUPPORTED_EXTENSIONUnsupported extension in + X.509 certificate. +-328 GNUTLS_E_SESSION_EOF Peer has terminated the + connection +-329 GNUTLS_E_TPM_ERROR TPM error. +-330 GNUTLS_E_TPM_KEY_PASSWORD_ERRORError in provided + password for key to be + loaded in TPM. +-331 GNUTLS_E_TPM_SRK_PASSWORD_ERRORError in provided SRK + password for TPM. +-332 GNUTLS_E_TPM_SESSION_ERROR Cannot initialize a + session with the TPM. +-333 GNUTLS_E_TPM_KEY_NOT_FOUND TPM key was not found in + persistent storage. +-334 GNUTLS_E_TPM_UNINITIALIZED TPM is not initialized. +-335 GNUTLS_E_TPM_NO_LIB The TPM library + (trousers) cannot be + found. +-340 GNUTLS_E_NO_CERTIFICATE_STATUSThere is no certificate + status (OCSP). +-341 GNUTLS_E_OCSP_RESPONSE_ERROR The OCSP response is + invalid +-342 GNUTLS_E_RANDOM_DEVICE_ERROR Error in the system's + randomness device. +-343 GNUTLS_E_AUTH_ERROR Could not authenticate + peer. +-344 GNUTLS_E_NO_APPLICATION_PROTOCOLNo common application + protocol could be + negotiated. +-345 GNUTLS_E_SOCKETS_INIT_ERROR Error in sockets + initialization. +-346 GNUTLS_E_KEY_IMPORT_FAILED Failed to import the key + into store. +-347 GNUTLS_E_INAPPROPRIATE_FALLBACKA connection with + inappropriate fallback + was attempted. +-348 GNUTLS_E_CERTIFICATE_VERIFICATION_ERRORError in the certificate + verification. +-349 GNUTLS_E_PRIVKEY_VERIFICATION_ERRORError in the private key + verification; seed + doesn't match. +-350 GNUTLS_E_UNEXPECTED_EXTENSIONS_LENGTHInvalid TLS extensions + length field. +-351 GNUTLS_E_ASN1_EMBEDDED_NULL_IN_STRINGThe provided string has + an embedded null. +-400 GNUTLS_E_SELF_TEST_ERROR Error while performing + self checks. +-401 GNUTLS_E_NO_SELF_TEST There is no self test for + this algorithm. +-402 GNUTLS_E_LIB_IN_ERROR_STATE An error has been + detected in the library + and cannot continue + operations. +-403 GNUTLS_E_PK_GENERATION_ERROR Error in public key + generation. +-404 GNUTLS_E_IDNA_ERROR There was an issue + converting to or from + UTF8. +-406 GNUTLS_E_SESSION_USER_ID_CHANGEDPeer's certificate or + username has changed + during a rehandshake. +-407 GNUTLS_E_HANDSHAKE_DURING_FALSE_STARTAttempted handshake + during false start. +-408 GNUTLS_E_UNAVAILABLE_DURING_HANDSHAKECannot perform this + action while handshake is + in progress. +-409 GNUTLS_E_PK_INVALID_PUBKEY The public key is + invalid. +-410 GNUTLS_E_PK_INVALID_PRIVKEY The private key is + invalid. +-411 GNUTLS_E_NOT_YET_ACTIVATED The certificate is not + yet activated. +-412 GNUTLS_E_INVALID_UTF8_STRING The given string contains + invalid UTF-8 characters. +-413 GNUTLS_E_NO_EMBEDDED_DATA There are no embedded + data in the structure. +-414 GNUTLS_E_INVALID_UTF8_EMAIL The given email string + contains non-ASCII + characters before '.́ +-415 GNUTLS_E_INVALID_PASSWORD_STRINGThe given password + contains invalid + characters. +-416 GNUTLS_E_CERTIFICATE_TIME_ERRORError in the time fields + of certificate. +-417 GNUTLS_E_RECORD_OVERFLOW A TLS record packet with + invalid length was + received. +-418 GNUTLS_E_ASN1_TIME_ERROR The DER time encoding is + invalid. +-419 GNUTLS_E_INCOMPATIBLE_SIG_WITH_KEYThe signature is + incompatible with the + public key. +-420 GNUTLS_E_PK_INVALID_PUBKEY_PARAMSThe public key parameters + are invalid. +-421 GNUTLS_E_PK_NO_VALIDATION_PARAMSThere are no validation + parameters present. +-422 GNUTLS_E_OCSP_MISMATCH_WITH_CERTSThe OCSP response + provided doesn't match + the available + certificates +-423 GNUTLS_E_NO_COMMON_KEY_SHARE No common key share with + peer. +-424 GNUTLS_E_REAUTH_REQUEST Re-authentication was + requested by the peer. +-425 GNUTLS_E_TOO_MANY_MATCHES More than a single object + matches the criteria. +-426 GNUTLS_E_CRL_VERIFICATION_ERRORError in the CRL + verification. +-427 GNUTLS_E_MISSING_EXTENSION An required TLS extension + was received. +-428 GNUTLS_E_DB_ENTRY_EXISTS The Database entry + already exists. +-429 GNUTLS_E_EARLY_DATA_REJECTED The early data were + rejected. +-430 GNUTLS_E_X509_DUPLICATE_EXTENSIONDuplicate extension in + X.509 certificate. + + +File: gnutls.info, Node: Supported ciphersuites, Next: API reference, Prev: Error codes, Up: Top + +Appendix D Supported Ciphersuites +********************************* + +Ciphersuites +============ + +Ciphersuite name TLS ID Since +-------------------------------------------------------------------------- +TLS_AES_128_GCM_SHA256 0x13 0x01 TLS1.3 +TLS_AES_256_GCM_SHA384 0x13 0x02 TLS1.3 +TLS_CHACHA20_POLY1305_SHA256 0x13 0x03 TLS1.3 +TLS_AES_128_CCM_SHA256 0x13 0x04 TLS1.3 +TLS_AES_128_CCM_8_SHA256 0x13 0x05 TLS1.3 +TLS_RSA_NULL_MD5 0x00 0x01 TLS1.0 +TLS_RSA_NULL_SHA1 0x00 0x02 TLS1.0 +TLS_RSA_NULL_SHA256 0x00 0x3B TLS1.2 +TLS_RSA_ARCFOUR_128_SHA1 0x00 0x05 TLS1.0 +TLS_RSA_ARCFOUR_128_MD5 0x00 0x04 TLS1.0 +TLS_RSA_3DES_EDE_CBC_SHA1 0x00 0x0A TLS1.0 +TLS_RSA_AES_128_CBC_SHA1 0x00 0x2F TLS1.0 +TLS_RSA_AES_256_CBC_SHA1 0x00 0x35 TLS1.0 +TLS_RSA_CAMELLIA_128_CBC_SHA256 0x00 0xBA TLS1.2 +TLS_RSA_CAMELLIA_256_CBC_SHA256 0x00 0xC0 TLS1.2 +TLS_RSA_CAMELLIA_128_CBC_SHA1 0x00 0x41 TLS1.0 +TLS_RSA_CAMELLIA_256_CBC_SHA1 0x00 0x84 TLS1.0 +TLS_RSA_AES_128_CBC_SHA256 0x00 0x3C TLS1.2 +TLS_RSA_AES_256_CBC_SHA256 0x00 0x3D TLS1.2 +TLS_RSA_AES_128_GCM_SHA256 0x00 0x9C TLS1.2 +TLS_RSA_AES_256_GCM_SHA384 0x00 0x9D TLS1.2 +TLS_RSA_CAMELLIA_128_GCM_SHA256 0xC0 0x7A TLS1.2 +TLS_RSA_CAMELLIA_256_GCM_SHA384 0xC0 0x7B TLS1.2 +TLS_RSA_AES_128_CCM 0xC0 0x9C TLS1.2 +TLS_RSA_AES_256_CCM 0xC0 0x9D TLS1.2 +TLS_RSA_AES_128_CCM_8 0xC0 0xA0 TLS1.2 +TLS_RSA_AES_256_CCM_8 0xC0 0xA1 TLS1.2 +TLS_DHE_DSS_ARCFOUR_128_SHA1 0x00 0x66 TLS1.0 +TLS_DHE_DSS_3DES_EDE_CBC_SHA1 0x00 0x13 TLS1.0 +TLS_DHE_DSS_AES_128_CBC_SHA1 0x00 0x32 TLS1.0 +TLS_DHE_DSS_AES_256_CBC_SHA1 0x00 0x38 TLS1.0 +TLS_DHE_DSS_CAMELLIA_128_CBC_SHA256 0x00 0xBD TLS1.2 +TLS_DHE_DSS_CAMELLIA_256_CBC_SHA256 0x00 0xC3 TLS1.2 +TLS_DHE_DSS_CAMELLIA_128_CBC_SHA1 0x00 0x44 TLS1.0 +TLS_DHE_DSS_CAMELLIA_256_CBC_SHA1 0x00 0x87 TLS1.0 +TLS_DHE_DSS_AES_128_CBC_SHA256 0x00 0x40 TLS1.2 +TLS_DHE_DSS_AES_256_CBC_SHA256 0x00 0x6A TLS1.2 +TLS_DHE_DSS_AES_128_GCM_SHA256 0x00 0xA2 TLS1.2 +TLS_DHE_DSS_AES_256_GCM_SHA384 0x00 0xA3 TLS1.2 +TLS_DHE_DSS_CAMELLIA_128_GCM_SHA256 0xC0 0x80 TLS1.2 +TLS_DHE_DSS_CAMELLIA_256_GCM_SHA384 0xC0 0x81 TLS1.2 +TLS_DHE_RSA_3DES_EDE_CBC_SHA1 0x00 0x16 TLS1.0 +TLS_DHE_RSA_AES_128_CBC_SHA1 0x00 0x33 TLS1.0 +TLS_DHE_RSA_AES_256_CBC_SHA1 0x00 0x39 TLS1.0 +TLS_DHE_RSA_CAMELLIA_128_CBC_SHA256 0x00 0xBE TLS1.2 +TLS_DHE_RSA_CAMELLIA_256_CBC_SHA256 0x00 0xC4 TLS1.2 +TLS_DHE_RSA_CAMELLIA_128_CBC_SHA1 0x00 0x45 TLS1.0 +TLS_DHE_RSA_CAMELLIA_256_CBC_SHA1 0x00 0x88 TLS1.0 +TLS_DHE_RSA_AES_128_CBC_SHA256 0x00 0x67 TLS1.2 +TLS_DHE_RSA_AES_256_CBC_SHA256 0x00 0x6B TLS1.2 +TLS_DHE_RSA_AES_128_GCM_SHA256 0x00 0x9E TLS1.2 +TLS_DHE_RSA_AES_256_GCM_SHA384 0x00 0x9F TLS1.2 +TLS_DHE_RSA_CAMELLIA_128_GCM_SHA256 0xC0 0x7C TLS1.2 +TLS_DHE_RSA_CAMELLIA_256_GCM_SHA384 0xC0 0x7D TLS1.2 +TLS_DHE_RSA_CHACHA20_POLY1305 0xCC 0xAA TLS1.2 +TLS_DHE_RSA_AES_128_CCM 0xC0 0x9E TLS1.2 +TLS_DHE_RSA_AES_256_CCM 0xC0 0x9F TLS1.2 +TLS_DHE_RSA_AES_128_CCM_8 0xC0 0xA2 TLS1.2 +TLS_DHE_RSA_AES_256_CCM_8 0xC0 0xA3 TLS1.2 +TLS_ECDHE_RSA_NULL_SHA1 0xC0 0x10 TLS1.0 +TLS_ECDHE_RSA_3DES_EDE_CBC_SHA1 0xC0 0x12 TLS1.0 +TLS_ECDHE_RSA_AES_128_CBC_SHA1 0xC0 0x13 TLS1.0 +TLS_ECDHE_RSA_AES_256_CBC_SHA1 0xC0 0x14 TLS1.0 +TLS_ECDHE_RSA_AES_256_CBC_SHA384 0xC0 0x28 TLS1.2 +TLS_ECDHE_RSA_ARCFOUR_128_SHA1 0xC0 0x11 TLS1.0 +TLS_ECDHE_RSA_CAMELLIA_128_CBC_SHA256 0xC0 0x76 TLS1.2 +TLS_ECDHE_RSA_CAMELLIA_256_CBC_SHA384 0xC0 0x77 TLS1.2 +TLS_ECDHE_ECDSA_NULL_SHA1 0xC0 0x06 TLS1.0 +TLS_ECDHE_ECDSA_3DES_EDE_CBC_SHA1 0xC0 0x08 TLS1.0 +TLS_ECDHE_ECDSA_AES_128_CBC_SHA1 0xC0 0x09 TLS1.0 +TLS_ECDHE_ECDSA_AES_256_CBC_SHA1 0xC0 0x0A TLS1.0 +TLS_ECDHE_ECDSA_ARCFOUR_128_SHA1 0xC0 0x07 TLS1.0 +TLS_ECDHE_ECDSA_CAMELLIA_128_CBC_SHA256 0xC0 0x72 TLS1.2 +TLS_ECDHE_ECDSA_CAMELLIA_256_CBC_SHA384 0xC0 0x73 TLS1.2 +TLS_ECDHE_ECDSA_AES_128_CBC_SHA256 0xC0 0x23 TLS1.2 +TLS_ECDHE_RSA_AES_128_CBC_SHA256 0xC0 0x27 TLS1.2 +TLS_ECDHE_ECDSA_CAMELLIA_128_GCM_SHA256 0xC0 0x86 TLS1.2 +TLS_ECDHE_ECDSA_CAMELLIA_256_GCM_SHA384 0xC0 0x87 TLS1.2 +TLS_ECDHE_ECDSA_AES_128_GCM_SHA256 0xC0 0x2B TLS1.2 +TLS_ECDHE_ECDSA_AES_256_GCM_SHA384 0xC0 0x2C TLS1.2 +TLS_ECDHE_RSA_AES_128_GCM_SHA256 0xC0 0x2F TLS1.2 +TLS_ECDHE_RSA_AES_256_GCM_SHA384 0xC0 0x30 TLS1.2 +TLS_ECDHE_ECDSA_AES_256_CBC_SHA384 0xC0 0x24 TLS1.2 +TLS_ECDHE_RSA_CAMELLIA_128_GCM_SHA256 0xC0 0x8A TLS1.2 +TLS_ECDHE_RSA_CAMELLIA_256_GCM_SHA384 0xC0 0x8B TLS1.2 +TLS_ECDHE_RSA_CHACHA20_POLY1305 0xCC 0xA8 TLS1.2 +TLS_ECDHE_ECDSA_CHACHA20_POLY1305 0xCC 0xA9 TLS1.2 +TLS_ECDHE_ECDSA_AES_128_CCM 0xC0 0xAC TLS1.2 +TLS_ECDHE_ECDSA_AES_256_CCM 0xC0 0xAD TLS1.2 +TLS_ECDHE_ECDSA_AES_128_CCM_8 0xC0 0xAE TLS1.2 +TLS_ECDHE_ECDSA_AES_256_CCM_8 0xC0 0xAF TLS1.2 +TLS_ECDHE_PSK_3DES_EDE_CBC_SHA1 0xC0 0x34 TLS1.0 +TLS_ECDHE_PSK_AES_128_CBC_SHA1 0xC0 0x35 TLS1.0 +TLS_ECDHE_PSK_AES_256_CBC_SHA1 0xC0 0x36 TLS1.0 +TLS_ECDHE_PSK_AES_128_CBC_SHA256 0xC0 0x37 TLS1.2 +TLS_ECDHE_PSK_AES_256_CBC_SHA384 0xC0 0x38 TLS1.2 +TLS_ECDHE_PSK_ARCFOUR_128_SHA1 0xC0 0x33 TLS1.0 +TLS_ECDHE_PSK_NULL_SHA1 0xC0 0x39 TLS1.0 +TLS_ECDHE_PSK_NULL_SHA256 0xC0 0x3A TLS1.2 +TLS_ECDHE_PSK_NULL_SHA384 0xC0 0x3B TLS1.0 +TLS_ECDHE_PSK_CAMELLIA_128_CBC_SHA256 0xC0 0x9A TLS1.2 +TLS_ECDHE_PSK_CAMELLIA_256_CBC_SHA384 0xC0 0x9B TLS1.2 +TLS_PSK_ARCFOUR_128_SHA1 0x00 0x8A TLS1.0 +TLS_PSK_3DES_EDE_CBC_SHA1 0x00 0x8B TLS1.0 +TLS_PSK_AES_128_CBC_SHA1 0x00 0x8C TLS1.0 +TLS_PSK_AES_256_CBC_SHA1 0x00 0x8D TLS1.0 +TLS_PSK_AES_128_CBC_SHA256 0x00 0xAE TLS1.2 +TLS_PSK_AES_256_GCM_SHA384 0x00 0xA9 TLS1.2 +TLS_PSK_CAMELLIA_128_GCM_SHA256 0xC0 0x8E TLS1.2 +TLS_PSK_CAMELLIA_256_GCM_SHA384 0xC0 0x8F TLS1.2 +TLS_PSK_AES_128_GCM_SHA256 0x00 0xA8 TLS1.2 +TLS_PSK_NULL_SHA1 0x00 0x2C TLS1.0 +TLS_PSK_NULL_SHA256 0x00 0xB0 TLS1.2 +TLS_PSK_CAMELLIA_128_CBC_SHA256 0xC0 0x94 TLS1.2 +TLS_PSK_CAMELLIA_256_CBC_SHA384 0xC0 0x95 TLS1.2 +TLS_PSK_AES_256_CBC_SHA384 0x00 0xAF TLS1.2 +TLS_PSK_NULL_SHA384 0x00 0xB1 TLS1.2 +TLS_RSA_PSK_ARCFOUR_128_SHA1 0x00 0x92 TLS1.0 +TLS_RSA_PSK_3DES_EDE_CBC_SHA1 0x00 0x93 TLS1.0 +TLS_RSA_PSK_AES_128_CBC_SHA1 0x00 0x94 TLS1.0 +TLS_RSA_PSK_AES_256_CBC_SHA1 0x00 0x95 TLS1.0 +TLS_RSA_PSK_CAMELLIA_128_GCM_SHA256 0xC0 0x92 TLS1.2 +TLS_RSA_PSK_CAMELLIA_256_GCM_SHA384 0xC0 0x93 TLS1.2 +TLS_RSA_PSK_AES_128_GCM_SHA256 0x00 0xAC TLS1.2 +TLS_RSA_PSK_AES_128_CBC_SHA256 0x00 0xB6 TLS1.2 +TLS_RSA_PSK_NULL_SHA1 0x00 0x2E TLS1.0 +TLS_RSA_PSK_NULL_SHA256 0x00 0xB8 TLS1.2 +TLS_RSA_PSK_AES_256_GCM_SHA384 0x00 0xAD TLS1.2 +TLS_RSA_PSK_AES_256_CBC_SHA384 0x00 0xB7 TLS1.2 +TLS_RSA_PSK_NULL_SHA384 0x00 0xB9 TLS1.2 +TLS_RSA_PSK_CAMELLIA_128_CBC_SHA256 0xC0 0x98 TLS1.2 +TLS_RSA_PSK_CAMELLIA_256_CBC_SHA384 0xC0 0x99 TLS1.2 +TLS_DHE_PSK_ARCFOUR_128_SHA1 0x00 0x8E TLS1.0 +TLS_DHE_PSK_3DES_EDE_CBC_SHA1 0x00 0x8F TLS1.0 +TLS_DHE_PSK_AES_128_CBC_SHA1 0x00 0x90 TLS1.0 +TLS_DHE_PSK_AES_256_CBC_SHA1 0x00 0x91 TLS1.0 +TLS_DHE_PSK_AES_128_CBC_SHA256 0x00 0xB2 TLS1.2 +TLS_DHE_PSK_AES_128_GCM_SHA256 0x00 0xAA TLS1.2 +TLS_DHE_PSK_NULL_SHA1 0x00 0x2D TLS1.0 +TLS_DHE_PSK_NULL_SHA256 0x00 0xB4 TLS1.2 +TLS_DHE_PSK_NULL_SHA384 0x00 0xB5 TLS1.2 +TLS_DHE_PSK_AES_256_CBC_SHA384 0x00 0xB3 TLS1.2 +TLS_DHE_PSK_AES_256_GCM_SHA384 0x00 0xAB TLS1.2 +TLS_DHE_PSK_CAMELLIA_128_CBC_SHA256 0xC0 0x96 TLS1.2 +TLS_DHE_PSK_CAMELLIA_256_CBC_SHA384 0xC0 0x97 TLS1.2 +TLS_DHE_PSK_CAMELLIA_128_GCM_SHA256 0xC0 0x90 TLS1.2 +TLS_DHE_PSK_CAMELLIA_256_GCM_SHA384 0xC0 0x91 TLS1.2 +TLS_PSK_AES_128_CCM 0xC0 0xA4 TLS1.2 +TLS_PSK_AES_256_CCM 0xC0 0xA5 TLS1.2 +TLS_DHE_PSK_AES_128_CCM 0xC0 0xA6 TLS1.2 +TLS_DHE_PSK_AES_256_CCM 0xC0 0xA7 TLS1.2 +TLS_PSK_AES_128_CCM_8 0xC0 0xA8 TLS1.2 +TLS_PSK_AES_256_CCM_8 0xC0 0xA9 TLS1.2 +TLS_DHE_PSK_AES_128_CCM_8 0xC0 0xAA TLS1.2 +TLS_DHE_PSK_AES_256_CCM_8 0xC0 0xAB TLS1.2 +TLS_DHE_PSK_CHACHA20_POLY1305 0xCC 0xAD TLS1.2 +TLS_ECDHE_PSK_CHACHA20_POLY1305 0xCC 0xAC TLS1.2 +TLS_RSA_PSK_CHACHA20_POLY1305 0xCC 0xAE TLS1.2 +TLS_PSK_CHACHA20_POLY1305 0xCC 0xAB TLS1.2 +TLS_DH_ANON_ARCFOUR_128_MD5 0x00 0x18 TLS1.0 +TLS_DH_ANON_3DES_EDE_CBC_SHA1 0x00 0x1B TLS1.0 +TLS_DH_ANON_AES_128_CBC_SHA1 0x00 0x34 TLS1.0 +TLS_DH_ANON_AES_256_CBC_SHA1 0x00 0x3A TLS1.0 +TLS_DH_ANON_CAMELLIA_128_CBC_SHA256 0x00 0xBF TLS1.2 +TLS_DH_ANON_CAMELLIA_256_CBC_SHA256 0x00 0xC5 TLS1.2 +TLS_DH_ANON_CAMELLIA_128_CBC_SHA1 0x00 0x46 TLS1.0 +TLS_DH_ANON_CAMELLIA_256_CBC_SHA1 0x00 0x89 TLS1.0 +TLS_DH_ANON_AES_128_CBC_SHA256 0x00 0x6C TLS1.2 +TLS_DH_ANON_AES_256_CBC_SHA256 0x00 0x6D TLS1.2 +TLS_DH_ANON_AES_128_GCM_SHA256 0x00 0xA6 TLS1.2 +TLS_DH_ANON_AES_256_GCM_SHA384 0x00 0xA7 TLS1.2 +TLS_DH_ANON_CAMELLIA_128_GCM_SHA256 0xC0 0x84 TLS1.2 +TLS_DH_ANON_CAMELLIA_256_GCM_SHA384 0xC0 0x85 TLS1.2 +TLS_ECDH_ANON_NULL_SHA1 0xC0 0x15 TLS1.0 +TLS_ECDH_ANON_3DES_EDE_CBC_SHA1 0xC0 0x17 TLS1.0 +TLS_ECDH_ANON_AES_128_CBC_SHA1 0xC0 0x18 TLS1.0 +TLS_ECDH_ANON_AES_256_CBC_SHA1 0xC0 0x19 TLS1.0 +TLS_ECDH_ANON_ARCFOUR_128_SHA1 0xC0 0x16 TLS1.0 +TLS_SRP_SHA_3DES_EDE_CBC_SHA1 0xC0 0x1A TLS1.0 +TLS_SRP_SHA_AES_128_CBC_SHA1 0xC0 0x1D TLS1.0 +TLS_SRP_SHA_AES_256_CBC_SHA1 0xC0 0x20 TLS1.0 +TLS_SRP_SHA_DSS_3DES_EDE_CBC_SHA1 0xC0 0x1C TLS1.0 +TLS_SRP_SHA_RSA_3DES_EDE_CBC_SHA1 0xC0 0x1B TLS1.0 +TLS_SRP_SHA_DSS_AES_128_CBC_SHA1 0xC0 0x1F TLS1.0 +TLS_SRP_SHA_RSA_AES_128_CBC_SHA1 0xC0 0x1E TLS1.0 +TLS_SRP_SHA_DSS_AES_256_CBC_SHA1 0xC0 0x22 TLS1.0 +TLS_SRP_SHA_RSA_AES_256_CBC_SHA1 0xC0 0x21 TLS1.0 +TLS_GOSTR341112_256_28147_CNT_IMIT 0xC1 0x02 TLS1.2 + +Certificate types +================= + +'X.509' +'Raw Public Key' + +Protocols +========= + +'TLS1.0' +'TLS1.1' +'TLS1.2' +'TLS1.3' +'DTLS0.9' +'DTLS1.0' +'DTLS1.2' + +Ciphers +======= + +'AES-256-CBC' +'AES-192-CBC' +'AES-128-CBC' +'AES-128-GCM' +'AES-192-GCM' +'AES-256-GCM' +'AES-128-CCM' +'AES-256-CCM' +'AES-128-CCM-8' +'AES-256-CCM-8' +'ARCFOUR-128' +'ESTREAM-SALSA20-256' +'SALSA20-256' +'CHACHA20-32' +'CHACHA20-64' +'CAMELLIA-256-CBC' +'CAMELLIA-192-CBC' +'CAMELLIA-128-CBC' +'CHACHA20-POLY1305' +'CAMELLIA-128-GCM' +'CAMELLIA-256-GCM' +'GOST28147-TC26Z-CFB' +'GOST28147-CPA-CFB' +'GOST28147-CPB-CFB' +'GOST28147-CPC-CFB' +'GOST28147-CPD-CFB' +'AES-128-CFB8' +'AES-192-CFB8' +'AES-256-CFB8' +'AES-128-XTS' +'AES-256-XTS' +'AES-128-SIV' +'AES-256-SIV' +'GOST28147-TC26Z-CNT' +'MAGMA-CTR-ACPKM' +'KUZNYECHIK-CTR-ACPKM' +'3DES-CBC' +'DES-CBC' +'RC2-40' +'NULL' + +MAC algorithms +============== + +'SHA1' +'SHA256' +'SHA384' +'SHA512' +'SHA224' +'UMAC-96' +'UMAC-128' +'AEAD' +'MD5' +'GOSTR341194' +'STREEBOG-256' +'STREEBOG-512' +'AES-CMAC-128' +'AES-CMAC-256' +'AES-GMAC-128' +'AES-GMAC-192' +'AES-GMAC-256' +'GOST28147-TC26Z-IMIT' +'OMAC-MAGMA' +'OMAC-KUZNYECHIK' + +Key exchange methods +==================== + +'ECDHE-RSA' +'ECDHE-ECDSA' +'RSA' +'DHE-RSA' +'DHE-DSS' +'PSK' +'RSA-PSK' +'DHE-PSK' +'ECDHE-PSK' +'SRP-DSS' +'SRP-RSA' +'SRP' +'ANON-DH' +'ANON-ECDH' +'VKO-GOST-12' +'RSA-EXPORT' + +Public key algorithms +===================== + +'RSA' +'RSA-PSS' +'RSA' +'DSA' +'GOST R 34.10-2012-512' +'GOST R 34.10-2012-256' +'GOST R 34.10-2001' +'EC/ECDSA' +'EdDSA (Ed25519)' +'EdDSA (Ed448)' +'DH' +'ECDH (X25519)' +'ECDH (X448)' + +Public key signature algorithms +=============================== + +'RSA-SHA256' +'RSA-SHA384' +'RSA-SHA512' +'RSA-PSS-SHA256' +'RSA-PSS-RSAE-SHA256' +'RSA-PSS-SHA384' +'RSA-PSS-RSAE-SHA384' +'RSA-PSS-SHA512' +'RSA-PSS-RSAE-SHA512' +'EdDSA-Ed25519' +'EdDSA-Ed448' +'ECDSA-SHA256' +'ECDSA-SHA384' +'ECDSA-SHA512' +'ECDSA-SECP256R1-SHA256' +'ECDSA-SECP384R1-SHA384' +'ECDSA-SECP521R1-SHA512' +'ECDSA-SHA3-224' +'ECDSA-SHA3-256' +'ECDSA-SHA3-384' +'ECDSA-SHA3-512' +'RSA-SHA3-224' +'RSA-SHA3-256' +'RSA-SHA3-384' +'RSA-SHA3-512' +'DSA-SHA3-224' +'DSA-SHA3-256' +'DSA-SHA3-384' +'DSA-SHA3-512' +'RSA-RAW' +'RSA-SHA1' +'RSA-SHA1' +'RSA-SHA224' +'RSA-RMD160' +'DSA-SHA1' +'DSA-SHA1' +'DSA-SHA224' +'DSA-SHA256' +'RSA-MD5' +'RSA-MD5' +'RSA-MD2' +'ECDSA-SHA1' +'ECDSA-SHA224' +'GOSTR341012-512' +'GOSTR341012-256' +'GOSTR341001' +'DSA-SHA384' +'DSA-SHA512' + +Groups +====== + +'SECP256R1' +'SECP384R1' +'SECP521R1' +'X25519' +'GC256B' +'GC512A' +'X448' +'FFDHE2048' +'FFDHE3072' +'FFDHE4096' +'FFDHE6144' +'FFDHE8192' + + +File: gnutls.info, Node: API reference, Next: Copying Information, Prev: Supported ciphersuites, Up: Top + +Appendix E API reference +************************ + +* Menu: + +* Core TLS API:: +* Datagram TLS API:: +* X509 certificate API:: +* PKCS 7 API:: +* OCSP API:: +* PKCS 12 API:: +* PKCS 11 API:: +* TPM API:: +* Abstract key API:: +* Socket specific API:: +* DANE API:: +* Cryptographic API:: +* Compatibility API:: + + +File: gnutls.info, Node: Core TLS API, Next: Datagram TLS API, Up: API reference + +E.1 Core TLS API +================ + +The prototypes for the following functions lie in 'gnutls/gnutls.h'. + +gnutls_alert_get +---------------- + + -- Function: gnutls_alert_description_t gnutls_alert_get + (gnutls_session_t SESSION) + SESSION: is a 'gnutls_session_t' type. + + This function will return the last alert number received. This + function should be called when 'GNUTLS_E_WARNING_ALERT_RECEIVED' or + 'GNUTLS_E_FATAL_ALERT_RECEIVED' errors are returned by a gnutls + function. The peer may send alerts if he encounters an error. If + no alert has been received the returned value is undefined. + + *Returns:* the last alert received, a 'gnutls_alert_description_t' + value. + +gnutls_alert_get_name +--------------------- + + -- Function: const char * gnutls_alert_get_name + (gnutls_alert_description_t ALERT) + ALERT: is an alert number. + + This function will return a string that describes the given alert + number, or 'NULL' . See 'gnutls_alert_get()' . + + *Returns:* string corresponding to 'gnutls_alert_description_t' + value. + +gnutls_alert_get_strname +------------------------ + + -- Function: const char * gnutls_alert_get_strname + (gnutls_alert_description_t ALERT) + ALERT: is an alert number. + + This function will return a string of the name of the alert. + + *Returns:* string corresponding to 'gnutls_alert_description_t' + value. + + *Since:* 3.0 + +gnutls_alert_send +----------------- + + -- Function: int gnutls_alert_send (gnutls_session_t SESSION, + gnutls_alert_level_t LEVEL, gnutls_alert_description_t DESC) + SESSION: is a 'gnutls_session_t' type. + + LEVEL: is the level of the alert + + DESC: is the alert description + + This function will send an alert to the peer in order to inform him + of something important (eg. his Certificate could not be + verified). If the alert level is Fatal then the peer is expected + to close the connection, otherwise he may ignore the alert and + continue. + + The error code of the underlying record send function will be + returned, so you may also receive 'GNUTLS_E_INTERRUPTED' or + 'GNUTLS_E_AGAIN' as well. + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, + otherwise an error code is returned. + +gnutls_alert_send_appropriate +----------------------------- + + -- Function: int gnutls_alert_send_appropriate (gnutls_session_t + SESSION, int ERR) + SESSION: is a 'gnutls_session_t' type. + + ERR: is an error code returned by another GnuTLS function + + Sends an alert to the peer depending on the error code returned by + a gnutls function. This function will call + 'gnutls_error_to_alert()' to determine the appropriate alert to + send. + + This function may also return 'GNUTLS_E_AGAIN' , or + 'GNUTLS_E_INTERRUPTED' . + + This function historically was always sending an alert to the peer, + even if 'err' was inappropriate to respond with an alert (e.g., + 'GNUTLS_E_SUCCESS' ). Since 3.6.6 this function returns success + without transmitting any data on error codes that should not result + to an alert. + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, + otherwise an error code is returned. + +gnutls_alert_set_read_function +------------------------------ + + -- Function: void gnutls_alert_set_read_function (gnutls_session_t + SESSION, gnutls_alert_read_func FUNC) + SESSION: is 'gnutls_session_t' type + + FUNC: is the function to be called + + This function will set a callback to be called when an alert + message is being sent. + + *Since:* 3.7.0 + +gnutls_alpn_get_selected_protocol +--------------------------------- + + -- Function: int gnutls_alpn_get_selected_protocol (gnutls_session_t + SESSION, gnutls_datum_t * PROTOCOL) + SESSION: is a 'gnutls_session_t' type. + + PROTOCOL: will hold the protocol name + + This function allows you to get the negotiated protocol name. The + returned protocol should be treated as opaque, constant value and + only valid during the session life. + + The selected protocol is the first supported by the list sent by + the client. + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, + otherwise a negative error code is returned. + + Since 3.2.0 + +gnutls_alpn_set_protocols +------------------------- + + -- Function: int gnutls_alpn_set_protocols (gnutls_session_t SESSION, + const gnutls_datum_t * PROTOCOLS, unsigned PROTOCOLS_SIZE, + unsigned int FLAGS) + SESSION: is a 'gnutls_session_t' type. + + PROTOCOLS: is the protocol names to add. + + PROTOCOLS_SIZE: the number of protocols to add. + + FLAGS: zero or a sequence of 'gnutls_alpn_flags_t' + + This function is to be used by both clients and servers, to declare + the supported ALPN protocols, which are used during negotiation + with peer. + + See 'gnutls_alpn_flags_t' description for the documentation of + available flags. + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, + otherwise a negative error code is returned. + + Since 3.2.0 + +gnutls_anon_allocate_client_credentials +--------------------------------------- + + -- Function: int gnutls_anon_allocate_client_credentials + (gnutls_anon_client_credentials_t * SC) + SC: is a pointer to a 'gnutls_anon_client_credentials_t' type. + + Allocate a gnutls_anon_client_credentials_t structure. + + *Returns:* 'GNUTLS_E_SUCCESS' on success, or an error code. + +gnutls_anon_allocate_server_credentials +--------------------------------------- + + -- Function: int gnutls_anon_allocate_server_credentials + (gnutls_anon_server_credentials_t * SC) + SC: is a pointer to a 'gnutls_anon_server_credentials_t' type. + + Allocate a gnutls_anon_server_credentials_t structure. + + *Returns:* 'GNUTLS_E_SUCCESS' on success, or an error code. + +gnutls_anon_free_client_credentials +----------------------------------- + + -- Function: void gnutls_anon_free_client_credentials + (gnutls_anon_client_credentials_t SC) + SC: is a 'gnutls_anon_client_credentials_t' type. + + Free a gnutls_anon_client_credentials_t structure. + +gnutls_anon_free_server_credentials +----------------------------------- + + -- Function: void gnutls_anon_free_server_credentials + (gnutls_anon_server_credentials_t SC) + SC: is a 'gnutls_anon_server_credentials_t' type. + + Free a gnutls_anon_server_credentials_t structure. + +gnutls_anon_set_params_function +------------------------------- + + -- Function: void gnutls_anon_set_params_function + (gnutls_anon_server_credentials_t RES, gnutls_params_function + * FUNC) + RES: is a gnutls_anon_server_credentials_t type + + FUNC: is the function to be called + + This function will set a callback in order for the server to get + the Diffie-Hellman or RSA parameters for anonymous authentication. + The callback should return 'GNUTLS_E_SUCCESS' (0) on success. + + *Deprecated:* This function is unnecessary and discouraged on + GnuTLS 3.6.0 or later. Since 3.6.0, DH parameters are negotiated + following RFC7919. + +gnutls_anon_set_server_dh_params +-------------------------------- + + -- Function: void gnutls_anon_set_server_dh_params + (gnutls_anon_server_credentials_t RES, gnutls_dh_params_t + DH_PARAMS) + RES: is a gnutls_anon_server_credentials_t type + + DH_PARAMS: The Diffie-Hellman parameters. + + This function will set the Diffie-Hellman parameters for an + anonymous server to use. These parameters will be used in + Anonymous Diffie-Hellman cipher suites. + + *Deprecated:* This function is unnecessary and discouraged on + GnuTLS 3.6.0 or later. Since 3.6.0, DH parameters are negotiated + following RFC7919. + +gnutls_anon_set_server_known_dh_params +-------------------------------------- + + -- Function: int gnutls_anon_set_server_known_dh_params + (gnutls_anon_server_credentials_t RES, gnutls_sec_param_t + SEC_PARAM) + RES: is a gnutls_anon_server_credentials_t type + + SEC_PARAM: is an option of the 'gnutls_sec_param_t' enumeration + + This function will set the Diffie-Hellman parameters for an + anonymous server to use. These parameters will be used in + Anonymous Diffie-Hellman cipher suites and will be selected from + the FFDHE set of RFC7919 according to the security level provided. + + *Deprecated:* This function is unnecessary and discouraged on + GnuTLS 3.6.0 or later. Since 3.6.0, DH parameters are negotiated + following RFC7919. + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, + otherwise a negative error value. + + *Since:* 3.5.6 + +gnutls_anon_set_server_params_function +-------------------------------------- + + -- Function: void gnutls_anon_set_server_params_function + (gnutls_anon_server_credentials_t RES, gnutls_params_function + * FUNC) + RES: is a gnutls_certificate_credentials_t type + + FUNC: is the function to be called + + This function will set a callback in order for the server to get + the Diffie-Hellman parameters for anonymous authentication. The + callback should return 'GNUTLS_E_SUCCESS' (0) on success. + + *Deprecated:* This function is unnecessary and discouraged on + GnuTLS 3.6.0 or later. Since 3.6.0, DH parameters are negotiated + following RFC7919. + +gnutls_anti_replay_deinit +------------------------- + + -- Function: void gnutls_anti_replay_deinit (gnutls_anti_replay_t + ANTI_REPLAY) + ANTI_REPLAY: is a 'gnutls_anti_replay' type + + This function will deinitialize all resources occupied by the given + anti-replay context. + + *Since:* 3.6.5 + +gnutls_anti_replay_enable +------------------------- + + -- Function: void gnutls_anti_replay_enable (gnutls_session_t SESSION, + gnutls_anti_replay_t ANTI_REPLAY) + SESSION: is a 'gnutls_session_t' type. + + ANTI_REPLAY: is a 'gnutls_anti_replay_t' type. + + Request that the server should use anti-replay mechanism. + + *Since:* 3.6.5 + +gnutls_anti_replay_init +----------------------- + + -- Function: int gnutls_anti_replay_init (gnutls_anti_replay_t * + ANTI_REPLAY) + ANTI_REPLAY: is a pointer to 'gnutls_anti_replay_t' type + + This function will allocate and initialize the 'anti_replay' + context to be usable for detect replay attacks. The context can + then be attached to a 'gnutls_session_t' with + 'gnutls_anti_replay_enable()' . + + *Returns:* Zero or a negative error code on error. + + *Since:* 3.6.5 + +gnutls_anti_replay_set_add_function +----------------------------------- + + -- Function: void gnutls_anti_replay_set_add_function + (gnutls_anti_replay_t ANTI_REPLAY, gnutls_db_add_func + ADD_FUNC) + ANTI_REPLAY: is a 'gnutls_anti_replay_t' type. + + ADD_FUNC: is the function. + + Sets the function that will be used to store an entry if it is not + already present in the resumed sessions database. This function + returns 0 if the entry is successfully stored, and a negative error + code otherwise. In particular, if the entry is found in the + database, it returns 'GNUTLS_E_DB_ENTRY_EXISTS' . + + The arguments to the 'add_func' are: - 'ptr' : the pointer set with + 'gnutls_anti_replay_set_ptr()' - 'exp_time' : the expiration time + of the entry - 'key' : a pointer to the key - 'data' : a pointer to + data to store + + The data set by this function can be examined using + 'gnutls_db_check_entry_expire_time()' and + 'gnutls_db_check_entry_time()' . + + *Since:* 3.6.5 + +gnutls_anti_replay_set_ptr +-------------------------- + + -- Function: void gnutls_anti_replay_set_ptr (gnutls_anti_replay_t + ANTI_REPLAY, void * PTR) + ANTI_REPLAY: is a 'gnutls_anti_replay_t' type. + + PTR: is the pointer + + Sets the pointer that will be provided to db add function as the + first argument. + +gnutls_anti_replay_set_window +----------------------------- + + -- Function: void gnutls_anti_replay_set_window (gnutls_anti_replay_t + ANTI_REPLAY, unsigned int WINDOW) + ANTI_REPLAY: is a 'gnutls_anti_replay_t' type. + + WINDOW: is the time window recording ClientHello, in milliseconds + + Sets the time window used for ClientHello recording. In order to + protect against replay attacks, the server records ClientHello + messages within this time period from the last update, and + considers it a replay when a ClientHello outside of the period; if + a ClientHello arrives within this period, the server checks the + database and detects duplicates. + + For the details of the algorithm, see RFC 8446, section 8.2. + + *Since:* 3.6.5 + +gnutls_auth_client_get_type +--------------------------- + + -- Function: gnutls_credentials_type_t gnutls_auth_client_get_type + (gnutls_session_t SESSION) + SESSION: is a 'gnutls_session_t' type. + + Returns the type of credentials that were used for client + authentication. The returned information is to be used to + distinguish the function used to access authentication data. + + Note that on resumed sessions, this function returns the schema + used in the original session authentication. + + *Returns:* The type of credentials for the client authentication + schema, a 'gnutls_credentials_type_t' type. + +gnutls_auth_get_type +-------------------- + + -- Function: gnutls_credentials_type_t gnutls_auth_get_type + (gnutls_session_t SESSION) + SESSION: is a 'gnutls_session_t' type. + + Returns type of credentials for the current authentication schema. + The returned information is to be used to distinguish the function + used to access authentication data. + + Eg. for CERTIFICATE ciphersuites (key exchange algorithms: + 'GNUTLS_KX_RSA' , 'GNUTLS_KX_DHE_RSA' ), the same function are to + be used to access the authentication data. + + Note that on resumed sessions, this function returns the schema + used in the original session authentication. + + *Returns:* The type of credentials for the current authentication + schema, a 'gnutls_credentials_type_t' type. + +gnutls_auth_server_get_type +--------------------------- + + -- Function: gnutls_credentials_type_t gnutls_auth_server_get_type + (gnutls_session_t SESSION) + SESSION: is a 'gnutls_session_t' type. + + Returns the type of credentials that were used for server + authentication. The returned information is to be used to + distinguish the function used to access authentication data. + + Note that on resumed sessions, this function returns the schema + used in the original session authentication. + + *Returns:* The type of credentials for the server authentication + schema, a 'gnutls_credentials_type_t' type. + +gnutls_base64_decode2 +--------------------- + + -- Function: int gnutls_base64_decode2 (const gnutls_datum_t * BASE64, + gnutls_datum_t * RESULT) + BASE64: contains the encoded data + + RESULT: the location of decoded data + + This function will decode the given base64 encoded data. The + decoded data will be allocated, and stored into result. + + You should use 'gnutls_free()' to free the returned data. + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, + otherwise an error code is returned. + + *Since:* 3.6.0 + +gnutls_base64_encode2 +--------------------- + + -- Function: int gnutls_base64_encode2 (const gnutls_datum_t * DATA, + gnutls_datum_t * RESULT) + DATA: contains the raw data + + RESULT: will hold the newly allocated encoded data + + This function will convert the given data to printable data, using + the base64 encoding. This function will allocate the required + memory to hold the encoded data. + + You should use 'gnutls_free()' to free the returned data. + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, + otherwise an error code is returned. + + *Since:* 3.6.0 + +gnutls_buffer_append_data +------------------------- + + -- Function: int gnutls_buffer_append_data (gnutls_buffer_t DEST, const + void * DATA, size_t DATA_SIZE) + DEST: the buffer to append to + + DATA: the data + + DATA_SIZE: the size of 'data' + + Appends the provided 'data' to the destination buffer. + + *Returns:* 'GNUTLS_E_SUCCESS' on success, otherwise a negative + error code. + + *Since:* 3.4.0 + +gnutls_bye +---------- + + -- Function: int gnutls_bye (gnutls_session_t SESSION, + gnutls_close_request_t HOW) + SESSION: is a 'gnutls_session_t' type. + + HOW: is an integer + + Terminates the current TLS/SSL connection. The connection should + have been initiated using 'gnutls_handshake()' . 'how' should be + one of 'GNUTLS_SHUT_RDWR' , 'GNUTLS_SHUT_WR' . + + In case of 'GNUTLS_SHUT_RDWR' the TLS session gets terminated and + further receives and sends will be disallowed. If the return value + is zero you may continue using the underlying transport layer. + 'GNUTLS_SHUT_RDWR' sends an alert containing a close request and + waits for the peer to reply with the same message. + + In case of 'GNUTLS_SHUT_WR' the TLS session gets terminated and + further sends will be disallowed. In order to reuse the connection + you should wait for an EOF from the peer. 'GNUTLS_SHUT_WR' sends + an alert containing a close request. + + Note that not all implementations will properly terminate a TLS + connection. Some of them, usually for performance reasons, will + terminate only the underlying transport layer, and thus not + distinguishing between a malicious party prematurely terminating + the connection and normal termination. + + This function may also return 'GNUTLS_E_AGAIN' or + 'GNUTLS_E_INTERRUPTED' ; cf. 'gnutls_record_get_direction()' . + + *Returns:* 'GNUTLS_E_SUCCESS' on success, or an error code, see + function documentation for entire semantics. + +gnutls_certificate_activation_time_peers +---------------------------------------- + + -- Function: time_t gnutls_certificate_activation_time_peers + (gnutls_session_t SESSION) + SESSION: is a gnutls session + + This function will return the peer's certificate activation time. + + *Returns:* (time_t)-1 on error. + + *Deprecated:* 'gnutls_certificate_verify_peers2()' now verifies + activation times. + +gnutls_certificate_allocate_credentials +--------------------------------------- + + -- Function: int gnutls_certificate_allocate_credentials + (gnutls_certificate_credentials_t * RES) + RES: is a pointer to a 'gnutls_certificate_credentials_t' type. + + Allocate a gnutls_certificate_credentials_t structure. + + *Returns:* 'GNUTLS_E_SUCCESS' on success, or an error code. + +gnutls_certificate_client_get_request_status +-------------------------------------------- + + -- Function: unsigned gnutls_certificate_client_get_request_status + (gnutls_session_t SESSION) + SESSION: is a gnutls session + + Get whether client certificate was requested on the last handshake + or not. + + *Returns:* 0 if the peer (server) did not request client + authentication or 1 otherwise. + +gnutls_certificate_expiration_time_peers +---------------------------------------- + + -- Function: time_t gnutls_certificate_expiration_time_peers + (gnutls_session_t SESSION) + SESSION: is a gnutls session + + This function will return the peer's certificate expiration time. + + *Returns:* (time_t)-1 on error. + + *Deprecated:* 'gnutls_certificate_verify_peers2()' now verifies + expiration times. + +gnutls_certificate_free_ca_names +-------------------------------- + + -- Function: void gnutls_certificate_free_ca_names + (gnutls_certificate_credentials_t SC) + SC: is a 'gnutls_certificate_credentials_t' type. + + This function will delete all the CA name in the given credentials. + Clients may call this to save some memory since in client side the + CA names are not used. Servers might want to use this function if + a large list of trusted CAs is present and sending the names of it + would just consume bandwidth without providing information to + client. + + CA names are used by servers to advertise the CAs they support to + clients. + +gnutls_certificate_free_cas +--------------------------- + + -- Function: void gnutls_certificate_free_cas + (gnutls_certificate_credentials_t SC) + SC: is a 'gnutls_certificate_credentials_t' type. + + This function was operational on very early versions of gnutls. + Due to internal refactorings and the fact that this was hardly ever + used, it is currently a no-op. + +gnutls_certificate_free_credentials +----------------------------------- + + -- Function: void gnutls_certificate_free_credentials + (gnutls_certificate_credentials_t SC) + SC: is a 'gnutls_certificate_credentials_t' type. + + Free a gnutls_certificate_credentials_t structure. + + This function does not free any temporary parameters associated + with this structure (ie RSA and DH parameters are not freed by this + function). + +gnutls_certificate_free_crls +---------------------------- + + -- Function: void gnutls_certificate_free_crls + (gnutls_certificate_credentials_t SC) + SC: is a 'gnutls_certificate_credentials_t' type. + + This function will delete all the CRLs associated with the given + credentials. + +gnutls_certificate_free_keys +---------------------------- + + -- Function: void gnutls_certificate_free_keys + (gnutls_certificate_credentials_t SC) + SC: is a 'gnutls_certificate_credentials_t' type. + + This function will delete all the keys and the certificates + associated with the given credentials. This function must not be + called when a TLS negotiation that uses the credentials is in + progress. + +gnutls_certificate_get_crt_raw +------------------------------ + + -- Function: int gnutls_certificate_get_crt_raw + (gnutls_certificate_credentials_t SC, unsigned IDX1, unsigned + IDX2, gnutls_datum_t * CERT) + SC: is a 'gnutls_certificate_credentials_t' type. + + IDX1: the index of the certificate chain if multiple are present + + IDX2: the index of the certificate in the chain. Zero gives the + server's certificate. + + CERT: Will hold the DER encoded certificate. + + This function will return the DER encoded certificate of the server + or any other certificate on its certificate chain (based on 'idx2' + ). The returned data should be treated as constant and only + accessible during the lifetime of 'sc' . The 'idx1' matches the + value 'gnutls_certificate_set_x509_key()' and friends functions. + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, + otherwise a negative error value. In case the indexes are out of + bounds 'GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE' is returned. + + *Since:* 3.2.5 + +gnutls_certificate_get_issuer +----------------------------- + + -- Function: int gnutls_certificate_get_issuer + (gnutls_certificate_credentials_t SC, gnutls_x509_crt_t CERT, + gnutls_x509_crt_t * ISSUER, unsigned int FLAGS) + SC: is a 'gnutls_certificate_credentials_t' type. + + CERT: is the certificate to find issuer for + + ISSUER: Will hold the issuer if any. Should be treated as + constant. + + FLAGS: Use zero or 'GNUTLS_TL_GET_COPY' + + This function will return the issuer of a given certificate. If + the flag 'GNUTLS_TL_GET_COPY' is specified a copy of the issuer + will be returned which must be freed using + 'gnutls_x509_crt_deinit()' . In that case the provided 'issuer' + must not be initialized. + + As with 'gnutls_x509_trust_list_get_issuer()' this function + requires the 'GNUTLS_TL_GET_COPY' flag in order to operate with + PKCS'11' trust lists in a thread-safe way. + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, + otherwise a negative error value. + + *Since:* 3.0 + +gnutls_certificate_get_ocsp_expiration +-------------------------------------- + + -- Function: time_t gnutls_certificate_get_ocsp_expiration + (gnutls_certificate_credentials_t SC, unsigned IDX, int OIDX, + unsigned FLAGS) + SC: is a credentials structure. + + IDX: is a certificate chain index as returned by + 'gnutls_certificate_set_key()' and friends + + OIDX: is an OCSP response index + + FLAGS: should be zero + + This function returns the validity of the loaded OCSP responses, to + provide information on when to reload/refresh them. + + Note that the credentials structure should be read-only when in + use, thus when reloading, either the credentials structure must not + be in use by any sessions, or a new credentials structure should be + allocated for new sessions. + + When 'oidx' is (-1) then the minimum refresh time for all responses + is returned. Otherwise the index specifies the response + corresponding to the 'odix' certificate in the certificate chain. + + *Returns:* On success, the expiration time of the OCSP response. + Otherwise (time_t)(-1) on error, or (time_t)-2 on out of bounds. + + *Since:* 3.6.3 + +gnutls_certificate_get_ours +--------------------------- + + -- Function: const gnutls_datum_t * gnutls_certificate_get_ours + (gnutls_session_t SESSION) + SESSION: is a gnutls session + + Gets the certificate as sent to the peer in the last handshake. + The certificate is in raw (DER) format. No certificate list is + being returned. Only the first certificate. + + This function returns the certificate that was sent in the current + handshake. In subsequent resumed sessions this function will + return 'NULL' . That differs from 'gnutls_certificate_get_peers()' + which always returns the peer's certificate used in the original + session. + + *Returns:* a pointer to a 'gnutls_datum_t' containing our + certificate, or 'NULL' in case of an error or if no certificate was + used. + +gnutls_certificate_get_peers +---------------------------- + + -- Function: const gnutls_datum_t * gnutls_certificate_get_peers + (gnutls_session_t SESSION, unsigned int * LIST_SIZE) + SESSION: is a gnutls session + + LIST_SIZE: is the length of the certificate list (may be 'NULL' ) + + Get the peer's raw certificate (chain) as sent by the peer. These + certificates are in raw format (DER encoded for X.509). In case of + a X.509 then a certificate list may be present. The list is + provided as sent by the server; the server must send as first + certificate in the list its own certificate, following the issuer's + certificate, then the issuer's issuer etc. However, there are + servers which violate this principle and thus on certain occasions + this may be an unsorted list. + + In resumed sessions, this function will return the peer's + certificate list as used in the first/original session. + + *Returns:* a pointer to a 'gnutls_datum_t' containing the peer's + certificates, or 'NULL' in case of an error or if no certificate + was used. + +gnutls_certificate_get_peers_subkey_id +-------------------------------------- + + -- Function: int gnutls_certificate_get_peers_subkey_id + (gnutls_session_t SESSION, gnutls_datum_t * ID) + SESSION: is a gnutls session + + ID: will contain the ID + + This function is no-op. + + *Returns:* 'GNUTLS_E_UNIMPLEMENTED_FEATURE' . + + *Since:* 3.1.3 + +gnutls_certificate_get_verify_flags +----------------------------------- + + -- Function: unsigned int gnutls_certificate_get_verify_flags + (gnutls_certificate_credentials_t RES) + RES: is a gnutls_certificate_credentials_t type + + Returns the verification flags set with + 'gnutls_certificate_set_verify_flags()' . + + *Returns:* The certificate verification flags used by 'res' . + + *Since:* 3.4.0 + +gnutls_certificate_get_x509_crt +------------------------------- + + -- Function: int gnutls_certificate_get_x509_crt + (gnutls_certificate_credentials_t RES, unsigned INDEX, + gnutls_x509_crt_t ** CRT_LIST, unsigned * CRT_LIST_SIZE) + RES: is a 'gnutls_certificate_credentials_t' type. + + INDEX: The index of the certificate list to obtain. + + CRT_LIST: Where to store the certificate list. + + CRT_LIST_SIZE: Will hold the number of certificates. + + Obtains a X.509 certificate list that has been stored in 'res' with + one of 'gnutls_certificate_set_x509_key()' , + 'gnutls_certificate_set_key()' , + 'gnutls_certificate_set_x509_key_file()' , + 'gnutls_certificate_set_x509_key_file2()' , + 'gnutls_certificate_set_x509_key_mem()' , or + 'gnutls_certificate_set_x509_key_mem2()' . Each certificate in the + returned certificate list must be deallocated with + 'gnutls_x509_crt_deinit()' , and the list itself must be freed with + 'gnutls_free()' . + + The 'index' matches the return value of + 'gnutls_certificate_set_x509_key()' and friends functions, when the + 'GNUTLS_CERTIFICATE_API_V2' flag is set. + + If there is no certificate with the given index, + 'GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE' is returned. If the + certificate with the given index is not a X.509 certificate, + 'GNUTLS_E_INVALID_REQUEST' is returned. The returned certificates + must be deinitialized after use, and the 'crt_list' pointer must be + freed using 'gnutls_free()' . + + *Returns:* 'GNUTLS_E_SUCCESS' (0) on success, or a negative error + code. + + *Since:* 3.4.0 + +gnutls_certificate_get_x509_key +------------------------------- + + -- Function: int gnutls_certificate_get_x509_key + (gnutls_certificate_credentials_t RES, unsigned INDEX, + gnutls_x509_privkey_t * KEY) + RES: is a 'gnutls_certificate_credentials_t' type. + + INDEX: The index of the key to obtain. + + KEY: Location to store the key. + + Obtains a X.509 private key that has been stored in 'res' with one + of 'gnutls_certificate_set_x509_key()' , + 'gnutls_certificate_set_key()' , + 'gnutls_certificate_set_x509_key_file()' , + 'gnutls_certificate_set_x509_key_file2()' , + 'gnutls_certificate_set_x509_key_mem()' , or + 'gnutls_certificate_set_x509_key_mem2()' . The returned key must + be deallocated with 'gnutls_x509_privkey_deinit()' when no longer + needed. + + The 'index' matches the return value of + 'gnutls_certificate_set_x509_key()' and friends functions, when the + 'GNUTLS_CERTIFICATE_API_V2' flag is set. + + If there is no key with the given index, + 'GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE' is returned. If the key + with the given index is not a X.509 key, 'GNUTLS_E_INVALID_REQUEST' + is returned. + + *Returns:* 'GNUTLS_E_SUCCESS' (0) on success, or a negative error + code. + + *Since:* 3.4.0 + +gnutls_certificate_send_x509_rdn_sequence +----------------------------------------- + + -- Function: void gnutls_certificate_send_x509_rdn_sequence + (gnutls_session_t SESSION, int STATUS) + SESSION: a 'gnutls_session_t' type. + + STATUS: is 0 or 1 + + If status is non zero, this function will order gnutls not to send + the rdnSequence in the certificate request message. That is the + server will not advertise its trusted CAs to the peer. If status + is zero then the default behaviour will take effect, which is to + advertise the server's trusted CAs. + + This function has no effect in clients, and in authentication + methods other than certificate with X.509 certificates. + +gnutls_certificate_server_set_request +------------------------------------- + + -- Function: void gnutls_certificate_server_set_request + (gnutls_session_t SESSION, gnutls_certificate_request_t REQ) + SESSION: is a 'gnutls_session_t' type. + + REQ: is one of GNUTLS_CERT_REQUEST, GNUTLS_CERT_REQUIRE, + GNUTLS_CERT_IGNORE + + This function specifies if we (in case of a server) are going to + send a certificate request message to the client. If 'req' is + GNUTLS_CERT_REQUIRE then the server will return the + 'GNUTLS_E_NO_CERTIFICATE_FOUND' error if the peer does not provide + a certificate. If you do not call this function then the client + will not be asked to send a certificate. Invoking the function + with 'req' GNUTLS_CERT_IGNORE has the same effect. + +gnutls_certificate_set_dh_params +-------------------------------- + + -- Function: void gnutls_certificate_set_dh_params + (gnutls_certificate_credentials_t RES, gnutls_dh_params_t + DH_PARAMS) + RES: is a gnutls_certificate_credentials_t type + + DH_PARAMS: the Diffie-Hellman parameters. + + This function will set the Diffie-Hellman parameters for a + certificate server to use. These parameters will be used in + Ephemeral Diffie-Hellman cipher suites. Note that only a pointer + to the parameters are stored in the certificate handle, so you must + not deallocate the parameters before the certificate is + deallocated. + + *Deprecated:* This function is unnecessary and discouraged on + GnuTLS 3.6.0 or later. Since 3.6.0, DH parameters are negotiated + following RFC7919. + +gnutls_certificate_set_flags +---------------------------- + + -- Function: void gnutls_certificate_set_flags + (gnutls_certificate_credentials_t RES, unsigned int FLAGS) + RES: is a gnutls_certificate_credentials_t type + + FLAGS: are the flags of 'gnutls_certificate_flags' type + + This function will set flags to tweak the operation of the + credentials structure. See the 'gnutls_certificate_flags' + enumerations for more information on the available flags. + + *Since:* 3.4.7 + +gnutls_certificate_set_known_dh_params +-------------------------------------- + + -- Function: int gnutls_certificate_set_known_dh_params + (gnutls_certificate_credentials_t RES, gnutls_sec_param_t + SEC_PARAM) + RES: is a gnutls_certificate_credentials_t type + + SEC_PARAM: is an option of the 'gnutls_sec_param_t' enumeration + + This function will set the Diffie-Hellman parameters for a + certificate server to use. These parameters will be used in + Ephemeral Diffie-Hellman cipher suites and will be selected from + the FFDHE set of RFC7919 according to the security level provided. + + *Deprecated:* This function is unnecessary and discouraged on + GnuTLS 3.6.0 or later. Since 3.6.0, DH parameters are negotiated + following RFC7919. + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, + otherwise a negative error value. + + *Since:* 3.5.6 + +gnutls_certificate_set_ocsp_status_request_file +----------------------------------------------- + + -- Function: int gnutls_certificate_set_ocsp_status_request_file + (gnutls_certificate_credentials_t SC, const char * + RESPONSE_FILE, unsigned IDX) + SC: is a credentials structure. + + RESPONSE_FILE: a filename of the OCSP response + + IDX: is a certificate index as returned by + 'gnutls_certificate_set_key()' and friends + + This function loads the provided OCSP response. It will be sent to + the client if requests an OCSP certificate status for the + certificate chain specified by 'idx' . + + *Note:* the ability to set multiple OCSP responses per credential + structure via the index 'idx' was added in version 3.5.6. To keep + backwards compatibility, it requires using + 'gnutls_certificate_set_flags()' with the + 'GNUTLS_CERTIFICATE_API_V2' flag to make the set certificate + functions return an index usable by this function. + + This function can be called multiple times since GnuTLS 3.6.3 when + multiple responses which apply to the chain are available. If the + response provided does not match any certificates present in the + chain, the code 'GNUTLS_E_OCSP_MISMATCH_WITH_CERTS' is returned. + To revert to the previous behavior set the flag + 'GNUTLS_CERTIFICATE_SKIP_OCSP_RESPONSE_CHECK' in the certificate + credentials structure. In that case, only the end-certificate's + OCSP response can be set. If the response is already expired at + the time of loading the code 'GNUTLS_E_EXPIRED' is returned. + + To revert to the previous behavior of this function which does not + return any errors, set the flag + 'GNUTLS_CERTIFICATE_SKIP_OCSP_RESPONSE_CHECK' + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, + otherwise a negative error code is returned. + + *Since:* 3.1.3 + +gnutls_certificate_set_ocsp_status_request_file2 +------------------------------------------------ + + -- Function: int gnutls_certificate_set_ocsp_status_request_file2 + (gnutls_certificate_credentials_t SC, const char * + RESPONSE_FILE, unsigned IDX, gnutls_x509_crt_fmt_t FMT) + SC: is a credentials structure. + + RESPONSE_FILE: a filename of the OCSP response + + IDX: is a certificate index as returned by + 'gnutls_certificate_set_key()' and friends + + FMT: is PEM or DER + + This function loads the OCSP responses to be sent to the peer for + the certificate chain specified by 'idx' . When 'fmt' is set to + PEM, multiple responses can be loaded. + + This function must be called after setting any certificates, and + cannot be used for certificates that are provided via a callback - + that is when 'gnutls_certificate_set_retrieve_function()' is used. + In that case consider using + 'gnutls_certificate_set_retrieve_function3()' . + + This function can be called multiple times when multiple responses + applicable to the certificate chain are available. If the response + provided does not match any certificates present in the chain, the + code 'GNUTLS_E_OCSP_MISMATCH_WITH_CERTS' is returned. If the + response is already expired at the time of loading the code + 'GNUTLS_E_EXPIRED' is returned. + + *Returns:* On success, the number of loaded responses is returned, + otherwise a negative error code. + + *Since:* 3.1.3 + +gnutls_certificate_set_ocsp_status_request_function +--------------------------------------------------- + + -- Function: void gnutls_certificate_set_ocsp_status_request_function + (gnutls_certificate_credentials_t SC, + gnutls_status_request_ocsp_func OCSP_FUNC, void * PTR) + SC: is a 'gnutls_certificate_credentials_t' type. + + OCSP_FUNC: function pointer to OCSP status request callback. + + PTR: opaque pointer passed to callback function + + This function is to be used by server to register a callback to + handle OCSP status requests from the client. The callback will be + invoked if the client supplied a status-request OCSP extension. + The callback function prototype is: + + typedef int (*gnutls_status_request_ocsp_func) (gnutls_session_t + session, void *ptr, gnutls_datum_t *ocsp_response); + + The callback will be invoked if the client requests an OCSP + certificate status. The callback may return + 'GNUTLS_E_NO_CERTIFICATE_STATUS' , if there is no recent OCSP + response. If the callback returns 'GNUTLS_E_SUCCESS' , it is + expected to have the 'ocsp_response' field set with a valid + (DER-encoded) OCSP response. The response must be a value + allocated using 'gnutls_malloc()' , and will be deinitialized by + the caller. + + It is possible to set a specific callback for each provided + certificate using + 'gnutls_certificate_set_ocsp_status_request_function2()' . + + *Since:* 3.1.3 + +gnutls_certificate_set_ocsp_status_request_function2 +---------------------------------------------------- + + -- Function: int gnutls_certificate_set_ocsp_status_request_function2 + (gnutls_certificate_credentials_t SC, unsigned IDX, + gnutls_status_request_ocsp_func OCSP_FUNC, void * PTR) + SC: is a 'gnutls_certificate_credentials_t' type. + + IDX: is a certificate index as returned by + 'gnutls_certificate_set_key()' and friends + + OCSP_FUNC: function pointer to OCSP status request callback. + + PTR: opaque pointer passed to callback function + + This function is to be used by server to register a callback to + provide OCSP status requests that correspond to the indexed + certificate chain from the client. The callback will be invoked if + the client supplied a status-request OCSP extension. + + The callback function prototype is: + + typedef int (*gnutls_status_request_ocsp_func) (gnutls_session_t + session, void *ptr, gnutls_datum_t *ocsp_response); + + The callback will be invoked if the client requests an OCSP + certificate status. The callback may return + 'GNUTLS_E_NO_CERTIFICATE_STATUS' , if there is no recent OCSP + response. If the callback returns 'GNUTLS_E_SUCCESS' , it is + expected to have the 'ocsp_response' field set with a valid + (DER-encoded) OCSP response. The response must be a value + allocated using 'gnutls_malloc()' , and will be deinitialized by + the caller. + + *Note:* the ability to set multiple OCSP responses per credential + structure via the index 'idx' was added in version 3.5.6. To keep + backwards compatibility, it requires using + 'gnutls_certificate_set_flags()' with the + 'GNUTLS_CERTIFICATE_API_V2' flag to make the set certificate + functions return an index usable by this function. + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, + otherwise a negative error code is returned. + + *Since:* 3.5.5 + +gnutls_certificate_set_ocsp_status_request_mem +---------------------------------------------- + + -- Function: int gnutls_certificate_set_ocsp_status_request_mem + (gnutls_certificate_credentials_t SC, const gnutls_datum_t * + RESP_DATA, unsigned IDX, gnutls_x509_crt_fmt_t FMT) + SC: is a credentials structure. + + RESP_DATA: a memory buffer holding an OCSP response + + IDX: is a certificate index as returned by + 'gnutls_certificate_set_key()' and friends + + FMT: is PEM or DER + + This function sets the OCSP responses to be sent to the peer for + the certificate chain specified by 'idx' . When 'fmt' is set to + PEM, multiple responses can be loaded. + + *Note:* the ability to set multiple OCSP responses per credential + structure via the index 'idx' was added in version 3.5.6. To keep + backwards compatibility, it requires using + 'gnutls_certificate_set_flags()' with the + 'GNUTLS_CERTIFICATE_API_V2' flag to make the set certificate + functions return an index usable by this function. + + This function must be called after setting any certificates, and + cannot be used for certificates that are provided via a callback - + that is when 'gnutls_certificate_set_retrieve_function()' is used. + + This function can be called multiple times when multiple responses + which apply to the certificate chain are available. If the + response provided does not match any certificates present in the + chain, the code 'GNUTLS_E_OCSP_MISMATCH_WITH_CERTS' is returned. + If the response is already expired at the time of loading the code + 'GNUTLS_E_EXPIRED' is returned. + + *Returns:* On success, the number of loaded responses is returned, + otherwise a negative error code. + + *Since:* 3.6.3 + +gnutls_certificate_set_params_function +-------------------------------------- + + -- Function: void gnutls_certificate_set_params_function + (gnutls_certificate_credentials_t RES, gnutls_params_function + * FUNC) + RES: is a gnutls_certificate_credentials_t type + + FUNC: is the function to be called + + This function will set a callback in order for the server to get + the Diffie-Hellman or RSA parameters for certificate + authentication. The callback should return 'GNUTLS_E_SUCCESS' (0) + on success. + + *Deprecated:* This function is unnecessary and discouraged on + GnuTLS 3.6.0 or later. Since 3.6.0, DH parameters are negotiated + following RFC7919. + +gnutls_certificate_set_pin_function +----------------------------------- + + -- Function: void gnutls_certificate_set_pin_function + (gnutls_certificate_credentials_t CRED, gnutls_pin_callback_t + FN, void * USERDATA) + CRED: is a 'gnutls_certificate_credentials_t' type. + + FN: A PIN callback + + USERDATA: Data to be passed in the callback + + This function will set a callback function to be used when required + to access a protected object. This function overrides any other + global PIN functions. + + Note that this function must be called right after initialization + to have effect. + + *Since:* 3.1.0 + +gnutls_certificate_set_rawpk_key_file +------------------------------------- + + -- Function: int gnutls_certificate_set_rawpk_key_file + (gnutls_certificate_credentials_t CRED, const char* RAWPKFILE, + const char* PRIVKEYFILE, gnutls_x509_crt_fmt_t FORMAT, const + char * PASS, unsigned int KEY_USAGE, const char ** NAMES, + unsigned int NAMES_LENGTH, unsigned int PRIVKEY_FLAGS, + unsigned int PKCS11_FLAGS) + CRED: is a 'gnutls_certificate_credentials_t' type. + + RAWPKFILE: contains a raw public key in PKIX.SubjectPublicKeyInfo + format. + + PRIVKEYFILE: contains a file path to a private key. + + FORMAT: encoding of the keys. DER or PEM. + + PASS: an optional password to unlock the private key privkeyfile. + + KEY_USAGE: an ORed sequence of 'GNUTLS_KEY_' * flags. + + NAMES: is an array of DNS names belonging to the public-key (NULL + if none). + + NAMES_LENGTH: holds the length of the names list. + + PRIVKEY_FLAGS: an ORed sequence of 'gnutls_pkcs_encrypt_flags_t' . + These apply to the private key pkey. + + PKCS11_FLAGS: one of gnutls_pkcs11_obj_flags. These apply to URLs. + + This function sets a public/private keypair read from file in the + 'gnutls_certificate_credentials_t' type to be used for + authentication and/or encryption. 'spki' and 'privkey' should + match otherwise set signatures cannot be validated. In case of no + match this function returns 'GNUTLS_E_CERTIFICATE_KEY_MISMATCH' . + This function should be called once for the client because there is + currently no mechanism to determine which raw public-key to select + for the peer when there are multiple present. Multiple raw public + keys for the server can be distinghuished by setting the 'names' . + + Note here that 'spki' is a raw public-key as defined in RFC7250. + It means that there is no surrounding certificate that holds the + public key and that there is therefore no direct mechanism to prove + the authenticity of this key. The keypair can be used during a TLS + handshake but its authenticity should be established via a + different mechanism (e.g. TOFU or known fingerprint). + + The supported formats are basic unencrypted key, PKCS8, PKCS12, and + the openssl format and will be autodetected. + + If the raw public-key and the private key are given in PEM encoding + then the strings that hold their values must be null terminated. + + Key usage (as defined by X.509 extension (2.5.29.15)) can be + explicitly set because there is no certificate structure around the + key to define this value. See for more info + 'gnutls_x509_crt_get_key_usage()' . + + Note that, this function by default returns zero on success and a + negative value on error. Since 3.5.6, when the flag + 'GNUTLS_CERTIFICATE_API_V2' is set using + 'gnutls_certificate_set_flags()' it returns an index (greater or + equal to zero). That index can be used in other functions to refer + to the added key-pair. + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, in case + the key pair does not match 'GNUTLS_E_CERTIFICATE_KEY_MISMATCH' is + returned, in other erroneous cases a different negative error code + is returned. + + *Since:* 3.6.6 + +gnutls_certificate_set_rawpk_key_mem +------------------------------------ + + -- Function: int gnutls_certificate_set_rawpk_key_mem + (gnutls_certificate_credentials_t CRED, const gnutls_datum_t* + SPKI, const gnutls_datum_t* PKEY, gnutls_x509_crt_fmt_t + FORMAT, const char* PASS, unsigned int KEY_USAGE, const char + ** NAMES, unsigned int NAMES_LENGTH, unsigned int FLAGS) + CRED: is a 'gnutls_certificate_credentials_t' type. + + SPKI: contains a raw public key in PKIX.SubjectPublicKeyInfo + format. + + PKEY: contains a raw private key. + + FORMAT: encoding of the keys. DER or PEM. + + PASS: an optional password to unlock the private key pkey. + + KEY_USAGE: An ORed sequence of 'GNUTLS_KEY_' * flags. + + NAMES: is an array of DNS names belonging to the public-key (NULL + if none). + + NAMES_LENGTH: holds the length of the names list. + + FLAGS: an ORed sequence of 'gnutls_pkcs_encrypt_flags_t' . These + apply to the private key pkey. + + This function sets a public/private keypair in the + 'gnutls_certificate_credentials_t' type to be used for + authentication and/or encryption. 'spki' and 'privkey' should + match otherwise set signatures cannot be validated. In case of no + match this function returns 'GNUTLS_E_CERTIFICATE_KEY_MISMATCH' . + This function should be called once for the client because there is + currently no mechanism to determine which raw public-key to select + for the peer when there are multiple present. Multiple raw public + keys for the server can be distinghuished by setting the 'names' . + + Note here that 'spki' is a raw public-key as defined in RFC7250. + It means that there is no surrounding certificate that holds the + public key and that there is therefore no direct mechanism to prove + the authenticity of this key. The keypair can be used during a TLS + handshake but its authenticity should be established via a + different mechanism (e.g. TOFU or known fingerprint). + + The supported formats are basic unencrypted key, PKCS8, PKCS12, and + the openssl format and will be autodetected. + + If the raw public-key and the private key are given in PEM encoding + then the strings that hold their values must be null terminated. + + Key usage (as defined by X.509 extension (2.5.29.15)) can be + explicitly set because there is no certificate structure around the + key to define this value. See for more info + 'gnutls_x509_crt_get_key_usage()' . + + Note that, this function by default returns zero on success and a + negative value on error. Since 3.5.6, when the flag + 'GNUTLS_CERTIFICATE_API_V2' is set using + 'gnutls_certificate_set_flags()' it returns an index (greater or + equal to zero). That index can be used in other functions to refer + to the added key-pair. + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, in case + the key pair does not match 'GNUTLS_E_CERTIFICATE_KEY_MISMATCH' is + returned, in other erroneous cases a different negative error code + is returned. + + *Since:* 3.6.6 + +gnutls_certificate_set_retrieve_function +---------------------------------------- + + -- Function: void gnutls_certificate_set_retrieve_function + (gnutls_certificate_credentials_t CRED, + gnutls_certificate_retrieve_function * FUNC) + CRED: is a 'gnutls_certificate_credentials_t' type. + + FUNC: is the callback function + + This function sets a callback to be called in order to retrieve the + certificate to be used in the handshake. The callback will take + control only if a certificate is requested by the peer. You are + advised to use 'gnutls_certificate_set_retrieve_function2()' + because it is much more efficient in the processing it requires + from gnutls. + + The callback's function prototype is: int + (*callback)(gnutls_session_t, const gnutls_datum_t* req_ca_dn, int + nreqs, const gnutls_pk_algorithm_t* pk_algos, int pk_algos_length, + gnutls_retr2_st* st); + + 'req_ca_dn' is only used in X.509 certificates. Contains a list + with the CA names that the server considers trusted. This is a + hint and typically the client should send a certificate that is + signed by one of these CAs. These names, when available, are DER + encoded. To get a more meaningful value use the function + 'gnutls_x509_rdn_get()' . + + 'pk_algos' contains a list with server's acceptable public key + algorithms. The certificate returned should support the server's + given algorithms. + + 'st' should contain the certificates and private keys. + + If the callback function is provided then gnutls will call it, in + the handshake, after the certificate request message has been + received. + + In server side pk_algos and req_ca_dn are NULL. + + The callback function should set the certificate list to be sent, + and return 0 on success. If no certificate was selected then the + number of certificates should be set to zero. The value (-1) + indicates error and the handshake will be terminated. If both + certificates are set in the credentials and a callback is + available, the callback takes predence. + + *Since:* 3.0 + +gnutls_certificate_set_verify_flags +----------------------------------- + + -- Function: void gnutls_certificate_set_verify_flags + (gnutls_certificate_credentials_t RES, unsigned int FLAGS) + RES: is a gnutls_certificate_credentials_t type + + FLAGS: are the flags + + This function will set the flags to be used for verification of + certificates and override any defaults. The provided flags must be + an OR of the 'gnutls_certificate_verify_flags' enumerations. + +gnutls_certificate_set_verify_function +-------------------------------------- + + -- Function: void gnutls_certificate_set_verify_function + (gnutls_certificate_credentials_t CRED, + gnutls_certificate_verify_function * FUNC) + CRED: is a 'gnutls_certificate_credentials_t' type. + + FUNC: is the callback function + + This function sets a callback to be called when peer's certificate + has been received in order to verify it on receipt rather than + doing after the handshake is completed. + + The callback's function prototype is: int + (*callback)(gnutls_session_t); + + If the callback function is provided then gnutls will call it, in + the handshake, just after the certificate message has been + received. To verify or obtain the certificate the + 'gnutls_certificate_verify_peers2()' , + 'gnutls_certificate_type_get()' , 'gnutls_certificate_get_peers()' + functions can be used. + + The callback function should return 0 for the handshake to continue + or non-zero to terminate. + + *Since:* 2.10.0 + +gnutls_certificate_set_verify_limits +------------------------------------ + + -- Function: void gnutls_certificate_set_verify_limits + (gnutls_certificate_credentials_t RES, unsigned int MAX_BITS, + unsigned int MAX_DEPTH) + RES: is a gnutls_certificate_credentials type + + MAX_BITS: is the number of bits of an acceptable certificate + (default 8200) + + MAX_DEPTH: is maximum depth of the verification of a certificate + chain (default 5) + + This function will set some upper limits for the default + verification function, 'gnutls_certificate_verify_peers2()' , to + avoid denial of service attacks. You can set them to zero to + disable limits. + +gnutls_certificate_set_x509_crl +------------------------------- + + -- Function: int gnutls_certificate_set_x509_crl + (gnutls_certificate_credentials_t RES, gnutls_x509_crl_t * + CRL_LIST, int CRL_LIST_SIZE) + RES: is a 'gnutls_certificate_credentials_t' type. + + CRL_LIST: is a list of trusted CRLs. They should have been + verified before. + + CRL_LIST_SIZE: holds the size of the crl_list + + This function adds the trusted CRLs in order to verify client or + server certificates. In case of a client this is not required to + be called if the certificates are not verified using + 'gnutls_certificate_verify_peers2()' . This function may be called + multiple times. + + *Returns:* number of CRLs processed, or a negative error code on + error. + + *Since:* 2.4.0 + +gnutls_certificate_set_x509_crl_file +------------------------------------ + + -- Function: int gnutls_certificate_set_x509_crl_file + (gnutls_certificate_credentials_t RES, const char * CRLFILE, + gnutls_x509_crt_fmt_t TYPE) + RES: is a 'gnutls_certificate_credentials_t' type. + + CRLFILE: is a file containing the list of verified CRLs (DER or PEM + list) + + TYPE: is PEM or DER + + This function adds the trusted CRLs in order to verify client or + server certificates. In case of a client this is not required to + be called if the certificates are not verified using + 'gnutls_certificate_verify_peers2()' . This function may be called + multiple times. + + *Returns:* number of CRLs processed or a negative error code on + error. + +gnutls_certificate_set_x509_crl_mem +----------------------------------- + + -- Function: int gnutls_certificate_set_x509_crl_mem + (gnutls_certificate_credentials_t RES, const gnutls_datum_t * + CRL, gnutls_x509_crt_fmt_t TYPE) + RES: is a 'gnutls_certificate_credentials_t' type. + + CRL: is a list of trusted CRLs. They should have been verified + before. + + TYPE: is DER or PEM + + This function adds the trusted CRLs in order to verify client or + server certificates. In case of a client this is not required to + be called if the certificates are not verified using + 'gnutls_certificate_verify_peers2()' . This function may be called + multiple times. + + *Returns:* number of CRLs processed, or a negative error code on + error. + +gnutls_certificate_set_x509_key +------------------------------- + + -- Function: int gnutls_certificate_set_x509_key + (gnutls_certificate_credentials_t RES, gnutls_x509_crt_t * + CERT_LIST, int CERT_LIST_SIZE, gnutls_x509_privkey_t KEY) + RES: is a 'gnutls_certificate_credentials_t' type. + + CERT_LIST: contains a certificate list (path) for the specified + private key + + CERT_LIST_SIZE: holds the size of the certificate list + + KEY: is a 'gnutls_x509_privkey_t' key + + This function sets a certificate/private key pair in the + gnutls_certificate_credentials_t type. This function may be called + more than once, in case multiple keys/certificates exist for the + server. For clients that wants to send more than their own end + entity certificate (e.g., also an intermediate CA cert) then put + the certificate chain in 'cert_list' . + + Note that the certificates and keys provided, can be safely + deinitialized after this function is called. + + If that function fails to load the 'res' type is at an undefined + state, it must not be reused to load other keys or certificates. + + Note that, this function by default returns zero on success and a + negative value on error. Since 3.5.6, when the flag + 'GNUTLS_CERTIFICATE_API_V2' is set using + 'gnutls_certificate_set_flags()' it returns an index (greater or + equal to zero). That index can be used to other functions to refer + to the added key-pair. + + *Returns:* On success this functions returns zero, and otherwise a + negative value on error (see above for modifying that behavior). + + *Since:* 2.4.0 + +gnutls_certificate_set_x509_key_file +------------------------------------ + + -- Function: int gnutls_certificate_set_x509_key_file + (gnutls_certificate_credentials_t RES, const char * CERTFILE, + const char * KEYFILE, gnutls_x509_crt_fmt_t TYPE) + RES: is a 'gnutls_certificate_credentials_t' type. + + CERTFILE: is a file that containing the certificate list (path) for + the specified private key, in PKCS7 format, or a list of + certificates + + KEYFILE: is a file that contains the private key + + TYPE: is PEM or DER + + This function sets a certificate/private key pair in the + gnutls_certificate_credentials_t type. This function may be called + more than once, in case multiple keys/certificates exist for the + server. For clients that need to send more than its own end entity + certificate, e.g., also an intermediate CA cert, then the + 'certfile' must contain the ordered certificate chain. + + Note that the names in the certificate provided will be considered + when selecting the appropriate certificate to use (in case of + multiple certificate/key pairs). + + This function can also accept URLs at 'keyfile' and 'certfile' . + In that case it will use the private key and certificate indicated + by the URLs. Note that the supported URLs are the ones indicated + by 'gnutls_url_is_supported()' . + + In case the 'certfile' is provided as a PKCS '11' URL, then the + certificate, and its present issuers in the token are imported + (i.e., forming the required trust chain). + + If that function fails to load the 'res' structure is at an + undefined state, it must not be reused to load other keys or + certificates. + + Note that, this function by default returns zero on success and a + negative value on error. Since 3.5.6, when the flag + 'GNUTLS_CERTIFICATE_API_V2' is set using + 'gnutls_certificate_set_flags()' it returns an index (greater or + equal to zero). That index can be used to other functions to refer + to the added key-pair. + + *Returns:* On success this functions returns zero, and otherwise a + negative value on error (see above for modifying that behavior). + + *Since:* 3.1.11 + +gnutls_certificate_set_x509_key_file2 +------------------------------------- + + -- Function: int gnutls_certificate_set_x509_key_file2 + (gnutls_certificate_credentials_t RES, const char * CERTFILE, + const char * KEYFILE, gnutls_x509_crt_fmt_t TYPE, const char * + PASS, unsigned int FLAGS) + RES: is a 'gnutls_certificate_credentials_t' type. + + CERTFILE: is a file that containing the certificate list (path) for + the specified private key, in PKCS7 format, or a list of + certificates + + KEYFILE: is a file that contains the private key + + TYPE: is PEM or DER + + PASS: is the password of the key + + FLAGS: an ORed sequence of gnutls_pkcs_encrypt_flags_t + + This function sets a certificate/private key pair in the + gnutls_certificate_credentials_t type. This function may be called + more than once, in case multiple keys/certificates exist for the + server. For clients that need to send more than its own end entity + certificate, e.g., also an intermediate CA cert, then the + 'certfile' must contain the ordered certificate chain. + + Note that the names in the certificate provided will be considered + when selecting the appropriate certificate to use (in case of + multiple certificate/key pairs). + + This function can also accept URLs at 'keyfile' and 'certfile' . + In that case it will use the private key and certificate indicated + by the URLs. Note that the supported URLs are the ones indicated + by 'gnutls_url_is_supported()' . Before GnuTLS 3.4.0 when a URL + was specified, the 'pass' part was ignored and a PIN callback had + to be registered, this is no longer the case in current releases. + + In case the 'certfile' is provided as a PKCS '11' URL, then the + certificate, and its present issuers in the token are imported + (i.e., forming the required trust chain). + + If that function fails to load the 'res' structure is at an + undefined state, it must not be reused to load other keys or + certificates. + + Note that, this function by default returns zero on success and a + negative value on error. Since 3.5.6, when the flag + 'GNUTLS_CERTIFICATE_API_V2' is set using + 'gnutls_certificate_set_flags()' it returns an index (greater or + equal to zero). That index can be used to other functions to refer + to the added key-pair. + + *Returns:* On success this functions returns zero, and otherwise a + negative value on error (see above for modifying that behavior). + +gnutls_certificate_set_x509_key_mem +----------------------------------- + + -- Function: int gnutls_certificate_set_x509_key_mem + (gnutls_certificate_credentials_t RES, const gnutls_datum_t * + CERT, const gnutls_datum_t * KEY, gnutls_x509_crt_fmt_t TYPE) + RES: is a 'gnutls_certificate_credentials_t' type. + + CERT: contains a certificate list (path) for the specified private + key + + KEY: is the private key, or 'NULL' + + TYPE: is PEM or DER + + This function sets a certificate/private key pair in the + gnutls_certificate_credentials_t type. This function may be called + more than once, in case multiple keys/certificates exist for the + server. + + Note that the keyUsage (2.5.29.15) PKIX extension in X.509 + certificates is supported. This means that certificates intended + for signing cannot be used for ciphersuites that require + encryption. + + If the certificate and the private key are given in PEM encoding + then the strings that hold their values must be null terminated. + + The 'key' may be 'NULL' if you are using a sign callback, see + 'gnutls_sign_callback_set()' . + + Note that, this function by default returns zero on success and a + negative value on error. Since 3.5.6, when the flag + 'GNUTLS_CERTIFICATE_API_V2' is set using + 'gnutls_certificate_set_flags()' it returns an index (greater or + equal to zero). That index can be used to other functions to refer + to the added key-pair. + + *Returns:* On success this functions returns zero, and otherwise a + negative value on error (see above for modifying that behavior). + +gnutls_certificate_set_x509_key_mem2 +------------------------------------ + + -- Function: int gnutls_certificate_set_x509_key_mem2 + (gnutls_certificate_credentials_t RES, const gnutls_datum_t * + CERT, const gnutls_datum_t * KEY, gnutls_x509_crt_fmt_t TYPE, + const char * PASS, unsigned int FLAGS) + RES: is a 'gnutls_certificate_credentials_t' type. + + CERT: contains a certificate list (path) for the specified private + key + + KEY: is the private key, or 'NULL' + + TYPE: is PEM or DER + + PASS: is the key's password + + FLAGS: an ORed sequence of gnutls_pkcs_encrypt_flags_t + + This function sets a certificate/private key pair in the + gnutls_certificate_credentials_t type. This function may be called + more than once, in case multiple keys/certificates exist for the + server. + + Note that the keyUsage (2.5.29.15) PKIX extension in X.509 + certificates is supported. This means that certificates intended + for signing cannot be used for ciphersuites that require + encryption. + + If the certificate and the private key are given in PEM encoding + then the strings that hold their values must be null terminated. + + The 'key' may be 'NULL' if you are using a sign callback, see + 'gnutls_sign_callback_set()' . + + Note that, this function by default returns zero on success and a + negative value on error. Since 3.5.6, when the flag + 'GNUTLS_CERTIFICATE_API_V2' is set using + 'gnutls_certificate_set_flags()' it returns an index (greater or + equal to zero). That index can be used to other functions to refer + to the added key-pair. + + *Returns:* On success this functions returns zero, and otherwise a + negative value on error (see above for modifying that behavior). + +gnutls_certificate_set_x509_simple_pkcs12_file +---------------------------------------------- + + -- Function: int gnutls_certificate_set_x509_simple_pkcs12_file + (gnutls_certificate_credentials_t RES, const char * + PKCS12FILE, gnutls_x509_crt_fmt_t TYPE, const char * PASSWORD) + RES: is a 'gnutls_certificate_credentials_t' type. + + PKCS12FILE: filename of file containing PKCS'12' blob. + + TYPE: is PEM or DER of the 'pkcs12file' . + + PASSWORD: optional password used to decrypt PKCS'12' file, bags and + keys. + + This function sets a certificate/private key pair and/or a CRL in + the gnutls_certificate_credentials_t type. This function may be + called more than once (in case multiple keys/certificates exist for + the server). + + PKCS'12' files with a MAC, encrypted bags and PKCS '8' private keys + are supported. However, only password based security, and the same + password for all operations, are supported. + + PKCS'12' file may contain many keys and/or certificates, and this + function will try to auto-detect based on the key ID the + certificate and key pair to use. If the PKCS'12' file contain the + issuer of the selected certificate, it will be appended to the + certificate to form a chain. + + If more than one private keys are stored in the PKCS'12' file, then + only one key will be read (and it is undefined which one). + + It is believed that the limitations of this function is acceptable + for most usage, and that any more flexibility would introduce + complexity that would make it harder to use this functionality at + all. + + Note that, this function by default returns zero on success and a + negative value on error. Since 3.5.6, when the flag + 'GNUTLS_CERTIFICATE_API_V2' is set using + 'gnutls_certificate_set_flags()' it returns an index (greater or + equal to zero). That index can be used to other functions to refer + to the added key-pair. + + *Returns:* On success this functions returns zero, and otherwise a + negative value on error (see above for modifying that behavior). + +gnutls_certificate_set_x509_simple_pkcs12_mem +--------------------------------------------- + + -- Function: int gnutls_certificate_set_x509_simple_pkcs12_mem + (gnutls_certificate_credentials_t RES, const gnutls_datum_t * + P12BLOB, gnutls_x509_crt_fmt_t TYPE, const char * PASSWORD) + RES: is a 'gnutls_certificate_credentials_t' type. + + P12BLOB: the PKCS'12' blob. + + TYPE: is PEM or DER of the 'pkcs12file' . + + PASSWORD: optional password used to decrypt PKCS'12' file, bags and + keys. + + This function sets a certificate/private key pair and/or a CRL in + the gnutls_certificate_credentials_t type. This function may be + called more than once (in case multiple keys/certificates exist for + the server). + + Encrypted PKCS'12' bags and PKCS'8' private keys are supported. + However, only password based security, and the same password for + all operations, are supported. + + PKCS'12' file may contain many keys and/or certificates, and this + function will try to auto-detect based on the key ID the + certificate and key pair to use. If the PKCS'12' file contain the + issuer of the selected certificate, it will be appended to the + certificate to form a chain. + + If more than one private keys are stored in the PKCS'12' file, then + only one key will be read (and it is undefined which one). + + It is believed that the limitations of this function is acceptable + for most usage, and that any more flexibility would introduce + complexity that would make it harder to use this functionality at + all. + + Note that, this function by default returns zero on success and a + negative value on error. Since 3.5.6, when the flag + 'GNUTLS_CERTIFICATE_API_V2' is set using + 'gnutls_certificate_set_flags()' it returns an index (greater or + equal to zero). That index can be used to other functions to refer + to the added key-pair. + + *Returns:* On success this functions returns zero, and otherwise a + negative value on error (see above for modifying that behavior). + + *Since:* 2.8.0 + +gnutls_certificate_set_x509_system_trust +---------------------------------------- + + -- Function: int gnutls_certificate_set_x509_system_trust + (gnutls_certificate_credentials_t CRED) + CRED: is a 'gnutls_certificate_credentials_t' type. + + This function adds the system's default trusted CAs in order to + verify client or server certificates. + + In the case the system is currently unsupported + 'GNUTLS_E_UNIMPLEMENTED_FEATURE' is returned. + + *Returns:* the number of certificates processed or a negative error + code on error. + + *Since:* 3.0.20 + +gnutls_certificate_set_x509_trust +--------------------------------- + + -- Function: int gnutls_certificate_set_x509_trust + (gnutls_certificate_credentials_t RES, gnutls_x509_crt_t * + CA_LIST, int CA_LIST_SIZE) + RES: is a 'gnutls_certificate_credentials_t' type. + + CA_LIST: is a list of trusted CAs + + CA_LIST_SIZE: holds the size of the CA list + + This function adds the trusted CAs in order to verify client or + server certificates. In case of a client this is not required to + be called if the certificates are not verified using + 'gnutls_certificate_verify_peers2()' . This function may be called + multiple times. + + In case of a server the CAs set here will be sent to the client if + a certificate request is sent. This can be disabled using + 'gnutls_certificate_send_x509_rdn_sequence()' . + + *Returns:* the number of certificates processed or a negative error + code on error. + + *Since:* 2.4.0 + +gnutls_certificate_set_x509_trust_dir +------------------------------------- + + -- Function: int gnutls_certificate_set_x509_trust_dir + (gnutls_certificate_credentials_t CRED, const char * CA_DIR, + gnutls_x509_crt_fmt_t TYPE) + CRED: is a 'gnutls_certificate_credentials_t' type. + + CA_DIR: is a directory containing the list of trusted CAs (DER or + PEM list) + + TYPE: is PEM or DER + + This function adds the trusted CAs present in the directory in + order to verify client or server certificates. This function is + identical to 'gnutls_certificate_set_x509_trust_file()' but loads + all certificates in a directory. + + *Returns:* the number of certificates processed + + *Since:* 3.3.6 + +gnutls_certificate_set_x509_trust_file +-------------------------------------- + + -- Function: int gnutls_certificate_set_x509_trust_file + (gnutls_certificate_credentials_t CRED, const char * CAFILE, + gnutls_x509_crt_fmt_t TYPE) + CRED: is a 'gnutls_certificate_credentials_t' type. + + CAFILE: is a file containing the list of trusted CAs (DER or PEM + list) + + TYPE: is PEM or DER + + This function adds the trusted CAs in order to verify client or + server certificates. In case of a client this is not required to + be called if the certificates are not verified using + 'gnutls_certificate_verify_peers2()' . This function may be called + multiple times. + + In case of a server the names of the CAs set here will be sent to + the client if a certificate request is sent. This can be disabled + using 'gnutls_certificate_send_x509_rdn_sequence()' . + + This function can also accept URLs. In that case it will import + all certificates that are marked as trusted. Note that the + supported URLs are the ones indicated by + 'gnutls_url_is_supported()' . + + *Returns:* the number of certificates processed + +gnutls_certificate_set_x509_trust_mem +------------------------------------- + + -- Function: int gnutls_certificate_set_x509_trust_mem + (gnutls_certificate_credentials_t RES, const gnutls_datum_t * + CA, gnutls_x509_crt_fmt_t TYPE) + RES: is a 'gnutls_certificate_credentials_t' type. + + CA: is a list of trusted CAs or a DER certificate + + TYPE: is DER or PEM + + This function adds the trusted CAs in order to verify client or + server certificates. In case of a client this is not required to + be called if the certificates are not verified using + 'gnutls_certificate_verify_peers2()' . This function may be called + multiple times. + + In case of a server the CAs set here will be sent to the client if + a certificate request is sent. This can be disabled using + 'gnutls_certificate_send_x509_rdn_sequence()' . + + *Returns:* the number of certificates processed or a negative error + code on error. + +gnutls_certificate_type_get +--------------------------- + + -- Function: gnutls_certificate_type_t gnutls_certificate_type_get + (gnutls_session_t SESSION) + SESSION: is a 'gnutls_session_t' type. + + This function returns the type of the certificate that is + negotiated for this side to send to the peer. The certificate type + is by default X.509, unless an alternative certificate type is + enabled by 'gnutls_init()' and negotiated during the session. + + Resumed sessions will return the certificate type that was + negotiated and used in the original session. + + As of version 3.6.4 it is recommended to use + 'gnutls_certificate_type_get2()' which is more fine-grained. + + *Returns:* the currently used 'gnutls_certificate_type_t' + certificate type as negotiated for 'our' side of the connection. + +gnutls_certificate_type_get2 +---------------------------- + + -- Function: gnutls_certificate_type_t gnutls_certificate_type_get2 + (gnutls_session_t SESSION, gnutls_ctype_target_t TARGET) + SESSION: is a 'gnutls_session_t' type. + + TARGET: is a 'gnutls_ctype_target_t' type. + + This function returns the type of the certificate that a side is + negotiated to use. The certificate type is by default X.509, + unless an alternative certificate type is enabled by + 'gnutls_init()' and negotiated during the session. + + The 'target' parameter specifies whether to request the negotiated + certificate type for the client ('GNUTLS_CTYPE_CLIENT' ), or for + the server ('GNUTLS_CTYPE_SERVER' ). Additionally, in P2P mode + connection set up where you don't know in advance who will be + client and who will be server you can use the flag + ('GNUTLS_CTYPE_OURS' ) and ('GNUTLS_CTYPE_PEERS' ) to retrieve the + corresponding certificate types. + + Resumed sessions will return the certificate type that was + negotiated and used in the original session. That is, this + function can be used to reliably determine the type of the + certificate returned by 'gnutls_certificate_get_peers()' . + + *Returns:* the currently used 'gnutls_certificate_type_t' + certificate type for the client or the server. + + *Since:* 3.6.4 + +gnutls_certificate_type_get_id +------------------------------ + + -- Function: gnutls_certificate_type_t gnutls_certificate_type_get_id + (const char * NAME) + NAME: is a certificate type name + + The names are compared in a case insensitive way. + + *Returns:* a 'gnutls_certificate_type_t' for the specified in a + string certificate type, or 'GNUTLS_CRT_UNKNOWN' on error. + +gnutls_certificate_type_get_name +-------------------------------- + + -- Function: const char * gnutls_certificate_type_get_name + (gnutls_certificate_type_t TYPE) + TYPE: is a certificate type + + Convert a 'gnutls_certificate_type_t' type to a string. + + *Returns:* a string that contains the name of the specified + certificate type, or 'NULL' in case of unknown types. + +gnutls_certificate_type_list +---------------------------- + + -- Function: const gnutls_certificate_type_t * + gnutls_certificate_type_list ( VOID) + + Get a list of certificate types. + + *Returns:* a (0)-terminated list of 'gnutls_certificate_type_t' + integers indicating the available certificate types. + +gnutls_certificate_verification_status_print +-------------------------------------------- + + -- Function: int gnutls_certificate_verification_status_print (unsigned + int STATUS, gnutls_certificate_type_t TYPE, gnutls_datum_t * + OUT, unsigned int FLAGS) + STATUS: The status flags to be printed + + TYPE: The certificate type + + OUT: Newly allocated datum with (0) terminated string. + + FLAGS: should be zero + + This function will pretty print the status of a verification + process - eg. the one obtained by + 'gnutls_certificate_verify_peers3()' . + + The output 'out' needs to be deallocated using 'gnutls_free()' . + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, + otherwise a negative error value. + + *Since:* 3.1.4 + +gnutls_certificate_verify_peers +------------------------------- + + -- Function: int gnutls_certificate_verify_peers (gnutls_session_t + SESSION, gnutls_typed_vdata_st * DATA, unsigned int ELEMENTS, + unsigned int * STATUS) + SESSION: is a gnutls session + + DATA: an array of typed data + + ELEMENTS: the number of data elements + + STATUS: is the output of the verification + + This function will verify the peer's certificate and store the the + status in the 'status' variable as a bitwise OR of + gnutls_certificate_status_t values or zero if the certificate is + trusted. Note that value in 'status' is set only when the return + value of this function is success (i.e, failure to trust a + certificate does not imply a negative return value). The default + verification flags used by this function can be overridden using + 'gnutls_certificate_set_verify_flags()' . See the documentation of + 'gnutls_certificate_verify_peers2()' for details in the + verification process. + + This function will take into account the stapled OCSP responses + sent by the server, as well as the following X.509 certificate + extensions: Name Constraints, Key Usage, and Basic Constraints + (pathlen). + + The acceptable 'data' types are 'GNUTLS_DT_DNS_HOSTNAME' , + 'GNUTLS_DT_RFC822NAME' and 'GNUTLS_DT_KEY_PURPOSE_OID' . The + former two accept as data a null-terminated hostname or email + address, and the latter a null-terminated object identifier (e.g., + 'GNUTLS_KP_TLS_WWW_SERVER' ). + + If a DNS hostname is provided then this function will compare the + hostname in the certificate against the given. If names do not + match the 'GNUTLS_CERT_UNEXPECTED_OWNER' status flag will be set. + If a key purpose OID is provided and the end-certificate contains + the extended key usage PKIX extension, it will be required to be + have the provided key purpose or be marked for any purpose, + otherwise verification status will have the + 'GNUTLS_CERT_SIGNER_CONSTRAINTS_FAILURE' flag set. + + To avoid denial of service attacks some default upper limits + regarding the certificate key size and chain size are set. To + override them use 'gnutls_certificate_set_verify_limits()' . + + Note that when using raw public-keys verification will not work + because there is no corresponding certificate body belonging to the + raw key that can be verified. In that case this function will + return 'GNUTLS_E_INVALID_REQUEST' . + + *Returns:* 'GNUTLS_E_SUCCESS' (0) when the validation is performed, + or a negative error code otherwise. A successful error code means + that the 'status' parameter must be checked to obtain the + validation status. + + *Since:* 3.3.0 + +gnutls_certificate_verify_peers2 +-------------------------------- + + -- Function: int gnutls_certificate_verify_peers2 (gnutls_session_t + SESSION, unsigned int * STATUS) + SESSION: is a gnutls session + + STATUS: is the output of the verification + + This function will verify the peer's certificate and store the + status in the 'status' variable as a bitwise OR of + gnutls_certificate_status_t values or zero if the certificate is + trusted. Note that value in 'status' is set only when the return + value of this function is success (i.e, failure to trust a + certificate does not imply a negative return value). The default + verification flags used by this function can be overridden using + 'gnutls_certificate_set_verify_flags()' . + + This function will take into account the stapled OCSP responses + sent by the server, as well as the following X.509 certificate + extensions: Name Constraints, Key Usage, and Basic Constraints + (pathlen). + + Note that you must also check the peer's name in order to check if + the verified certificate belongs to the actual peer, see + 'gnutls_x509_crt_check_hostname()' , or use + 'gnutls_certificate_verify_peers3()' . + + To avoid denial of service attacks some default upper limits + regarding the certificate key size and chain size are set. To + override them use 'gnutls_certificate_set_verify_limits()' . + + Note that when using raw public-keys verification will not work + because there is no corresponding certificate body belonging to the + raw key that can be verified. In that case this function will + return 'GNUTLS_E_INVALID_REQUEST' . + + *Returns:* 'GNUTLS_E_SUCCESS' (0) when the validation is performed, + or a negative error code otherwise. A successful error code means + that the 'status' parameter must be checked to obtain the + validation status. + +gnutls_certificate_verify_peers3 +-------------------------------- + + -- Function: int gnutls_certificate_verify_peers3 (gnutls_session_t + SESSION, const char * HOSTNAME, unsigned int * STATUS) + SESSION: is a gnutls session + + HOSTNAME: is the expected name of the peer; may be 'NULL' + + STATUS: is the output of the verification + + This function will verify the peer's certificate and store the the + status in the 'status' variable as a bitwise OR of + gnutls_certificate_status_t values or zero if the certificate is + trusted. Note that value in 'status' is set only when the return + value of this function is success (i.e, failure to trust a + certificate does not imply a negative return value). The default + verification flags used by this function can be overridden using + 'gnutls_certificate_set_verify_flags()' . See the documentation of + 'gnutls_certificate_verify_peers2()' for details in the + verification process. + + This function will take into account the stapled OCSP responses + sent by the server, as well as the following X.509 certificate + extensions: Name Constraints, Key Usage, and Basic Constraints + (pathlen). + + If the 'hostname' provided is non-NULL then this function will + compare the hostname in the certificate against it. The comparison + will follow the RFC6125 recommendations. If names do not match the + 'GNUTLS_CERT_UNEXPECTED_OWNER' status flag will be set. + + In order to verify the purpose of the end-certificate (by checking + the extended key usage), use 'gnutls_certificate_verify_peers()' . + + To avoid denial of service attacks some default upper limits + regarding the certificate key size and chain size are set. To + override them use 'gnutls_certificate_set_verify_limits()' . + + Note that when using raw public-keys verification will not work + because there is no corresponding certificate body belonging to the + raw key that can be verified. In that case this function will + return 'GNUTLS_E_INVALID_REQUEST' . + + *Returns:* 'GNUTLS_E_SUCCESS' (0) when the validation is performed, + or a negative error code otherwise. A successful error code means + that the 'status' parameter must be checked to obtain the + validation status. + + *Since:* 3.1.4 + +gnutls_check_version +-------------------- + + -- Function: const char * gnutls_check_version (const char * + REQ_VERSION) + REQ_VERSION: version string to compare with, or 'NULL' . + + Check the GnuTLS Library version against the provided string. See + 'GNUTLS_VERSION' for a suitable 'req_version' string. + + See also 'gnutls_check_version_numeric()' , which provides this + functionality as a macro. + + *Returns:* Check that the version of the library is at minimum the + one given as a string in 'req_version' and return the actual + version string of the library; return 'NULL' if the condition is + not met. If 'NULL' is passed to this function no check is done and + only the version string is returned. + +gnutls_cipher_get +----------------- + + -- Function: gnutls_cipher_algorithm_t gnutls_cipher_get + (gnutls_session_t SESSION) + SESSION: is a 'gnutls_session_t' type. + + Get the currently used cipher. + + *Returns:* the currently used cipher, a 'gnutls_cipher_algorithm_t' + type. + +gnutls_cipher_get_id +-------------------- + + -- Function: gnutls_cipher_algorithm_t gnutls_cipher_get_id (const char + * NAME) + NAME: is a cipher algorithm name + + The names are compared in a case insensitive way. + + *Returns:* return a 'gnutls_cipher_algorithm_t' value corresponding + to the specified cipher, or 'GNUTLS_CIPHER_UNKNOWN' on error. + +gnutls_cipher_get_key_size +-------------------------- + + -- Function: size_t gnutls_cipher_get_key_size + (gnutls_cipher_algorithm_t ALGORITHM) + ALGORITHM: is an encryption algorithm + + This function returns the key size of the provided algorithm. + + *Returns:* length (in bytes) of the given cipher's key size, or 0 + if the given cipher is invalid. + +gnutls_cipher_get_name +---------------------- + + -- Function: const char * gnutls_cipher_get_name + (gnutls_cipher_algorithm_t ALGORITHM) + ALGORITHM: is an encryption algorithm + + Convert a 'gnutls_cipher_algorithm_t' type to a string. + + *Returns:* a pointer to a string that contains the name of the + specified cipher, or 'NULL' . + +gnutls_cipher_list +------------------ + + -- Function: const gnutls_cipher_algorithm_t * gnutls_cipher_list ( + VOID) + + Get a list of supported cipher algorithms. Note that not + necessarily all ciphers are supported as TLS cipher suites. For + example, DES is not supported as a cipher suite, but is supported + for other purposes (e.g., PKCS'8' or similar). + + This function is not thread safe. + + *Returns:* a (0)-terminated list of 'gnutls_cipher_algorithm_t' + integers indicating the available ciphers. + +gnutls_cipher_suite_get_name +---------------------------- + + -- Function: const char * gnutls_cipher_suite_get_name + (gnutls_kx_algorithm_t KX_ALGORITHM, gnutls_cipher_algorithm_t + CIPHER_ALGORITHM, gnutls_mac_algorithm_t MAC_ALGORITHM) + KX_ALGORITHM: is a Key exchange algorithm + + CIPHER_ALGORITHM: is a cipher algorithm + + MAC_ALGORITHM: is a MAC algorithm + + This function returns the ciphersuite name under TLS1.2 or earlier + versions when provided with individual algorithms. The full cipher + suite name must be prepended by TLS or SSL depending of the + protocol in use. + + To get a description of the current ciphersuite across versions, it + is recommended to use 'gnutls_session_get_desc()' . + + *Returns:* a string that contains the name of a TLS cipher suite, + specified by the given algorithms, or 'NULL' . + +gnutls_cipher_suite_info +------------------------ + + -- Function: const char * gnutls_cipher_suite_info (size_t IDX, + unsigned char * CS_ID, gnutls_kx_algorithm_t * KX, + gnutls_cipher_algorithm_t * CIPHER, gnutls_mac_algorithm_t * + MAC, gnutls_protocol_t * MIN_VERSION) + IDX: index of cipher suite to get information about, starts on 0. + + CS_ID: output buffer with room for 2 bytes, indicating cipher suite + value + + KX: output variable indicating key exchange algorithm, or 'NULL' . + + CIPHER: output variable indicating cipher, or 'NULL' . + + MAC: output variable indicating MAC algorithm, or 'NULL' . + + MIN_VERSION: output variable indicating TLS protocol version, or + 'NULL' . + + Get information about supported cipher suites. Use the function + iteratively to get information about all supported cipher suites. + Call with idx=0 to get information about first cipher suite, then + idx=1 and so on until the function returns NULL. + + *Returns:* the name of 'idx' cipher suite, and set the information + about the cipher suite in the output variables. If 'idx' is out of + bounds, 'NULL' is returned. + +gnutls_ciphersuite_get +---------------------- + + -- Function: const char * gnutls_ciphersuite_get (gnutls_session_t + SESSION) + SESSION: is a 'gnutls_session_t' type. + + Get the canonical name of negotiated TLS ciphersuite. The names + returned by this function match the IANA registry, with one + exception: + + TLS_DHE_DSS_RC4_128_SHA { 0x00, 0x66 } + + which is reserved for compatibility. + + To get a detailed description of the current ciphersuite, it is + recommended to use 'gnutls_session_get_desc()' . + + *Returns:* a string that contains the canonical name of a TLS + ciphersuite, or 'NULL' if the handshake is not completed. + + *Since:* 3.7.4 + +gnutls_compress_certificate_get_selected_method +----------------------------------------------- + + -- Function: gnutls_compression_method_t + gnutls_compress_certificate_get_selected_method + (gnutls_session_t SESSION) + SESSION: is a 'gnutls_session_t' type. + + This function returns the certificate compression method that has + been selected to compress the certificate before sending it to the + peer. The selection is done based on the local list of supported + compression methods and the peer's requested compression methods. + + *Returns:* selected certificate compression method. + + Since 3.7.4 + +gnutls_compress_certificate_set_methods +--------------------------------------- + + -- Function: int gnutls_compress_certificate_set_methods + (gnutls_session_t SESSION, const gnutls_compression_method_t * + METHODS, size_t METHODS_LEN) + SESSION: is a 'gnutls_session_t' type. + + METHODS: is a list of supported compression methods. + + METHODS_LEN: number of compression methods in 'methods' + + This function sets the supported compression methods for + certificate compression for the given session. The list of + supported compression methods will be used for a) requesting the + compression of peer's certificate and b) selecting the method to + compress the local certificate before sending it to the peer. The + order of compression methods inside the list does matter as the + method that appears earlier in the list will be preffered before + the later ones. Note that even if you set the list of supported + compression methods, the compression might not be used if the peer + does not support any of your chosen compression methods. + + The list of supported compression methods must meet the following + criteria: Argument 'methods' must be an array of valid compression + methods of type 'gnutls_compression_method_t' . Argument + 'methods_len' must contain the number of compression methods stored + in the 'methods' array and must be within range <1, 127>. The + length constraints are defined by + 'MIN_COMPRESS_CERTIFICATE_METHODS' and + 'MAX_COMPRESS_CERTIFICATE_METHODS' macros located in the header + file compress_certificate.h. + + If either 'methods' or 'methods_len' is equal to 0, current list of + supported compression methods will be unset. + + *Returns:* 'GNUTLS_E_SUCCESS' on success, otherwise a negative + error code. + + Since 3.7.4 + +gnutls_credentials_clear +------------------------ + + -- Function: void gnutls_credentials_clear (gnutls_session_t SESSION) + SESSION: is a 'gnutls_session_t' type. + + Clears all the credentials previously set in this session. + +gnutls_credentials_get +---------------------- + + -- Function: int gnutls_credentials_get (gnutls_session_t SESSION, + gnutls_credentials_type_t TYPE, void ** CRED) + SESSION: is a 'gnutls_session_t' type. + + TYPE: is the type of the credentials to return + + CRED: will contain the credentials. + + Returns the previously provided credentials structures. + + For 'GNUTLS_CRD_ANON' , 'cred' will be + 'gnutls_anon_client_credentials_t' in case of a client. In case of + a server it should be 'gnutls_anon_server_credentials_t' . + + For 'GNUTLS_CRD_SRP' , 'cred' will be + 'gnutls_srp_client_credentials_t' in case of a client, and + 'gnutls_srp_server_credentials_t' , in case of a server. + + For 'GNUTLS_CRD_CERTIFICATE' , 'cred' will be + 'gnutls_certificate_credentials_t' . + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, + otherwise a negative error code is returned. + + *Since:* 3.3.3 + +gnutls_credentials_set +---------------------- + + -- Function: int gnutls_credentials_set (gnutls_session_t SESSION, + gnutls_credentials_type_t TYPE, void * CRED) + SESSION: is a 'gnutls_session_t' type. + + TYPE: is the type of the credentials + + CRED: the credentials to set + + Sets the needed credentials for the specified type. E.g. + username, password - or public and private keys etc. The 'cred' + parameter is a structure that depends on the specified type and on + the current session (client or server). + + In order to minimize memory usage, and share credentials between + several threads gnutls keeps a pointer to cred, and not the whole + cred structure. Thus you will have to keep the structure allocated + until you call 'gnutls_deinit()' . + + For 'GNUTLS_CRD_ANON' , 'cred' should be + 'gnutls_anon_client_credentials_t' in case of a client. In case of + a server it should be 'gnutls_anon_server_credentials_t' . + + For 'GNUTLS_CRD_SRP' , 'cred' should be + 'gnutls_srp_client_credentials_t' in case of a client, and + 'gnutls_srp_server_credentials_t' , in case of a server. + + For 'GNUTLS_CRD_CERTIFICATE' , 'cred' should be + 'gnutls_certificate_credentials_t' . + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, + otherwise a negative error code is returned. + +gnutls_db_check_entry +--------------------- + + -- Function: int gnutls_db_check_entry (gnutls_session_t SESSION, + gnutls_datum_t SESSION_ENTRY) + SESSION: is a 'gnutls_session_t' type. + + SESSION_ENTRY: is the session data (not key) + + This function has no effect. + + *Returns:* Returns 'GNUTLS_E_EXPIRED' , if the database entry has + expired or 0 otherwise. + + *Deprecated:* This function is deprecated. + +gnutls_db_check_entry_expire_time +--------------------------------- + + -- Function: time_t gnutls_db_check_entry_expire_time (gnutls_datum_t * + ENTRY) + ENTRY: is a pointer to a 'gnutls_datum_t' type. + + This function returns the time that this entry will expire. It can + be used for database entry expiration. + + *Returns:* The time this entry will expire, or zero on error. + + *Since:* 3.6.5 + +gnutls_db_check_entry_time +-------------------------- + + -- Function: time_t gnutls_db_check_entry_time (gnutls_datum_t * ENTRY) + ENTRY: is a pointer to a 'gnutls_datum_t' type. + + This function returns the time that this entry was active. It can + be used for database entry expiration. + + *Returns:* The time this entry was created, or zero on error. + +gnutls_db_get_default_cache_expiration +-------------------------------------- + + -- Function: unsigned gnutls_db_get_default_cache_expiration ( VOID) + + Returns the expiration time (in seconds) of stored sessions for + resumption. + +gnutls_db_get_ptr +----------------- + + -- Function: void * gnutls_db_get_ptr (gnutls_session_t SESSION) + SESSION: is a 'gnutls_session_t' type. + + Get db function pointer. + + *Returns:* the pointer that will be sent to db store, retrieve and + delete functions, as the first argument. + +gnutls_db_remove_session +------------------------ + + -- Function: void gnutls_db_remove_session (gnutls_session_t SESSION) + SESSION: is a 'gnutls_session_t' type. + + This function will remove the current session data from the session + database. This will prevent future handshakes reusing these + session data. This function should be called if a session was + terminated abnormally, and before 'gnutls_deinit()' is called. + + Normally 'gnutls_deinit()' will remove abnormally terminated + sessions. + +gnutls_db_set_cache_expiration +------------------------------ + + -- Function: void gnutls_db_set_cache_expiration (gnutls_session_t + SESSION, int SECONDS) + SESSION: is a 'gnutls_session_t' type. + + SECONDS: is the number of seconds. + + Set the expiration time for resumed sessions. The default is 21600 + (6 hours) at the time of writing. + + The maximum value that can be set using this function is 604800 (7 + days). + +gnutls_db_set_ptr +----------------- + + -- Function: void gnutls_db_set_ptr (gnutls_session_t SESSION, void * + PTR) + SESSION: is a 'gnutls_session_t' type. + + PTR: is the pointer + + Sets the pointer that will be provided to db store, retrieve and + delete functions, as the first argument. + +gnutls_db_set_remove_function +----------------------------- + + -- Function: void gnutls_db_set_remove_function (gnutls_session_t + SESSION, gnutls_db_remove_func REM_FUNC) + SESSION: is a 'gnutls_session_t' type. + + REM_FUNC: is the function. + + Sets the function that will be used to remove data from the resumed + sessions database. This function must return 0 on success. + + The first argument to 'rem_func' will be null unless + 'gnutls_db_set_ptr()' has been called. + +gnutls_db_set_retrieve_function +------------------------------- + + -- Function: void gnutls_db_set_retrieve_function (gnutls_session_t + SESSION, gnutls_db_retr_func RETR_FUNC) + SESSION: is a 'gnutls_session_t' type. + + RETR_FUNC: is the function. + + Sets the function that will be used to retrieve data from the + resumed sessions database. This function must return a + gnutls_datum_t containing the data on success, or a gnutls_datum_t + containing null and 0 on failure. + + The datum's data must be allocated using the function + 'gnutls_malloc()' . + + The first argument to 'retr_func' will be null unless + 'gnutls_db_set_ptr()' has been called. + +gnutls_db_set_store_function +---------------------------- + + -- Function: void gnutls_db_set_store_function (gnutls_session_t + SESSION, gnutls_db_store_func STORE_FUNC) + SESSION: is a 'gnutls_session_t' type. + + STORE_FUNC: is the function + + Sets the function that will be used to store data in the resumed + sessions database. This function must return 0 on success. + + The first argument to 'store_func' will be null unless + 'gnutls_db_set_ptr()' has been called. + +gnutls_deinit +------------- + + -- Function: void gnutls_deinit (gnutls_session_t SESSION) + SESSION: is a 'gnutls_session_t' type. + + This function clears all buffers associated with the 'session' . + This function will also remove session data from the session + database if the session was terminated abnormally. + +gnutls_dh_get_group +------------------- + + -- Function: int gnutls_dh_get_group (gnutls_session_t SESSION, + gnutls_datum_t * RAW_GEN, gnutls_datum_t * RAW_PRIME) + SESSION: is a gnutls session + + RAW_GEN: will hold the generator. + + RAW_PRIME: will hold the prime. + + This function will return the group parameters used in the last + Diffie-Hellman key exchange with the peer. These are the prime and + the generator used. This function should be used for both + anonymous and ephemeral Diffie-Hellman. The output parameters must + be freed with 'gnutls_free()' . + + Note, that the prime and generator are exported as non-negative + integers and may include a leading zero byte. + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, + otherwise an error code is returned. + +gnutls_dh_get_peers_public_bits +------------------------------- + + -- Function: int gnutls_dh_get_peers_public_bits (gnutls_session_t + SESSION) + SESSION: is a gnutls session + + Get the Diffie-Hellman public key bit size. Can be used for both + anonymous and ephemeral Diffie-Hellman. + + *Returns:* The public key bit size used in the last Diffie-Hellman + key exchange with the peer, or a negative error code in case of + error. + +gnutls_dh_get_prime_bits +------------------------ + + -- Function: int gnutls_dh_get_prime_bits (gnutls_session_t SESSION) + SESSION: is a gnutls session + + This function will return the bits of the prime used in the last + Diffie-Hellman key exchange with the peer. Should be used for both + anonymous and ephemeral Diffie-Hellman. Note that some ciphers, + like RSA and DSA without DHE, do not use a Diffie-Hellman key + exchange, and then this function will return 0. + + *Returns:* The Diffie-Hellman bit strength is returned, or 0 if no + Diffie-Hellman key exchange was done, or a negative error code on + failure. + +gnutls_dh_get_pubkey +-------------------- + + -- Function: int gnutls_dh_get_pubkey (gnutls_session_t SESSION, + gnutls_datum_t * RAW_KEY) + SESSION: is a gnutls session + + RAW_KEY: will hold the public key. + + This function will return the peer's public key used in the last + Diffie-Hellman key exchange. This function should be used for both + anonymous and ephemeral Diffie-Hellman. The output parameters must + be freed with 'gnutls_free()' . + + Note, that public key is exported as non-negative integer and may + include a leading zero byte. + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, + otherwise an error code is returned. + +gnutls_dh_get_secret_bits +------------------------- + + -- Function: int gnutls_dh_get_secret_bits (gnutls_session_t SESSION) + SESSION: is a gnutls session + + This function will return the bits used in the last Diffie-Hellman + key exchange with the peer. Should be used for both anonymous and + ephemeral Diffie-Hellman. + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, + otherwise an error code is returned. + +gnutls_dh_params_cpy +-------------------- + + -- Function: int gnutls_dh_params_cpy (gnutls_dh_params_t DST, + gnutls_dh_params_t SRC) + DST: Is the destination parameters, which should be initialized. + + SRC: Is the source parameters + + This function will copy the DH parameters structure from source to + destination. The destination should be already initialized. + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, + otherwise a negative error code is returned. + +gnutls_dh_params_deinit +----------------------- + + -- Function: void gnutls_dh_params_deinit (gnutls_dh_params_t + DH_PARAMS) + DH_PARAMS: The parameters + + This function will deinitialize the DH parameters type. + +gnutls_dh_params_export2_pkcs3 +------------------------------ + + -- Function: int gnutls_dh_params_export2_pkcs3 (gnutls_dh_params_t + PARAMS, gnutls_x509_crt_fmt_t FORMAT, gnutls_datum_t * OUT) + PARAMS: Holds the DH parameters + + FORMAT: the format of output params. One of PEM or DER. + + OUT: will contain a PKCS3 DHParams structure PEM or DER encoded + + This function will export the given dh parameters to a PKCS3 + DHParams structure. This is the format generated by "openssl + dhparam" tool. The data in 'out' will be allocated using + 'gnutls_malloc()' . + + If the structure is PEM encoded, it will have a header of "BEGIN DH + PARAMETERS". + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, + otherwise a negative error code is returned. + + *Since:* 3.1.3 + +gnutls_dh_params_export_pkcs3 +----------------------------- + + -- Function: int gnutls_dh_params_export_pkcs3 (gnutls_dh_params_t + PARAMS, gnutls_x509_crt_fmt_t FORMAT, unsigned char * + PARAMS_DATA, size_t * PARAMS_DATA_SIZE) + PARAMS: Holds the DH parameters + + FORMAT: the format of output params. One of PEM or DER. + + PARAMS_DATA: will contain a PKCS3 DHParams structure PEM or DER + encoded + + PARAMS_DATA_SIZE: holds the size of params_data (and will be + replaced by the actual size of parameters) + + This function will export the given dh parameters to a PKCS3 + DHParams structure. This is the format generated by "openssl + dhparam" tool. If the buffer provided is not long enough to hold + the output, then GNUTLS_E_SHORT_MEMORY_BUFFER will be returned. + + If the structure is PEM encoded, it will have a header of "BEGIN DH + PARAMETERS". + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, + otherwise a negative error code is returned. + +gnutls_dh_params_export_raw +--------------------------- + + -- Function: int gnutls_dh_params_export_raw (gnutls_dh_params_t + PARAMS, gnutls_datum_t * PRIME, gnutls_datum_t * GENERATOR, + unsigned int * BITS) + PARAMS: Holds the DH parameters + + PRIME: will hold the new prime + + GENERATOR: will hold the new generator + + BITS: if non null will hold the secret key's number of bits + + This function will export the pair of prime and generator for use + in the Diffie-Hellman key exchange. The new parameters will be + allocated using 'gnutls_malloc()' and will be stored in the + appropriate datum. + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, + otherwise a negative error code is returned. + +gnutls_dh_params_generate2 +-------------------------- + + -- Function: int gnutls_dh_params_generate2 (gnutls_dh_params_t + DPARAMS, unsigned int BITS) + DPARAMS: The parameters + + BITS: is the prime's number of bits + + This function will generate a new pair of prime and generator for + use in the Diffie-Hellman key exchange. This may take long time. + + It is recommended not to set the number of bits directly, but use + 'gnutls_sec_param_to_pk_bits()' instead. Also note that the DH + parameters are only useful to servers. Since clients use the + parameters sent by the server, it's of no use to call this in + client side. + + The parameters generated are of the DSA form. It also is possible + to generate provable parameters (following the Shawe-Taylor + algorithm), using 'gnutls_x509_privkey_generate2()' with DSA option + and the 'GNUTLS_PRIVKEY_FLAG_PROVABLE' flag set. These can the be + imported with 'gnutls_dh_params_import_dsa()' . + + It is no longer recommended for applications to generate + parameters. See the "Parameter generation" section in the manual. + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, + otherwise a negative error code is returned. + +gnutls_dh_params_import_dsa +--------------------------- + + -- Function: int gnutls_dh_params_import_dsa (gnutls_dh_params_t + DH_PARAMS, gnutls_x509_privkey_t KEY) + DH_PARAMS: The parameters + + KEY: holds a DSA private key + + This function will import the prime and generator of the DSA key + for use in the Diffie-Hellman key exchange. + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, + otherwise a negative error code is returned. + +gnutls_dh_params_import_pkcs3 +----------------------------- + + -- Function: int gnutls_dh_params_import_pkcs3 (gnutls_dh_params_t + PARAMS, const gnutls_datum_t * PKCS3_PARAMS, + gnutls_x509_crt_fmt_t FORMAT) + PARAMS: The parameters + + PKCS3_PARAMS: should contain a PKCS3 DHParams structure PEM or DER + encoded + + FORMAT: the format of params. PEM or DER. + + This function will extract the DHParams found in a PKCS3 formatted + structure. This is the format generated by "openssl dhparam" tool. + + If the structure is PEM encoded, it should have a header of "BEGIN + DH PARAMETERS". + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, + otherwise a negative error code is returned. + +gnutls_dh_params_import_raw +--------------------------- + + -- Function: int gnutls_dh_params_import_raw (gnutls_dh_params_t + DH_PARAMS, const gnutls_datum_t * PRIME, const gnutls_datum_t + * GENERATOR) + DH_PARAMS: The parameters + + PRIME: holds the new prime + + GENERATOR: holds the new generator + + This function will replace the pair of prime and generator for use + in the Diffie-Hellman key exchange. The new parameters should be + stored in the appropriate gnutls_datum. + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, + otherwise a negative error code is returned. + +gnutls_dh_params_import_raw2 +---------------------------- + + -- Function: int gnutls_dh_params_import_raw2 (gnutls_dh_params_t + DH_PARAMS, const gnutls_datum_t * PRIME, const gnutls_datum_t + * GENERATOR, unsigned KEY_BITS) + DH_PARAMS: The parameters + + PRIME: holds the new prime + + GENERATOR: holds the new generator + + KEY_BITS: the private key bits (set to zero when unknown) + + This function will replace the pair of prime and generator for use + in the Diffie-Hellman key exchange. The new parameters should be + stored in the appropriate gnutls_datum. + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, + otherwise a negative error code is returned. + +gnutls_dh_params_import_raw3 +---------------------------- + + -- Function: int gnutls_dh_params_import_raw3 (gnutls_dh_params_t + DH_PARAMS, const gnutls_datum_t * PRIME, const gnutls_datum_t + * Q, const gnutls_datum_t * GENERATOR) + DH_PARAMS: The parameters + + PRIME: holds the new prime + + Q: holds the subgroup if available, otherwise NULL + + GENERATOR: holds the new generator + + This function will replace the pair of prime and generator for use + in the Diffie-Hellman key exchange. The new parameters should be + stored in the appropriate gnutls_datum. + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, + otherwise a negative error code is returned. + +gnutls_dh_params_init +--------------------- + + -- Function: int gnutls_dh_params_init (gnutls_dh_params_t * DH_PARAMS) + DH_PARAMS: The parameters + + This function will initialize the DH parameters type. + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, + otherwise a negative error code is returned. + +gnutls_dh_set_prime_bits +------------------------ + + -- Function: void gnutls_dh_set_prime_bits (gnutls_session_t SESSION, + unsigned int BITS) + SESSION: is a 'gnutls_session_t' type. + + BITS: is the number of bits + + This function sets the number of bits, for use in a Diffie-Hellman + key exchange. This is used both in DH ephemeral and DH anonymous + cipher suites. This will set the minimum size of the prime that + will be used for the handshake. + + In the client side it sets the minimum accepted number of bits. If + a server sends a prime with less bits than that + 'GNUTLS_E_DH_PRIME_UNACCEPTABLE' will be returned by the handshake. + + Note that this function will warn via the audit log for value that + are believed to be weak. + + The function has no effect in server side. + + Note that since 3.1.7 this function is deprecated. The minimum + number of bits is set by the priority string level. Also this + function must be called after 'gnutls_priority_set_direct()' or the + set value may be overridden by the selected priority options. + +gnutls_digest_get_id +-------------------- + + -- Function: gnutls_digest_algorithm_t gnutls_digest_get_id (const char + * NAME) + NAME: is a digest algorithm name + + Convert a string to a 'gnutls_digest_algorithm_t' value. The names + are compared in a case insensitive way. + + *Returns:* a 'gnutls_digest_algorithm_t' id of the specified MAC + algorithm string, or 'GNUTLS_DIG_UNKNOWN' on failure. + +gnutls_digest_get_name +---------------------- + + -- Function: const char * gnutls_digest_get_name + (gnutls_digest_algorithm_t ALGORITHM) + ALGORITHM: is a digest algorithm + + Convert a 'gnutls_digest_algorithm_t' value to a string. + + *Returns:* a string that contains the name of the specified digest + algorithm, or 'NULL' . + +gnutls_digest_get_oid +--------------------- + + -- Function: const char * gnutls_digest_get_oid + (gnutls_digest_algorithm_t ALGORITHM) + ALGORITHM: is a digest algorithm + + Convert a 'gnutls_digest_algorithm_t' value to its object + identifier. + + *Returns:* a string that contains the object identifier of the + specified digest algorithm, or 'NULL' . + + *Since:* 3.4.3 + +gnutls_digest_list +------------------ + + -- Function: const gnutls_digest_algorithm_t * gnutls_digest_list ( + VOID) + + Get a list of hash (digest) algorithms supported by GnuTLS. + + This function is not thread safe. + + *Returns:* Return a (0)-terminated list of + 'gnutls_digest_algorithm_t' integers indicating the available + digests. + +gnutls_digest_set_secure +------------------------ + + -- Function: int gnutls_digest_set_secure (gnutls_digest_algorithm_t + DIG, unsigned int SECURE) + DIG: is a digest algorithm + + SECURE: whether to mark the digest algorithm secure + + Modify the previous system wide setting that marked 'dig' as secure + or insecure. This only has effect when the algorithm is enabled + through the allowlisting mode in the configuration file, or when + the setting is modified with a prior call to this function. + + *Since:* 3.7.3 + +gnutls_early_cipher_get +----------------------- + + -- Function: gnutls_cipher_algorithm_t gnutls_early_cipher_get + (gnutls_session_t SESSION) + SESSION: is a 'gnutls_session_t' type. + + Get the cipher algorithm used for encrypting early data. + + *Returns:* the cipher used for early data, a + 'gnutls_cipher_algorithm_t' type. + + *Since:* 3.7.2 + +gnutls_early_prf_hash_get +------------------------- + + -- Function: gnutls_digest_algorithm_t gnutls_early_prf_hash_get (const + gnutls_session_t SESSION) + SESSION: is a 'gnutls_session_t' type. + + Get the hash algorithm used as a PRF to derive keys for encrypting + early data in TLS 1.3. + + *Returns:* the hash algorithm used for early data, a + 'gnutls_digest_algorithm_t' value. + + *Since:* 3.7.2 + +gnutls_ecc_curve_get +-------------------- + + -- Function: gnutls_ecc_curve_t gnutls_ecc_curve_get (gnutls_session_t + SESSION) + SESSION: is a 'gnutls_session_t' type. + + Returns the currently used elliptic curve for key exchange. Only + valid when using an elliptic curve ciphersuite. + + *Returns:* the currently used curve, a 'gnutls_ecc_curve_t' type. + + *Since:* 3.0 + +gnutls_ecc_curve_get_id +----------------------- + + -- Function: gnutls_ecc_curve_t gnutls_ecc_curve_get_id (const char * + NAME) + NAME: is a curve name + + The names are compared in a case insensitive way. + + *Returns:* return a 'gnutls_ecc_curve_t' value corresponding to the + specified curve, or 'GNUTLS_ECC_CURVE_INVALID' on error. + + *Since:* 3.4.3 + +gnutls_ecc_curve_get_name +------------------------- + + -- Function: const char * gnutls_ecc_curve_get_name (gnutls_ecc_curve_t + CURVE) + CURVE: is an ECC curve + + Convert a 'gnutls_ecc_curve_t' value to a string. + + *Returns:* a string that contains the name of the specified curve + or 'NULL' . + + *Since:* 3.0 + +gnutls_ecc_curve_get_oid +------------------------ + + -- Function: const char * gnutls_ecc_curve_get_oid (gnutls_ecc_curve_t + CURVE) + CURVE: is an ECC curve + + Convert a 'gnutls_ecc_curve_t' value to its object identifier. + + *Returns:* a string that contains the OID of the specified curve or + 'NULL' . + + *Since:* 3.4.3 + +gnutls_ecc_curve_get_pk +----------------------- + + -- Function: gnutls_pk_algorithm_t gnutls_ecc_curve_get_pk + (gnutls_ecc_curve_t CURVE) + CURVE: is an ECC curve + + *Returns:* the public key algorithm associated with the named curve + or 'GNUTLS_PK_UNKNOWN' . + + *Since:* 3.5.0 + +gnutls_ecc_curve_get_size +------------------------- + + -- Function: int gnutls_ecc_curve_get_size (gnutls_ecc_curve_t CURVE) + CURVE: is an ECC curve + + *Returns:* the size in bytes of the curve or 0 on failure. + + *Since:* 3.0 + +gnutls_ecc_curve_list +--------------------- + + -- Function: const gnutls_ecc_curve_t * gnutls_ecc_curve_list ( VOID) + + Get the list of supported elliptic curves. + + This function is not thread safe. + + *Returns:* Return a (0)-terminated list of 'gnutls_ecc_curve_t' + integers indicating the available curves. + +gnutls_ecc_curve_set_enabled +---------------------------- + + -- Function: int gnutls_ecc_curve_set_enabled (gnutls_ecc_curve_t + CURVE, unsigned int ENABLED) + CURVE: is an ECC curve + + ENABLED: whether to enable the curve + + Modify the previous system wide setting that marked 'curve' as + enabled or disabled. Calling this fuction is allowed only if + allowlisting mode is set in the configuration file, and only if the + system-wide TLS priority string has not been initialized yet. The + intended usage is to provide applications with a way to expressly + deviate from the distribution or site defaults inherited from the + configuration file. The modification is composable with further + modifications performed through the priority string mechanism. + + This function is not thread-safe and is intended to be called in + the main thread at the beginning of the process execution. + + *Returns:* 0 on success or negative error code otherwise. + + *Since:* 3.7.3 + +gnutls_error_is_fatal +--------------------- + + -- Function: int gnutls_error_is_fatal (int ERROR) + ERROR: is a GnuTLS error code, a negative error code + + If a GnuTLS function returns a negative error code you may feed + that value to this function to see if the error condition is fatal + to a TLS session (i.e., must be terminated). + + Note that you may also want to check the error code manually, since + some non-fatal errors to the protocol (such as a warning alert or a + rehandshake request) may be fatal for your program. + + This function is only useful if you are dealing with errors from + functions that relate to a TLS session (e.g., record layer or + handshake layer handling functions). + + *Returns:* Non-zero value on fatal errors or zero on non-fatal. + +gnutls_error_to_alert +--------------------- + + -- Function: int gnutls_error_to_alert (int ERR, int * LEVEL) + ERR: is a negative integer + + LEVEL: the alert level will be stored there + + Get an alert depending on the error code returned by a gnutls + function. All alerts sent by this function should be considered + fatal. The only exception is when 'err' is 'GNUTLS_E_REHANDSHAKE' + , where a warning alert should be sent to the peer indicating that + no renegotiation will be performed. + + If there is no mapping to a valid alert the alert to indicate + internal error ('GNUTLS_A_INTERNAL_ERROR' ) is returned. + + *Returns:* the alert code to use for a particular error code. + +gnutls_est_record_overhead_size +------------------------------- + + -- Function: size_t gnutls_est_record_overhead_size (gnutls_protocol_t + VERSION, gnutls_cipher_algorithm_t CIPHER, + gnutls_mac_algorithm_t MAC, gnutls_compression_method_t COMP, + unsigned int FLAGS) + VERSION: is a 'gnutls_protocol_t' value + + CIPHER: is a 'gnutls_cipher_algorithm_t' value + + MAC: is a 'gnutls_mac_algorithm_t' value + + COMP: is a 'gnutls_compression_method_t' value (ignored) + + FLAGS: must be zero + + This function will return the set size in bytes of the overhead due + to TLS (or DTLS) per record. + + Note that this function may provide inaccurate values when TLS + extensions that modify the record format are negotiated. In these + cases a more accurate value can be obtained using + 'gnutls_record_overhead_size()' after a completed handshake. + + *Since:* 3.2.2 + +gnutls_ext_get_current_msg +-------------------------- + + -- Function: unsigned gnutls_ext_get_current_msg (gnutls_session_t + SESSION) + SESSION: a 'gnutls_session_t' opaque pointer + + This function allows an extension handler to obtain the message + this extension is being called from. The returned value is a + single entry of the 'gnutls_ext_flags_t' enumeration. That is, if + an extension was registered with the 'GNUTLS_EXT_FLAG_HRR' and + 'GNUTLS_EXT_FLAG_EE' flags, the value when called during parsing of + the encrypted extensions message will be 'GNUTLS_EXT_FLAG_EE' . + + If not called under an extension handler, its value is undefined. + + *Since:* 3.6.3 + +gnutls_ext_get_data +------------------- + + -- Function: int gnutls_ext_get_data (gnutls_session_t SESSION, + unsigned TLS_ID, gnutls_ext_priv_data_t * DATA) + SESSION: a 'gnutls_session_t' opaque pointer + + TLS_ID: the numeric id of the extension + + DATA: a pointer to the private data to retrieve + + This function retrieves any data previously stored with + 'gnutls_ext_set_data()' . + + *Returns:* 'GNUTLS_E_SUCCESS' on success, otherwise a negative + error code. + + *Since:* 3.4.0 + +gnutls_ext_get_name +------------------- + + -- Function: const char * gnutls_ext_get_name (unsigned int EXT) + EXT: is a TLS extension numeric ID + + Convert a TLS extension numeric ID to a printable string. + + *Returns:* a pointer to a string that contains the name of the + specified cipher, or 'NULL' . + +gnutls_ext_get_name2 +-------------------- + + -- Function: const char * gnutls_ext_get_name2 (gnutls_session_t + SESSION, unsigned int TLS_ID, gnutls_ext_parse_type_t + PARSE_POINT) + SESSION: a 'gnutls_session_t' opaque pointer + + TLS_ID: is a TLS extension numeric ID + + PARSE_POINT: the parse type of the extension + + Convert a TLS extension numeric ID to a printable string. + + *Returns:* a pointer to a string that contains the name of the + specified cipher, or 'NULL' . + +gnutls_ext_raw_parse +-------------------- + + -- Function: int gnutls_ext_raw_parse (void * CTX, + gnutls_ext_raw_process_func CB, const gnutls_datum_t * DATA, + unsigned int FLAGS) + CTX: a pointer to pass to callback function + + CB: callback function to process each extension found + + DATA: TLS extension data + + FLAGS: should be zero or 'GNUTLS_EXT_RAW_FLAG_TLS_CLIENT_HELLO' or + 'GNUTLS_EXT_RAW_FLAG_DTLS_CLIENT_HELLO' + + This function iterates through the TLS extensions as passed in + 'data' , passing the individual extension data to callback. The + 'data' must conform to Extension extensions<0..2^16-1> format. + + If flags is 'GNUTLS_EXT_RAW_TLS_FLAG_CLIENT_HELLO' then this + function will parse the extension data from the position, as if the + packet in 'data' is a client hello (without record or handshake + headers) - as provided by 'gnutls_handshake_set_hook_function()' . + + The return value of the callback will be propagated. + + *Returns:* 'GNUTLS_E_SUCCESS' on success, or an error code. On + unknown flags it returns 'GNUTLS_E_INVALID_REQUEST' . + + *Since:* 3.6.3 + +gnutls_ext_register +------------------- + + -- Function: int gnutls_ext_register (const char * NAME, int ID, + gnutls_ext_parse_type_t PARSE_POINT, gnutls_ext_recv_func + RECV_FUNC, gnutls_ext_send_func SEND_FUNC, + gnutls_ext_deinit_data_func DEINIT_FUNC, gnutls_ext_pack_func + PACK_FUNC, gnutls_ext_unpack_func UNPACK_FUNC) + NAME: the name of the extension to register + + ID: the numeric TLS id of the extension + + PARSE_POINT: the parse type of the extension (see + gnutls_ext_parse_type_t) + + RECV_FUNC: a function to receive the data + + SEND_FUNC: a function to send the data + + DEINIT_FUNC: a function deinitialize any private data + + PACK_FUNC: a function which serializes the extension's private data + (used on session packing for resumption) + + UNPACK_FUNC: a function which will deserialize the extension's + private data + + This function will register a new extension type. The extension + will remain registered until 'gnutls_global_deinit()' is called. + If the extension type is already registered then + 'GNUTLS_E_ALREADY_REGISTERED' will be returned. + + Each registered extension can store temporary data into the + gnutls_session_t structure using 'gnutls_ext_set_data()' , and they + can be retrieved using 'gnutls_ext_get_data()' . + + Any extensions registered with this function are valid for the + client and TLS1.2 server hello (or encrypted extensions for + TLS1.3). + + This function is not thread safe. + + *Returns:* 'GNUTLS_E_SUCCESS' on success, otherwise a negative + error code. + + *Since:* 3.4.0 + +gnutls_ext_set_data +------------------- + + -- Function: void gnutls_ext_set_data (gnutls_session_t SESSION, + unsigned TLS_ID, gnutls_ext_priv_data_t DATA) + SESSION: a 'gnutls_session_t' opaque pointer + + TLS_ID: the numeric id of the extension + + DATA: the private data to set + + This function allows an extension handler to store data in the + current session and retrieve them later on. The set data will be + deallocated using the gnutls_ext_deinit_data_func. + + *Since:* 3.4.0 + +gnutls_fingerprint +------------------ + + -- Function: int gnutls_fingerprint (gnutls_digest_algorithm_t ALGO, + const gnutls_datum_t * DATA, void * RESULT, size_t * + RESULT_SIZE) + ALGO: is a digest algorithm + + DATA: is the data + + RESULT: is the place where the result will be copied (may be null). + + RESULT_SIZE: should hold the size of the result. The actual size + of the returned result will also be copied there. + + This function will calculate a fingerprint (actually a hash), of + the given data. The result is not printable data. You should + convert it to hex, or to something else printable. + + This is the usual way to calculate a fingerprint of an X.509 DER + encoded certificate. Note however that the fingerprint of an + OpenPGP certificate is not just a hash and cannot be calculated + with this function. + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, + otherwise an error code is returned. + +gnutls_fips140_context_deinit +----------------------------- + + -- Function: void gnutls_fips140_context_deinit + (gnutls_fips140_context_t CONTEXT) + CONTEXT: a 'gnutls_fips140_context_t' + + Uninitialize and release the FIPS context 'context' . + + *Since:* 3.7.3 + +gnutls_fips140_context_init +--------------------------- + + -- Function: int gnutls_fips140_context_init (gnutls_fips140_context_t + * CONTEXT) + CONTEXT: location to store 'gnutls_fips140_context_t' + + Create and initialize the FIPS context object. + + *Returns:* 0 upon success, a negative error code otherwise + + *Since:* 3.7.3 + +gnutls_fips140_get_operation_state +---------------------------------- + + -- Function: gnutls_fips140_operation_state_t + gnutls_fips140_get_operation_state (gnutls_fips140_context_t + CONTEXT) + CONTEXT: a 'gnutls_fips140_context_t' + + Get the previous operation state of 'context' in terms of FIPS. + + *Returns:* a 'gnutls_fips140_operation_state_t' + + *Since:* 3.7.3 + +gnutls_fips140_mode_enabled +--------------------------- + + -- Function: unsigned gnutls_fips140_mode_enabled ( VOID) + + Checks whether this library is in FIPS140 mode. The returned value + corresponds to the library mode as set with + 'gnutls_fips140_set_mode()' . + + If 'gnutls_fips140_set_mode()' was called with + 'GNUTLS_FIPS140_SET_MODE_THREAD' then this function will return the + current thread's FIPS140 mode, otherwise the global value is + returned. + + *Returns:* return non-zero if true or zero if false. + + *Since:* 3.3.0 + +gnutls_fips140_pop_context +-------------------------- + + -- Function: int gnutls_fips140_pop_context ( VOID) + + Dissociate the FIPS context currently active on the current thread, + reverting to the previously active context. If a cryptographic + operation is ongoing in the current thread, e.g., + 'gnutls_aead_cipher_init()' is called but + 'gnutls_aead_cipher_deinit()' is not yet called, it returns an + error 'GNUTLS_E_INVALID_REQUEST' . + + This function is no-op if FIPS140 is not compiled in nor enabled at + run-time. + + *Returns:* 0 upon success, a negative error code otherwise + + *Since:* 3.7.3 + +gnutls_fips140_push_context +--------------------------- + + -- Function: int gnutls_fips140_push_context (gnutls_fips140_context_t + CONTEXT) + CONTEXT: a 'gnutls_fips140_context_t' + + Associate the FIPS 'context' to the current thread, diverting the + currently active context. If a cryptographic operation is ongoing + in the current thread, e.g., 'gnutls_aead_cipher_init()' is called + but 'gnutls_aead_cipher_deinit()' is not yet called, it returns an + error 'GNUTLS_E_INVALID_REQUEST' . + + The operation state of 'context' will be reset to + 'GNUTLS_FIPS140_OP_INITIAL' . + + This function is no-op if FIPS140 is not compiled in nor enabled at + run-time. + + *Returns:* 0 upon success, a negative error code otherwise + + *Since:* 3.7.3 + +gnutls_fips140_run_self_tests +----------------------------- + + -- Function: int gnutls_fips140_run_self_tests ( VOID) + + Manually perform the second round of the FIPS140 self-tests, + including: + + - Known answer tests (KAT) for the selected set of symmetric + cipher, MAC, public key, KDF, and DRBG - Library integrity checks + + Upon failure with FIPS140 mode enabled, it makes the library + unusable. This function is not thread-safe. + + *Returns:* 0 upon success, a negative error code otherwise + + *Since:* 3.7.7 + +gnutls_fips140_set_mode +----------------------- + + -- Function: void gnutls_fips140_set_mode (gnutls_fips_mode_t MODE, + unsigned FLAGS) + MODE: the FIPS140-2 mode to switch to + + FLAGS: should be zero or 'GNUTLS_FIPS140_SET_MODE_THREAD' + + That function is not thread-safe when changing the mode with no + flags (globally), and should be called prior to creating any + threads. Its behavior with no flags after threads are created is + undefined. + + When the flag 'GNUTLS_FIPS140_SET_MODE_THREAD' is specified then + this call will change the FIPS140-2 mode for this particular thread + and not for the whole process. That way an application can utilize + this function to set and reset mode for specific operations. + + This function never fails but will be a no-op if used when the + library is not in FIPS140-2 mode. When asked to switch to unknown + values for 'mode' or to 'GNUTLS_FIPS140_SELFTESTS' mode, the + library switches to 'GNUTLS_FIPS140_STRICT' mode. + + *Since:* 3.6.2 + +gnutls_get_library_config +------------------------- + + -- Function: const gnutls_library_config_st * gnutls_get_library_config + ( VOID) + + Returns the library configuration as key value pairs. Currently + defined keys are: + + - fips-module-name: the name of the FIPS140 module + + - fips-module-version: the version of the FIPS140 module + + - libgnutls-soname: the SONAME of the library itself + + - libnettle-soname: the library SONAME of linked libnettle + + - libhogweed-soname: the library SONAME of linked libhogweed + + - libgmp-soname: the library SONAME of linked libgmp + + - hardware-features: enabled hardware support features + + - tls-features: enabled TLS protocol features + + *Returns:* a NUL-terminated 'gnutls_library_config_st' array + + *Since:* 3.7.3 + +gnutls_get_system_config_file +----------------------------- + + -- Function: const char * gnutls_get_system_config_file ( VOID) + + Returns the filename of the system wide configuration file to be + loaded by the library. + + *Returns:* a constant pointer to the config file path + + *Since:* 3.6.9 + +gnutls_global_deinit +-------------------- + + -- Function: void gnutls_global_deinit ( VOID) + + This function deinitializes the global data, that were initialized + using 'gnutls_global_init()' . + + Since GnuTLS 3.3.0 this function is no longer necessary to be + explicitly called. GnuTLS will automatically deinitialize on + library destructor. See 'gnutls_global_init()' for disabling the + implicit initialization/deinitialization. + +gnutls_global_init +------------------ + + -- Function: int gnutls_global_init ( VOID) + + Since GnuTLS 3.3.0 this function is no longer necessary to be + explicitly called. To disable the implicit call (in a library + constructor) of this function set the environment variable + 'GNUTLS_NO_IMPLICIT_INIT' to 1. + + This function performs any required precalculations, detects the + supported CPU capabilities and initializes the underlying + cryptographic backend. In order to free any resources taken by + this call you should 'gnutls_global_deinit()' when gnutls usage is + no longer needed. + + This function increments a global counter, so that + 'gnutls_global_deinit()' only releases resources when it has been + called as many times as 'gnutls_global_init()' . This is useful + when GnuTLS is used by more than one library in an application. + This function can be called many times, but will only do something + the first time. It is thread safe since GnuTLS 3.3.0. + + A subsequent call of this function if the initial has failed will + return the same error code. + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, + otherwise a negative error code is returned. + +gnutls_global_set_audit_log_function +------------------------------------ + + -- Function: void gnutls_global_set_audit_log_function + (gnutls_audit_log_func LOG_FUNC) + LOG_FUNC: it is the audit log function + + This is the function to set the audit logging function. This is a + function to report important issues, such as possible attacks in + the protocol. This is different from + 'gnutls_global_set_log_function()' because it will report also + session-specific events. The session parameter will be null if + there is no corresponding TLS session. + + 'gnutls_audit_log_func' is of the form, void + (*gnutls_audit_log_func)( gnutls_session_t, const char*); + + *Since:* 3.0 + +gnutls_global_set_log_function +------------------------------ + + -- Function: void gnutls_global_set_log_function (gnutls_log_func + LOG_FUNC) + LOG_FUNC: it's a log function + + This is the function where you set the logging function gnutls is + going to use. This function only accepts a character array. + Normally you may not use this function since it is only used for + debugging purposes. + + 'gnutls_log_func' is of the form, void (*gnutls_log_func)( int + level, const char*); + +gnutls_global_set_log_level +--------------------------- + + -- Function: void gnutls_global_set_log_level (int LEVEL) + LEVEL: it's an integer from 0 to 99. + + This is the function that allows you to set the log level. The + level is an integer between 0 and 9. Higher values mean more + verbosity. The default value is 0. Larger values should only be + used with care, since they may reveal sensitive information. + + Use a log level over 10 to enable all debugging options. + +gnutls_global_set_mutex +----------------------- + + -- Function: void gnutls_global_set_mutex (mutex_init_func INIT, + mutex_deinit_func DEINIT, mutex_lock_func LOCK, + mutex_unlock_func UNLOCK) + INIT: mutex initialization function + + DEINIT: mutex deinitialization function + + LOCK: mutex locking function + + UNLOCK: mutex unlocking function + + With this function you are allowed to override the default mutex + locks used in some parts of gnutls and dependent libraries. This + function should be used if you have complete control of your + program and libraries. Do not call this function from a library, + or preferably from any application unless really needed to. GnuTLS + will use the appropriate locks for the running system. + + This function must be called prior to any other GnuTLS function; + otherwise the behavior is undefined. + + *Deprecated:* This function is discouraged on GnuTLS 3.7.3 or + later. + + *Since:* 2.12.0 + +gnutls_global_set_time_function +------------------------------- + + -- Function: void gnutls_global_set_time_function (gnutls_time_func + TIME_FUNC) + TIME_FUNC: it's the system time function, a 'gnutls_time_func()' + callback. + + This is the function where you can override the default system time + function. The application provided function should behave the same + as the standard function. + + *Since:* 2.12.0 + +gnutls_gost_paramset_get_name +----------------------------- + + -- Function: const char * gnutls_gost_paramset_get_name + (gnutls_gost_paramset_t PARAM) + PARAM: is a GOST 28147 param set + + Convert a 'gnutls_gost_paramset_t' value to a string. + + *Returns:* a string that contains the name of the specified GOST + param set, or 'NULL' . + + *Since:* 3.6.3 + +gnutls_gost_paramset_get_oid +---------------------------- + + -- Function: const char * gnutls_gost_paramset_get_oid + (gnutls_gost_paramset_t PARAM) + PARAM: is a GOST 28147 param set + + Convert a 'gnutls_gost_paramset_t' value to its object identifier. + + *Returns:* a string that contains the object identifier of the + specified GOST param set, or 'NULL' . + + *Since:* 3.6.3 + +gnutls_group_get +---------------- + + -- Function: gnutls_group_t gnutls_group_get (gnutls_session_t SESSION) + SESSION: is a 'gnutls_session_t' type. + + Returns the currently used group for key exchange. Only valid when + using an elliptic curve or DH ciphersuite. + + *Returns:* the currently used group, a 'gnutls_group_t' type. + + *Since:* 3.6.0 + +gnutls_group_get_id +------------------- + + -- Function: gnutls_group_t gnutls_group_get_id (const char * NAME) + NAME: is a group name + + The names are compared in a case insensitive way. + + *Returns:* return a 'gnutls_group_t' value corresponding to the + specified group, or 'GNUTLS_GROUP_INVALID' on error. + + *Since:* 3.6.0 + +gnutls_group_get_name +--------------------- + + -- Function: const char * gnutls_group_get_name (gnutls_group_t GROUP) + GROUP: is an element from 'gnutls_group_t' + + Convert a 'gnutls_group_t' value to a string. + + *Returns:* a string that contains the name of the specified group + or 'NULL' . + + *Since:* 3.6.0 + +gnutls_group_list +----------------- + + -- Function: const gnutls_group_t * gnutls_group_list ( VOID) + + Get the list of supported elliptic curves. + + This function is not thread safe. + + *Returns:* Return a (0)-terminated list of 'gnutls_group_t' + integers indicating the available groups. + + *Since:* 3.6.0 + +gnutls_handshake +---------------- + + -- Function: int gnutls_handshake (gnutls_session_t SESSION) + SESSION: is a 'gnutls_session_t' type. + + This function performs the handshake of the TLS/SSL protocol, and + initializes the TLS session parameters. + + The non-fatal errors expected by this function are: + 'GNUTLS_E_INTERRUPTED' , 'GNUTLS_E_AGAIN' , + 'GNUTLS_E_WARNING_ALERT_RECEIVED' . When this function is called + for re-handshake under TLS 1.2 or earlier, the non-fatal error code + 'GNUTLS_E_GOT_APPLICATION_DATA' may also be returned. + + The former two interrupt the handshake procedure due to the + transport layer being interrupted, and the latter because of a + "warning" alert that was sent by the peer (it is always a good idea + to check any received alerts). On these non-fatal errors call this + function again, until it returns 0; cf. + 'gnutls_record_get_direction()' and 'gnutls_error_is_fatal()' . In + DTLS sessions the non-fatal error 'GNUTLS_E_LARGE_PACKET' is also + possible, and indicates that the MTU should be adjusted. + + When this function is called by a server after a rehandshake + request under TLS 1.2 or earlier the + 'GNUTLS_E_GOT_APPLICATION_DATA' error code indicates that some data + were pending prior to peer initiating the handshake. Under TLS 1.3 + this function when called after a successful handshake, is a no-op + and always succeeds in server side; in client side this function is + equivalent to 'gnutls_session_key_update()' with 'GNUTLS_KU_PEER' + flag. + + This function handles both full and abbreviated TLS handshakes + (resumption). For abbreviated handshakes, in client side, the + 'gnutls_session_set_data()' should be called prior to this function + to set parameters from a previous session. In server side, + resumption is handled by either setting a DB back-end, or setting + up keys for session tickets. + + *Returns:* 'GNUTLS_E_SUCCESS' on a successful handshake, otherwise + a negative error code. + +gnutls_handshake_description_get_name +------------------------------------- + + -- Function: const char * gnutls_handshake_description_get_name + (gnutls_handshake_description_t TYPE) + TYPE: is a handshake message description + + Convert a 'gnutls_handshake_description_t' value to a string. + + *Returns:* a string that contains the name of the specified + handshake message or 'NULL' . + +gnutls_handshake_get_last_in +---------------------------- + + -- Function: gnutls_handshake_description_t + gnutls_handshake_get_last_in (gnutls_session_t SESSION) + SESSION: is a 'gnutls_session_t' type. + + This function is only useful to check where the last performed + handshake failed. If the previous handshake succeed or was not + performed at all then no meaningful value will be returned. + + Check 'gnutls_handshake_description_t' in gnutls.h for the + available handshake descriptions. + + *Returns:* the last handshake message type received, a + 'gnutls_handshake_description_t' . + +gnutls_handshake_get_last_out +----------------------------- + + -- Function: gnutls_handshake_description_t + gnutls_handshake_get_last_out (gnutls_session_t SESSION) + SESSION: is a 'gnutls_session_t' type. + + This function is only useful to check where the last performed + handshake failed. If the previous handshake succeed or was not + performed at all then no meaningful value will be returned. + + Check 'gnutls_handshake_description_t' in gnutls.h for the + available handshake descriptions. + + *Returns:* the last handshake message type sent, a + 'gnutls_handshake_description_t' . + +gnutls_handshake_set_hook_function +---------------------------------- + + -- Function: void gnutls_handshake_set_hook_function (gnutls_session_t + SESSION, unsigned int HTYPE, int WHEN, + gnutls_handshake_hook_func FUNC) + SESSION: is a 'gnutls_session_t' type + + HTYPE: the 'gnutls_handshake_description_t' of the message to hook + at + + WHEN: 'GNUTLS_HOOK_' * depending on when the hook function should + be called + + FUNC: is the function to be called + + This function will set a callback to be called after or before the + specified handshake message has been received or generated. This + is a generalization of + 'gnutls_handshake_set_post_client_hello_function()' . + + To call the hook function prior to the message being generated or + processed use 'GNUTLS_HOOK_PRE' as 'when' parameter, + 'GNUTLS_HOOK_POST' to call after, and 'GNUTLS_HOOK_BOTH' for both + cases. + + This callback must return 0 on success or a gnutls error code to + terminate the handshake. + + To hook at all handshake messages use an 'htype' of + 'GNUTLS_HANDSHAKE_ANY' . + + *Warning:* You should not use this function to terminate the + handshake based on client input unless you know what you are doing. + Before the handshake is finished there is no way to know if there + is a man-in-the-middle attack being performed. + +gnutls_handshake_set_max_packet_length +-------------------------------------- + + -- Function: void gnutls_handshake_set_max_packet_length + (gnutls_session_t SESSION, size_t MAX) + SESSION: is a 'gnutls_session_t' type. + + MAX: is the maximum number. + + This function will set the maximum size of all handshake messages. + Handshakes over this size are rejected with + 'GNUTLS_E_HANDSHAKE_TOO_LARGE' error code. The default value is + 128kb which is typically large enough. Set this to 0 if you do not + want to set an upper limit. + + The reason for restricting the handshake message sizes are to limit + Denial of Service attacks. + + Note that the maximum handshake size was increased to 128kb from + 48kb in GnuTLS 3.5.5. + +gnutls_handshake_set_post_client_hello_function +----------------------------------------------- + + -- Function: void gnutls_handshake_set_post_client_hello_function + (gnutls_session_t SESSION, gnutls_handshake_simple_hook_func + FUNC) + SESSION: is a 'gnutls_session_t' type. + + FUNC: is the function to be called + + This function will set a callback to be called after the client + hello has been received (callback valid in server side only). This + allows the server to adjust settings based on received extensions. + + Those settings could be ciphersuites, requesting certificate, or + anything else except for version negotiation (this is done before + the hello message is parsed). + + This callback must return 0 on success or a gnutls error code to + terminate the handshake. + + Since GnuTLS 3.3.5 the callback is allowed to return + 'GNUTLS_E_AGAIN' or 'GNUTLS_E_INTERRUPTED' to put the handshake on + hold. In that case 'gnutls_handshake()' will return + 'GNUTLS_E_INTERRUPTED' and can be resumed when needed. + + *Warning:* You should not use this function to terminate the + handshake based on client input unless you know what you are doing. + Before the handshake is finished there is no way to know if there + is a man-in-the-middle attack being performed. + +gnutls_handshake_set_private_extensions +--------------------------------------- + + -- Function: void gnutls_handshake_set_private_extensions + (gnutls_session_t SESSION, int ALLOW) + SESSION: is a 'gnutls_session_t' type. + + ALLOW: is an integer (0 or 1) + + This function will enable or disable the use of private cipher + suites (the ones that start with 0xFF). By default or if 'allow' is + 0 then these cipher suites will not be advertised nor used. + + Currently GnuTLS does not include such cipher-suites or compression + algorithms. + + Enabling the private ciphersuites when talking to other than gnutls + servers and clients may cause interoperability problems. + +gnutls_handshake_set_random +--------------------------- + + -- Function: int gnutls_handshake_set_random (gnutls_session_t SESSION, + const gnutls_datum_t * RANDOM) + SESSION: is a 'gnutls_session_t' type. + + RANDOM: a random value of 32-bytes + + This function will explicitly set the server or client hello random + value in the subsequent TLS handshake. The random value should be + a 32-byte value. + + Note that this function should not normally be used as gnutls will + select automatically a random value for the handshake. + + This function should not be used when resuming a session. + + *Returns:* 'GNUTLS_E_SUCCESS' on success, or an error code. + + Since 3.1.9 + +gnutls_handshake_set_read_function +---------------------------------- + + -- Function: void gnutls_handshake_set_read_function (gnutls_session_t + SESSION, gnutls_handshake_read_func FUNC) + SESSION: is 'gnutls_session_t' type + + FUNC: is the function to be called + + This function will set a callback to be called when a handshake + message is being sent. + + *Since:* 3.7.0 + +gnutls_handshake_set_secret_function +------------------------------------ + + -- Function: void gnutls_handshake_set_secret_function + (gnutls_session_t SESSION, gnutls_handshake_secret_func FUNC) + SESSION: is a 'gnutls_session_t' type. + + FUNC: the secret func + + This function will set a callback to be called when a new traffic + secret is installed. + + *Since:* 3.7.0 + +gnutls_handshake_set_timeout +---------------------------- + + -- Function: void gnutls_handshake_set_timeout (gnutls_session_t + SESSION, unsigned int MS) + SESSION: is a 'gnutls_session_t' type. + + MS: is a timeout value in milliseconds + + This function sets the timeout for the TLS handshake process to the + provided value. Use an 'ms' value of zero to disable timeout, or + 'GNUTLS_DEFAULT_HANDSHAKE_TIMEOUT' for a reasonable default value. + For the DTLS protocol, the more detailed + 'gnutls_dtls_set_timeouts()' is provided. + + This function requires to set a pull timeout callback. See + 'gnutls_transport_set_pull_timeout_function()' . + + *Since:* 3.1.0 + +gnutls_handshake_write +---------------------- + + -- Function: int gnutls_handshake_write (gnutls_session_t SESSION, + gnutls_record_encryption_level_t LEVEL, const void * DATA, + size_t DATA_SIZE) + SESSION: is a 'gnutls_session_t' type. + + LEVEL: the current encryption level for reading a handshake message + + DATA: the (const) handshake data to be processed + + DATA_SIZE: the size of data + + This function processes a handshake message in the encryption level + specified with 'level' . Prior to calling this function, a + handshake read callback must be set on 'session' . Use + 'gnutls_handshake_set_read_function()' to do this. + + *Since:* 3.7.0 + +gnutls_heartbeat_allowed +------------------------ + + -- Function: unsigned gnutls_heartbeat_allowed (gnutls_session_t + SESSION, unsigned int TYPE) + SESSION: is a 'gnutls_session_t' type. + + TYPE: one of 'GNUTLS_HB_LOCAL_ALLOWED_TO_SEND' and + 'GNUTLS_HB_PEER_ALLOWED_TO_SEND' + + This function will check whether heartbeats are allowed to be sent + or received in this session. + + *Returns:* Non zero if heartbeats are allowed. + + *Since:* 3.1.2 + +gnutls_heartbeat_enable +----------------------- + + -- Function: void gnutls_heartbeat_enable (gnutls_session_t SESSION, + unsigned int TYPE) + SESSION: is a 'gnutls_session_t' type. + + TYPE: one of the GNUTLS_HB_* flags + + If this function is called with the + 'GNUTLS_HB_PEER_ALLOWED_TO_SEND' 'type' , GnuTLS will allow + heartbeat messages to be received. Moreover it also request the + peer to accept heartbeat messages. This function must be called + prior to TLS handshake. + + If the 'type' used is 'GNUTLS_HB_LOCAL_ALLOWED_TO_SEND' , then the + peer will be asked to accept heartbeat messages but not send ones. + + The function 'gnutls_heartbeat_allowed()' can be used to test + Whether locally generated heartbeat messages can be accepted by the + peer. + + *Since:* 3.1.2 + +gnutls_heartbeat_get_timeout +---------------------------- + + -- Function: unsigned int gnutls_heartbeat_get_timeout + (gnutls_session_t SESSION) + SESSION: is a 'gnutls_session_t' type. + + This function will return the milliseconds remaining for a + retransmission of the previously sent ping message. This function + is useful when ping is used in non-blocking mode, to estimate when + to call 'gnutls_heartbeat_ping()' if no packets have been received. + + *Returns:* the remaining time in milliseconds. + + *Since:* 3.1.2 + +gnutls_heartbeat_ping +--------------------- + + -- Function: int gnutls_heartbeat_ping (gnutls_session_t SESSION, + size_t DATA_SIZE, unsigned int MAX_TRIES, unsigned int FLAGS) + SESSION: is a 'gnutls_session_t' type. + + DATA_SIZE: is the length of the ping payload. + + MAX_TRIES: if flags is 'GNUTLS_HEARTBEAT_WAIT' then this sets the + number of retransmissions. Use zero for indefinite (until + timeout). + + FLAGS: if 'GNUTLS_HEARTBEAT_WAIT' then wait for pong or timeout + instead of returning immediately. + + This function sends a ping to the peer. If the 'flags' is set to + 'GNUTLS_HEARTBEAT_WAIT' then it waits for a reply from the peer. + + Note that it is highly recommended to use this function with the + flag 'GNUTLS_HEARTBEAT_WAIT' , or you need to handle + retransmissions and timeouts manually. + + The total TLS data transmitted as part of the ping message are + given by the following formula: MAX(16, 'data_size' + )+'gnutls_record_overhead_size()' +3. + + *Returns:* 'GNUTLS_E_SUCCESS' on success, otherwise a negative + error code. + + *Since:* 3.1.2 + +gnutls_heartbeat_pong +--------------------- + + -- Function: int gnutls_heartbeat_pong (gnutls_session_t SESSION, + unsigned int FLAGS) + SESSION: is a 'gnutls_session_t' type. + + FLAGS: should be zero + + This function replies to a ping by sending a pong to the peer. + + *Returns:* 'GNUTLS_E_SUCCESS' on success, otherwise a negative + error code. + + *Since:* 3.1.2 + +gnutls_heartbeat_set_timeouts +----------------------------- + + -- Function: void gnutls_heartbeat_set_timeouts (gnutls_session_t + SESSION, unsigned int RETRANS_TIMEOUT, unsigned int + TOTAL_TIMEOUT) + SESSION: is a 'gnutls_session_t' type. + + RETRANS_TIMEOUT: The time at which a retransmission will occur in + milliseconds + + TOTAL_TIMEOUT: The time at which the connection will be aborted, in + milliseconds. + + This function will override the timeouts for the DTLS heartbeat + protocol. The retransmission timeout is the time after which a + message from the peer is not received, the previous request will be + retransmitted. The total timeout is the time after which the + handshake will be aborted with 'GNUTLS_E_TIMEDOUT' . + + *Since:* 3.1.2 + +gnutls_hex2bin +-------------- + + -- Function: int gnutls_hex2bin (const char * HEX_DATA, size_t + HEX_SIZE, void * BIN_DATA, size_t * BIN_SIZE) + HEX_DATA: string with data in hex format + + HEX_SIZE: size of hex data + + BIN_DATA: output array with binary data + + BIN_SIZE: when calling should hold maximum size of 'bin_data' , on + return will hold actual length of 'bin_data' . + + Convert a buffer with hex data to binary data. This function + unlike 'gnutls_hex_decode()' can parse hex data with separators + between numbers. That is, it ignores any non-hex characters. + + *Returns:* 'GNUTLS_E_SUCCESS' on success, otherwise a negative + error code. + + *Since:* 2.4.0 + +gnutls_hex_decode +----------------- + + -- Function: int gnutls_hex_decode (const gnutls_datum_t * HEX_DATA, + void * RESULT, size_t * RESULT_SIZE) + HEX_DATA: contain the encoded data + + RESULT: the place where decoded data will be copied + + RESULT_SIZE: holds the size of the result + + This function will decode the given encoded data, using the hex + encoding used by PSK password files. + + Initially 'result_size' must hold the maximum size available in + 'result' , and on return it will contain the number of bytes + written. + + *Returns:* 'GNUTLS_E_SHORT_MEMORY_BUFFER' if the buffer given is + not long enough, 'GNUTLS_E_PARSING_ERROR' on invalid hex data, or 0 + on success. + +gnutls_hex_decode2 +------------------ + + -- Function: int gnutls_hex_decode2 (const gnutls_datum_t * HEX_DATA, + gnutls_datum_t * RESULT) + HEX_DATA: contain the encoded data + + RESULT: the result in an allocated string + + This function will decode the given encoded data, using the hex + encoding used by PSK password files. + + *Returns:* 'GNUTLS_E_PARSING_ERROR' on invalid hex data, or 0 on + success. + +gnutls_hex_encode +----------------- + + -- Function: int gnutls_hex_encode (const gnutls_datum_t * DATA, char * + RESULT, size_t * RESULT_SIZE) + DATA: contain the raw data + + RESULT: the place where hex data will be copied + + RESULT_SIZE: holds the size of the result + + This function will convert the given data to printable data, using + the hex encoding, as used in the PSK password files. + + Note that the size of the result includes the null terminator. + + *Returns:* 'GNUTLS_E_SHORT_MEMORY_BUFFER' if the buffer given is + not long enough, or 0 on success. + +gnutls_hex_encode2 +------------------ + + -- Function: int gnutls_hex_encode2 (const gnutls_datum_t * DATA, + gnutls_datum_t * RESULT) + DATA: contain the raw data + + RESULT: the result in an allocated string + + This function will convert the given data to printable data, using + the hex encoding, as used in the PSK password files. + + Note that the size of the result does NOT include the null + terminator. + + *Returns:* 'GNUTLS_E_SUCCESS' on success, otherwise a negative + error code. + +gnutls_idna_map +--------------- + + -- Function: int gnutls_idna_map (const char * INPUT, unsigned ILEN, + gnutls_datum_t * OUT, unsigned FLAGS) + INPUT: contain the UTF-8 formatted domain name + + ILEN: the length of the provided string + + OUT: the result in an null-terminated allocated string + + FLAGS: should be zero + + This function will convert the provided UTF-8 domain name, to its + IDNA mapping in an allocated variable. Note that depending on the + flags the used gnutls library was compiled with, the output of this + function may vary (i.e., may be IDNA2008, or IDNA2003). + + To force IDNA2008 specify the flag 'GNUTLS_IDNA_FORCE_2008' . In + the case GnuTLS is not compiled with the necessary dependencies, + 'GNUTLS_E_UNIMPLEMENTED_FEATURE' will be returned to indicate that + gnutls is unable to perform the requested conversion. + + Note also, that this function will return an empty string if an + empty string is provided as input. + + *Returns:* 'GNUTLS_E_INVALID_UTF8_STRING' on invalid UTF-8 data, or + 0 on success. + + *Since:* 3.5.8 + +gnutls_idna_reverse_map +----------------------- + + -- Function: int gnutls_idna_reverse_map (const char * INPUT, unsigned + ILEN, gnutls_datum_t * OUT, unsigned FLAGS) + INPUT: contain the ACE (IDNA) formatted domain name + + ILEN: the length of the provided string + + OUT: the result in an null-terminated allocated UTF-8 string + + FLAGS: should be zero + + This function will convert an ACE (ASCII-encoded) domain name to a + UTF-8 domain name. + + If GnuTLS is compiled without IDNA support, then this function will + return 'GNUTLS_E_UNIMPLEMENTED_FEATURE' . + + Note also, that this function will return an empty string if an + empty string is provided as input. + + *Returns:* A negative error code on error, or 0 on success. + + *Since:* 3.5.8 + +gnutls_init +----------- + + -- Function: int gnutls_init (gnutls_session_t * SESSION, unsigned int + FLAGS) + SESSION: is a pointer to a 'gnutls_session_t' type. + + FLAGS: indicate if this session is to be used for server or client. + + This function initializes the provided session. Every session must + be initialized before use, and must be deinitialized after used by + calling 'gnutls_deinit()' . + + 'flags' can be any combination of flags from 'gnutls_init_flags_t' + . + + Note that since version 3.1.2 this function enables some common TLS + extensions such as session tickets and OCSP certificate status + request in client side by default. To prevent that use the + 'GNUTLS_NO_EXTENSIONS' flag. + + *Returns:* 'GNUTLS_E_SUCCESS' on success, or an error code. + +gnutls_key_generate +------------------- + + -- Function: int gnutls_key_generate (gnutls_datum_t * KEY, unsigned + int KEY_SIZE) + KEY: is a pointer to a 'gnutls_datum_t' which will contain a newly + created key + + KEY_SIZE: the number of bytes of the key + + Generates a random key of 'key_size' bytes. + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, or an + error code. + + *Since:* 3.0 + +gnutls_kx_get +------------- + + -- Function: gnutls_kx_algorithm_t gnutls_kx_get (gnutls_session_t + SESSION) + SESSION: is a 'gnutls_session_t' type. + + Get the currently used key exchange algorithm. + + This function will return 'GNUTLS_KX_ECDHE_RSA' , or + 'GNUTLS_KX_DHE_RSA' under TLS 1.3, to indicate an elliptic curve DH + key exchange or a finite field one. The precise group used is + available by calling 'gnutls_group_get()' instead. + + *Returns:* the key exchange algorithm used in the last handshake, a + 'gnutls_kx_algorithm_t' value. + +gnutls_kx_get_id +---------------- + + -- Function: gnutls_kx_algorithm_t gnutls_kx_get_id (const char * NAME) + NAME: is a KX name + + Convert a string to a 'gnutls_kx_algorithm_t' value. The names are + compared in a case insensitive way. + + *Returns:* an id of the specified KX algorithm, or + 'GNUTLS_KX_UNKNOWN' on error. + +gnutls_kx_get_name +------------------ + + -- Function: const char * gnutls_kx_get_name (gnutls_kx_algorithm_t + ALGORITHM) + ALGORITHM: is a key exchange algorithm + + Convert a 'gnutls_kx_algorithm_t' value to a string. + + *Returns:* a pointer to a string that contains the name of the + specified key exchange algorithm, or 'NULL' . + +gnutls_kx_list +-------------- + + -- Function: const gnutls_kx_algorithm_t * gnutls_kx_list ( VOID) + + Get a list of supported key exchange algorithms. + + This function is not thread safe. + + *Returns:* a (0)-terminated list of 'gnutls_kx_algorithm_t' + integers indicating the available key exchange algorithms. + +gnutls_load_file +---------------- + + -- Function: int gnutls_load_file (const char * FILENAME, + gnutls_datum_t * DATA) + FILENAME: the name of the file to load + + DATA: Where the file will be stored + + This function will load a file into a datum. The data are zero + terminated but the terminating null is not included in length. The + returned data are allocated using 'gnutls_malloc()' . + + Note that this function is not designed for reading sensitive + materials, such as private keys, on practical applications. When + the reading fails in the middle, the partially loaded content might + remain on memory. + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, + otherwise an error code is returned. + + Since 3.1.0 + +gnutls_mac_get +-------------- + + -- Function: gnutls_mac_algorithm_t gnutls_mac_get (gnutls_session_t + SESSION) + SESSION: is a 'gnutls_session_t' type. + + Get the currently used MAC algorithm. + + *Returns:* the currently used mac algorithm, a + 'gnutls_mac_algorithm_t' value. + +gnutls_mac_get_id +----------------- + + -- Function: gnutls_mac_algorithm_t gnutls_mac_get_id (const char * + NAME) + NAME: is a MAC algorithm name + + Convert a string to a 'gnutls_mac_algorithm_t' value. The names + are compared in a case insensitive way. + + *Returns:* a 'gnutls_mac_algorithm_t' id of the specified MAC + algorithm string, or 'GNUTLS_MAC_UNKNOWN' on failure. + +gnutls_mac_get_key_size +----------------------- + + -- Function: size_t gnutls_mac_get_key_size (gnutls_mac_algorithm_t + ALGORITHM) + ALGORITHM: is an encryption algorithm + + Returns the size of the MAC key used in TLS. + + *Returns:* length (in bytes) of the given MAC key size, or 0 if the + given MAC algorithm is invalid. + +gnutls_mac_get_name +------------------- + + -- Function: const char * gnutls_mac_get_name (gnutls_mac_algorithm_t + ALGORITHM) + ALGORITHM: is a MAC algorithm + + Convert a 'gnutls_mac_algorithm_t' value to a string. + + *Returns:* a string that contains the name of the specified MAC + algorithm, or 'NULL' . + +gnutls_mac_list +--------------- + + -- Function: const gnutls_mac_algorithm_t * gnutls_mac_list ( VOID) + + Get a list of hash algorithms for use as MACs. Note that not + necessarily all MACs are supported in TLS cipher suites. This + function is not thread safe. + + *Returns:* Return a (0)-terminated list of 'gnutls_mac_algorithm_t' + integers indicating the available MACs. + +gnutls_memcmp +------------- + + -- Function: int gnutls_memcmp (const void * S1, const void * S2, + size_t N) + S1: the first address to compare + + S2: the second address to compare + + N: the size of memory to compare + + This function will operate similarly to 'memcmp()' , but will + operate on time that depends only on the size of the string. That + is will not return early if the strings don't match on the first + byte. + + *Returns:* non zero on difference and zero if the buffers are + identical. + + *Since:* 3.4.0 + +gnutls_memset +------------- + + -- Function: void gnutls_memset (void * DATA, int C, size_t SIZE) + DATA: the memory to set + + C: the constant byte to fill the memory with + + SIZE: the size of memory + + This function will operate similarly to 'memset()' , but will not + be optimized out by the compiler. + + *Since:* 3.4.0 + +gnutls_ocsp_status_request_enable_client +---------------------------------------- + + -- Function: int gnutls_ocsp_status_request_enable_client + (gnutls_session_t SESSION, gnutls_datum_t * RESPONDER_ID, + size_t RESPONDER_ID_SIZE, gnutls_datum_t * EXTENSIONS) + SESSION: is a 'gnutls_session_t' type. + + RESPONDER_ID: ignored, must be 'NULL' + + RESPONDER_ID_SIZE: ignored, must be zero + + EXTENSIONS: ignored, must be 'NULL' + + This function is to be used by clients to request OCSP response + from the server, using the "status_request" TLS extension. Only + OCSP status type is supported. + + Previous versions of GnuTLS supported setting 'responder_id' and + 'extensions' fields, but due to the difficult semantics of the + parameter usage, and other issues, this support was removed since + 3.6.0 and these parameters must be set to 'NULL' . + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, + otherwise a negative error code is returned. + + *Since:* 3.1.3 + +gnutls_ocsp_status_request_get +------------------------------ + + -- Function: int gnutls_ocsp_status_request_get (gnutls_session_t + SESSION, gnutls_datum_t * RESPONSE) + SESSION: is a 'gnutls_session_t' type. + + RESPONSE: a 'gnutls_datum_t' with DER encoded OCSP response + + This function returns the OCSP status response received from the + TLS server. The 'response' should be treated as constant. If no + OCSP response is available then + 'GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE' is returned. + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, + otherwise a negative error code is returned. + + *Since:* 3.1.3 + +gnutls_ocsp_status_request_get2 +------------------------------- + + -- Function: int gnutls_ocsp_status_request_get2 (gnutls_session_t + SESSION, unsigned IDX, gnutls_datum_t * RESPONSE) + SESSION: is a 'gnutls_session_t' type. + + IDX: the index of peer's certificate + + RESPONSE: a 'gnutls_datum_t' with DER encoded OCSP response + + This function returns the OCSP status response received from the + TLS server for the certificate index provided. The index + corresponds to certificates as returned by + gnutls_certificate_get_peers. When index is zero this function + operates identically to 'gnutls_ocsp_status_request_get()' . + + The returned 'response' should be treated as constant. If no OCSP + response is available for the given index then + 'GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE' is returned. + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, + otherwise a negative error code is returned. + + *Since:* 3.6.3 + +gnutls_ocsp_status_request_is_checked +------------------------------------- + + -- Function: unsigned gnutls_ocsp_status_request_is_checked + (gnutls_session_t SESSION, unsigned int FLAGS) + SESSION: is a gnutls session + + FLAGS: should be zero or 'GNUTLS_OCSP_SR_IS_AVAIL' + + When flags are zero this function returns non-zero if a valid OCSP + status response was included in the TLS handshake. That is, an + OCSP status response which is not too old, superseded or marks the + certificate as revoked. It returns zero otherwise. + + When the flag 'GNUTLS_OCSP_SR_IS_AVAIL' is specified, the function + returns non-zero if an OCSP status response was included in the + handshake even if it was invalid. Otherwise, if no OCSP status + response was included, it returns zero. The + 'GNUTLS_OCSP_SR_IS_AVAIL' flag was introduced in GnuTLS 3.4.0. + + This is a helper function when needing to decide whether to perform + an explicit OCSP validity check on the peer's certificate. Should + be called after any of gnutls_certificate_verify_peers*() are + called. + + This function is always usable on client side, but on server side + only under TLS 1.3, which is the first version of TLS that allows + cliend-side OCSP responses. + + *Returns:* Non-zero if the response was valid, or a zero if it + wasn't sent, or sent and was invalid. + + *Since:* 3.1.4 + +gnutls_oid_to_digest +-------------------- + + -- Function: gnutls_digest_algorithm_t gnutls_oid_to_digest (const char + * OID) + OID: is an object identifier + + Converts a textual object identifier to a + 'gnutls_digest_algorithm_t' value. + + *Returns:* a 'gnutls_digest_algorithm_t' id of the specified digest + algorithm, or 'GNUTLS_DIG_UNKNOWN' on failure. + + *Since:* 3.4.3 + +gnutls_oid_to_ecc_curve +----------------------- + + -- Function: gnutls_ecc_curve_t gnutls_oid_to_ecc_curve (const char * + OID) + OID: is a curve's OID + + *Returns:* return a 'gnutls_ecc_curve_t' value corresponding to the + specified OID, or 'GNUTLS_ECC_CURVE_INVALID' on error. + + *Since:* 3.4.3 + +gnutls_oid_to_gost_paramset +--------------------------- + + -- Function: gnutls_gost_paramset_t gnutls_oid_to_gost_paramset (const + char * OID) + OID: is an object identifier + + Converts a textual object identifier to a 'gnutls_gost_paramset_t' + value. + + *Returns:* a 'gnutls_gost_paramset_get_oid' of the specified GOST + 28147 param st, or 'GNUTLS_GOST_PARAMSET_UNKNOWN' on failure. + + *Since:* 3.6.3 + +gnutls_oid_to_mac +----------------- + + -- Function: gnutls_mac_algorithm_t gnutls_oid_to_mac (const char * + OID) + OID: is an object identifier + + Converts a textual object identifier typically from PKCS'5' values + to a 'gnutls_mac_algorithm_t' value. + + *Returns:* a 'gnutls_mac_algorithm_t' id of the specified digest + algorithm, or 'GNUTLS_MAC_UNKNOWN' on failure. + + *Since:* 3.5.4 + +gnutls_oid_to_pk +---------------- + + -- Function: gnutls_pk_algorithm_t gnutls_oid_to_pk (const char * OID) + OID: is an object identifier + + Converts a textual object identifier to a 'gnutls_pk_algorithm_t' + value. + + *Returns:* a 'gnutls_pk_algorithm_t' id of the specified digest + algorithm, or 'GNUTLS_PK_UNKNOWN' on failure. + + *Since:* 3.4.3 + +gnutls_oid_to_sign +------------------ + + -- Function: gnutls_sign_algorithm_t gnutls_oid_to_sign (const char * + OID) + OID: is an object identifier + + Converts a textual object identifier to a 'gnutls_sign_algorithm_t' + value. + + *Returns:* a 'gnutls_sign_algorithm_t' id of the specified digest + algorithm, or 'GNUTLS_SIGN_UNKNOWN' on failure. + + *Since:* 3.4.3 + +gnutls_openpgp_send_cert +------------------------ + + -- Function: void gnutls_openpgp_send_cert (gnutls_session_t SESSION, + gnutls_openpgp_crt_status_t STATUS) + SESSION: is a gnutls session + + STATUS: is ignored + + This function is no-op. + + *Returns:* 'GNUTLS_E_UNIMPLEMENTED_FEATURE' . + +gnutls_packet_deinit +-------------------- + + -- Function: void gnutls_packet_deinit (gnutls_packet_t PACKET) + PACKET: is a pointer to a 'gnutls_packet_st' structure. + + This function will deinitialize all data associated with the + received packet. + + *Since:* 3.3.5 + +gnutls_packet_get +----------------- + + -- Function: void gnutls_packet_get (gnutls_packet_t PACKET, + gnutls_datum_t * DATA, unsigned char * SEQUENCE) + PACKET: is a 'gnutls_packet_t' type. + + DATA: will contain the data present in the 'packet' structure (may + be 'NULL' ) + + SEQUENCE: the 8-bytes of the packet sequence number (may be 'NULL' + ) + + This function returns the data and sequence number associated with + the received packet. + + *Since:* 3.3.5 + +gnutls_pem_base64_decode +------------------------ + + -- Function: int gnutls_pem_base64_decode (const char * HEADER, const + gnutls_datum_t * B64_DATA, unsigned char * RESULT, size_t * + RESULT_SIZE) + HEADER: A null terminated string with the PEM header (eg. + CERTIFICATE) + + B64_DATA: contain the encoded data + + RESULT: the place where decoded data will be copied + + RESULT_SIZE: holds the size of the result + + This function will decode the given encoded data. If the header + given is non 'NULL' this function will search for "---BEGIN header" + and decode only this part. Otherwise it will decode the first PEM + packet found. + + *Returns:* On success 'GNUTLS_E_SUCCESS' (0) is returned, + 'GNUTLS_E_SHORT_MEMORY_BUFFER' is returned if the buffer given is + not long enough, or 0 on success. + +gnutls_pem_base64_decode2 +------------------------- + + -- Function: int gnutls_pem_base64_decode2 (const char * HEADER, const + gnutls_datum_t * B64_DATA, gnutls_datum_t * RESULT) + HEADER: The PEM header (eg. CERTIFICATE) + + B64_DATA: contains the encoded data + + RESULT: the location of decoded data + + This function will decode the given encoded data. The decoded data + will be allocated, and stored into result. If the header given is + non null this function will search for "---BEGIN header" and decode + only this part. Otherwise it will decode the first PEM packet + found. + + You should use 'gnutls_free()' to free the returned data. + + Note, that prior to GnuTLS 3.4.0 this function was available under + the name 'gnutls_pem_base64_decode_alloc()' . There is + compatibility macro pointing to this function. + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, + otherwise an error code is returned. + + *Since:* 3.4.0 + +gnutls_pem_base64_encode +------------------------ + + -- Function: int gnutls_pem_base64_encode (const char * MSG, const + gnutls_datum_t * DATA, char * RESULT, size_t * RESULT_SIZE) + MSG: is a message to be put in the header (may be 'NULL' ) + + DATA: contain the raw data + + RESULT: the place where base64 data will be copied + + RESULT_SIZE: holds the size of the result + + This function will convert the given data to printable data, using + the base64 encoding. This is the encoding used in PEM messages. + + The output string will be null terminated, although the output size + will not include the terminating null. + + *Returns:* On success 'GNUTLS_E_SUCCESS' (0) is returned, + 'GNUTLS_E_SHORT_MEMORY_BUFFER' is returned if the buffer given is + not long enough, or 0 on success. + +gnutls_pem_base64_encode2 +------------------------- + + -- Function: int gnutls_pem_base64_encode2 (const char * HEADER, const + gnutls_datum_t * DATA, gnutls_datum_t * RESULT) + HEADER: is a message to be put in the encoded header (may be 'NULL' + ) + + DATA: contains the raw data + + RESULT: will hold the newly allocated encoded data + + This function will convert the given data to printable data, using + the base64 encoding. This is the encoding used in PEM messages. + This function will allocate the required memory to hold the encoded + data. + + You should use 'gnutls_free()' to free the returned data. + + Note, that prior to GnuTLS 3.4.0 this function was available under + the name 'gnutls_pem_base64_encode_alloc()' . There is + compatibility macro pointing to this function. + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, + otherwise an error code is returned. + + *Since:* 3.4.0 + +gnutls_perror +------------- + + -- Function: void gnutls_perror (int ERROR) + ERROR: is a GnuTLS error code, a negative error code + + This function is like 'perror()' . The only difference is that it + accepts an error number returned by a gnutls function. + +gnutls_pk_algorithm_get_name +---------------------------- + + -- Function: const char * gnutls_pk_algorithm_get_name + (gnutls_pk_algorithm_t ALGORITHM) + ALGORITHM: is a pk algorithm + + Convert a 'gnutls_pk_algorithm_t' value to a string. + + *Returns:* a string that contains the name of the specified public + key algorithm, or 'NULL' . + +gnutls_pk_bits_to_sec_param +--------------------------- + + -- Function: gnutls_sec_param_t gnutls_pk_bits_to_sec_param + (gnutls_pk_algorithm_t ALGO, unsigned int BITS) + ALGO: is a public key algorithm + + BITS: is the number of bits + + This is the inverse of 'gnutls_sec_param_to_pk_bits()' . Given an + algorithm and the number of bits, it will return the security + parameter. This is a rough indication. + + *Returns:* The security parameter. + + *Since:* 2.12.0 + +gnutls_pk_get_id +---------------- + + -- Function: gnutls_pk_algorithm_t gnutls_pk_get_id (const char * NAME) + NAME: is a string containing a public key algorithm name. + + Convert a string to a 'gnutls_pk_algorithm_t' value. The names are + compared in a case insensitive way. For example, + gnutls_pk_get_id("RSA") will return 'GNUTLS_PK_RSA' . + + *Returns:* a 'gnutls_pk_algorithm_t' id of the specified public key + algorithm string, or 'GNUTLS_PK_UNKNOWN' on failures. + + *Since:* 2.6.0 + +gnutls_pk_get_name +------------------ + + -- Function: const char * gnutls_pk_get_name (gnutls_pk_algorithm_t + ALGORITHM) + ALGORITHM: is a public key algorithm + + Convert a 'gnutls_pk_algorithm_t' value to a string. + + *Returns:* a pointer to a string that contains the name of the + specified public key algorithm, or 'NULL' . + + *Since:* 2.6.0 + +gnutls_pk_get_oid +----------------- + + -- Function: const char * gnutls_pk_get_oid (gnutls_pk_algorithm_t + ALGORITHM) + ALGORITHM: is a public key algorithm + + Convert a 'gnutls_pk_algorithm_t' value to its object identifier + string. + + *Returns:* a pointer to a string that contains the object + identifier of the specified public key algorithm, or 'NULL' . + + *Since:* 3.4.3 + +gnutls_pk_list +-------------- + + -- Function: const gnutls_pk_algorithm_t * gnutls_pk_list ( VOID) + + Get a list of supported public key algorithms. + + This function is not thread safe. + + *Returns:* a (0)-terminated list of 'gnutls_pk_algorithm_t' + integers indicating the available ciphers. + + *Since:* 2.6.0 + +gnutls_pk_to_sign +----------------- + + -- Function: gnutls_sign_algorithm_t gnutls_pk_to_sign + (gnutls_pk_algorithm_t PK, gnutls_digest_algorithm_t HASH) + PK: is a public key algorithm + + HASH: a hash algorithm + + This function maps public key and hash algorithms combinations to + signature algorithms. + + *Returns:* return a 'gnutls_sign_algorithm_t' value, or + 'GNUTLS_SIGN_UNKNOWN' on error. + +gnutls_prf +---------- + + -- Function: int gnutls_prf (gnutls_session_t SESSION, size_t + LABEL_SIZE, const char * LABEL, int SERVER_RANDOM_FIRST, + size_t EXTRA_SIZE, const char * EXTRA, size_t OUTSIZE, char * + OUT) + SESSION: is a 'gnutls_session_t' type. + + LABEL_SIZE: length of the 'label' variable. + + LABEL: label used in PRF computation, typically a short string. + + SERVER_RANDOM_FIRST: non-zero if server random field should be + first in seed + + EXTRA_SIZE: length of the 'extra' variable. + + EXTRA: optional extra data to seed the PRF with. + + OUTSIZE: size of pre-allocated output buffer to hold the output. + + OUT: pre-allocated buffer to hold the generated data. + + Applies the TLS Pseudo-Random-Function (PRF) on the master secret + and the provided data, seeded with the client and server random + fields. For the key expansion specified in RFC5705 see + 'gnutls_prf_rfc5705()' . + + The 'label' variable usually contains a string denoting the purpose + for the generated data. The 'server_random_first' indicates + whether the client random field or the server random field should + be first in the seed. Non-zero indicates that the server random + field is first, 0 that the client random field is first. + + The 'extra' variable can be used to add more data to the seed, + after the random variables. It can be used to make sure the + generated output is strongly connected to some additional data + (e.g., a string used in user authentication). + + The output is placed in 'out' , which must be pre-allocated. + + *Note:* This function produces identical output with + 'gnutls_prf_rfc5705()' when 'server_random_first' is set to 0 and + 'extra' is 'NULL' . Under TLS1.3 this function will only operate + when these conditions are true, or otherwise return + 'GNUTLS_E_INVALID_REQUEST' . + + *Returns:* 'GNUTLS_E_SUCCESS' on success, or an error code. + +gnutls_prf_early +---------------- + + -- Function: int gnutls_prf_early (gnutls_session_t SESSION, size_t + LABEL_SIZE, const char * LABEL, size_t CONTEXT_SIZE, const + char * CONTEXT, size_t OUTSIZE, char * OUT) + SESSION: is a 'gnutls_session_t' type. + + LABEL_SIZE: length of the 'label' variable. + + LABEL: label used in PRF computation, typically a short string. + + CONTEXT_SIZE: length of the 'extra' variable. + + CONTEXT: optional extra data to seed the PRF with. + + OUTSIZE: size of pre-allocated output buffer to hold the output. + + OUT: pre-allocated buffer to hold the generated data. + + This function is similar to 'gnutls_prf_rfc5705()' , but only works + in TLS 1.3 or later to export early keying material. + + Note that the keying material is only available after the + ClientHello message is processed and before the application traffic + keys are established. Therefore this function shall be called in a + handshake hook function for 'GNUTLS_HANDSHAKE_CLIENT_HELLO' . + + The 'label' variable usually contains a string denoting the purpose + for the generated data. + + The 'context' variable can be used to add more data to the seed, + after the random variables. It can be used to make sure the + generated output is strongly connected to some additional data + (e.g., a string used in user authentication). + + The output is placed in 'out' , which must be pre-allocated. + + Note that, to provide the RFC5705 context, the 'context' variable + must be non-null. + + *Returns:* 'GNUTLS_E_SUCCESS' on success, or an error code. + + *Since:* 3.6.8 + +gnutls_prf_hash_get +------------------- + + -- Function: gnutls_digest_algorithm_t gnutls_prf_hash_get (const + gnutls_session_t SESSION) + SESSION: is a 'gnutls_session_t' type. + + Get the currently used hash algorithm. In TLS 1.3, the hash + algorithm is used for both the key derivation function and + handshake message authentication code. In TLS 1.2, it matches the + hash algorithm used for PRF. + + *Returns:* the currently used hash algorithm, a + 'gnutls_digest_algorithm_t' value. + + *Since:* 3.6.13 + +gnutls_prf_raw +-------------- + + -- Function: int gnutls_prf_raw (gnutls_session_t SESSION, size_t + LABEL_SIZE, const char * LABEL, size_t SEED_SIZE, const char * + SEED, size_t OUTSIZE, char * OUT) + SESSION: is a 'gnutls_session_t' type. + + LABEL_SIZE: length of the 'label' variable. + + LABEL: label used in PRF computation, typically a short string. + + SEED_SIZE: length of the 'seed' variable. + + SEED: optional extra data to seed the PRF with. + + OUTSIZE: size of pre-allocated output buffer to hold the output. + + OUT: pre-allocated buffer to hold the generated data. + + Apply the TLS Pseudo-Random-Function (PRF) on the master secret and + the provided data. + + The 'label' variable usually contains a string denoting the purpose + for the generated data. The 'seed' usually contains data such as + the client and server random, perhaps together with some additional + data that is added to guarantee uniqueness of the output for a + particular purpose. + + Because the output is not guaranteed to be unique for a particular + session unless 'seed' includes the client random and server random + fields (the PRF would output the same data on another connection + resumed from the first one), it is not recommended to use this + function directly. The 'gnutls_prf()' function seeds the PRF with + the client and server random fields directly, and is recommended if + you want to generate pseudo random data unique for each session. + + *Note:* This function will only operate under TLS versions prior to + 1.3. In TLS1.3 the use of PRF is replaced with HKDF and the + generic exporters like 'gnutls_prf_rfc5705()' should be used + instead. Under TLS1.3 this function returns + 'GNUTLS_E_INVALID_REQUEST' . + + *Returns:* 'GNUTLS_E_SUCCESS' on success, or an error code. + +gnutls_prf_rfc5705 +------------------ + + -- Function: int gnutls_prf_rfc5705 (gnutls_session_t SESSION, size_t + LABEL_SIZE, const char * LABEL, size_t CONTEXT_SIZE, const + char * CONTEXT, size_t OUTSIZE, char * OUT) + SESSION: is a 'gnutls_session_t' type. + + LABEL_SIZE: length of the 'label' variable. + + LABEL: label used in PRF computation, typically a short string. + + CONTEXT_SIZE: length of the 'extra' variable. + + CONTEXT: optional extra data to seed the PRF with. + + OUTSIZE: size of pre-allocated output buffer to hold the output. + + OUT: pre-allocated buffer to hold the generated data. + + Exports keying material from TLS/DTLS session to an application, as + specified in RFC5705. + + In the TLS versions prior to 1.3, it applies the TLS + Pseudo-Random-Function (PRF) on the master secret and the provided + data, seeded with the client and server random fields. + + In TLS 1.3, it applies HKDF on the exporter master secret derived + from the master secret. + + The 'label' variable usually contains a string denoting the purpose + for the generated data. + + The 'context' variable can be used to add more data to the seed, + after the random variables. It can be used to make sure the + generated output is strongly connected to some additional data + (e.g., a string used in user authentication). + + The output is placed in 'out' , which must be pre-allocated. + + Note that, to provide the RFC5705 context, the 'context' variable + must be non-null. + + *Returns:* 'GNUTLS_E_SUCCESS' on success, or an error code. + + *Since:* 3.4.4 + +gnutls_priority_certificate_type_list +------------------------------------- + + -- Function: int gnutls_priority_certificate_type_list + (gnutls_priority_t PCACHE, const unsigned int ** LIST) + PCACHE: is a 'gnutls_priority_t' type. + + LIST: will point to an integer list + + Get a list of available certificate types in the priority + structure. + + As of version 3.6.4 this function is an alias for + gnutls_priority_certificate_type_list2 with the target parameter + set to: - GNUTLS_CTYPE_SERVER, if the 'SERVER_PRECEDENCE' option is + set - GNUTLS_CTYPE_CLIENT, otherwise. + + *Returns:* the number of certificate types, or an error code. + + *Since:* 3.0 + +gnutls_priority_certificate_type_list2 +-------------------------------------- + + -- Function: int gnutls_priority_certificate_type_list2 + (gnutls_priority_t PCACHE, const unsigned int ** LIST, + gnutls_ctype_target_t TARGET) + PCACHE: is a 'gnutls_priority_t' type. + + LIST: will point to an integer list. + + TARGET: is a 'gnutls_ctype_target_t' type. Valid arguments are + GNUTLS_CTYPE_CLIENT and GNUTLS_CTYPE_SERVER + + Get a list of available certificate types for the given target in + the priority structure. + + *Returns:* the number of certificate types, or an error code. + + *Since:* 3.6.4 + +gnutls_priority_cipher_list +--------------------------- + + -- Function: int gnutls_priority_cipher_list (gnutls_priority_t PCACHE, + const unsigned int ** LIST) + PCACHE: is a 'gnutls_priority_t' type. + + LIST: will point to an integer list + + Get a list of available ciphers in the priority structure. + + *Returns:* the number of items, or an error code. + + *Since:* 3.2.3 + +gnutls_priority_deinit +---------------------- + + -- Function: void gnutls_priority_deinit (gnutls_priority_t + PRIORITY_CACHE) + PRIORITY_CACHE: is a 'gnutls_priority_t' type. + + Deinitializes the priority cache. + +gnutls_priority_ecc_curve_list +------------------------------ + + -- Function: int gnutls_priority_ecc_curve_list (gnutls_priority_t + PCACHE, const unsigned int ** LIST) + PCACHE: is a 'gnutls_priority_t' type. + + LIST: will point to an integer list + + Get a list of available elliptic curves in the priority structure. + + *Deprecated:* This function has been replaced by + 'gnutls_priority_group_list()' since 3.6.0. + + *Returns:* the number of items, or an error code. + + *Since:* 3.0 + +gnutls_priority_get_cipher_suite_index +-------------------------------------- + + -- Function: int gnutls_priority_get_cipher_suite_index + (gnutls_priority_t PCACHE, unsigned int IDX, unsigned int * + SIDX) + PCACHE: is a 'gnutls_priority_t' type. + + IDX: is an index number. + + SIDX: internal index of cipher suite to get information about. + + Provides the internal ciphersuite index to be used with + 'gnutls_cipher_suite_info()' . The index 'idx' provided is an + index kept at the priorities structure. It might be that a valid + priorities index does not correspond to a ciphersuite and in that + case 'GNUTLS_E_UNKNOWN_CIPHER_SUITE' will be returned. Once the + last available index is crossed then + 'GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE' will be returned. + + *Returns:* On success it returns 'GNUTLS_E_SUCCESS' (0), or a + negative error value otherwise. + + *Since:* 3.0.9 + +gnutls_priority_group_list +-------------------------- + + -- Function: int gnutls_priority_group_list (gnutls_priority_t PCACHE, + const unsigned int ** LIST) + PCACHE: is a 'gnutls_priority_t' type. + + LIST: will point to an integer list + + Get a list of available groups in the priority structure. + + *Returns:* the number of items, or an error code. + + *Since:* 3.6.0 + +gnutls_priority_init +-------------------- + + -- Function: int gnutls_priority_init (gnutls_priority_t * + PRIORITY_CACHE, const char * PRIORITIES, const char ** + ERR_POS) + PRIORITY_CACHE: is a 'gnutls_priority_t' type. + + PRIORITIES: is a string describing priorities (may be 'NULL' ) + + ERR_POS: In case of an error this will have the position in the + string the error occurred + + For applications that do not modify their crypto settings per + release, consider using 'gnutls_priority_init2()' with + 'GNUTLS_PRIORITY_INIT_DEF_APPEND' flag instead. We suggest to use + centralized crypto settings handled by the GnuTLS library, and + applications modifying the default settings to their needs. + + This function is identical to 'gnutls_priority_init2()' with zero + flags. + + A 'NULL' 'priorities' string indicates the default priorities to be + used (this is available since GnuTLS 3.3.0). + + *Returns:* On syntax error 'GNUTLS_E_INVALID_REQUEST' is returned, + 'GNUTLS_E_SUCCESS' on success, or an error code. + +gnutls_priority_init2 +--------------------- + + -- Function: int gnutls_priority_init2 (gnutls_priority_t * + PRIORITY_CACHE, const char * PRIORITIES, const char ** + ERR_POS, unsigned FLAGS) + PRIORITY_CACHE: is a 'gnutls_priority_t' type. + + PRIORITIES: is a string describing priorities (may be 'NULL' ) + + ERR_POS: In case of an error this will have the position in the + string the error occurred + + FLAGS: zero or 'GNUTLS_PRIORITY_INIT_DEF_APPEND' + + Sets priorities for the ciphers, key exchange methods, and macs. + The 'priority_cache' should be deinitialized using + 'gnutls_priority_deinit()' . + + The 'priorities' option allows you to specify a colon separated + list of the cipher priorities to enable. Some keywords are defined + to provide quick access to common preferences. + + When 'flags' is set to 'GNUTLS_PRIORITY_INIT_DEF_APPEND' then the + 'priorities' specified will be appended to the default options. + + Unless there is a special need, use the "NORMAL" keyword to apply a + reasonable security level, or "NORMAL:%COMPAT" for compatibility. + + "PERFORMANCE" means all the "secure" ciphersuites are enabled, + limited to 128 bit ciphers and sorted by terms of speed + performance. + + "LEGACY" the NORMAL settings for GnuTLS 3.2.x or earlier. There is + no verification profile set, and the allowed DH primes are + considered weak today. + + "NORMAL" means all "secure" ciphersuites. The 256-bit ciphers are + included as a fallback only. The ciphers are sorted by security + margin. + + "PFS" means all "secure" ciphersuites that support perfect forward + secrecy. The 256-bit ciphers are included as a fallback only. The + ciphers are sorted by security margin. + + "SECURE128" means all "secure" ciphersuites of security level + 128-bit or more. + + "SECURE192" means all "secure" ciphersuites of security level + 192-bit or more. + + "SUITEB128" means all the NSA SuiteB ciphersuites with security + level of 128. + + "SUITEB192" means all the NSA SuiteB ciphersuites with security + level of 192. + + "NONE" means nothing is enabled. This disables everything, + including protocols. + + "@KEYWORD1,KEYWORD2,..." The system administrator imposed + settings. The provided keyword(s) will be expanded from a + configuration-time provided file - default is: /etc/gnutls/config. + Any attributes that follow it, will be appended to the expanded + string. If multiple keywords are provided, separated by commas, + then the first keyword that exists in the configuration file will + be used. At least one of the keywords must exist, or this function + will return an error. Typical usage would be to specify an + application specified keyword first, followed by "SYSTEM" as a + default fallback. e.g., " 'LIBVIRT' ,SYSTEM:!-VERS-SSL3.0" will + first try to find a config file entry matching "LIBVIRT", but if + that does not exist will use the entry for "SYSTEM". If "SYSTEM" + does not exist either, an error will be returned. In all cases, + the SSL3.0 protocol will be disabled. The system priority file + entries should be formatted as "KEYWORD=VALUE", e.g., + "SYSTEM=NORMAL:+ARCFOUR-128". + + Special keywords are "!", "-" and "+". "!" or "-" appended with + an algorithm will remove this algorithm. "+" appended with an + algorithm will add this algorithm. + + Check the GnuTLS manual section "Priority strings" for detailed + information. + + *Examples:* + "NONE:+VERS-TLS-ALL:+MAC-ALL:+RSA:+AES-128-CBC:+SIGN-ALL:+COMP-NULL" + + "NORMAL:+ARCFOUR-128" means normal ciphers plus ARCFOUR-128. + + "SECURE128:-VERS-SSL3.0" means that only secure ciphers are and + enabled, SSL3.0 is disabled. + + "NONE:+VERS-TLS-ALL:+AES-128-CBC:+RSA:+SHA1:+COMP-NULL:+SIGN-RSA-SHA1", + + "NONE:+VERS-TLS-ALL:+AES-128-CBC:+ECDHE-RSA:+SHA1:+COMP-NULL:+SIGN-RSA-SHA1:+CURVE-SECP256R1", + + "SECURE256:+SECURE128", + + Note that "NORMAL:%COMPAT" is the most compatible mode. + + A 'NULL' 'priorities' string indicates the default priorities to be + used (this is available since GnuTLS 3.3.0). + + *Returns:* On syntax error 'GNUTLS_E_INVALID_REQUEST' is returned, + 'GNUTLS_E_SUCCESS' on success, or an error code. + + *Since:* 3.6.3 + +gnutls_priority_kx_list +----------------------- + + -- Function: int gnutls_priority_kx_list (gnutls_priority_t PCACHE, + const unsigned int ** LIST) + PCACHE: is a 'gnutls_priority_t' type. + + LIST: will point to an integer list + + Get a list of available key exchange methods in the priority + structure. + + *Returns:* the number of items, or an error code. + + *Since:* 3.2.3 + +gnutls_priority_mac_list +------------------------ + + -- Function: int gnutls_priority_mac_list (gnutls_priority_t PCACHE, + const unsigned int ** LIST) + PCACHE: is a 'gnutls_priority_t' type. + + LIST: will point to an integer list + + Get a list of available MAC algorithms in the priority structure. + + *Returns:* the number of items, or an error code. + + *Since:* 3.2.3 + +gnutls_priority_protocol_list +----------------------------- + + -- Function: int gnutls_priority_protocol_list (gnutls_priority_t + PCACHE, const unsigned int ** LIST) + PCACHE: is a 'gnutls_priority_t' type. + + LIST: will point to an integer list + + Get a list of available TLS version numbers in the priority + structure. + + *Returns:* the number of protocols, or an error code. + + *Since:* 3.0 + +gnutls_priority_set +------------------- + + -- Function: int gnutls_priority_set (gnutls_session_t SESSION, + gnutls_priority_t PRIORITY) + SESSION: is a 'gnutls_session_t' type. + + PRIORITY: is a 'gnutls_priority_t' type. + + Sets the priorities to use on the ciphers, key exchange methods, + and macs. Note that this function is expected to be called once + per session; when called multiple times (e.g., before a + re-handshake, the caller should make sure that any new settings are + not incompatible with the original session). + + *Returns:* 'GNUTLS_E_SUCCESS' on success, or an error code on + error. + +gnutls_priority_set_direct +-------------------------- + + -- Function: int gnutls_priority_set_direct (gnutls_session_t SESSION, + const char * PRIORITIES, const char ** ERR_POS) + SESSION: is a 'gnutls_session_t' type. + + PRIORITIES: is a string describing priorities + + ERR_POS: In case of an error this will have the position in the + string the error occurred + + Sets the priorities to use on the ciphers, key exchange methods, + and macs. This function avoids keeping a priority cache and is + used to directly set string priorities to a TLS session. For + documentation check the 'gnutls_priority_init()' . + + To use a reasonable default, consider using + 'gnutls_set_default_priority()' , or + 'gnutls_set_default_priority_append()' instead of this function. + + *Returns:* On syntax error 'GNUTLS_E_INVALID_REQUEST' is returned, + 'GNUTLS_E_SUCCESS' on success, or an error code. + +gnutls_priority_sign_list +------------------------- + + -- Function: int gnutls_priority_sign_list (gnutls_priority_t PCACHE, + const unsigned int ** LIST) + PCACHE: is a 'gnutls_priority_t' type. + + LIST: will point to an integer list + + Get a list of available signature algorithms in the priority + structure. + + *Returns:* the number of algorithms, or an error code. + + *Since:* 3.0 + +gnutls_priority_string_list +--------------------------- + + -- Function: const char * gnutls_priority_string_list (unsigned ITER, + unsigned int FLAGS) + ITER: an integer counter starting from zero + + FLAGS: one of 'GNUTLS_PRIORITY_LIST_INIT_KEYWORDS' , + 'GNUTLS_PRIORITY_LIST_SPECIAL' + + Can be used to iterate all available priority strings. Due to + internal implementation details, there are cases where this + function can return the empty string. In that case that string + should be ignored. When no strings are available it returns 'NULL' + . + + *Returns:* a priority string + + *Since:* 3.4.0 + +gnutls_protocol_get_id +---------------------- + + -- Function: gnutls_protocol_t gnutls_protocol_get_id (const char * + NAME) + NAME: is a protocol name + + The names are compared in a case insensitive way. + + *Returns:* an id of the specified protocol, or + 'GNUTLS_VERSION_UNKNOWN' on error. + +gnutls_protocol_get_name +------------------------ + + -- Function: const char * gnutls_protocol_get_name (gnutls_protocol_t + VERSION) + VERSION: is a (gnutls) version number + + Convert a 'gnutls_protocol_t' value to a string. + + *Returns:* a string that contains the name of the specified TLS + version (e.g., "TLS1.0"), or 'NULL' . + +gnutls_protocol_get_version +--------------------------- + + -- Function: gnutls_protocol_t gnutls_protocol_get_version + (gnutls_session_t SESSION) + SESSION: is a 'gnutls_session_t' type. + + Get TLS version, a 'gnutls_protocol_t' value. + + *Returns:* The version of the currently used protocol. + +gnutls_protocol_list +-------------------- + + -- Function: const gnutls_protocol_t * gnutls_protocol_list ( VOID) + + Get a list of supported protocols, e.g. SSL 3.0, TLS 1.0 etc. + + This function is not thread safe. + + *Returns:* a (0)-terminated list of 'gnutls_protocol_t' integers + indicating the available protocols. + +gnutls_protocol_set_enabled +--------------------------- + + -- Function: int gnutls_protocol_set_enabled (gnutls_protocol_t + VERSION, unsigned int ENABLED) + VERSION: is a (gnutls) version number + + ENABLED: whether to enable the protocol + + Control the previous system-wide setting that marked 'version' as + enabled or disabled. Calling this fuction is allowed only if + allowlisting mode is set in the configuration file, and only if the + system-wide TLS priority string has not been initialized yet. The + intended usage is to provide applications with a way to expressly + deviate from the distribution or site defaults inherited from the + configuration file. The modification is composable with further + modifications performed through the priority string mechanism. + + This function is not thread-safe and is intended to be called in + the main thread at the beginning of the process execution. + + *Returns:* 0 on success or negative error code otherwise. + + *Since:* 3.7.3 + +gnutls_psk_allocate_client_credentials +-------------------------------------- + + -- Function: int gnutls_psk_allocate_client_credentials + (gnutls_psk_client_credentials_t * SC) + SC: is a pointer to a 'gnutls_psk_server_credentials_t' type. + + Allocate a gnutls_psk_client_credentials_t structure. + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, + otherwise an error code is returned. + +gnutls_psk_allocate_server_credentials +-------------------------------------- + + -- Function: int gnutls_psk_allocate_server_credentials + (gnutls_psk_server_credentials_t * SC) + SC: is a pointer to a 'gnutls_psk_server_credentials_t' type. + + Allocate a gnutls_psk_server_credentials_t structure. + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, + otherwise an error code is returned. + +gnutls_psk_client_get_hint +-------------------------- + + -- Function: const char * gnutls_psk_client_get_hint (gnutls_session_t + SESSION) + SESSION: is a gnutls session + + The PSK identity hint may give the client help in deciding which + username to use. This should only be called in case of PSK + authentication and in case of a client. + + *Note:* there is no hint in TLS 1.3, so this function will return + 'NULL' if TLS 1.3 has been negotiated. + + *Returns:* the identity hint of the peer, or 'NULL' in case of an + error or if TLS 1.3 is being used. + + *Since:* 2.4.0 + +gnutls_psk_free_client_credentials +---------------------------------- + + -- Function: void gnutls_psk_free_client_credentials + (gnutls_psk_client_credentials_t SC) + SC: is a 'gnutls_psk_client_credentials_t' type. + + Free a gnutls_psk_client_credentials_t structure. + +gnutls_psk_free_server_credentials +---------------------------------- + + -- Function: void gnutls_psk_free_server_credentials + (gnutls_psk_server_credentials_t SC) + SC: is a 'gnutls_psk_server_credentials_t' type. + + Free a gnutls_psk_server_credentials_t structure. + +gnutls_psk_server_get_username +------------------------------ + + -- Function: const char * gnutls_psk_server_get_username + (gnutls_session_t SESSION) + SESSION: is a gnutls session + + This should only be called in case of PSK authentication and in + case of a server. + + The returned pointer should be considered constant (do not free) + and valid for the lifetime of the session. + + This function will return 'NULL' if the username has embedded NULL + bytes. In that case, 'gnutls_psk_server_get_username2()' should be + used to retrieve the username. + + *Returns:* the username of the peer, or 'NULL' in case of an error, + or if the username has embedded NULLs. + +gnutls_psk_server_get_username2 +------------------------------- + + -- Function: int gnutls_psk_server_get_username2 (gnutls_session_t + SESSION, gnutls_datum_t * USERNAME) + SESSION: is a gnutls session + + USERNAME: a datum that will be filled in by this function + + Return a pointer to the username of the peer in the supplied datum. + Does not need to be null-terminated. + + This should only be called in case of PSK authentication and in + case of a server. + + The returned pointer should be considered constant (do not free) + and valid for the lifetime of the session. + + *Returns:* 'GNUTLS_E_SUCCESS' , or a negative value in case of an + error. + +gnutls_psk_set_client_credentials +--------------------------------- + + -- Function: int gnutls_psk_set_client_credentials + (gnutls_psk_client_credentials_t RES, const char * USERNAME, + const gnutls_datum_t * KEY, gnutls_psk_key_flags FLAGS) + RES: is a 'gnutls_psk_client_credentials_t' type. + + USERNAME: is the user's zero-terminated userid + + KEY: is the user's key + + FLAGS: indicate the format of the key, either 'GNUTLS_PSK_KEY_RAW' + or 'GNUTLS_PSK_KEY_HEX' . + + This function sets the username and password, in a + gnutls_psk_client_credentials_t type. Those will be used in PSK + authentication. 'username' should be an ASCII string or UTF-8 + string. In case of a UTF-8 string it is recommended to be + following the PRECIS framework for usernames (rfc8265). The key + can be either in raw byte format or in Hex format (without the 0x + prefix). + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, + otherwise an error code is returned. + +gnutls_psk_set_client_credentials2 +---------------------------------- + + -- Function: int gnutls_psk_set_client_credentials2 + (gnutls_psk_client_credentials_t RES, const gnutls_datum_t * + USERNAME, const gnutls_datum_t * KEY, gnutls_psk_key_flags + FLAGS) + RES: is a 'gnutls_psk_client_credentials_t' type. + + USERNAME: is the userid + + KEY: is the user's key + + FLAGS: indicate the format of the key, either 'GNUTLS_PSK_KEY_RAW' + or 'GNUTLS_PSK_KEY_HEX' . + + This function is identical to 'gnutls_psk_set_client_credentials()' + , except that it allows a non-null-terminated username to be + introduced. + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, + otherwise an error code is returned. + +gnutls_psk_set_client_credentials_function +------------------------------------------ + + -- Function: void gnutls_psk_set_client_credentials_function + (gnutls_psk_client_credentials_t CRED, + gnutls_psk_client_credentials_function * FUNC) + CRED: is a 'gnutls_psk_server_credentials_t' type. + + FUNC: is the callback function + + This function can be used to set a callback to retrieve the + username and password for client PSK authentication. The + callback's function form is: int (*callback)(gnutls_session_t, + char** username, gnutls_datum_t* key); + + The 'username' and 'key' ->data must be allocated using + 'gnutls_malloc()' . The 'username' should be an ASCII string or + UTF-8 string. In case of a UTF-8 string it is recommended to be + following the PRECIS framework for usernames (rfc8265). + + The callback function will be called once per handshake. + + The callback function should return 0 on success. -1 indicates an + error. + +gnutls_psk_set_client_credentials_function2 +------------------------------------------- + + -- Function: void gnutls_psk_set_client_credentials_function2 + (gnutls_psk_client_credentials_t CRED, + gnutls_psk_client_credentials_function2 * FUNC) + CRED: is a 'gnutls_psk_server_credentials_t' type. + + FUNC: is the callback function + + This function can be used to set a callback to retrieve the + username and password for client PSK authentication. The + callback's function form is: int (*callback)(gnutls_session_t, + gnutls_datum_t* username, gnutls_datum_t* key); + + This callback function has the same semantics as that of + 'gnutls_psk_set_client_credentials_function()' , but it allows + non-string usernames to be used. + + The 'username' and 'key' ->data must be allocated using + 'gnutls_malloc()' . The 'username' should be an ASCII string or + UTF-8 string. In case of a UTF-8 string it is recommended to be + following the PRECIS framework for usernames (rfc8265). + + The callback function will be called once per handshake. + + The callback function should return 0 on success. -1 indicates an + error. + +gnutls_psk_set_params_function +------------------------------ + + -- Function: void gnutls_psk_set_params_function + (gnutls_psk_server_credentials_t RES, gnutls_params_function * + FUNC) + RES: is a gnutls_psk_server_credentials_t type + + FUNC: is the function to be called + + This function will set a callback in order for the server to get + the Diffie-Hellman or RSA parameters for PSK authentication. The + callback should return 'GNUTLS_E_SUCCESS' (0) on success. + + *Deprecated:* This function is unnecessary and discouraged on + GnuTLS 3.6.0 or later. Since 3.6.0, DH parameters are negotiated + following RFC7919. + +gnutls_psk_set_server_credentials_file +-------------------------------------- + + -- Function: int gnutls_psk_set_server_credentials_file + (gnutls_psk_server_credentials_t RES, const char * + PASSWORD_FILE) + RES: is a 'gnutls_psk_server_credentials_t' type. + + PASSWORD_FILE: is the PSK password file (passwd.psk) + + This function sets the password file, in a + 'gnutls_psk_server_credentials_t' type. This password file holds + usernames and keys and will be used for PSK authentication. + + Each entry in the file consists of a username, followed by a colon + (':') and a hex-encoded key. If the username contains a colon or + any other special character, it can be hex-encoded preceded by a + '#'. + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, + otherwise an error code is returned. + +gnutls_psk_set_server_credentials_function +------------------------------------------ + + -- Function: void gnutls_psk_set_server_credentials_function + (gnutls_psk_server_credentials_t CRED, + gnutls_psk_server_credentials_function * FUNC) + CRED: is a 'gnutls_psk_server_credentials_t' type. + + FUNC: is the callback function + + This function can be used to set a callback to retrieve the user's + PSK credentials. The callback's function form is: int + (*callback)(gnutls_session_t, const char* username, gnutls_datum_t* + key); + + 'username' contains the actual username. The 'key' must be filled + in using the 'gnutls_malloc()' . + + In case the callback returned a negative number then gnutls will + assume that the username does not exist. + + The callback function will only be called once per handshake. The + callback function should return 0 on success, while -1 indicates an + error. + +gnutls_psk_set_server_credentials_function2 +------------------------------------------- + + -- Function: void gnutls_psk_set_server_credentials_function2 + (gnutls_psk_server_credentials_t CRED, + gnutls_psk_server_credentials_function2 FUNC) + CRED: is a 'gnutls_psk_server_credentials_t' type. + + FUNC: is the callback function + + This function can be used to set a callback to retrieve the user's + PSK credentials. The callback's function form is: int + (*callback)(gnutls_session_t, const gnutls_datum_t* username, + gnutls_datum_t* key); + + This callback function has the same semantics as that of + 'gnutls_psk_set_server_credentials_function()' , but it allows + non-string usernames to be used. + + 'username' contains the actual username. The 'key' must be filled + in using the 'gnutls_malloc()' . + + In case the callback returned a negative number then gnutls will + assume that the username does not exist. + + The callback function will only be called once per handshake. The + callback function should return 0 on success, while -1 indicates an + error. + +gnutls_psk_set_server_credentials_hint +-------------------------------------- + + -- Function: int gnutls_psk_set_server_credentials_hint + (gnutls_psk_server_credentials_t RES, const char * HINT) + RES: is a 'gnutls_psk_server_credentials_t' type. + + HINT: is the PSK identity hint string + + This function sets the identity hint, in a + 'gnutls_psk_server_credentials_t' type. This hint is sent to the + client to help it chose a good PSK credential (i.e., username and + password). + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, + otherwise an error code is returned. + + *Since:* 2.4.0 + +gnutls_psk_set_server_dh_params +------------------------------- + + -- Function: void gnutls_psk_set_server_dh_params + (gnutls_psk_server_credentials_t RES, gnutls_dh_params_t + DH_PARAMS) + RES: is a gnutls_psk_server_credentials_t type + + DH_PARAMS: is a structure that holds Diffie-Hellman parameters. + + This function will set the Diffie-Hellman parameters for an + anonymous server to use. These parameters will be used in + Diffie-Hellman exchange with PSK cipher suites. + + *Deprecated:* This function is unnecessary and discouraged on + GnuTLS 3.6.0 or later. Since 3.6.0, DH parameters are negotiated + following RFC7919. + +gnutls_psk_set_server_known_dh_params +------------------------------------- + + -- Function: int gnutls_psk_set_server_known_dh_params + (gnutls_psk_server_credentials_t RES, gnutls_sec_param_t + SEC_PARAM) + RES: is a gnutls_psk_server_credentials_t type + + SEC_PARAM: is an option of the 'gnutls_sec_param_t' enumeration + + This function will set the Diffie-Hellman parameters for a PSK + server to use. These parameters will be used in Ephemeral + Diffie-Hellman cipher suites and will be selected from the FFDHE + set of RFC7919 according to the security level provided. + + *Deprecated:* This function is unnecessary and discouraged on + GnuTLS 3.6.0 or later. Since 3.6.0, DH parameters are negotiated + following RFC7919. + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, + otherwise a negative error value. + + *Since:* 3.5.6 + +gnutls_psk_set_server_params_function +------------------------------------- + + -- Function: void gnutls_psk_set_server_params_function + (gnutls_psk_server_credentials_t RES, gnutls_params_function * + FUNC) + RES: is a 'gnutls_certificate_credentials_t' type + + FUNC: is the function to be called + + This function will set a callback in order for the server to get + the Diffie-Hellman parameters for PSK authentication. The callback + should return 'GNUTLS_E_SUCCESS' (0) on success. + + *Deprecated:* This function is unnecessary and discouraged on + GnuTLS 3.6.0 or later. Since 3.6.0, DH parameters are negotiated + following RFC7919. + +gnutls_random_art +----------------- + + -- Function: int gnutls_random_art (gnutls_random_art_t TYPE, const + char * KEY_TYPE, unsigned int KEY_SIZE, void * FPR, size_t + FPR_SIZE, gnutls_datum_t * ART) + TYPE: The type of the random art (for now only + 'GNUTLS_RANDOM_ART_OPENSSH' is supported) + + KEY_TYPE: The type of the key (RSA, DSA etc.) + + KEY_SIZE: The size of the key in bits + + FPR: The fingerprint of the key + + FPR_SIZE: The size of the fingerprint + + ART: The returned random art + + This function will convert a given fingerprint to an "artistic" + image. The returned image is allocated using 'gnutls_malloc()' , + is null-terminated but art->size will not account the terminating + null. + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, + otherwise an error code is returned. + +gnutls_range_split +------------------ + + -- Function: int gnutls_range_split (gnutls_session_t SESSION, const + gnutls_range_st * ORIG, gnutls_range_st * NEXT, + gnutls_range_st * REMAINDER) + SESSION: is a 'gnutls_session_t' type + + ORIG: is the original range provided by the user + + NEXT: is the returned range that can be conveyed in a TLS record + + REMAINDER: is the returned remaining range + + This function should be used when it is required to hide the length + of very long data that cannot be directly provided to + 'gnutls_record_send_range()' . In that case this function should + be called with the desired length hiding range in 'orig' . The + returned 'next' value should then be used in the next call to + 'gnutls_record_send_range()' with the partial data. That process + should be repeated until 'remainder' is (0,0). + + *Returns:* 0 in case splitting succeeds, non zero in case of error. + Note that 'orig' is not changed, while the values of 'next' and + 'remainder' are modified to store the resulting values. + +gnutls_reauth +------------- + + -- Function: int gnutls_reauth (gnutls_session_t SESSION, unsigned int + FLAGS) + SESSION: is a 'gnutls_session_t' type. + + FLAGS: must be zero + + This function performs the post-handshake authentication for TLS + 1.3. The post-handshake authentication is initiated by the server + by calling this function. Clients respond when + 'GNUTLS_E_REAUTH_REQUEST' has been seen while receiving data. + + The non-fatal errors expected by this function are: + 'GNUTLS_E_INTERRUPTED' , 'GNUTLS_E_AGAIN' , as well as + 'GNUTLS_E_GOT_APPLICATION_DATA' when called on server side. + + The former two interrupt the authentication procedure due to the + transport layer being interrupted, and the latter because there + were pending data prior to peer initiating the re-authentication. + The server should read/process that data as unauthenticated and + retry calling 'gnutls_reauth()' . + + When this function is called under TLS1.2 or earlier or the peer + didn't advertise post-handshake auth, it always fails with + 'GNUTLS_E_INVALID_REQUEST' . The verification of the received + peers certificate is delegated to the session or credentials + verification callbacks. A server can check whether post handshake + authentication is supported by the client by checking the session + flags with 'gnutls_session_get_flags()' . + + Prior to calling this function in server side, the function + 'gnutls_certificate_server_set_request()' must be called setting + expectations for the received certificate (request or require). If + none are set this function will return with + 'GNUTLS_E_INVALID_REQUEST' . + + Note that post handshake authentication is available irrespective + of the initial negotiation type (PSK or certificate). In all cases + however, certificate credentials must be set to the session prior + to calling this function. + + *Returns:* 'GNUTLS_E_SUCCESS' on a successful authentication, + otherwise a negative error code. + +gnutls_record_can_use_length_hiding +----------------------------------- + + -- Function: unsigned gnutls_record_can_use_length_hiding + (gnutls_session_t SESSION) + SESSION: is a 'gnutls_session_t' type. + + If the session supports length-hiding padding, you can invoke + 'gnutls_record_send_range()' to send a message whose length is + hidden in the given range. If the session does not support length + hiding padding, you can use the standard 'gnutls_record_send()' + function, or 'gnutls_record_send_range()' making sure that the + range is the same as the length of the message you are trying to + send. + + *Returns:* true (1) if the current session supports length-hiding + padding, false (0) if the current session does not. + +gnutls_record_check_corked +-------------------------- + + -- Function: size_t gnutls_record_check_corked (gnutls_session_t + SESSION) + SESSION: is a 'gnutls_session_t' type. + + This function checks if there pending corked data in the gnutls + buffers -see 'gnutls_record_cork()' . + + *Returns:* Returns the size of the corked data or zero. + + *Since:* 3.2.8 + +gnutls_record_check_pending +--------------------------- + + -- Function: size_t gnutls_record_check_pending (gnutls_session_t + SESSION) + SESSION: is a 'gnutls_session_t' type. + + This function checks if there are unread data in the gnutls + buffers. If the return value is non-zero the next call to + 'gnutls_record_recv()' is guaranteed not to block. + + *Returns:* Returns the size of the data or zero. + +gnutls_record_cork +------------------ + + -- Function: void gnutls_record_cork (gnutls_session_t SESSION) + SESSION: is a 'gnutls_session_t' type. + + If called, 'gnutls_record_send()' will no longer send any records. + Any sent records will be cached until 'gnutls_record_uncork()' is + called. + + This function is safe to use with DTLS after GnuTLS 3.3.0. + + *Since:* 3.1.9 + +gnutls_record_disable_padding +----------------------------- + + -- Function: void gnutls_record_disable_padding (gnutls_session_t + SESSION) + SESSION: is a 'gnutls_session_t' type. + + Used to disabled padding in TLS 1.0 and above. Normally you do not + need to use this function, but there are buggy clients that + complain if a server pads the encrypted data. This of course will + disable protection against statistical attacks on the data. + + This function is defunct since 3.1.7. Random padding is disabled + by default unless requested using 'gnutls_record_send_range()' . + +gnutls_record_discard_queued +---------------------------- + + -- Function: size_t gnutls_record_discard_queued (gnutls_session_t + SESSION) + SESSION: is a 'gnutls_session_t' type. + + This function discards all queued to be sent packets in a DTLS + session. These are the packets queued after an interrupted + 'gnutls_record_send()' . + + This function can only be used with transports where 'send()' is an + all-or-nothing operation (e.g., UDP). When partial writes are + allowed this function will cause session errors. + + *Returns:* The number of bytes discarded. + + *Since:* 3.4.0 + +gnutls_record_get_direction +--------------------------- + + -- Function: int gnutls_record_get_direction (gnutls_session_t SESSION) + SESSION: is a 'gnutls_session_t' type. + + This function is useful to determine whether a GnuTLS function was + interrupted while sending or receiving, so that 'select()' or + 'poll()' may be called appropriately. + + It provides information about the internals of the record protocol + and is only useful if a prior gnutls function call, e.g. + 'gnutls_handshake()' , was interrupted and returned + 'GNUTLS_E_INTERRUPTED' or 'GNUTLS_E_AGAIN' . After such an + interrupt applications may call 'select()' or 'poll()' before + restoring the interrupted GnuTLS function. + + This function's output is unreliable if you are using the same + 'session' in different threads for sending and receiving. + + *Returns:* 0 if interrupted while trying to read data, or 1 while + trying to write data. + +gnutls_record_get_max_early_data_size +------------------------------------- + + -- Function: size_t gnutls_record_get_max_early_data_size + (gnutls_session_t SESSION) + SESSION: is a 'gnutls_session_t' type. + + This function returns the maximum early data size in this + connection. This property can only be set to servers. The client + may be provided with the maximum allowed size through the + "early_data" extension of the NewSessionTicket handshake message. + + *Returns:* The maximum early data size in this connection. + + *Since:* 3.6.5 + +gnutls_record_get_max_size +-------------------------- + + -- Function: size_t gnutls_record_get_max_size (gnutls_session_t + SESSION) + SESSION: is a 'gnutls_session_t' type. + + Get the record size. The maximum record size is negotiated by the + client after the first handshake message. + + *Returns:* The maximum record packet size in this connection. + +gnutls_record_get_state +----------------------- + + -- Function: int gnutls_record_get_state (gnutls_session_t SESSION, + unsigned READ, gnutls_datum_t * MAC_KEY, gnutls_datum_t * IV, + gnutls_datum_t * CIPHER_KEY, unsigned char [8] SEQ_NUMBER) + SESSION: is a 'gnutls_session_t' type + + READ: if non-zero the read parameters are returned, otherwise the + write + + MAC_KEY: the key used for MAC (if a MAC is used) + + IV: the initialization vector or nonce used + + CIPHER_KEY: the cipher key + + SEQ_NUMBER: A 64-bit sequence number + + This function will return the parameters of the current record + state. These are only useful to be provided to an external + off-loading device or subsystem. The returned values should be + considered constant and valid for the lifetime of the session. + + In that case, to sync the state back you must call + 'gnutls_record_set_state()' . + + *Returns:* 'GNUTLS_E_SUCCESS' on success, or an error code. + + Since 3.4.0 + +gnutls_record_overhead_size +--------------------------- + + -- Function: size_t gnutls_record_overhead_size (gnutls_session_t + SESSION) + SESSION: is 'gnutls_session_t' + + This function will return the size in bytes of the overhead due to + TLS (or DTLS) per record. On certain occasions (e.g., CBC ciphers) + the returned value is the maximum possible overhead. + + *Since:* 3.2.2 + +gnutls_record_recv +------------------ + + -- Function: ssize_t gnutls_record_recv (gnutls_session_t SESSION, void + * DATA, size_t DATA_SIZE) + SESSION: is a 'gnutls_session_t' type. + + DATA: the buffer that the data will be read into + + DATA_SIZE: the number of requested bytes + + This function has the similar semantics with 'recv()' . The only + difference is that it accepts a GnuTLS session, and uses different + error codes. In the special case that the peer requests a + renegotiation, the caller will receive an error code of + 'GNUTLS_E_REHANDSHAKE' . In case of a client, this message may be + simply ignored, replied with an alert 'GNUTLS_A_NO_RENEGOTIATION' , + or replied with a new handshake, depending on the client's will. A + server receiving this error code can only initiate a new handshake + or terminate the session. + + If 'EINTR' is returned by the internal pull function (the default + is 'recv()' ) then 'GNUTLS_E_INTERRUPTED' will be returned. If + 'GNUTLS_E_INTERRUPTED' or 'GNUTLS_E_AGAIN' is returned, you must + call this function again to get the data. See also + 'gnutls_record_get_direction()' . + + *Returns:* The number of bytes received and zero on EOF (for stream + connections). A negative error code is returned in case of an + error. The number of bytes received might be less than the + requested 'data_size' . + +gnutls_record_recv_early_data +----------------------------- + + -- Function: ssize_t gnutls_record_recv_early_data (gnutls_session_t + SESSION, void * DATA, size_t DATA_SIZE) + SESSION: is a 'gnutls_session_t' type. + + DATA: the buffer that the data will be read into + + DATA_SIZE: the number of requested bytes + + This function can be used by a server to retrieve data sent early + in the handshake processes when resuming a session. This is used + to implement a zero-roundtrip (0-RTT) mode. It has the same + semantics as 'gnutls_record_recv()' . + + This function can be called either in a handshake hook, or after + the handshake is complete. + + *Returns:* The number of bytes received and zero when early data + reading is complete. A negative error code is returned in case of + an error. If no early data is received during the handshake, this + function returns 'GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE' . The + number of bytes received might be less than the requested + 'data_size' . + + *Since:* 3.6.5 + +gnutls_record_recv_packet +------------------------- + + -- Function: ssize_t gnutls_record_recv_packet (gnutls_session_t + SESSION, gnutls_packet_t * PACKET) + SESSION: is a 'gnutls_session_t' type. + + PACKET: the structure that will hold the packet data + + This is a lower-level function than 'gnutls_record_recv()' and + allows to directly receive the whole decrypted packet. That avoids + a memory copy, and is intended to be used by applications seeking + high performance. + + The received packet is accessed using 'gnutls_packet_get()' and + must be deinitialized using 'gnutls_packet_deinit()' . The + returned packet will be 'NULL' if the return value is zero (EOF). + + *Returns:* The number of bytes received and zero on EOF (for stream + connections). A negative error code is returned in case of an + error. + + *Since:* 3.3.5 + +gnutls_record_recv_seq +---------------------- + + -- Function: ssize_t gnutls_record_recv_seq (gnutls_session_t SESSION, + void * DATA, size_t DATA_SIZE, unsigned char * SEQ) + SESSION: is a 'gnutls_session_t' type. + + DATA: the buffer that the data will be read into + + DATA_SIZE: the number of requested bytes + + SEQ: is the packet's 64-bit sequence number. Should have space for + 8 bytes. + + This function is the same as 'gnutls_record_recv()' , except that + it returns in addition to data, the sequence number of the data. + This is useful in DTLS where record packets might be received + out-of-order. The returned 8-byte sequence number is an integer in + big-endian format and should be treated as a unique message + identification. + + *Returns:* The number of bytes received and zero on EOF. A negative + error code is returned in case of an error. The number of bytes + received might be less than 'data_size' . + + *Since:* 3.0 + +gnutls_record_send +------------------ + + -- Function: ssize_t gnutls_record_send (gnutls_session_t SESSION, + const void * DATA, size_t DATA_SIZE) + SESSION: is a 'gnutls_session_t' type. + + DATA: contains the data to send + + DATA_SIZE: is the length of the data + + This function has the similar semantics with 'send()' . The only + difference is that it accepts a GnuTLS session, and uses different + error codes. Note that if the send buffer is full, 'send()' will + block this function. See the 'send()' documentation for more + information. + + You can replace the default push function which is 'send()' , by + using 'gnutls_transport_set_push_function()' . + + If the EINTR is returned by the internal push function then + 'GNUTLS_E_INTERRUPTED' will be returned. If 'GNUTLS_E_INTERRUPTED' + or 'GNUTLS_E_AGAIN' is returned, you must call this function again + with the exact same parameters, or provide a 'NULL' pointer for + 'data' and 0 for 'data_size' , in order to write the same data as + before. If you wish to discard the previous data instead of + retrying, you must call 'gnutls_record_discard_queued()' before + calling this function with different parameters. Note that the + latter works only on special transports (e.g., UDP). cf. + 'gnutls_record_get_direction()' . + + Note that in DTLS this function will return the + 'GNUTLS_E_LARGE_PACKET' error code if the send data exceed the data + MTU value - as returned by 'gnutls_dtls_get_data_mtu()' . The + errno value EMSGSIZE also maps to 'GNUTLS_E_LARGE_PACKET' . Note + that since 3.2.13 this function can be called under cork in DTLS + mode, and will refuse to send data over the MTU size by returning + 'GNUTLS_E_LARGE_PACKET' . + + *Returns:* The number of bytes sent, or a negative error code. The + number of bytes sent might be less than 'data_size' . The maximum + number of bytes this function can send in a single call depends on + the negotiated maximum record size. + +gnutls_record_send2 +------------------- + + -- Function: ssize_t gnutls_record_send2 (gnutls_session_t SESSION, + const void * DATA, size_t DATA_SIZE, size_t PAD, unsigned + FLAGS) + SESSION: is a 'gnutls_session_t' type. + + DATA: contains the data to send + + DATA_SIZE: is the length of the data + + PAD: padding to be added to the record + + FLAGS: must be zero + + This function is identical to 'gnutls_record_send()' except that it + takes an extra argument to specify padding to be added the record. + To determine the maximum size of padding, use + 'gnutls_record_get_max_size()' and 'gnutls_record_overhead_size()' + . + + Note that in order for GnuTLS to provide constant time processing + of padding and data in TLS1.3, the flag 'GNUTLS_SAFE_PADDING_CHECK' + must be used in 'gnutls_init()' . + + *Returns:* The number of bytes sent, or a negative error code. The + number of bytes sent might be less than 'data_size' . The maximum + number of bytes this function can send in a single call depends on + the negotiated maximum record size. + + *Since:* 3.6.3 + +gnutls_record_send_early_data +----------------------------- + + -- Function: ssize_t gnutls_record_send_early_data (gnutls_session_t + SESSION, const void * DATA, size_t DATA_SIZE) + SESSION: is a 'gnutls_session_t' type. + + DATA: contains the data to send + + DATA_SIZE: is the length of the data + + This function can be used by a client to send data early in the + handshake processes when resuming a session. This is used to + implement a zero-roundtrip (0-RTT) mode. It has the same semantics + as 'gnutls_record_send()' . + + There may be a limit to the amount of data sent as early data. Use + 'gnutls_record_get_max_early_data_size()' to check the limit. If + the limit exceeds, this function returns + 'GNUTLS_E_RECORD_LIMIT_REACHED' . + + *Returns:* The number of bytes sent, or a negative error code. The + number of bytes sent might be less than 'data_size' . The maximum + number of bytes this function can send in a single call depends on + the negotiated maximum record size. + + *Since:* 3.6.5 + +gnutls_record_send_file +----------------------- + + -- Function: ssize_t gnutls_record_send_file (gnutls_session_t SESSION, + int FD, off_t * OFFSET, size_t COUNT) + SESSION: is a 'gnutls_session_t' type. + + FD: file descriptor from which to read data. + + OFFSET: Is relative to file offset, denotes the starting location + for reading. after function returns, it point to position + following last read byte. + + COUNT: is the length of the data in bytes to be read from file and + send. + + This function sends data from 'fd' . If KTLS (kernel TLS) is + enabled, it will use the 'sendfile()' system call to avoid overhead + of copying data between user space and the kernel. Otherwise, this + functionality is merely emulated by calling 'read()' and + 'gnutls_record_send()' . If this implementation is suboptimal, + check whether KTLS is enabled using + 'gnutls_transport_is_ktls_enabled()' . + + If 'offset' is NULL then file offset is incremented by number of + bytes send, otherwise file offset remains unchanged. + + *Returns:* The number of bytes sent, or a negative error code. + +gnutls_record_send_range +------------------------ + + -- Function: ssize_t gnutls_record_send_range (gnutls_session_t + SESSION, const void * DATA, size_t DATA_SIZE, const + gnutls_range_st * RANGE) + SESSION: is a 'gnutls_session_t' type. + + DATA: contains the data to send. + + DATA_SIZE: is the length of the data. + + RANGE: is the range of lengths in which the real data length must + be hidden. + + This function operates like 'gnutls_record_send()' but, while + 'gnutls_record_send()' adds minimal padding to each TLS record, + this function uses the TLS extra-padding feature to conceal the + real data size within the range of lengths provided. Some TLS + sessions do not support extra padding (e.g. stream ciphers in + standard TLS or SSL3 sessions). To know whether the current + session supports extra padding, and hence length hiding, use the + 'gnutls_record_can_use_length_hiding()' function. + + *Note:* This function currently is limited to blocking sockets. + + *Returns:* The number of bytes sent (that is data_size in a + successful invocation), or a negative error code. + +gnutls_record_set_max_early_data_size +------------------------------------- + + -- Function: int gnutls_record_set_max_early_data_size + (gnutls_session_t SESSION, size_t SIZE) + SESSION: is a 'gnutls_session_t' type. + + SIZE: is the new size + + This function sets the maximum early data size in this connection. + This property can only be set to servers. The client may be + provided with the maximum allowed size through the "early_data" + extension of the NewSessionTicket handshake message. + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, + otherwise a negative error code is returned. + + *Since:* 3.6.4 + +gnutls_record_set_max_recv_size +------------------------------- + + -- Function: ssize_t gnutls_record_set_max_recv_size (gnutls_session_t + SESSION, size_t SIZE) + SESSION: is a 'gnutls_session_t' type. + + SIZE: is the new size + + This function sets the maximum amount of plaintext received in a + record in this connection. + + The limit is also negotiated through a TLS extension called 'record + size limit'. Note that while the 'record size limit' extension is + preferred, not all TLS implementations use or even understand the + extension. + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, + otherwise a negative error code is returned. + + *Since:* 3.6.8 + +gnutls_record_set_max_size +-------------------------- + + -- Function: ssize_t gnutls_record_set_max_size (gnutls_session_t + SESSION, size_t SIZE) + SESSION: is a 'gnutls_session_t' type. + + SIZE: is the new size + + This function sets the maximum amount of plaintext sent and + received in a record in this connection. + + Prior to 3.6.4, this function was implemented using a TLS extension + called 'max fragment length', which limits the acceptable values to + 512(=2^9), 1024(=2^10), 2048(=2^11) and 4096(=2^12). + + Since 3.6.4, the limit is also negotiated through a new TLS + extension called 'record size limit', which doesn't have the + limitation, as long as the value ranges between 512 and 16384. + Note that while the 'record size limit' extension is preferred, not + all TLS implementations use or even understand the extension. + + *Deprecated:* if the client can assume that the 'record size limit' + extension is supported by the server, we recommend using + 'gnutls_record_set_max_recv_size()' instead. + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, + otherwise a negative error code is returned. + +gnutls_record_set_state +----------------------- + + -- Function: int gnutls_record_set_state (gnutls_session_t SESSION, + unsigned READ, const unsigned char [8] SEQ_NUMBER) + SESSION: is a 'gnutls_session_t' type + + READ: if non-zero the read parameters are returned, otherwise the + write + + SEQ_NUMBER: A 64-bit sequence number + + This function will set the sequence number in the current record + state. This function is useful if sending and receiving are + offloaded from gnutls. That is, if 'gnutls_record_get_state()' was + used. + + *Returns:* 'GNUTLS_E_SUCCESS' on success, or an error code. + + Since 3.4.0 + +gnutls_record_set_timeout +------------------------- + + -- Function: void gnutls_record_set_timeout (gnutls_session_t SESSION, + unsigned int MS) + SESSION: is a 'gnutls_session_t' type. + + MS: is a timeout value in milliseconds + + This function sets the receive timeout for the record layer to the + provided value. Use an 'ms' value of zero to disable timeout (the + default), or 'GNUTLS_INDEFINITE_TIMEOUT' , to set an indefinite + timeout. + + This function requires to set a pull timeout callback. See + 'gnutls_transport_set_pull_timeout_function()' . + + *Since:* 3.1.7 + +gnutls_record_uncork +-------------------- + + -- Function: int gnutls_record_uncork (gnutls_session_t SESSION, + unsigned int FLAGS) + SESSION: is a 'gnutls_session_t' type. + + FLAGS: Could be zero or 'GNUTLS_RECORD_WAIT' + + This resets the effect of 'gnutls_record_cork()' , and flushes any + pending data. If the 'GNUTLS_RECORD_WAIT' flag is specified then + this function will block until the data is sent or a fatal error + occurs (i.e., the function will retry on 'GNUTLS_E_AGAIN' and + 'GNUTLS_E_INTERRUPTED' ). + + If the flag 'GNUTLS_RECORD_WAIT' is not specified and the function + is interrupted then the 'GNUTLS_E_AGAIN' or 'GNUTLS_E_INTERRUPTED' + errors will be returned. To obtain the data left in the corked + buffer use 'gnutls_record_check_corked()' . + + *Returns:* On success the number of transmitted data is returned, + or otherwise a negative error code. + + *Since:* 3.1.9 + +gnutls_rehandshake +------------------ + + -- Function: int gnutls_rehandshake (gnutls_session_t SESSION) + SESSION: is a 'gnutls_session_t' type. + + This function can only be called in server side, and instructs a + TLS 1.2 or earlier client to renegotiate parameters (perform a + handshake), by sending a hello request message. + + If this function succeeds, the calling application should call + 'gnutls_record_recv()' until 'GNUTLS_E_REHANDSHAKE' is returned to + clear any pending data. If the 'GNUTLS_E_REHANDSHAKE' error code + is not seen, then the handshake request was not followed by the + peer (the TLS protocol does not require the client to do, and such + compliance should be handled by the application protocol). + + Once the 'GNUTLS_E_REHANDSHAKE' error code is seen, the calling + application should proceed to calling 'gnutls_handshake()' to + negotiate the new parameters. + + If the client does not wish to renegotiate parameters he may reply + with an alert message, and in that case the return code seen by + subsequent 'gnutls_record_recv()' will be + 'GNUTLS_E_WARNING_ALERT_RECEIVED' with the specific alert being + 'GNUTLS_A_NO_RENEGOTIATION' . A client may also choose to ignore + this request. + + Under TLS 1.3 this function is equivalent to + 'gnutls_session_key_update()' with the 'GNUTLS_KU_PEER' flag. In + that case subsequent calls to 'gnutls_record_recv()' will not + return 'GNUTLS_E_REHANDSHAKE' , and calls to 'gnutls_handshake()' + in server side are a no-op. + + This function always fails with 'GNUTLS_E_INVALID_REQUEST' when + called in client side. + + *Returns:* 'GNUTLS_E_SUCCESS' on success, otherwise a negative + error code. + +gnutls_safe_renegotiation_status +-------------------------------- + + -- Function: unsigned gnutls_safe_renegotiation_status + (gnutls_session_t SESSION) + SESSION: is a 'gnutls_session_t' type. + + Can be used to check whether safe renegotiation is being used in + the current session. + + *Returns:* 0 when safe renegotiation is not used and non (0) when + safe renegotiation is used. + + *Since:* 2.10.0 + +gnutls_sec_param_get_name +------------------------- + + -- Function: const char * gnutls_sec_param_get_name (gnutls_sec_param_t + PARAM) + PARAM: is a security parameter + + Convert a 'gnutls_sec_param_t' value to a string. + + *Returns:* a pointer to a string that contains the name of the + specified security level, or 'NULL' . + + *Since:* 2.12.0 + +gnutls_sec_param_to_pk_bits +--------------------------- + + -- Function: unsigned int gnutls_sec_param_to_pk_bits + (gnutls_pk_algorithm_t ALGO, gnutls_sec_param_t PARAM) + ALGO: is a public key algorithm + + PARAM: is a security parameter + + When generating private and public key pairs a difficult question + is which size of "bits" the modulus will be in RSA and the group + size in DSA. The easy answer is 1024, which is also wrong. This + function will convert a human understandable security parameter to + an appropriate size for the specific algorithm. + + *Returns:* The number of bits, or (0). + + *Since:* 2.12.0 + +gnutls_sec_param_to_symmetric_bits +---------------------------------- + + -- Function: unsigned int gnutls_sec_param_to_symmetric_bits + (gnutls_sec_param_t PARAM) + PARAM: is a security parameter + + This function will return the number of bits that correspond to + symmetric cipher strength for the given security parameter. + + *Returns:* The number of bits, or (0). + + *Since:* 3.3.0 + +gnutls_server_name_get +---------------------- + + -- Function: int gnutls_server_name_get (gnutls_session_t SESSION, void + * DATA, size_t * DATA_LENGTH, unsigned int * TYPE, unsigned + int INDX) + SESSION: is a 'gnutls_session_t' type. + + DATA: will hold the data + + DATA_LENGTH: will hold the data length. Must hold the maximum size + of data. + + TYPE: will hold the server name indicator type + + INDX: is the index of the server_name + + This function will allow you to get the name indication (if any), a + client has sent. The name indication may be any of the enumeration + gnutls_server_name_type_t. + + If 'type' is GNUTLS_NAME_DNS, then this function is to be used by + servers that support virtual hosting, and the data will be a null + terminated IDNA ACE string (prior to GnuTLS 3.4.0 it was a UTF-8 + string). + + If 'data' has not enough size to hold the server name + GNUTLS_E_SHORT_MEMORY_BUFFER is returned, and 'data_length' will + hold the required size. + + 'indx' is used to retrieve more than one server names (if sent by + the client). The first server name has an index of 0, the second 1 + and so on. If no name with the given index exists + GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE is returned. + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, on UTF-8 + decoding error 'GNUTLS_E_IDNA_ERROR' is returned, otherwise a + negative error code is returned. + +gnutls_server_name_set +---------------------- + + -- Function: int gnutls_server_name_set (gnutls_session_t SESSION, + gnutls_server_name_type_t TYPE, const void * NAME, size_t + NAME_LENGTH) + SESSION: is a 'gnutls_session_t' type. + + TYPE: specifies the indicator type + + NAME: is a string that contains the server name. + + NAME_LENGTH: holds the length of name excluding the terminating + null byte + + This function is to be used by clients that want to inform (via a + TLS extension mechanism) the server of the name they connected to. + This should be used by clients that connect to servers that do + virtual hosting. + + The value of 'name' depends on the 'type' type. In case of + 'GNUTLS_NAME_DNS' , a UTF-8 null-terminated domain name string, + without the trailing dot, is expected. + + IPv4 or IPv6 addresses are not permitted to be set by this + function. If the function is called with a name of 'name_length' + zero it will clear all server names set. + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, + otherwise a negative error code is returned. + +gnutls_session_channel_binding +------------------------------ + + -- Function: int gnutls_session_channel_binding (gnutls_session_t + SESSION, gnutls_channel_binding_t CBTYPE, gnutls_datum_t * CB) + SESSION: is a 'gnutls_session_t' type. + + CBTYPE: an 'gnutls_channel_binding_t' enumeration type + + CB: output buffer array with data + + Extract given channel binding data of the 'cbtype' (e.g., + 'GNUTLS_CB_TLS_UNIQUE' ) type. + + *Returns:* 'GNUTLS_E_SUCCESS' on success, + 'GNUTLS_E_UNIMPLEMENTED_FEATURE' if the 'cbtype' is unsupported, + 'GNUTLS_E_CHANNEL_BINDING_NOT_AVAILABLE' if the data is not + currently available, or an error code. + + *Since:* 2.12.0 + +gnutls_session_enable_compatibility_mode +---------------------------------------- + + -- Function: void gnutls_session_enable_compatibility_mode + (gnutls_session_t SESSION) + SESSION: is a 'gnutls_session_t' type. + + This function can be used to disable certain (security) features in + TLS in order to maintain maximum compatibility with buggy clients. + Because several trade-offs with security are enabled, if required + they will be reported through the audit subsystem. + + Normally only servers that require maximum compatibility with + everything out there, need to call this function. + + Note that this function must be called after any call to + gnutls_priority functions. + + *Since:* 2.1.4 + +gnutls_session_etm_status +------------------------- + + -- Function: unsigned gnutls_session_etm_status (gnutls_session_t + SESSION) + SESSION: is a 'gnutls_session_t' type. + + Get the status of the encrypt-then-mac extension negotiation. This + is in accordance to rfc7366 + + *Returns:* Non-zero if the negotiation was successful or zero + otherwise. + +gnutls_session_ext_master_secret_status +--------------------------------------- + + -- Function: unsigned gnutls_session_ext_master_secret_status + (gnutls_session_t SESSION) + SESSION: is a 'gnutls_session_t' type. + + Get the status of the extended master secret extension negotiation. + This is in accordance to RFC7627. That information is also + available to the more generic 'gnutls_session_get_flags()' . + + *Returns:* Non-zero if the negotiation was successful or zero + otherwise. + +gnutls_session_ext_register +--------------------------- + + -- Function: int gnutls_session_ext_register (gnutls_session_t SESSION, + const char * NAME, int ID, gnutls_ext_parse_type_t + PARSE_POINT, gnutls_ext_recv_func RECV_FUNC, + gnutls_ext_send_func SEND_FUNC, gnutls_ext_deinit_data_func + DEINIT_FUNC, gnutls_ext_pack_func PACK_FUNC, + gnutls_ext_unpack_func UNPACK_FUNC, unsigned FLAGS) + SESSION: the session for which this extension will be set + + NAME: the name of the extension to register + + ID: the numeric id of the extension + + PARSE_POINT: the parse type of the extension (see + gnutls_ext_parse_type_t) + + RECV_FUNC: a function to receive the data + + SEND_FUNC: a function to send the data + + DEINIT_FUNC: a function deinitialize any private data + + PACK_FUNC: a function which serializes the extension's private data + (used on session packing for resumption) + + UNPACK_FUNC: a function which will deserialize the extension's + private data + + FLAGS: must be zero or flags from 'gnutls_ext_flags_t' + + This function will register a new extension type. The extension + will be only usable within the registered session. If the + extension type is already registered then + 'GNUTLS_E_ALREADY_REGISTERED' will be returned, unless the flag + 'GNUTLS_EXT_FLAG_OVERRIDE_INTERNAL' is specified. The latter flag + when specified can be used to override certain extensions + introduced after 3.6.0. It is expected to be used by applications + which handle custom extensions that are not currently supported in + GnuTLS, but direct support for them may be added in the future. + + Each registered extension can store temporary data into the + gnutls_session_t structure using 'gnutls_ext_set_data()' , and they + can be retrieved using 'gnutls_ext_get_data()' . + + The validity of the extension registered can be given by the + appropriate flags of 'gnutls_ext_flags_t' . If no validity is + given, then the registered extension will be valid for client and + TLS1.2 server hello (or encrypted extensions for TLS1.3). + + *Returns:* 'GNUTLS_E_SUCCESS' on success, otherwise a negative + error code. + + *Since:* 3.5.5 + +gnutls_session_force_valid +-------------------------- + + -- Function: void gnutls_session_force_valid (gnutls_session_t SESSION) + SESSION: is a 'gnutls_session_t' type. + + Clears the invalid flag in a session. That means that sessions + were corrupt or invalid data were received can be re-used. Use + only when debugging or experimenting with the TLS protocol. Should + not be used in typical applications. + +gnutls_session_get_data +----------------------- + + -- Function: int gnutls_session_get_data (gnutls_session_t SESSION, + void * SESSION_DATA, size_t * SESSION_DATA_SIZE) + SESSION: is a 'gnutls_session_t' type. + + SESSION_DATA: is a pointer to space to hold the session. + + SESSION_DATA_SIZE: is the session_data's size, or it will be set by + the function. + + Returns all session parameters needed to be stored to support + resumption, in a pre-allocated buffer. + + See 'gnutls_session_get_data2()' for more information. + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, + otherwise an error code is returned. + +gnutls_session_get_data2 +------------------------ + + -- Function: int gnutls_session_get_data2 (gnutls_session_t SESSION, + gnutls_datum_t * DATA) + SESSION: is a 'gnutls_session_t' type. + + DATA: is a pointer to a datum that will hold the session. + + Returns necessary parameters to support resumption. The client + should call this function and store the returned session data. A + session can be resumed later by calling 'gnutls_session_set_data()' + with the returned data. Note that under TLS 1.3, it is recommended + for clients to use session parameters only once, to prevent + passive-observers from correlating the different connections. + + The returned 'data' are allocated and must be released using + 'gnutls_free()' . + + This function will fail if called prior to handshake completion. + In case of false start TLS, the handshake completes only after data + have been successfully received from the peer. + + Under TLS1.3 session resumption is possible only after a session + ticket is received by the client. To ensure that such a ticket has + been received use 'gnutls_session_get_flags()' and check for flag + 'GNUTLS_SFLAGS_SESSION_TICKET' ; if this flag is not set, this + function will wait for a new ticket within an estimated roundtrip, + and if not received will return dummy data which cannot lead to + resumption. + + To get notified when new tickets are received by the server use + 'gnutls_handshake_set_hook_function()' to wait for + 'GNUTLS_HANDSHAKE_NEW_SESSION_TICKET' messages. Each call of + 'gnutls_session_get_data2()' after a ticket is received, will + return session resumption data corresponding to the last received + ticket. + + Note that this function under TLS1.3 requires a callback to be set + with 'gnutls_transport_set_pull_timeout_function()' for successful + operation. There was a bug before 3.6.10 which could make this + function fail if that callback was not set. On later versions if + not set, the function will return a successful error code, but will + return dummy data that cannot lead to a resumption. + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, + otherwise an error code is returned. + +gnutls_session_get_desc +----------------------- + + -- Function: char * gnutls_session_get_desc (gnutls_session_t SESSION) + SESSION: is a gnutls session + + This function returns a string describing the current session. The + string is null terminated and allocated using 'gnutls_malloc()' . + + If initial negotiation is not complete when this function is + called, 'NULL' will be returned. + + *Returns:* a description of the protocols and algorithms in the + current session. + + *Since:* 3.1.10 + +gnutls_session_get_flags +------------------------ + + -- Function: unsigned gnutls_session_get_flags (gnutls_session_t + SESSION) + SESSION: is a 'gnutls_session_t' type. + + This function will return a series (ORed) of flags, applicable for + the current session. + + This replaces individual informational functions such as + 'gnutls_safe_renegotiation_status()' , + 'gnutls_session_ext_master_secret_status()' , etc. + + *Returns:* An ORed sequence of flags (see 'gnutls_session_flags_t' + ) + + *Since:* 3.5.0 + +gnutls_session_get_id +--------------------- + + -- Function: int gnutls_session_get_id (gnutls_session_t SESSION, void + * SESSION_ID, size_t * SESSION_ID_SIZE) + SESSION: is a 'gnutls_session_t' type. + + SESSION_ID: is a pointer to space to hold the session id. + + SESSION_ID_SIZE: initially should contain the maximum 'session_id' + size and will be updated. + + Returns the TLS session identifier. The session ID is selected by + the server, and in older versions of TLS was a unique identifier + shared between client and server which was persistent across + resumption. In the latest version of TLS (1.3) or TLS with session + tickets, the notion of session identifiers is undefined and cannot + be relied for uniquely identifying sessions across client and + server. + + In client side this function returns the identifier returned by the + server, and cannot be assumed to have any relation to session + resumption. In server side this function is guaranteed to return a + persistent identifier of the session since GnuTLS 3.6.4, which may + not necessarily map into the TLS session ID value. Prior to that + version the value could only be considered a persistent identifier, + under TLS1.2 or earlier and when no session tickets were in use. + + The session identifier value returned is always less than + 'GNUTLS_MAX_SESSION_ID_SIZE' . + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, + otherwise an error code is returned. + +gnutls_session_get_id2 +---------------------- + + -- Function: int gnutls_session_get_id2 (gnutls_session_t SESSION, + gnutls_datum_t * SESSION_ID) + SESSION: is a 'gnutls_session_t' type. + + SESSION_ID: will point to the session ID. + + Returns the TLS session identifier. The session ID is selected by + the server, and in older versions of TLS was a unique identifier + shared between client and server which was persistent across + resumption. In the latest version of TLS (1.3) or TLS 1.2 with + session tickets, the notion of session identifiers is undefined and + cannot be relied for uniquely identifying sessions across client + and server. + + In client side this function returns the identifier returned by the + server, and cannot be assumed to have any relation to session + resumption. In server side this function is guaranteed to return a + persistent identifier of the session since GnuTLS 3.6.4, which may + not necessarily map into the TLS session ID value. Prior to that + version the value could only be considered a persistent identifier, + under TLS1.2 or earlier and when no session tickets were in use. + + The session identifier value returned is always less than + 'GNUTLS_MAX_SESSION_ID_SIZE' and should be treated as constant. + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, + otherwise an error code is returned. + + *Since:* 3.1.4 + +gnutls_session_get_keylog_function +---------------------------------- + + -- Function: gnutls_keylog_func gnutls_session_get_keylog_function + (const gnutls_session_t SESSION) + SESSION: is 'gnutls_session_t' type + + This function will return the callback function set using + 'gnutls_session_set_keylog_function()' . + + *Returns:* The function set or 'NULL' otherwise. + + *Since:* 3.6.13 + +gnutls_session_get_master_secret +-------------------------------- + + -- Function: void gnutls_session_get_master_secret (gnutls_session_t + SESSION, gnutls_datum_t * SECRET) + SESSION: is a 'gnutls_session_t' type. + + SECRET: the session's master secret + + This function returns pointers to the master secret used in the TLS + session. The pointers are not to be modified or deallocated. + + This function is only applicable under TLS 1.2 or earlier versions. + + *Since:* 3.5.0 + +gnutls_session_get_ptr +---------------------- + + -- Function: void * gnutls_session_get_ptr (gnutls_session_t SESSION) + SESSION: is a 'gnutls_session_t' type. + + Get user pointer for session. Useful in callbacks. This is the + pointer set with 'gnutls_session_set_ptr()' . + + *Returns:* the user given pointer from the session structure, or + 'NULL' if it was never set. + +gnutls_session_get_random +------------------------- + + -- Function: void gnutls_session_get_random (gnutls_session_t SESSION, + gnutls_datum_t * CLIENT, gnutls_datum_t * SERVER) + SESSION: is a 'gnutls_session_t' type. + + CLIENT: the client part of the random + + SERVER: the server part of the random + + This function returns pointers to the client and server random + fields used in the TLS handshake. The pointers are not to be + modified or deallocated. + + If a client random value has not yet been established, the output + will be garbage. + + *Since:* 3.0 + +gnutls_session_get_verify_cert_status +------------------------------------- + + -- Function: unsigned int gnutls_session_get_verify_cert_status + (gnutls_session_t SESSION) + SESSION: is a gnutls session + + This function returns the status of the verification when initiated + via auto-verification, i.e., by 'gnutls_session_set_verify_cert2()' + or 'gnutls_session_set_verify_cert()' . If no certificate + verification was occurred then the return value would be set to + ((unsigned int)-1). + + The certificate verification status is the same as in + 'gnutls_certificate_verify_peers()' . + + *Returns:* the certificate verification status. + + *Since:* 3.4.6 + +gnutls_session_is_resumed +------------------------- + + -- Function: int gnutls_session_is_resumed (gnutls_session_t SESSION) + SESSION: is a 'gnutls_session_t' type. + + Checks whether session is resumed or not. This is functional for + both server and client side. + + *Returns:* non zero if this session is resumed, or a zero if this + is a new session. + +gnutls_session_key_update +------------------------- + + -- Function: int gnutls_session_key_update (gnutls_session_t SESSION, + unsigned FLAGS) + SESSION: is a 'gnutls_session_t' type. + + FLAGS: zero of 'GNUTLS_KU_PEER' + + This function will update/refresh the session keys when the TLS + protocol is 1.3 or better. The peer is notified of the update by + sending a message, so this function should be treated similarly to + 'gnutls_record_send()' -i.e., it may return 'GNUTLS_E_AGAIN' or + 'GNUTLS_E_INTERRUPTED' . + + When this flag 'GNUTLS_KU_PEER' is specified, this function in + addition to updating the local keys, will ask the peer to refresh + its keys too. + + If the negotiated version is not TLS 1.3 or better this function + will return 'GNUTLS_E_INVALID_REQUEST' . + + *Returns:* 'GNUTLS_E_SUCCESS' on success, otherwise a negative + error code. + + *Since:* 3.6.3 + +gnutls_session_resumption_requested +----------------------------------- + + -- Function: int gnutls_session_resumption_requested (gnutls_session_t + SESSION) + SESSION: is a 'gnutls_session_t' type. + + Check whether the client has asked for session resumption. This + function is valid only on server side. + + *Returns:* non zero if session resumption was asked, or a zero if + not. + +gnutls_session_set_data +----------------------- + + -- Function: int gnutls_session_set_data (gnutls_session_t SESSION, + const void * SESSION_DATA, size_t SESSION_DATA_SIZE) + SESSION: is a 'gnutls_session_t' type. + + SESSION_DATA: is a pointer to space to hold the session. + + SESSION_DATA_SIZE: is the session's size + + Sets all session parameters, in order to resume a previously + established session. The session data given must be the one + returned by 'gnutls_session_get_data()' . This function should be + called before 'gnutls_handshake()' . + + Keep in mind that session resuming is advisory. The server may + choose not to resume the session, thus a full handshake will be + performed. + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, + otherwise an error code is returned. + +gnutls_session_set_id +--------------------- + + -- Function: int gnutls_session_set_id (gnutls_session_t SESSION, const + gnutls_datum_t * SID) + SESSION: is a 'gnutls_session_t' type. + + SID: the session identifier + + This function sets the session ID to be used in a client hello. + This is a function intended for exceptional uses. Do not use this + function unless you are implementing a custom protocol. + + To set session resumption parameters use + 'gnutls_session_set_data()' instead. + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, + otherwise an error code is returned. + + *Since:* 3.2.1 + +gnutls_session_set_keylog_function +---------------------------------- + + -- Function: void gnutls_session_set_keylog_function (gnutls_session_t + SESSION, gnutls_keylog_func FUNC) + SESSION: is 'gnutls_session_t' type + + FUNC: is the function to be called + + This function will set a callback to be called when a new secret is + derived and installed during handshake. + + *Since:* 3.6.13 + +gnutls_session_set_premaster +---------------------------- + + -- Function: int gnutls_session_set_premaster (gnutls_session_t + SESSION, unsigned int ENTITY, gnutls_protocol_t VERSION, + gnutls_kx_algorithm_t KX, gnutls_cipher_algorithm_t CIPHER, + gnutls_mac_algorithm_t MAC, gnutls_compression_method_t COMP, + const gnutls_datum_t * MASTER, const gnutls_datum_t * + SESSION_ID) + SESSION: is a 'gnutls_session_t' type. + + ENTITY: GNUTLS_SERVER or GNUTLS_CLIENT + + VERSION: the TLS protocol version + + KX: the key exchange method + + CIPHER: the cipher + + MAC: the MAC algorithm + + COMP: the compression method (ignored) + + MASTER: the master key to use + + SESSION_ID: the session identifier + + This function sets the premaster secret in a session. This is a + function intended for exceptional uses. Do not use this function + unless you are implementing a legacy protocol. Use + 'gnutls_session_set_data()' instead. + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, + otherwise an error code is returned. + +gnutls_session_set_ptr +---------------------- + + -- Function: void gnutls_session_set_ptr (gnutls_session_t SESSION, + void * PTR) + SESSION: is a 'gnutls_session_t' type. + + PTR: is the user pointer + + This function will set (associate) the user given pointer 'ptr' to + the session structure. This pointer can be accessed with + 'gnutls_session_get_ptr()' . + +gnutls_session_set_verify_cert +------------------------------ + + -- Function: void gnutls_session_set_verify_cert (gnutls_session_t + SESSION, const char * HOSTNAME, unsigned FLAGS) + SESSION: is a gnutls session + + HOSTNAME: is the expected name of the peer; may be 'NULL' + + FLAGS: flags for certificate verification - + 'gnutls_certificate_verify_flags' + + This function instructs GnuTLS to verify the peer's certificate + using the provided hostname. If the verification fails the + handshake will also fail with + 'GNUTLS_E_CERTIFICATE_VERIFICATION_ERROR' . In that case the + verification result can be obtained using + 'gnutls_session_get_verify_cert_status()' . + + The 'hostname' pointer provided must remain valid for the lifetime + of the session. More precisely it should be available during any + subsequent handshakes. If no hostname is provided, no hostname + verification will be performed. For a more advanced verification + function check 'gnutls_session_set_verify_cert2()' . + + If 'flags' is provided which contain a profile, this function + should be called after any session priority setting functions. + + The 'gnutls_session_set_verify_cert()' function is intended to be + used by TLS clients to verify the server's certificate. + + *Since:* 3.4.6 + +gnutls_session_set_verify_cert2 +------------------------------- + + -- Function: void gnutls_session_set_verify_cert2 (gnutls_session_t + SESSION, gnutls_typed_vdata_st * DATA, unsigned ELEMENTS, + unsigned FLAGS) + SESSION: is a gnutls session + + DATA: an array of typed data + + ELEMENTS: the number of data elements + + FLAGS: flags for certificate verification - + 'gnutls_certificate_verify_flags' + + This function instructs GnuTLS to verify the peer's certificate + using the provided typed data information. If the verification + fails the handshake will also fail with + 'GNUTLS_E_CERTIFICATE_VERIFICATION_ERROR' . In that case the + verification result can be obtained using + 'gnutls_session_get_verify_cert_status()' . + + The acceptable typed data are the same as in + 'gnutls_certificate_verify_peers()' , and once set must remain + valid for the lifetime of the session. More precisely they should + be available during any subsequent handshakes. + + If 'flags' is provided which contain a profile, this function + should be called after any session priority setting functions. + + *Since:* 3.4.6 + +gnutls_session_set_verify_function +---------------------------------- + + -- Function: void gnutls_session_set_verify_function (gnutls_session_t + SESSION, gnutls_certificate_verify_function * FUNC) + SESSION: is a 'gnutls_session_t' type. + + FUNC: is the callback function + + This function sets a callback to be called when peer's certificate + has been received in order to verify it on receipt rather than + doing after the handshake is completed. This overrides any + callback set using 'gnutls_certificate_set_verify_function()' . + + The callback's function prototype is: int + (*callback)(gnutls_session_t); + + If the callback function is provided then gnutls will call it, in + the handshake, just after the certificate message has been + received. To verify or obtain the certificate the + 'gnutls_certificate_verify_peers2()' , + 'gnutls_certificate_type_get()' , 'gnutls_certificate_get_peers()' + functions can be used. + + The callback function should return 0 for the handshake to continue + or non-zero to terminate. + + *Since:* 3.4.6 + +gnutls_session_supplemental_register +------------------------------------ + + -- Function: int gnutls_session_supplemental_register (gnutls_session_t + SESSION, const char * NAME, + gnutls_supplemental_data_format_type_t TYPE, + gnutls_supp_recv_func RECV_FUNC, gnutls_supp_send_func + SEND_FUNC, unsigned FLAGS) + SESSION: the session for which this will be registered + + NAME: the name of the supplemental data to register + + TYPE: the type of the supplemental data format + + RECV_FUNC: the function to receive the data + + SEND_FUNC: the function to send the data + + FLAGS: must be zero + + This function will register a new supplemental data type (rfc4680). + The registered supplemental functions will be used for that + specific session. The provided 'type' must be an unassigned type + in 'gnutls_supplemental_data_format_type_t' . + + If the type is already registered or handled by GnuTLS internally + 'GNUTLS_E_ALREADY_REGISTERED' will be returned. + + As supplemental data are not defined under TLS 1.3, this function + will disable TLS 1.3 support for the given session. + + *Returns:* 'GNUTLS_E_SUCCESS' on success, otherwise a negative + error code. + + *Since:* 3.5.5 + +gnutls_session_ticket_enable_client +----------------------------------- + + -- Function: int gnutls_session_ticket_enable_client (gnutls_session_t + SESSION) + SESSION: is a 'gnutls_session_t' type. + + Request that the client should attempt session resumption using + SessionTicket. This call is typically unnecessary as session + tickets are enabled by default. + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, or an + error code. + + *Since:* 2.10.0 + +gnutls_session_ticket_enable_server +----------------------------------- + + -- Function: int gnutls_session_ticket_enable_server (gnutls_session_t + SESSION, const gnutls_datum_t * KEY) + SESSION: is a 'gnutls_session_t' type. + + KEY: key to encrypt session parameters. + + Request that the server should attempt session resumption using + session tickets, i.e., by delegating storage to the client. 'key' + must be initialized using 'gnutls_session_ticket_key_generate()' . + To avoid leaking that key, use 'gnutls_memset()' prior to releasing + it. + + The default ticket expiration time can be overridden using + 'gnutls_db_set_cache_expiration()' . + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, or an + error code. + + *Since:* 2.10.0 + +gnutls_session_ticket_key_generate +---------------------------------- + + -- Function: int gnutls_session_ticket_key_generate (gnutls_datum_t * + KEY) + KEY: is a pointer to a 'gnutls_datum_t' which will contain a newly + created key. + + Generate a random key to encrypt security parameters within + SessionTicket. + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, or an + error code. + + *Since:* 2.10.0 + +gnutls_session_ticket_send +-------------------------- + + -- Function: int gnutls_session_ticket_send (gnutls_session_t SESSION, + unsigned NR, unsigned FLAGS) + SESSION: is a 'gnutls_session_t' type. + + NR: the number of tickets to send + + FLAGS: must be zero + + Sends a fresh session ticket to the peer. This is relevant only in + server side under TLS1.3. This function may also return + 'GNUTLS_E_AGAIN' or 'GNUTLS_E_INTERRUPTED' and in that case it must + be called again. + + *Returns:* 'GNUTLS_E_SUCCESS' on success, or a negative error code. + +gnutls_set_default_priority +--------------------------- + + -- Function: int gnutls_set_default_priority (gnutls_session_t SESSION) + SESSION: is a 'gnutls_session_t' type. + + Sets the default priority on the ciphers, key exchange methods, and + macs. This is the recommended method of setting the defaults, in + order to promote consistency between applications using GnuTLS, and + to allow GnuTLS using applications to update settings in par with + the library. For client applications which require maximum + compatibility consider calling + 'gnutls_session_enable_compatibility_mode()' after this function. + + For an application to specify additional options to priority string + consider using 'gnutls_set_default_priority_append()' . + + To allow a user to override the defaults (e.g., when a user + interface or configuration file is available), the functions + 'gnutls_priority_set_direct()' or 'gnutls_priority_set()' can be + used. + + *Returns:* 'GNUTLS_E_SUCCESS' on success, or an error code. + + *Since:* 2.1.4 + +gnutls_set_default_priority_append +---------------------------------- + + -- Function: int gnutls_set_default_priority_append (gnutls_session_t + SESSION, const char * ADD_PRIO, const char ** ERR_POS, + unsigned FLAGS) + SESSION: is a 'gnutls_session_t' type. + + ADD_PRIO: is a string describing priorities to be appended to + default + + ERR_POS: In case of an error this will have the position in the + string the error occurred + + FLAGS: must be zero + + Sets the default priority on the ciphers, key exchange methods, and + macs with the additional options in 'add_prio' . This is the + recommended method of setting the defaults when only few additional + options are to be added. This promotes consistency between + applications using GnuTLS, and allows GnuTLS using applications to + update settings in par with the library. + + The 'add_prio' string should start as a normal priority string, + e.g., '-VERS-TLS-ALL:+VERS-TLS1.3:%COMPAT' or '%FORCE_ETM'. That + is, it must not start with ':'. + + To allow a user to override the defaults (e.g., when a user + interface or configuration file is available), the functions + 'gnutls_priority_set_direct()' or 'gnutls_priority_set()' can be + used. + + *Returns:* 'GNUTLS_E_SUCCESS' on success, or an error code. + + *Since:* 3.6.3 + +gnutls_sign_algorithm_get +------------------------- + + -- Function: int gnutls_sign_algorithm_get (gnutls_session_t SESSION) + SESSION: is a 'gnutls_session_t' type. + + Returns the signature algorithm that is (or will be) used in this + session by the server to sign data. This function should be used + only with TLS 1.2 or later. + + *Returns:* The sign algorithm or 'GNUTLS_SIGN_UNKNOWN' . + + *Since:* 3.1.1 + +gnutls_sign_algorithm_get_client +-------------------------------- + + -- Function: int gnutls_sign_algorithm_get_client (gnutls_session_t + SESSION) + SESSION: is a 'gnutls_session_t' type. + + Returns the signature algorithm that is (or will be) used in this + session by the client to sign data. This function should be used + only with TLS 1.2 or later. + + *Returns:* The sign algorithm or 'GNUTLS_SIGN_UNKNOWN' . + + *Since:* 3.1.11 + +gnutls_sign_algorithm_get_requested +----------------------------------- + + -- Function: int gnutls_sign_algorithm_get_requested (gnutls_session_t + SESSION, size_t INDX, gnutls_sign_algorithm_t * ALGO) + SESSION: is a 'gnutls_session_t' type. + + INDX: is an index of the signature algorithm to return + + ALGO: the returned certificate type will be stored there + + Returns the signature algorithm specified by index that was + requested by the peer. If the specified index has no data + available this function returns + 'GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE' . If the negotiated TLS + version does not support signature algorithms then + 'GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE' will be returned even for + the first index. The first index is 0. + + This function is useful in the certificate callback functions to + assist in selecting the correct certificate. + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, + otherwise an error code is returned. + + *Since:* 2.10.0 + +gnutls_sign_get_hash_algorithm +------------------------------ + + -- Function: gnutls_digest_algorithm_t gnutls_sign_get_hash_algorithm + (gnutls_sign_algorithm_t SIGN) + SIGN: is a signature algorithm + + This function returns the digest algorithm corresponding to the + given signature algorithms. + + *Since:* 3.1.1 + + *Returns:* return a 'gnutls_digest_algorithm_t' value, or + 'GNUTLS_DIG_UNKNOWN' on error. + +gnutls_sign_get_id +------------------ + + -- Function: gnutls_sign_algorithm_t gnutls_sign_get_id (const char * + NAME) + NAME: is a sign algorithm name + + The names are compared in a case insensitive way. + + *Returns:* return a 'gnutls_sign_algorithm_t' value corresponding + to the specified algorithm, or 'GNUTLS_SIGN_UNKNOWN' on error. + +gnutls_sign_get_name +-------------------- + + -- Function: const char * gnutls_sign_get_name (gnutls_sign_algorithm_t + ALGORITHM) + ALGORITHM: is a sign algorithm + + Convert a 'gnutls_sign_algorithm_t' value to a string. + + *Returns:* a string that contains the name of the specified sign + algorithm, or 'NULL' . + +gnutls_sign_get_oid +------------------- + + -- Function: const char * gnutls_sign_get_oid (gnutls_sign_algorithm_t + SIGN) + SIGN: is a sign algorithm + + Convert a 'gnutls_sign_algorithm_t' value to its object identifier. + + *Returns:* a string that contains the object identifier of the + specified sign algorithm, or 'NULL' . + + *Since:* 3.4.3 + +gnutls_sign_get_pk_algorithm +---------------------------- + + -- Function: gnutls_pk_algorithm_t gnutls_sign_get_pk_algorithm + (gnutls_sign_algorithm_t SIGN) + SIGN: is a signature algorithm + + This function returns the public key algorithm corresponding to the + given signature algorithms. Note that there may be multiple public + key algorithms supporting a particular signature type; when dealing + with such algorithms use instead + 'gnutls_sign_supports_pk_algorithm()' . + + *Since:* 3.1.1 + + *Returns:* return a 'gnutls_pk_algorithm_t' value, or + 'GNUTLS_PK_UNKNOWN' on error. + +gnutls_sign_is_secure +--------------------- + + -- Function: unsigned gnutls_sign_is_secure (gnutls_sign_algorithm_t + ALGORITHM) + ALGORITHM: is a sign algorithm + + *Returns:* Non-zero if the provided signature algorithm is + considered to be secure. + +gnutls_sign_is_secure2 +---------------------- + + -- Function: unsigned gnutls_sign_is_secure2 (gnutls_sign_algorithm_t + ALGORITHM, unsigned int FLAGS) + ALGORITHM: is a sign algorithm + + FLAGS: zero or 'GNUTLS_SIGN_FLAG_SECURE_FOR_CERTS' + + *Returns:* Non-zero if the provided signature algorithm is + considered to be secure. + +gnutls_sign_list +---------------- + + -- Function: const gnutls_sign_algorithm_t * gnutls_sign_list ( VOID) + + Get a list of supported public key signature algorithms. This + function is not thread safe. + + *Returns:* a (0)-terminated list of 'gnutls_sign_algorithm_t' + integers indicating the available ciphers. + +gnutls_sign_set_secure +---------------------- + + -- Function: int gnutls_sign_set_secure (gnutls_sign_algorithm_t SIGN, + unsigned int SECURE) + SIGN: the sign algorithm + + SECURE: whether to mark the sign algorithm secure + + Modify the previous system wide setting that marked 'sign' as + secure or insecure. Calling this function is allowed only if + allowlisting mode is set in the configuration file, and only if the + system-wide TLS priority string has not been initialized yet. The + intended usage is to provide applications with a way to expressly + deviate from the distribution or site defaults inherited from the + configuration file. The modification is composable with further + modifications performed through the priority string mechanism. + + This function is not thread-safe and is intended to be called in + the main thread at the beginning of the process execution. + + Even when 'secure' is true, 'sign' is not marked as secure for the + use in certificates. Use 'gnutls_sign_set_secure_for_certs()' to + mark it secure as well for certificates. + + *Returns:* 0 on success or negative error code otherwise. + + *Since:* 3.7.3 + +gnutls_sign_set_secure_for_certs +-------------------------------- + + -- Function: int gnutls_sign_set_secure_for_certs + (gnutls_sign_algorithm_t SIGN, unsigned int SECURE) + SIGN: the sign algorithm + + SECURE: whether to mark the sign algorithm secure for certificates + + Modify the previous system wide setting that marked 'sign' as + secure or insecure for the use in certificates. Calling this + fuction is allowed only if allowlisting mode is set in the + configuration file, and only if the system-wide TLS priority string + has not been initialized yet. The intended usage is to provide + applications with a way to expressly deviate from the distribution + or site defaults inherited from the configuration file. The + modification is composable with further modifications performed + through the priority string mechanism. + + This function is not thread-safe and is intended to be called in + the main thread at the beginning of the process execution. When + 'secure' is true, 'sign' is marked as secure for any use unlike + 'gnutls_sign_set_secure()' . Otherwise, it is marked as insecure + only for the use in certificates. Use 'gnutls_sign_set_secure()' + to mark it insecure for any uses. + + *Returns:* 0 on success or negative error code otherwise. + + *Since:* 3.7.3 + +gnutls_sign_supports_pk_algorithm +--------------------------------- + + -- Function: unsigned gnutls_sign_supports_pk_algorithm + (gnutls_sign_algorithm_t SIGN, gnutls_pk_algorithm_t PK) + SIGN: is a signature algorithm + + PK: is a public key algorithm + + This function returns non-zero if the public key algorithm + corresponds to the given signature algorithm. That is, if that + signature can be generated from the given private key algorithm. + + *Since:* 3.6.0 + + *Returns:* return non-zero when the provided algorithms are + compatible. + +gnutls_srp_allocate_client_credentials +-------------------------------------- + + -- Function: int gnutls_srp_allocate_client_credentials + (gnutls_srp_client_credentials_t * SC) + SC: is a pointer to a 'gnutls_srp_server_credentials_t' type. + + Allocate a gnutls_srp_client_credentials_t structure. + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, or an + error code. + +gnutls_srp_allocate_server_credentials +-------------------------------------- + + -- Function: int gnutls_srp_allocate_server_credentials + (gnutls_srp_server_credentials_t * SC) + SC: is a pointer to a 'gnutls_srp_server_credentials_t' type. + + Allocate a gnutls_srp_server_credentials_t structure. + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, or an + error code. + +gnutls_srp_base64_decode +------------------------ + + -- Function: int gnutls_srp_base64_decode (const gnutls_datum_t * + B64_DATA, char * RESULT, size_t * RESULT_SIZE) + B64_DATA: contain the encoded data + + RESULT: the place where decoded data will be copied + + RESULT_SIZE: holds the size of the result + + This function will decode the given encoded data, using the base64 + encoding found in libsrp. + + Note that 'b64_data' should be null terminated. + + Warning! This base64 encoding is not the "standard" encoding, so + do not use it for non-SRP purposes. + + *Returns:* 'GNUTLS_E_SHORT_MEMORY_BUFFER' if the buffer given is + not long enough, or 0 on success. + +gnutls_srp_base64_decode2 +------------------------- + + -- Function: int gnutls_srp_base64_decode2 (const gnutls_datum_t * + B64_DATA, gnutls_datum_t * RESULT) + B64_DATA: contains the encoded data + + RESULT: the place where decoded data lie + + This function will decode the given encoded data. The decoded data + will be allocated, and stored into result. It will decode using + the base64 algorithm as used in libsrp. + + You should use 'gnutls_free()' to free the returned data. + + Warning! This base64 encoding is not the "standard" encoding, so + do not use it for non-SRP purposes. + + *Returns:* 0 on success, or an error code. + +gnutls_srp_base64_encode +------------------------ + + -- Function: int gnutls_srp_base64_encode (const gnutls_datum_t * DATA, + char * RESULT, size_t * RESULT_SIZE) + DATA: contain the raw data + + RESULT: the place where base64 data will be copied + + RESULT_SIZE: holds the size of the result + + This function will convert the given data to printable data, using + the base64 encoding, as used in the libsrp. This is the encoding + used in SRP password files. If the provided buffer is not long + enough GNUTLS_E_SHORT_MEMORY_BUFFER is returned. + + Warning! This base64 encoding is not the "standard" encoding, so + do not use it for non-SRP purposes. + + *Returns:* 'GNUTLS_E_SHORT_MEMORY_BUFFER' if the buffer given is + not long enough, or 0 on success. + +gnutls_srp_base64_encode2 +------------------------- + + -- Function: int gnutls_srp_base64_encode2 (const gnutls_datum_t * + DATA, gnutls_datum_t * RESULT) + DATA: contains the raw data + + RESULT: will hold the newly allocated encoded data + + This function will convert the given data to printable data, using + the base64 encoding. This is the encoding used in SRP password + files. This function will allocate the required memory to hold the + encoded data. + + You should use 'gnutls_free()' to free the returned data. + + Warning! This base64 encoding is not the "standard" encoding, so + do not use it for non-SRP purposes. + + *Returns:* 0 on success, or an error code. + +gnutls_srp_free_client_credentials +---------------------------------- + + -- Function: void gnutls_srp_free_client_credentials + (gnutls_srp_client_credentials_t SC) + SC: is a 'gnutls_srp_client_credentials_t' type. + + Free a gnutls_srp_client_credentials_t structure. + +gnutls_srp_free_server_credentials +---------------------------------- + + -- Function: void gnutls_srp_free_server_credentials + (gnutls_srp_server_credentials_t SC) + SC: is a 'gnutls_srp_server_credentials_t' type. + + Free a gnutls_srp_server_credentials_t structure. + +gnutls_srp_server_get_username +------------------------------ + + -- Function: const char * gnutls_srp_server_get_username + (gnutls_session_t SESSION) + SESSION: is a gnutls session + + This function will return the username of the peer. This should + only be called in case of SRP authentication and in case of a + server. Returns NULL in case of an error. + + *Returns:* SRP username of the peer, or NULL in case of error. + +gnutls_srp_set_client_credentials +--------------------------------- + + -- Function: int gnutls_srp_set_client_credentials + (gnutls_srp_client_credentials_t RES, const char * USERNAME, + const char * PASSWORD) + RES: is a 'gnutls_srp_client_credentials_t' type. + + USERNAME: is the user's userid + + PASSWORD: is the user's password + + This function sets the username and password, in a + 'gnutls_srp_client_credentials_t' type. Those will be used in SRP + authentication. 'username' should be an ASCII string or UTF-8 + string. In case of a UTF-8 string it is recommended to be + following the PRECIS framework for usernames (rfc8265). The + password can be in ASCII format, or normalized using + 'gnutls_utf8_password_normalize()' . + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, or an + error code. + +gnutls_srp_set_client_credentials_function +------------------------------------------ + + -- Function: void gnutls_srp_set_client_credentials_function + (gnutls_srp_client_credentials_t CRED, + gnutls_srp_client_credentials_function * FUNC) + CRED: is a 'gnutls_srp_server_credentials_t' type. + + FUNC: is the callback function + + This function can be used to set a callback to retrieve the + username and password for client SRP authentication. The + callback's function form is: + + int (*callback)(gnutls_session_t, char** username, char**password); + + The 'username' and 'password' must be allocated using + 'gnutls_malloc()' . + + The 'username' should be an ASCII string or UTF-8 string. In case + of a UTF-8 string it is recommended to be following the PRECIS + framework for usernames (rfc8265). The password can be in ASCII + format, or normalized using 'gnutls_utf8_password_normalize()' . + + The callback function will be called once per handshake before the + initial hello message is sent. + + The callback should not return a negative error code the second + time called, since the handshake procedure will be aborted. + + The callback function should return 0 on success. -1 indicates an + error. + +gnutls_srp_set_prime_bits +------------------------- + + -- Function: void gnutls_srp_set_prime_bits (gnutls_session_t SESSION, + unsigned int BITS) + SESSION: is a 'gnutls_session_t' type. + + BITS: is the number of bits + + This function sets the minimum accepted number of bits, for use in + an SRP key exchange. If zero, the default 2048 bits will be used. + + In the client side it sets the minimum accepted number of bits. If + a server sends a prime with less bits than that + 'GNUTLS_E_RECEIVED_ILLEGAL_PARAMETER' will be returned by the + handshake. + + This function has no effect in server side. + + *Since:* 2.6.0 + +gnutls_srp_set_server_credentials_file +-------------------------------------- + + -- Function: int gnutls_srp_set_server_credentials_file + (gnutls_srp_server_credentials_t RES, const char * + PASSWORD_FILE, const char * PASSWORD_CONF_FILE) + RES: is a 'gnutls_srp_server_credentials_t' type. + + PASSWORD_FILE: is the SRP password file (tpasswd) + + PASSWORD_CONF_FILE: is the SRP password conf file (tpasswd.conf) + + This function sets the password files, in a + 'gnutls_srp_server_credentials_t' type. Those password files hold + usernames and verifiers and will be used for SRP authentication. + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, or an + error code. + +gnutls_srp_set_server_credentials_function +------------------------------------------ + + -- Function: void gnutls_srp_set_server_credentials_function + (gnutls_srp_server_credentials_t CRED, + gnutls_srp_server_credentials_function * FUNC) + CRED: is a 'gnutls_srp_server_credentials_t' type. + + FUNC: is the callback function + + This function can be used to set a callback to retrieve the user's + SRP credentials. The callback's function form is: + + int (*callback)(gnutls_session_t, const char* username, + gnutls_datum_t *salt, gnutls_datum_t *verifier, gnutls_datum_t + *generator, gnutls_datum_t *prime); + + 'username' contains the actual username. The 'salt' , 'verifier' , + 'generator' and 'prime' must be filled in using the + 'gnutls_malloc()' . For convenience 'prime' and 'generator' may + also be one of the static parameters defined in gnutls.h. + + Initially, the data field is NULL in every 'gnutls_datum_t' + structure that the callback has to fill in. When the callback is + done GnuTLS deallocates all of those buffers which are non-NULL, + regardless of the return value. + + In order to prevent attackers from guessing valid usernames, if a + user does not exist, g and n values should be filled in using a + random user's parameters. In that case the callback must return + the special value (1). See 'gnutls_srp_set_server_fake_salt_seed' + too. If this is not required for your application, return a + negative number from the callback to abort the handshake. + + The callback function will only be called once per handshake. The + callback function should return 0 on success, while -1 indicates an + error. + +gnutls_srp_set_server_fake_salt_seed +------------------------------------ + + -- Function: void gnutls_srp_set_server_fake_salt_seed + (gnutls_srp_server_credentials_t CRED, const gnutls_datum_t * + SEED, unsigned int SALT_LENGTH) + CRED: is a 'gnutls_srp_server_credentials_t' type + + SEED: is the seed data, only needs to be valid until the function + returns; size of the seed must be greater than zero + + SALT_LENGTH: is the length of the generated fake salts + + This function sets the seed that is used to generate salts for + invalid (non-existent) usernames. + + In order to prevent attackers from guessing valid usernames, when a + user does not exist gnutls generates a salt and a verifier and + proceeds with the protocol as usual. The authentication will + ultimately fail, but the client cannot tell whether the username is + valid (exists) or invalid. + + If an attacker learns the seed, given a salt (which is part of the + handshake) which was generated when the seed was in use, it can + tell whether or not the authentication failed because of an unknown + username. This seed cannot be used to reveal application data or + passwords. + + 'salt_length' should represent the salt length your application + uses. Generating fake salts longer than 20 bytes is not supported. + + By default the seed is a random value, different each time a + 'gnutls_srp_server_credentials_t' is allocated and fake salts are + 16 bytes long. + + *Since:* 3.3.0 + +gnutls_srp_verifier +------------------- + + -- Function: int gnutls_srp_verifier (const char * USERNAME, const char + * PASSWORD, const gnutls_datum_t * SALT, const gnutls_datum_t + * GENERATOR, const gnutls_datum_t * PRIME, gnutls_datum_t * + RES) + USERNAME: is the user's name + + PASSWORD: is the user's password + + SALT: should be some randomly generated bytes + + GENERATOR: is the generator of the group + + PRIME: is the group's prime + + RES: where the verifier will be stored. + + This function will create an SRP verifier, as specified in RFC2945. + The 'prime' and 'generator' should be one of the static parameters + defined in gnutls/gnutls.h or may be generated. + + The verifier will be allocated with 'gnutls_malloc' () and will be + stored in 'res' using binary format. + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, or an + error code. + +gnutls_srtp_get_keys +-------------------- + + -- Function: int gnutls_srtp_get_keys (gnutls_session_t SESSION, void * + KEY_MATERIAL, unsigned int KEY_MATERIAL_SIZE, gnutls_datum_t * + CLIENT_KEY, gnutls_datum_t * CLIENT_SALT, gnutls_datum_t * + SERVER_KEY, gnutls_datum_t * SERVER_SALT) + SESSION: is a 'gnutls_session_t' type. + + KEY_MATERIAL: Space to hold the generated key material + + KEY_MATERIAL_SIZE: The maximum size of the key material + + CLIENT_KEY: The master client write key, pointing inside the key + material + + CLIENT_SALT: The master client write salt, pointing inside the key + material + + SERVER_KEY: The master server write key, pointing inside the key + material + + SERVER_SALT: The master server write salt, pointing inside the key + material + + This is a helper function to generate the keying material for SRTP. + It requires the space of the key material to be pre-allocated + (should be at least 2x the maximum key size and salt size). The + 'client_key' , 'client_salt' , 'server_key' and 'server_salt' are + convenience datums that point inside the key material. They may be + 'NULL' . + + *Returns:* On success the size of the key material is returned, + otherwise, 'GNUTLS_E_SHORT_MEMORY_BUFFER' if the buffer given is + not sufficient, or a negative error code. + + Since 3.1.4 + +gnutls_srtp_get_mki +------------------- + + -- Function: int gnutls_srtp_get_mki (gnutls_session_t SESSION, + gnutls_datum_t * MKI) + SESSION: is a 'gnutls_session_t' type. + + MKI: will hold the MKI + + This function exports the negotiated Master Key Identifier, + received by the peer if any. The returned value in 'mki' should be + treated as constant and valid only during the session's lifetime. + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, + otherwise a negative error code is returned. + + Since 3.1.4 + +gnutls_srtp_get_profile_id +-------------------------- + + -- Function: int gnutls_srtp_get_profile_id (const char * NAME, + gnutls_srtp_profile_t * PROFILE) + NAME: The name of the profile to look up + + PROFILE: Will hold the profile id + + This function allows you to look up a profile based on a string. + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, + otherwise a negative error code is returned. + + Since 3.1.4 + +gnutls_srtp_get_profile_name +---------------------------- + + -- Function: const char * gnutls_srtp_get_profile_name + (gnutls_srtp_profile_t PROFILE) + PROFILE: The profile to look up a string for + + This function allows you to get the corresponding name for a SRTP + protection profile. + + *Returns:* On success, the name of a SRTP profile as a string, + otherwise NULL. + + Since 3.1.4 + +gnutls_srtp_get_selected_profile +-------------------------------- + + -- Function: int gnutls_srtp_get_selected_profile (gnutls_session_t + SESSION, gnutls_srtp_profile_t * PROFILE) + SESSION: is a 'gnutls_session_t' type. + + PROFILE: will hold the profile + + This function allows you to get the negotiated SRTP profile. + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, + otherwise a negative error code is returned. + + Since 3.1.4 + +gnutls_srtp_set_mki +------------------- + + -- Function: int gnutls_srtp_set_mki (gnutls_session_t SESSION, const + gnutls_datum_t * MKI) + SESSION: is a 'gnutls_session_t' type. + + MKI: holds the MKI + + This function sets the Master Key Identifier, to be used by this + session (if any). + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, + otherwise a negative error code is returned. + + Since 3.1.4 + +gnutls_srtp_set_profile +----------------------- + + -- Function: int gnutls_srtp_set_profile (gnutls_session_t SESSION, + gnutls_srtp_profile_t PROFILE) + SESSION: is a 'gnutls_session_t' type. + + PROFILE: is the profile id to add. + + This function is to be used by both clients and servers, to declare + what SRTP profiles they support, to negotiate with the peer. + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, + otherwise a negative error code is returned. + + Since 3.1.4 + +gnutls_srtp_set_profile_direct +------------------------------ + + -- Function: int gnutls_srtp_set_profile_direct (gnutls_session_t + SESSION, const char * PROFILES, const char ** ERR_POS) + SESSION: is a 'gnutls_session_t' type. + + PROFILES: is a string that contains the supported SRTP profiles, + separated by colons. + + ERR_POS: In case of an error this will have the position in the + string the error occurred, may be NULL. + + This function is to be used by both clients and servers, to declare + what SRTP profiles they support, to negotiate with the peer. + + *Returns:* On syntax error 'GNUTLS_E_INVALID_REQUEST' is returned, + 'GNUTLS_E_SUCCESS' on success, or an error code. + + Since 3.1.4 + +gnutls_store_commitment +----------------------- + + -- Function: int gnutls_store_commitment (const char * DB_NAME, + gnutls_tdb_t TDB, const char * HOST, const char * SERVICE, + gnutls_digest_algorithm_t HASH_ALGO, const gnutls_datum_t * + HASH, time_t EXPIRATION, unsigned int FLAGS) + DB_NAME: A file specifying the stored keys (use NULL for the + default) + + TDB: A storage structure or NULL to use the default + + HOST: The peer's name + + SERVICE: non-NULL if this key is specific to a service (e.g. http) + + HASH_ALGO: The hash algorithm type + + HASH: The raw hash + + EXPIRATION: The expiration time (use 0 to disable expiration) + + FLAGS: should be 0 or 'GNUTLS_SCOMMIT_FLAG_ALLOW_BROKEN' . + + This function will store the provided hash commitment to the list + of stored public keys. The key with the given hash will be + considered valid until the provided expiration time. + + The 'tdb' variable if non-null specifies a custom backend for the + storage of entries. If it is NULL then the default file backend + will be used. + + Note that this function is not thread safe with the default + backend. + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, + otherwise a negative error value. + + *Since:* 3.0 + +gnutls_store_pubkey +------------------- + + -- Function: int gnutls_store_pubkey (const char * DB_NAME, + gnutls_tdb_t TDB, const char * HOST, const char * SERVICE, + gnutls_certificate_type_t CERT_TYPE, const gnutls_datum_t * + CERT, time_t EXPIRATION, unsigned int FLAGS) + DB_NAME: A file specifying the stored keys (use NULL for the + default) + + TDB: A storage structure or NULL to use the default + + HOST: The peer's name + + SERVICE: non-NULL if this key is specific to a service (e.g. http) + + CERT_TYPE: The type of the certificate + + CERT: The data of the certificate + + EXPIRATION: The expiration time (use 0 to disable expiration) + + FLAGS: should be 0. + + This function will store a raw public-key or a public-key provided + via a raw (DER-encoded) certificate to the list of stored public + keys. The key will be considered valid until the provided + expiration time. + + The 'tdb' variable if non-null specifies a custom backend for the + storage of entries. If it is NULL then the default file backend + will be used. + + Unless an alternative 'tdb' is provided, the storage format is a + textual format consisting of a line for each host with fields + separated by '|'. The contents of the fields are a + format-identifier which is set to 'g0', the hostname that the rest + of the data applies to, the numeric port or host name, the + expiration time in seconds since the epoch (0 for no expiration), + and a base64 encoding of the raw (DER) public key information + (SPKI) of the peer. + + As of GnuTLS 3.6.6 this function also accepts raw public keys. + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, + otherwise a negative error value. + + *Since:* 3.0.13 + +gnutls_strerror +--------------- + + -- Function: const char * gnutls_strerror (int ERROR) + ERROR: is a GnuTLS error code, a negative error code + + This function is similar to strerror. The difference is that it + accepts an error number returned by a gnutls function; In case of + an unknown error a descriptive string is sent instead of 'NULL' . + + Error codes are always a negative error code. + + *Returns:* A string explaining the GnuTLS error message. + +gnutls_strerror_name +-------------------- + + -- Function: const char * gnutls_strerror_name (int ERROR) + ERROR: is an error returned by a gnutls function. + + Return the GnuTLS error code define as a string. For example, + gnutls_strerror_name (GNUTLS_E_DH_PRIME_UNACCEPTABLE) will return + the string "GNUTLS_E_DH_PRIME_UNACCEPTABLE". + + *Returns:* A string corresponding to the symbol name of the error + code. + + *Since:* 2.6.0 + +gnutls_supplemental_get_name +---------------------------- + + -- Function: const char * gnutls_supplemental_get_name + (gnutls_supplemental_data_format_type_t TYPE) + TYPE: is a supplemental data format type + + Convert a 'gnutls_supplemental_data_format_type_t' value to a + string. + + *Returns:* a string that contains the name of the specified + supplemental data format type, or 'NULL' for unknown types. + +gnutls_supplemental_recv +------------------------ + + -- Function: void gnutls_supplemental_recv (gnutls_session_t SESSION, + unsigned DO_RECV_SUPPLEMENTAL) + SESSION: is a 'gnutls_session_t' type. + + DO_RECV_SUPPLEMENTAL: non-zero in order to expect supplemental data + + This function is to be called by an extension handler to instruct + gnutls to attempt to receive supplemental data during the handshake + process. + + *Since:* 3.4.0 + +gnutls_supplemental_register +---------------------------- + + -- Function: int gnutls_supplemental_register (const char * NAME, + gnutls_supplemental_data_format_type_t TYPE, + gnutls_supp_recv_func RECV_FUNC, gnutls_supp_send_func + SEND_FUNC) + NAME: the name of the supplemental data to register + + TYPE: the type of the supplemental data format + + RECV_FUNC: the function to receive the data + + SEND_FUNC: the function to send the data + + This function will register a new supplemental data type (rfc4680). + The registered data will remain until 'gnutls_global_deinit()' is + called. The provided 'type' must be an unassigned type in + 'gnutls_supplemental_data_format_type_t' . If the type is already + registered or handled by GnuTLS internally + 'GNUTLS_E_ALREADY_REGISTERED' will be returned. + + This function is not thread safe. As supplemental data are not + defined under TLS 1.3, this function will disable TLS 1.3 support + globally. + + *Returns:* 'GNUTLS_E_SUCCESS' on success, otherwise a negative + error code. + + *Since:* 3.4.0 + +gnutls_supplemental_send +------------------------ + + -- Function: void gnutls_supplemental_send (gnutls_session_t SESSION, + unsigned DO_SEND_SUPPLEMENTAL) + SESSION: is a 'gnutls_session_t' type. + + DO_SEND_SUPPLEMENTAL: non-zero in order to send supplemental data + + This function is to be called by an extension handler to instruct + gnutls to send supplemental data during the handshake process. + + *Since:* 3.4.0 + +gnutls_system_recv_timeout +-------------------------- + + -- Function: int gnutls_system_recv_timeout (gnutls_transport_ptr_t + PTR, unsigned int MS) + PTR: A file descriptor (wrapped in a gnutls_transport_ptr_t + pointer) + + MS: The number of milliseconds to wait. + + Wait for data to be received from the provided socket ( 'ptr' ) + within a timeout period in milliseconds, using 'select()' on the + provided 'ptr' . + + This function is provided as a helper for constructing custom + callbacks for 'gnutls_transport_set_pull_timeout_function()' , + which can be used if you rely on socket file descriptors. + + Returns -1 on error, 0 on timeout, positive value if data are + available for reading. + + *Since:* 3.4.0 + +gnutls_tdb_deinit +----------------- + + -- Function: void gnutls_tdb_deinit (gnutls_tdb_t TDB) + TDB: The structure to be deinitialized + + This function will deinitialize a public key trust storage + structure. + +gnutls_tdb_init +--------------- + + -- Function: int gnutls_tdb_init (gnutls_tdb_t * TDB) + TDB: A pointer to the type to be initialized + + This function will initialize a public key trust storage structure. + + *Returns:* On success, 'GNUTLS_E_SUCCESS' (0) is returned, + otherwise a negative error value. + +gnutls_tdb_set_store_commitment_func +------------------------------------ + + -- Function: void gnutls_tdb_set_store_commitment_func (gnutls_tdb_t + TDB, gnutls_tdb_store_commitment_func CSTORE) + TDB: The trust storage + + CSTORE: The commitment storage function + + This function will associate a commitment (hash) storage function + with the trust storage structure. The function is of the following + form. + + int gnutls_tdb_store_commitment_func(const char* db_name, const + char* host, const char* service, time_t expiration, + gnutls_digest_algorithm_t, const gnutls_datum_t* hash); + + The 'db_name' should be used to pass any private data to this + function. + +gnutls_tdb_set_store_func +------------------------- + + -- Function: void gnutls_tdb_set_store_func (gnutls_tdb_t TDB, + gnutls_tdb_store_func STORE) + TDB: The trust storage + + STORE: The storage function + + This function will associate a storage function with the trust + storage structure. The function is of the following form. + + int gnutls_tdb_store_func(const char* db_name, const char* host, + const char* service, time_t expiration, const gnutls_datum_t* + pubkey); + + The 'db_name' should be used to pass any private data to this + function. + +gnutls_tdb_set_verify_func +-------------------------- + + -- Function: void gnutls_tdb_set_verify_func (gnutls_tdb_t TDB, + gnutls_tdb_verify_func VERIFY) + TDB: The trust storage + + VERIFY: The verification function + + This function will associate a retrieval function with the trust + storage structure. The function is of the following form. + + int gnutls_tdb_verify_func(const char* db_name, const char* host, + const char* service, const gnutls_datum_t* pubkey); + + The verify function should return zero on a match, + 'GNUTLS_E_CERTIFICATE_KEY_MISMATCH' if there is a mismatch and any + other negative error code otherwise. + + The 'db_name' should be used to pass any private data to this + function. + +gnutls_transport_get_int +------------------------ + + -- Function: int gnutls_transport_get_int (gnutls_session_t SESSION) + SESSION: is a 'gnutls_session_t' type. + + Used to get the first argument of the transport function (like PUSH + and PULL). This must have been set using + 'gnutls_transport_set_int()' . + + *Returns:* The first argument of the transport function. + + *Since:* 3.1.9 + +gnutls_transport_get_int2 +------------------------- + + -- Function: void gnutls_transport_get_int2 (gnutls_session_t SESSION, + int * RECV_INT, int * SEND_INT) + SESSION: is a 'gnutls_session_t' type. + + RECV_INT: will hold the value for the pull function + + SEND_INT: will hold the value for the push function + + Used to get the arguments of the transport functions (like PUSH and + PULL). These should have been set using + 'gnutls_transport_set_int2()' . + + *Since:* 3.1.9 + +gnutls_transport_get_ptr +------------------------ + + -- Function: gnutls_transport_ptr_t gnutls_transport_get_ptr + (gnutls_session_t SESSION) + SESSION: is a 'gnutls_session_t' type. + + Used to get the first argument of the transport function (like PUSH + and PULL). This must have been set using + 'gnutls_transport_set_ptr()' . + + *Returns:* The first argument of the transport function. + +gnutls_transport_get_ptr2 +------------------------- + + -- Function: void gnutls_transport_get_ptr2 (gnutls_session_t SESSION, + gnutls_transport_ptr_t * RECV_PTR, gnutls_transport_ptr_t * + SEND_PTR) + SESSION: is a 'gnutls_session_t' type. + + RECV_PTR: will hold the value for the pull function + + SEND_PTR: will hold the value for the push function + + Used to get the arguments of the transport functions (like PUSH and + PULL). These should have been set using + 'gnutls_transport_set_ptr2()' . + +gnutls_transport_set_errno +-------------------------- + + -- Function: void gnutls_transport_set_errno (gnutls_session_t SESSION, + int ERR) + SESSION: is a 'gnutls_session_t' type. + + ERR: error value to store in session-specific errno variable. + + Store 'err' in the session-specific errno variable. Useful values + for 'err' are EINTR, EAGAIN and EMSGSIZE, other values are treated + will be treated as real errors in the push/pull function. + + This function is useful in replacement push and pull functions set + by 'gnutls_transport_set_push_function()' and + 'gnutls_transport_set_pull_function()' under Windows, where the + replacements may not have access to the same 'errno' variable that + is used by GnuTLS (e.g., the application is linked to msvcr71.dll + and gnutls is linked to msvcrt.dll). + + This function is unreliable if you are using the same 'session' in + different threads for sending and receiving. + +gnutls_transport_set_errno_function +----------------------------------- + + -- Function: void gnutls_transport_set_errno_function (gnutls_session_t + SESSION, gnutls_errno_func ERRNO_FUNC) + SESSION: is a 'gnutls_session_t' type. + + ERRNO_FUNC: a callback function similar to 'write()' + + This is the function where you set a function to retrieve errno + after a failed push or pull operation. + + 'errno_func' is of the form, int + (*gnutls_errno_func)(gnutls_transport_ptr_t); and should return the + errno. + + *Since:* 2.12.0 + +gnutls_transport_set_int +------------------------ + + -- Function: void gnutls_transport_set_int (gnutls_session_t SESSION, + int FD) + SESSION: is a 'gnutls_session_t' type. + + FD: is the socket descriptor for the connection. + + This function sets the first argument of the transport function, + such as 'send()' and 'recv()' for the default callbacks using the + system's socket API. + + This function is equivalent to calling 'gnutls_transport_set_ptr()' + with the descriptor, but requires no casts. + + *Since:* 3.1.9 + +gnutls_transport_set_int2 +------------------------- + + -- Function: void gnutls_transport_set_int2 (gnutls_session_t SESSION, + int RECV_FD, int SEND_FD) + SESSION: is a 'gnutls_session_t' type. + + RECV_FD: is socket descriptor for the pull function + + SEND_FD: is socket descriptor for the push function + + This function sets the first argument of the transport functions, + such as 'send()' and 'recv()' for the default callbacks using the + system's socket API. With this function you can set two different + descriptors for receiving and sending. + + This function is equivalent to calling + 'gnutls_transport_set_ptr2()' with the descriptors, but requires no + casts. + + *Since:* 3.1.9 + +gnutls_transport_set_ptr +------------------------ + + -- Function: void gnutls_transport_set_ptr (gnutls_session_t SESSION, + gnutls_transport_ptr_t PTR) + SESSION: is a 'gnutls_session_t' type. + + PTR: is the value. + + Used to set the first argument of the transport function (for push + and pull callbacks). In berkeley style sockets this function will + set the connection descriptor. + +gnutls_transport_set_ptr2 +------------------------- + + -- Function: void gnutls_transport_set_ptr2 (gnutls_session_t SESSION, + gnutls_transport_ptr_t RECV_PTR, gnutls_transport_ptr_t + SEND_PTR) + SESSION: is a 'gnutls_session_t' type. + + RECV_PTR: is the value for the pull function + + SEND_PTR: is the value for the push function + + Used to set the first argument of the transport function (for push + and pull callbacks). In berkeley style sockets this function will + set the connection descriptor. With this function you can use two + different pointers for receiving and sending. + +gnutls_transport_set_pull_function +---------------------------------- + + -- Function: void gnutls_transport_set_pull_function (gnutls_session_t + SESSION, gnutls_pull_func PULL_FUNC) + SESSION: is a 'gnutls_session_t' type. + + PULL_FUNC: a callback function similar to 'read()' + + This is the function where you set a function for gnutls to receive + data. Normally, if you use berkeley style sockets, do not need to + use this function since the default recv(2) will probably be ok. + The callback should return 0 on connection termination, a positive + number indicating the number of bytes received, and -1 on error. + + 'gnutls_pull_func' is of the form, ssize_t + (*gnutls_pull_func)(gnutls_transport_ptr_t, void*, size_t); + +gnutls_transport_set_pull_timeout_function +------------------------------------------ + + -- Function: void gnutls_transport_set_pull_timeout_function + (gnutls_session_t SESSION, gnutls_pull_timeout_func FUNC) + SESSION: is a 'gnutls_session_t' type. + + FUNC: a callback function + + This is the function where you set a function for gnutls to know + whether data are ready to be received. It should wait for data a + given time frame in milliseconds. The callback should return 0 on + timeout, a positive number if data can be received, and -1 on + error. You'll need to override this function if 'select()' is not + suitable for the provided transport calls. + + As with 'select()' , if the timeout value is zero the callback + should return zero if no data are immediately available. The + special value 'GNUTLS_INDEFINITE_TIMEOUT' indicates that the + callback should wait indefinitely for data. + + 'gnutls_pull_timeout_func' is of the form, int + (*gnutls_pull_timeout_func)(gnutls_transport_ptr_t, unsigned int + ms); + + This callback is necessary when 'gnutls_handshake_set_timeout()' or + 'gnutls_record_set_timeout()' are set, under TLS1.3 and for + enforcing the DTLS mode timeouts when in blocking mode. + + For compatibility with future GnuTLS versions this callback must be + set when a custom pull function is registered. The callback will + not be used when the session is in TLS mode with non-blocking + sockets. That is, when 'GNUTLS_NONBLOCK' is specified for a TLS + session in 'gnutls_init()' . + + The helper function 'gnutls_system_recv_timeout()' is provided to + simplify writing callbacks. + + *Since:* 3.0 + +gnutls_transport_set_push_function +---------------------------------- + + -- Function: void gnutls_transport_set_push_function (gnutls_session_t + SESSION, gnutls_push_func PUSH_FUNC) + SESSION: is a 'gnutls_session_t' type. + + PUSH_FUNC: a callback function similar to 'write()' + + This is the function where you set a push function for gnutls to + use in order to send data. If you are going to use berkeley style + sockets, you do not need to use this function since the default + send(2) will probably be ok. Otherwise you should specify this + function for gnutls to be able to send data. The callback should + return a positive number indicating the bytes sent, and -1 on + error. + + 'push_func' is of the form, ssize_t + (*gnutls_push_func)(gnutls_transport_ptr_t, const void*, size_t); + +gnutls_transport_set_vec_push_function +-------------------------------------- + + -- Function: void gnutls_transport_set_vec_push_function + (gnutls_session_t SESSION, gnutls_vec_push_func VEC_FUNC) + SESSION: is a 'gnutls_session_t' type. + + VEC_FUNC: a callback function similar to 'writev()' + + Using this function you can override the default writev(2) function + for gnutls to send data. Setting this callback instead of + 'gnutls_transport_set_push_function()' is recommended since it + introduces less overhead in the TLS handshake process. + + 'vec_func' is of the form, ssize_t (*gnutls_vec_push_func) + (gnutls_transport_ptr_t, const giovec_t * iov, int iovcnt); + + *Since:* 2.12.0 + +gnutls_url_is_supported +----------------------- + + -- Function: unsigned gnutls_url_is_supported (const char * URL) + URL: A URI to be tested + + Check whether the provided 'url' is supported. Depending on the + system libraries GnuTLS may support pkcs11, tpmkey or other URLs. + + *Returns:* return non-zero if the given URL is supported, and zero + if it is not known. + + *Since:* 3.1.0 + +gnutls_utf8_password_normalize +------------------------------ + + -- Function: int gnutls_utf8_password_normalize (const unsigned char * + PASSWORD, unsigned PLEN, gnutls_datum_t * OUT, unsigned FLAGS) + PASSWORD: contain the UTF-8 formatted password + + PLEN: the length of the provided password + + OUT: the result in an null-terminated allocated string + + FLAGS: should be zero + + This function will convert the provided UTF-8 password according to + the normalization rules in RFC7613. + + If the flag 'GNUTLS_UTF8_IGNORE_ERRS' is specified, any UTF-8 + encoding errors will be ignored, and in that case the output will + be a copy of the input. + + *Returns:* 'GNUTLS_E_INVALID_UTF8_STRING' on invalid UTF-8 data, or + 0 on success. + + *Since:* 3.5.7 + +gnutls_verify_stored_pubkey +--------------------------- + + -- Function: int gnutls_verify_stored_pubkey (const char * DB_NAME, + gnutls_tdb_t TDB, const char * HOST, const char * SERVICE, + gnutls_certificate_type_t CERT_TYPE, const gnutls_datum_t * + CERT, unsigned int FLAGS) + DB_NAME: A file specifying the stored keys (use NULL for the + default) + + TDB: A storage structure or NULL to use the default + + HOST: The peer's name + + SERVICE: non-NULL if this key is specific to a service (e.g. http) + + CERT_TYPE: The type of the certificate + + CERT: The raw (der) data of the certificate + + FLAGS: should be 0. + + This function will try to verify a raw public-key or a public-key + provided via a raw (DER-encoded) certificate using a list of stored + public keys. The 'service' field if non-NULL should be a port + number. + + The 'db_name' variable if non-null specifies a custom backend for + the retrieval of entries. If it is NULL then the default file + backend will be used. In POSIX-like systems the file backend uses + the $HOME/.gnutls/known_hosts file. + + Note that if the custom storage backend is provided the retrieval + function should return 'GNUTLS_E_CERTIFICATE_KEY_MISMATCH' if the + host/service pair is found but key doesn't match, + 'GNUTLS_E_NO_CERTIFICATE_FOUND' if no such host/service with the + given key is found, and 0 if it was found. The storage function + should return 0 on success. + + As of GnuTLS 3.6.6 this function also verifies raw public keys. + + *Returns:* If no associated public key is found then + 'GNUTLS_E_NO_CERTIFICATE_FOUND' will be returned. If a key is + found but does not match 'GNUTLS_E_CERTIFICATE_KEY_MISMATCH' is + returned. On success, 'GNUTLS_E_SUCCESS' (0) is returned, or a + negative error value on other errors. + + *Since:* 3.0.13 + |