Add SSL_SESSION_get_master_key. Opaquifying SSL_SESSION is less important than the other structs, but this will cause less turbulence in wpa_supplicant if we add this API too. Semantics and name taken from OpenSSL 1.1.0 to match. BUG=6 Change-Id: Ic39f58d74640fa19a60aafb434dd2c4cb43cdea9 Reviewed-on: https://boringssl-review.googlesource.com/7725 Reviewed-by: Adam Langley <agl@google.com>
diff --git a/include/openssl/ssl.h b/include/openssl/ssl.h index 26e504d..7cb12f1 100644 --- a/include/openssl/ssl.h +++ b/include/openssl/ssl.h
@@ -1496,6 +1496,12 @@ * TODO(davidben): This should return a const X509 *. */ OPENSSL_EXPORT X509 *SSL_SESSION_get0_peer(const SSL_SESSION *session); +/* SSL_SESSION_get_master_key writes up to |max_out| bytes of |session|'s master + * secret to |out| and returns the number of bytes written. If |max_out| is + * zero, it returns the size of the master secret. */ +OPENSSL_EXPORT size_t SSL_SESSION_get_master_key(const SSL_SESSION *session, + uint8_t *out, size_t max_out); + /* SSL_SESSION_set_time sets |session|'s creation time to |time| and returns * |time|. This function may be useful in writing tests but otherwise should not * be used. */
diff --git a/ssl/ssl_session.c b/ssl/ssl_session.c index 5a6a10d..12d065e 100644 --- a/ssl/ssl_session.c +++ b/ssl/ssl_session.c
@@ -231,6 +231,19 @@ return session->peer; } +size_t SSL_SESSION_get_master_key(const SSL_SESSION *session, uint8_t *out, + size_t max_out) { + /* TODO(davidben): Fix master_key_length's type and remove these casts. */ + if (max_out == 0) { + return (size_t)session->master_key_length; + } + if (max_out > (size_t)session->master_key_length) { + max_out = (size_t)session->master_key_length; + } + memcpy(out, session->master_key, max_out); + return max_out; +} + long SSL_SESSION_set_time(SSL_SESSION *session, long time) { if (session == NULL) { return 0;