summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikos Mavrogiannopoulos <nmav@gnutls.org>2006-06-01 19:49:00 +0000
committerNikos Mavrogiannopoulos <nmav@gnutls.org>2006-06-01 19:49:00 +0000
commit8ec8717386a7c342df92f05e489eec905f84e078 (patch)
tree78f6c1d7525bdfe3b1a3712ed1fa2743d9ba5672
parenta0a951f39af3d04a400b13d49009b84d11d4002f (diff)
downloadgnutls-8ec8717386a7c342df92f05e489eec905f84e078.tar.gz
Added a preliminary C++ interface.
-rw-r--r--NEWS2
-rw-r--r--configure.in3
-rw-r--r--includes/Makefile.am2
-rw-r--r--includes/gnutls/gnutlsxx.h384
-rw-r--r--lib/Makefile.am14
-rw-r--r--lib/gnutls_db.c6
-rw-r--r--lib/gnutlsxx.cpp980
7 files changed, 1384 insertions, 7 deletions
diff --git a/NEWS b/NEWS
index 09560ff911..7e14d8ddb6 100644
--- a/NEWS
+++ b/NEWS
@@ -3,7 +3,7 @@ Copyright (C) 2004, 2005, 2006 Simon Josefsson
Copyright (C) 2000, 2001, 2002, 2003, 2004 Nikos Mavroyanopoulos
See the end for copying conditions.
-* Version 1.4.1 (unreleased)
+* Version 1.5.0 (unreleased)
** API and ABI modifications:
No changes since last version.
diff --git a/configure.in b/configure.in
index 47e78d4fca..d8ef1e503c 100644
--- a/configure.in
+++ b/configure.in
@@ -20,7 +20,7 @@ dnl Process this file with autoconf to produce a configure script.
# along with GNUTLS; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-AC_INIT(gnutls, [1.4.1], [bug-gnutls@gnu.org])
+AC_INIT(gnutls, [1.5.0], [bug-gnutls@gnu.org])
AC_PREREQ(2.59)
AC_CANONICAL_TARGET
@@ -97,6 +97,7 @@ dnl Checks for programs.
AM_GNU_GETTEXT([external])
AM_GNU_GETTEXT_VERSION([0.14.5])
AC_PROG_CC
+AC_PROG_CXX
AC_PROG_LN_S
GTK_DOC_CHECK(1.1)
diff --git a/includes/Makefile.am b/includes/Makefile.am
index c9be0d20e3..b8dc90ace8 100644
--- a/includes/Makefile.am
+++ b/includes/Makefile.am
@@ -20,7 +20,7 @@
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
nobase_include_HEADERS = gnutls/extra.h gnutls/x509.h gnutls/pkcs12.h \
- gnutls/compat.h gnutls/openpgp.h
+ gnutls/compat.h gnutls/openpgp.h gnutls/gnutlsxx.h
if ENABLE_OPENSSL
nobase_include_HEADERS += gnutls/openssl.h
diff --git a/includes/gnutls/gnutlsxx.h b/includes/gnutls/gnutlsxx.h
new file mode 100644
index 0000000000..77f995ad20
--- /dev/null
+++ b/includes/gnutls/gnutlsxx.h
@@ -0,0 +1,384 @@
+#ifndef GNUTLSXX_H
+# define GNUTLSXX_H
+
+#include <exception>
+#include <vector>
+#include <gnutls/gnutls.h>
+
+namespace gnutls {
+
+class exception: public std::exception
+{
+ public:
+ exception( int x);
+ const char* what() const throw();
+ int get_code();
+ protected:
+ int retcode;
+};
+
+class dh_params
+{
+ public:
+ dh_params();
+ ~dh_params();
+ void import_raw( const gnutls_datum_t & prime,
+ const gnutls_datum_t & generator);
+ void import_pkcs3( const gnutls_datum_t & pkcs3_params,
+ gnutls_x509_crt_fmt_t format);
+ void generate( unsigned int bits);
+
+ void export_pkcs3( gnutls_x509_crt_fmt_t format, unsigned char *params_data, size_t * params_data_size);
+ void export_raw( gnutls_datum_t& prime, gnutls_datum_t &generator);
+
+ gnutls_dh_params_t get_params_t() const;
+ dh_params & operator=(const dh_params& src);
+ protected:
+ gnutls_dh_params_t params;
+};
+
+
+class rsa_params
+{
+ public:
+ rsa_params();
+ ~rsa_params();
+ void import_raw( const gnutls_datum_t & m,
+ const gnutls_datum_t & e,
+ const gnutls_datum_t & d,
+ const gnutls_datum_t & p,
+ const gnutls_datum_t & q,
+ const gnutls_datum_t & u);
+ void import_pkcs1( const gnutls_datum_t & pkcs1_params,
+ gnutls_x509_crt_fmt_t format);
+ void generate( unsigned int bits);
+
+ void export_pkcs1( gnutls_x509_crt_fmt_t format, unsigned char *params_data, size_t * params_data_size);
+ void export_raw( gnutls_datum_t & m, gnutls_datum_t & e,
+ gnutls_datum_t & d, gnutls_datum_t & p,
+ gnutls_datum_t & q, gnutls_datum_t & u);
+ gnutls_rsa_params_t get_params_t() const;
+ rsa_params & operator=(const rsa_params& src);
+
+ protected:
+ gnutls_rsa_params_t params;
+};
+
+enum priority_flag { ALL_CIPHERS, EXPORT_CIPHERS };
+
+class session
+{
+ protected:
+ gnutls_session_t s;
+ public:
+ session( gnutls_connection_end_t);
+ session( session& s);
+ virtual ~session();
+
+ int bye( gnutls_close_request_t how);
+ int handshake ();
+
+ gnutls_alert_description_t get_alert() const;
+
+ int send_alert ( gnutls_alert_level_t level,
+ gnutls_alert_description_t desc);
+ int send_appropriate_alert (int err);
+
+ gnutls_cipher_algorithm_t get_cipher() const;
+ gnutls_kx_algorithm_t get_kx () const;
+ gnutls_mac_algorithm_t get_mac () const;
+ gnutls_compression_method_t get_compression () const;
+ gnutls_certificate_type_t get_certificate_type() const;
+
+ // for the handshake
+ void set_private_extensions ( bool allow);
+
+ gnutls_handshake_description_t get_handshake_last_out() const;
+ gnutls_handshake_description_t get_handshake_last_in() const;
+
+ ssize_t send (const void *data, size_t sizeofdata);
+ ssize_t recv (void *data, size_t sizeofdata);
+
+ bool get_record_direction() const;
+
+ // maximum packet size
+ size_t get_max_size() const;
+ void set_max_size(size_t size);
+
+ size_t check_pending() const;
+
+ void prf (size_t label_size, const char *label,
+ int server_random_first,
+ size_t extra_size, const char *extra,
+ size_t outsize, char *out);
+
+ void prf_raw ( size_t label_size, const char *label,
+ size_t seed_size, const char *seed,
+ size_t outsize, char *out);
+
+ void set_cipher_priority (const int *list);
+ void set_mac_priority (const int *list);
+ void set_compression_priority (const int *list);
+ void set_kx_priority (const int *list);
+ void set_protocol_priority (const int *list);
+ void set_certificate_type_priority (const int *list);
+
+/* if you just want some defaults, use the following.
+ */
+ void set_default_priority (priority_flag flag);
+
+ gnutls_protocol_t get_protocol_version() const;
+
+ // for resuming sessions
+ void set_data ( const void *session_data,
+ size_t session_data_size);
+ void get_data (void *session_data,
+ size_t * session_data_size) const;
+ void get_data(gnutls_session_t session,
+ gnutls_datum_t & data) const;
+ void get_id ( void *session_id,
+ size_t * session_id_size) const;
+
+ bool is_resumed () const;
+
+ void set_max_handshake_packet_length ( size_t max);
+
+ void clear_credentials();
+ void set_credentials( class credentials & cred);
+
+ void set_transport_ptr( gnutls_transport_ptr_t ptr);
+ void set_transport_ptr( gnutls_transport_ptr_t recv_ptr, gnutls_transport_ptr_t send_ptr);
+ gnutls_transport_ptr_t get_transport_ptr() const;
+ void get_transport_ptr(gnutls_transport_ptr_t & recv_ptr,
+ gnutls_transport_ptr_t & send_ptr) const;
+
+ void set_transport_lowat (size_t num);
+ void set_transport_push_function( gnutls_push_func push_func);
+ void set_transport_pull_function( gnutls_pull_func pull_func);
+
+ void set_user_ptr( void* ptr);
+ void *get_user_ptr() const;
+
+ void send_openpgp_key( gnutls_openpgp_key_status_t status);
+
+ gnutls_credentials_type_t get_auth_type() const;
+ gnutls_credentials_type_t get_server_auth_type() const;
+ gnutls_credentials_type_t get_client_auth_type() const;
+
+ // informational stuff
+ void set_dh_prime_bits( unsigned int bits);
+ unsigned int get_dh_secret_bits() const;
+ unsigned int get_dh_peers_public_bits() const;
+ unsigned int get_dh_prime_bits() const;
+ void get_dh_group( gnutls_datum_t & gen, gnutls_datum_t & prime) const;
+ void get_dh_pubkey( gnutls_datum_t & raw_key) const;
+ void get_rsa_export_pubkey( gnutls_datum& exponent, gnutls_datum& modulus) const;
+ unsigned int get_rsa_export_modulus_bits() const;
+
+ void get_our_certificate(gnutls_datum & cert) const;
+ bool get_peers_certificate(std::vector<gnutls_datum_t> &out_certs) const;
+ bool get_peers_certificate(const gnutls_datum_t** certs, unsigned int *certs_size) const;
+
+ time_t get_peers_certificate_activation_time() const;
+ time_t get_peers_certificate_expiration_time() const;
+ void verify_peers_certificate( unsigned int& status) const;
+
+};
+
+// interface for databases
+class DB
+{
+ public:
+ virtual ~DB()=0;
+ virtual bool store( const gnutls_datum& key, const gnutls_datum& data)=0;
+ virtual bool retrieve( const gnutls_datum& key, gnutls_datum& data)=0;
+ virtual bool remove( const gnutls_datum& key)=0;
+};
+
+class server_session: public session
+{
+ public:
+ server_session();
+ void db_remove() const;
+
+ void set_db_cache_expiration (unsigned int seconds);
+ void set_db( const DB& db);
+
+ // returns true if session is expired
+ bool db_check_entry ( gnutls_datum_t &session_data) const;
+
+ // server side only
+ const char *get_srp_username() const;
+ const char *get_psk_username() const;
+
+ void get_server_name (void *data, size_t * data_length,
+ unsigned int *type, unsigned int indx) const;
+
+ int rehandshake();
+ void set_certificate_request( gnutls_certificate_request_t);
+};
+
+class client_session: public session
+{
+ public:
+ client_session();
+ void set_server_name (gnutls_server_name_type_t type,
+ const void *name, size_t name_length);
+
+ bool client_session::get_request_status();
+};
+
+
+class credentials
+{
+ public:
+ credentials(gnutls_credentials_type_t t);
+ credentials( credentials& c);
+ virtual ~credentials() { }
+ gnutls_credentials_type_t get_type() const;
+ protected:
+ friend class session;
+ virtual void* ptr() const=0;
+ virtual void set_ptr(void* ptr)=0;
+ gnutls_credentials_type_t type;
+};
+
+class certificate_credentials: public credentials
+{
+ public:
+ ~certificate_credentials();
+ certificate_credentials();
+
+ void free_keys ();
+ void free_cas ();
+ void free_ca_names ();
+ void free_crls ();
+
+ void set_dh_params ( const dh_params &params);
+ void set_rsa_export_params ( const rsa_params& params);
+ void set_verify_flags ( unsigned int flags);
+ void set_verify_limits ( unsigned int max_bits, unsigned int max_depth);
+
+ void set_x509_trust_file(const char *cafile, gnutls_x509_crt_fmt_t type);
+ void set_x509_trust(const gnutls_datum_t & CA, gnutls_x509_crt_fmt_t type);
+ // FIXME: use classes instead of gnutls_x509_crt_t
+ void set_x509_trust ( gnutls_x509_crt_t * ca_list, int ca_list_size);
+
+ void set_x509_crl_file( const char *crlfile, gnutls_x509_crt_fmt_t type);
+ void set_x509_crl(const gnutls_datum_t & CRL, gnutls_x509_crt_fmt_t type);
+ void set_x509_crl ( gnutls_x509_crl_t * crl_list, int crl_list_size);
+
+ void set_x509_key_file(const char *certfile, const char *KEYFILE, gnutls_x509_crt_fmt_t type);
+ void set_x509_key(const gnutls_datum_t & CERT, const gnutls_datum_t & KEY, gnutls_x509_crt_fmt_t type);
+ // FIXME: use classes
+ void set_x509_key ( gnutls_x509_crt_t * cert_list, int cert_list_size,
+ gnutls_x509_privkey_t key);
+
+
+ void set_simple_pkcs12_file( const char *pkcs12file,
+ gnutls_x509_crt_fmt_t type, const char *password);
+
+ protected:
+ void* ptr() const;
+ void set_ptr(void* p);
+ gnutls_certificate_credentials_t cred;
+};
+
+class certificate_server_credentials: public certificate_credentials
+{
+ certificate_server_credentials() { }
+ public:
+ void set_retrieve_function( gnutls_certificate_server_retrieve_function* func);
+ void set_params_function( gnutls_params_function* func);
+};
+
+class certificate_client_credentials: public certificate_credentials
+{
+ public:
+ certificate_client_credentials() { }
+ void set_retrieve_function( gnutls_certificate_client_retrieve_function* func);
+};
+
+
+
+
+class anon_server_credentials: public credentials
+{
+ public:
+ anon_server_credentials();
+ ~anon_server_credentials();
+ void set_dh_params ( const dh_params &params);
+ void set_params_function ( gnutls_params_function * func);
+ protected:
+ gnutls_anon_server_credentials_t cred;
+};
+
+class anon_client_credentials: public credentials
+{
+ public:
+ anon_client_credentials();
+ ~anon_client_credentials();
+ protected:
+ gnutls_anon_client_credentials_t cred;
+};
+
+
+class srp_server_credentials: public credentials
+{
+ public:
+ srp_server_credentials();
+ ~srp_server_credentials();
+ void set_credentials_file (const char *password_file, const char *password_conf_file);
+ void set_credentials_function( gnutls_srp_server_credentials_function *func);
+ protected:
+ void* ptr() const;
+ void set_ptr(void* p);
+ gnutls_srp_server_credentials_t cred;
+};
+
+class srp_client_credentials: public credentials
+{
+ public:
+ srp_client_credentials();
+ ~srp_client_credentials();
+ void set_credentials (const char *username, const char *password);
+ void set_credentials_function( gnutls_srp_client_credentials_function* func);
+ protected:
+ void* ptr() const;
+ void set_ptr(void* p);
+ gnutls_srp_client_credentials_t cred;
+};
+
+
+class psk_server_credentials: public credentials
+{
+ public:
+ psk_server_credentials();
+ ~psk_server_credentials();
+ void set_credentials_file(const char* password_file);
+ void set_credentials_function( gnutls_psk_server_credentials_function* func);
+ void set_dh_params ( const dh_params &params);
+ void set_params_function (gnutls_params_function * func);
+ protected:
+ void* ptr() const;
+ void set_ptr(void* p);
+ gnutls_psk_server_credentials_t cred;
+};
+
+class psk_client_credentials: public credentials
+{
+ public:
+ psk_client_credentials();
+ ~psk_client_credentials();
+ void set_credentials (const char *username, const gnutls_datum_t& key, gnutls_psk_key_flags flags);
+ void set_credentials_function( gnutls_psk_client_credentials_function* func);
+ protected:
+ void* ptr() const;
+ void set_ptr(void* p);
+ gnutls_psk_client_credentials_t cred;
+};
+
+
+}; /* namespace */
+
+#endif /* GNUTLSXX_H */
diff --git a/lib/Makefile.am b/lib/Makefile.am
index c7554cc6cb..0f1432696e 100644
--- a/lib/Makefile.am
+++ b/lib/Makefile.am
@@ -27,6 +27,8 @@ endif
localedir = $(datadir)/locale
+AM_CXXFLAGS = -I$(top_srcdir)/includes/
+
AM_CPPFLAGS = -DLOCALEDIR=\"$(localedir)\" \
-I$(top_srcdir)/gl \
-I$(top_srcdir)/includes -I../includes \
@@ -52,7 +54,7 @@ pkgconfig_DATA = gnutls.pc
DISTCLEANFILES = $(pkgconfig_DATA)
EXTRA_DIST = gnutls-api.texi
-lib_LTLIBRARIES = libgnutls.la
+lib_LTLIBRARIES = libgnutls.la libgnutlsxx.la
SRP_COBJECTS = ext_srp.c gnutls_srp.c auth_srp.c auth_srp_passwd.c \
auth_srp_sb64.c auth_srp_rsa.c
@@ -92,6 +94,8 @@ HFILES = debug.h gnutls_compress.h defines.h gnutls_cipher.h \
gnutls_helper.h auth_psk.h auth_psk_passwd.h \
ext_inner_application.h
+CPP_OBJECTS = gnutlsxx.cpp
+
# Separate so we can create the documentation
libgnutls_la_SOURCES = $(HFILES) $(COBJECTS) $(SRP_COBJECTS) \
@@ -113,6 +117,14 @@ else
libgnutls_la_LDFLAGS += $(LIBTASN1_LIBS)
endif
+libgnutlsxx_la_SOURCES = $(CPP_OBJECTS)
+
+libgnutlsxx_la_LDFLAGS = -no-undefined \
+ -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE)
+
+libgnutlsxx_la_LIBADD = libgnutls.la
+
+
pkix_asn1_tab.c: pkix.asn
-asn1Parser pkix.asn pkix_asn1_tab.c
diff --git a/lib/gnutls_db.c b/lib/gnutls_db.c
index 0e2abaf122..fe3de43469 100644
--- a/lib/gnutls_db.c
+++ b/lib/gnutls_db.c
@@ -46,7 +46,7 @@
* The datum's data must be allocated using the function
* gnutls_malloc().
*
- * The first argument to store_function() will be null unless gnutls_db_set_ptr()
+ * The first argument to retr_func() will be null unless gnutls_db_set_ptr()
* has been called.
*
**/
@@ -65,7 +65,7 @@ gnutls_db_set_retrieve_function (gnutls_session_t session,
* 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_function() will be null unless gnutls_db_set_ptr()
+ * The first argument to rem_func() will be null unless gnutls_db_set_ptr()
* has been called.
*
**/
@@ -84,7 +84,7 @@ gnutls_db_set_remove_function (gnutls_session_t session,
* Sets the function that will be used to store data from the resumed
* sessions database. This function must remove 0 on success.
*
- * The first argument to store_function() will be null unless gnutls_db_set_ptr()
+ * The first argument to store_func() will be null unless gnutls_db_set_ptr()
* has been called.
*
**/
diff --git a/lib/gnutlsxx.cpp b/lib/gnutlsxx.cpp
new file mode 100644
index 0000000000..28c040cb03
--- /dev/null
+++ b/lib/gnutlsxx.cpp
@@ -0,0 +1,980 @@
+#include <gnutls/gnutlsxx.h>
+
+using namespace gnutls;
+
+inline int RETWRAP_NET(int ret)
+{
+ if (gnutls_error_is_fatal(ret)) throw(exception(ret));
+ else return ret;
+}
+
+inline int RETWRAP(int ret)
+{
+ if (ret < 0) throw(exception(ret));
+ return ret;
+}
+
+session::session( gnutls_connection_end_t end)
+{
+ RETWRAP(gnutls_init( &this->s, end));
+}
+
+session::session( session& s)
+{
+ this->s = s.s;
+}
+
+session::~session()
+{
+ gnutls_deinit( this->s);
+}
+
+int session::bye( gnutls_close_request_t how)
+{
+ return RETWRAP_NET( gnutls_bye( this->s, how));
+}
+
+int session::handshake ()
+{
+ return RETWRAP_NET( gnutls_handshake( this->s));
+}
+
+
+server_session::server_session() : session( GNUTLS_SERVER)
+{
+}
+
+int server_session::rehandshake()
+{
+ return RETWRAP_NET( gnutls_rehandshake( this->s));
+}
+
+gnutls_alert_description_t session::get_alert() const
+{
+ return gnutls_alert_get( this->s);
+}
+
+int session::send_alert ( gnutls_alert_level_t level,
+ gnutls_alert_description_t desc)
+{
+ return RETWRAP_NET(gnutls_alert_send( this->s, level, desc));
+}
+
+int session::send_appropriate_alert (int err)
+{
+ return RETWRAP_NET(gnutls_alert_send_appropriate( this->s, err));
+}
+
+gnutls_cipher_algorithm_t session::get_cipher() const
+{
+ return gnutls_cipher_get( this->s);
+}
+
+gnutls_kx_algorithm_t session::get_kx () const
+{
+ return gnutls_kx_get( this->s);
+}
+
+gnutls_mac_algorithm_t session::get_mac () const
+{
+ return gnutls_mac_get( this->s);
+}
+
+gnutls_compression_method_t session::get_compression() const
+{
+ return gnutls_compression_get( this->s);
+}
+
+gnutls_certificate_type_t session::get_certificate_type() const
+{
+ return gnutls_certificate_type_get( this->s);
+}
+
+void session::set_private_extensions ( bool allow)
+{
+ gnutls_handshake_set_private_extensions( this->s, (int)allow);
+}
+
+gnutls_handshake_description_t session::get_handshake_last_out() const
+{
+ return gnutls_handshake_get_last_out( this->s);
+}
+
+gnutls_handshake_description_t session::get_handshake_last_in() const
+{
+ return gnutls_handshake_get_last_in( this->s);
+}
+
+ssize_t session::send (const void *data, size_t sizeofdata)
+{
+ return RETWRAP_NET(gnutls_record_send( this->s, data, sizeofdata));
+}
+
+ssize_t session::recv (void *data, size_t sizeofdata)
+{
+ return RETWRAP_NET(gnutls_record_recv( this->s, data, sizeofdata));
+}
+
+bool session::get_record_direction() const
+{
+ return gnutls_record_get_direction(this->s);
+}
+
+ // maximum packet size
+size_t session::get_max_size () const
+{
+ return gnutls_record_get_max_size( this->s);
+}
+
+void session::set_max_size(size_t size)
+{
+ RETWRAP( gnutls_record_set_max_size( this->s, size));
+}
+
+size_t session::check_pending () const
+{
+ return gnutls_record_check_pending( this->s);
+}
+
+
+void session::prf (size_t label_size, const char *label,
+ int server_random_first,
+ size_t extra_size, const char *extra,
+ size_t outsize, char *out)
+{
+ RETWRAP(gnutls_prf( this->s, label_size, label, server_random_first,
+ extra_size, extra, outsize, out));
+}
+
+void session::prf_raw ( size_t label_size, const char *label,
+ size_t seed_size, const char *seed,
+ size_t outsize, char *out)
+{
+ RETWRAP( gnutls_prf_raw( this->s, label_size, label, seed_size, seed, outsize, out));
+}
+
+
+void session::set_cipher_priority (const int *list)
+{
+ RETWRAP( gnutls_cipher_set_priority( this->s, list));
+}
+
+void session::set_mac_priority (const int *list)
+{
+ RETWRAP( gnutls_mac_set_priority( this->s, list));
+}
+
+void session::set_compression_priority (const int *list)
+{
+ RETWRAP( gnutls_compression_set_priority( this->s, list));
+}
+
+void session::set_kx_priority (const int *list)
+{
+ RETWRAP( gnutls_kx_set_priority( this->s, list));
+}
+
+void session::set_protocol_priority (const int *list)
+{
+ RETWRAP( gnutls_protocol_set_priority( this->s, list));
+}
+
+void session::set_certificate_type_priority (const int *list)
+{
+ RETWRAP( gnutls_certificate_type_set_priority( this->s, list));
+}
+
+
+/* if you just want some defaults, use the following.
+ */
+void session::set_default_priority(priority_flag flag)
+{
+ if (flag == EXPORT_CIPHERS)
+ RETWRAP( gnutls_set_default_export_priority( this->s));
+ else
+ RETWRAP( gnutls_set_default_priority( this->s));
+}
+
+gnutls_protocol_t session::get_protocol_version() const
+{
+ return gnutls_protocol_get_version( this->s);
+}
+
+void session::set_data ( const void *session_data,
+ size_t session_data_size)
+{
+ RETWRAP(gnutls_session_set_data( this->s, session_data, session_data_size));
+}
+
+void session::get_data (void *session_data,
+ size_t * session_data_size) const
+{
+ RETWRAP(gnutls_session_get_data( this->s, session_data, session_data_size));
+}
+
+void session::get_data(gnutls_session_t session,
+ gnutls_datum_t & data) const
+{
+ RETWRAP(gnutls_session_get_data2( this->s, &data));
+
+}
+
+void session::get_id ( void *session_id,
+ size_t * session_id_size) const
+{
+ RETWRAP( gnutls_session_get_id( this->s, session_id, session_id_size));
+}
+
+bool session::is_resumed() const
+{
+ int ret = gnutls_session_is_resumed( this->s);
+
+ if (ret != 0) return true;
+ return false;
+}
+
+
+bool session::get_peers_certificate(std::vector<gnutls_datum_t> &out_certs) const
+{
+ const gnutls_datum_t *certs;
+ unsigned int certs_size;
+
+ certs = gnutls_certificate_get_peers (this->s, &certs_size);
+
+ if (certs==NULL) return false;
+
+ for(unsigned int i=0;i<certs_size;i++)
+ out_certs.push_back( certs[i]);
+
+ return true;
+}
+
+bool session::get_peers_certificate(const gnutls_datum_t** certs, unsigned int *certs_size) const
+{
+ *certs = gnutls_certificate_get_peers (this->s, certs_size);
+
+ if (*certs==NULL) return false;
+ return true;
+}
+
+void session::get_our_certificate(gnutls_datum& cert) const
+{
+const gnutls_datum_t *d;
+
+ d = gnutls_certificate_get_ours(this->s);
+ if (d==NULL)
+ throw(exception( GNUTLS_E_INVALID_REQUEST));
+ cert = *d;
+}
+
+time_t session::get_peers_certificate_activation_time() const
+{
+ return gnutls_certificate_activation_time_peers( this->s);
+}
+
+time_t session::get_peers_certificate_expiration_time() const
+{
+ return gnutls_certificate_expiration_time_peers( this->s);
+}
+void session::verify_peers_certificate( unsigned int& status) const
+{
+ RETWRAP( gnutls_certificate_verify_peers2( this->s, &status));
+}
+
+
+client_session::client_session() : session( GNUTLS_CLIENT)
+{
+}
+
+// client session
+void client_session::set_server_name (gnutls_server_name_type_t type,
+ const void *name, size_t name_length)
+{
+ RETWRAP( gnutls_server_name_set( this->s, type, name, name_length));
+}
+
+bool client_session::get_request_status()
+{
+ return RETWRAP(gnutls_certificate_client_get_request_status (this->s));
+}
+
+// server_session
+void server_session::get_server_name (void *data, size_t * data_length,
+ unsigned int *type, unsigned int indx) const
+{
+ RETWRAP( gnutls_server_name_get( this->s, data, data_length, type, indx));
+}
+
+// internal DB stuff
+static int store_function(void *_db, gnutls_datum_t key, gnutls_datum_t data)
+{
+ try {
+ DB* db = static_cast<DB*>(_db);
+
+ if (db->store( key, data)==false) return -1;
+ } catch(...) {
+ return -1;
+ }
+
+ return 0;
+}
+
+const static gnutls_datum_t null_datum = { NULL, 0 };
+
+static gnutls_datum_t retrieve_function(void *_db, gnutls_datum_t key)
+{
+ gnutls_datum_t data;
+
+ try {
+ DB* db = static_cast<DB*>(_db);
+
+ if (db->retrieve( key, data)==false) return null_datum;
+
+ } catch(...) {
+ return null_datum;
+ }
+
+ return data;
+}
+
+static int remove_function(void *_db, gnutls_datum_t key)
+{
+ try {
+ DB* db = static_cast<DB*>(_db);
+
+ if (db->remove( key)==false) return -1;
+ } catch(...) {
+ return -1;
+ }
+
+ return 0;
+}
+
+void server_session::set_db( const DB& db)
+{
+ gnutls_db_set_ptr( this->s, const_cast<DB*>(&db));
+ gnutls_db_set_store_function( this->s, store_function);
+ gnutls_db_set_retrieve_function( this->s, retrieve_function);
+ gnutls_db_set_remove_function( this->s, remove_function);
+}
+
+void server_session::set_db_cache_expiration (unsigned int seconds)
+{
+ gnutls_db_set_cache_expiration( this->s, seconds);
+}
+
+void server_session::db_remove () const
+{
+ gnutls_db_remove_session( this->s);
+}
+
+bool server_session::db_check_entry ( gnutls_datum_t &session_data) const
+{
+ int ret = gnutls_db_check_entry( this->s, session_data);
+
+ if (ret != 0) return true;
+ return false;
+}
+
+void session::set_max_handshake_packet_length ( size_t max)
+{
+ gnutls_handshake_set_max_packet_length( this->s, max);
+}
+
+void session::clear_credentials()
+{
+ gnutls_credentials_clear( this->s);
+}
+
+void session::set_credentials( credentials &cred)
+{
+ RETWRAP(gnutls_credentials_set( this->s, cred.get_type(), cred.ptr()));
+}
+
+const char* server_session::get_srp_username() const
+{
+ return gnutls_srp_server_get_username( this->s);
+}
+
+const char* server_session::get_psk_username() const
+{
+ return gnutls_psk_server_get_username( this->s);
+}
+
+
+void session::set_transport_ptr( gnutls_transport_ptr_t ptr)
+{
+ gnutls_transport_set_ptr( this->s, ptr);
+}
+
+void session::set_transport_ptr( gnutls_transport_ptr_t recv_ptr, gnutls_transport_ptr_t send_ptr)
+{
+ gnutls_transport_set_ptr2( this->s, recv_ptr, send_ptr);
+}
+
+
+gnutls_transport_ptr_t session::get_transport_ptr () const
+{
+ return gnutls_transport_get_ptr (this->s);
+}
+
+void session::get_transport_ptr( gnutls_transport_ptr_t & recv_ptr,
+ gnutls_transport_ptr_t & send_ptr) const
+{
+ gnutls_transport_get_ptr2 (this->s, &recv_ptr, &send_ptr);
+}
+
+void session::set_transport_lowat( size_t num)
+{
+ gnutls_transport_set_lowat (this->s, num);
+}
+
+void session::set_transport_push_function( gnutls_push_func push_func)
+{
+ gnutls_transport_set_push_function ( this->s, push_func);
+}
+
+void session::set_transport_pull_function( gnutls_pull_func pull_func)
+{
+ gnutls_transport_set_pull_function ( this->s, pull_func);
+}
+
+void session::set_user_ptr( void* ptr)
+{
+ gnutls_session_set_ptr( this->s, ptr);
+}
+
+void* session::get_user_ptr( ) const
+{
+ return gnutls_session_get_ptr(this->s);
+}
+
+void session::send_openpgp_key( gnutls_openpgp_key_status_t status)
+{
+ gnutls_openpgp_send_key(this->s, status);
+}
+
+
+void session::set_dh_prime_bits( unsigned int bits)
+{
+ gnutls_dh_set_prime_bits( this->s, bits);
+}
+
+unsigned int session::get_dh_secret_bits() const
+{
+ return RETWRAP( gnutls_dh_get_secret_bits( this->s));
+}
+
+unsigned int session::get_dh_peers_public_bits() const
+{
+ return RETWRAP(gnutls_dh_get_peers_public_bits( this->s));
+}
+
+unsigned int session::get_dh_prime_bits() const
+{
+ return RETWRAP( gnutls_dh_get_prime_bits( this->s));
+}
+
+void session::get_dh_group( gnutls_datum_t & gen, gnutls_datum_t & prime) const
+{
+ RETWRAP( gnutls_dh_get_group( this->s, &gen, &prime));
+}
+
+void session::get_dh_pubkey( gnutls_datum_t & raw_key) const
+{
+ RETWRAP(gnutls_dh_get_pubkey( this->s, &raw_key));
+}
+
+void session::get_rsa_export_pubkey( gnutls_datum& exponent, gnutls_datum& modulus) const
+{
+ RETWRAP( gnutls_rsa_export_get_pubkey( this->s, &exponent, &modulus));
+}
+
+unsigned int session::get_rsa_export_modulus_bits() const
+{
+ return RETWRAP(gnutls_rsa_export_get_modulus_bits( this->s));
+}
+
+void server_session::set_certificate_request( gnutls_certificate_request_t req)
+{
+ gnutls_certificate_server_set_request (this->s, req);
+}
+
+
+
+
+gnutls_credentials_type_t session::get_auth_type() const
+{
+ return gnutls_auth_get_type( this->s);
+}
+
+gnutls_credentials_type_t session::get_server_auth_type() const
+{
+ return gnutls_auth_server_get_type( this->s);
+}
+
+gnutls_credentials_type_t session::get_client_auth_type() const
+{
+ return gnutls_auth_client_get_type( this->s);
+}
+
+
+void* certificate_credentials::ptr() const
+{
+ return this->cred;
+}
+
+void certificate_credentials::set_ptr(void* p)
+{
+ this->cred = static_cast<gnutls_certificate_credentials_t> (p);
+}
+
+certificate_credentials::~certificate_credentials()
+{
+ gnutls_certificate_free_credentials (this->cred);
+}
+
+certificate_credentials::certificate_credentials() : credentials(GNUTLS_CRD_CERTIFICATE)
+{
+ RETWRAP(gnutls_certificate_allocate_credentials ( &this->cred));
+}
+
+void certificate_server_credentials::set_params_function( gnutls_params_function* func)
+{
+ gnutls_certificate_set_params_function( this->cred, func);
+}
+
+anon_server_credentials::anon_server_credentials() : credentials(GNUTLS_CRD_ANON)
+{
+ RETWRAP(gnutls_anon_allocate_server_credentials( &this->cred));
+}
+
+anon_server_credentials::~anon_server_credentials()
+{
+ gnutls_anon_free_server_credentials( this->cred);
+}
+
+void anon_server_credentials::set_dh_params( const dh_params& params)
+{
+ gnutls_anon_set_server_dh_params (this->cred, params.get_params_t());
+}
+
+void anon_server_credentials::set_params_function ( gnutls_params_function * func)
+{
+ gnutls_anon_set_server_params_function ( this->cred, func);
+}
+
+anon_client_credentials::anon_client_credentials() : credentials(GNUTLS_CRD_ANON)
+{
+ RETWRAP(gnutls_anon_allocate_client_credentials( &this->cred));
+}
+
+anon_client_credentials::~anon_client_credentials()
+{
+ gnutls_anon_free_client_credentials( this->cred);
+}
+
+void certificate_credentials::free_keys ()
+{
+ gnutls_certificate_free_keys( this->cred);
+}
+
+void certificate_credentials::free_cas ()
+{
+ gnutls_certificate_free_cas( this->cred);
+}
+
+void certificate_credentials::free_ca_names ()
+{
+ gnutls_certificate_free_ca_names( this->cred);
+}
+
+void certificate_credentials::free_crls ()
+{
+ gnutls_certificate_free_crls( this->cred);
+}
+
+
+void certificate_credentials::set_dh_params ( const dh_params& params)
+{
+ gnutls_certificate_set_dh_params( this->cred, params.get_params_t());
+}
+
+void certificate_credentials::set_rsa_export_params ( const rsa_params & params)
+{
+ gnutls_certificate_set_rsa_export_params( this->cred, params.get_params_t());
+}
+
+void certificate_credentials::set_verify_flags ( unsigned int flags)
+{
+ gnutls_certificate_set_verify_flags( this->cred, flags);
+}
+
+void certificate_credentials::set_verify_limits ( unsigned int max_bits, unsigned int max_depth)
+{
+ gnutls_certificate_set_verify_limits( this->cred, max_bits, max_depth);
+}
+
+void certificate_credentials::set_x509_trust_file(const char *cafile, gnutls_x509_crt_fmt_t type)
+{
+ RETWRAP( gnutls_certificate_set_x509_trust_file( this->cred, cafile, type));
+}
+
+void certificate_credentials::set_x509_trust(const gnutls_datum_t & CA, gnutls_x509_crt_fmt_t type)
+{
+ RETWRAP( gnutls_certificate_set_x509_trust_mem( this->cred, &CA, type));
+}
+
+
+void certificate_credentials::set_x509_crl_file( const char *crlfile, gnutls_x509_crt_fmt_t type)
+{
+ RETWRAP( gnutls_certificate_set_x509_crl_file( this->cred, crlfile, type));
+}
+
+void certificate_credentials::set_x509_crl(const gnutls_datum_t & CRL, gnutls_x509_crt_fmt_t type)
+{
+ RETWRAP( gnutls_certificate_set_x509_crl_mem( this->cred, &CRL, type));
+}
+
+void certificate_credentials::set_x509_key_file(const char *certfile, const char *keyfile, gnutls_x509_crt_fmt_t type)
+{
+ RETWRAP( gnutls_certificate_set_x509_key_file( this->cred, certfile, keyfile, type));
+}
+
+void certificate_credentials::set_x509_key(const gnutls_datum_t & CERT, const gnutls_datum_t & KEY, gnutls_x509_crt_fmt_t type)
+{
+ RETWRAP( gnutls_certificate_set_x509_key_mem( this->cred, &CERT, &KEY, type));
+}
+
+void certificate_credentials::set_simple_pkcs12_file( const char *pkcs12file,
+ gnutls_x509_crt_fmt_t type, const char *password)
+{
+ RETWRAP( gnutls_certificate_set_x509_simple_pkcs12_file( this->cred, pkcs12file, type, password));
+}
+
+void certificate_credentials::set_x509_key ( gnutls_x509_crt_t * cert_list, int cert_list_size,
+ gnutls_x509_privkey_t key)
+{
+ RETWRAP( gnutls_certificate_set_x509_key( this->cred, cert_list, cert_list_size, key));
+}
+
+void certificate_credentials::set_x509_trust ( gnutls_x509_crt_t * ca_list, int ca_list_size)
+{
+ RETWRAP( gnutls_certificate_set_x509_trust( this->cred, ca_list, ca_list_size));
+}
+
+void certificate_credentials::set_x509_crl ( gnutls_x509_crl_t * crl_list, int crl_list_size)
+{
+ RETWRAP( gnutls_certificate_set_x509_crl( this->cred, crl_list, crl_list_size));
+}
+
+void certificate_server_credentials::set_retrieve_function( gnutls_certificate_server_retrieve_function* func)
+{
+ gnutls_certificate_server_set_retrieve_function( this->cred, func);
+}
+
+void certificate_client_credentials::set_retrieve_function( gnutls_certificate_client_retrieve_function* func)
+{
+ gnutls_certificate_client_set_retrieve_function( this->cred, func);
+}
+
+// SRP
+
+srp_server_credentials::srp_server_credentials() : credentials(GNUTLS_CRD_SRP)
+{
+ RETWRAP(gnutls_srp_allocate_server_credentials( &this->cred));
+}
+
+srp_server_credentials::~srp_server_credentials()
+{
+ gnutls_srp_free_server_credentials( this->cred);
+}
+
+void* srp_server_credentials::ptr() const
+{
+ return this->cred;
+}
+
+void srp_server_credentials::set_ptr(void* p)
+{
+ this->cred = static_cast<gnutls_srp_server_credentials_t> (p);
+}
+
+srp_client_credentials::srp_client_credentials() : credentials(GNUTLS_CRD_SRP)
+{
+ RETWRAP(gnutls_srp_allocate_client_credentials( &this->cred));
+}
+
+srp_client_credentials::~srp_client_credentials()
+{
+ gnutls_srp_free_client_credentials( this->cred);
+}
+
+void* srp_client_credentials::ptr() const
+{
+ return this->cred;
+}
+
+void srp_client_credentials::set_ptr(void* p)
+{
+ this->cred = static_cast<gnutls_srp_client_credentials_t> (p);
+}
+
+void srp_client_credentials::set_credentials( const char* username, const char* password)
+{
+ RETWRAP(gnutls_srp_set_client_credentials (this->cred, username, password));
+}
+
+void srp_server_credentials::set_credentials_file (
+ const char *password_file, const char *password_conf_file)
+{
+ RETWRAP( gnutls_srp_set_server_credentials_file( this->cred, password_file, password_conf_file));
+}
+
+
+void srp_server_credentials::set_credentials_function(gnutls_srp_server_credentials_function * func)
+{
+ gnutls_srp_set_server_credentials_function( this->cred, func);
+}
+
+void srp_client_credentials::set_credentials_function(gnutls_srp_client_credentials_function * func)
+{
+ gnutls_srp_set_client_credentials_function( this->cred, func);
+}
+
+// PSK
+
+psk_server_credentials::psk_server_credentials() : credentials(GNUTLS_CRD_PSK)
+{
+ RETWRAP(gnutls_psk_allocate_server_credentials( &this->cred));
+}
+
+psk_server_credentials::~psk_server_credentials()
+{
+ gnutls_psk_free_server_credentials( this->cred);
+}
+
+void* psk_server_credentials::ptr() const
+{
+ return this->cred;
+}
+
+void psk_server_credentials::set_ptr(void* p)
+{
+ this->cred = static_cast<gnutls_psk_server_credentials_t> (p);
+}
+
+void psk_server_credentials::set_credentials_file(const char* password_file)
+{
+ RETWRAP(gnutls_psk_set_server_credentials_file( this->cred, password_file));
+}
+
+void psk_server_credentials::set_credentials_function(gnutls_psk_server_credentials_function * func)
+{
+ gnutls_psk_set_server_credentials_function( this->cred, func);
+}
+
+void psk_server_credentials::set_dh_params( const dh_params &params)
+{
+ gnutls_psk_set_server_dh_params( this->cred, params.get_params_t());
+}
+
+void psk_server_credentials::set_params_function(gnutls_params_function * func)
+{
+ gnutls_psk_set_server_params_function (this->cred, func);
+}
+
+
+
+psk_client_credentials::psk_client_credentials() : credentials(GNUTLS_CRD_PSK)
+{
+ RETWRAP(gnutls_psk_allocate_client_credentials( &this->cred));
+}
+
+psk_client_credentials::~psk_client_credentials()
+{
+ gnutls_psk_free_client_credentials( this->cred);
+}
+
+void* psk_client_credentials::ptr() const
+{
+ return this->cred;
+}
+
+void psk_client_credentials::set_ptr(void* p)
+{
+ this->cred = static_cast<gnutls_psk_client_credentials_t> (p);
+}
+
+void psk_client_credentials::set_credentials(const char* username,
+ const gnutls_datum& key, gnutls_psk_key_flags flags)
+{
+ RETWRAP(gnutls_psk_set_client_credentials( this->cred, username, &key, flags));
+}
+
+void psk_client_credentials::set_credentials_function(gnutls_psk_client_credentials_function * func)
+{
+ gnutls_psk_set_client_credentials_function( this->cred, func);
+}
+
+
+credentials::credentials(gnutls_credentials_type_t t) : type(t)
+{
+}
+
+credentials::credentials( credentials& c)
+{
+ this->type = c.type;
+ this->set_ptr( c.ptr());
+}
+
+gnutls_credentials_type_t credentials::get_type() const
+{
+ return type;
+}
+
+
+
+
+
+exception::exception( int x)
+{
+ retcode = x;
+}
+
+int exception::get_code()
+{
+ return retcode;
+}
+
+const char* exception::what() const throw()
+{
+ return gnutls_strerror(retcode);
+}
+
+
+
+
+dh_params::dh_params()
+{
+ RETWRAP(gnutls_dh_params_init( &params));
+}
+
+dh_params::~dh_params()
+{
+ gnutls_dh_params_deinit(params);
+}
+
+void dh_params::import_raw( const gnutls_datum_t & prime,
+ const gnutls_datum_t & generator)
+{
+ RETWRAP( gnutls_dh_params_import_raw( params, &prime, &generator));
+}
+
+void dh_params::import_pkcs3( const gnutls_datum_t & pkcs3_params,
+ gnutls_x509_crt_fmt_t format)
+{
+ RETWRAP(gnutls_dh_params_import_pkcs3( params, &pkcs3_params, format));
+}
+
+void dh_params::generate( unsigned int bits)
+{
+ RETWRAP(gnutls_dh_params_generate2( params, bits));
+}
+
+void dh_params::export_pkcs3( gnutls_x509_crt_fmt_t format, unsigned char *params_data, size_t * params_data_size)
+{
+ RETWRAP( gnutls_dh_params_export_pkcs3( params, format, params_data, params_data_size));
+}
+
+void dh_params::export_raw( gnutls_datum_t& prime, gnutls_datum_t &generator)
+{
+ RETWRAP( gnutls_dh_params_export_raw( params, &prime, &generator, NULL));
+}
+
+gnutls_dh_params_t dh_params::get_params_t() const
+{
+ return params;
+}
+
+dh_params & dh_params::operator=(const dh_params& src)
+{
+ dh_params* dst = new dh_params;
+ int ret;
+
+ ret = gnutls_dh_params_cpy( dst->params, src.params);
+
+ if (ret < 0) {
+ delete dst;
+ throw(ret);
+ }
+
+ return *dst;
+}
+
+
+// RSA
+
+rsa_params::rsa_params()
+{
+ RETWRAP(gnutls_rsa_params_init( &params));
+}
+
+rsa_params::~rsa_params()
+{
+ gnutls_rsa_params_deinit(params);
+}
+
+void rsa_params::import_pkcs1( const gnutls_datum_t & pkcs1_params,
+ gnutls_x509_crt_fmt_t format)
+{
+ RETWRAP(gnutls_rsa_params_import_pkcs1( params, &pkcs1_params, format));
+}
+
+void rsa_params::generate( unsigned int bits)
+{
+ RETWRAP(gnutls_rsa_params_generate2( params, bits));
+}
+
+void rsa_params::export_pkcs1( gnutls_x509_crt_fmt_t format, unsigned char *params_data, size_t * params_data_size)
+{
+ RETWRAP( gnutls_rsa_params_export_pkcs1( params, format, params_data, params_data_size));
+}
+
+gnutls_rsa_params_t rsa_params::get_params_t() const
+{
+ return params;
+}
+
+rsa_params & rsa_params::operator=(const rsa_params& src)
+{
+ rsa_params* dst = new rsa_params;
+ int ret;
+
+ ret = gnutls_rsa_params_cpy( dst->params, src.params);
+
+ if (ret < 0)
+ delete dst;
+ throw(ret);
+
+ return *dst;
+}
+
+void rsa_params::import_raw( const gnutls_datum_t & m,
+ const gnutls_datum_t & e,
+ const gnutls_datum_t & d,
+ const gnutls_datum_t & p,
+ const gnutls_datum_t & q,
+ const gnutls_datum_t & u)
+{
+
+ RETWRAP(gnutls_rsa_params_import_raw ( params, &m, &e, &d, &p, &q, &u));
+}
+
+
+void rsa_params::export_raw( gnutls_datum_t & m, gnutls_datum_t & e,
+ gnutls_datum_t & d, gnutls_datum_t & p,
+ gnutls_datum_t & q, gnutls_datum_t & u)
+{
+ RETWRAP( gnutls_rsa_params_export_raw ( params, &m, &e, &d, &p, &q, &u, NULL));
+}