2 * Copyright (C) 2004-2012 Free Software Foundation, Inc.
3 * Copyright (c) 2002 Andrew McDonald <andrew@mcdonald.org.uk>
5 * This file is part of GnuTLS-EXTRA.
7 * GnuTLS-extra is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
12 * GnuTLS-extra is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <http://www.gnu.org/licenses/>.
23 #include <gnutls/gnutls.h>
24 #include <openssl_compat.h>
28 #include "../lib/gnutls_int.h"
29 #include "../lib/random.h"
30 #include "../lib/gnutls_hash_int.h"
32 /* In win32 X509_NAME is defined in wincrypt.h.
33 * undefine it to avoid the conflict with openssl.h.
38 #include <gnutls/openssl.h>
40 /* Gnulib re-defines shutdown on mingw. We only use it as a variable
41 name, so restore the original name. */
44 /* XXX: See lib/gnutls_int.h. */
45 #define GNUTLS_POINTER_TO_INT(_) ((int) GNUTLS_POINTER_TO_INT_CAST (_))
46 #define GNUTLS_INT_TO_POINTER(_) ((void*) GNUTLS_POINTER_TO_INT_CAST (_))
48 /* WARNING: Error functions aren't currently thread-safe */
50 static int last_error = 0;
52 /* Library initialisation functions */
54 int SSL_library_init(void)
57 /* NB: we haven't got anywhere to call gnutls_global_deinit() */
61 void OpenSSL_add_all_algorithms(void)
66 /* SSL_CTX structure handling */
68 SSL_CTX *SSL_CTX_new(SSL_METHOD * method)
72 ctx = (SSL_CTX *) calloc(1, sizeof(SSL_CTX));
78 void SSL_CTX_free(SSL_CTX * ctx)
84 int SSL_CTX_set_default_verify_paths(SSL_CTX * ctx)
90 SSL_CTX_use_certificate_file(SSL_CTX * ctx, const char *certfile, int type)
92 ctx->certfile = (char *) calloc(1, strlen(certfile) + 1);
95 memcpy(ctx->certfile, certfile, strlen(certfile));
97 ctx->certfile_type = type;
103 SSL_CTX_use_PrivateKey_file(SSL_CTX * ctx, const char *keyfile, int type)
105 ctx->keyfile = (char *) calloc(1, strlen(keyfile) + 1);
108 memcpy(ctx->keyfile, keyfile, strlen(keyfile));
110 ctx->keyfile_type = type;
117 SSL_CTX_set_verify(SSL_CTX * ctx, int verify_mode,
118 int (*verify_callback) (int, X509_STORE_CTX *))
120 ctx->verify_mode = verify_mode;
121 ctx->verify_callback = verify_callback;
124 unsigned long SSL_CTX_set_options(SSL_CTX * ctx, unsigned long options)
126 return (ctx->options |= options);
129 long SSL_CTX_set_mode(SSL_CTX * ctx, long mode)
134 int SSL_CTX_set_cipher_list(SSL_CTX * ctx, const char *list)
136 /* FIXME: ignore this for the moment */
137 /* We're going to have to parse the "list" string to do this */
138 /* It is a string, which in its simplest form is something like
139 "DES-CBC3-SHA:IDEA-CBC-MD5", but can be rather more complicated
140 (see OpenSSL's ciphers(1) manpage for details) */
146 /* SSL_CTX statistics */
148 long SSL_CTX_sess_number(SSL_CTX * ctx)
153 long SSL_CTX_sess_connect(SSL_CTX * ctx)
158 long SSL_CTX_sess_connect_good(SSL_CTX * ctx)
163 long SSL_CTX_sess_connect_renegotiate(SSL_CTX * ctx)
168 long SSL_CTX_sess_accept(SSL_CTX * ctx)
173 long SSL_CTX_sess_accept_good(SSL_CTX * ctx)
178 long SSL_CTX_sess_accept_renegotiate(SSL_CTX * ctx)
183 long SSL_CTX_sess_hits(SSL_CTX * ctx)
188 long SSL_CTX_sess_misses(SSL_CTX * ctx)
193 long SSL_CTX_sess_timeouts(SSL_CTX * ctx)
200 /* SSL structure handling */
202 SSL *SSL_new(SSL_CTX * ctx)
207 ssl = (SSL *) calloc(1, sizeof(SSL));
211 err = gnutls_certificate_allocate_credentials(&ssl->gnutls_cred);
218 gnutls_init(&ssl->gnutls_state, ctx->method->connend);
220 gnutls_priority_set_direct(ssl->gnutls_state,
221 ctx->method->priority_string, NULL);
223 gnutls_credentials_set(ssl->gnutls_state, GNUTLS_CRD_CERTIFICATE,
226 gnutls_certificate_set_x509_trust_file(ssl->gnutls_cred,
230 gnutls_certificate_set_x509_key_file(ssl->gnutls_cred,
235 ssl->verify_mode = ctx->verify_mode;
236 ssl->verify_callback = ctx->verify_callback;
238 ssl->options = ctx->options;
240 ssl->rfd = (gnutls_transport_ptr_t) - 1;
241 ssl->wfd = (gnutls_transport_ptr_t) - 1;
246 void SSL_free(SSL * ssl)
248 gnutls_certificate_free_credentials(ssl->gnutls_cred);
249 gnutls_deinit(ssl->gnutls_state);
253 void SSL_load_error_strings(void)
257 int SSL_get_error(SSL * ssl, int ret)
260 return SSL_ERROR_NONE;
262 return SSL_ERROR_ZERO_RETURN;
265 int SSL_set_fd(SSL * ssl, int fd)
267 gnutls_transport_set_ptr(ssl->gnutls_state,
268 GNUTLS_INT_TO_POINTER(fd));
272 int SSL_set_rfd(SSL * ssl, int fd)
274 ssl->rfd = GNUTLS_INT_TO_POINTER(fd);
276 if (ssl->wfd != (gnutls_transport_ptr_t) - 1)
277 gnutls_transport_set_ptr2(ssl->gnutls_state, ssl->rfd,
283 int SSL_set_wfd(SSL * ssl, int fd)
285 ssl->wfd = GNUTLS_INT_TO_POINTER(fd);
287 if (ssl->rfd != (gnutls_transport_ptr_t) - 1)
288 gnutls_transport_set_ptr2(ssl->gnutls_state, ssl->rfd,
294 void SSL_set_bio(SSL * ssl, BIO * rbio, BIO * wbio)
296 gnutls_transport_set_ptr2(ssl->gnutls_state, rbio->fd, wbio->fd);
300 void SSL_set_connect_state(SSL * ssl)
304 int SSL_pending(SSL * ssl)
306 return gnutls_record_check_pending(ssl->gnutls_state);
310 SSL_set_verify(SSL * ssl, int verify_mode,
311 int (*verify_callback) (int, X509_STORE_CTX *))
313 ssl->verify_mode = verify_mode;
314 ssl->verify_callback = verify_callback;
317 const X509 *SSL_get_peer_certificate(SSL * ssl)
319 const gnutls_datum_t *cert_list;
320 unsigned int cert_list_size = 0;
322 cert_list = gnutls_certificate_get_peers(ssl->gnutls_state,
328 /* SSL connection open/close/read/write functions */
330 int SSL_connect(SSL * ssl)
332 X509_STORE_CTX *store;
333 unsigned int cert_list_size = 0;
335 char x_priority[256];
336 /* take options into account before connecting */
338 memset(x_priority, 0, sizeof(x_priority));
339 if (ssl->options & SSL_OP_NO_TLSv1) {
340 snprintf(x_priority, sizeof(x_priority), "%s:-VERS-TLS1.0",
341 ssl->ctx->method->priority_string);
343 gnutls_priority_set_direct(ssl->gnutls_state,
351 err = gnutls_handshake(ssl->gnutls_state);
352 ssl->last_error = err;
359 store = (X509_STORE_CTX *) calloc(1, sizeof(X509_STORE_CTX));
361 store->cert_list = gnutls_certificate_get_peers(ssl->gnutls_state,
364 if (ssl->verify_callback) {
365 ssl->verify_callback(1 /*FIXME*/, store);
367 ssl->state = SSL_ST_OK;
372 /* FIXME: deal with error from callback */
377 int SSL_accept(SSL * ssl)
379 X509_STORE_CTX *store;
380 unsigned int cert_list_size = 0;
382 char x_priority[256];
383 /* take options into account before connecting */
385 memset(x_priority, 0, sizeof(x_priority));
386 if (ssl->options & SSL_OP_NO_TLSv1) {
387 snprintf(x_priority, sizeof(x_priority), "%s:-VERS-TLS1.0",
388 ssl->ctx->method->priority_string);
390 gnutls_priority_set_direct(ssl->gnutls_state,
398 /* FIXME: dh params, do we want client cert? */
400 err = gnutls_handshake(ssl->gnutls_state);
401 ssl->last_error = err;
408 store = (X509_STORE_CTX *) calloc(1, sizeof(X509_STORE_CTX));
410 store->cert_list = gnutls_certificate_get_peers(ssl->gnutls_state,
413 if (ssl->verify_callback) {
414 ssl->verify_callback(1 /*FIXME*/, store);
416 ssl->state = SSL_ST_OK;
421 /* FIXME: deal with error from callback */
426 int SSL_shutdown(SSL * ssl)
428 if (!ssl->shutdown) {
429 gnutls_bye(ssl->gnutls_state, GNUTLS_SHUT_WR);
432 gnutls_bye(ssl->gnutls_state, GNUTLS_SHUT_RDWR);
440 int SSL_read(SSL * ssl, void *buf, int len)
444 ret = gnutls_record_recv(ssl->gnutls_state, buf, len);
445 ssl->last_error = ret;
455 int SSL_write(SSL * ssl, const void *buf, int len)
459 ret = gnutls_record_send(ssl->gnutls_state, buf, len);
460 ssl->last_error = ret;
470 int SSL_want(SSL * ssl)
476 /* SSL_METHOD functions */
478 SSL_METHOD *SSLv23_client_method(void)
481 m = (SSL_METHOD *) calloc(1, sizeof(SSL_METHOD));
485 strcpy(m->priority_string,
486 "NONE:+VERS-TLS1.0:+VERS-SSL3.0:+CIPHER-ALL:+COMP-ALL:+RSA:+DHE-RSA:+DHE-DSS:+MAC-ALL");
488 m->connend = GNUTLS_CLIENT;
493 SSL_METHOD *SSLv23_server_method(void)
496 m = (SSL_METHOD *) calloc(1, sizeof(SSL_METHOD));
500 strcpy(m->priority_string,
501 "NONE:+VERS-TLS1.0:+VERS-SSL3.0:+CIPHER-ALL:+COMP-ALL:+RSA:+DHE-RSA:+DHE-DSS:+MAC-ALL");
502 m->connend = GNUTLS_SERVER;
507 SSL_METHOD *SSLv3_client_method(void)
510 m = (SSL_METHOD *) calloc(1, sizeof(SSL_METHOD));
514 strcpy(m->priority_string,
515 "NONE:+VERS-SSL3.0:+CIPHER-ALL:+COMP-ALL:+RSA:+DHE-RSA:+DHE-DSS:+MAC-ALL");
516 m->connend = GNUTLS_CLIENT;
521 SSL_METHOD *SSLv3_server_method(void)
524 m = (SSL_METHOD *) calloc(1, sizeof(SSL_METHOD));
528 strcpy(m->priority_string,
529 "NONE:+VERS-SSL3.0:+CIPHER-ALL:+COMP-ALL:+RSA:+DHE-RSA:+DHE-DSS:+MAC-ALL");
530 m->connend = GNUTLS_SERVER;
535 SSL_METHOD *TLSv1_client_method(void)
538 m = (SSL_METHOD *) calloc(1, sizeof(SSL_METHOD));
542 strcpy(m->priority_string,
543 "NONE:+VERS-TLS1.0:+CIPHER-ALL:+COMP-ALL:+RSA:+DHE-RSA:+DHE-DSS:+MAC-ALL");
544 m->connend = GNUTLS_CLIENT;
549 SSL_METHOD *TLSv1_server_method(void)
552 m = (SSL_METHOD *) calloc(1, sizeof(SSL_METHOD));
556 strcpy(m->priority_string,
557 "NONE:+VERS-TLS1.0:+CIPHER-ALL:+COMP-ALL:+RSA:+DHE-RSA:+DHE-DSS:+MAC-ALL");
558 m->connend = GNUTLS_SERVER;
564 /* SSL_CIPHER functions */
566 SSL_CIPHER *SSL_get_current_cipher(SSL * ssl)
571 ssl->ciphersuite.version =
572 gnutls_protocol_get_version(ssl->gnutls_state);
573 ssl->ciphersuite.cipher = gnutls_cipher_get(ssl->gnutls_state);
574 ssl->ciphersuite.kx = gnutls_kx_get(ssl->gnutls_state);
575 ssl->ciphersuite.mac = gnutls_mac_get(ssl->gnutls_state);
576 ssl->ciphersuite.compression =
577 gnutls_compression_get(ssl->gnutls_state);
578 ssl->ciphersuite.cert =
579 gnutls_certificate_type_get(ssl->gnutls_state);
581 return &(ssl->ciphersuite);
584 const char *SSL_CIPHER_get_name(SSL_CIPHER * cipher)
589 return gnutls_cipher_suite_get_name(cipher->kx,
590 cipher->cipher, cipher->mac);
593 int SSL_CIPHER_get_bits(SSL_CIPHER * cipher, int *bits)
600 bit_result = (8 * gnutls_cipher_get_key_size(cipher->cipher));
608 const char *SSL_CIPHER_get_version(SSL_CIPHER * cipher)
615 ret = gnutls_protocol_get_name(cipher->version);
622 char *SSL_CIPHER_description(SSL_CIPHER * cipher, char *buf, int size)
633 tmpbuf = (char *) malloc(128);
638 if (snprintf(tmpbuf, tmpsize, "%s %s %s %s",
639 gnutls_protocol_get_name(cipher->version),
640 gnutls_kx_get_name(cipher->kx),
641 gnutls_cipher_get_name(cipher->cipher),
642 gnutls_mac_get_name(cipher->mac)) == -1) {
645 return (char *) "Buffer too small";
654 X509_NAME *X509_get_subject_name(const X509 * cert)
657 dn = (gnutls_x509_dn *) calloc(1, sizeof(gnutls_x509_dn));
658 if (gnutls_x509_extract_certificate_dn(cert, dn) < 0) {
665 X509_NAME *X509_get_issuer_name(const X509 * cert)
668 dn = (gnutls_x509_dn *) calloc(1, sizeof(gnutls_x509_dn));
669 if (gnutls_x509_extract_certificate_issuer_dn(cert, dn) < 0) {
676 char *X509_NAME_oneline(gnutls_x509_dn * name, char *buf, int len)
678 /* XXX openssl allocates buffer if buf == NULL */
683 snprintf(buf, len - 1,
684 "C=%s, ST=%s, L=%s, O=%s, OU=%s, CN=%s/Email=%s",
685 name->country, name->state_or_province_name,
686 name->locality_name, name->organization,
687 name->organizational_unit_name, name->common_name,
692 void X509_free(const X509 * cert)
694 /* only get certificates as const items */
700 void BIO_get_fd(gnutls_session_t gnutls_state, int *fd)
702 gnutls_transport_ptr_t tmp =
703 gnutls_transport_get_ptr(gnutls_state);
704 *fd = GNUTLS_POINTER_TO_INT(tmp);
707 BIO *BIO_new_socket(int sock, int close_flag)
711 bio = (BIO *) malloc(sizeof(BIO));
715 bio->fd = GNUTLS_INT_TO_POINTER(sock);
723 unsigned long ERR_get_error(void)
727 ret = -1 * last_error;
733 const char *ERR_error_string(unsigned long e, char *buf)
735 return gnutls_strerror(-1 * e);
741 int RAND_status(void)
746 void RAND_seed(const void *buf, int num)
750 int RAND_bytes(unsigned char *buf, int num)
752 gnutls_rnd(GNUTLS_RND_RANDOM, buf, num);
756 int RAND_pseudo_bytes(unsigned char *buf, int num)
758 gnutls_rnd(GNUTLS_RND_NONCE, buf, num);
762 const char *RAND_file_name(char *buf, size_t len)
767 int RAND_load_file(const char *name, long maxbytes)
772 int RAND_write_file(const char *name)
777 int RAND_egd_bytes(const char *path, int bytes)
784 /* message digest functions */
786 void MD5_Init(MD5_CTX * ctx)
789 ret = gnutls_hash_init((void *) &ctx->handle, GNUTLS_DIG_MD5);
794 void MD5_Update(MD5_CTX * ctx, const void *buf, int len)
796 gnutls_hash(ctx->handle, buf, len);
799 void MD5_Final(unsigned char *md, MD5_CTX * ctx)
801 gnutls_hash_deinit(ctx->handle, md);
804 unsigned char *MD5(const unsigned char *buf, unsigned long len,
810 gnutls_hash_fast(GNUTLS_DIG_MD5, buf, len, md);
815 void RIPEMD160_Init(RIPEMD160_CTX * ctx)
818 ret = gnutls_hash_init((void *) &ctx->handle, GNUTLS_DIG_RMD160);
823 void RIPEMD160_Update(RIPEMD160_CTX * ctx, const void *buf, int len)
825 gnutls_hash(ctx->handle, buf, len);
828 void RIPEMD160_Final(unsigned char *md, RIPEMD160_CTX * ctx)
830 gnutls_hash_deinit(ctx->handle, md);
833 unsigned char *RIPEMD160(const unsigned char *buf, unsigned long len,
839 gnutls_hash_fast(GNUTLS_DIG_RMD160, buf, len, md);