> On Feb 5, 2015, at 7:32 PM, shinr...@apache.org wrote: > > Repository: trafficserver > Updated Branches: > refs/heads/master 1d617582b -> 5fe69772a > > > TS-2480: Fix to work in the case where there are no ticket key files but > tickets have not been disabled.
Doesn't OpenSSL do this implicitly? Or is the problem that we end up setting the callback without having a keyblock? > Also fix RHEL 5 compile error. > > > Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo > Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/5fe69772 > Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/5fe69772 > Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/5fe69772 > > Branch: refs/heads/master > Commit: 5fe69772aa7e5e841349f3426a997930b44c0ff5 > Parents: 1d61758 > Author: shinrich <shinr...@yahoo-inc.com> > Authored: Thu Feb 5 19:24:08 2015 -0600 > Committer: shinrich <shinr...@yahoo-inc.com> > Committed: Thu Feb 5 21:32:26 2015 -0600 > > ---------------------------------------------------------------------- > iocore/net/SSLUtils.cc | 45 ++++++++++++++++++++++++++------------------- > 1 file changed, 26 insertions(+), 19 deletions(-) > ---------------------------------------------------------------------- > > > http://git-wip-us.apache.org/repos/asf/trafficserver/blob/5fe69772/iocore/net/SSLUtils.cc > ---------------------------------------------------------------------- > diff --git a/iocore/net/SSLUtils.cc b/iocore/net/SSLUtils.cc > index 055d396..f0265c6 100644 > --- a/iocore/net/SSLUtils.cc > +++ b/iocore/net/SSLUtils.cc > @@ -543,28 +543,34 @@ ssl_context_enable_tickets(SSL_CTX * ctx, const char * > ticket_key_path) > Error("failed to read SSL session ticket key from %s", (const char > *)ticket_key_path); > goto fail; > } > + } else { > + // Generate a random ticket key > + ticket_key_len = 48; > + ticket_key_data = (char *)ats_malloc(ticket_key_len); > + char *tmp_ptr = ticket_key_data; > + RAND_bytes(reinterpret_cast<unsigned char *>(tmp_ptr), ticket_key_len); > + } > > - num_ticket_keys = ticket_key_len / sizeof(ssl_ticket_key_t); > - if (num_ticket_keys == 0) { > - Error("SSL session ticket key from %s is too short (>= 48 bytes are > required)", (const char *)ticket_key_path); > - goto fail; > - } > + num_ticket_keys = ticket_key_len / sizeof(ssl_ticket_key_t); > + if (num_ticket_keys == 0) { > + Error("SSL session ticket key from %s is too short (>= 48 bytes are > required)", (const char *)ticket_key_path); > + goto fail; > + } > > - // Increase the stats. > - if (ssl_rsb != NULL) { // ssl_rsb is not initialized during the first > run. > - SSL_INCREMENT_DYN_STAT(ssl_total_ticket_keys_renewed_stat); > - } > + // Increase the stats. > + if (ssl_rsb != NULL) { // ssl_rsb is not initialized during the first run. > + SSL_INCREMENT_DYN_STAT(ssl_total_ticket_keys_renewed_stat); > + } > > - keyblock = ticket_block_alloc(num_ticket_keys); > + keyblock = ticket_block_alloc(num_ticket_keys); > > - // Slurp all the keys in the ticket key file. We will encrypt with the > first key, and decrypt > - // with any key (for rotation purposes). > - for (unsigned i = 0; i < num_ticket_keys; ++i) { > - const char * data = (const char *)ticket_key_data + (i * > sizeof(ssl_ticket_key_t)); > - memcpy(keyblock->keys[i].key_name, data, > sizeof(ssl_ticket_key_t::key_name)); > - memcpy(keyblock->keys[i].hmac_secret, data + > sizeof(ssl_ticket_key_t::key_name), sizeof(ssl_ticket_key_t::hmac_secret)); > - memcpy(keyblock->keys[i].aes_key, data + > sizeof(ssl_ticket_key_t::key_name) + sizeof(ssl_ticket_key_t::hmac_secret), > sizeof(ssl_ticket_key_t::aes_key)); > - } > + // Slurp all the keys in the ticket key file. We will encrypt with the > first key, and decrypt > + // with any key (for rotation purposes). > + for (unsigned i = 0; i < num_ticket_keys; ++i) { > + const char * data = (const char *)ticket_key_data + (i * > sizeof(ssl_ticket_key_t)); > + memcpy(keyblock->keys[i].key_name, data, > sizeof(ssl_ticket_key_t::key_name)); > + memcpy(keyblock->keys[i].hmac_secret, data + > sizeof(ssl_ticket_key_t::key_name), sizeof(ssl_ticket_key_t::hmac_secret)); > + memcpy(keyblock->keys[i].aes_key, data + > sizeof(ssl_ticket_key_t::key_name) + sizeof(ssl_ticket_key_t::hmac_secret), > sizeof(ssl_ticket_key_t::aes_key)); > } > > // Setting the callback can only fail if OpenSSL does not recognize the > @@ -1771,10 +1777,11 @@ ssl_store_ssl_context( > if (SSLConfigParams::init_ssl_ctx_cb) { > SSLConfigParams::init_ssl_ctx_cb(ctx, true); > } > +#if HAVE_OPENSSL_SESSION_TICKETS > if (!inserted && keyblock != NULL) { > ticket_block_free(keyblock); > } > - > +#endif > return ctx; > } > >