3 #include <openssl/bio.h>
4 #include <openssl/err.h>
5 #include <openssl/pem.h>
6 #include <openssl/conf.h>
7 #include <openssl/x509.h>
8 #include <openssl/buffer.h>
9 #include <openssl/x509v3.h>
10 #include <openssl/opensslconf.h>
17 bool sslinitialized_ {
false};
21 if (!sslinitialized_) {
23 OpenSSL_add_all_algorithms();
24 SSL_load_error_strings();
25 ERR_load_crypto_strings();
26 OpenSSL_add_all_ciphers();
27 sslinitialized_ =
true;
28 clog <<
"OpenSSL library initialized" << endl;
37 void print_error_string(
unsigned long err,
const char*
const label)
39 const char*
const str = ERR_reason_error_string(err);
41 cerr << label <<
": " << str << endl;
43 cerr << label <<
" failed: " << err << hex <<
" (0x" << err << dec << endl;
46 int printSSLErrors_cb(
const char *str,
size_t len,
void *u)
49 for (
size_t i=0;i<len;i++) {
58 ERR_print_errors_fp(stdout);
59 ERR_print_errors_cb(&printSSLErrors_cb,NULL);
62 int wildcmp(
const char *wild,
const char *
string) {
64 const char *cp = NULL, *mp = NULL;
66 while ((*
string) && (*wild !=
'*')) {
67 if ((*wild != *
string) && (*wild !=
'?')) {
81 }
else if ((*wild == *
string) || (*wild ==
'?')) {
90 while (*wild ==
'*') {
99 int idx = -1, success = 0;
100 unsigned char *utf8 = NULL;
105 idx = X509_NAME_get_index_by_NID(name, NID_commonName, -1);
106 if(!(idx > -1))
break;
108 X509_NAME_ENTRY* entry = X509_NAME_get_entry(name, idx);
111 ASN1_STRING* data = X509_NAME_ENTRY_get_data(entry);
114 int length = ASN1_STRING_to_UTF8(&utf8, data);
115 if(!utf8 || !(length > 0))
break;
117 clog <<
" " << label <<
": " << utf8 << endl;
127 clog <<
" " << label <<
": <not available>" << endl;
134 GENERAL_NAMES* names = NULL;
135 unsigned char* utf8 = NULL;
140 names = (GENERAL_NAMES*)X509_get_ext_d2i(cert, NID_subject_alt_name, 0, 0 );
143 int i = 0, count = sk_GENERAL_NAME_num(names);
146 for( i = 0; i < count; ++i )
148 GENERAL_NAME* entry = sk_GENERAL_NAME_value(names, i);
151 if(GEN_DNS == entry->type)
153 int len1 = 0, len2 = -1;
155 len1 = ASN1_STRING_to_UTF8(&utf8, entry->d.dNSName);
157 len2 = (int)strlen((
const char*)utf8);
161 cerr <<
" Strlen and ASN1_STRING size do not match (embedded null?): " << len2 <<
" vs " << len1 << endl;
168 if(utf8 && len1 && len2 && (len1 == len2)) {
169 clog <<
" " << label <<
": " << utf8 << endl;
174 OPENSSL_free(utf8), utf8 = NULL;
177 clog <<
" Unknown GENERAL_NAME type: " << entry->type << endl;
184 GENERAL_NAMES_free(names);
190 clog <<
" " << label <<
": <not available>" << endl;
197 int depth = X509_STORE_CTX_get_error_depth(x509_ctx);
198 int err = X509_STORE_CTX_get_error(x509_ctx);
201 X509* cert = X509_STORE_CTX_get_current_cert(x509_ctx);
202 X509_NAME* iname = cert ? X509_get_issuer_name(cert) : NULL;
203 X509_NAME* sname = cert ? X509_get_subject_name(cert) : NULL;
214 clog <<
"Certificate verification passed" << endl;
216 clog <<
"Certificate verification failed" << endl;
222 int ctx_password_callback(
char *buf,
int size,
int rwflag,
void *userdata)
224 SSLContext *ctx = (SSLContext*)userdata;
226 return ctx->passwordCallback(buf,size,rwflag);
232 int ssl_password_callback(
char *buf,
int size,
int rwflag,
void *userdata)
234 SSL *ssl = (SSL*)userdata;
236 return ssl->passwordCallback(buf,size,rwflag);
245 const SSL_METHOD *meth = (mode == SSLMode::SERVER) ? TLS_server_method() : TLS_client_method();
246 unsigned long ssl_err = ERR_get_error();
248 print_error_string(ssl_err,
"TLS_method");
251 ctx_ = SSL_CTX_new(meth);
252 ssl_err = ERR_get_error();
254 print_error_string(ssl_err,
"SSL_CTX_new");
269 if (
mode_ == SSLMode::SERVER) {
270 SSL_CTX_set_verify(
ctx_, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT | SSL_VERIFY_CLIENT_ONCE,
verify_callback);
275 SSL_CTX_set_verify(
ctx_, SSL_VERIFY_NONE, NULL);
277 SSL_CTX_set_verify_depth(
ctx_, 4);
280 flags = SSL_OP_ALL | SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3;
281 SSL_CTX_set_min_proto_version(
ctx_,TLS1_VERSION);
287 flags |= SSL_OP_NO_COMPRESSION;
290 SSL_CTX_set_options(
ctx_, flags);
297 char *cafile_ {
nullptr};
298 char *capath_ {
nullptr};
299 if (!cafile.empty()) {
300 cafile_ = (
char*)malloc(cafile.length()+1);
301 strcpy(cafile_,cafile.c_str());
303 if (!capath.empty()) {
304 capath_ = (
char*)malloc(capath.length()+1);
305 strcpy(capath_,capath.c_str());
318 unsigned long ssl_err = 0;
320 if (cafile || capath) {
321 res = SSL_CTX_load_verify_locations(
ctx_, cafile, capath);
322 ssl_err = ERR_get_error();
324 print_error_string(ssl_err,
"SSL_CTX_load_verify_locations");
328 res = SSL_CTX_set_default_verify_paths(
ctx_);
329 ssl_err = ERR_get_error();
331 print_error_string(ssl_err,
"SSL_CTX_set_default_verify_paths");
343 unsigned long ssl_err = 0;
345 if ((certfile && !keyfile) || (!certfile && keyfile)) {
346 cerr <<
"Error: Both a certificate and a private key file are required" << endl;
350 if (certfile && keyfile) {
351 res = SSL_CTX_use_certificate_file(
ctx_, certfile, SSL_FILETYPE_PEM);
352 ssl_err = ERR_get_error();
354 print_error_string(ssl_err,
"SSL_CTX_use_certificate_file");
358 res = SSL_CTX_use_PrivateKey_file(
ctx_, keyfile, SSL_FILETYPE_PEM);
359 ssl_err = ERR_get_error();
361 print_error_string(ssl_err,
"SSL_CTX_use_PrivateKey_file");
366 res = SSL_CTX_check_private_key(
ctx_);
367 ssl_err = ERR_get_error();
369 print_error_string(ssl_err,
"SSL_CTX_check_private_key");
373 SSL_CTX_set_default_passwd_cb(
ctx_,&ctx_password_callback);
374 SSL_CTX_set_default_passwd_cb_userdata(
ctx_,
this);
385 if (!keypass_.empty()) {
386 int lsize = max<int>(size,keypass_.length());
387 strncpy(buf,keypass_.c_str(),lsize);
412 SSL_set_verify(
ssl_, SSL_VERIFY_NONE, NULL);
421 unsigned long ssl_err = 0;
423 if ((certfile && !keyfile) || (!certfile && keyfile)) {
424 cerr <<
"Error: Both a certificate and a private key file are required" << endl;
428 if (certfile && keyfile) {
429 res = SSL_use_certificate_file(
ssl_, certfile, SSL_FILETYPE_PEM);
430 ssl_err = ERR_get_error();
432 print_error_string(ssl_err,
"SSL_use_certificate_file");
436 res = SSL_use_PrivateKey_file(
ssl_, keyfile, SSL_FILETYPE_PEM);
437 ssl_err = ERR_get_error();
439 print_error_string(ssl_err,
"SSL_use_PrivateKey_file");
444 res = SSL_check_private_key(
ssl_);
445 ssl_err = ERR_get_error();
447 print_error_string(ssl_err,
"SSL_CTX_check_private_key");
451 SSL_set_default_passwd_cb(
ssl_,&ssl_password_callback);
452 SSL_set_default_passwd_cb_userdata(
ssl_,
this);
463 if (!keypass_.empty()) {
464 int lsize = max<int>(size,keypass_.length());
465 strncpy(buf,keypass_.c_str(),lsize);
475 cerr <<
"SSL::setfd: socket is NULL" << endl;
478 int res = SSL_set_fd(
ssl_,socket);
480 unsigned long ssl_err = ERR_get_error();
481 print_error_string(ssl_err,
"SSL::set_fd");
491 if (!subjectName_.empty()) {
495 X509 *cert = SSL_get_peer_certificate(
ssl_);
497 X509_NAME* sname = X509_get_subject_name(cert);
501 unsigned char *utf8 = NULL;
504 idx = X509_NAME_get_index_by_NID(sname, NID_commonName, -1);
505 if(!(idx > -1))
break;
507 X509_NAME_ENTRY* entry = X509_NAME_get_entry(sname, idx);
510 ASN1_STRING* data = X509_NAME_ENTRY_get_data(entry);
513 int length = ASN1_STRING_to_UTF8(&utf8, data);
514 if(!utf8 || !(length > 0))
break;
516 subjectName_.assign((
char*)utf8);
530 return wildcmp(subjectName.c_str(),hostname.c_str());
536 cerr <<
"Peer certificate validation failed" << endl;
543 cerr <<
"Peer certificate subject name '" << subjectName_ <<
"' does not match host name '" << hostname_ <<
"'" << endl;
555 return (SSL_get_verify_result(
ssl_) == X509_V_OK);
560 int res = SSL_connect(
ssl_);
562 unsigned long ssl_err = ERR_get_error();
564 case SSL_ERROR_NONE:
return true;
565 case SSL_ERROR_WANT_READ: wantsRead();
return connect();
break;
566 case SSL_ERROR_WANT_WRITE: wantsWrite();
return connect();
break;
567 default: print_error_string(ssl_err,
"SSL_connect");
578 int res = SSL_accept(
ssl_);
580 unsigned long ssl_err = ERR_get_error();
582 case SSL_ERROR_NONE:
return true;
583 case SSL_ERROR_WANT_READ: wantsRead();
return accept();
break;
584 case SSL_ERROR_WANT_WRITE: wantsWrite();
return accept();
break;
585 default: print_error_string(ssl_err,
"SSL_accept");
599 int res = SSL_read(
ssl_,buffer,size);
601 unsigned long ssl_err = SSL_get_error(
ssl_,res);
603 case SSL_ERROR_NONE:
return 0;
604 case SSL_ERROR_WANT_READ:
return 0;
break;
605 case SSL_ERROR_WANT_WRITE: wantsWrite();
return read(buffer,size);
break;
606 default: print_error_string(ssl_err,
"SSL_read");
return 0;
618 int res = SSL_write(
ssl_,buffer,size);
620 unsigned long ssl_err = SSL_get_error(
ssl_,res);
622 case SSL_ERROR_NONE:
return 0;
623 case SSL_ERROR_WANT_READ: wantsRead();
return write(buffer,size);
break;
624 case SSL_ERROR_WANT_WRITE:
return write(buffer,size);
break;
625 default: print_error_string(ssl_err,
"SSL_write");
return 0;
break;
634 int res = SSL_clear(
ssl_);
636 unsigned long ssl_err = ERR_get_error();
637 print_error_string(ssl_err,
"SSL_clear");
643 int res = SSL_shutdown(
ssl_);
645 unsigned long ssl_err = ERR_get_error();
646 if (ssl_err != SSL_ERROR_NONE) {
647 print_error_string(ssl_err,
"SSL_shutdown");
652 void SSL::wantsRead()
659 void SSL::wantsWrite()