[Openvpn-devel,v1] ssl: wipe PRF master secret on failure paths

Message ID 20261102141538.29830-1-gert@greenie.muc.de
State New
Headers
Series [Openvpn-devel,v1] ssl: wipe PRF master secret on failure paths |

Commit Message

Gert Doering Nov. 2, 2026, 2:15 p.m. UTC
  From: Razvan Cojocaru <razvanc@mailbox.org>

generate_key_expansion_openvpn_prf() returned early without wiping
master when either openvpn_PRF() call failed. Wipe it at a single
exit point.

Change-Id: Icf823c286e48726934131af722fadee4a2ef7a56
Signed-off-by: Razvan Cojocaru <razvanc@mailbox.org>
Acked-by: Steffan Karger <steffan@karger.me>
Gerrit URL: https://gerrit.openvpn.net/c/openvpn/+/2088
---

This change was reviewed on Gerrit and approved by at least one
developer. I request to merge it to master.

Gerrit URL: https://gerrit.openvpn.net/c/openvpn/+/2088
This mail reflects revision 1 of this Change.

Acked-by according to Gerrit (reflected above):
Steffan Karger <steffan@karger.me>
  

Patch

diff --git a/src/openvpn/ssl.c b/src/openvpn/ssl.c
index 086a6fc..03180c6 100644
--- a/src/openvpn/ssl.c
+++ b/src/openvpn/ssl.c
@@ -1503,6 +1503,7 @@ 
 generate_key_expansion_openvpn_prf(const struct tls_session *session, struct key2 *key2)
 {
     uint8_t master[48] = { 0 };
+    bool ret = false;
 
     const struct key_state *ks = &session->key[KS_PRIMARY];
     const struct key_source2 *key_src = ks->key_src;
@@ -1521,7 +1522,7 @@ 
                      sizeof(key_src->client.random1), key_src->server.random1,
                      sizeof(key_src->server.random1), NULL, NULL, master, sizeof(master)))
     {
-        return false;
+        goto exit;
     }
 
     /* compute key expansion */
@@ -1530,13 +1531,15 @@ 
                      key_src->server.random2, sizeof(key_src->server.random2), client_sid,
                      server_sid, (uint8_t *)key2->keys, sizeof(key2->keys)))
     {
-        return false;
+        goto exit;
     }
-    secure_memzero(&master, sizeof(master));
 
     key2->n = 2;
+    ret = true;
 
-    return true;
+exit:
+    secure_memzero(&master, sizeof(master));
+    return ret;
 }
 
 /*