summaryrefslogtreecommitdiff
path: root/gck/gck-misc.c
diff options
context:
space:
mode:
Diffstat (limited to 'gck/gck-misc.c')
-rw-r--r--gck/gck-misc.c465
1 files changed, 0 insertions, 465 deletions
diff --git a/gck/gck-misc.c b/gck/gck-misc.c
deleted file mode 100644
index 47d444e7..00000000
--- a/gck/gck-misc.c
+++ /dev/null
@@ -1,465 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* gck-misc.c - the GObject PKCS#11 wrapper library
-
- Copyright (C) 2008, Stefan Walter
-
- The Gnome Keyring Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public License as
- published by the Free Software Foundation; either version 2 of the
- License, or (at your option) any later version.
-
- The Gnome Keyring Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with the Gnome Library; see the file COPYING.LIB. If not,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA.
-
- Author: Stef Walter <nielsen@memberwebs.com>
-*/
-
-#include "config.h"
-
-#include "gck.h"
-#include "gck-private.h"
-
-#include <p11-kit/p11-kit.h>
-
-#include <glib/gi18n-lib.h>
-
-/**
- * SECTION:gck-error
- * @title: Errors
- * @short_description: Gck Errors and error codes.
- *
- * Errors are returned as GError structures. The code member of GError
- * contains the raw PKCS11 CK_RV result value.
- */
-
-/**
- * SECTION:gck-private
- * @title: Private, not used in docs
- * @short_description: Should not show up in docs
- *
- */
-
-/**
- * GCK_INVALID:
- *
- * Used as a terminator at the end of variable argument lists.
- */
-
-/**
- * GCK_VENDOR_CODE:
- *
- * Custom PKCS11 errors that originate from the gck library, are
- * based at this error code.
- */
-
-/**
- * GckError:
- * @GCK_ERROR_MODULE_PROBLEM: a result code that signifies there was a problem
- * loading a PKCS\#11 module, usually a shared library
- *
- * Various error codes. All the CKR_XXX error codes from PKCS\#11 are also
- * relevant error codes.
- */
-
-/**
- * GCK_ERROR:
- *
- * The error domain for gck library errors.
- */
-
-GQuark
-gck_get_error_quark (void)
-{
- /* This is the deprecated version */
- return gck_error_get_quark ();
-}
-
-GQuark
-gck_error_get_quark (void)
-{
- static GQuark domain = 0;
- static volatile gsize quark_inited = 0;
-
- if (g_once_init_enter (&quark_inited)) {
- domain = g_quark_from_static_string ("gck-error");
- g_once_init_leave (&quark_inited, 1);
- }
-
- return domain;
-}
-
-/**
- * gck_message_from_rv:
- * @rv: The PKCS\#11 return value to get a message for.
- *
- * Get a message for a PKCS\#11 return value or error code. Do not
- * pass CKR_OK or other such non errors to this function.
- *
- * Return value: The user readable message.
- **/
-const gchar*
-gck_message_from_rv (gulong rv)
-{
- switch (rv) {
-
- /* These are not really errors, or not current */
- case CKR_OK:
- case CKR_NO_EVENT:
- case CKR_FUNCTION_NOT_PARALLEL:
- case CKR_SESSION_PARALLEL_NOT_SUPPORTED:
- g_return_val_if_reached ("");
-
- default:
- return p11_kit_strerror (rv);
- }
-}
-
-const gchar *
-_gck_stringize_rv (CK_RV rv)
-{
- switch(rv) {
- #define X(x) case x: return #x;
- X (CKR_OK)
- X (CKR_CANCEL)
- X (CKR_HOST_MEMORY)
- X (CKR_SLOT_ID_INVALID)
- X (CKR_GENERAL_ERROR)
- X (CKR_FUNCTION_FAILED)
- X (CKR_ARGUMENTS_BAD)
- X (CKR_NO_EVENT)
- X (CKR_NEED_TO_CREATE_THREADS)
- X (CKR_CANT_LOCK)
- X (CKR_ATTRIBUTE_READ_ONLY)
- X (CKR_ATTRIBUTE_SENSITIVE)
- X (CKR_ATTRIBUTE_TYPE_INVALID)
- X (CKR_ATTRIBUTE_VALUE_INVALID)
- X (CKR_DATA_INVALID)
- X (CKR_DATA_LEN_RANGE)
- X (CKR_DEVICE_ERROR)
- X (CKR_DEVICE_MEMORY)
- X (CKR_DEVICE_REMOVED)
- X (CKR_ENCRYPTED_DATA_INVALID)
- X (CKR_ENCRYPTED_DATA_LEN_RANGE)
- X (CKR_FUNCTION_CANCELED)
- X (CKR_FUNCTION_NOT_PARALLEL)
- X (CKR_FUNCTION_NOT_SUPPORTED)
- X (CKR_KEY_HANDLE_INVALID)
- X (CKR_KEY_SIZE_RANGE)
- X (CKR_KEY_TYPE_INCONSISTENT)
- X (CKR_KEY_NOT_NEEDED)
- X (CKR_KEY_CHANGED)
- X (CKR_KEY_NEEDED)
- X (CKR_KEY_INDIGESTIBLE)
- X (CKR_KEY_FUNCTION_NOT_PERMITTED)
- X (CKR_KEY_NOT_WRAPPABLE)
- X (CKR_KEY_UNEXTRACTABLE)
- X (CKR_MECHANISM_INVALID)
- X (CKR_MECHANISM_PARAM_INVALID)
- X (CKR_OBJECT_HANDLE_INVALID)
- X (CKR_OPERATION_ACTIVE)
- X (CKR_OPERATION_NOT_INITIALIZED)
- X (CKR_PIN_INCORRECT)
- X (CKR_PIN_INVALID)
- X (CKR_PIN_LEN_RANGE)
- X (CKR_PIN_EXPIRED)
- X (CKR_PIN_LOCKED)
- X (CKR_SESSION_CLOSED)
- X (CKR_SESSION_COUNT)
- X (CKR_SESSION_HANDLE_INVALID)
- X (CKR_SESSION_PARALLEL_NOT_SUPPORTED)
- X (CKR_SESSION_READ_ONLY)
- X (CKR_SESSION_EXISTS)
- X (CKR_SESSION_READ_ONLY_EXISTS)
- X (CKR_SESSION_READ_WRITE_SO_EXISTS)
- X (CKR_SIGNATURE_INVALID)
- X (CKR_SIGNATURE_LEN_RANGE)
- X (CKR_TEMPLATE_INCOMPLETE)
- X (CKR_TEMPLATE_INCONSISTENT)
- X (CKR_TOKEN_NOT_PRESENT)
- X (CKR_TOKEN_NOT_RECOGNIZED)
- X (CKR_TOKEN_WRITE_PROTECTED)
- X (CKR_UNWRAPPING_KEY_HANDLE_INVALID)
- X (CKR_UNWRAPPING_KEY_SIZE_RANGE)
- X (CKR_UNWRAPPING_KEY_TYPE_INCONSISTENT)
- X (CKR_USER_ALREADY_LOGGED_IN)
- X (CKR_USER_NOT_LOGGED_IN)
- X (CKR_USER_PIN_NOT_INITIALIZED)
- X (CKR_USER_TYPE_INVALID)
- X (CKR_USER_ANOTHER_ALREADY_LOGGED_IN)
- X (CKR_USER_TOO_MANY_TYPES)
- X (CKR_WRAPPED_KEY_INVALID)
- X (CKR_WRAPPED_KEY_LEN_RANGE)
- X (CKR_WRAPPING_KEY_HANDLE_INVALID)
- X (CKR_WRAPPING_KEY_SIZE_RANGE)
- X (CKR_WRAPPING_KEY_TYPE_INCONSISTENT)
- X (CKR_RANDOM_SEED_NOT_SUPPORTED)
- X (CKR_RANDOM_NO_RNG)
- X (CKR_DOMAIN_PARAMS_INVALID)
- X (CKR_BUFFER_TOO_SMALL)
- X (CKR_SAVED_STATE_INVALID)
- X (CKR_INFORMATION_SENSITIVE)
- X (CKR_STATE_UNSAVEABLE)
- X (CKR_CRYPTOKI_NOT_INITIALIZED)
- X (CKR_CRYPTOKI_ALREADY_INITIALIZED)
- X (CKR_MUTEX_BAD)
- X (CKR_MUTEX_NOT_LOCKED)
- X (CKR_FUNCTION_REJECTED)
- X (CKR_VENDOR_DEFINED)
- #undef X
- default:
- return "CKR_??????";
- }
-}
-
-CK_RV
-_gck_rv_from_error (GError *error,
- CK_RV catch_all_code)
-{
- g_return_val_if_fail (error != NULL, CKR_GENERAL_ERROR);
-
- if (error->domain == GCK_ERROR)
- return error->code;
-
- if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
- return CKR_FUNCTION_CANCELED;
-
- return catch_all_code;
-}
-
-/**
- * SECTION:gck-misc
- * @title: Miscellaneous Functions
- * @short_description: Other miscellaneous functions.
- *
- * A few supporting functions that come in handy when dealing with the gck
- * library or PKCS11 in general.
- */
-
-GType
-gck_list_get_boxed_type (void)
-{
- static GType type = 0;
- if (!type)
- type = g_boxed_type_register_static ("GckList",
- (GBoxedCopyFunc)gck_list_ref_copy,
- (GBoxedFreeFunc)gck_list_unref_free);
- return type;
-
-}
-
-/**
- * gck_list_unref_free: (skip)
- * @reflist: (element-type GLib.Object): list of Gobject reference counted pointers
- *
- * Free a list of GObject based pointers. All objects in the list
- * will be unreffed and then the list itself will be freed.
- **/
-void
-gck_list_unref_free (GList *reflist)
-{
- GList *l;
- for (l = reflist; l; l = g_list_next (l)) {
- g_return_if_fail (G_IS_OBJECT (l->data));
- g_object_unref (l->data);
- }
- g_list_free (reflist);
-}
-
-/**
- * gck_list_ref_copy: (skip)
- * @reflist: (element-type GLib.Object): list of GObject reference counted
- * objects
- *
- * Copy a list of GObject based pointers. All objects
- * in the list will be reffed and the list will be copied.
- *
- * Return value: (transfer full) (element-type GLib.Object): the copied and
- * reffed list, when done, free it with gck_list_unref_free ()
- **/
-GList *
-gck_list_ref_copy (GList *reflist)
-{
- GList *l, *copy = g_list_copy (reflist);
- for (l = copy; l; l = g_list_next (l)) {
- g_return_val_if_fail (G_IS_OBJECT (l->data), NULL);
- g_object_ref (l->data);
- }
- return copy;
-}
-
-/**
- * gck_string_from_chars: (skip)
- * @data: The character data to turn into a null terminated string.
- * @max: The maximum length of the charater data.
- *
- * Create a string from a set of PKCS\#11 characters. This is
- * similar to g_strndup, except for that it also strips trailing
- * spaces. These space padded strings are often used in PKCS\#11
- * structures.
- *
- * If the space padded string is filled with null characters then
- * this function will return %NULL.
- *
- * Return value: The null terminated string.
- */
-gchar*
-gck_string_from_chars (const guchar *data, gsize max)
-{
- gchar *string;
-
- g_return_val_if_fail (data, NULL);
- g_return_val_if_fail (max, NULL);
-
- /* Means no value */
- if (!data[0])
- return NULL;
-
- string = g_strndup ((gchar*)data, max);
- g_strchomp (string);
- return string;
-}
-
-/**
- * gck_string_to_chars: (skip)
- * @data: The character buffer to place string into.
- * @max: The maximum length of the charater buffer.
- * @string: The string to place in the buffer.
- *
- * Create a space padded PKCS\#11 string from a null terminated string.
- * The string must be shorter than the buffer or %FALSE will be
- * returned.
- *
- * If a %NULL string is passed, then the space padded string will be
- * set to zero characters.
- *
- * Return value: The null terminated string.
- */
-gboolean
-gck_string_to_chars (guchar *data, gsize max, const gchar *string)
-{
- gsize len;
-
- g_return_val_if_fail (data, FALSE);
- g_return_val_if_fail (max, FALSE);
-
- if (!string) {
- memset (data, 0, max);
- return TRUE;
- }
-
- len = strlen (string);
- if (len > max)
- return FALSE;
-
- memset (data, ' ', max);
- memcpy (data, string, len);
- return TRUE;
-}
-
-guint
-_gck_ulong_hash (gconstpointer v)
-{
- const signed char *p = v;
- guint32 i, h = *p;
-
- for(i = 0; i < sizeof (gulong); ++i)
- h = (h << 5) - h + *(p++);
-
- return h;
-}
-
-gboolean
-_gck_ulong_equal (gconstpointer v1, gconstpointer v2)
-{
- return *((const gulong*)v1) == *((const gulong*)v2);
-}
-
-/**
- * gck_value_to_ulong:
- * @value: (array length=length): memory to convert
- * @length: length of memory
- * @result: A location to store the result
- *
- * Convert CK_ULONG type memory to a boolean.
- *
- * Returns: Whether the conversion was successful.
- */
-gboolean
-gck_value_to_ulong (const guchar *value,
- gsize length,
- gulong *result)
-{
- if (!value || length != sizeof (CK_ULONG))
- return FALSE;
- if (result)
- *result = *((CK_ULONG*)value);
- return TRUE;
-}
-
-/**
- * gck_value_to_boolean:
- * @value: (array length=length): memory to convert
- * @length: length of memory
- * @result: A location to store the result
- *
- * Convert CK_BBOOL type memory to a boolean.
- *
- * Returns: Whether the conversion was successful.
- */
-gboolean
-gck_value_to_boolean (const guchar *value,
- gsize length,
- gboolean *result)
-{
- if (!value || length != sizeof (CK_BBOOL))
- return FALSE;
- if (result)
- *result = *((CK_BBOOL*)value) ? TRUE : FALSE;
- return TRUE;
-}
-
-static gboolean
-match_info_string (const gchar *match, const gchar *string)
-{
- /* NULL matches anything */
- if (match == NULL)
- return TRUE;
-
- if (string == NULL)
- return FALSE;
-
- return g_str_equal (match, string);
-}
-
-gboolean
-_gck_module_info_match (GckModuleInfo *match, GckModuleInfo *info)
-{
- /* Matches two GckModuleInfo for use in PKCS#11 URI's */
-
- g_return_val_if_fail (match, FALSE);
- g_return_val_if_fail (info, FALSE);
-
- return (match_info_string (match->library_description, info->library_description) &&
- match_info_string (match->manufacturer_id, info->manufacturer_id));
-}
-
-gboolean
-_gck_token_info_match (GckTokenInfo *match, GckTokenInfo *info)
-{
- /* Matches two GckTokenInfo for use in PKCS#11 URI's */
-
- g_return_val_if_fail (match, FALSE);
- g_return_val_if_fail (info, FALSE);
-
- return (match_info_string (match->label, info->label) &&
- match_info_string (match->manufacturer_id, info->manufacturer_id) &&
- match_info_string (match->model, info->model) &&
- match_info_string (match->serial_number, info->serial_number));
-}