123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426 |
- /*
- * Copyright (C) 2006-2012 Free Software Foundation, Inc.
- *
- * Author: Nikos Mavrogiannopoulos
- *
- * This file is part of GnuTLS.
- *
- * The GnuTLS is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public License
- * as published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
- */
- #ifndef GNUTLSXX_H
- #define GNUTLSXX_H
- #include <exception>
- #include <vector>
- #include <gnutls/gnutls.h>
- namespace gnutls {
- class noncopyable {
- protected:
- noncopyable() {
- } ~noncopyable() {
- } private:
- // These are non-implemented.
- noncopyable(const noncopyable &);
- noncopyable & operator=(const noncopyable &);
- };
- class exception:public std::exception {
- public:
- exception(int x);
- const char *what() const throw();
- int get_code();
- protected:
- int retcode;
- };
- class dh_params:private noncopyable {
- 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:private noncopyable {
- 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;
- };
- class session:private noncopyable {
- protected:
- gnutls_session_t s;
- public:
- session(unsigned int);
- 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);
- /* if you just want some defaults, use the following.
- */
- void set_priority(const char *prio, const char **err_pos);
- void set_priority(gnutls_priority_t p);
- 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_vec_push_function(gnutls_vec_push_func
- vec_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_cert(gnutls_openpgp_crt_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_t & exponent,
- gnutls_datum_t & modulus) const;
- unsigned int get_rsa_export_modulus_bits() const;
- void get_our_certificate(gnutls_datum_t & 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:private noncopyable {
- public:
- virtual ~ DB() = 0;
- virtual bool store(const gnutls_datum_t & key,
- const gnutls_datum_t & data) = 0;
- virtual bool retrieve(const gnutls_datum_t & key,
- gnutls_datum_t & data) = 0;
- virtual bool remove(const gnutls_datum_t & key) = 0;
- };
- class server_session:public session {
- public:
- server_session();
- ~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();
- ~client_session();
- void set_server_name(gnutls_server_name_type_t type,
- const void *name, size_t name_length);
- bool get_request_status();
- };
- class credentials:private noncopyable {
- public:
- virtual ~ credentials() {
- } gnutls_credentials_type_t get_type() const;
- protected:
- friend class session;
- credentials(gnutls_credentials_type_t t);
- void *ptr() const;
- void set_ptr(void *ptr);
- gnutls_credentials_type_t type;
- private:
- void *cred;
- };
- 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);
- void set_retrieve_function
- (gnutls_certificate_retrieve_function * func);
- protected:
- gnutls_certificate_credentials_t cred;
- };
- class certificate_server_credentials:public certificate_credentials {
- public:
- void set_params_function(gnutls_params_function * func);
- };
- class certificate_client_credentials:public certificate_credentials {
- public:
- };
- 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:
- 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:
- 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:
- 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:
- gnutls_psk_client_credentials_t cred;
- };
- } /* namespace */
- #endif /* GNUTLSXX_H */
|