summaryrefslogtreecommitdiff
path: root/gck/gck-attributes.c
diff options
context:
space:
mode:
authorStef Walter <stefw@collabora.co.uk>2011-10-06 12:51:08 +0200
committerStef Walter <stefw@collabora.co.uk>2011-10-06 13:22:43 +0200
commitf28d3d768f0e4057f727e8c3b93ba50c19f5db24 (patch)
tree288ef581590dfccbfddcad3c87d98ce3a4ed0a97 /gck/gck-attributes.c
parent626eef363c0ece57713c5be5939677784e8115cc (diff)
downloadgnome-keyring-split.tar.gz
Split Gcr and Gck libraries out of gnome-keyringsplit
Diffstat (limited to 'gck/gck-attributes.c')
-rw-r--r--gck/gck-attributes.c1877
1 files changed, 0 insertions, 1877 deletions
diff --git a/gck/gck-attributes.c b/gck/gck-attributes.c
deleted file mode 100644
index cb48ca17..00000000
--- a/gck/gck-attributes.c
+++ /dev/null
@@ -1,1877 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* gck-attribute.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 "pkcs11-trust-assertions.h"
-
-#include <stdlib.h>
-#include <string.h>
-
-/**
- * SECTION:gck-attribute
- * @title: GckAttribute
- * @short_description: A PKCS11 attribute.
- *
- * This structure represents a PKCS11 CK_ATTRIBUTE. These attributes contain information
- * about a PKCS11 object. Use gck_object_get() or gck_object_set() to set and retrieve
- * attributes on an object.
- */
-
-/**
- * GckAttribute:
- * @type: The attribute type, such as CKA_LABEL.
- * @value: (array length=length): The value of the attribute. May be NULL.
- * @length: The length of the attribute. May be G_MAXULONG if the attribute is invalid.
- *
- * This structure represents a PKCS11 CK_ATTRIBUTE.
- */
-
-/**
- * GCK_TYPE_ATTRIBUTES:
- *
- * Boxed type for #GckAttributes
- */
-
-static void
-attribute_init (GckAttribute *attr, gulong attr_type,
- gconstpointer value, gsize length,
- GckAllocator allocator)
-{
- g_assert (sizeof (GckAttribute) == sizeof (CK_ATTRIBUTE));
- g_assert (allocator);
-
- memset (attr, 0, sizeof (GckAttribute));
- attr->type = attr_type;
- attr->length = length;
- if (value) {
- attr->value = (allocator) (NULL, length ? length : 1);
- g_assert (attr->value);
- memcpy ((gpointer)attr->value, value, length);
- }
-}
-
-/**
- * gck_attribute_init: (skip)
- * @attr: An uninitialized attribute.
- * @attr_type: The PKCS\#11 attribute type to set on the attribute.
- * @value: (array length=length): The raw value of the attribute.
- * @length: The length of the raw value.
- *
- * Initialize a PKCS\#11 attribute. This copies the value memory
- * into an internal buffer.
- *
- * When done with the attribute you should use gck_attribute_clear()
- * to free the internal memory.
- **/
-void
-gck_attribute_init (GckAttribute *attr,
- gulong attr_type,
- const guchar *value,
- gsize length)
-{
- g_return_if_fail (attr);
- attribute_init (attr, attr_type, value, length, g_realloc);
-}
-
-/**
- * gck_attribute_init_invalid: (skip)
- * @attr: An uninitialized attribute.
- * @attr_type: The PKCS\#11 attribute type to set on the attribute.
- *
- * Initialize a PKCS\#11 attribute to an 'invalid' or 'not found'
- * state. Specifically this sets the value length to (CK_ULONG)-1
- * as specified in the PKCS\#11 specification.
- *
- * When done with the attribute you should use gck_attribute_clear()
- * to free the internal memory.
- **/
-void
-gck_attribute_init_invalid (GckAttribute *attr, gulong attr_type)
-{
- g_return_if_fail (attr);
- g_assert (sizeof (GckAttribute) == sizeof (CK_ATTRIBUTE));
- memset (attr, 0, sizeof (GckAttribute));
- attr->type = attr_type;
- attr->length = (gulong)-1;
-}
-
-/**
- * gck_attribute_init_empty: (skip)
- * @attr: An uninitialized attribute.
- * @attr_type: The PKCS\#11 attribute type to set on the attribute.
- *
- * Initialize a PKCS\#11 attribute to an empty state. The attribute
- * type will be set, but no data will be set.
- *
- * When done with the attribute you should use gck_attribute_clear()
- * to free the internal memory.
- **/
-void
-gck_attribute_init_empty (GckAttribute *attr, gulong attr_type)
-{
- g_return_if_fail (attr);
- g_assert (sizeof (GckAttribute) == sizeof (CK_ATTRIBUTE));
- memset (attr, 0, sizeof (GckAttribute));
- attr->type = attr_type;
- attr->length = 0;
- attr->value = 0;
-}
-
-static void
-attribute_init_boolean (GckAttribute *attr, gulong attr_type,
- gboolean value, GckAllocator allocator)
-{
- CK_BBOOL bvalue = value ? CK_TRUE : CK_FALSE;
- attribute_init (attr, attr_type, &bvalue, sizeof (bvalue), allocator);
-}
-
-/**
- * gck_attribute_init_boolean: (skip)
- * @attr: An uninitialized attribute.
- * @attr_type: The PKCS\#11 attribute type to set on the attribute.
- * @value: The boolean value of the attribute.
- *
- * Initialize a PKCS\#11 attribute to boolean. This will result
- * in a CK_BBOOL attribute from the PKCS\#11 specs.
- *
- * When done with the attribute you should use gck_attribute_clear()
- * to free the internal memory.
- **/
-void
-gck_attribute_init_boolean (GckAttribute *attr, gulong attr_type,
- gboolean value)
-{
- g_return_if_fail (attr);
- attribute_init_boolean (attr, attr_type, value, g_realloc);
-}
-
-static void
-attribute_init_date (GckAttribute *attr, gulong attr_type,
- const GDate *value, GckAllocator allocator)
-{
- gchar buffer[9];
- CK_DATE date;
- g_assert (value);
- g_snprintf (buffer, sizeof (buffer), "%04d%02d%02d",
- (int)g_date_get_year (value),
- (int)g_date_get_month (value),
- (int)g_date_get_day (value));
- memcpy (&date.year, buffer + 0, 4);
- memcpy (&date.month, buffer + 4, 2);
- memcpy (&date.day, buffer + 6, 2);
- attribute_init (attr, attr_type, &date, sizeof (CK_DATE), allocator);
-}
-
-/**
- * gck_attribute_init_date: (skip)
- * @attr: An uninitialized attribute.
- * @attr_type: The PKCS\#11 attribute type to set on the attribute.
- * @value: The date value of the attribute.
- *
- * Initialize a PKCS\#11 attribute to a date. This will result
- * in a CK_DATE attribute from the PKCS\#11 specs.
- *
- * When done with the attribute you should use gck_attribute_clear()
- * to free the internal memory.
- **/
-void
-gck_attribute_init_date (GckAttribute *attr, gulong attr_type,
- const GDate *value)
-{
- g_return_if_fail (attr);
- g_return_if_fail (value);
- attribute_init_date (attr, attr_type, value, g_realloc);
-}
-
-static void
-attribute_init_ulong (GckAttribute *attr, gulong attr_type,
- gulong value, GckAllocator allocator)
-{
- CK_ULONG uvalue = value;
- attribute_init (attr, attr_type, &uvalue, sizeof (uvalue), allocator);
-}
-
-/**
- * gck_attribute_init_ulong: (skip)
- * @attr: An uninitialized attribute.
- * @attr_type: The PKCS\#11 attribute type to set on the attribute.
- * @value: The ulong value of the attribute.
- *
- * Initialize a PKCS\#11 attribute to a unsigned long. This will result
- * in a CK_ULONG attribute from the PKCS\#11 specs.
- *
- * When done with the attribute you should use gck_attribute_clear()
- * to free the internal memory.
- **/
-void
-gck_attribute_init_ulong (GckAttribute *attr, gulong attr_type,
- gulong value)
-{
- g_return_if_fail (attr);
- attribute_init_ulong (attr, attr_type, value, g_realloc);
-}
-
-static void
-attribute_init_string (GckAttribute *attr, gulong attr_type,
- const gchar *value, GckAllocator allocator)
-{
- gsize len = value ? strlen (value) : 0;
- attribute_init (attr, attr_type, (gpointer)value, len, allocator);
-}
-
-/**
- * gck_attribute_init_string: (skip)
- * @attr: An uninitialized attribute.
- * @attr_type: The PKCS\#11 attribute type to set on the attribute.
- * @value: The null terminated string value of the attribute.
- *
- * Initialize a PKCS\#11 attribute to a string. This will result
- * in an attribute containing the text, but not the null terminator.
- * The text in the attribute will be of the same encoding as you pass
- * to this function.
- *
- * When done with the attribute you should use gck_attribute_clear()
- * to free the internal memory.
- **/
-void
-gck_attribute_init_string (GckAttribute *attr, gulong attr_type,
- const gchar *value)
-{
- g_return_if_fail (attr);
- attribute_init_string (attr, attr_type, value, g_realloc);
-}
-
-GType
-gck_attribute_get_type (void)
-{
- static volatile gsize initialized = 0;
- static GType type = 0;
- if (g_once_init_enter (&initialized)) {
- type = g_boxed_type_register_static ("GckAttribute",
- (GBoxedCopyFunc)gck_attribute_dup,
- (GBoxedFreeFunc)gck_attribute_free);
- g_once_init_leave (&initialized, 1);
- }
- return type;
-}
-
-/**
- * gck_attribute_new:
- * @attr_type: The PKCS\#11 attribute type to set on the attribute.
- * @value: The raw value of the attribute.
- * @length: The length of the attribute.
- *
- * Create a new PKCS\#11 attribute. The value will be copied
- * into the new attribute.
- *
- * Returns: (transfer full): the new attribute; when done with the attribute
- * use gck_attribute_free() to free it
- **/
-GckAttribute*
-gck_attribute_new (gulong attr_type, gpointer value, gsize length)
-{
- GckAttribute *attr = g_slice_new0 (GckAttribute);
- attribute_init (attr, attr_type, value, length, g_realloc);
- return attr;
-}
-
-/**
- * gck_attribute_new_invalid:
- * @attr_type: The PKCS\#11 attribute type to set on the attribute.
- *
- * Create a new PKCS\#11 attribute as 'invalid' or 'not found'
- * state. Specifically this sets the value length to (CK_ULONG)-1
- * as specified in the PKCS\#11 specification.
- *
- * Returns: (transfer full): the new attribute; when done with the attribute
- * use gck_attribute_free() to free it
- **/
-GckAttribute*
-gck_attribute_new_invalid (gulong attr_type)
-{
- GckAttribute *attr = g_slice_new0 (GckAttribute);
- gck_attribute_init_invalid (attr, attr_type);
- return attr;
-}
-
-/**
- * gck_attribute_new_empty:
- * @attr_type: The PKCS\#11 attribute type to set on the attribute.
- *
- * Create a new PKCS\#11 attribute with empty data.
- *
- * Returns: (transfer full): the new attribute; when done with the attribute
- * use gck_attribute_free() to free it
- */
-GckAttribute*
-gck_attribute_new_empty (gulong attr_type)
-{
- GckAttribute *attr = g_slice_new0 (GckAttribute);
- gck_attribute_init_empty (attr, attr_type);
- return attr;
-}
-
-/**
- * gck_attribute_new_boolean:
- * @attr_type: The PKCS\#11 attribute type to set on the attribute.
- * @value: The boolean value of the attribute.
- *
- * Initialize a PKCS\#11 attribute to boolean. This will result
- * in a CK_BBOOL attribute from the PKCS\#11 specs.
- *
- * Returns: (transfer full): the new attribute; when done with the attribute use
- * gck_attribute_free() to free it
- **/
-GckAttribute*
-gck_attribute_new_boolean (gulong attr_type, gboolean value)
-{
- GckAttribute *attr = g_slice_new0 (GckAttribute);
- attribute_init_boolean (attr, attr_type, value, g_realloc);
- return attr;
-}
-
-/**
- * gck_attribute_new_date:
- * @attr_type: The PKCS\#11 attribute type to set on the attribute.
- * @value: The date value of the attribute.
- *
- * Initialize a PKCS\#11 attribute to a date. This will result
- * in a CK_DATE attribute from the PKCS\#11 specs.
- *
- * Returns: (transfer full): the new attribute; when done with the attribute use
- * gck_attribute_free() to free it
- **/
-GckAttribute*
-gck_attribute_new_date (gulong attr_type, const GDate *value)
-{
- GckAttribute *attr = g_slice_new0 (GckAttribute);
- attribute_init_date (attr, attr_type, value, g_realloc);
- return attr;
-}
-
-/**
- * gck_attribute_new_ulong:
- * @attr_type: The PKCS\#11 attribute type to set on the attribute.
- * @value: The ulong value of the attribute.
- *
- * Initialize a PKCS\#11 attribute to a unsigned long. This will result
- * in a CK_ULONG attribute from the PKCS\#11 specs.
- *
- * Returns: (transfer full): the new attribute; when done with the attribute use
- * gck_attribute_free() to free it
- **/
-GckAttribute*
-gck_attribute_new_ulong (gulong attr_type, gulong value)
-{
- GckAttribute *attr = g_slice_new0 (GckAttribute);
- attribute_init_ulong (attr, attr_type, value, g_realloc);
- return attr;
-}
-
-/**
- * gck_attribute_new_string:
- * @attr_type: The PKCS\#11 attribute type to set on the attribute.
- * @value: The null terminated string value of the attribute.
- *
- * Initialize a PKCS\#11 attribute to a string. This will result
- * in an attribute containing the text, but not the null terminator.
- * The text in the attribute will be of the same encoding as you pass
- * to this function.
- *
- * Returns: (transfer full): the new attribute; when done with the attribute use
- * gck_attribute_free() to free it
- **/
-GckAttribute*
-gck_attribute_new_string (gulong attr_type, const gchar *value)
-{
- GckAttribute *attr = g_slice_new0 (GckAttribute);
- attribute_init_string (attr, attr_type, value, g_realloc);
- return attr;
-}
-
-/**
- * gck_attribute_is_invalid:
- * @attr: The attribute to check.
- *
- * Check if the PKCS\#11 attribute represents 'invalid' or 'not found'
- * according to the PKCS\#11 spec. That is, having length
- * of (CK_ULONG)-1.
- *
- * Return value: Whether the attribute represents invalid or not.
- */
-gboolean
-gck_attribute_is_invalid (GckAttribute *attr)
-{
- g_return_val_if_fail (attr, TRUE);
- return attr->length == (gulong)-1;
-}
-
-/**
- * gck_attribute_get_boolean:
- * @attr: The attribute to retrieve value from.
- *
- * Get the CK_BBOOL of a PKCS\#11 attribute. No conversion
- * is performed. It is an error to pass an attribute to this
- * function unless you're know it's supposed to contain a
- * boolean value.
- *
- * Return value: The boolean value of the attribute.
- */
-gboolean
-gck_attribute_get_boolean (GckAttribute *attr)
-{
- gboolean value;
-
- g_return_val_if_fail (attr, FALSE);
- if (gck_attribute_is_invalid (attr))
- return FALSE;
- if (!gck_value_to_boolean (attr->value, attr->length, &value))
- g_return_val_if_reached (FALSE);
- return value;
-}
-
-/**
- * gck_attribute_get_ulong:
- * @attr: The attribute to retrieve value from.
- *
- * Get the CK_ULONG value of a PKCS\#11 attribute. No
- * conversion is performed. It is an error to pass an attribute
- * to this function unless you're know it's supposed to contain
- * a value of the right type.
- *
- * Return value: The ulong value of the attribute.
- */
-gulong
-gck_attribute_get_ulong (GckAttribute *attr)
-{
- gulong value;
-
- g_return_val_if_fail (attr, FALSE);
- if (gck_attribute_is_invalid (attr))
- return 0;
- if (!gck_value_to_ulong (attr->value, attr->length, &value))
- g_return_val_if_reached ((gulong)-1);
- return value;
-}
-
-/**
- * gck_attribute_get_string:
- * @attr: The attribute to retrieve value from.
- *
- * Get the string value of a PKCS\#11 attribute. No
- * conversion is performed. It is an error to pass an attribute
- * to this function unless you're know it's supposed to contain
- * a value of the right type.
- *
- * Return value: (allow-none): a null terminated string, to be freed with
- * g_free(), or %NULL if the value was invalid
- */
-gchar*
-gck_attribute_get_string (GckAttribute *attr)
-{
- g_return_val_if_fail (attr, NULL);
-
- if (gck_attribute_is_invalid (attr))
- return NULL;
- if (!attr->value)
- return NULL;
-
- return g_strndup ((gchar*)attr->value, attr->length);
-}
-
-/**
- * gck_attribute_get_date:
- * @attr: The attribute to retrieve value from.
- * @value: The date value to fill in with the parsed date.
- *
- * Get the CK_DATE of a PKCS\#11 attribute. No
- * conversion is performed. It is an error to pass an attribute
- * to this function unless you're know it's supposed to contain
- * a value of the right type.
- */
-void
-gck_attribute_get_date (GckAttribute *attr, GDate *value)
-{
- guint year, month, day;
- gchar buffer[5];
- CK_DATE *date;
- gchar *end;
-
- g_return_if_fail (attr);
-
- if (gck_attribute_is_invalid (attr)) {
- g_date_clear (value, 1);
- return;
- }
-
- g_return_if_fail (attr->length == sizeof (CK_DATE));
- g_return_if_fail (attr->value);
- date = (CK_DATE*)attr->value;
-
- memset (&buffer, 0, sizeof (buffer));
- memcpy (buffer, date->year, 4);
- year = strtol (buffer, &end, 10);
- g_return_if_fail (end != buffer && !*end);
-
- memset (&buffer, 0, sizeof (buffer));
- memcpy (buffer, date->month, 2);
- month = strtol (buffer, &end, 10);
- g_return_if_fail (end != buffer && !*end);
-
- memset (&buffer, 0, sizeof (buffer));
- memcpy (buffer, date->day, 2);
- day = strtol (buffer, &end, 10);
- g_return_if_fail (end != buffer && !*end);
-
- g_date_set_dmy (value, day, month, year);
-}
-
-/**
- * gck_attribute_dup:
- * @attr: The attribute to duplicate.
- *
- * Duplicate the PKCS\#11 attribute. All value memory is
- * also copied.
- *
- * Returns: (transfer full): the duplicated attribute; use gck_attribute_free()
- * to free it
- */
-GckAttribute*
-gck_attribute_dup (GckAttribute *attr)
-{
- GckAttribute *copy;
-
- if (!attr)
- return NULL;
-
- copy = g_slice_new0 (GckAttribute);
- gck_attribute_init_copy (copy, attr);
- return copy;
-}
-
-static void
-attribute_init_copy (GckAttribute *dest, const GckAttribute *src, GckAllocator allocator)
-{
- g_assert (dest);
- g_assert (src);
- g_assert (allocator);
-
- /*
- * TODO: Handle stupid, dumb, broken, special cases like
- * CKA_WRAP_TEMPLATE and CKA_UNWRAP_TEMPLATE.
- */
-
- memcpy (dest, src, sizeof (GckAttribute));
- if (src->value) {
- dest->value = (allocator) (NULL, src->length ? src->length : 1);
- g_assert (dest->value);
- memcpy ((gpointer)dest->value, src->value, src->length);
- }
-}
-
-/**
- * gck_attribute_init_copy:
- * @dest: An uninitialized attribute.
- * @src: An attribute to copy.
- *
- * Initialize a PKCS\#11 attribute as a copy of another attribute.
- * This copies the value memory as well.
- *
- * When done with the copied attribute you should use
- * gck_attribute_clear() to free the internal memory.
- **/
-void
-gck_attribute_init_copy (GckAttribute *dest, const GckAttribute *src)
-{
- g_return_if_fail (dest);
- g_return_if_fail (src);
- attribute_init_copy (dest, src, g_realloc);
-}
-
-static void
-attribute_clear (GckAttribute *attr, GckAllocator allocator)
-{
- g_assert (attr);
- g_assert (allocator);
- if (attr->value)
- (allocator) ((gpointer)attr->value, 0);
- attr->value = NULL;
- attr->length = 0;
-}
-
-/**
- * gck_attribute_clear:
- * @attr: Attribute to clear.
- *
- * Clear allocated memory held by a statically allocated attribute.
- * These are usually initialized with gck_attribute_init() or a
- * similar function.
- *
- * The type of the attribute will remain set.
- **/
-void
-gck_attribute_clear (GckAttribute *attr)
-{
- g_return_if_fail (attr);
- attribute_clear (attr, g_realloc);
-}
-
-/**
- * gck_attribute_free:
- * @attr: Attribute to free.
- *
- * Free an attribute and its allocated memory. These is usually
- * used with attributes that are allocated by gck_attribute_new()
- * or a similar function.
- **/
-void
-gck_attribute_free (GckAttribute *attr)
-{
- if (attr) {
- attribute_clear (attr, g_realloc);
- g_slice_free (GckAttribute, attr);
- }
-}
-
-/**
- * gck_attribute_equal:
- * @a: (type Gck.Attribute): first attribute to compare
- * @b: (type Gck.Attribute): second attribute to compare
- *
- * Compare two attributes. Useful with <code>GHashTable</code>.
- *
- * Returns: %TRUE if the attributes are equal.
- */
-gboolean
-gck_attribute_equal (gconstpointer a, gconstpointer b)
-{
- const GckAttribute *aa = a;
- const GckAttribute *ab = b;
-
- if (!a && !b)
- return TRUE;
- if (!a || !b)
- return FALSE;
-
- if (aa->type != ab->type)
- return FALSE;
- if (aa->length != ab->length)
- return FALSE;
- if (!aa->value && !ab->value)
- return TRUE;
- if (!aa->value || !ab->value)
- return FALSE;
- return memcmp (aa->value, ab->value, aa->length) == 0;
-}
-
-/**
- * SECTION:gck-attributes
- * @title: GckAttributes
- * @short_description: A set of PKCS11 attributes.
- *
- * A set of GckAttribute structures. These attributes contain information
- * about a PKCS11 object. Use gck_object_get() or gck_object_set() to set and retrieve
- * attributes on an object.
- */
-
-/**
- * GckAttributes:
- *
- * A set of GckAttribute structures.
- */
-struct _GckAttributes {
- GArray *array;
- GckAllocator allocator;
- gboolean locked;
- gint refs;
-};
-
-/**
- * GckAllocator:
- * @data: Memory to allocate or deallocate.
- * @length: New length of memory.
- *
- * An allocator used to allocate data for the attributes in this GckAttributes set.
- *
- * This is a function that acts like g_realloc. Specifically it frees when length is
- * set to zero, it allocates when data is set to NULL, and it reallocates when both
- * are valid.
- *
- * Returns: The allocated memory, or NULL when freeing.
- **/
-
-GType
-gck_attributes_get_type (void)
-{
- static volatile gsize initialized = 0;
- static GType type = 0;
- if (g_once_init_enter (&initialized)) {
- type = g_boxed_type_register_static ("GckAttributes",
- (GBoxedCopyFunc)gck_attributes_ref,
- (GBoxedFreeFunc)gck_attributes_unref);
- g_once_init_leave (&initialized, 1);
- }
- return type;
-}
-
-GType
-gck_attributes_get_boxed_type (void)
-{
- /* Deprecated version */
- return gck_attributes_get_type ();
-}
-
-/**
- * gck_attributes_new:
- *
- * Create a new GckAttributes array.
- *
- * Returns: (transfer full): the new attributes array; when done with the array
- * release it with gck_attributes_unref().
- **/
-GckAttributes*
-gck_attributes_new (void)
-{
- return gck_attributes_new_full (g_realloc);
-}
-
-/**
- * gck_attributes_new_full: (skip)
- * @allocator: Memory allocator for attribute data, or NULL for default.
- *
- * Create a new GckAttributes array.
- *
- * Returns: (transfer full): the new attributes array; when done with the array
- * release it with gck_attributes_unref()
- **/
-GckAttributes*
-gck_attributes_new_full (GckAllocator allocator)
-{
- GckAttributes *attrs;
-
- if (!allocator)
- allocator = g_realloc;
-
- g_assert (sizeof (GckAttribute) == sizeof (CK_ATTRIBUTE));
- attrs = g_slice_new0 (GckAttributes);
- attrs->array = g_array_new (0, 1, sizeof (GckAttribute));
- attrs->allocator = allocator;
- attrs->refs = 1;
- attrs->locked = FALSE;
- return attrs;
-}
-
-/**
- * gck_attributes_new_empty: (skip)
- * @attr_type: The first attribute type to add as empty.
- * @...: The arguments should be values of attribute types, terminated with gck_INVALID.
- *
- * Creates an GckAttributes array with empty attributes. The arguments
- * should be values of attribute types, terminated with gck_INVALID.
- *
- * Returns: (transfer full): the new attributes array; when done with the array
- * release it with gck_attributes_unref()
- **/
-GckAttributes*
-gck_attributes_new_empty (gulong attr_type, ...)
-{
- GckAttributes *attrs = gck_attributes_new_full (g_realloc);
- va_list va;
-
- va_start (va, attr_type);
-
- while (attr_type != GCK_INVALID) {
- gck_attributes_add_empty (attrs, attr_type);
- attr_type = va_arg (va, gulong);
- }
-
- va_end (va);
-
- return attrs;
-}
-
-/**
- * gck_attributes_at:
- * @attrs: The attributes array.
- * @index: The attribute index to retrieve.
- *
- * Get attribute at the specified index in the attribute array.
- *
- * Use gck_attributes_count() to determine how many attributes are
- * in the array.
- *
- * Returns: (transfer none): the specified attribute
- **/
-GckAttribute*
-gck_attributes_at (GckAttributes *attrs, guint index)
-{
- g_return_val_if_fail (attrs && attrs->array, NULL);
- g_return_val_if_fail (index < attrs->array->len, NULL);
- g_return_val_if_fail (!attrs->locked, NULL);
- return &g_array_index (attrs->array, GckAttribute, index);
-}
-
-static GckAttribute*
-attributes_push (GckAttributes *attrs)
-{
- GckAttribute attr;
- g_assert (!attrs->locked);
- memset (&attr, 0, sizeof (attr));
- g_array_append_val (attrs->array, attr);
- return &g_array_index (attrs->array, GckAttribute, attrs->array->len - 1);
-}
-
-/**
- * gck_attributes_add:
- * @attrs: The attributes array to add to
- * @attr: The attribute to add.
- *
- * Add the specified attribute to the array.
- *
- * The value stored in the attribute will be copied.
- *
- * Returns: (transfer none): the attribute that was added
- **/
-GckAttribute *
-gck_attributes_add (GckAttributes *attrs, GckAttribute *attr)
-{
- GckAttribute *added;
- g_return_val_if_fail (attrs && attrs->array, NULL);
- g_return_val_if_fail (!attrs->locked, NULL);
- g_return_val_if_fail (attr, NULL);
- added = attributes_push (attrs);
- attribute_init_copy (added, attr, attrs->allocator);
- return added;
-}
-
-/**
- * gck_attributes_add_data:
- * @attrs: The attributes array to add to.
- * @attr_type: The type of attribute to add.
- * @value: (array length=length): the raw memory of the attribute value
- * @length: The length of the attribute value.
- *
- * Add an attribute with the specified type and value to the array.
- *
- * The value stored in the attribute will be copied.
- *
- * Returns: (transfer none): the attribute that was added
- **/
-GckAttribute *
-gck_attributes_add_data (GckAttributes *attrs,
- gulong attr_type,
- const guchar *value,
- gsize length)
-{
- GckAttribute *added;
- g_return_val_if_fail (attrs, NULL);
- g_return_val_if_fail (!attrs->locked, NULL);
- added = attributes_push (attrs);
- attribute_init (added, attr_type, value, length, attrs->allocator);
- return added;
-}
-
-/**
- * gck_attributes_add_invalid:
- * @attrs: The attributes array to add to.
- * @attr_type: The type of attribute to add.
- *
- * Add an attribute with the specified type and an 'invalid' value to the array.
- *
- * Returns: (transfer none): the attribute that was added
- **/
-GckAttribute *
-gck_attributes_add_invalid (GckAttributes *attrs, gulong attr_type)
-{
- GckAttribute *added;
- g_return_val_if_fail (attrs, NULL);
- g_return_val_if_fail (!attrs->locked, NULL);
- added = attributes_push (attrs);
- gck_attribute_init_invalid (added, attr_type);
- return added;
-}
-
-/**
- * gck_attributes_add_empty:
- * @attrs: The attributes array to add.
- * @attr_type: The type of attribute to add.
- *
- * Add an attribute with the specified type, with empty data.
- *
- * Returns: (transfer none): the attribute that was added
- **/
-GckAttribute *
-gck_attributes_add_empty (GckAttributes *attrs, gulong attr_type)
-{
- GckAttribute *added;
- g_return_val_if_fail (attrs, NULL);
- g_return_val_if_fail (!attrs->locked, NULL);
- added = attributes_push (attrs);
- gck_attribute_init_empty (added, attr_type);
- return added;
-}
-
-/**
- * gck_attributes_add_boolean:
- * @attrs: The attributes array to add to.
- * @attr_type: The type of attribute to add.
- * @value: The boolean value to add.
- *
- * Add an attribute with the specified type and value to the array.
- *
- * The value will be stored as a CK_BBOOL PKCS\#11 style attribute.
- *
- * Returns: (transfer none): the attribute that was added
- **/
-GckAttribute *
-gck_attributes_add_boolean (GckAttributes *attrs, gulong attr_type, gboolean value)
-{
- GckAttribute *added;
- g_return_val_if_fail (attrs, NULL);
- g_return_val_if_fail (!attrs->locked, NULL);
- added = attributes_push (attrs);
- attribute_init_boolean (added, attr_type, value, attrs->allocator);
- return added;
-}
-
-/**
- * gck_attributes_set_boolean:
- * @attrs: the attributes
- * @attr_type: the type of attribute to set
- * @value: boolean value to set
- *
- * Set the attribute of attr_type in the attribute array to the given value.
- * If no such value exists, then add one.
- */
-void
-gck_attributes_set_boolean (GckAttributes *attrs,
- gulong attr_type,
- gboolean value)
-{
- GckAttribute *attr;
-
- g_return_if_fail (attrs != NULL);
- g_return_if_fail (!attrs->locked);
-
- attr = gck_attributes_find (attrs, attr_type);
- if (attr == NULL) {
- gck_attributes_add_boolean (attrs, attr_type, value);
- } else {
- attribute_clear (attr, attrs->allocator);
- attribute_init_boolean (attr, attr_type, value, attrs->allocator);
- }
-}
-
-/**
- * gck_attributes_add_string:
- * @attrs: The attributes array to add to.
- * @attr_type: The type of attribute to add.
- * @value: The null terminated string value to add.
- *
- * Add an attribute with the specified type and value to the array.
- *
- * The value will be copied into the attribute.
- *
- * Returns: (transfer none): the attribute that was added
- **/
-GckAttribute *
-gck_attributes_add_string (GckAttributes *attrs, gulong attr_type, const gchar *value)
-{
- GckAttribute *added;
- g_return_val_if_fail (attrs, NULL);
- g_return_val_if_fail (!attrs->locked, NULL);
- added = attributes_push (attrs);
- attribute_init_string (added, attr_type, value, attrs->allocator);
- return added;
-}
-
-/**
- * gck_attributes_set_string:
- * @attrs: the attributes
- * @attr_type: the type of attribute to set
- * @value: null terminated string value to set
- *
- * Set the attribute of attr_type in the attribute array to the given value.
- * If no such value exists, then add one.
- */
-void
-gck_attributes_set_string (GckAttributes *attrs,
- gulong attr_type,
- const gchar *value)
-{
- GckAttribute *attr;
-
- g_return_if_fail (attrs != NULL);
- g_return_if_fail (!attrs->locked);
-
- attr = gck_attributes_find (attrs, attr_type);
- if (attr == NULL) {
- gck_attributes_add_string (attrs, attr_type, value);
- } else {
- attribute_clear (attr, attrs->allocator);
- attribute_init_string (attr, attr_type, value, attrs->allocator);
- }
-}
-
-/**
- * gck_attributes_add_date:
- * @attrs: The attributes array to add to.
- * @attr_type: The type of attribute to add.
- * @value: The GDate value to add.
- *
- * Add an attribute with the specified type and value to the array.
- *
- * The value will be stored as a CK_DATE PKCS\#11 style attribute.
- *
- * Returns: (transfer none): the attribute that was added
- **/
-GckAttribute *
-gck_attributes_add_date (GckAttributes *attrs, gulong attr_type, const GDate *value)
-{
- GckAttribute *added;
- g_return_val_if_fail (attrs, NULL);
- g_return_val_if_fail (!attrs->locked, NULL);
- added = attributes_push (attrs);
- attribute_init_date (added, attr_type, value, attrs->allocator);
- return added;
-}
-
-/**
- * gck_attributes_set_date:
- * @attrs: the attributes
- * @attr_type: the type of attribute to set
- * @value: date value to set
- *
- * Set the attribute of attr_type in the attribute array to the given value.
- * If no such value exists, then add one.
- */
-void
-gck_attributes_set_date (GckAttributes *attrs,
- gulong attr_type,
- const GDate *value)
-{
- GckAttribute *attr;
-
- g_return_if_fail (attrs != NULL);
- g_return_if_fail (!attrs->locked);
-
- attr = gck_attributes_find (attrs, attr_type);
- if (attr == NULL) {
- gck_attributes_add_date (attrs, attr_type, value);
- } else {
- attribute_clear (attr, attrs->allocator);
- attribute_init_date (attr, attr_type, value, attrs->allocator);
- }
-}
-
-/**
- * gck_attributes_add_ulong:
- * @attrs: The attributes array to add to.
- * @attr_type: The type of attribute to add.
- * @value: The gulong value to add.
- *
- * Add an attribute with the specified type and value to the array.
- *
- * The value will be stored as a CK_ULONG PKCS\#11 style attribute.
- *
- * Returns: (transfer none): the attribute that was added
- **/
-GckAttribute *
-gck_attributes_add_ulong (GckAttributes *attrs, gulong attr_type, gulong value)
-{
- GckAttribute *added;
- g_return_val_if_fail (attrs, NULL);
- g_return_val_if_fail (!attrs->locked, NULL);
- added = attributes_push (attrs);
- attribute_init_ulong (added, attr_type, value, attrs->allocator);
- return added;
-}
-
-/**
- * gck_attributes_set_ulong:
- * @attrs: the attributes
- * @attr_type: the type of attribute to set
- * @value: gulong value to set
- *
- * Set the attribute of attr_type in the attribute array to the given value.
- * If no such value exists, then add one.
- */
-void
-gck_attributes_set_ulong (GckAttributes *attrs,
- gulong attr_type,
- gulong value)
-{
- GckAttribute *attr;
-
- g_return_if_fail (attrs != NULL);
- g_return_if_fail (!attrs->locked);
-
- attr = gck_attributes_find (attrs, attr_type);
- if (attr == NULL) {
- gck_attributes_add_ulong (attrs, attr_type, value);
- } else {
- attribute_clear (attr, attrs->allocator);
- attribute_init_ulong (attr, attr_type, value, attrs->allocator);
- }
-}
-
-/**
- * gck_attributes_add_all:
- * @attrs: A set of attributes
- * @from: Attributes to add
- *
- * Add all attributes in @from to @attrs.
- */
-void
-gck_attributes_add_all (GckAttributes *attrs, GckAttributes *from)
-{
- GckAttribute *attr;
- guint i;
-
- g_return_if_fail (attrs && attrs->array);
- g_return_if_fail (from && from->array);
- g_return_if_fail (!attrs->locked);
-
- for (i = 0; i < from->array->len; ++i) {
- attr = &g_array_index (from->array, GckAttribute, i);
- gck_attributes_add (attrs, attr);
- }
-}
-
-/**
- * gck_attributes_count:
- * @attrs: The attributes array to count.
- *
- * Get the number of attributes in this attribute array.
- *
- * Return value: The number of contained attributes.
- **/
-gulong
-gck_attributes_count (GckAttributes *attrs)
-{
- g_return_val_if_fail (attrs, 0);
- g_return_val_if_fail (!attrs->locked, 0);
- return attrs->array->len;
-}
-
-/**
- * gck_attributes_find:
- * @attrs: The attributes array to search.
- * @attr_type: The type of attribute to find.
- *
- * Find an attribute with the specified type in the array.
- *
- * Returns: (transfer none): the first attribute found with the specified type,
- * or %NULL
- **/
-GckAttribute *
-gck_attributes_find (GckAttributes *attrs, gulong attr_type)
-{
- GckAttribute *attr;
- guint i;
-
- g_return_val_if_fail (attrs && attrs->array, NULL);
- g_return_val_if_fail (!attrs->locked, NULL);
-
- for (i = 0; i < attrs->array->len; ++i) {
- attr = gck_attributes_at (attrs, i);
- if (attr->type == attr_type)
- return attr;
- }
-
- return NULL;
-}
-
-/**
- * gck_attributes_find_boolean:
- * @attrs: The attributes array to search.
- * @attr_type: The type of attribute to find.
- * @value: The resulting gboolean value.
- *
- * Find an attribute with the specified type in the array.
- *
- * The attribute (if found) must be of the right size to store
- * a boolean value (ie: CK_BBOOL). If the attribute is marked invalid
- * then it will be treated as not found.
- *
- * Return value: Whether a value was found or not.
- **/
-gboolean
-gck_attributes_find_boolean (GckAttributes *attrs, gulong attr_type, gboolean *value)
-{
- GckAttribute *attr;
-
- g_return_val_if_fail (value, FALSE);
- g_return_val_if_fail (!attrs->locked, FALSE);
-
- attr = gck_attributes_find (attrs, attr_type);
- if (!attr || gck_attribute_is_invalid (attr))
- return FALSE;
- *value = gck_attribute_get_boolean (attr);
- return TRUE;
-}
-
-/**
- * gck_attributes_find_ulong:
- * @attrs: The attributes array to search.
- * @attr_type: The type of attribute to find.
- * @value: The resulting gulong value.
- *
- * Find an attribute with the specified type in the array.
- *
- * The attribute (if found) must be of the right size to store
- * a unsigned long value (ie: CK_ULONG). If the attribute is marked invalid
- * then it will be treated as not found.
- *
- * Return value: Whether a value was found or not.
- **/
-gboolean
-gck_attributes_find_ulong (GckAttributes *attrs, gulong attr_type, gulong *value)
-{
- GckAttribute *attr;
-
- g_return_val_if_fail (value, FALSE);
- g_return_val_if_fail (!attrs->locked, FALSE);
-
- attr = gck_attributes_find (attrs, attr_type);
- if (!attr || gck_attribute_is_invalid (attr))
- return FALSE;
- *value = gck_attribute_get_ulong (attr);
- return TRUE;
-}
-
-/**
- * gck_attributes_find_string:
- * @attrs: The attributes array to search.
- * @attr_type: The type of attribute to find.
- * @value: The resulting string value.
- *
- * Find an attribute with the specified type in the array.
- *
- * If the attribute is marked invalid then it will be treated as not found.
- * The resulting string will be null-terminated, and must be freed by the caller
- * using g_free().
- *
- * Return value: Whether a value was found or not.
- **/
-gboolean
-gck_attributes_find_string (GckAttributes *attrs, gulong attr_type, gchar **value)
-{
- GckAttribute *attr;
-
- g_return_val_if_fail (value, FALSE);
- g_return_val_if_fail (!attrs->locked, FALSE);
-
- attr = gck_attributes_find (attrs, attr_type);
- if (!attr || gck_attribute_is_invalid (attr))
- return FALSE;
- *value = gck_attribute_get_string (attr);
- return TRUE;
-}
-
-/**
- * gck_attributes_find_date:
- * @attrs: The attributes array to search.
- * @attr_type: The type of attribute to find.
- * @value: The resulting GDate value.
- *
- * Find an attribute with the specified type in the array.
- *
- * The attribute (if found) must be of the right size to store
- * a date value (ie: CK_DATE). If the attribute is marked invalid
- * then it will be treated as not found.
- *
- * Return value: Whether a value was found or not.
- **/
-gboolean
-gck_attributes_find_date (GckAttributes *attrs, gulong attr_type, GDate *value)
-{
- GckAttribute *attr;
-
- g_return_val_if_fail (value, FALSE);
- g_return_val_if_fail (!attrs->locked, FALSE);
-
- attr = gck_attributes_find (attrs, attr_type);
- if (!attr || gck_attribute_is_invalid (attr))
- return FALSE;
- gck_attribute_get_date (attr, value);
- return TRUE;
-}
-
-/**
- * gck_attributes_ref:
- * @attrs: An attribute array
- *
- * Reference this attributes array.
- *
- * Returns: (transfer full): the attributes
- **/
-GckAttributes *
-gck_attributes_ref (GckAttributes *attrs)
-{
- g_return_val_if_fail (attrs, NULL);
- g_atomic_int_inc (&attrs->refs);
- return attrs;
-}
-
-/**
- * gck_attributes_unref:
- * @attrs: An attribute array
- *
- * Unreference this attribute array.
- *
- * When all outstanding references are NULL, the array will be freed.
- */
-void
-gck_attributes_unref (GckAttributes *attrs)
-{
- guint i;
-
- if (!attrs)
- return;
-
- if (g_atomic_int_dec_and_test (&attrs->refs)) {
- g_return_if_fail (attrs->array);
- g_return_if_fail (!attrs->locked);
- for (i = 0; i < attrs->array->len; ++i)
- attribute_clear (gck_attributes_at (attrs, i), attrs->allocator);
- g_array_free (attrs->array, TRUE);
- attrs->array = NULL;
- g_slice_free (GckAttributes, attrs);
- }
-}
-
-/**
- * gck_attributes_contains:
- * @attrs: The attributes to check
- * @match: The attribute to find
- *
- * Check whether the attributes contain a certain attribute.
- *
- * Returns: %TRUE if the attributes contain the attribute.
- */
-gboolean
-gck_attributes_contains (GckAttributes *attrs, GckAttribute *match)
-{
- GckAttribute *attr;
- guint i;
-
- g_return_val_if_fail (attrs && attrs->array, FALSE);
-
- for (i = 0; i < attrs->array->len; ++i) {
- attr = gck_attributes_at (attrs, i);
- if (gck_attribute_equal (attr, match))
- return TRUE;
- }
-
- return FALSE;
-}
-
-
-
-/* -------------------------------------------------------------------------------------------
- * INTERNAL
- *
- * The idea is that while we're processing a GckAttributes array (via PKCS#11
- * C_GetAtributeValue for example) the calling application shouldn't access those
- * attributes at all, except to ref or unref them.
- *
- * We try to help debug this with our 'locked' states. The various processing
- * functions that accept GckAttributes lock the attributes while handing
- * them off to be processed (perhaps in a different thread). We check this locked
- * flag in all public functions accessing GckAttributes.
- *
- * The reason we don't use thread safe or atomic primitives here, is because:
- * a) The attributes are 'locked' by the same thread that prepares the call.
- * b) This is a debugging feature, and should not be relied on for correctness.
- */
-
-void
-_gck_attributes_lock (GckAttributes *attrs)
-{
- g_assert (attrs);
- g_assert (!attrs->locked);
- attrs->locked = TRUE;
-}
-
-void
-_gck_attributes_unlock (GckAttributes *attrs)
-{
- g_assert (attrs);
- g_assert (attrs->locked);
- attrs->locked = FALSE;
-}
-
-CK_ATTRIBUTE_PTR
-_gck_attributes_prepare_in (GckAttributes *attrs, CK_ULONG_PTR n_attrs)
-{
- GckAttribute *attr;
- guint i;
-
- g_assert (attrs);
- g_assert (n_attrs);
- g_assert (attrs->locked);
-
- /* Prepare the attributes to receive their length */
-
- for (i = 0; i < attrs->array->len; ++i) {
- attr = &g_array_index (attrs->array, GckAttribute, i);
- attribute_clear (attr, attrs->allocator);
- }
-
- *n_attrs = attrs->array->len;
- return (CK_ATTRIBUTE_PTR)attrs->array->data;
-}
-
-CK_ATTRIBUTE_PTR
-_gck_attributes_commit_in (GckAttributes *attrs, CK_ULONG_PTR n_attrs)
-{
- GckAttribute *attr;
- guint i;
-
- g_assert (attrs);
- g_assert (n_attrs);
- g_assert (attrs->locked);
-
- /* Allocate each attribute with the length that was set */
-
- for (i = 0; i < attrs->array->len; ++i) {
- attr = &g_array_index (attrs->array, GckAttribute, i);
- g_assert (!attr->value);
- if (attr->length != 0 && attr->length != (gulong)-1) {
- attr->value = (attrs->allocator) (NULL, attr->length);
- g_assert (attr->value);
- }
- }
-
- *n_attrs = attrs->array->len;
- return (CK_ATTRIBUTE_PTR)attrs->array->data;
-}
-
-CK_ATTRIBUTE_PTR
-_gck_attributes_commit_out (GckAttributes *attrs, CK_ULONG_PTR n_attrs)
-{
- g_assert (attrs);
- g_assert (n_attrs);
- g_assert (attrs->locked);
-
- *n_attrs = attrs->array->len;
- return (CK_ATTRIBUTE_PTR)attrs->array->data;
-}
-
-static gboolean
-_gck_attribute_is_ulong_of_type (GckAttribute *attr,
- gulong attr_type)
-{
- if (attr->type != attr_type)
- return FALSE;
- if (attr->length != sizeof (gulong))
- return FALSE;
- if (!attr->value)
- return FALSE;
- return TRUE;
-}
-
-static gboolean
-_gck_attribute_is_sensitive (GckAttribute *attr)
-{
- /*
- * Don't print any just attribute, since they may contain
- * sensitive data
- */
-
- switch (attr->type) {
- #define X(x) case x: return FALSE;
- X (CKA_CLASS)
- X (CKA_TOKEN)
- X (CKA_PRIVATE)
- X (CKA_LABEL)
- X (CKA_APPLICATION)
- X (CKA_OBJECT_ID)
- X (CKA_CERTIFICATE_TYPE)
- X (CKA_ISSUER)
- X (CKA_SERIAL_NUMBER)
- X (CKA_AC_ISSUER)
- X (CKA_OWNER)
- X (CKA_ATTR_TYPES)
- X (CKA_TRUSTED)
- X (CKA_CERTIFICATE_CATEGORY)
- X (CKA_JAVA_MIDP_SECURITY_DOMAIN)
- X (CKA_URL)
- X (CKA_HASH_OF_SUBJECT_PUBLIC_KEY)
- X (CKA_HASH_OF_ISSUER_PUBLIC_KEY)
- X (CKA_CHECK_VALUE)
- X (CKA_KEY_TYPE)
- X (CKA_SUBJECT)
- X (CKA_ID)
- X (CKA_SENSITIVE)
- X (CKA_ENCRYPT)
- X (CKA_DECRYPT)
- X (CKA_WRAP)
- X (CKA_UNWRAP)
- X (CKA_SIGN)
- X (CKA_SIGN_RECOVER)
- X (CKA_VERIFY)
- X (CKA_VERIFY_RECOVER)
- X (CKA_DERIVE)
- X (CKA_START_DATE)
- X (CKA_END_DATE)
- X (CKA_MODULUS_BITS)
- X (CKA_PRIME_BITS)
- /* X (CKA_SUBPRIME_BITS) */
- /* X (CKA_SUB_PRIME_BITS) */
- X (CKA_VALUE_BITS)
- X (CKA_VALUE_LEN)
- X (CKA_EXTRACTABLE)
- X (CKA_LOCAL)
- X (CKA_NEVER_EXTRACTABLE)
- X (CKA_ALWAYS_SENSITIVE)
- X (CKA_KEY_GEN_MECHANISM)
- X (CKA_MODIFIABLE)
- X (CKA_SECONDARY_AUTH)
- X (CKA_AUTH_PIN_FLAGS)
- X (CKA_ALWAYS_AUTHENTICATE)
- X (CKA_WRAP_WITH_TRUSTED)
- X (CKA_WRAP_TEMPLATE)
- X (CKA_UNWRAP_TEMPLATE)
- X (CKA_HW_FEATURE_TYPE)
- X (CKA_RESET_ON_INIT)
- X (CKA_HAS_RESET)
- X (CKA_PIXEL_X)
- X (CKA_PIXEL_Y)
- X (CKA_RESOLUTION)
- X (CKA_CHAR_ROWS)
- X (CKA_CHAR_COLUMNS)
- X (CKA_COLOR)
- X (CKA_BITS_PER_PIXEL)
- X (CKA_CHAR_SETS)
- X (CKA_ENCODING_METHODS)
- X (CKA_MIME_TYPES)
- X (CKA_MECHANISM_TYPE)
- X (CKA_REQUIRED_CMS_ATTRIBUTES)
- X (CKA_DEFAULT_CMS_ATTRIBUTES)
- X (CKA_SUPPORTED_CMS_ATTRIBUTES)
- X (CKA_ALLOWED_MECHANISMS)
- X (CKA_X_ASSERTION_TYPE)
- X (CKA_X_CERTIFICATE_VALUE)
- X (CKA_X_PURPOSE)
- X (CKA_X_PEER)
- #undef X
- }
-
- return TRUE;
-}
-
-static void
-_gck_format_class (GString *output,
- CK_OBJECT_CLASS klass)
-{
- const gchar *string = NULL;
-
- switch (klass) {
- #define X(x) case x: string = #x; break;
- X (CKO_DATA)
- X (CKO_CERTIFICATE)
- X (CKO_PUBLIC_KEY)
- X (CKO_PRIVATE_KEY)
- X (CKO_SECRET_KEY)
- X (CKO_HW_FEATURE)
- X (CKO_DOMAIN_PARAMETERS)
- X (CKO_MECHANISM)
- X (CKO_X_TRUST_ASSERTION)
- }
-
- if (string != NULL)
- g_string_append (output, string);
- else
- g_string_append_printf (output, "0x%08lX", klass);
-}
-
-static void
-_gck_format_assertion_type (GString *output,
- CK_X_ASSERTION_TYPE type)
-{
- const gchar *string = NULL;
-
- switch (type) {
- #define X(x) case x: string = #x; break;
- X (CKT_X_UNTRUSTED_CERTIFICATE)
- X (CKT_X_PINNED_CERTIFICATE)
- X (CKT_X_ANCHORED_CERTIFICATE)
- #undef X
- }
-
- if (string != NULL)
- g_string_append (output, string);
- else
- g_string_append_printf (output, "0x%08lX", type);
-}
-
-static void
-_gck_format_key_type (GString *output,
- CK_KEY_TYPE type)
-{
- const gchar *string = NULL;
-
- switch (type) {
- #define X(x) case x: string = #x; break;
- X (CKK_RSA)
- X (CKK_DSA)
- X (CKK_DH)
- /* X (CKK_ECDSA) */
- X (CKK_EC)
- X (CKK_X9_42_DH)
- X (CKK_KEA)
- X (CKK_GENERIC_SECRET)
- X (CKK_RC2)
- X (CKK_RC4)
- X (CKK_DES)
- X (CKK_DES2)
- X (CKK_DES3)
- X (CKK_CAST)
- X (CKK_CAST3)
- X (CKK_CAST128)
- X (CKK_RC5)
- X (CKK_IDEA)
- X (CKK_SKIPJACK)
- X (CKK_BATON)
- X (CKK_JUNIPER)
- X (CKK_CDMF)
- X (CKK_AES)
- X (CKK_BLOWFISH)
- X (CKK_TWOFISH)
- #undef X
- }
-
- if (string != NULL)
- g_string_append (output, string);
- else
- g_string_append_printf (output, "0x%08lX", type);
-}
-
-static void
-_gck_format_certificate_type (GString *output,
- CK_CERTIFICATE_TYPE type)
-{
- const gchar *string = NULL;
-
- switch (type) {
- #define X(x) case x: string = #x; break;
- X (CKC_X_509)
- X (CKC_X_509_ATTR_CERT)
- X (CKC_WTLS)
- }
-
- if (string != NULL)
- g_string_append (output, string);
- else
- g_string_append_printf (output, "0x%08lX", type);
-}
-
-static void
-_gck_format_attribute_type (GString *output,
- gulong type)
-{
- const gchar *string = NULL;
-
- switch (type) {
- #define X(x) case x: string = #x; break;
- X (CKA_CLASS)
- X (CKA_TOKEN)
- X (CKA_PRIVATE)
- X (CKA_LABEL)
- X (CKA_APPLICATION)
- X (CKA_VALUE)
- X (CKA_OBJECT_ID)
- X (CKA_CERTIFICATE_TYPE)
- X (CKA_ISSUER)
- X (CKA_SERIAL_NUMBER)
- X (CKA_AC_ISSUER)
- X (CKA_OWNER)
- X (CKA_ATTR_TYPES)
- X (CKA_TRUSTED)
- X (CKA_CERTIFICATE_CATEGORY)
- X (CKA_JAVA_MIDP_SECURITY_DOMAIN)
- X (CKA_URL)
- X (CKA_HASH_OF_SUBJECT_PUBLIC_KEY)
- X (CKA_HASH_OF_ISSUER_PUBLIC_KEY)
- X (CKA_CHECK_VALUE)
- X (CKA_KEY_TYPE)
- X (CKA_SUBJECT)
- X (CKA_ID)
- X (CKA_SENSITIVE)
- X (CKA_ENCRYPT)
- X (CKA_DECRYPT)
- X (CKA_WRAP)
- X (CKA_UNWRAP)
- X (CKA_SIGN)
- X (CKA_SIGN_RECOVER)
- X (CKA_VERIFY)
- X (CKA_VERIFY_RECOVER)
- X (CKA_DERIVE)
- X (CKA_START_DATE)
- X (CKA_END_DATE)
- X (CKA_MODULUS)
- X (CKA_MODULUS_BITS)
- X (CKA_PUBLIC_EXPONENT)
- X (CKA_PRIVATE_EXPONENT)
- X (CKA_PRIME_1)
- X (CKA_PRIME_2)
- X (CKA_EXPONENT_1)
- X (CKA_EXPONENT_2)
- X (CKA_COEFFICIENT)
- X (CKA_PRIME)
- X (CKA_SUBPRIME)
- X (CKA_BASE)
- X (CKA_PRIME_BITS)
- /* X (CKA_SUBPRIME_BITS) */
- /* X (CKA_SUB_PRIME_BITS) */
- X (CKA_VALUE_BITS)
- X (CKA_VALUE_LEN)
- X (CKA_EXTRACTABLE)
- X (CKA_LOCAL)
- X (CKA_NEVER_EXTRACTABLE)
- X (CKA_ALWAYS_SENSITIVE)
- X (CKA_KEY_GEN_MECHANISM)
- X (CKA_MODIFIABLE)
- X (CKA_ECDSA_PARAMS)
- /* X (CKA_EC_PARAMS) */
- X (CKA_EC_POINT)
- X (CKA_SECONDARY_AUTH)
- X (CKA_AUTH_PIN_FLAGS)
- X (CKA_ALWAYS_AUTHENTICATE)
- X (CKA_WRAP_WITH_TRUSTED)
- X (CKA_WRAP_TEMPLATE)
- X (CKA_UNWRAP_TEMPLATE)
- X (CKA_HW_FEATURE_TYPE)
- X (CKA_RESET_ON_INIT)
- X (CKA_HAS_RESET)
- X (CKA_PIXEL_X)
- X (CKA_PIXEL_Y)
- X (CKA_RESOLUTION)
- X (CKA_CHAR_ROWS)
- X (CKA_CHAR_COLUMNS)
- X (CKA_COLOR)
- X (CKA_BITS_PER_PIXEL)
- X (CKA_CHAR_SETS)
- X (CKA_ENCODING_METHODS)
- X (CKA_MIME_TYPES)
- X (CKA_MECHANISM_TYPE)
- X (CKA_REQUIRED_CMS_ATTRIBUTES)
- X (CKA_DEFAULT_CMS_ATTRIBUTES)
- X (CKA_SUPPORTED_CMS_ATTRIBUTES)
- X (CKA_ALLOWED_MECHANISMS)
- X (CKA_X_ASSERTION_TYPE)
- X (CKA_X_CERTIFICATE_VALUE)
- X (CKA_X_PURPOSE)
- X (CKA_X_PEER)
- #undef X
- }
-
- if (string != NULL)
- g_string_append (output, string);
- else
- g_string_append_printf (output, "CKA_0x%08lX", type);
-}
-
-static void
-_gck_format_some_bytes (GString *output,
- gconstpointer bytes,
- gulong length)
-{
- guchar ch;
- const guchar *data = bytes;
- gulong i;
-
- if (bytes == NULL) {
- g_string_append (output, "NULL");
- return;
- }
-
- g_string_append_c (output, '\"');
- for (i = 0; i < length && i < 128; i++) {
- ch = data[i];
- if (ch == '\t')
- g_string_append (output, "\\t");
- else if (ch == '\n')
- g_string_append (output, "\\n");
- else if (ch == '\r')
- g_string_append (output, "\\r");
- else if (ch >= 32 && ch < 127)
- g_string_append_c (output, ch);
- else
- g_string_append_printf (output, "\\x%02x", ch);
- }
-
- if (i < length)
- g_string_append_printf (output, "...");
- g_string_append_c (output, '\"');
-}
-
-static void
-_gck_format_attributes (GString *output,
- GckAttributes *attrs)
-{
- GckAttribute *attr;
- guint count, i;
-
- count = attrs->array->len;
- g_string_append_printf (output, "(%d) [", count);
- for (i = 0; i < count; i++) {
- attr = &g_array_index (attrs->array, GckAttribute, i);
- if (i > 0)
- g_string_append_c (output, ',');
- g_string_append (output, " { ");
- _gck_format_attribute_type (output, attr->type);
- g_string_append (output, " = ");
- if (attr->length == GCK_INVALID) {
- g_string_append_printf (output, " (-1) INVALID");
- } else if (_gck_attribute_is_ulong_of_type (attr, CKA_CLASS)) {
- _gck_format_class (output, *((CK_OBJECT_CLASS_PTR)attr->value));
- } else if (_gck_attribute_is_ulong_of_type (attr, CKA_X_ASSERTION_TYPE)) {
- _gck_format_assertion_type (output, *((CK_X_ASSERTION_TYPE *)attr->value));
- } else if (_gck_attribute_is_ulong_of_type (attr, CKA_CERTIFICATE_TYPE)) {
- _gck_format_certificate_type (output, *((CK_CERTIFICATE_TYPE *)attr->value));
- } else if (_gck_attribute_is_ulong_of_type (attr, CKA_KEY_TYPE)) {
- _gck_format_key_type (output, *((CK_KEY_TYPE *)attr->value));
- } else if (_gck_attribute_is_sensitive (attr)) {
- g_string_append_printf (output, " (%lu) NOT-PRINTED", attr->length);
- } else {
- g_string_append_printf (output, " (%lu) ", attr->length);
- _gck_format_some_bytes (output, attr->value, attr->length);
- }
- g_string_append (output, " }");
- }
- g_string_append (output, " ]");
-}
-
-gchar *
-_gck_attributes_format (GckAttributes *attrs)
-{
- GString *output = g_string_sized_new (128);
- _gck_format_attributes (output, attrs);
- return g_string_free (output, FALSE);
-}