}
void
-egg_secure_strclear (char *str)
+egg_secure_clear (void *p, size_t length)
{
volatile char *vp;
- size_t len;
- if (!str)
+ if (p == NULL)
return;
- vp = (volatile char*)str;
- len = strlen (str);
- while (len) {
- *vp = 0xAA;
- vp++;
- len--;
- }
+ vp = (volatile char*)p;
+ while (length) {
+ *vp = 0xAA;
+ vp++;
+ length--;
+ }
+}
+
+void
+egg_secure_strclear (char *str)
+{
+ if (!str)
+ return;
+ egg_secure_clear ((unsigned char*)str, strlen (str));
}
void
void egg_secure_free_full (void* p, int fallback);
+void egg_secure_clear (void *p, size_t length);
+
int egg_secure_check (const void* p);
void egg_secure_validate (void);
egg_secure_warnings = 1;
}
+
+DEFINE_TEST(secmem_clear)
+{
+ gpointer p;
+
+ p = egg_secure_alloc_full (188, 0);
+ g_assert (p != NULL);
+ memset (p, 0x89, 188);
+ g_assert (memchr (p, 0x89, 188) == p);
+
+ egg_secure_clear (p, 188);
+ g_assert (memchr (p, 0x89, 188) == NULL);
+
+ egg_secure_free_full (p, 0);
+}
+
+DEFINE_TEST(secmem_strclear)
+{
+ gchar *str;
+
+ str = egg_secure_strdup ("secret");
+ g_assert (str != NULL);
+ g_assert_cmpuint (strlen (str), ==, 6);
+ g_assert (strchr (str, 't') == str + 6);
+
+ egg_secure_strclear (str);
+ g_assert_cmpuint (strlen (str), ==, 6);
+ g_assert (strchr (str, 't') == NULL);
+
+ egg_secure_free_full (str, 0);
+}