diff options
Diffstat (limited to 'tcpd')
| -rw-r--r-- | tcpd/configure.ac | 25 | ||||
| -rw-r--r-- | tcpd/libcouriertls.c | 34 | ||||
| -rw-r--r-- | tcpd/tlspasswordcache.c | 146 |
3 files changed, 150 insertions, 55 deletions
diff --git a/tcpd/configure.ac b/tcpd/configure.ac index abbad25..13aec55 100644 --- a/tcpd/configure.ac +++ b/tcpd/configure.ac @@ -506,6 +506,31 @@ RAND_pseudo_bytes(dummy, 1); [ Whether OpenSSL 0.9.7 is installed ]) ], [ AC_MSG_RESULT(no) + + + + AC_MSG_CHECKING(for OpenSSL 1.1.0) + AC_TRY_LINK( [ +#include <openssl/evp.h> +#include <openssl/rand.h> +], +[ +char dummy[1]; +unsigned char a[1], b[1]; + +EVP_CIPHER_CTX *ctx=EVP_CIPHER_CTX_new(); +EVP_EncryptInit_ex(ctx, EVP_des_cbc(), NULL, a, b); +RAND_bytes(dummy, 1); + +], [ + CRYPTLIBS="-lcrypto $KRBLIBS" + AC_MSG_RESULT(yes) + AC_DEFINE_UNQUOTED(HAVE_OPENSSL110, 1, + [ Whether OpenSSL 1.1.0 is installed ]) +], [ + AC_MSG_RESULT(no) +]) + ] ) LIBS="-lssl $LIBS" diff --git a/tcpd/libcouriertls.c b/tcpd/libcouriertls.c index 321b812..8144395 100644 --- a/tcpd/libcouriertls.c +++ b/tcpd/libcouriertls.c @@ -62,6 +62,7 @@ struct proto_ops { }; struct proto_ops op_list[] = { +#ifndef HAVE_OPENSSL110 #ifdef HAVE_TLSV1_2_METHOD { "TLSv1.2+", &SSLv23_method, SSL_OP_ALL|SSL_OP_NO_SSLv2|SSL_OP_NO_SSLv3|SSL_OP_NO_TLSv1|SSL_OP_NO_TLSv1_1 }, { "TLSv1.2", &TLSv1_2_method, SSL_OP_ALL }, @@ -70,9 +71,11 @@ struct proto_ops op_list[] = { "TLSv1.1+", &SSLv23_method, SSL_OP_ALL|SSL_OP_NO_SSLv2|SSL_OP_NO_SSLv3|SSL_OP_NO_TLSv1 }, { "TLSv1.1", &TLSv1_1_method, SSL_OP_ALL }, #endif - { "TLSv1+", &SSLv23_method, SSL_OP_ALL|SSL_OP_NO_SSLv2|SSL_OP_NO_SSLv3 }, { "TLSv1", &TLSv1_method, SSL_OP_ALL }, { "TLS1", &TLSv1_method, SSL_OP_ALL }, +#endif + + { "TLSv1+", &SSLv23_method, SSL_OP_ALL|SSL_OP_NO_SSLv2|SSL_OP_NO_SSLv3 }, { "", &SSLv23_method, SSL_OP_ALL|SSL_OP_NO_SSLv2|SSL_OP_NO_SSLv3 }, { NULL, &SSLv23_method, SSL_OP_ALL|SSL_OP_NO_SSLv2|SSL_OP_NO_SSLv3 }, }; @@ -184,7 +187,7 @@ static int verifypeer(const struct tls_info *info, SSL *ssl) ASN1_STRING *d; int dlen; - unsigned char *ddata; + const unsigned char *ddata; e=X509_NAME_get_entry(subj, j); if (!e) @@ -199,8 +202,11 @@ static int verifypeer(const struct tls_info *info, SSL *ssl) obj_name=OBJ_nid2sn(OBJ_obj2nid(o)); dlen=ASN1_STRING_length(d); +#ifdef HAVE_OPENSSL110 + ddata=ASN1_STRING_get0_data(d); +#else ddata=ASN1_STRING_data(d); - +#endif if (strcasecmp(obj_name, "CN") == 0) { if (dlen >= sizeof(domain)-1) @@ -811,8 +817,14 @@ void tls_destroy(SSL_CTX *ctx) static int cache_add(SSL *ssl, SSL_SESSION *sess); +#ifdef HAVE_OPENSSL110 +static SSL_SESSION *cache_get(SSL *ssl, const unsigned char *id, int id_len, + int *copyflag); +#else static SSL_SESSION *cache_get(SSL *ssl, unsigned char *id, int id_len, int *copyflag); +#endif + static void cache_del(SSL_CTX *ctx, SSL_SESSION *ssl); static void init_session_cache(struct tls_info *info, SSL_CTX *ctx) @@ -889,7 +901,7 @@ static int cache_add(SSL *ssl, SSL_SESSION *sess) } struct walk_info { - unsigned char *id; + const unsigned char *id; int id_len; int *copyflag; SSL_SESSION *ret; @@ -899,8 +911,13 @@ struct walk_info { static int get_func(void *rec, size_t recsize, int *doupdate, void *arg); +#ifdef HAVE_OPENSSL110 +static SSL_SESSION *cache_get(SSL *ssl, const unsigned char *id, int id_len, + int *copyflag) +#else static SSL_SESSION *cache_get(SSL *ssl, unsigned char *id, int id_len, int *copyflag) +#endif { const struct tls_info *info=SSL_get_app_data(ssl); struct walk_info wi; @@ -1143,7 +1160,10 @@ void tls_disconnect(SSL *ssl, int fd) fcntl(fd, F_SETFL, 0); SSL_set_shutdown(ssl, SSL_SENT_SHUTDOWN|SSL_RECEIVED_SHUTDOWN); SSL_free(ssl); +#ifdef HAVE_OPENSSL110 +#else ERR_remove_state(0); +#endif } /* --------------------------------------- */ @@ -1408,7 +1428,7 @@ static void dump_x509(X509 *x509, ASN1_STRING *d; int dlen; - unsigned char *ddata; + const unsigned char *ddata; e=X509_NAME_get_entry(subj, j); if (!e) @@ -1423,7 +1443,11 @@ static void dump_x509(X509 *x509, obj_name=OBJ_nid2sn(OBJ_obj2nid(o)); dlen=ASN1_STRING_length(d); +#ifdef HAVE_OPENSSL110 + ddata=ASN1_STRING_get0_data(d); +#else ddata=ASN1_STRING_data(d); +#endif (*dump_func)(" ", -1, dump_arg); (*dump_func)(obj_name, -1, dump_arg); diff --git a/tcpd/tlspasswordcache.c b/tcpd/tlspasswordcache.c index 5f3ca2b..e26b72e 100644 --- a/tcpd/tlspasswordcache.c +++ b/tcpd/tlspasswordcache.c @@ -23,7 +23,25 @@ static void sslerror(EVP_CIPHER_CTX *ctx, const char *pfix) { char errmsg[256]; int errnum=ERR_get_error(); - + + ERR_error_string_n(errnum, errmsg, sizeof(errmsg)-1); + + fprintf(stderr, "%s: %s\n", pfix, errmsg); +} + + +#endif + +#if HAVE_OPENSSL110 +#include <openssl/ssl.h> +#include <openssl/err.h> +#include <openssl/rand.h> + +static void sslerror(EVP_CIPHER_CTX *ctx, const char *pfix) +{ + char errmsg[256]; + int errnum=ERR_get_error(); + ERR_error_string_n(errnum, errmsg, sizeof(errmsg)-1); fprintf(stderr, "%s: %s\n", pfix, errmsg); @@ -202,7 +220,7 @@ static int EVP_EncryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, if (!EVP_EncryptUpdate(ctx, out, &n_outl, &pad, 1)) return 0; - + out += n_outl; *outl += n_outl; } @@ -331,6 +349,30 @@ static int EVP_DecryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *outm, #define HAVE_OPENSSL097 1 #endif + +#if HAVE_OPENSSL110 + +#define RANDOM_BYTES RAND_bytes + +typedef EVP_CIPHER_CTX *CIPHER_CONTEXT; + +#define CIPHER_INIT(p) (p=EVP_CIPHER_CTX_new()) +#define CIPHER_CLEANUP(p) (EVP_CIPHER_CTX_free(p)) +#define HAVE_OPENSSL097 1 +#define RANDOM_BYTES RAND_bytes +#define CONTEXT(ctx) (*(ctx)) +#else + +typedef EVP_CIPHER_CTX CIPHER_CONTEXT; + +#define CIPHER_INIT(p) EVP_CIPHER_CTX_init(&p) +#define CIPHER_CLEANUP(p) EVP_CIPHER_CTX_cleanup(&p) +#define RANDOM_BYTES RAND_pseudo_bytes + +#define CONTEXT(ctx) (ctx) +#endif + + #if HAVE_OPENSSL097 #if BUFSIZ < 8192 @@ -343,7 +385,7 @@ int tlspassword_init() return 1; } -static int save_string(EVP_CIPHER_CTX *, +static int save_string(CIPHER_CONTEXT *, const char *, char *, int (*)(const char *, size_t, void *), void *); @@ -363,22 +405,22 @@ int tlspassword_save( const char * const *urls, unsigned char iv2_buf[16]; MD5_DIGEST md5_password; int iv_len, key_len; - EVP_CIPHER_CTX ctx; + CIPHER_CONTEXT ctx; const EVP_CIPHER *des=EVP_des_cbc(); md5_digest(mpw, strlen(mpw), md5_password); - EVP_CIPHER_CTX_init(&ctx); + CIPHER_INIT(ctx); iv_len=EVP_CIPHER_iv_length(des); key_len=EVP_CIPHER_key_length(des); - if (RAND_pseudo_bytes(iv1_buf, sizeof(iv1_buf)) < 0 || - RAND_pseudo_bytes(iv2_buf, sizeof(iv2_buf)) < 0) + if (RANDOM_BYTES(iv1_buf, sizeof(iv1_buf)) < 0 || + RANDOM_BYTES(iv2_buf, sizeof(iv2_buf)) < 0) { fprintf(stderr, "tlspassword_save: internal error - " - "RAND_pseudo_bytes() failed.\n"); - EVP_CIPHER_CTX_cleanup(&ctx); + "RANDOM_BYTES() failed.\n"); + CIPHER_CLEANUP(ctx); errno=EIO; return -1; } @@ -390,27 +432,27 @@ int tlspassword_save( const char * const *urls, fprintf(stderr, "tlspassword_save: internal error - " "unexpected key sizes.\n"); - EVP_CIPHER_CTX_cleanup(&ctx); + CIPHER_CLEANUP(ctx); errno=EIO; return -1; } p=buf+3; - if (!EVP_EncryptInit_ex(&ctx, des, NULL, + if (!EVP_EncryptInit_ex(CONTEXT(&ctx), des, NULL, (unsigned char *)md5_password, iv1_buf) || - !EVP_EncryptUpdate(&ctx, (unsigned char *)p, &l, + !EVP_EncryptUpdate(CONTEXT(&ctx), (unsigned char *)p, &l, (unsigned char *)md5_password + key_len, sizeof(md5_password)-key_len) || - !EVP_EncryptUpdate(&ctx, (unsigned char *)(p += l), &l, + !EVP_EncryptUpdate(CONTEXT(&ctx), (unsigned char *)(p += l), &l, iv2_buf, iv_len + key_len) || - !EVP_EncryptFinal_ex(&ctx, (unsigned char *)(p += l), &l)) + !EVP_EncryptFinal_ex(CONTEXT(&ctx), (unsigned char *)(p += l), &l)) { - sslerror(&ctx, "EVP_EncryptInit_ex"); - EVP_CIPHER_CTX_cleanup(&ctx); + sslerror(CONTEXT(&ctx), "EVP_EncryptInit_ex"); + CIPHER_CLEANUP(ctx); errno=EIO; return -1; } @@ -446,12 +488,12 @@ int tlspassword_save( const char * const *urls, } #endif - if (!EVP_EncryptInit_ex(&ctx, des, NULL, + if (!EVP_EncryptInit_ex(CONTEXT(&ctx), des, NULL, (unsigned char *)&iv2_buf, (unsigned char *)&iv2_buf + key_len)) { - sslerror(&ctx, "EVP_EncryptInit_ex"); - EVP_CIPHER_CTX_cleanup(&ctx); + sslerror(CONTEXT(&ctx), "EVP_EncryptInit_ex"); + CIPHER_CLEANUP(ctx); errno=EIO; return -1; } @@ -469,10 +511,10 @@ int tlspassword_save( const char * const *urls, return n; } - if (!EVP_EncryptFinal_ex(&ctx, (unsigned char *)buf, &l)) + if (!EVP_EncryptFinal_ex(CONTEXT(&ctx), (unsigned char *)buf, &l)) { - sslerror(&ctx, "EVP_EncryptInit_ex"); - EVP_CIPHER_CTX_cleanup(&ctx); + sslerror(CONTEXT(&ctx), "EVP_EncryptInit_ex"); + CIPHER_CLEANUP(ctx); errno=EIO; return -1; } @@ -480,11 +522,11 @@ int tlspassword_save( const char * const *urls, if (l) l=(*writefunc)(buf, l, writefuncarg); - EVP_CIPHER_CTX_cleanup(&ctx); + CIPHER_CLEANUP(ctx); return l; } -static int save_string(EVP_CIPHER_CTX *ctx, +static int save_string(CIPHER_CONTEXT *ctx, const char *str, char *buf, int (*writefunc)(const char *, size_t, void *), void *writefuncarg) @@ -505,9 +547,9 @@ static int save_string(EVP_CIPHER_CTX *ctx, b[0]=len / 256; b[1]=len % 256; - if (!EVP_EncryptUpdate(ctx, (unsigned char *)buf, &l, b, 2)) + if (!EVP_EncryptUpdate(CONTEXT(ctx), (unsigned char *)buf, &l, b, 2)) { - sslerror(ctx, "EVP_EncryptUpdate"); + sslerror(CONTEXT(ctx), "EVP_EncryptUpdate"); return -1; } @@ -526,10 +568,10 @@ static int save_string(EVP_CIPHER_CTX *ctx, if (n > BUFSIZ / 4) n=BUFSIZ/4; - if (!EVP_EncryptUpdate(ctx, (unsigned char *)buf, &l, + if (!EVP_EncryptUpdate(CONTEXT(ctx), (unsigned char *)buf, &l, (unsigned char *)str, n)) { - sslerror(ctx, "EVP_EncryptUpdate"); + sslerror(CONTEXT(ctx), "EVP_EncryptUpdate"); return -1; } @@ -639,7 +681,7 @@ int tlspassword_load( int (*callback)(char *, size_t, void *), MD5_DIGEST md5_password; int iv_len, key_len; - EVP_CIPHER_CTX ctx; + CIPHER_CONTEXT ctx; const EVP_CIPHER *des=EVP_des_cbc(); struct tlspassword_readinfo readinfo; char header[3]; @@ -656,20 +698,20 @@ int tlspassword_load( int (*callback)(char *, size_t, void *), md5_digest(mpw, strlen(mpw), md5_password); - EVP_CIPHER_CTX_init(&ctx); + CIPHER_INIT(ctx); iv_len=EVP_CIPHER_iv_length(des); key_len=EVP_CIPHER_key_length(des); if (tlspassword_read(&readinfo, header, 3) || tlspassword_read(&readinfo, iv1_buf, iv_len)) { - EVP_CIPHER_CTX_cleanup(&ctx); + CIPHER_CLEANUP(ctx); return -1; } if (header[0] != PASSFILEFORMAT) { errno=EINVAL; - EVP_CIPHER_CTX_cleanup(&ctx); + CIPHER_CLEANUP(ctx); return -1; } @@ -677,7 +719,7 @@ int tlspassword_load( int (*callback)(char *, size_t, void *), + (unsigned char)header[2]) > sizeof(buf) / 4) { errno=EINVAL; - EVP_CIPHER_CTX_cleanup(&ctx); + CIPHER_CLEANUP(ctx); return -1; } @@ -685,15 +727,15 @@ int tlspassword_load( int (*callback)(char *, size_t, void *), return -1; p=buf + sizeof(buf)/2; - if (!EVP_DecryptInit_ex(&ctx, des, NULL, + if (!EVP_DecryptInit_ex(CONTEXT(&ctx), des, NULL, (unsigned char *)md5_password, (unsigned char *)&iv1_buf) || - !EVP_DecryptUpdate(&ctx, (unsigned char *)p, &outl, + !EVP_DecryptUpdate(CONTEXT(&ctx), (unsigned char *)p, &outl, (unsigned char *)buf, l) || - !EVP_DecryptFinal_ex(&ctx, (unsigned char *)(p += outl), &outl)) + !EVP_DecryptFinal_ex(CONTEXT(&ctx), (unsigned char *)(p += outl), &outl)) { errno=EINVAL; - EVP_CIPHER_CTX_cleanup(&ctx); + CIPHER_CLEANUP(ctx); return -1; } @@ -704,7 +746,7 @@ int tlspassword_load( int (*callback)(char *, size_t, void *), sizeof(md5_password)-key_len)) { errno=EINVAL; - EVP_CIPHER_CTX_cleanup(&ctx); + CIPHER_CLEANUP(ctx); return -1; } @@ -720,12 +762,12 @@ int tlspassword_load( int (*callback)(char *, size_t, void *), } #endif - if (!EVP_DecryptInit_ex(&ctx, des, NULL, + if (!EVP_DecryptInit_ex(CONTEXT(&ctx), des, NULL, (unsigned char *)(p-iv_len-key_len), (unsigned char *)(p-iv_len))) { errno=EINVAL; - EVP_CIPHER_CTX_cleanup(&ctx); + CIPHER_CLEANUP(ctx); return -1; } @@ -746,7 +788,7 @@ int tlspassword_load( int (*callback)(char *, size_t, void *), { tlspassword_readcleanup(&readinfo); errno=EINVAL; - EVP_CIPHER_CTX_cleanup(&ctx); + CIPHER_CLEANUP(ctx); return -1; } @@ -754,13 +796,13 @@ int tlspassword_load( int (*callback)(char *, size_t, void *), readinfo.bufleft=outl; } - if (!EVP_DecryptUpdate(&ctx, (unsigned char *)buf, &outl, + if (!EVP_DecryptUpdate(CONTEXT(&ctx), (unsigned char *)buf, &outl, (unsigned char *) readinfo.bufptr, readinfo.bufleft)) { tlspassword_readcleanup(&readinfo); errno=EINVAL; - EVP_CIPHER_CTX_cleanup(&ctx); + CIPHER_CLEANUP(ctx); return -1; } readinfo.bufleft=0; @@ -773,7 +815,7 @@ int tlspassword_load( int (*callback)(char *, size_t, void *), if (n < 0) { tlspassword_readcleanup(&readinfo); - EVP_CIPHER_CTX_cleanup(&ctx); + CIPHER_CLEANUP(ctx); return -1; } @@ -782,11 +824,11 @@ int tlspassword_load( int (*callback)(char *, size_t, void *), } } - if (!EVP_DecryptFinal_ex(&ctx, (unsigned char *)buf, &outl)) + if (!EVP_DecryptFinal_ex(CONTEXT(&ctx), (unsigned char *)buf, &outl)) { tlspassword_readcleanup(&readinfo); errno=EINVAL; - EVP_CIPHER_CTX_cleanup(&ctx); + CIPHER_CLEANUP(ctx); return -1; } @@ -799,7 +841,7 @@ int tlspassword_load( int (*callback)(char *, size_t, void *), { tlspassword_readcleanup(&readinfo); errno=EINVAL; - EVP_CIPHER_CTX_cleanup(&ctx); + CIPHER_CLEANUP(ctx); return -1; } @@ -812,7 +854,7 @@ int tlspassword_load( int (*callback)(char *, size_t, void *), { tlspassword_readcleanup(&readinfo); errno=EINVAL; - EVP_CIPHER_CTX_cleanup(&ctx); + CIPHER_CLEANUP(ctx); return (-1); } @@ -823,7 +865,7 @@ int tlspassword_load( int (*callback)(char *, size_t, void *), free(urls); tlspassword_readcleanup(&readinfo); - EVP_CIPHER_CTX_cleanup(&ctx); + CIPHER_CLEANUP(ctx); return (-1); } @@ -844,7 +886,7 @@ int tlspassword_load( int (*callback)(char *, size_t, void *), free(pws); tlspassword_readcleanup(&readinfo); - EVP_CIPHER_CTX_cleanup(&ctx); + CIPHER_CLEANUP(ctx); return 0; } @@ -923,6 +965,10 @@ static int read_string(struct tlspassword_readinfo *info, char *p, int n) #else + + + + int tlspassword_init() { return 0; |
