Branch data Line data Source code
1 : : /*
2 : : * Test general functionality of software emulated smart card
3 : : *
4 : : * Copyright 2022 Red Hat, Inc.
5 : : *
6 : : * Authors:
7 : : * Jakub Jelen <jjelen@redhat.com>
8 : : *
9 : : * This code is licensed under the GNU LGPL, version 2.1 or later.
10 : : * See the COPYING file in the top-level directory.
11 : : */
12 : : #include <glib.h>
13 : : #include "vreader.c"
14 : : #include "libcacard.h"
15 : : #include "common.h"
16 : :
17 : : #define ARGS "db=\"sql:%s\" use_hw=no soft=(,Test,CAC,,cert1,cert2,cert3)"
18 : :
19 : : static GMainLoop *loop;
20 : : static GThread *thread;
21 : : static guint nreaders;
22 : : static GMutex mutex;
23 : : static GCond cond;
24 : :
25 : : static gpointer
26 : 1 : events_thread(G_GNUC_UNUSED gpointer arg)
27 : : {
28 : : unsigned int reader_id;
29 : : VEvent *event;
30 : :
31 : : while (1) {
32 : 4 : event = vevent_wait_next_vevent();
33 [ + + ]: 4 : if (event->type == VEVENT_LAST) {
34 : 1 : vevent_delete(event);
35 : : break;
36 : : }
37 [ + - ]: 3 : reader_id = vreader_get_id(event->reader);
38 [ + + ]: 3 : if (reader_id == VSCARD_UNDEFINED_READER_ID) {
39 : 1 : g_mutex_lock(&mutex);
40 [ + - ]: 1 : vreader_set_id(event->reader, nreaders++);
41 : 1 : g_cond_signal(&cond);
42 : 1 : g_mutex_unlock(&mutex);
43 : : reader_id = vreader_get_id(event->reader);
44 : : }
45 [ - + ]: 3 : switch (event->type) {
46 : : case VEVENT_READER_INSERT:
47 : : case VEVENT_READER_REMOVE:
48 : : case VEVENT_CARD_INSERT:
49 : : case VEVENT_CARD_REMOVE:
50 : : break;
51 : 0 : case VEVENT_LAST:
52 : : default:
53 : 0 : g_warn_if_reached();
54 : 0 : break;
55 : : }
56 : 3 : vevent_delete(event);
57 : : }
58 : :
59 : 1 : return NULL;
60 : : }
61 : :
62 : 1 : static void libcacard_init(void)
63 : : {
64 : : VCardEmulOptions *command_line_options = NULL;
65 : 1 : gchar *dbdir = g_test_build_filename(G_TEST_DIST, "db", NULL);
66 : 1 : gchar *args = g_strdup_printf(ARGS, dbdir);
67 : : VReader *r;
68 : : VCardEmulError ret;
69 : :
70 : 1 : thread = g_thread_new("test/events", events_thread, NULL);
71 : :
72 : 1 : command_line_options = vcard_emul_options(args);
73 : 1 : ret = vcard_emul_init(command_line_options);
74 [ - + ]: 1 : g_assert_cmpint(ret, ==, VCARD_EMUL_OK);
75 : :
76 : 1 : r = vreader_get_reader_by_name("Test");
77 [ - + ]: 1 : g_assert_nonnull(r);
78 : 1 : vreader_free(r); /* get by name ref */
79 : :
80 : 1 : g_mutex_lock(&mutex);
81 [ - + ]: 1 : while (nreaders == 0)
82 : 0 : g_cond_wait(&cond, &mutex);
83 : 1 : g_mutex_unlock(&mutex);
84 : :
85 : 1 : g_free(args);
86 : 1 : g_free(dbdir);
87 : 1 : }
88 : :
89 : 1 : static void libcacard_finalize(void)
90 : : {
91 : 1 : VReader *reader = vreader_get_reader_by_id(0);
92 : :
93 : : /* This actually still generates events */
94 [ + - ]: 1 : if (reader) /*if /remove didn't run */
95 : 1 : vreader_remove_reader(reader);
96 : :
97 : : /* This probably supposed to be a event that terminates the loop */
98 : 1 : vevent_queue_vevent(vevent_new(VEVENT_LAST, reader, NULL));
99 : :
100 : : /* join */
101 : 1 : g_thread_join(thread);
102 : :
103 : : /* Clean up */
104 : 1 : vreader_free(reader);
105 : :
106 : 1 : vcard_emul_finalize();
107 : 1 : }
108 : :
109 : : #define MAX_ATR_LEN 100
110 : : #define NSS_ATR "\x3B\x89\x00\x56\x43\x41\x52\x44\x5F\x4E\x53\x53"
111 : : #define NSS_ATR_LEN (sizeof(NSS_ATR) - 1)
112 : 1 : static void test_atr_default(void)
113 : : {
114 : 1 : VReader *reader = vreader_get_reader_by_id(0);
115 : : VCard *card;
116 : 1 : unsigned char *atr = g_malloc0(MAX_ATR_LEN);
117 : 1 : int atr_len = MAX_ATR_LEN;
118 : :
119 : : /* Replace the CAC ATR handled with default one */
120 : 1 : card = vreader_get_card(reader);
121 : 1 : vcard_set_atr_func(card, NULL);
122 : 1 : vcard_free(card);
123 : :
124 : : vreader_power_off(reader);
125 : : vreader_power_on(reader, atr, &atr_len);
126 [ - + - + : 1 : g_assert_cmpmem(atr, atr_len, NSS_ATR, NSS_ATR_LEN);
- + ]
127 : :
128 : 1 : vreader_free(reader); /* get by id ref */
129 : 1 : g_free(atr);
130 : 1 : }
131 : :
132 : :
133 : 1 : int main(int argc, char *argv[])
134 : : {
135 : : int ret;
136 : :
137 : 1 : g_test_init(&argc, &argv, NULL);
138 : :
139 : 1 : loop = g_main_loop_new(NULL, TRUE);
140 : :
141 : 1 : libcacard_init();
142 : :
143 : 1 : g_test_add_func("/atr/default", test_atr_default);
144 : :
145 : 1 : ret = g_test_run();
146 : :
147 : 1 : g_main_loop_unref(loop);
148 : :
149 : 1 : libcacard_finalize();
150 : : return ret;
151 : : }
152 : :
153 : : /* vim: set ts=4 sw=4 tw=0 noet expandtab: */
|