1
/***************************************************************************
3
* Project ___| | | | _ \| |
5
* | (__| |_| | _ <| |___
6
* \___|\___/|_| \_\_____|
8
* Copyright (C) 1998 - 2013, Daniel Stenberg, <daniel@haxx.se>, et al.
10
* This software is licensed as described in the file COPYING, which
11
* you should have received as part of this distribution. The terms
12
* are also available at http://curl.haxx.se/docs/copyright.html.
14
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
15
* copies of the Software, and permit persons to whom the Software is
16
* furnished to do so, under the terms of the COPYING file.
18
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19
* KIND, either express or implied.
21
***************************************************************************/
24
* Source file for all OpenSSL-specific code for the TLS/SSL layer. No code
25
* but sslgen.c should ever call or use these functions.
29
* The original SSLeay-using code for curl was written by Linas Vepstas and
30
* Sampo Kellomaki 1998.
33
#include "curl_setup.h"
41
#include "formdata.h" /* for the boundary function */
42
#include "url.h" /* for the ssl config check function */
43
#include "inet_pton.h"
50
#include "hostcheck.h"
52
#define _MPRINTF_REPLACE /* use the internal *printf() functions */
53
#include <curl/mprintf.h>
58
#include <openssl/rand.h>
59
#include <openssl/x509v3.h>
60
#include <openssl/dsa.h>
61
#include <openssl/dh.h>
62
#include <openssl/err.h>
63
#include <openssl/md5.h>
71
#include "curl_memory.h"
72
#include "non-ascii.h" /* for Curl_convert_from_utf8 prototype */
74
/* The last #include file should be: */
77
#ifndef OPENSSL_VERSION_NUMBER
78
#error "OPENSSL_VERSION_NUMBER not defined"
81
#if OPENSSL_VERSION_NUMBER >= 0x0090581fL
82
#define HAVE_SSL_GET1_SESSION 1
84
#undef HAVE_SSL_GET1_SESSION
87
#if OPENSSL_VERSION_NUMBER >= 0x00904100L
88
#define HAVE_USERDATA_IN_PWD_CALLBACK 1
90
#undef HAVE_USERDATA_IN_PWD_CALLBACK
93
#if OPENSSL_VERSION_NUMBER >= 0x00907001L
94
/* ENGINE_load_private_key() takes four arguments */
95
#define HAVE_ENGINE_LOAD_FOUR_ARGS
96
#include <openssl/ui.h>
98
/* ENGINE_load_private_key() takes three arguments */
99
#undef HAVE_ENGINE_LOAD_FOUR_ARGS
102
#if (OPENSSL_VERSION_NUMBER >= 0x00903001L) && defined(HAVE_OPENSSL_PKCS12_H)
103
/* OpenSSL has PKCS 12 support */
104
#define HAVE_PKCS12_SUPPORT
106
/* OpenSSL/SSLEay does not have PKCS12 support */
107
#undef HAVE_PKCS12_SUPPORT
110
#if OPENSSL_VERSION_NUMBER >= 0x00906001L
111
#define HAVE_ERR_ERROR_STRING_N 1
114
#if OPENSSL_VERSION_NUMBER >= 0x00909000L
115
#define SSL_METHOD_QUAL const
117
#define SSL_METHOD_QUAL
120
#if OPENSSL_VERSION_NUMBER >= 0x00907000L
121
/* 0.9.6 didn't have X509_STORE_set_flags() */
122
#define HAVE_X509_STORE_SET_FLAGS 1
124
#define X509_STORE_set_flags(x,y) Curl_nop_stmt
127
#if OPENSSL_VERSION_NUMBER >= 0x10000000L
128
#define HAVE_ERR_REMOVE_THREAD_STATE 1
131
#ifndef HAVE_SSLV2_CLIENT_METHOD
132
#undef OPENSSL_NO_SSL2 /* undef first to avoid compiler warnings */
133
#define OPENSSL_NO_SSL2
137
* Number of bytes to read from the random number seed file. This must be
138
* a finite value (because some entropy "files" like /dev/urandom have
139
* an infinite length), but must be large enough to provide enough
140
* entopy to properly seed OpenSSL's PRNG.
142
#define RAND_LOAD_LENGTH 1024
144
#ifndef HAVE_USERDATA_IN_PWD_CALLBACK
145
static char global_passwd[64];
148
static int passwd_callback(char *buf, int num, int encrypting
149
#ifdef HAVE_USERDATA_IN_PWD_CALLBACK
150
/* This was introduced in 0.9.4, we can set this
151
using SSL_CTX_set_default_passwd_cb_userdata()
153
, void *global_passwd
157
DEBUGASSERT(0 == encrypting);
160
int klen = curlx_uztosi(strlen((char *)global_passwd));
162
memcpy(buf, global_passwd, klen+1);
170
* rand_enough() is a function that returns TRUE if we have seeded the random
171
* engine properly. We use some preprocessor magic to provide a seed_enough()
172
* macro to use, just to prevent a compiler warning on this function if we
173
* pass in an argument that is never used.
176
#ifdef HAVE_RAND_STATUS
177
#define seed_enough(x) rand_enough()
178
static bool rand_enough(void)
180
return (0 != RAND_status()) ? TRUE : FALSE;
183
#define seed_enough(x) rand_enough(x)
184
static bool rand_enough(int nread)
186
/* this is a very silly decision to make */
187
return (nread > 500) ? TRUE : FALSE;
191
static int ossl_seed(struct SessionHandle *data)
193
char *buf = data->state.buffer; /* point to the big buffer */
196
/* Q: should we add support for a random file name as a libcurl option?
197
A: Yes, it is here */
200
/* if RANDOM_FILE isn't defined, we only perform this if an option tells
202
if(data->set.ssl.random_file)
203
#define RANDOM_FILE "" /* doesn't matter won't be used */
206
/* let the option override the define */
207
nread += RAND_load_file((data->set.str[STRING_SSL_RANDOM_FILE]?
208
data->set.str[STRING_SSL_RANDOM_FILE]:
211
if(seed_enough(nread))
215
#if defined(HAVE_RAND_EGD)
216
/* only available in OpenSSL 0.9.5 and later */
217
/* EGD_SOCKET is set at configure time or not at all */
219
/* If we don't have the define set, we only do this if the egd-option
221
if(data->set.str[STRING_SSL_EGDSOCKET])
222
#define EGD_SOCKET "" /* doesn't matter won't be used */
225
/* If there's an option and a define, the option overrides the
227
int ret = RAND_egd(data->set.str[STRING_SSL_EGDSOCKET]?
228
data->set.str[STRING_SSL_EGDSOCKET]:EGD_SOCKET);
231
if(seed_enough(nread))
237
/* If we get here, it means we need to seed the PRNG using a "silly"
240
unsigned char randb[64];
241
int len = sizeof(randb);
242
RAND_bytes(randb, len);
243
RAND_add(randb, len, (len >> 1));
244
} while(!RAND_status());
246
/* generates a default path for the random seed file */
247
buf[0]=0; /* blank it first */
248
RAND_file_name(buf, BUFSIZE);
250
/* we got a file name to try */
251
nread += RAND_load_file(buf, RAND_LOAD_LENGTH);
252
if(seed_enough(nread))
256
infof(data, "libcurl is now using a weak random seed!\n");
260
int Curl_ossl_seed(struct SessionHandle *data)
262
/* we have the "SSL is seeded" boolean static to prevent multiple
263
time-consuming seedings in vain */
264
static bool ssl_seeded = FALSE;
266
if(!ssl_seeded || data->set.str[STRING_SSL_RANDOM_FILE] ||
267
data->set.str[STRING_SSL_EGDSOCKET]) {
275
#ifndef SSL_FILETYPE_ENGINE
276
#define SSL_FILETYPE_ENGINE 42
278
#ifndef SSL_FILETYPE_PKCS12
279
#define SSL_FILETYPE_PKCS12 43
281
static int do_file_type(const char *type)
283
if(!type || !type[0])
284
return SSL_FILETYPE_PEM;
285
if(Curl_raw_equal(type, "PEM"))
286
return SSL_FILETYPE_PEM;
287
if(Curl_raw_equal(type, "DER"))
288
return SSL_FILETYPE_ASN1;
289
if(Curl_raw_equal(type, "ENG"))
290
return SSL_FILETYPE_ENGINE;
291
if(Curl_raw_equal(type, "P12"))
292
return SSL_FILETYPE_PKCS12;
297
int cert_stuff(struct connectdata *conn,
300
const char *cert_type,
302
const char *key_type)
304
struct SessionHandle *data = conn->data;
306
int file_type = do_file_type(cert_type);
308
if(cert_file != NULL || file_type == SSL_FILETYPE_ENGINE) {
313
if(data->set.str[STRING_KEY_PASSWD]) {
314
#ifndef HAVE_USERDATA_IN_PWD_CALLBACK
316
* If password has been given, we store that in the global
317
* area (*shudder*) for a while:
319
size_t len = strlen(data->set.str[STRING_KEY_PASSWD]);
320
if(len < sizeof(global_passwd))
321
memcpy(global_passwd, data->set.str[STRING_KEY_PASSWD], len+1);
323
global_passwd[0] = '\0';
326
* We set the password in the callback userdata
328
SSL_CTX_set_default_passwd_cb_userdata(ctx,
329
data->set.str[STRING_KEY_PASSWD]);
331
/* Set passwd callback: */
332
SSL_CTX_set_default_passwd_cb(ctx, passwd_callback);
336
#define SSL_CLIENT_CERT_ERR \
337
"unable to use client certificate (no key found or wrong pass phrase?)"
340
case SSL_FILETYPE_PEM:
341
/* SSL_CTX_use_certificate_chain_file() only works on PEM files */
342
if(SSL_CTX_use_certificate_chain_file(ctx,
344
failf(data, SSL_CLIENT_CERT_ERR);
349
case SSL_FILETYPE_ASN1:
350
/* SSL_CTX_use_certificate_file() works with either PEM or ASN1, but
351
we use the case above for PEM so this can only be performed with
353
if(SSL_CTX_use_certificate_file(ctx,
356
failf(data, SSL_CLIENT_CERT_ERR);
360
case SSL_FILETYPE_ENGINE:
361
#if defined(HAVE_OPENSSL_ENGINE_H) && defined(ENGINE_CTRL_GET_CMD_FROM_NAME)
363
if(data->state.engine) {
364
const char *cmd_name = "LOAD_CERT_CTRL";
370
params.cert_id = cert_file;
373
/* Does the engine supports LOAD_CERT_CTRL ? */
374
if(!ENGINE_ctrl(data->state.engine, ENGINE_CTRL_GET_CMD_FROM_NAME,
375
0, (void *)cmd_name, NULL)) {
376
failf(data, "ssl engine does not support loading certificates");
380
/* Load the certificate from the engine */
381
if(!ENGINE_ctrl_cmd(data->state.engine, cmd_name,
382
0, ¶ms, NULL, 1)) {
383
failf(data, "ssl engine cannot load client cert with id"
384
" '%s' [%s]", cert_file,
385
ERR_error_string(ERR_get_error(), NULL));
390
failf(data, "ssl engine didn't initialized the certificate "
395
if(SSL_CTX_use_certificate(ctx, params.cert) != 1) {
396
failf(data, "unable to set client certificate");
397
X509_free(params.cert);
400
X509_free(params.cert); /* we don't need the handle any more... */
403
failf(data, "crypto engine not set, can't load certificate");
409
failf(data, "file type ENG for certificate not implemented");
413
case SSL_FILETYPE_PKCS12:
415
#ifdef HAVE_PKCS12_SUPPORT
419
STACK_OF(X509) *ca = NULL;
422
f = fopen(cert_file,"rb");
424
failf(data, "could not open PKCS12 file '%s'", cert_file);
427
p12 = d2i_PKCS12_fp(f, NULL);
431
failf(data, "error reading PKCS12 file '%s'", cert_file );
437
if(!PKCS12_parse(p12, data->set.str[STRING_KEY_PASSWD], &pri, &x509,
440
"could not parse PKCS12 file, check password, OpenSSL error %s",
441
ERR_error_string(ERR_get_error(), NULL) );
448
if(SSL_CTX_use_certificate(ctx, x509) != 1) {
449
failf(data, SSL_CLIENT_CERT_ERR);
453
if(SSL_CTX_use_PrivateKey(ctx, pri) != 1) {
454
failf(data, "unable to use private key from PKCS12 file '%s'",
459
if(!SSL_CTX_check_private_key (ctx)) {
460
failf(data, "private key from PKCS12 file '%s' "
461
"does not match certificate in same file", cert_file);
464
/* Set Certificate Verification chain */
465
if(ca && sk_X509_num(ca)) {
466
for(i = 0; i < sk_X509_num(ca); i++) {
468
* Note that sk_X509_pop() is used below to make sure the cert is
469
* removed from the stack properly before getting passed to
470
* SSL_CTX_add_extra_chain_cert(). Previously we used
471
* sk_X509_value() instead, but then we'd clean it in the subsequent
472
* sk_X509_pop_free() call.
474
X509 *x = sk_X509_pop(ca);
475
if(!SSL_CTX_add_extra_chain_cert(ctx, x)) {
476
failf(data, "cannot add certificate to certificate chain");
479
/* SSL_CTX_add_client_CA() seems to work with either sk_* function,
480
* presumably because it duplicates what we pass to it.
482
if(!SSL_CTX_add_client_CA(ctx, x)) {
483
failf(data, "cannot add certificate to client CA list");
493
sk_X509_pop_free(ca, X509_free);
496
return 0; /* failure! */
498
failf(data, "file type P12 for certificate not supported");
503
failf(data, "not supported file type '%s' for certificate", cert_type);
507
file_type = do_file_type(key_type);
510
case SSL_FILETYPE_PEM:
514
/* cert & key can only be in PEM case in the same file */
516
case SSL_FILETYPE_ASN1:
517
if(SSL_CTX_use_PrivateKey_file(ctx, key_file, file_type) != 1) {
518
failf(data, "unable to set private key file: '%s' type %s",
519
key_file, key_type?key_type:"PEM");
523
case SSL_FILETYPE_ENGINE:
524
#ifdef HAVE_OPENSSL_ENGINE_H
525
{ /* XXXX still needs some work */
526
EVP_PKEY *priv_key = NULL;
527
if(data->state.engine) {
528
#ifdef HAVE_ENGINE_LOAD_FOUR_ARGS
529
UI_METHOD *ui_method = UI_OpenSSL();
531
/* the typecast below was added to please mingw32 */
532
priv_key = (EVP_PKEY *)
533
ENGINE_load_private_key(data->state.engine,key_file,
534
#ifdef HAVE_ENGINE_LOAD_FOUR_ARGS
537
data->set.str[STRING_KEY_PASSWD]);
539
failf(data, "failed to load private key from crypto engine");
542
if(SSL_CTX_use_PrivateKey(ctx, priv_key) != 1) {
543
failf(data, "unable to set private key");
544
EVP_PKEY_free(priv_key);
547
EVP_PKEY_free(priv_key); /* we don't need the handle any more... */
550
failf(data, "crypto engine not set, can't load private key");
556
failf(data, "file type ENG for private key not supported");
559
case SSL_FILETYPE_PKCS12:
561
failf(data, "file type P12 for private key not supported");
566
failf(data, "not supported file type for private key");
572
failf(data,"unable to create an SSL structure");
576
x509=SSL_get_certificate(ssl);
578
/* This version was provided by Evan Jordan and is supposed to not
579
leak memory as the previous version: */
581
EVP_PKEY *pktmp = X509_get_pubkey(x509);
582
EVP_PKEY_copy_parameters(pktmp,SSL_get_privatekey(ssl));
583
EVP_PKEY_free(pktmp);
588
/* If we are using DSA, we can copy the parameters from
592
/* Now we know that a key and cert have been set against
594
if(!SSL_CTX_check_private_key(ctx)) {
595
failf(data, "Private key does not match the certificate public key");
598
#ifndef HAVE_USERDATA_IN_PWD_CALLBACK
600
memset(global_passwd, 0, sizeof(global_passwd));
606
/* returns non-zero on failure */
607
static int x509_name_oneline(X509_NAME *a, char *buf, size_t size)
610
return X509_NAME_oneline(a, buf, size);
612
BIO *bio_out = BIO_new(BIO_s_mem());
617
return 1; /* alloc failed! */
619
rc = X509_NAME_print_ex(bio_out, a, 0, XN_FLAG_SEP_SPLUS_SPC);
620
BIO_get_mem_ptr(bio_out, &biomem);
622
if((size_t)biomem->length < size)
623
size = biomem->length;
625
size--; /* don't overwrite the buffer end */
627
memcpy(buf, biomem->data, size);
637
int cert_verify_callback(int ok, X509_STORE_CTX *ctx)
642
err_cert=X509_STORE_CTX_get_current_cert(ctx);
643
(void)x509_name_oneline(X509_get_subject_name(err_cert), buf, sizeof(buf));
647
/* Return error string for last OpenSSL error
649
static char *SSL_strerror(unsigned long error, char *buf, size_t size)
651
#ifdef HAVE_ERR_ERROR_STRING_N
652
/* OpenSSL 0.9.6 and later has a function named
653
ERRO_error_string_n() that takes the size of the buffer as a
655
ERR_error_string_n(error, buf, size);
658
ERR_error_string(error, buf);
663
#endif /* USE_SSLEAY */
669
* @retval 0 error initializing SSL
670
* @retval 1 SSL initialized successfully
672
int Curl_ossl_init(void)
674
#ifdef HAVE_ENGINE_LOAD_BUILTIN_ENGINES
675
ENGINE_load_builtin_engines();
678
/* Lets get nice error messages */
679
SSL_load_error_strings();
681
/* Init the global ciphers and digests */
682
if(!SSLeay_add_ssl_algorithms())
685
OpenSSL_add_all_algorithms();
690
#endif /* USE_SSLEAY */
695
void Curl_ossl_cleanup(void)
697
/* Free ciphers and digests lists */
700
#ifdef HAVE_ENGINE_CLEANUP
701
/* Free engine list */
705
#ifdef HAVE_CRYPTO_CLEANUP_ALL_EX_DATA
706
/* Free OpenSSL ex_data table */
707
CRYPTO_cleanup_all_ex_data();
710
/* Free OpenSSL error strings */
713
/* Free thread local error state, destroying hash upon zero refcount */
714
#ifdef HAVE_ERR_REMOVE_THREAD_STATE
715
ERR_remove_thread_state(NULL);
722
* This function uses SSL_peek to determine connection status.
725
* 1 means the connection is still in place
726
* 0 means the connection has been closed
727
* -1 means the connection status is unknown
729
int Curl_ossl_check_cxn(struct connectdata *conn)
734
rc = SSL_peek(conn->ssl[FIRSTSOCKET].handle, (void*)&buf, 1);
736
return 1; /* connection still in place */
739
return 0; /* connection has been closed */
741
return -1; /* connection status unknown */
744
/* Selects an OpenSSL crypto engine
746
CURLcode Curl_ossl_set_engine(struct SessionHandle *data, const char *engine)
748
#if defined(USE_SSLEAY) && defined(HAVE_OPENSSL_ENGINE_H)
751
#if OPENSSL_VERSION_NUMBER >= 0x00909000L
752
e = ENGINE_by_id(engine);
754
/* avoid memory leak */
755
for(e = ENGINE_get_first(); e; e = ENGINE_get_next(e)) {
756
const char *e_id = ENGINE_get_id(e);
757
if(!strcmp(engine, e_id))
763
failf(data, "SSL Engine '%s' not found", engine);
764
return CURLE_SSL_ENGINE_NOTFOUND;
767
if(data->state.engine) {
768
ENGINE_finish(data->state.engine);
769
ENGINE_free(data->state.engine);
770
data->state.engine = NULL;
772
if(!ENGINE_init(e)) {
776
failf(data, "Failed to initialise SSL Engine '%s':\n%s",
777
engine, SSL_strerror(ERR_get_error(), buf, sizeof(buf)));
778
return CURLE_SSL_ENGINE_INITFAILED;
780
data->state.engine = e;
784
failf(data, "SSL Engine not supported");
785
return CURLE_SSL_ENGINE_NOTFOUND;
789
/* Sets engine as default for all SSL operations
791
CURLcode Curl_ossl_set_engine_default(struct SessionHandle *data)
793
#ifdef HAVE_OPENSSL_ENGINE_H
794
if(data->state.engine) {
795
if(ENGINE_set_default(data->state.engine, ENGINE_METHOD_ALL) > 0) {
796
infof(data,"set default crypto engine '%s'\n",
797
ENGINE_get_id(data->state.engine));
800
failf(data, "set default crypto engine '%s' failed",
801
ENGINE_get_id(data->state.engine));
802
return CURLE_SSL_ENGINE_SETFAILED;
811
/* Return list of OpenSSL crypto engine names.
813
struct curl_slist *Curl_ossl_engines_list(struct SessionHandle *data)
815
struct curl_slist *list = NULL;
816
#if defined(USE_SSLEAY) && defined(HAVE_OPENSSL_ENGINE_H)
817
struct curl_slist *beg;
820
for(e = ENGINE_get_first(); e; e = ENGINE_get_next(e)) {
821
beg = curl_slist_append(list, ENGINE_get_id(e));
823
curl_slist_free_all(list);
835
* This function is called when an SSL connection is closed.
837
void Curl_ossl_close(struct connectdata *conn, int sockindex)
839
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
841
if(connssl->handle) {
842
(void)SSL_shutdown(connssl->handle);
843
SSL_set_connect_state(connssl->handle);
845
SSL_free (connssl->handle);
846
connssl->handle = NULL;
849
SSL_CTX_free (connssl->ctx);
855
* This function is called to shut down the SSL layer but keep the
856
* socket open (CCC - Clear Command Channel)
858
int Curl_ossl_shutdown(struct connectdata *conn, int sockindex)
861
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
862
struct SessionHandle *data = conn->data;
863
char buf[120]; /* We will use this for the OpenSSL error buffer, so it has
864
to be at least 120 bytes long. */
865
unsigned long sslerror;
871
/* This has only been tested on the proftpd server, and the mod_tls code
872
sends a close notify alert without waiting for a close notify alert in
873
response. Thus we wait for a close notify alert from the server, but
874
we do not send one. Let's hope other servers do the same... */
876
if(data->set.ftp_ccc == CURLFTPSSL_CCC_ACTIVE)
877
(void)SSL_shutdown(connssl->handle);
879
if(connssl->handle) {
880
buffsize = (int)sizeof(buf);
882
int what = Curl_socket_ready(conn->sock[sockindex],
883
CURL_SOCKET_BAD, SSL_SHUTDOWN_TIMEOUT);
887
/* Something to read, let's do it and hope that it is the close
888
notify alert from the server */
889
nread = (ssize_t)SSL_read(conn->ssl[sockindex].handle, buf,
891
err = SSL_get_error(conn->ssl[sockindex].handle, (int)nread);
894
case SSL_ERROR_NONE: /* this is not an error */
895
case SSL_ERROR_ZERO_RETURN: /* no more data */
896
/* This is the expected response. There was no data but only
897
the close notify alert */
900
case SSL_ERROR_WANT_READ:
901
/* there's data pending, re-invoke SSL_read() */
902
infof(data, "SSL_ERROR_WANT_READ\n");
904
case SSL_ERROR_WANT_WRITE:
905
/* SSL wants a write. Really odd. Let's bail out. */
906
infof(data, "SSL_ERROR_WANT_WRITE\n");
910
/* openssl/ssl.h says "look at error stack/return value/errno" */
911
sslerror = ERR_get_error();
912
failf(conn->data, "SSL read: %s, errno %d",
913
ERR_error_string(sslerror, buf),
921
failf(data, "SSL shutdown timeout");
925
/* anything that gets here is fatally bad */
926
failf(data, "select/poll on SSL socket, errno: %d", SOCKERRNO);
930
} /* while()-loop for the select() */
932
if(data->set.verbose) {
933
#ifdef HAVE_SSL_GET_SHUTDOWN
934
switch(SSL_get_shutdown(connssl->handle)) {
935
case SSL_SENT_SHUTDOWN:
936
infof(data, "SSL_get_shutdown() returned SSL_SENT_SHUTDOWN\n");
938
case SSL_RECEIVED_SHUTDOWN:
939
infof(data, "SSL_get_shutdown() returned SSL_RECEIVED_SHUTDOWN\n");
941
case SSL_SENT_SHUTDOWN|SSL_RECEIVED_SHUTDOWN:
942
infof(data, "SSL_get_shutdown() returned SSL_SENT_SHUTDOWN|"
943
"SSL_RECEIVED__SHUTDOWN\n");
949
SSL_free (connssl->handle);
950
connssl->handle = NULL;
955
void Curl_ossl_session_free(void *ptr)
958
SSL_SESSION_free(ptr);
962
* This function is called when the 'data' struct is going away. Close
963
* down everything and free all resources!
965
int Curl_ossl_close_all(struct SessionHandle *data)
967
#ifdef HAVE_OPENSSL_ENGINE_H
968
if(data->state.engine) {
969
ENGINE_finish(data->state.engine);
970
ENGINE_free(data->state.engine);
971
data->state.engine = NULL;
979
static int asn1_output(const ASN1_UTCTIME *tm,
983
const char *asn1_string;
986
int year=0,month=0,day=0,hour=0,minute=0,second=0;
989
asn1_string=(const char *)tm->data;
993
if(asn1_string[i-1] == 'Z')
996
if((asn1_string[i] > '9') || (asn1_string[i] < '0'))
999
year= (asn1_string[0]-'0')*10+(asn1_string[1]-'0');
1003
month= (asn1_string[2]-'0')*10+(asn1_string[3]-'0');
1004
if((month > 12) || (month < 1))
1007
day= (asn1_string[4]-'0')*10+(asn1_string[5]-'0');
1008
hour= (asn1_string[6]-'0')*10+(asn1_string[7]-'0');
1009
minute= (asn1_string[8]-'0')*10+(asn1_string[9]-'0');
1011
if((asn1_string[10] >= '0') && (asn1_string[10] <= '9') &&
1012
(asn1_string[11] >= '0') && (asn1_string[11] <= '9'))
1013
second= (asn1_string[10]-'0')*10+(asn1_string[11]-'0');
1015
snprintf(buf, sizeofbuf,
1016
"%04d-%02d-%02d %02d:%02d:%02d %s",
1017
year+1900, month, day, hour, minute, second, (gmt?"GMT":""));
1022
/* ====================================================== */
1025
/* Quote from RFC2818 section 3.1 "Server Identity"
1027
If a subjectAltName extension of type dNSName is present, that MUST
1028
be used as the identity. Otherwise, the (most specific) Common Name
1029
field in the Subject field of the certificate MUST be used. Although
1030
the use of the Common Name is existing practice, it is deprecated and
1031
Certification Authorities are encouraged to use the dNSName instead.
1033
Matching is performed using the matching rules specified by
1034
[RFC2459]. If more than one identity of a given type is present in
1035
the certificate (e.g., more than one dNSName name, a match in any one
1036
of the set is considered acceptable.) Names may contain the wildcard
1037
character * which is considered to match any single domain name
1038
component or component fragment. E.g., *.a.com matches foo.a.com but
1039
not bar.foo.a.com. f*.com matches foo.com but not bar.com.
1041
In some cases, the URI is specified as an IP address rather than a
1042
hostname. In this case, the iPAddress subjectAltName must be present
1043
in the certificate and must exactly match the IP in the URI.
1046
static CURLcode verifyhost(struct connectdata *conn,
1049
int matched = -1; /* -1 is no alternative match yet, 1 means match and 0
1051
int target = GEN_DNS; /* target type, GEN_DNS or GEN_IPADD */
1053
struct SessionHandle *data = conn->data;
1054
STACK_OF(GENERAL_NAME) *altnames;
1056
struct in6_addr addr;
1058
struct in_addr addr;
1060
CURLcode res = CURLE_OK;
1063
if(conn->bits.ipv6_ip &&
1064
Curl_inet_pton(AF_INET6, conn->host.name, &addr)) {
1066
addrlen = sizeof(struct in6_addr);
1070
if(Curl_inet_pton(AF_INET, conn->host.name, &addr)) {
1072
addrlen = sizeof(struct in_addr);
1075
/* get a "list" of alternative names */
1076
altnames = X509_get_ext_d2i(server_cert, NID_subject_alt_name, NULL, NULL);
1082
/* get amount of alternatives, RFC2459 claims there MUST be at least
1083
one, but we don't depend on it... */
1084
numalts = sk_GENERAL_NAME_num(altnames);
1086
/* loop through all alternatives while none has matched */
1087
for(i=0; (i<numalts) && (matched != 1); i++) {
1088
/* get a handle to alternative name number i */
1089
const GENERAL_NAME *check = sk_GENERAL_NAME_value(altnames, i);
1091
/* only check alternatives of the same type the target is */
1092
if(check->type == target) {
1093
/* get data and length */
1094
const char *altptr = (char *)ASN1_STRING_data(check->d.ia5);
1095
size_t altlen = (size_t) ASN1_STRING_length(check->d.ia5);
1098
case GEN_DNS: /* name/pattern comparison */
1099
/* The OpenSSL man page explicitly says: "In general it cannot be
1100
assumed that the data returned by ASN1_STRING_data() is null
1101
terminated or does not contain embedded nulls." But also that
1102
"The actual format of the data will depend on the actual string
1103
type itself: for example for and IA5String the data will be ASCII"
1105
Gisle researched the OpenSSL sources:
1106
"I checked the 0.9.6 and 0.9.8 sources before my patch and
1107
it always 0-terminates an IA5String."
1109
if((altlen == strlen(altptr)) &&
1110
/* if this isn't true, there was an embedded zero in the name
1111
string and we cannot match it. */
1112
Curl_cert_hostcheck(altptr, conn->host.name))
1118
case GEN_IPADD: /* IP address comparison */
1119
/* compare alternative IP address if the data chunk is the same size
1120
our server IP address is */
1121
if((altlen == addrlen) && !memcmp(altptr, &addr, altlen))
1129
GENERAL_NAMES_free(altnames);
1133
/* an alternative name matched the server hostname */
1134
infof(data, "\t subjectAltName: %s matched\n", conn->host.dispname);
1135
else if(matched == 0) {
1136
/* an alternative name field existed, but didn't match and then
1138
infof(data, "\t subjectAltName does not match %s\n", conn->host.dispname);
1139
res = CURLE_PEER_FAILED_VERIFICATION;
1142
/* we have to look to the last occurrence of a commonName in the
1143
distinguished one to get the most significant one. */
1146
/* The following is done because of a bug in 0.9.6b */
1148
unsigned char *nulstr = (unsigned char *)"";
1149
unsigned char *peer_CN = nulstr;
1151
X509_NAME *name = X509_get_subject_name(server_cert) ;
1153
while((j = X509_NAME_get_index_by_NID(name, NID_commonName, i))>=0)
1156
/* we have the name entry and we will now convert this to a string
1157
that we can use for comparison. Doing this we support BMPstring,
1161
ASN1_STRING *tmp = X509_NAME_ENTRY_get_data(X509_NAME_get_entry(name,i));
1163
/* In OpenSSL 0.9.7d and earlier, ASN1_STRING_to_UTF8 fails if the input
1164
is already UTF-8 encoded. We check for this case and copy the raw
1165
string manually to avoid the problem. This code can be made
1166
conditional in the future when OpenSSL has been fixed. Work-around
1167
brought by Alexis S. L. Carvalho. */
1169
if(ASN1_STRING_type(tmp) == V_ASN1_UTF8STRING) {
1170
j = ASN1_STRING_length(tmp);
1172
peer_CN = OPENSSL_malloc(j+1);
1174
memcpy(peer_CN, ASN1_STRING_data(tmp), j);
1179
else /* not a UTF8 name */
1180
j = ASN1_STRING_to_UTF8(&peer_CN, tmp);
1182
if(peer_CN && (curlx_uztosi(strlen((char *)peer_CN)) != j)) {
1183
/* there was a terminating zero before the end of string, this
1184
cannot match and we return failure! */
1185
failf(data, "SSL: illegal cert name field");
1186
res = CURLE_PEER_FAILED_VERIFICATION;
1191
if(peer_CN == nulstr)
1194
/* convert peer_CN from UTF8 */
1195
CURLcode rc = Curl_convert_from_utf8(data, peer_CN, strlen(peer_CN));
1196
/* Curl_convert_from_utf8 calls failf if unsuccessful */
1198
OPENSSL_free(peer_CN);
1204
/* error already detected, pass through */
1208
"SSL: unable to obtain common name from peer certificate");
1209
res = CURLE_PEER_FAILED_VERIFICATION;
1211
else if(!Curl_cert_hostcheck((const char *)peer_CN, conn->host.name)) {
1212
failf(data, "SSL: certificate subject name '%s' does not match "
1213
"target host name '%s'", peer_CN, conn->host.dispname);
1214
res = CURLE_PEER_FAILED_VERIFICATION;
1217
infof(data, "\t common name: %s (matched)\n", peer_CN);
1220
OPENSSL_free(peer_CN);
1224
#endif /* USE_SSLEAY */
1226
/* The SSL_CTRL_SET_MSG_CALLBACK doesn't exist in ancient OpenSSL versions
1227
and thus this cannot be done there. */
1228
#ifdef SSL_CTRL_SET_MSG_CALLBACK
1230
static const char *ssl_msg_type(int ssl_ver, int msg)
1232
if(ssl_ver == SSL2_VERSION_MAJOR) {
1236
case SSL2_MT_CLIENT_HELLO:
1237
return "Client hello";
1238
case SSL2_MT_CLIENT_MASTER_KEY:
1239
return "Client key";
1240
case SSL2_MT_CLIENT_FINISHED:
1241
return "Client finished";
1242
case SSL2_MT_SERVER_HELLO:
1243
return "Server hello";
1244
case SSL2_MT_SERVER_VERIFY:
1245
return "Server verify";
1246
case SSL2_MT_SERVER_FINISHED:
1247
return "Server finished";
1248
case SSL2_MT_REQUEST_CERTIFICATE:
1249
return "Request CERT";
1250
case SSL2_MT_CLIENT_CERTIFICATE:
1251
return "Client CERT";
1254
else if(ssl_ver == SSL3_VERSION_MAJOR) {
1256
case SSL3_MT_HELLO_REQUEST:
1257
return "Hello request";
1258
case SSL3_MT_CLIENT_HELLO:
1259
return "Client hello";
1260
case SSL3_MT_SERVER_HELLO:
1261
return "Server hello";
1262
case SSL3_MT_CERTIFICATE:
1264
case SSL3_MT_SERVER_KEY_EXCHANGE:
1265
return "Server key exchange";
1266
case SSL3_MT_CLIENT_KEY_EXCHANGE:
1267
return "Client key exchange";
1268
case SSL3_MT_CERTIFICATE_REQUEST:
1269
return "Request CERT";
1270
case SSL3_MT_SERVER_DONE:
1271
return "Server finished";
1272
case SSL3_MT_CERTIFICATE_VERIFY:
1273
return "CERT verify";
1274
case SSL3_MT_FINISHED:
1281
static const char *tls_rt_type(int type)
1284
type == SSL3_RT_CHANGE_CIPHER_SPEC ? "TLS change cipher, " :
1285
type == SSL3_RT_ALERT ? "TLS alert, " :
1286
type == SSL3_RT_HANDSHAKE ? "TLS handshake, " :
1287
type == SSL3_RT_APPLICATION_DATA ? "TLS app data, " :
1293
* Our callback from the SSL/TLS layers.
1295
static void ssl_tls_trace(int direction, int ssl_ver, int content_type,
1296
const void *buf, size_t len, const SSL *ssl,
1297
struct connectdata *conn)
1299
struct SessionHandle *data;
1300
const char *msg_name, *tls_rt_name;
1302
int ver, msg_type, txt_len;
1304
if(!conn || !conn->data || !conn->data->set.fdebug ||
1305
(direction != 0 && direction != 1))
1310
ver = (ssl_ver == SSL2_VERSION_MAJOR ? '2' :
1311
ssl_ver == SSL3_VERSION_MAJOR ? '3' : '?');
1313
/* SSLv2 doesn't seem to have TLS record-type headers, so OpenSSL
1314
* always pass-up content-type as 0. But the interesting message-type
1317
if(ssl_ver == SSL3_VERSION_MAJOR && content_type != 0)
1318
tls_rt_name = tls_rt_type(content_type);
1322
msg_type = *(char*)buf;
1323
msg_name = ssl_msg_type(ssl_ver, msg_type);
1325
txt_len = snprintf(ssl_buf, sizeof(ssl_buf), "SSLv%c, %s%s (%d):\n",
1326
ver, tls_rt_name, msg_name, msg_type);
1327
Curl_debug(data, CURLINFO_TEXT, ssl_buf, (size_t)txt_len, NULL);
1329
Curl_debug(data, (direction == 1) ? CURLINFO_SSL_DATA_OUT :
1330
CURLINFO_SSL_DATA_IN, (char *)buf, len, NULL);
1336
/* ====================================================== */
1338
#ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME
1339
# define use_sni(x) sni = (x)
1341
# define use_sni(x) Curl_nop_stmt
1345
ossl_connect_step1(struct connectdata *conn,
1348
CURLcode retcode = CURLE_OK;
1350
struct SessionHandle *data = conn->data;
1351
SSL_METHOD_QUAL SSL_METHOD *req_method=NULL;
1352
void *ssl_sessionid=NULL;
1353
X509_LOOKUP *lookup=NULL;
1354
curl_socket_t sockfd = conn->sock[sockindex];
1355
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
1357
#ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME
1360
struct in6_addr addr;
1362
struct in_addr addr;
1366
DEBUGASSERT(ssl_connect_1 == connssl->connecting_state);
1368
/* Make funny stuff to get random input */
1369
Curl_ossl_seed(data);
1371
/* check to see if we've been told to use an explicit SSL/TLS version */
1373
switch(data->set.ssl.version) {
1375
case CURL_SSLVERSION_DEFAULT:
1377
if(data->set.ssl.authtype == CURL_TLSAUTH_SRP) {
1378
infof(data, "Set version TLSv1 for SRP authorisation\n");
1379
req_method = TLSv1_client_method() ;
1383
/* we try to figure out version */
1384
req_method = SSLv23_client_method();
1387
case CURL_SSLVERSION_TLSv1:
1388
req_method = TLSv1_client_method();
1391
case CURL_SSLVERSION_SSLv2:
1392
#ifdef OPENSSL_NO_SSL2
1393
failf(data, "OpenSSL was built without SSLv2 support");
1394
return CURLE_NOT_BUILT_IN;
1397
if(data->set.ssl.authtype == CURL_TLSAUTH_SRP)
1398
return CURLE_SSL_CONNECT_ERROR;
1400
req_method = SSLv2_client_method();
1404
case CURL_SSLVERSION_SSLv3:
1406
if(data->set.ssl.authtype == CURL_TLSAUTH_SRP)
1407
return CURLE_SSL_CONNECT_ERROR;
1409
req_method = SSLv3_client_method();
1415
SSL_CTX_free(connssl->ctx);
1416
connssl->ctx = SSL_CTX_new(req_method);
1419
failf(data, "SSL: couldn't create a context: %s",
1420
ERR_error_string(ERR_peek_error(), NULL));
1421
return CURLE_OUT_OF_MEMORY;
1424
#ifdef SSL_MODE_RELEASE_BUFFERS
1425
SSL_CTX_set_mode(connssl->ctx, SSL_MODE_RELEASE_BUFFERS);
1428
#ifdef SSL_CTRL_SET_MSG_CALLBACK
1429
if(data->set.fdebug && data->set.verbose) {
1430
/* the SSL trace callback is only used for verbose logging so we only
1431
inform about failures of setting it */
1432
if(!SSL_CTX_callback_ctrl(connssl->ctx, SSL_CTRL_SET_MSG_CALLBACK,
1433
(void (*)(void))ssl_tls_trace)) {
1434
infof(data, "SSL: couldn't set callback!\n");
1436
else if(!SSL_CTX_ctrl(connssl->ctx, SSL_CTRL_SET_MSG_CALLBACK_ARG, 0,
1438
infof(data, "SSL: couldn't set callback argument!\n");
1443
/* OpenSSL contains code to work-around lots of bugs and flaws in various
1444
SSL-implementations. SSL_CTX_set_options() is used to enabled those
1445
work-arounds. The man page for this option states that SSL_OP_ALL enables
1446
all the work-arounds and that "It is usually safe to use SSL_OP_ALL to
1447
enable the bug workaround options if compatibility with somewhat broken
1448
implementations is desired."
1450
The "-no_ticket" option was introduced in Openssl0.9.8j. It's a flag to
1451
disable "rfc4507bis session ticket support". rfc4507bis was later turned
1452
into the proper RFC5077 it seems: http://tools.ietf.org/html/rfc5077
1454
The enabled extension concerns the session management. I wonder how often
1455
libcurl stops a connection and then resumes a TLS session. also, sending
1456
the session data is some overhead. .I suggest that you just use your
1457
proposed patch (which explicitly disables TICKET).
1459
If someone writes an application with libcurl and openssl who wants to
1460
enable the feature, one can do this in the SSL callback.
1462
SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG option enabling allowed proper
1463
interoperability with web server Netscape Enterprise Server 2.0.1 which
1464
was released back in 1996.
1466
Due to CVE-2010-4180, option SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG has
1467
become ineffective as of OpenSSL 0.9.8q and 1.0.0c. In order to mitigate
1468
CVE-2010-4180 when using previous OpenSSL versions we no longer enable
1469
this option regardless of OpenSSL version and SSL_OP_ALL definition.
1471
OpenSSL added a work-around for a SSL 3.0/TLS 1.0 CBC vulnerability
1472
(http://www.openssl.org/~bodo/tls-cbc.txt). In 0.9.6e they added a bit to
1473
SSL_OP_ALL that _disables_ that work-around despite the fact that
1474
SSL_OP_ALL is documented to do "rather harmless" workarounds. In order to
1475
keep the secure work-around, the SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS bit
1479
ctx_options = SSL_OP_ALL;
1481
#ifdef SSL_OP_NO_TICKET
1482
ctx_options |= SSL_OP_NO_TICKET;
1485
#ifdef SSL_OP_NO_COMPRESSION
1486
ctx_options |= SSL_OP_NO_COMPRESSION;
1489
#ifdef SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG
1490
/* mitigate CVE-2010-4180 */
1491
ctx_options &= ~SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG;
1494
#ifdef SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS
1495
/* unless the user explicitly ask to allow the protocol vulnerability we
1496
use the work-around */
1497
if(!conn->data->set.ssl_enable_beast)
1498
ctx_options &= ~SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS;
1501
/* disable SSLv2 in the default case (i.e. allow SSLv3 and TLSv1) */
1502
if(data->set.ssl.version == CURL_SSLVERSION_DEFAULT)
1503
ctx_options |= SSL_OP_NO_SSLv2;
1505
SSL_CTX_set_options(connssl->ctx, ctx_options);
1507
if(data->set.str[STRING_CERT] || data->set.str[STRING_CERT_TYPE]) {
1508
if(!cert_stuff(conn,
1510
data->set.str[STRING_CERT],
1511
data->set.str[STRING_CERT_TYPE],
1512
data->set.str[STRING_KEY],
1513
data->set.str[STRING_KEY_TYPE])) {
1514
/* failf() is already done in cert_stuff() */
1515
return CURLE_SSL_CERTPROBLEM;
1519
if(data->set.str[STRING_SSL_CIPHER_LIST]) {
1520
if(!SSL_CTX_set_cipher_list(connssl->ctx,
1521
data->set.str[STRING_SSL_CIPHER_LIST])) {
1522
failf(data, "failed setting cipher list");
1523
return CURLE_SSL_CIPHER;
1528
if(data->set.ssl.authtype == CURL_TLSAUTH_SRP) {
1529
infof(data, "Using TLS-SRP username: %s\n", data->set.ssl.username);
1531
if(!SSL_CTX_set_srp_username(connssl->ctx, data->set.ssl.username)) {
1532
failf(data, "Unable to set SRP user name");
1533
return CURLE_BAD_FUNCTION_ARGUMENT;
1535
if(!SSL_CTX_set_srp_password(connssl->ctx,data->set.ssl.password)) {
1536
failf(data, "failed setting SRP password");
1537
return CURLE_BAD_FUNCTION_ARGUMENT;
1539
if(!data->set.str[STRING_SSL_CIPHER_LIST]) {
1540
infof(data, "Setting cipher list SRP\n");
1542
if(!SSL_CTX_set_cipher_list(connssl->ctx, "SRP")) {
1543
failf(data, "failed setting SRP cipher list");
1544
return CURLE_SSL_CIPHER;
1549
if(data->set.str[STRING_SSL_CAFILE] || data->set.str[STRING_SSL_CAPATH]) {
1550
/* tell SSL where to find CA certificates that are used to verify
1551
the servers certificate. */
1552
if(!SSL_CTX_load_verify_locations(connssl->ctx,
1553
data->set.str[STRING_SSL_CAFILE],
1554
data->set.str[STRING_SSL_CAPATH])) {
1555
if(data->set.ssl.verifypeer) {
1556
/* Fail if we insist on successfully verifying the server. */
1557
failf(data,"error setting certificate verify locations:\n"
1558
" CAfile: %s\n CApath: %s",
1559
data->set.str[STRING_SSL_CAFILE]?
1560
data->set.str[STRING_SSL_CAFILE]: "none",
1561
data->set.str[STRING_SSL_CAPATH]?
1562
data->set.str[STRING_SSL_CAPATH] : "none");
1563
return CURLE_SSL_CACERT_BADFILE;
1566
/* Just continue with a warning if no strict certificate verification
1568
infof(data, "error setting certificate verify locations,"
1569
" continuing anyway:\n");
1573
/* Everything is fine. */
1574
infof(data, "successfully set certificate verify locations:\n");
1579
data->set.str[STRING_SSL_CAFILE] ? data->set.str[STRING_SSL_CAFILE]:
1581
data->set.str[STRING_SSL_CAPATH] ? data->set.str[STRING_SSL_CAPATH]:
1585
if(data->set.str[STRING_SSL_CRLFILE]) {
1586
/* tell SSL where to find CRL file that is used to check certificate
1588
lookup=X509_STORE_add_lookup(SSL_CTX_get_cert_store(connssl->ctx),
1589
X509_LOOKUP_file());
1591
(!X509_load_crl_file(lookup,data->set.str[STRING_SSL_CRLFILE],
1592
X509_FILETYPE_PEM)) ) {
1593
failf(data,"error loading CRL file: %s",
1594
data->set.str[STRING_SSL_CRLFILE]);
1595
return CURLE_SSL_CRL_BADFILE;
1598
/* Everything is fine. */
1599
infof(data, "successfully load CRL file:\n");
1600
X509_STORE_set_flags(SSL_CTX_get_cert_store(connssl->ctx),
1601
X509_V_FLAG_CRL_CHECK|X509_V_FLAG_CRL_CHECK_ALL);
1604
" CRLfile: %s\n", data->set.str[STRING_SSL_CRLFILE] ?
1605
data->set.str[STRING_SSL_CRLFILE]: "none");
1608
/* SSL always tries to verify the peer, this only says whether it should
1609
* fail to connect if the verification fails, or if it should continue
1610
* anyway. In the latter case the result of the verification is checked with
1611
* SSL_get_verify_result() below. */
1612
SSL_CTX_set_verify(connssl->ctx,
1613
data->set.ssl.verifypeer?SSL_VERIFY_PEER:SSL_VERIFY_NONE,
1614
cert_verify_callback);
1616
/* give application a chance to interfere with SSL set up. */
1617
if(data->set.ssl.fsslctx) {
1618
retcode = (*data->set.ssl.fsslctx)(data, connssl->ctx,
1619
data->set.ssl.fsslctxp);
1621
failf(data,"error signaled by ssl ctx callback");
1626
/* Lets make an SSL structure */
1628
SSL_free(connssl->handle);
1629
connssl->handle = SSL_new(connssl->ctx);
1630
if(!connssl->handle) {
1631
failf(data, "SSL: couldn't create a context (handle)!");
1632
return CURLE_OUT_OF_MEMORY;
1634
SSL_set_connect_state(connssl->handle);
1636
connssl->server_cert = 0x0;
1638
#ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME
1639
if((0 == Curl_inet_pton(AF_INET, conn->host.name, &addr)) &&
1641
(0 == Curl_inet_pton(AF_INET6, conn->host.name, &addr)) &&
1644
!SSL_set_tlsext_host_name(connssl->handle, conn->host.name))
1645
infof(data, "WARNING: failed to configure server name indication (SNI) "
1649
/* Check if there's a cached ID we can/should use here! */
1650
if(!Curl_ssl_getsessionid(conn, &ssl_sessionid, NULL)) {
1651
/* we got a session id, use it! */
1652
if(!SSL_set_session(connssl->handle, ssl_sessionid)) {
1653
failf(data, "SSL: SSL_set_session failed: %s",
1654
ERR_error_string(ERR_get_error(),NULL));
1655
return CURLE_SSL_CONNECT_ERROR;
1657
/* Informational message */
1658
infof (data, "SSL re-using session ID\n");
1661
/* pass the raw socket into the SSL layers */
1662
if(!SSL_set_fd(connssl->handle, (int)sockfd)) {
1663
failf(data, "SSL: SSL_set_fd failed: %s",
1664
ERR_error_string(ERR_get_error(),NULL));
1665
return CURLE_SSL_CONNECT_ERROR;
1668
connssl->connecting_state = ssl_connect_2;
1673
ossl_connect_step2(struct connectdata *conn, int sockindex)
1675
struct SessionHandle *data = conn->data;
1677
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
1679
DEBUGASSERT(ssl_connect_2 == connssl->connecting_state
1680
|| ssl_connect_2_reading == connssl->connecting_state
1681
|| ssl_connect_2_writing == connssl->connecting_state);
1685
err = SSL_connect(connssl->handle);
1688
0 is "not successful but was shut down controlled"
1689
<0 is "handshake was not successful, because a fatal error occurred" */
1691
int detail = SSL_get_error(connssl->handle, err);
1693
if(SSL_ERROR_WANT_READ == detail) {
1694
connssl->connecting_state = ssl_connect_2_reading;
1697
else if(SSL_ERROR_WANT_WRITE == detail) {
1698
connssl->connecting_state = ssl_connect_2_writing;
1702
/* untreated error */
1703
unsigned long errdetail;
1704
char error_buffer[256]; /* OpenSSL documents that this must be at least
1707
const char *cert_problem = NULL;
1710
connssl->connecting_state = ssl_connect_2; /* the connection failed,
1711
we're not waiting for
1714
errdetail = ERR_get_error(); /* Gets the earliest error code from the
1715
thread's error queue and removes the
1722
SSL2_SET_CERTIFICATE:
1723
certificate verify failed */
1728
SSL3_GET_SERVER_CERTIFICATE:
1729
certificate verify failed */
1730
rc = CURLE_SSL_CACERT;
1732
lerr = SSL_get_verify_result(connssl->handle);
1733
if(lerr != X509_V_OK) {
1734
snprintf(error_buffer, sizeof(error_buffer),
1735
"SSL certificate problem: %s",
1736
X509_verify_cert_error_string(lerr));
1739
cert_problem = "SSL certificate problem, verify that the CA cert is"
1744
rc = CURLE_SSL_CONNECT_ERROR;
1745
SSL_strerror(errdetail, error_buffer, sizeof(error_buffer));
1749
/* detail is already set to the SSL error above */
1751
/* If we e.g. use SSLv2 request-method and the server doesn't like us
1752
* (RST connection etc.), OpenSSL gives no explanation whatsoever and
1753
* the SO_ERROR is also lost.
1755
if(CURLE_SSL_CONNECT_ERROR == rc && errdetail == 0) {
1756
failf(data, "Unknown SSL protocol error in connection to %s:%ld ",
1757
conn->host.name, conn->port);
1760
/* Could be a CERT problem */
1762
failf(data, "%s%s", cert_problem ? cert_problem : "", error_buffer);
1767
/* we have been connected fine, we're not waiting for anything else. */
1768
connssl->connecting_state = ssl_connect_3;
1770
/* Informational message */
1771
infof (data, "SSL connection using %s\n",
1772
SSL_get_cipher(connssl->handle));
1778
static int asn1_object_dump(ASN1_OBJECT *a, char *buf, size_t len)
1782
if((ilen = (int)len) < 0)
1783
return 1; /* buffer too big */
1785
i = i2t_ASN1_OBJECT(buf, ilen, a);
1788
return 1; /* buffer too small */
1793
static CURLcode push_certinfo_len(struct SessionHandle *data,
1799
struct curl_certinfo *ci = &data->info.certs;
1801
struct curl_slist *nl;
1802
CURLcode res = CURLE_OK;
1803
size_t labellen = strlen(label);
1804
size_t outlen = labellen + 1 + valuelen + 1; /* label:value\0 */
1806
output = malloc(outlen);
1808
return CURLE_OUT_OF_MEMORY;
1810
/* sprintf the label and colon */
1811
snprintf(output, outlen, "%s:", label);
1813
/* memcpy the value (it might not be zero terminated) */
1814
memcpy(&output[labellen+1], value, valuelen);
1816
/* zero terminate the output */
1817
output[labellen + 1 + valuelen] = 0;
1819
/* TODO: we should rather introduce an internal API that can do the
1820
equivalent of curl_slist_append but doesn't strdup() the given data as
1821
like in this place the extra malloc/free is totally pointless */
1822
nl = curl_slist_append(ci->certinfo[certnum], output);
1825
curl_slist_free_all(ci->certinfo[certnum]);
1826
ci->certinfo[certnum] = NULL;
1827
res = CURLE_OUT_OF_MEMORY;
1830
ci->certinfo[certnum] = nl;
1835
/* this is a convenience function for push_certinfo_len that takes a zero
1837
static CURLcode push_certinfo(struct SessionHandle *data,
1842
size_t valuelen = strlen(value);
1844
return push_certinfo_len(data, certnum, label, value, valuelen);
1847
static void pubkey_show(struct SessionHandle *data,
1860
buffer = malloc(left);
1863
snprintf(namebuf, sizeof(namebuf), "%s(%s)", type, name);
1864
for(i=0; i< len; i++) {
1865
snprintf(ptr, left, "%02x:", raw[i]);
1869
infof(data, " %s: %s\n", namebuf, buffer);
1870
push_certinfo(data, num, namebuf, buffer);
1875
#define print_pubkey_BN(_type, _name, _num) \
1877
if(pubkey->pkey._type->_name != NULL) { \
1878
int len = BN_num_bytes(pubkey->pkey._type->_name); \
1879
if(len < CERTBUFFERSIZE) { \
1880
BN_bn2bin(pubkey->pkey._type->_name, (unsigned char*)bufp); \
1882
pubkey_show(data, _num, #_type, #_name, (unsigned char*)bufp, len); \
1887
static int X509V3_ext(struct SessionHandle *data,
1889
STACK_OF(X509_EXTENSION) *exts)
1894
if(sk_X509_EXTENSION_num(exts) <= 0)
1895
/* no extensions, bail out */
1898
for(i=0; i<sk_X509_EXTENSION_num(exts); i++) {
1900
X509_EXTENSION *ext = sk_X509_EXTENSION_value(exts, i);
1905
BIO *bio_out = BIO_new(BIO_s_mem());
1910
obj = X509_EXTENSION_get_object(ext);
1912
asn1_object_dump(obj, namebuf, sizeof(namebuf));
1914
infof(data, "%s: %s\n", namebuf,
1915
X509_EXTENSION_get_critical(ext)?"(critical)":"");
1917
if(!X509V3_EXT_print(bio_out, ext, 0, 0))
1918
M_ASN1_OCTET_STRING_print(bio_out, ext->value);
1920
BIO_get_mem_ptr(bio_out, &biomem);
1922
/* biomem->length bytes at biomem->data, this little loop here is only
1923
done for the infof() call, we send the "raw" data to the certinfo
1925
for(j=0; j<(size_t)biomem->length; j++) {
1927
if(biomem->data[j] == '\n') {
1929
j++; /* skip the newline */
1931
while((biomem->data[j] == ' ') && (j<(size_t)biomem->length))
1933
if(j<(size_t)biomem->length)
1934
ptr+=snprintf(ptr, sizeof(buf)-(ptr-buf), "%s%c", sep,
1937
infof(data, " %s\n", buf);
1939
push_certinfo(data, certnum, namebuf, buf);
1944
return 0; /* all is fine */
1948
static void X509_signature(struct SessionHandle *data,
1955
for(i=0; i<sig->length; i++)
1956
ptr+=snprintf(ptr, sizeof(buf)-(ptr-buf), "%02x:", sig->data[i]);
1958
infof(data, " Signature: %s\n", buf);
1959
push_certinfo(data, numcert, "Signature", buf);
1962
static void dumpcert(struct SessionHandle *data, X509 *x, int numcert)
1964
BIO *bio_out = BIO_new(BIO_s_mem());
1967
/* this outputs the cert in this 64 column wide style with newlines and
1968
-----BEGIN CERTIFICATE----- texts and more */
1969
PEM_write_bio_X509(bio_out, x);
1971
BIO_get_mem_ptr(bio_out, &biomem);
1973
infof(data, "%s\n", biomem->data);
1975
push_certinfo_len(data, numcert, "Cert", biomem->data, biomem->length);
1982
static int init_certinfo(struct SessionHandle *data,
1985
struct curl_certinfo *ci = &data->info.certs;
1986
struct curl_slist **table;
1988
Curl_ssl_free_certinfo(data);
1990
ci->num_of_certs = num;
1991
table = calloc((size_t)num, sizeof(struct curl_slist *));
1995
ci->certinfo = table;
2000
* This size was previously 512 which has been reported "too small" without
2001
* any specifics, so it was enlarged to allow more data to get shown uncut.
2002
* The "perfect" size is yet to figure out.
2004
#define CERTBUFFERSIZE 8192
2006
static CURLcode get_cert_chain(struct connectdata *conn,
2007
struct ssl_connect_data *connssl)
2013
struct SessionHandle *data = conn->data;
2016
bufp = malloc(CERTBUFFERSIZE);
2018
return CURLE_OUT_OF_MEMORY;
2020
sk = SSL_get_peer_cert_chain(connssl->handle);
2023
return CURLE_OUT_OF_MEMORY;
2026
numcerts = sk_X509_num(sk);
2027
if(init_certinfo(data, numcerts)) {
2029
return CURLE_OUT_OF_MEMORY;
2032
infof(data, "--- Certificate chain\n");
2033
for(i=0; i<numcerts; i++) {
2036
ASN1_TIME *certdate;
2038
/* get the certs in "importance order" */
2040
X509 *x = sk_X509_value(sk, numcerts - i - 1);
2042
X509 *x = sk_X509_value(sk, i);
2046
EVP_PKEY *pubkey=NULL;
2050
(void)x509_name_oneline(X509_get_subject_name(x), bufp, CERTBUFFERSIZE);
2051
infof(data, "%2d Subject: %s\n", i, bufp);
2052
push_certinfo(data, i, "Subject", bufp);
2054
(void)x509_name_oneline(X509_get_issuer_name(x), bufp, CERTBUFFERSIZE);
2055
infof(data, " Issuer: %s\n", bufp);
2056
push_certinfo(data, i, "Issuer", bufp);
2058
value = X509_get_version(x);
2059
infof(data, " Version: %lu (0x%lx)\n", value+1, value);
2060
snprintf(bufp, CERTBUFFERSIZE, "%lx", value);
2061
push_certinfo(data, i, "Version", bufp); /* hex */
2063
num=X509_get_serialNumber(x);
2064
if(num->length <= 4) {
2065
value = ASN1_INTEGER_get(num);
2066
infof(data," Serial Number: %ld (0x%lx)\n", value, value);
2067
snprintf(bufp, CERTBUFFERSIZE, "%lx", value);
2070
int left = CERTBUFFERSIZE;
2074
if(num->type == V_ASN1_NEG_INTEGER)
2077
for(j=0; (j<num->length) && (left>=4); j++) {
2078
/* TODO: length restrictions */
2079
snprintf(ptr, 3, "%02x%c",num->data[j],
2080
((j+1 == num->length)?'\n':':'));
2085
infof(data," Serial Number: %s\n", bufp);
2090
push_certinfo(data, i, "Serial Number", bufp); /* hex */
2092
cinf = x->cert_info;
2094
j = asn1_object_dump(cinf->signature->algorithm, bufp, CERTBUFFERSIZE);
2096
infof(data, " Signature Algorithm: %s\n", bufp);
2097
push_certinfo(data, i, "Signature Algorithm", bufp);
2100
certdate = X509_get_notBefore(x);
2101
asn1_output(certdate, bufp, CERTBUFFERSIZE);
2102
infof(data, " Start date: %s\n", bufp);
2103
push_certinfo(data, i, "Start date", bufp);
2105
certdate = X509_get_notAfter(x);
2106
asn1_output(certdate, bufp, CERTBUFFERSIZE);
2107
infof(data, " Expire date: %s\n", bufp);
2108
push_certinfo(data, i, "Expire date", bufp);
2110
j = asn1_object_dump(cinf->key->algor->algorithm, bufp, CERTBUFFERSIZE);
2112
infof(data, " Public Key Algorithm: %s\n", bufp);
2113
push_certinfo(data, i, "Public Key Algorithm", bufp);
2116
pubkey = X509_get_pubkey(x);
2118
infof(data, " Unable to load public key\n");
2120
switch(pubkey->type) {
2122
infof(data, " RSA Public Key (%d bits)\n",
2123
BN_num_bits(pubkey->pkey.rsa->n));
2124
snprintf(bufp, CERTBUFFERSIZE, "%d", BN_num_bits(pubkey->pkey.rsa->n));
2125
push_certinfo(data, i, "RSA Public Key", bufp);
2127
print_pubkey_BN(rsa, n, i);
2128
print_pubkey_BN(rsa, e, i);
2129
print_pubkey_BN(rsa, d, i);
2130
print_pubkey_BN(rsa, p, i);
2131
print_pubkey_BN(rsa, q, i);
2132
print_pubkey_BN(rsa, dmp1, i);
2133
print_pubkey_BN(rsa, dmq1, i);
2134
print_pubkey_BN(rsa, iqmp, i);
2137
print_pubkey_BN(dsa, p, i);
2138
print_pubkey_BN(dsa, q, i);
2139
print_pubkey_BN(dsa, g, i);
2140
print_pubkey_BN(dsa, priv_key, i);
2141
print_pubkey_BN(dsa, pub_key, i);
2144
print_pubkey_BN(dh, p, i);
2145
print_pubkey_BN(dh, g, i);
2146
print_pubkey_BN(dh, priv_key, i);
2147
print_pubkey_BN(dh, pub_key, i);
2150
case EVP_PKEY_EC: /* symbol not present in OpenSSL 0.9.6 */
2155
EVP_PKEY_free(pubkey);
2158
X509V3_ext(data, i, cinf->extensions);
2160
X509_signature(data, i, x->signature);
2162
dumpcert(data, x, i);
2171
* Get the server cert, verify it and show it etc, only call failf() if the
2172
* 'strict' argument is TRUE as otherwise all this is for informational
2175
* We check certificates to authenticate the server; otherwise we risk
2176
* man-in-the-middle attack.
2178
static CURLcode servercert(struct connectdata *conn,
2179
struct ssl_connect_data *connssl,
2182
CURLcode retcode = CURLE_OK;
2185
ASN1_TIME *certdate;
2186
struct SessionHandle *data = conn->data;
2189
char *buffer = data->state.buffer;
2191
if(data->set.ssl.certinfo)
2192
/* we've been asked to gather certificate info! */
2193
(void)get_cert_chain(conn, connssl);
2195
data->set.ssl.certverifyresult = !X509_V_OK;
2197
connssl->server_cert = SSL_get_peer_certificate(connssl->handle);
2198
if(!connssl->server_cert) {
2200
failf(data, "SSL: couldn't get peer certificate!");
2201
return CURLE_PEER_FAILED_VERIFICATION;
2203
infof (data, "Server certificate:\n");
2205
rc = x509_name_oneline(X509_get_subject_name(connssl->server_cert),
2207
infof(data, "\t subject: %s\n", rc?"[NONE]":buffer);
2209
certdate = X509_get_notBefore(connssl->server_cert);
2210
asn1_output(certdate, buffer, BUFSIZE);
2211
infof(data, "\t start date: %s\n", buffer);
2213
certdate = X509_get_notAfter(connssl->server_cert);
2214
asn1_output(certdate, buffer, BUFSIZE);
2215
infof(data, "\t expire date: %s\n", buffer);
2217
if(data->set.ssl.verifyhost) {
2218
retcode = verifyhost(conn, connssl->server_cert);
2220
X509_free(connssl->server_cert);
2221
connssl->server_cert = NULL;
2226
rc = x509_name_oneline(X509_get_issuer_name(connssl->server_cert),
2230
failf(data, "SSL: couldn't get X509-issuer name!");
2231
retcode = CURLE_SSL_CONNECT_ERROR;
2234
infof(data, "\t issuer: %s\n", buffer);
2236
/* We could do all sorts of certificate verification stuff here before
2237
deallocating the certificate. */
2239
/* e.g. match issuer name with provided issuer certificate */
2240
if(data->set.str[STRING_SSL_ISSUERCERT]) {
2241
fp=fopen(data->set.str[STRING_SSL_ISSUERCERT],"r");
2244
failf(data, "SSL: Unable to open issuer cert (%s)",
2245
data->set.str[STRING_SSL_ISSUERCERT]);
2246
X509_free(connssl->server_cert);
2247
connssl->server_cert = NULL;
2248
return CURLE_SSL_ISSUER_ERROR;
2250
issuer = PEM_read_X509(fp,NULL,ZERO_NULL,NULL);
2253
failf(data, "SSL: Unable to read issuer cert (%s)",
2254
data->set.str[STRING_SSL_ISSUERCERT]);
2255
X509_free(connssl->server_cert);
2258
return CURLE_SSL_ISSUER_ERROR;
2261
if(X509_check_issued(issuer,connssl->server_cert) != X509_V_OK) {
2263
failf(data, "SSL: Certificate issuer check failed (%s)",
2264
data->set.str[STRING_SSL_ISSUERCERT]);
2265
X509_free(connssl->server_cert);
2267
connssl->server_cert = NULL;
2268
return CURLE_SSL_ISSUER_ERROR;
2270
infof(data, "\t SSL certificate issuer check ok (%s)\n",
2271
data->set.str[STRING_SSL_ISSUERCERT]);
2275
lerr = data->set.ssl.certverifyresult=
2276
SSL_get_verify_result(connssl->handle);
2277
if(data->set.ssl.certverifyresult != X509_V_OK) {
2278
if(data->set.ssl.verifypeer) {
2279
/* We probably never reach this, because SSL_connect() will fail
2280
and we return earlier if verifypeer is set? */
2282
failf(data, "SSL certificate verify result: %s (%ld)",
2283
X509_verify_cert_error_string(lerr), lerr);
2284
retcode = CURLE_PEER_FAILED_VERIFICATION;
2287
infof(data, "\t SSL certificate verify result: %s (%ld),"
2288
" continuing anyway.\n",
2289
X509_verify_cert_error_string(lerr), lerr);
2292
infof(data, "\t SSL certificate verify ok.\n");
2295
X509_free(connssl->server_cert);
2296
connssl->server_cert = NULL;
2297
connssl->connecting_state = ssl_connect_done;
2304
ossl_connect_step3(struct connectdata *conn,
2307
CURLcode retcode = CURLE_OK;
2308
void *old_ssl_sessionid=NULL;
2309
struct SessionHandle *data = conn->data;
2310
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
2312
SSL_SESSION *our_ssl_sessionid;
2314
DEBUGASSERT(ssl_connect_3 == connssl->connecting_state);
2316
#ifdef HAVE_SSL_GET1_SESSION
2317
our_ssl_sessionid = SSL_get1_session(connssl->handle);
2319
/* SSL_get1_session() will increment the reference
2320
count and the session will stay in memory until explicitly freed with
2321
SSL_SESSION_free(3), regardless of its state.
2322
This function was introduced in openssl 0.9.5a. */
2324
our_ssl_sessionid = SSL_get_session(connssl->handle);
2326
/* if SSL_get1_session() is unavailable, use SSL_get_session().
2327
This is an inferior option because the session can be flushed
2328
at any time by openssl. It is included only so curl compiles
2329
under versions of openssl < 0.9.5a.
2331
WARNING: How curl behaves if it's session is flushed is
2336
incache = !(Curl_ssl_getsessionid(conn, &old_ssl_sessionid, NULL));
2338
if(old_ssl_sessionid != our_ssl_sessionid) {
2339
infof(data, "old SSL session ID is stale, removing\n");
2340
Curl_ssl_delsessionid(conn, old_ssl_sessionid);
2345
retcode = Curl_ssl_addsessionid(conn, our_ssl_sessionid,
2346
0 /* unknown size */);
2348
failf(data, "failed to store ssl session");
2352
#ifdef HAVE_SSL_GET1_SESSION
2354
/* Session was incache, so refcount already incremented earlier.
2355
* Avoid further increments with each SSL_get1_session() call.
2356
* This does not free the session as refcount remains > 0
2358
SSL_SESSION_free(our_ssl_sessionid);
2363
* We check certificates to authenticate the server; otherwise we risk
2364
* man-in-the-middle attack; NEVERTHELESS, if we're told explicitly not to
2365
* verify the peer ignore faults and failures from the server cert
2369
if(!data->set.ssl.verifypeer)
2370
(void)servercert(conn, connssl, FALSE);
2372
retcode = servercert(conn, connssl, TRUE);
2374
if(CURLE_OK == retcode)
2375
connssl->connecting_state = ssl_connect_done;
2379
static Curl_recv ossl_recv;
2380
static Curl_send ossl_send;
2383
ossl_connect_common(struct connectdata *conn,
2389
struct SessionHandle *data = conn->data;
2390
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
2391
curl_socket_t sockfd = conn->sock[sockindex];
2395
/* check if the connection has already been established */
2396
if(ssl_connection_complete == connssl->state) {
2401
if(ssl_connect_1==connssl->connecting_state) {
2402
/* Find out how much more time we're allowed */
2403
timeout_ms = Curl_timeleft(data, NULL, TRUE);
2405
if(timeout_ms < 0) {
2406
/* no need to continue if time already is up */
2407
failf(data, "SSL connection timeout");
2408
return CURLE_OPERATION_TIMEDOUT;
2410
retcode = ossl_connect_step1(conn, sockindex);
2415
while(ssl_connect_2 == connssl->connecting_state ||
2416
ssl_connect_2_reading == connssl->connecting_state ||
2417
ssl_connect_2_writing == connssl->connecting_state) {
2419
/* check allowed time left */
2420
timeout_ms = Curl_timeleft(data, NULL, TRUE);
2422
if(timeout_ms < 0) {
2423
/* no need to continue if time already is up */
2424
failf(data, "SSL connection timeout");
2425
return CURLE_OPERATION_TIMEDOUT;
2428
/* if ssl is expecting something, check if it's available. */
2429
if(connssl->connecting_state == ssl_connect_2_reading
2430
|| connssl->connecting_state == ssl_connect_2_writing) {
2432
curl_socket_t writefd = ssl_connect_2_writing==
2433
connssl->connecting_state?sockfd:CURL_SOCKET_BAD;
2434
curl_socket_t readfd = ssl_connect_2_reading==
2435
connssl->connecting_state?sockfd:CURL_SOCKET_BAD;
2437
what = Curl_socket_ready(readfd, writefd, nonblocking?0:timeout_ms);
2440
failf(data, "select/poll on SSL socket, errno: %d", SOCKERRNO);
2441
return CURLE_SSL_CONNECT_ERROR;
2443
else if(0 == what) {
2450
failf(data, "SSL connection timeout");
2451
return CURLE_OPERATION_TIMEDOUT;
2454
/* socket is readable or writable */
2457
/* Run transaction, and return to the caller if it failed or if this
2458
* connection is done nonblocking and this loop would execute again. This
2459
* permits the owner of a multi handle to abort a connection attempt
2460
* before step2 has completed while ensuring that a client using select()
2461
* or epoll() will always have a valid fdset to wait on.
2463
retcode = ossl_connect_step2(conn, sockindex);
2464
if(retcode || (nonblocking &&
2465
(ssl_connect_2 == connssl->connecting_state ||
2466
ssl_connect_2_reading == connssl->connecting_state ||
2467
ssl_connect_2_writing == connssl->connecting_state)))
2470
} /* repeat step2 until all transactions are done. */
2473
if(ssl_connect_3==connssl->connecting_state) {
2474
retcode = ossl_connect_step3(conn, sockindex);
2479
if(ssl_connect_done==connssl->connecting_state) {
2480
connssl->state = ssl_connection_complete;
2481
conn->recv[sockindex] = ossl_recv;
2482
conn->send[sockindex] = ossl_send;
2488
/* Reset our connect state machine */
2489
connssl->connecting_state = ssl_connect_1;
2495
Curl_ossl_connect_nonblocking(struct connectdata *conn,
2499
return ossl_connect_common(conn, sockindex, TRUE, done);
2503
Curl_ossl_connect(struct connectdata *conn,
2509
retcode = ossl_connect_common(conn, sockindex, FALSE, &done);
2518
bool Curl_ossl_data_pending(const struct connectdata *conn,
2521
if(conn->ssl[connindex].handle)
2523
return (0 != SSL_pending(conn->ssl[connindex].handle)) ? TRUE : FALSE;
2528
static ssize_t ossl_send(struct connectdata *conn,
2534
/* SSL_write() is said to return 'int' while write() and send() returns
2537
char error_buffer[120]; /* OpenSSL documents that this must be at least 120
2539
unsigned long sslerror;
2545
memlen = (len > (size_t)INT_MAX) ? INT_MAX : (int)len;
2546
rc = SSL_write(conn->ssl[sockindex].handle, mem, memlen);
2549
err = SSL_get_error(conn->ssl[sockindex].handle, rc);
2552
case SSL_ERROR_WANT_READ:
2553
case SSL_ERROR_WANT_WRITE:
2554
/* The operation did not complete; the same TLS/SSL I/O function
2555
should be called again later. This is basically an EWOULDBLOCK
2557
*curlcode = CURLE_AGAIN;
2559
case SSL_ERROR_SYSCALL:
2560
failf(conn->data, "SSL_write() returned SYSCALL, errno = %d",
2562
*curlcode = CURLE_SEND_ERROR;
2565
/* A failure in the SSL library occurred, usually a protocol error.
2566
The OpenSSL error queue contains more information on the error. */
2567
sslerror = ERR_get_error();
2568
failf(conn->data, "SSL_write() error: %s",
2569
ERR_error_string(sslerror, error_buffer));
2570
*curlcode = CURLE_SEND_ERROR;
2574
failf(conn->data, "SSL_write() return error %d", err);
2575
*curlcode = CURLE_SEND_ERROR;
2578
return (ssize_t)rc; /* number of bytes */
2581
static ssize_t ossl_recv(struct connectdata *conn, /* connection data */
2582
int num, /* socketindex */
2583
char *buf, /* store read data here */
2584
size_t buffersize, /* max amount to read */
2587
char error_buffer[120]; /* OpenSSL documents that this must be at
2588
least 120 bytes long. */
2589
unsigned long sslerror;
2595
buffsize = (buffersize > (size_t)INT_MAX) ? INT_MAX : (int)buffersize;
2596
nread = (ssize_t)SSL_read(conn->ssl[num].handle, buf, buffsize);
2598
/* failed SSL_read */
2599
int err = SSL_get_error(conn->ssl[num].handle, (int)nread);
2602
case SSL_ERROR_NONE: /* this is not an error */
2603
case SSL_ERROR_ZERO_RETURN: /* no more data */
2605
case SSL_ERROR_WANT_READ:
2606
case SSL_ERROR_WANT_WRITE:
2607
/* there's data pending, re-invoke SSL_read() */
2608
*curlcode = CURLE_AGAIN;
2611
/* openssl/ssl.h says "look at error stack/return value/errno" */
2612
sslerror = ERR_get_error();
2613
failf(conn->data, "SSL read: %s, errno %d",
2614
ERR_error_string(sslerror, error_buffer),
2616
*curlcode = CURLE_RECV_ERROR;
2623
size_t Curl_ossl_version(char *buffer, size_t size)
2625
#ifdef YASSL_VERSION
2626
/* yassl provides an OpenSSL API compatibility layer so it looks identical
2627
to OpenSSL in all other aspects */
2628
return snprintf(buffer, size, "yassl/%s", YASSL_VERSION);
2629
#else /* YASSL_VERSION */
2631
#if(SSLEAY_VERSION_NUMBER >= 0x905000)
2634
unsigned long ssleay_value;
2636
ssleay_value=SSLeay();
2637
if(ssleay_value < 0x906000) {
2638
ssleay_value=SSLEAY_VERSION_NUMBER;
2642
if(ssleay_value&0xff0) {
2643
sub[0]=(char)(((ssleay_value>>4)&0xff) + 'a' -1);
2649
return snprintf(buffer, size, "OpenSSL/%lx.%lx.%lx%s",
2650
(ssleay_value>>28)&0xf,
2651
(ssleay_value>>20)&0xff,
2652
(ssleay_value>>12)&0xff,
2656
#else /* SSLEAY_VERSION_NUMBER is less than 0.9.5 */
2658
#if(SSLEAY_VERSION_NUMBER >= 0x900000)
2659
return snprintf(buffer, size, "OpenSSL/%lx.%lx.%lx",
2660
(SSLEAY_VERSION_NUMBER>>28)&0xff,
2661
(SSLEAY_VERSION_NUMBER>>20)&0xff,
2662
(SSLEAY_VERSION_NUMBER>>12)&0xf);
2664
#else /* (SSLEAY_VERSION_NUMBER >= 0x900000) */
2668
if(SSLEAY_VERSION_NUMBER&0x0f) {
2669
sub[0]=(SSLEAY_VERSION_NUMBER&0x0f) + 'a' -1;
2674
return snprintf(buffer, size, "SSL/%x.%x.%x%s",
2675
(SSLEAY_VERSION_NUMBER>>12)&0xff,
2676
(SSLEAY_VERSION_NUMBER>>8)&0xf,
2677
(SSLEAY_VERSION_NUMBER>>4)&0xf, sub);
2679
#endif /* (SSLEAY_VERSION_NUMBER >= 0x900000) */
2680
#endif /* SSLEAY_VERSION_NUMBER is less than 0.9.5 */
2682
#endif /* YASSL_VERSION */
2685
void Curl_ossl_random(struct SessionHandle *data, unsigned char *entropy,
2688
Curl_ossl_seed(data); /* Initiate the seed if not already done */
2689
RAND_bytes(entropy, curlx_uztosi(length));
2692
void Curl_ossl_md5sum(unsigned char *tmp, /* input */
2694
unsigned char *md5sum /* output */,
2700
MD5_Update(&MD5pw, tmp, tmplen);
2701
MD5_Final(md5sum, &MD5pw);
2703
#endif /* USE_SSLEAY */