]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
add and use fr_memset_secure()
authorAlan T. DeKok <aland@freeradius.org>
Thu, 27 Jul 2023 22:53:03 +0000 (15:53 -0700)
committerAlan T. DeKok <aland@freeradius.org>
Thu, 27 Jul 2023 22:53:03 +0000 (15:53 -0700)
we will update the configure scripts later

src/lib/util/misc.c
src/lib/util/misc.h
src/lib/util/pair.c
src/lib/util/value.c

index 48db1bd21fdc04c51df714a904c8f26d4aa82b3b..b9f83820048e35df557a727f10011581cd3a7b69 100644 (file)
@@ -469,3 +469,23 @@ int fr_digest_cmp(uint8_t const *a, uint8_t const *b, size_t length)
 
        return result;          /* 0 is OK, !0 is !OK, just like memcmp */
 }
+
+void fr_memset_secure(void *ptr, size_t len)
+{
+       if (!len) return;
+
+#if defined(HAVE_MEMSET_S)
+       (void) memset_s(ptr, len, 0, len);
+
+#elif defined(HAVE_EXPLICIT_BZERO)
+       explicit_bzero(ptr, len);
+
+#else
+       volatile unsigned char *volatile p =  (volatile unsigned char *volatile) ptr;
+       size_t i = len;
+       
+       while (i--) {
+               *(p++) = 0;
+       }
+#endif
+}
index ccafef1880c92bbe4083deed8fd7c71fdd8020b8..54aa328f364f44c1c61e4f79b867ee262eb4db73 100644 (file)
@@ -171,6 +171,8 @@ int8_t              fr_pointer_cmp(void const *a, void const *b);
 void           fr_quick_sort(void const *to_sort[], int min_idx, int max_idx, fr_cmp_t cmp);
 int            fr_digest_cmp(uint8_t const *a, uint8_t const *b, size_t length) CC_HINT(nonnull);
 
+void           fr_memset_secure(void *ptr, size_t len);
+
 #ifdef __cplusplus
 }
 #endif
index 2c52255ecc14bbb0612e732f9d836416d439df28..66f3f33fe4990f202e3accb42dd07463549c4558 100644 (file)
@@ -87,7 +87,13 @@ static int _fr_pair_free(fr_pair_t *vp)
                fr_pair_list_free(&vp->vp_group);
                break;
 
+       case FR_TYPE_STRING:
+       case FR_TYPE_OCTETS:
+               if (vp->data.secret) fr_memset_secure(vp->vp_ptr, vp->vp_length);
+               break;
+
        default:
+               if (vp->data.secret) fr_memset_secure(&vp->data, sizeof(vp->data));
                break;
        }
 
index 8ff187ea9f744b1bf319df797962879f8618ebc3..1ba981b93f825b728f683f08f2828adc6601d011 100644 (file)
@@ -3525,6 +3525,7 @@ void fr_value_box_clear_value(fr_value_box_t *data)
        switch (data->type) {
        case FR_TYPE_OCTETS:
        case FR_TYPE_STRING:
+               if (data->secret) fr_memset_secure(data->datum.ptr, data->vb_length);
                talloc_free(data->datum.ptr);
                break;