SSL_CTX_set_tlsext_ticket_key_cb.pod 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. =pod
  2. =head1 NAME
  3. SSL_CTX_set_tlsext_ticket_key_cb - set a callback for session ticket processing
  4. =head1 SYNOPSIS
  5. #include <openssl/tls1.h>
  6. long SSL_CTX_set_tlsext_ticket_key_cb(SSL_CTX sslctx,
  7. int (*cb)(SSL *s, unsigned char key_name[16],
  8. unsigned char iv[EVP_MAX_IV_LENGTH],
  9. EVP_CIPHER_CTX *ctx, HMAC_CTX *hctx, int enc));
  10. =head1 DESCRIPTION
  11. SSL_CTX_set_tlsext_ticket_key_cb() sets a callback function I<cb> for handling
  12. session tickets for the ssl context I<sslctx>. Session tickets, defined in
  13. RFC5077 provide an enhanced session resumption capability where the server
  14. implementation is not required to maintain per session state. It only applies
  15. to TLS and there is no SSLv3 implementation.
  16. The callback function I<cb> will be called for every client instigated TLS
  17. session when session ticket extension is presented in the TLS hello
  18. message. It is the responsibility of this function to create or retrieve the
  19. cryptographic parameters and to maintain their state.
  20. The OpenSSL library uses your callback function to help implement a common TLS
  21. ticket construction state according to RFC5077 Section 4 such that per session
  22. state is unnecessary and a small set of cryptographic variables needs to be
  23. maintained by the callback function implementation.
  24. In order to reuse a session, a TLS client must send the a session ticket
  25. extension to the server. The client can only send exactly one session ticket.
  26. The server, through the callback function, either agrees to reuse the session
  27. ticket information or it starts a full TLS handshake to create a new session
  28. ticket.
  29. Before the callback function is started I<ctx> and I<hctx> have been
  30. initialised with EVP_CIPHER_CTX_init and HMAC_CTX_init respectively.
  31. For new sessions tickets, when the client doesn't present a session ticket, or
  32. an attempted retrieval of the ticket failed, or a renew option was indicated,
  33. the callback function will be called with I<enc> equal to 1. The OpenSSL
  34. library expects that the function will set an arbitrary I<name>, initialize
  35. I<iv>, and set the cipher context I<ctx> and the hash context I<hctx>.
  36. The I<name> is 16 characters long and is used as a key identifier.
  37. The I<iv> length is the length of the IV of the corresponding cipher. The
  38. maximum IV length is B<EVP_MAX_IV_LENGTH> bytes defined in B<evp.h>.
  39. The initialization vector I<iv> should be a random value. The cipher context
  40. I<ctx> should use the initialisation vector I<iv>. The cipher context can be
  41. set using L<EVP_EncryptInit_ex(3)>. The hmac context can be set using
  42. L<HMAC_Init_ex(3)>.
  43. When the client presents a session ticket, the callback function with be called
  44. with I<enc> set to 0 indicating that the I<cb> function should retrieve a set
  45. of parameters. In this case I<name> and I<iv> have already been parsed out of
  46. the session ticket. The OpenSSL library expects that the I<name> will be used
  47. to retrieve a cryptographic parameters and that the cryptographic context
  48. I<ctx> will be set with the retrieved parameters and the initialization vector
  49. I<iv>. using a function like L<EVP_DecryptInit_ex(3)>. The I<hctx> needs to be
  50. set using L<HMAC_Init_ex(3)>.
  51. If the I<name> is still valid but a renewal of the ticket is required the
  52. callback function should return 2. The library will call the callback again
  53. with an argument of enc equal to 1 to set the new ticket.
  54. The return value of the I<cb> function is used by OpenSSL to determine what
  55. further processing will occur. The following return values have meaning:
  56. =over 4
  57. =item Z<>2
  58. This indicates that the I<ctx> and I<hctx> have been set and the session can
  59. continue on those parameters. Additionally it indicates that the session
  60. ticket is in a renewal period and should be replaced. The OpenSSL library will
  61. call I<cb> again with an enc argument of 1 to set the new ticket (see RFC5077
  62. 3.3 paragraph 2).
  63. =item Z<>1
  64. This indicates that the I<ctx> and I<hctx> have been set and the session can
  65. continue on those parameters.
  66. =item Z<>0
  67. This indicates that it was not possible to set/retrieve a session ticket and
  68. the SSL/TLS session will continue by negotiating a set of cryptographic
  69. parameters or using the alternate SSL/TLS resumption mechanism, session ids.
  70. If called with enc equal to 0 the library will call the I<cb> again to get
  71. a new set of parameters.
  72. =item less than 0
  73. This indicates an error.
  74. =back
  75. =head1 NOTES
  76. Session resumption shortcuts the TLS so that the client certificate
  77. negotiation don't occur. It makes up for this by storing client certificate
  78. an all other negotiated state information encrypted within the ticket. In a
  79. resumed session the applications will have all this state information available
  80. exactly as if a full negotiation had occurred.
  81. If an attacker can obtain the key used to encrypt a session ticket, they can
  82. obtain the master secret for any ticket using that key and decrypt any traffic
  83. using that session: even if the cipher suite supports forward secrecy. As
  84. a result applications may wish to use multiple keys and avoid using long term
  85. keys stored in files.
  86. Applications can use longer keys to maintain a consistent level of security.
  87. For example if a cipher suite uses 256 bit ciphers but only a 128 bit ticket key
  88. the overall security is only 128 bits because breaking the ticket key will
  89. enable an attacker to obtain the session keys.
  90. =head1 EXAMPLES
  91. Reference Implementation:
  92. SSL_CTX_set_tlsext_ticket_key_cb(SSL, ssl_tlsext_ticket_key_cb);
  93. ...
  94. static int ssl_tlsext_ticket_key_cb(SSL *s, unsigned char key_name[16],
  95. unsigned char *iv, EVP_CIPHER_CTX *ctx,
  96. HMAC_CTX *hctx, int enc)
  97. {
  98. if (enc) { /* create new session */
  99. if (RAND_bytes(iv, EVP_MAX_IV_LENGTH) <= 0)
  100. return -1; /* insufficient random */
  101. key = currentkey(); /* something that you need to implement */
  102. if (key == NULL) {
  103. /* current key doesn't exist or isn't valid */
  104. key = createkey(); /*
  105. * Something that you need to implement.
  106. * createkey needs to initialise a name,
  107. * an aes_key, a hmac_key and optionally
  108. * an expire time.
  109. */
  110. if (key == NULL) /* key couldn't be created */
  111. return 0;
  112. }
  113. memcpy(key_name, key->name, 16);
  114. EVP_EncryptInit_ex(&ctx, EVP_aes_128_cbc(), NULL, key->aes_key, iv);
  115. HMAC_Init_ex(&hctx, key->hmac_key, 16, EVP_sha256(), NULL);
  116. return 1;
  117. } else { /* retrieve session */
  118. key = findkey(name);
  119. if (key == NULL || key->expire < now())
  120. return 0;
  121. HMAC_Init_ex(&hctx, key->hmac_key, 16, EVP_sha256(), NULL);
  122. EVP_DecryptInit_ex(&ctx, EVP_aes_128_cbc(), NULL, key->aes_key, iv);
  123. if (key->expire < now() - RENEW_TIME) {
  124. /*
  125. * return 2 - This session will get a new ticket even though the
  126. * current one is still valid.
  127. */
  128. return 2;
  129. }
  130. return 1;
  131. }
  132. }
  133. =head1 RETURN VALUES
  134. returns 0 to indicate the callback function was set.
  135. =head1 SEE ALSO
  136. L<ssl(7)>, L<SSL_set_session(3)>,
  137. L<SSL_session_reused(3)>,
  138. L<SSL_CTX_add_session(3)>,
  139. L<SSL_CTX_sess_number(3)>,
  140. L<SSL_CTX_sess_set_get_cb(3)>,
  141. L<SSL_CTX_set_session_id_context(3)>,
  142. =head1 COPYRIGHT
  143. Copyright 2014-2018 The OpenSSL Project Authors. All Rights Reserved.
  144. Licensed under the OpenSSL license (the "License"). You may not use
  145. this file except in compliance with the License. You can obtain a copy
  146. in the file LICENSE in the source distribution or at
  147. L<https://www.openssl.org/source/license.html>.
  148. =cut