Blame p11-kit/test-filter.c

Packit Service 3749ba
/*
Packit Service 3749ba
 * Copyright (c) 2016 Red Hat Inc
Packit Service 3749ba
 *
Packit Service 3749ba
 * Redistribution and use in source and binary forms, with or without
Packit Service 3749ba
 * modification, are permitted provided that the following conditions
Packit Service 3749ba
 * are met:
Packit Service 3749ba
 *
Packit Service 3749ba
 *     * Redistributions of source code must retain the above
Packit Service 3749ba
 *       copyright notice, this list of conditions and the
Packit Service 3749ba
 *       following disclaimer.
Packit Service 3749ba
 *     * Redistributions in binary form must reproduce the
Packit Service 3749ba
 *       above copyright notice, this list of conditions and
Packit Service 3749ba
 *       the following disclaimer in the documentation and/or
Packit Service 3749ba
 *       other materials provided with the distribution.
Packit Service 3749ba
 *     * The names of contributors to this software may not be
Packit Service 3749ba
 *       used to endorse or promote products derived from this
Packit Service 3749ba
 *       software without specific prior written permission.
Packit Service 3749ba
 *
Packit Service 3749ba
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
Packit Service 3749ba
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
Packit Service 3749ba
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
Packit Service 3749ba
 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
Packit Service 3749ba
 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
Packit Service 3749ba
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
Packit Service 3749ba
 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
Packit Service 3749ba
 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
Packit Service 3749ba
 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
Packit Service 3749ba
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
Packit Service 3749ba
 * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
Packit Service 3749ba
 * DAMAGE.
Packit Service 3749ba
 *
Packit Service 3749ba
 * Author: Daiki Ueno
Packit Service 3749ba
 */
Packit Service 3749ba
Packit Service 3749ba
#include "config.h"
Packit Service 3749ba
#include "test.h"
Packit Service 3749ba
Packit Service 3749ba
#include "dict.h"
Packit Service 3749ba
#include "library.h"
Packit Service 3749ba
#include "filter.h"
Packit Service 3749ba
#include "mock.h"
Packit Service 3749ba
#include "modules.h"
Packit Service 3749ba
#include "p11-kit.h"
Packit Service 3749ba
#include "virtual.h"
Packit Service 3749ba
Packit Service 3749ba
#include <errno.h>
Packit Service 3749ba
#include <stdlib.h>
Packit Service 3749ba
#include <stdio.h>
Packit Service 3749ba
#include <string.h>
Packit Service 3749ba
Packit Service 3749ba
static CK_TOKEN_INFO TOKEN_ONE = {
Packit Service 3749ba
	"TEST LABEL                      ",
Packit Service 3749ba
	"TEST MANUFACTURER               ",
Packit Service 3749ba
	"TEST MODEL      ",
Packit Service 3749ba
	"TEST SERIAL     ",
Packit Service 3749ba
	CKF_LOGIN_REQUIRED | CKF_USER_PIN_INITIALIZED | CKF_CLOCK_ON_TOKEN | CKF_TOKEN_INITIALIZED,
Packit Service 3749ba
	1,
Packit Service 3749ba
	2,
Packit Service 3749ba
	3,
Packit Service 3749ba
	4,
Packit Service 3749ba
	5,
Packit Service 3749ba
	6,
Packit Service 3749ba
	7,
Packit Service 3749ba
	8,
Packit Service 3749ba
	9,
Packit Service 3749ba
	10,
Packit Service 3749ba
	{ 75, 175 },
Packit Service 3749ba
	{ 85, 185 },
Packit Service 3749ba
	{ '1', '9', '9', '9', '0', '5', '2', '5', '0', '9', '1', '9', '5', '9', '0', '0' }
Packit Service 3749ba
};
Packit Service 3749ba
Packit Service 3749ba
static void
Packit Service 3749ba
test_allowed (void)
Packit Service 3749ba
{
Packit Service 3749ba
	CK_FUNCTION_LIST_PTR module;
Packit Service 3749ba
	CK_SLOT_ID slots[1], slot;
Packit Service 3749ba
	CK_SLOT_INFO slot_info;
Packit Service 3749ba
	CK_TOKEN_INFO token_info;
Packit Service 3749ba
	CK_MECHANISM_TYPE mechs[8];
Packit Service 3749ba
	CK_MECHANISM_INFO mech;
Packit Service 3749ba
	CK_SESSION_HANDLE session = 0;
Packit Service 3749ba
	p11_virtual virt;
Packit Service 3749ba
	p11_virtual *filter;
Packit Service 3749ba
	CK_ULONG count;
Packit Service 3749ba
	CK_RV rv;
Packit Service 3749ba
Packit Service 3749ba
	p11_virtual_init (&virt, &p11_virtual_base, &mock_module, NULL);
Packit Service 3749ba
	filter = p11_filter_subclass (&virt, NULL);
Packit Service 3749ba
	module = p11_virtual_wrap (filter, (p11_destroyer)p11_virtual_uninit);
Packit Service 3749ba
	assert_ptr_not_null (module);
Packit Service 3749ba
Packit Service 3749ba
	p11_filter_allow_token (filter, &TOKEN_ONE);
Packit Service 3749ba
Packit Service 3749ba
	rv = (module->C_Initialize) (NULL);
Packit Service 3749ba
	assert_num_eq (CKR_OK, rv);
Packit Service 3749ba
Packit Service 3749ba
	rv = (module->C_GetSlotList) (CK_TRUE, NULL, NULL);
Packit Service 3749ba
	assert_num_eq (CKR_ARGUMENTS_BAD, rv);
Packit Service 3749ba
Packit Service 3749ba
	rv = (module->C_GetSlotList) (CK_TRUE, NULL, &count);
Packit Service 3749ba
	assert_num_eq (CKR_OK, rv);
Packit Service 3749ba
	assert_num_eq (count, 1);
Packit Service 3749ba
Packit Service 3749ba
	count = 0;
Packit Service 3749ba
	rv = (module->C_GetSlotList) (CK_TRUE, slots, &count);
Packit Service 3749ba
	assert_num_eq (CKR_BUFFER_TOO_SMALL, rv);
Packit Service 3749ba
Packit Service 3749ba
	count = 1;
Packit Service 3749ba
	rv = (module->C_GetSlotList) (CK_TRUE, slots, &count);
Packit Service 3749ba
	assert_num_eq (CKR_OK, rv);
Packit Service 3749ba
	assert_num_eq (count, 1);
Packit Service 3749ba
Packit Service 3749ba
	rv = (module->C_GetSlotInfo) (99, &slot_info);
Packit Service 3749ba
	assert_num_eq (CKR_SLOT_ID_INVALID, rv);
Packit Service 3749ba
Packit Service 3749ba
	rv = (module->C_GetSlotInfo) (slots[0], &slot_info);
Packit Service 3749ba
	assert_num_eq (CKR_OK, rv);
Packit Service 3749ba
Packit Service 3749ba
	rv = (module->C_GetTokenInfo) (99, &token_info);
Packit Service 3749ba
	assert_num_eq (CKR_SLOT_ID_INVALID, rv);
Packit Service 3749ba
Packit Service 3749ba
	rv = (module->C_GetTokenInfo) (slots[0], &token_info);
Packit Service 3749ba
	assert_num_eq (CKR_OK, rv);
Packit Service 3749ba
Packit Service 3749ba
	rv = (module->C_GetMechanismList) (99, NULL, &count);
Packit Service 3749ba
	assert_num_eq (CKR_SLOT_ID_INVALID, rv);
Packit Service 3749ba
Packit Service 3749ba
	rv = (module->C_GetMechanismList) (slots[0], NULL, &count);
Packit Service 3749ba
	assert_num_eq (CKR_OK, rv);
Packit Service 3749ba
Packit Service 3749ba
	rv = (module->C_GetMechanismList) (slots[0], mechs, &count);
Packit Service 3749ba
	assert_num_eq (CKR_OK, rv);
Packit Service 3749ba
	assert_num_eq (2, count);
Packit Service 3749ba
Packit Service 3749ba
	rv = (module->C_GetMechanismInfo) (99, mechs[0], &mech);
Packit Service 3749ba
	assert_num_eq (CKR_SLOT_ID_INVALID, rv);
Packit Service 3749ba
Packit Service 3749ba
	rv = (module->C_GetMechanismInfo) (slots[0], mechs[0], &mech);
Packit Service 3749ba
	assert_num_eq (CKR_OK, rv);
Packit Service 3749ba
Packit Service 3749ba
	rv = (module->C_InitToken) (99, (CK_UTF8CHAR_PTR)"TEST PIN", 8, (CK_UTF8CHAR_PTR)"TEST LABEL");
Packit Service 3749ba
	assert_num_eq (CKR_SLOT_ID_INVALID, rv);
Packit Service 3749ba
Packit Service 3749ba
	rv = (module->C_InitToken) (slots[0], (CK_UTF8CHAR_PTR)"TEST PIN", 8, (CK_UTF8CHAR_PTR)"TEST LABEL");
Packit Service 3749ba
	assert_num_eq (CKR_OK, rv);
Packit Service 3749ba
Packit Service 3749ba
	rv = (module->C_WaitForSlotEvent) (0, &slot, NULL);
Packit Service 3749ba
	assert_num_eq (CKR_FUNCTION_NOT_SUPPORTED, rv);
Packit Service 3749ba
Packit Service 3749ba
	rv = (module->C_OpenSession) (99, CKF_SERIAL_SESSION, NULL, NULL, &session);
Packit Service 3749ba
	assert_num_eq (CKR_SLOT_ID_INVALID, rv);
Packit Service 3749ba
Packit Service 3749ba
	rv = (module->C_OpenSession) (slots[0], CKF_SERIAL_SESSION, NULL, NULL, &session);
Packit Service 3749ba
	assert_num_eq (CKR_OK, rv);
Packit Service 3749ba
Packit Service 3749ba
	rv = (module->C_CloseAllSessions) (99);
Packit Service 3749ba
	assert_num_eq (CKR_SLOT_ID_INVALID, rv);
Packit Service 3749ba
Packit Service 3749ba
	rv = (module->C_CloseAllSessions) (slots[0]);
Packit Service 3749ba
	assert_num_eq (CKR_OK, rv);
Packit Service 3749ba
Packit Service 3749ba
	rv = (module->C_Finalize) (NULL);
Packit Service 3749ba
	assert_num_eq (CKR_OK, rv);
Packit Service 3749ba
Packit Service 3749ba
	p11_virtual_unwrap (module);
Packit Service 3749ba
	p11_filter_release (filter);
Packit Service 3749ba
}
Packit Service 3749ba
Packit Service 3749ba
static void
Packit Service 3749ba
test_denied (void)
Packit Service 3749ba
{
Packit Service 3749ba
	CK_FUNCTION_LIST_PTR module;
Packit Service 3749ba
	p11_virtual virt;
Packit Service 3749ba
	p11_virtual *filter;
Packit Service 3749ba
	CK_ULONG count;
Packit Service 3749ba
	CK_RV rv;
Packit Service 3749ba
Packit Service 3749ba
	p11_virtual_init (&virt, &p11_virtual_base, &mock_module, NULL);
Packit Service 3749ba
	filter = p11_filter_subclass (&virt, NULL);
Packit Service 3749ba
	module = p11_virtual_wrap (filter, (p11_destroyer)p11_virtual_uninit);
Packit Service 3749ba
	assert_ptr_not_null (module);
Packit Service 3749ba
Packit Service 3749ba
	p11_filter_deny_token (filter, &TOKEN_ONE);
Packit Service 3749ba
Packit Service 3749ba
	rv = (module->C_Initialize) (NULL);
Packit Service 3749ba
	assert_num_eq (CKR_OK, rv);
Packit Service 3749ba
Packit Service 3749ba
	rv = (module->C_GetSlotList) (CK_TRUE, NULL, &count);
Packit Service 3749ba
	assert_num_eq (CKR_OK, rv);
Packit Service 3749ba
	assert_num_eq (count, 0);
Packit Service 3749ba
Packit Service 3749ba
	rv = (module->C_Finalize) (NULL);
Packit Service 3749ba
	assert_num_eq (CKR_OK, rv);
Packit Service 3749ba
Packit Service 3749ba
	p11_virtual_unwrap (module);
Packit Service 3749ba
	p11_filter_release (filter);
Packit Service 3749ba
}
Packit Service 3749ba
Packit Service 3749ba
static void
Packit Service 3749ba
test_write_protected (void)
Packit Service 3749ba
{
Packit Service 3749ba
	CK_FUNCTION_LIST_PTR module;
Packit Service 3749ba
	CK_SLOT_ID slots[1], slot;
Packit Service 3749ba
	CK_SLOT_INFO slot_info;
Packit Service 3749ba
	CK_TOKEN_INFO token_info;
Packit Service 3749ba
	CK_TOKEN_INFO token_one;
Packit Service 3749ba
	CK_MECHANISM_TYPE mechs[8];
Packit Service 3749ba
	CK_MECHANISM_INFO mech;
Packit Service 3749ba
	CK_SESSION_HANDLE session = 0;
Packit Service 3749ba
	p11_virtual virt;
Packit Service 3749ba
	p11_virtual *filter;
Packit Service 3749ba
	CK_ULONG count;
Packit Service 3749ba
	CK_RV rv;
Packit Service 3749ba
Packit Service 3749ba
	p11_virtual_init (&virt, &p11_virtual_base, &mock_module, NULL);
Packit Service 3749ba
	filter = p11_filter_subclass (&virt, NULL);
Packit Service 3749ba
	module = p11_virtual_wrap (filter, (p11_destroyer)p11_virtual_uninit);
Packit Service 3749ba
	assert_ptr_not_null (module);
Packit Service 3749ba
Packit Service 3749ba
	memcpy (&token_one, &TOKEN_ONE, sizeof (CK_TOKEN_INFO));
Packit Service 3749ba
	token_one.flags |= CKF_WRITE_PROTECTED;
Packit Service 3749ba
Packit Service 3749ba
	p11_filter_allow_token (filter, &token_one);
Packit Service 3749ba
Packit Service 3749ba
	rv = (module->C_Initialize) (NULL);
Packit Service 3749ba
	assert_num_eq (CKR_OK, rv);
Packit Service 3749ba
Packit Service 3749ba
	rv = (module->C_GetSlotList) (CK_TRUE, NULL, NULL);
Packit Service 3749ba
	assert_num_eq (CKR_ARGUMENTS_BAD, rv);
Packit Service 3749ba
Packit Service 3749ba
	rv = (module->C_GetSlotList) (CK_TRUE, NULL, &count);
Packit Service 3749ba
	assert_num_eq (CKR_OK, rv);
Packit Service 3749ba
	assert_num_eq (count, 1);
Packit Service 3749ba
Packit Service 3749ba
	count = 0;
Packit Service 3749ba
	rv = (module->C_GetSlotList) (CK_TRUE, slots, &count);
Packit Service 3749ba
	assert_num_eq (CKR_BUFFER_TOO_SMALL, rv);
Packit Service 3749ba
Packit Service 3749ba
	count = 1;
Packit Service 3749ba
	rv = (module->C_GetSlotList) (CK_TRUE, slots, &count);
Packit Service 3749ba
	assert_num_eq (CKR_OK, rv);
Packit Service 3749ba
	assert_num_eq (count, 1);
Packit Service 3749ba
Packit Service 3749ba
	rv = (module->C_GetSlotInfo) (99, &slot_info);
Packit Service 3749ba
	assert_num_eq (CKR_SLOT_ID_INVALID, rv);
Packit Service 3749ba
Packit Service 3749ba
	rv = (module->C_GetSlotInfo) (slots[0], &slot_info);
Packit Service 3749ba
	assert_num_eq (CKR_OK, rv);
Packit Service 3749ba
Packit Service 3749ba
	rv = (module->C_GetTokenInfo) (99, &token_info);
Packit Service 3749ba
	assert_num_eq (CKR_SLOT_ID_INVALID, rv);
Packit Service 3749ba
Packit Service 3749ba
	rv = (module->C_GetTokenInfo) (slots[0], &token_info);
Packit Service 3749ba
	assert_num_eq (CKR_OK, rv);
Packit Service 3749ba
Packit Service 3749ba
	rv = (module->C_GetMechanismList) (99, NULL, &count);
Packit Service 3749ba
	assert_num_eq (CKR_SLOT_ID_INVALID, rv);
Packit Service 3749ba
Packit Service 3749ba
	rv = (module->C_GetMechanismList) (slots[0], NULL, &count);
Packit Service 3749ba
	assert_num_eq (CKR_OK, rv);
Packit Service 3749ba
Packit Service 3749ba
	rv = (module->C_GetMechanismList) (slots[0], mechs, &count);
Packit Service 3749ba
	assert_num_eq (CKR_OK, rv);
Packit Service 3749ba
	assert_num_eq (2, count);
Packit Service 3749ba
Packit Service 3749ba
	rv = (module->C_GetMechanismInfo) (99, mechs[0], &mech);
Packit Service 3749ba
	assert_num_eq (CKR_SLOT_ID_INVALID, rv);
Packit Service 3749ba
Packit Service 3749ba
	rv = (module->C_GetMechanismInfo) (slots[0], mechs[0], &mech);
Packit Service 3749ba
	assert_num_eq (CKR_OK, rv);
Packit Service 3749ba
Packit Service 3749ba
	rv = (module->C_InitToken) (99, (CK_UTF8CHAR_PTR)"TEST PIN", 8, (CK_UTF8CHAR_PTR)"TEST LABEL");
Packit Service 3749ba
	assert_num_eq (CKR_SLOT_ID_INVALID, rv);
Packit Service 3749ba
Packit Service 3749ba
	rv = (module->C_InitToken) (slots[0], (CK_UTF8CHAR_PTR)"TEST PIN", 8, (CK_UTF8CHAR_PTR)"TEST LABEL");
Packit Service 3749ba
	assert_num_eq (CKR_TOKEN_WRITE_PROTECTED, rv);
Packit Service 3749ba
Packit Service 3749ba
	rv = (module->C_WaitForSlotEvent) (0, &slot, NULL);
Packit Service 3749ba
	assert_num_eq (CKR_FUNCTION_NOT_SUPPORTED, rv);
Packit Service 3749ba
Packit Service 3749ba
	rv = (module->C_OpenSession) (99, CKF_SERIAL_SESSION | CKF_RW_SESSION, NULL, NULL, &session);
Packit Service 3749ba
	assert_num_eq (CKR_SLOT_ID_INVALID, rv);
Packit Service 3749ba
Packit Service 3749ba
	rv = (module->C_OpenSession) (slots[0], CKF_SERIAL_SESSION | CKF_RW_SESSION, NULL, NULL, &session);
Packit Service 3749ba
	assert_num_eq (CKR_TOKEN_WRITE_PROTECTED, rv);
Packit Service 3749ba
Packit Service 3749ba
	rv = (module->C_CloseAllSessions) (99);
Packit Service 3749ba
	assert_num_eq (CKR_SLOT_ID_INVALID, rv);
Packit Service 3749ba
Packit Service 3749ba
	rv = (module->C_CloseAllSessions) (slots[0]);
Packit Service 3749ba
	assert_num_eq (CKR_OK, rv);
Packit Service 3749ba
Packit Service 3749ba
	rv = (module->C_Finalize) (NULL);
Packit Service 3749ba
	assert_num_eq (CKR_OK, rv);
Packit Service 3749ba
Packit Service 3749ba
	p11_virtual_unwrap (module);
Packit Service 3749ba
	p11_filter_release (filter);
Packit Service 3749ba
}
Packit Service 3749ba
Packit Service 3749ba
int
Packit Service 3749ba
main (int argc,
Packit Service 3749ba
      char *argv[])
Packit Service 3749ba
{
Packit Service 3749ba
	p11_library_init ();
Packit Service 3749ba
	mock_module_init ();
Packit Service 3749ba
Packit Service 3749ba
	p11_test (test_allowed, "/filter/test_allowed");
Packit Service 3749ba
	p11_test (test_denied, "/filter/test_denied");
Packit Service 3749ba
	p11_test (test_write_protected, "/filter/test_write_protected");
Packit Service 3749ba
Packit Service 3749ba
	return p11_test_run (argc, argv);
Packit Service 3749ba
}