gss: use _gss_secure_release_buffer_[set]
authorLuke Howard <lukeh@padl.com>
Wed, 15 Apr 2020 06:20:06 +0000 (16:20 +1000)
committerLuke Howard <lukeh@padl.com>
Wed, 15 Apr 2020 06:23:17 +0000 (16:23 +1000)
Use new helper APIs for securely zeroing and releasing buffers and buffer sets.

lib/gssapi/krb5/export_sec_context.c
lib/gssapi/krb5/gsskrb5_locl.h
lib/gssapi/mech/gss_cred.c
lib/gssapi/mech/gss_duplicate_cred.c
lib/gssapi/mech/gss_export_sec_context.c
lib/gssapi/mech/gss_inquire_cred_by_oid.c
lib/gssapi/mech/gss_krb5.c
lib/gssapi/spnego/negoex_ctx.c

index b500f4230cd359a16754d06c791749743da5d837..cba9f22f657d58ca0d8bb43fcfda44b4e2c373b0 100644 (file)
@@ -232,7 +232,7 @@ _gsskrb5_export_sec_context(
     ret = _gsskrb5_delete_sec_context (minor_status, context_handle,
                                       GSS_C_NO_BUFFER);
     if (ret != GSS_S_COMPLETE)
-       _gsskrb5_release_buffer (NULL, interprocess_token);
+       _gss_secure_release_buffer (&minor, interprocess_token);
     *minor_status = 0;
     return ret;
  failure:
index 555d095de881fcc5003d80190e2eabf18150a44b..e323881fa37978c72e501f920b8a9aa7b0ede0b6 100644 (file)
@@ -44,6 +44,7 @@
 #include <gssapi_mech.h>
 #include <gssapi_krb5.h>
 #include <assert.h>
+#include <mech/utils.h>
 
 #include "cfx.h"
 
index 1a7210e73a1bf7fea15648f72ce1abf9d870abe1..94642c5870c8fa90f332b9b6cb456e742c988e8c 100644 (file)
@@ -90,13 +90,13 @@ gss_export_cred(OM_uint32 * minor_status,
        if (buffer.length) {
            bytes = krb5_storage_write(sp, buffer.value, buffer.length);
            if (bytes < 0 || (size_t)bytes != buffer.length) {
-               gss_release_buffer(minor_status, &buffer);
+               _gss_secure_release_buffer(minor_status, &buffer);
                krb5_storage_free(sp);
                *minor_status = EINVAL;
                return GSS_S_FAILURE;
            }
        }
-       gss_release_buffer(minor_status, &buffer);
+       _gss_secure_release_buffer(minor_status, &buffer);
     }
 
     ret = krb5_storage_to_data(sp, &data);
index 720b4b47f7e82955d83ed0d5b6bbf7bd6eb27dc4..0c25ce9fa1ce3969c1c29fd55f0a21a80f327062 100644 (file)
@@ -53,7 +53,7 @@ copy_cred_element(OM_uint32 *minor_status,
        major_status = m->gm_export_cred(minor_status, mc->gmc_cred, &export);
        if (major_status == GSS_S_COMPLETE) {
            major_status = m->gm_import_cred(minor_status, &export, &dup_cred);
-           gss_release_buffer(&tmp, &export);
+           _gss_secure_release_buffer(&tmp, &export);
        }
     } else {
        struct _gss_mechanism_name mn;
index 52d83e25b5d6d432adfc34beb5312d7f460e3ccb..67e1d7091dad6e95f1029091f9558c7088df47e5 100644 (file)
@@ -84,7 +84,7 @@ gss_export_sec_context(OM_uint32 *minor_status,
                p[1] = m->gm_mech_oid.length;
                memcpy(p + 2, m->gm_mech_oid.elements, m->gm_mech_oid.length);
                memcpy(p + 2 + m->gm_mech_oid.length, buf.value, buf.length);
-               gss_release_buffer(minor_status, &buf);
+               _gss_secure_release_buffer(minor_status, &buf);
        } else {
                _gss_mg_error(m, *minor_status);
        }
index 1e6c51ff4504f6b3ecb5283146399efcb9fb6881..ee5ba6085f9fd06cf51cae5256ba65db8b7d8852 100644 (file)
@@ -58,8 +58,8 @@ gss_inquire_cred_by_oid (OM_uint32 *minor_status,
 
                m = mc->gmc_mech;
                if (m == NULL) {
-                       gss_release_buffer_set(minor_status, &set);
-                       *minor_status = 0;
+                       _gss_secure_release_buffer_set(minor_status, &set);
+                       minor_status = 0;
                        return GSS_S_BAD_MECH;
                }
 
@@ -79,7 +79,7 @@ gss_inquire_cred_by_oid (OM_uint32 *minor_status,
                        if (status != GSS_S_COMPLETE)
                                break;
                }
-               gss_release_buffer_set(minor_status, &rset);
+               _gss_secure_release_buffer_set(minor_status, &rset);
        }
        if (set == GSS_C_NO_BUFFER_SET && status == GSS_S_COMPLETE)
                status = GSS_S_FAILURE;
index 8a497ae9841a5550c50030615a57983cd7d3af8b..ebe39c44625b65c810ba3467481db7203ae12149 100644 (file)
@@ -383,7 +383,7 @@ gss_krb5_export_lucid_sec_context(OM_uint32 *minor_status,
     *rctx = ctx;
 
 out:
-    gss_release_buffer_set(minor_status, &data_set);
+    _gss_secure_release_buffer_set(minor_status, &data_set);
     if (sp)
        krb5_storage_free(sp);
     if (context)
@@ -736,7 +736,7 @@ gsskrb5_extract_key(OM_uint32 *minor_status,
        return major_status;
 
     if (data_set == GSS_C_NO_BUFFER_SET || data_set->count != 1) {
-       gss_release_buffer_set(minor_status, &data_set);
+       _gss_secure_release_buffer_set(minor_status, &data_set);
        *minor_status = EINVAL;
        return GSS_S_FAILURE;
     }
@@ -757,7 +757,7 @@ gsskrb5_extract_key(OM_uint32 *minor_status,
     ret = krb5_ret_keyblock(sp, *keyblock);
 
 out:
-    gss_release_buffer_set(minor_status, &data_set);
+    _gss_secure_release_buffer_set(minor_status, &data_set);
     if (sp)
        krb5_storage_free(sp);
     if (ret && keyblock) {
index 1f9408901d0313deaed7554f29338ff20541e549..dd4a880787dcf5a9a7bd2016432c184ea1c2e66d 100644 (file)
  * authenticate the entire exchange.
  */
 
-static void
-zero_and_release_buffer_set(gss_buffer_set_t *pBuffers)
-{
-    OM_uint32 tmpMinor;
-    gss_buffer_set_t buffers = *pBuffers;
-    size_t i;
-
-    if (buffers != GSS_C_NO_BUFFER_SET) {
-       for (i = 0; i < buffers->count; i++)
-           memset_s(buffers->elements[i].value,
-                    buffers->elements[i].length, 0,
-                    buffers->elements[i].length);
-
-       gss_release_buffer_set(&tmpMinor, &buffers);
-    }
-
-    *pBuffers = GSS_C_NO_BUFFER_SET;
-}
-
 static OM_uint32
 buffer_set_to_crypto(OM_uint32 *minor,
                     krb5_context context,
@@ -120,7 +101,7 @@ get_session_keys(OM_uint32 *minor,
     if (major == GSS_S_COMPLETE) {
        major = buffer_set_to_crypto(minor, context,
                                     buffers, &mech->crypto);
-       zero_and_release_buffer_set(&buffers);
+       _gss_secure_release_buffer_set(&tmpMinor, &buffers);
        if (major != GSS_S_COMPLETE)
            return major;
     }
@@ -131,7 +112,7 @@ get_session_keys(OM_uint32 *minor,
     if (major == GSS_S_COMPLETE) {
        major = buffer_set_to_crypto(minor, context,
                                     buffers, &mech->verify_crypto);
-       zero_and_release_buffer_set(&buffers);
+       _gss_secure_release_buffer_set(&tmpMinor, &buffers);
        if (major != GSS_S_COMPLETE)
            return major;
     }