summaryrefslogtreecommitdiff
path: root/shared/nm-utils/nm-secret-utils.c
diff options
context:
space:
mode:
Diffstat (limited to 'shared/nm-utils/nm-secret-utils.c')
-rw-r--r--shared/nm-utils/nm-secret-utils.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/shared/nm-utils/nm-secret-utils.c b/shared/nm-utils/nm-secret-utils.c
index 65f99c65d9..ec5cc6b1b3 100644
--- a/shared/nm-utils/nm-secret-utils.c
+++ b/shared/nm-utils/nm-secret-utils.c
@@ -17,6 +17,7 @@
* Boston, MA 02110-1301 USA.
*
* (C) Copyright 2018 Red Hat, Inc.
+ * (C) Copyright 2015 - 2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
*/
#include "nm-default.h"
@@ -132,3 +133,29 @@ nm_secret_buf_to_gbytes_take (NMSecretBuf *secret, gssize actual_len)
_secret_buf_free,
secret);
}
+
+/*****************************************************************************/
+
+/**
+ * nm_utils_memeqzero_secret:
+ * @data: the data pointer to check (may be %NULL if @length is zero).
+ * @length: the number of bytes to check.
+ *
+ * Checks that all bytes are zero. This always takes the same amount
+ * of time to prevent timing attacks.
+ *
+ * Returns: whether all bytes are zero.
+ */
+gboolean
+nm_utils_memeqzero_secret (gconstpointer data, gsize length)
+{
+ const guint8 *const key = data;
+ volatile guint8 acc = 0;
+ gsize i;
+
+ for (i = 0; i < length; i++) {
+ acc |= key[i];
+ asm volatile("" : "=r"(acc) : "0"(acc));
+ }
+ return 1 & ((acc - 1) >> 8);
+}