Blame egg/egg-secure-memory.h

Packit Service f02b19
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
Packit Service f02b19
/* egg-secure-memory.h - library for allocating memory that is non-pageable
Packit Service f02b19
Packit Service f02b19
   Copyright (C) 2007 Stefan Walter
Packit Service f02b19
Packit Service f02b19
   The Gnome Keyring Library is free software; you can redistribute it and/or
Packit Service f02b19
   modify it under the terms of the GNU Library General Public License as
Packit Service f02b19
   published by the Free Software Foundation; either version 2 of the
Packit Service f02b19
   License, or (at your option) any later version.
Packit Service f02b19
Packit Service f02b19
   The Gnome Keyring Library is distributed in the hope that it will be useful,
Packit Service f02b19
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service f02b19
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service f02b19
   Library General Public License for more details.
Packit Service f02b19
Packit Service f02b19
   You should have received a copy of the GNU Library General Public
Packit Service f02b19
   License along with the Gnome Library; see the file COPYING.LIB.  If not,
Packit Service f02b19
   see <http://www.gnu.org/licenses/>.
Packit Service f02b19
Packit Service f02b19
   Author: Stef Walter <stef@memberwebs.com>
Packit Service f02b19
*/
Packit Service f02b19
Packit Service f02b19
#ifndef EGG_SECURE_MEMORY_H
Packit Service f02b19
#define EGG_SECURE_MEMORY_H
Packit Service f02b19
Packit Service f02b19
#include <stdlib.h>
Packit Service f02b19
Packit Service f02b19
/* -------------------------------------------------------------------
Packit Service f02b19
 * Low Level Secure Memory
Packit Service f02b19
 *
Packit Service f02b19
 * IMPORTANT: This is pure vanila standard C, no glib. We need this
Packit Service f02b19
 * because certain consumers of this protocol need to be built
Packit Service f02b19
 * without linking in any special libraries. ie: the PKCS#11 module.
Packit Service f02b19
 *
Packit Service f02b19
 * Thread locking
Packit Service f02b19
 *
Packit Service f02b19
 * In order to use these functions in a module the following functions
Packit Service f02b19
 * must be defined somewhere, and provide appropriate locking for
Packit Service f02b19
 * secure memory between threads:
Packit Service f02b19
 */
Packit Service f02b19
Packit Service f02b19
typedef struct {
Packit Service f02b19
	void       (* lock)        (void);
Packit Service f02b19
	void       (* unlock)      (void);
Packit Service f02b19
	void *     (* fallback)    (void *pointer,
Packit Service f02b19
	                            size_t length);
Packit Service f02b19
	void *        pool_data;
Packit Service f02b19
	const char *  pool_version;
Packit Service f02b19
} egg_secure_glob;
Packit Service f02b19
Packit Service f02b19
#define EGG_SECURE_POOL_VER_STR             "1.0"
Packit Service f02b19
#define EGG_SECURE_GLOBALS SECMEM_pool_data_v1_0
Packit Service f02b19
Packit Service f02b19
#define EGG_SECURE_DEFINE_GLOBALS(lock, unlock, fallback) \
Packit Service f02b19
	egg_secure_glob EGG_SECURE_GLOBALS = { \
Packit Service f02b19
		lock, unlock, fallback, NULL, EGG_SECURE_POOL_VER_STR };
Packit Service f02b19
Packit Service f02b19
#define EGG_SECURE_DEFINE_GLIB_GLOBALS() \
Packit Service f02b19
	static GMutex memory_mutex = { 0, }; \
Packit Service f02b19
	static void egg_memory_lock (void) \
Packit Service f02b19
		{ g_mutex_lock (&memory_mutex); } \
Packit Service f02b19
	static void egg_memory_unlock (void) \
Packit Service f02b19
		{ g_mutex_unlock (&memory_mutex); } \
Packit Service f02b19
	EGG_SECURE_DEFINE_GLOBALS (egg_memory_lock, egg_memory_unlock, g_realloc);
Packit Service f02b19
Packit Service f02b19
extern egg_secure_glob EGG_SECURE_GLOBALS;
Packit Service f02b19
Packit Service f02b19
/*
Packit Service f02b19
 * Main functionality
Packit Service f02b19
 *
Packit Service f02b19
 * Allocations return NULL on failure.
Packit Service f02b19
 */
Packit Service f02b19
Packit Service f02b19
#define EGG_SECURE_USE_FALLBACK     0x0001
Packit Service f02b19
Packit Service f02b19
#define EGG_SECURE_DECLARE(tag) \
Packit Service f02b19
	static inline void* egg_secure_alloc (size_t length) { \
Packit Service f02b19
		return egg_secure_alloc_full (G_STRINGIFY (tag), length, EGG_SECURE_USE_FALLBACK); \
Packit Service f02b19
	} \
Packit Service f02b19
	static inline void* egg_secure_realloc (void *p, size_t length) { \
Packit Service f02b19
		return egg_secure_realloc_full (G_STRINGIFY (tag), p, length, EGG_SECURE_USE_FALLBACK); \
Packit Service f02b19
	} \
Packit Service f02b19
	static inline void* egg_secure_strdup (const char *str) { \
Packit Service f02b19
		return egg_secure_strdup_full (G_STRINGIFY (tag), str, EGG_SECURE_USE_FALLBACK); \
Packit Service f02b19
	} \
Packit Service f02b19
	static inline void* egg_secure_strndup (const char *str, size_t length) { \
Packit Service f02b19
		return egg_secure_strndup_full (G_STRINGIFY (tag), str, length, EGG_SECURE_USE_FALLBACK); \
Packit Service f02b19
	}
Packit Service f02b19
Packit Service f02b19
void*  egg_secure_alloc_full   (const char *tag, size_t length, int options);
Packit Service f02b19
Packit Service f02b19
void*  egg_secure_realloc_full (const char *tag, void *p, size_t length, int options);
Packit Service f02b19
Packit Service f02b19
void   egg_secure_free         (void* p);
Packit Service f02b19
Packit Service f02b19
void   egg_secure_free_full    (void* p, int fallback);
Packit Service f02b19
Packit Service f02b19
void   egg_secure_clear        (void *p, size_t length);
Packit Service f02b19
Packit Service f02b19
int    egg_secure_check        (const void* p);
Packit Service f02b19
Packit Service f02b19
void   egg_secure_validate     (void);
Packit Service f02b19
Packit Service f02b19
char*  egg_secure_strdup_full  (const char *tag, const char *str, int options);
Packit Service f02b19
Packit Service f02b19
char*  egg_secure_strndup_full (const char *tag, const char *str, size_t length, int options);
Packit Service f02b19
Packit Service f02b19
void   egg_secure_strclear     (char *str);
Packit Service f02b19
Packit Service f02b19
void   egg_secure_strfree      (char *str);
Packit Service f02b19
Packit Service f02b19
typedef struct {
Packit Service f02b19
	const char *tag;
Packit Service f02b19
	size_t request_length;
Packit Service f02b19
	size_t block_length;
Packit Service f02b19
} egg_secure_rec;
Packit Service f02b19
Packit Service f02b19
egg_secure_rec *   egg_secure_records    (unsigned int *count);
Packit Service f02b19
Packit Service f02b19
#endif /* EGG_SECURE_MEMORY_H */