|
Packit |
b00eeb |
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
|
|
Packit |
b00eeb |
/* test-gck-slot.c - the GObject PKCS#11 wrapper library
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
Copyright (C) 2011 Collabora Ltd.
|
|
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 <stefw@collabora.co.uk>
|
|
Packit |
b00eeb |
*/
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
#include "config.h"
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
#include <errno.h>
|
|
Packit |
b00eeb |
#include <glib.h>
|
|
Packit |
b00eeb |
#include <string.h>
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
#include "gck/gck.h"
|
|
Packit |
b00eeb |
#include "gck/gck-private.h"
|
|
Packit |
b00eeb |
#include "gck/gck-test.h"
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
typedef struct {
|
|
Packit |
b00eeb |
GckModule *module;
|
|
Packit |
b00eeb |
GckSlot *slot;
|
|
Packit |
b00eeb |
} Test;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
static void
|
|
Packit |
b00eeb |
setup (Test *test, gconstpointer unused)
|
|
Packit |
b00eeb |
{
|
|
Packit |
b00eeb |
GError *err = NULL;
|
|
Packit |
b00eeb |
GList *slots;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
/* Successful load */
|
|
Packit |
b00eeb |
test->module = gck_module_initialize (BUILDDIR "/.libs/libmock-test-module.so", NULL, &err;;
|
|
Packit |
b00eeb |
g_assert_no_error (err);
|
|
Packit |
b00eeb |
g_assert (GCK_IS_MODULE (test->module));
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
slots = gck_module_get_slots (test->module, TRUE);
|
|
Packit |
b00eeb |
g_assert (slots != NULL);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
test->slot = GCK_SLOT (slots->data);
|
|
Packit |
b00eeb |
g_object_ref (test->slot);
|
|
Packit |
b00eeb |
gck_list_unref_free (slots);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
static void
|
|
Packit |
b00eeb |
teardown (Test *test, gconstpointer unused)
|
|
Packit |
b00eeb |
{
|
|
Packit |
b00eeb |
g_object_unref (test->slot);
|
|
Packit |
b00eeb |
g_object_unref (test->module);
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
static void
|
|
Packit |
b00eeb |
test_slot_info (Test *test, gconstpointer unused)
|
|
Packit |
b00eeb |
{
|
|
Packit |
b00eeb |
GckSlotInfo *info;
|
|
Packit |
b00eeb |
GckTokenInfo *token;
|
|
Packit |
b00eeb |
GList *slots, *l;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
slots = gck_module_get_slots (test->module, FALSE);
|
|
Packit |
b00eeb |
g_assert (2 == g_list_length (slots) && "wrong number of slots returned");
|
|
Packit |
b00eeb |
g_assert (GCK_IS_SLOT (slots->data) && "missing slot one");
|
|
Packit |
b00eeb |
g_assert (GCK_IS_SLOT (slots->next->data) && "missing slot two");
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
for (l = slots; l; l = g_list_next (l)) {
|
|
Packit |
b00eeb |
info = gck_slot_get_info (GCK_SLOT (l->data));
|
|
Packit |
b00eeb |
g_assert (info != NULL && "no slot info");
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
g_assert (strcmp("TEST MANUFACTURER", info->manufacturer_id) == 0);
|
|
Packit |
b00eeb |
g_assert (strcmp("TEST SLOT", info->slot_description) == 0);
|
|
Packit |
b00eeb |
g_assert (55 == info->hardware_version_major);
|
|
Packit |
b00eeb |
g_assert (155 == info->hardware_version_minor);
|
|
Packit |
b00eeb |
g_assert (65 == info->firmware_version_major);
|
|
Packit |
b00eeb |
g_assert (165 == info->firmware_version_minor);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
if (info->flags & CKF_TOKEN_PRESENT) {
|
|
Packit |
b00eeb |
token = gck_slot_get_token_info (test->slot);
|
|
Packit |
b00eeb |
g_assert (token != NULL && "no token info");
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
g_assert (strcmp ("TEST MANUFACTURER", token->manufacturer_id) == 0);
|
|
Packit |
b00eeb |
g_assert (strcmp ("TEST LABEL", token->label) == 0);
|
|
Packit |
b00eeb |
g_assert (strcmp ("TEST MODEL", token->model) == 0);
|
|
Packit |
b00eeb |
g_assert (strcmp ("TEST SERIAL", token->serial_number) == 0);
|
|
Packit |
b00eeb |
g_assert (1 == token->max_session_count);
|
|
Packit |
b00eeb |
g_assert (2 == token->session_count);
|
|
Packit |
b00eeb |
g_assert (3 == token->max_rw_session_count);
|
|
Packit |
b00eeb |
g_assert (4 == token->rw_session_count);
|
|
Packit |
b00eeb |
g_assert (5 == token->max_pin_len);
|
|
Packit |
b00eeb |
g_assert (6 == token->min_pin_len);
|
|
Packit |
b00eeb |
g_assert (7 == token->total_public_memory);
|
|
Packit |
b00eeb |
g_assert (8 == token->free_public_memory);
|
|
Packit |
b00eeb |
g_assert (9 == token->total_private_memory);
|
|
Packit |
b00eeb |
g_assert (10 == token->free_private_memory);
|
|
Packit |
b00eeb |
g_assert (75 == token->hardware_version_major);
|
|
Packit |
b00eeb |
g_assert (175 == token->hardware_version_minor);
|
|
Packit |
b00eeb |
g_assert (85 == token->firmware_version_major);
|
|
Packit |
b00eeb |
g_assert (185 == token->firmware_version_minor);
|
|
Packit |
b00eeb |
g_assert (927623999 == token->utc_time);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
gck_token_info_free (token);
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
gck_slot_info_free (info);
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
gck_list_unref_free (slots);
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
static void
|
|
Packit |
b00eeb |
test_slot_props (Test *test, gconstpointer unused)
|
|
Packit |
b00eeb |
{
|
|
Packit |
b00eeb |
GckModule *mod;
|
|
Packit |
b00eeb |
CK_SLOT_ID slot_id;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
g_object_get (test->slot, "module", &mod, "handle", &slot_id, NULL);
|
|
Packit |
b00eeb |
g_assert (mod == test->module);
|
|
Packit |
b00eeb |
g_assert (slot_id == 52);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
g_object_unref (mod);
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
static void
|
|
Packit |
b00eeb |
test_slot_equals_hash (Test *test, gconstpointer unused)
|
|
Packit |
b00eeb |
{
|
|
Packit |
b00eeb |
GckModule *other_mod;
|
|
Packit |
b00eeb |
GckSlot *other_slot;
|
|
Packit |
b00eeb |
GObject *obj;
|
|
Packit |
b00eeb |
guint hash;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
hash = gck_slot_hash (test->slot);
|
|
Packit |
b00eeb |
g_assert (hash != 0);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
g_assert (gck_slot_equal (test->slot, test->slot));
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
other_mod = gck_module_new (gck_module_get_functions (test->module));
|
|
Packit |
b00eeb |
other_slot = g_object_new (GCK_TYPE_SLOT, "module", other_mod, "handle", gck_slot_get_handle (test->slot), NULL);
|
|
Packit |
b00eeb |
g_assert (gck_slot_equal (test->slot, other_slot));
|
|
Packit |
b00eeb |
g_object_unref (other_mod);
|
|
Packit |
b00eeb |
g_object_unref (other_slot);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
obj = g_object_new (G_TYPE_OBJECT, NULL);
|
|
Packit |
b00eeb |
g_assert (!gck_slot_equal (test->slot, obj));
|
|
Packit |
b00eeb |
g_object_unref (obj);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
other_slot = g_object_new (GCK_TYPE_SLOT, "module", test->module, "handle", 8909, NULL);
|
|
Packit |
b00eeb |
g_assert (!gck_slot_equal (test->slot, other_slot));
|
|
Packit |
b00eeb |
g_object_unref (other_slot);
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
static void
|
|
Packit |
b00eeb |
test_slot_mechanisms (Test *test, gconstpointer unused)
|
|
Packit |
b00eeb |
{
|
|
Packit |
b00eeb |
GArray *mechs;
|
|
Packit |
b00eeb |
GckMechanismInfo *info;
|
|
Packit |
b00eeb |
guint i;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
mechs = gck_slot_get_mechanisms (test->slot);
|
|
Packit |
b00eeb |
g_assert (2 == gck_mechanisms_length (mechs) && "wrong number of mech types returned");
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
for (i = 0; i < gck_mechanisms_length (mechs); ++i) {
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
info = gck_slot_get_mechanism_info (test->slot, gck_mechanisms_at (mechs, i));
|
|
Packit |
b00eeb |
g_assert (info != NULL && "no mech info returned");
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
gck_mechanism_info_free (info);
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
gck_mechanisms_free (mechs);
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
static void
|
|
Packit |
b00eeb |
test_token_info_match_null (Test *test, gconstpointer unused)
|
|
Packit |
b00eeb |
{
|
|
Packit |
b00eeb |
GckTokenInfo *match;
|
|
Packit |
b00eeb |
GckTokenInfo *token;
|
|
Packit |
b00eeb |
gboolean ret;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
token = gck_slot_get_token_info (test->slot);
|
|
Packit |
b00eeb |
match = g_new0 (GckTokenInfo, 1);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
/* Should match, since no fields are set */
|
|
Packit |
b00eeb |
ret = _gck_token_info_match (match, token);
|
|
Packit |
b00eeb |
g_assert (ret);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
gck_token_info_free (match);
|
|
Packit |
b00eeb |
gck_token_info_free (token);
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
static void
|
|
Packit |
b00eeb |
test_token_info_match_label (Test *test, gconstpointer unused)
|
|
Packit |
b00eeb |
{
|
|
Packit |
b00eeb |
GckTokenInfo *match;
|
|
Packit |
b00eeb |
GckTokenInfo *token;
|
|
Packit |
b00eeb |
gboolean ret;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
token = gck_slot_get_token_info (test->slot);
|
|
Packit |
b00eeb |
match = g_new0 (GckTokenInfo, 1);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
/* Should match since the label and serial are matching */
|
|
Packit |
b00eeb |
match->label = g_strdup (token->label);
|
|
Packit |
b00eeb |
match->serial_number = g_strdup (token->serial_number);
|
|
Packit |
b00eeb |
ret = _gck_token_info_match (match, token);
|
|
Packit |
b00eeb |
g_assert (ret);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
gck_token_info_free (match);
|
|
Packit |
b00eeb |
gck_token_info_free (token);
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
static void
|
|
Packit |
b00eeb |
test_token_info_match_different (Test *test, gconstpointer unused)
|
|
Packit |
b00eeb |
{
|
|
Packit |
b00eeb |
GckTokenInfo *match;
|
|
Packit |
b00eeb |
GckTokenInfo *token;
|
|
Packit |
b00eeb |
gboolean ret;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
token = gck_slot_get_token_info (test->slot);
|
|
Packit |
b00eeb |
match = g_new0 (GckTokenInfo, 1);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
/* Should not match since serial is different */
|
|
Packit |
b00eeb |
match->label = g_strdup (token->label);
|
|
Packit |
b00eeb |
match->serial_number = g_strdup ("393939393939393");
|
|
Packit |
b00eeb |
ret = _gck_token_info_match (match, token);
|
|
Packit |
b00eeb |
g_assert (!ret);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
gck_token_info_free (match);
|
|
Packit |
b00eeb |
gck_token_info_free (token);
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
int
|
|
Packit |
b00eeb |
main (int argc, char **argv)
|
|
Packit |
b00eeb |
{
|
|
Packit |
b00eeb |
g_test_init (&argc, &argv, NULL);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
g_test_add ("/gck/slot/slot_info", Test, NULL, setup, test_slot_info, teardown);
|
|
Packit |
b00eeb |
g_test_add ("/gck/slot/slot_props", Test, NULL, setup, test_slot_props, teardown);
|
|
Packit |
b00eeb |
g_test_add ("/gck/slot/slot_equals_hash", Test, NULL, setup, test_slot_equals_hash, teardown);
|
|
Packit |
b00eeb |
g_test_add ("/gck/slot/slot_mechanisms", Test, NULL, setup, test_slot_mechanisms, teardown);
|
|
Packit |
b00eeb |
g_test_add ("/gck/slot/token_info_match_null", Test, NULL, setup, test_token_info_match_null, teardown);
|
|
Packit |
b00eeb |
g_test_add ("/gck/slot/token_info_match_label", Test, NULL, setup, test_token_info_match_label, teardown);
|
|
Packit |
b00eeb |
g_test_add ("/gck/slot/token_info_match_different", Test, NULL, setup, test_token_info_match_different, teardown);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
return g_test_run ();
|
|
Packit |
b00eeb |
}
|