moved ca-certs.
[gnutls.git] / lib / gnutlsxx.cpp
blobcba0006938f70be5208a427faab29b2a2b41d510
1 /*
2 * Copyright (C) 2006-2012 Free Software Foundation, Inc.
4 * Author: Nikos Mavrogiannopoulos
6 * This file is part of GnuTLS.
8 * The GnuTLS is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public License
10 * as published by the Free Software Foundation; either version 3 of
11 * the License, or (at your option) any later version.
13 * This library is distributed in the hope that it will be useful, but
14 * WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public License
19 * along with this program. If not, see <http://www.gnu.org/licenses/>
23 #ifdef HAVE_CONFIG_H
24 # include <config.h>
25 #endif
27 #include <gnutls/gnutlsxx.h>
29 namespace gnutls
32 inline static int RETWRAP (int ret)
34 if (ret < 0)
35 throw (exception (ret));
36 return ret;
39 session::session (unsigned int flags)
41 RETWRAP (gnutls_init (&s, flags));
44 session::~session ()
46 gnutls_deinit (s);
49 int session::bye (gnutls_close_request_t how)
51 return RETWRAP (gnutls_bye (s, how));
54 int session::handshake ()
56 return RETWRAP (gnutls_handshake (s));
59 server_session::server_session ():session (GNUTLS_SERVER)
63 server_session::~server_session ()
67 int server_session::rehandshake ()
69 return RETWRAP (gnutls_rehandshake (s));
72 gnutls_alert_description_t session::get_alert () const
74 return gnutls_alert_get (s);
77 int session::send_alert (gnutls_alert_level_t level,
78 gnutls_alert_description_t desc)
80 return RETWRAP (gnutls_alert_send (s, level, desc));
83 int session::send_appropriate_alert (int err)
85 return RETWRAP (gnutls_alert_send_appropriate (s, err));
88 gnutls_cipher_algorithm_t session::get_cipher () const
90 return gnutls_cipher_get (s);
93 gnutls_kx_algorithm_t session::get_kx () const
95 return gnutls_kx_get (s);
98 gnutls_mac_algorithm_t session::get_mac () const
100 return gnutls_mac_get (s);
103 gnutls_compression_method_t session::get_compression () const
105 return gnutls_compression_get (s);
108 gnutls_certificate_type_t session::get_certificate_type () const
110 return gnutls_certificate_type_get (s);
113 void session::set_private_extensions (bool allow)
115 gnutls_handshake_set_private_extensions (s, (int) allow);
118 gnutls_handshake_description_t session::get_handshake_last_out () const
120 return gnutls_handshake_get_last_out (s);
123 gnutls_handshake_description_t session::get_handshake_last_in () const
125 return gnutls_handshake_get_last_in (s);
128 ssize_t session::send (const void *data, size_t sizeofdata)
130 return RETWRAP (gnutls_record_send (s, data, sizeofdata));
133 ssize_t session::recv (void *data, size_t sizeofdata)
135 return RETWRAP (gnutls_record_recv (s, data, sizeofdata));
138 bool session::get_record_direction () const
140 return gnutls_record_get_direction (s);
143 // maximum packet size
144 size_t session::get_max_size () const
146 return gnutls_record_get_max_size (s);
149 void session::set_max_size (size_t size)
151 RETWRAP (gnutls_record_set_max_size (s, size));
154 size_t session::check_pending () const
156 return gnutls_record_check_pending (s);
160 void session::prf (size_t label_size, const char *label,
161 int server_random_first,
162 size_t extra_size, const char *extra,
163 size_t outsize, char *out)
165 RETWRAP (gnutls_prf (s, label_size, label, server_random_first,
166 extra_size, extra, outsize, out));
169 void session::prf_raw (size_t label_size, const char *label,
170 size_t seed_size, const char *seed,
171 size_t outsize, char *out)
173 RETWRAP (gnutls_prf_raw
174 (s, label_size, label, seed_size, seed, outsize, out));
178 /* if you just want some defaults, use the following.
180 void session::set_priority (const char *prio, const char **err_pos)
182 RETWRAP (gnutls_priority_set_direct (s, prio, err_pos));
185 void session::set_priority (gnutls_priority_t p)
187 RETWRAP (gnutls_priority_set (s, p));
190 gnutls_protocol_t session::get_protocol_version () const
192 return gnutls_protocol_get_version (s);
195 void session::set_data (const void *session_data, size_t session_data_size)
197 RETWRAP (gnutls_session_set_data (s, session_data, session_data_size));
200 void session::get_data (void *session_data, size_t * session_data_size) const
202 RETWRAP (gnutls_session_get_data (s, session_data, session_data_size));
205 void session::get_data (gnutls_session_t session, gnutls_datum_t & data) const
207 RETWRAP (gnutls_session_get_data2 (s, &data));
211 void session::get_id (void *session_id, size_t * session_id_size) const
213 RETWRAP (gnutls_session_get_id (s, session_id, session_id_size));
216 bool session::is_resumed () const
218 int ret = gnutls_session_is_resumed (s);
220 return (ret != 0);
223 bool session::get_peers_certificate (std::vector < gnutls_datum_t >
224 &out_certs) const
226 const gnutls_datum_t *certs;
227 unsigned int certs_size;
229 certs = gnutls_certificate_get_peers (s, &certs_size);
231 if (certs == NULL)
232 return false;
234 for (unsigned int i = 0; i < certs_size; i++)
235 out_certs.push_back (certs[i]);
237 return true;
240 bool session::get_peers_certificate (const gnutls_datum_t ** certs,
241 unsigned int *certs_size) const
243 *certs = gnutls_certificate_get_peers (s, certs_size);
245 if (*certs == NULL)
246 return false;
247 return true;
250 void session::get_our_certificate (gnutls_datum_t & cert) const
252 const gnutls_datum_t *d;
254 d = gnutls_certificate_get_ours (s);
255 if (d == NULL)
256 throw (exception (GNUTLS_E_INVALID_REQUEST));
257 cert = *d;
260 time_t session::get_peers_certificate_activation_time () const
262 return gnutls_certificate_activation_time_peers (s);
265 time_t session::get_peers_certificate_expiration_time () const
267 return gnutls_certificate_expiration_time_peers (s);
269 void session::verify_peers_certificate (unsigned int &status) const
271 RETWRAP (gnutls_certificate_verify_peers2 (s, &status));
275 client_session::client_session ():session (GNUTLS_CLIENT)
279 client_session::~client_session ()
283 // client session
284 void client_session::set_server_name (gnutls_server_name_type_t type,
285 const void *name, size_t name_length)
287 RETWRAP (gnutls_server_name_set (s, type, name, name_length));
290 bool client_session::get_request_status ()
292 return RETWRAP (gnutls_certificate_client_get_request_status (s));
295 // server_session
296 void server_session::get_server_name (void *data, size_t * data_length,
297 unsigned int *type,
298 unsigned int indx) const
300 RETWRAP (gnutls_server_name_get (s, data, data_length, type, indx));
303 // internal DB stuff
304 static int store_function (void *_db, gnutls_datum_t key,
305 gnutls_datum_t data)
309 DB *db = static_cast < DB * >(_db);
311 if (db->store (key, data) == false)
312 return -1;
314 catch (...)
316 return -1;
319 return 0;
322 const static gnutls_datum_t null_datum = { NULL, 0 };
324 static gnutls_datum_t retrieve_function (void *_db, gnutls_datum_t key)
326 gnutls_datum_t data;
330 DB *db = static_cast < DB * >(_db);
332 if (db->retrieve (key, data) == false)
333 return null_datum;
336 catch (...)
338 return null_datum;
341 return data;
344 static int remove_function (void *_db, gnutls_datum_t key)
348 DB *db = static_cast < DB * >(_db);
350 if (db->remove (key) == false)
351 return -1;
353 catch (...)
355 return -1;
358 return 0;
361 void server_session::set_db (const DB & db)
363 gnutls_db_set_ptr (s, const_cast < DB * >(&db));
364 gnutls_db_set_store_function (s, store_function);
365 gnutls_db_set_retrieve_function (s, retrieve_function);
366 gnutls_db_set_remove_function (s, remove_function);
369 void server_session::set_db_cache_expiration (unsigned int seconds)
371 gnutls_db_set_cache_expiration (s, seconds);
374 void server_session::db_remove () const
376 gnutls_db_remove_session (s);
379 bool server_session::db_check_entry (gnutls_datum_t & session_data) const
381 int ret = gnutls_db_check_entry (s, session_data);
383 if (ret != 0)
384 return true;
385 return false;
388 void session::set_max_handshake_packet_length (size_t max)
390 gnutls_handshake_set_max_packet_length (s, max);
393 void session::clear_credentials ()
395 gnutls_credentials_clear (s);
398 void session::set_credentials (credentials & cred)
400 RETWRAP (gnutls_credentials_set (s, cred.get_type (), cred.ptr ()));
403 const char *server_session::get_srp_username () const
405 #ifdef ENABLE_SRP
406 return gnutls_srp_server_get_username (s);
407 #else
408 return NULL;
409 #endif
412 const char *server_session::get_psk_username () const
414 return gnutls_psk_server_get_username (s);
418 void session::set_transport_ptr (gnutls_transport_ptr_t ptr)
420 gnutls_transport_set_ptr (s, ptr);
423 void session::set_transport_ptr (gnutls_transport_ptr_t recv_ptr,
424 gnutls_transport_ptr_t send_ptr)
426 gnutls_transport_set_ptr2 (s, recv_ptr, send_ptr);
430 gnutls_transport_ptr_t session::get_transport_ptr () const
432 return gnutls_transport_get_ptr (s);
435 void session::get_transport_ptr (gnutls_transport_ptr_t & recv_ptr,
436 gnutls_transport_ptr_t & send_ptr) const
438 gnutls_transport_get_ptr2 (s, &recv_ptr, &send_ptr);
441 void session::set_transport_lowat (size_t num)
443 throw (exception (GNUTLS_E_UNIMPLEMENTED_FEATURE));
446 void session::set_transport_push_function (gnutls_push_func push_func)
448 gnutls_transport_set_push_function (s, push_func);
451 void session::set_transport_pull_function (gnutls_pull_func pull_func)
453 gnutls_transport_set_pull_function (s, pull_func);
456 void session::set_user_ptr (void *ptr)
458 gnutls_session_set_ptr (s, ptr);
461 void *session::get_user_ptr () const
463 return gnutls_session_get_ptr (s);
466 void session::send_openpgp_cert (gnutls_openpgp_crt_status_t status)
468 #ifdef ENABLE_OPENPGP
469 gnutls_openpgp_send_cert (s, status);
470 #endif
473 void session::set_dh_prime_bits (unsigned int bits)
475 gnutls_dh_set_prime_bits (s, bits);
478 unsigned int session::get_dh_secret_bits () const
480 return RETWRAP (gnutls_dh_get_secret_bits (s));
483 unsigned int session::get_dh_peers_public_bits () const
485 return RETWRAP (gnutls_dh_get_peers_public_bits (s));
488 unsigned int session::get_dh_prime_bits () const
490 return RETWRAP (gnutls_dh_get_prime_bits (s));
493 void session::get_dh_group (gnutls_datum_t & gen,
494 gnutls_datum_t & prime) const
496 RETWRAP (gnutls_dh_get_group (s, &gen, &prime));
499 void session::get_dh_pubkey (gnutls_datum_t & raw_key) const
501 RETWRAP (gnutls_dh_get_pubkey (s, &raw_key));
504 void session::get_rsa_export_pubkey (gnutls_datum_t & exponent,
505 gnutls_datum_t & modulus) const
507 RETWRAP (gnutls_rsa_export_get_pubkey (s, &exponent, &modulus));
510 unsigned int session::get_rsa_export_modulus_bits () const
512 return RETWRAP (gnutls_rsa_export_get_modulus_bits (s));
515 void server_session::
516 set_certificate_request (gnutls_certificate_request_t req)
518 gnutls_certificate_server_set_request (s, req);
521 gnutls_credentials_type_t session::get_auth_type () const
523 return gnutls_auth_get_type (s);
526 gnutls_credentials_type_t session::get_server_auth_type () const
528 return gnutls_auth_server_get_type (s);
531 gnutls_credentials_type_t session::get_client_auth_type () const
533 return gnutls_auth_client_get_type (s);
537 certificate_credentials::~certificate_credentials ()
539 gnutls_certificate_free_credentials (cred);
542 certificate_credentials::certificate_credentials ():credentials
543 (GNUTLS_CRD_CERTIFICATE)
545 RETWRAP (gnutls_certificate_allocate_credentials (&cred));
546 set_ptr (cred);
549 void certificate_server_credentials::
550 set_params_function (gnutls_params_function * func)
552 gnutls_certificate_set_params_function (cred, func);
555 anon_server_credentials::anon_server_credentials ():credentials
556 (GNUTLS_CRD_ANON)
558 RETWRAP (gnutls_anon_allocate_server_credentials (&cred));
559 set_ptr (cred);
562 anon_server_credentials::~anon_server_credentials ()
564 gnutls_anon_free_server_credentials (cred);
567 void anon_server_credentials::set_dh_params (const dh_params & params)
569 gnutls_anon_set_server_dh_params (cred, params.get_params_t ());
572 void anon_server_credentials::set_params_function (gnutls_params_function *
573 func)
575 gnutls_anon_set_server_params_function (cred, func);
578 anon_client_credentials::anon_client_credentials ():credentials
579 (GNUTLS_CRD_ANON)
581 RETWRAP (gnutls_anon_allocate_client_credentials (&cred));
582 set_ptr (cred);
585 anon_client_credentials::~anon_client_credentials ()
587 gnutls_anon_free_client_credentials (cred);
590 void certificate_credentials::free_keys ()
592 gnutls_certificate_free_keys (cred);
595 void certificate_credentials::free_cas ()
597 gnutls_certificate_free_cas (cred);
600 void certificate_credentials::free_ca_names ()
602 gnutls_certificate_free_ca_names (cred);
605 void certificate_credentials::free_crls ()
607 gnutls_certificate_free_crls (cred);
611 void certificate_credentials::set_dh_params (const dh_params & params)
613 gnutls_certificate_set_dh_params (cred, params.get_params_t ());
616 void certificate_credentials::
617 set_rsa_export_params (const rsa_params & params)
619 gnutls_certificate_set_rsa_export_params (cred, params.get_params_t ());
622 void certificate_credentials::set_verify_flags (unsigned int flags)
624 gnutls_certificate_set_verify_flags (cred, flags);
627 void certificate_credentials::set_verify_limits (unsigned int max_bits,
628 unsigned int max_depth)
630 gnutls_certificate_set_verify_limits (cred, max_bits, max_depth);
633 void certificate_credentials::set_x509_trust_file (const char *cafile,
634 gnutls_x509_crt_fmt_t
635 type)
637 RETWRAP (gnutls_certificate_set_x509_trust_file (cred, cafile, type));
640 void certificate_credentials::set_x509_trust (const gnutls_datum_t & CA,
641 gnutls_x509_crt_fmt_t type)
643 RETWRAP (gnutls_certificate_set_x509_trust_mem (cred, &CA, type));
647 void certificate_credentials::set_x509_crl_file (const char *crlfile,
648 gnutls_x509_crt_fmt_t type)
650 RETWRAP (gnutls_certificate_set_x509_crl_file (cred, crlfile, type));
653 void certificate_credentials::set_x509_crl (const gnutls_datum_t & CRL,
654 gnutls_x509_crt_fmt_t type)
656 RETWRAP (gnutls_certificate_set_x509_crl_mem (cred, &CRL, type));
659 void certificate_credentials::set_x509_key_file (const char *certfile,
660 const char *keyfile,
661 gnutls_x509_crt_fmt_t type)
663 RETWRAP (gnutls_certificate_set_x509_key_file
664 (cred, certfile, keyfile, type));
667 void certificate_credentials::set_x509_key (const gnutls_datum_t & CERT,
668 const gnutls_datum_t & KEY,
669 gnutls_x509_crt_fmt_t type)
671 RETWRAP (gnutls_certificate_set_x509_key_mem (cred, &CERT, &KEY, type));
674 void certificate_credentials::
675 set_simple_pkcs12_file (const char *pkcs12file,
676 gnutls_x509_crt_fmt_t type, const char *password)
678 RETWRAP (gnutls_certificate_set_x509_simple_pkcs12_file
679 (cred, pkcs12file, type, password));
682 void certificate_credentials::set_x509_key (gnutls_x509_crt_t * cert_list,
683 int cert_list_size,
684 gnutls_x509_privkey_t key)
686 RETWRAP (gnutls_certificate_set_x509_key
687 (cred, cert_list, cert_list_size, key));
690 void certificate_credentials::set_x509_trust (gnutls_x509_crt_t * ca_list,
691 int ca_list_size)
693 RETWRAP (gnutls_certificate_set_x509_trust (cred, ca_list, ca_list_size));
696 void certificate_credentials::set_x509_crl (gnutls_x509_crl_t * crl_list,
697 int crl_list_size)
699 RETWRAP (gnutls_certificate_set_x509_crl (cred, crl_list, crl_list_size));
702 void certificate_credentials::
703 set_retrieve_function (gnutls_certificate_retrieve_function * func)
705 gnutls_certificate_set_retrieve_function (cred, func);
708 // SRP
710 #ifdef ENABLE_SRP
712 srp_server_credentials::srp_server_credentials ():credentials
713 (GNUTLS_CRD_SRP)
715 RETWRAP (gnutls_srp_allocate_server_credentials (&cred));
716 set_ptr (cred);
719 srp_server_credentials::~srp_server_credentials ()
721 gnutls_srp_free_server_credentials (cred);
724 srp_client_credentials::srp_client_credentials ():credentials
725 (GNUTLS_CRD_SRP)
727 RETWRAP (gnutls_srp_allocate_client_credentials (&cred));
728 set_ptr (cred);
731 srp_client_credentials::~srp_client_credentials ()
733 gnutls_srp_free_client_credentials (cred);
736 void srp_client_credentials::set_credentials (const char *username,
737 const char *password)
739 RETWRAP (gnutls_srp_set_client_credentials (cred, username, password));
742 void srp_server_credentials::
743 set_credentials_file (const char *password_file,
744 const char *password_conf_file)
746 RETWRAP (gnutls_srp_set_server_credentials_file
747 (cred, password_file, password_conf_file));
750 void srp_server_credentials::
751 set_credentials_function (gnutls_srp_server_credentials_function * func)
753 gnutls_srp_set_server_credentials_function (cred, func);
756 void srp_client_credentials::
757 set_credentials_function (gnutls_srp_client_credentials_function * func)
759 gnutls_srp_set_client_credentials_function (cred, func);
762 #endif /* ENABLE_SRP */
764 // PSK
766 psk_server_credentials::psk_server_credentials ():credentials
767 (GNUTLS_CRD_PSK)
769 RETWRAP (gnutls_psk_allocate_server_credentials (&cred));
770 set_ptr (cred);
773 psk_server_credentials::~psk_server_credentials ()
775 gnutls_psk_free_server_credentials (cred);
778 void psk_server_credentials::
779 set_credentials_file (const char *password_file)
781 RETWRAP (gnutls_psk_set_server_credentials_file (cred, password_file));
784 void psk_server_credentials::
785 set_credentials_function (gnutls_psk_server_credentials_function * func)
787 gnutls_psk_set_server_credentials_function (cred, func);
790 void psk_server_credentials::set_dh_params (const dh_params & params)
792 gnutls_psk_set_server_dh_params (cred, params.get_params_t ());
795 void psk_server_credentials::set_params_function (gnutls_params_function *
796 func)
798 gnutls_psk_set_server_params_function (cred, func);
801 psk_client_credentials::psk_client_credentials ():credentials
802 (GNUTLS_CRD_PSK)
804 RETWRAP (gnutls_psk_allocate_client_credentials (&cred));
805 set_ptr (cred);
808 psk_client_credentials::~psk_client_credentials ()
810 gnutls_psk_free_client_credentials (cred);
813 void psk_client_credentials::set_credentials (const char *username,
814 const gnutls_datum_t & key,
815 gnutls_psk_key_flags flags)
817 RETWRAP (gnutls_psk_set_client_credentials (cred, username, &key, flags));
820 void psk_client_credentials::
821 set_credentials_function (gnutls_psk_client_credentials_function * func)
823 gnutls_psk_set_client_credentials_function (cred, func);
826 credentials::credentials (gnutls_credentials_type_t t):type (t),
827 cred (NULL)
831 gnutls_credentials_type_t credentials::get_type () const
833 return type;
836 void *credentials::ptr () const
838 return cred;
841 void credentials::set_ptr (void *ptr)
843 cred = ptr;
846 exception::exception (int x)
848 retcode = x;
851 int exception::get_code ()
853 return retcode;
856 const char *exception::what () const throw ()
858 return gnutls_strerror (retcode);
861 dh_params::dh_params ()
863 RETWRAP (gnutls_dh_params_init (&params));
866 dh_params::~dh_params ()
868 gnutls_dh_params_deinit (params);
871 void dh_params::import_raw (const gnutls_datum_t & prime,
872 const gnutls_datum_t & generator)
874 RETWRAP (gnutls_dh_params_import_raw (params, &prime, &generator));
877 void dh_params::import_pkcs3 (const gnutls_datum_t & pkcs3_params,
878 gnutls_x509_crt_fmt_t format)
880 RETWRAP (gnutls_dh_params_import_pkcs3 (params, &pkcs3_params, format));
883 void dh_params::generate (unsigned int bits)
885 RETWRAP (gnutls_dh_params_generate2 (params, bits));
888 void dh_params::export_pkcs3 (gnutls_x509_crt_fmt_t format,
889 unsigned char *params_data,
890 size_t * params_data_size)
892 RETWRAP (gnutls_dh_params_export_pkcs3
893 (params, format, params_data, params_data_size));
896 void dh_params::export_raw (gnutls_datum_t & prime,
897 gnutls_datum_t & generator)
899 RETWRAP (gnutls_dh_params_export_raw (params, &prime, &generator, NULL));
902 gnutls_dh_params_t dh_params::get_params_t () const
904 return params;
907 dh_params & dh_params::operator= (const dh_params & src)
909 dh_params *dst = new dh_params;
910 int ret;
912 ret = gnutls_dh_params_cpy (dst->params, src.params);
914 if (ret < 0)
916 delete dst;
917 throw (exception (ret));
920 return *dst;
923 // RSA
925 rsa_params::rsa_params ()
927 RETWRAP (gnutls_rsa_params_init (&params));
930 rsa_params::~rsa_params ()
932 gnutls_rsa_params_deinit (params);
935 void rsa_params::import_pkcs1 (const gnutls_datum_t & pkcs1_params,
936 gnutls_x509_crt_fmt_t format)
938 RETWRAP (gnutls_rsa_params_import_pkcs1 (params, &pkcs1_params, format));
941 void rsa_params::generate (unsigned int bits)
943 RETWRAP (gnutls_rsa_params_generate2 (params, bits));
946 void rsa_params::export_pkcs1 (gnutls_x509_crt_fmt_t format,
947 unsigned char *params_data,
948 size_t * params_data_size)
950 RETWRAP (gnutls_rsa_params_export_pkcs1
951 (params, format, params_data, params_data_size));
954 gnutls_rsa_params_t rsa_params::get_params_t () const
956 return params;
959 rsa_params & rsa_params::operator= (const rsa_params & src)
961 rsa_params *dst = new rsa_params;
962 int ret;
964 ret = gnutls_rsa_params_cpy (dst->params, src.params);
966 if (ret < 0)
968 delete dst;
969 throw (exception (ret));
972 return *dst;
975 void rsa_params::import_raw (const gnutls_datum_t & m,
976 const gnutls_datum_t & e,
977 const gnutls_datum_t & d,
978 const gnutls_datum_t & p,
979 const gnutls_datum_t & q,
980 const gnutls_datum_t & u)
983 RETWRAP (gnutls_rsa_params_import_raw (params, &m, &e, &d, &p, &q, &u));
987 void rsa_params::export_raw (gnutls_datum_t & m, gnutls_datum_t & e,
988 gnutls_datum_t & d, gnutls_datum_t & p,
989 gnutls_datum_t & q, gnutls_datum_t & u)
991 RETWRAP (gnutls_rsa_params_export_raw
992 (params, &m, &e, &d, &p, &q, &u, NULL));
995 } // namespace gnutls