Blame egg/egg-secure-memory.h

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