2 * implement the Java card standard.
4 * This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
5 * See the COPYING.LIB file in the top-level directory.
8 #include "qemu-common.h"
11 #include "vcard_emul.h"
12 #include "card_7816t.h"
14 struct VCardAppletStruct
{
16 VCardProcessAPDU process_apdu
;
17 VCardResetApplet reset_applet
;
21 VCardAppletPrivateFree applet_private_free
;
26 VCardApplet
*applet_list
;
27 VCardApplet
*current_applet
[MAX_CHANNEL
];
28 VCardBufferResponse
*vcard_buffer_response
;
30 VCardEmul
*vcard_private
;
31 VCardEmulFree vcard_private_free
;
32 VCardGetAtr vcard_get_atr
;
36 vcard_buffer_response_new(unsigned char *buffer
, int size
)
38 VCardBufferResponse
*new_buffer
;
40 new_buffer
= (VCardBufferResponse
*)g_malloc(sizeof(VCardBufferResponse
));
41 new_buffer
->buffer
= (unsigned char *)g_malloc(size
);
42 memcpy(new_buffer
->buffer
, buffer
, size
);
43 new_buffer
->buffer_len
= size
;
44 new_buffer
->current
= new_buffer
->buffer
;
45 new_buffer
->len
= size
;
50 vcard_buffer_response_delete(VCardBufferResponse
*buffer_response
)
52 if (buffer_response
== NULL
) {
55 if (buffer_response
->buffer
) {
56 g_free(buffer_response
->buffer
);
58 g_free(buffer_response
);
63 * clean up state after a reset
66 vcard_reset(VCard
*card
, VCardPower power
)
69 VCardApplet
*applet
= NULL
;
71 if (card
->type
== VCARD_DIRECT
) {
72 /* select the last applet */
73 VCardApplet
*current_applet
= NULL
;
74 for (current_applet
= card
->applet_list
; current_applet
;
75 current_applet
= current_applet
->next
) {
76 applet
= current_applet
;
79 for (i
= 0; i
< MAX_CHANNEL
; i
++) {
80 card
->current_applet
[i
] = applet
;
82 if (card
->vcard_buffer_response
) {
83 vcard_buffer_response_delete(card
->vcard_buffer_response
);
84 card
->vcard_buffer_response
= NULL
;
86 vcard_emul_reset(card
, power
);
88 applet
->reset_applet(card
, 0);
92 /* applet utilities */
99 vcard_new_applet(VCardProcessAPDU applet_process_function
,
100 VCardResetApplet applet_reset_function
,
101 unsigned char *aid
, int aid_len
)
105 applet
= (VCardApplet
*)g_malloc(sizeof(VCardApplet
));
107 applet
->applet_private
= NULL
;
108 applet
->applet_private_free
= NULL
;
109 applet
->process_apdu
= applet_process_function
;
110 applet
->reset_applet
= applet_reset_function
;
112 applet
->aid
= g_malloc(aid_len
);
113 memcpy(applet
->aid
, aid
, aid_len
);
114 applet
->aid_len
= aid_len
;
120 vcard_delete_applet(VCardApplet
*applet
)
122 if (applet
== NULL
) {
125 if (applet
->applet_private_free
) {
126 applet
->applet_private_free(applet
->applet_private
);
127 applet
->applet_private
= NULL
;
138 vcard_set_applet_private(VCardApplet
*applet
, VCardAppletPrivate
*private,
139 VCardAppletPrivateFree private_free
)
141 if (applet
->applet_private_free
) {
142 applet
->applet_private_free(applet
->applet_private
);
144 applet
->applet_private
= private;
145 applet
->applet_private_free
= private_free
;
149 vcard_new(VCardEmul
*private, VCardEmulFree private_free
)
154 new_card
= (VCard
*)g_malloc(sizeof(VCard
));
155 new_card
->applet_list
= NULL
;
156 for (i
= 0; i
< MAX_CHANNEL
; i
++) {
157 new_card
->current_applet
[i
] = NULL
;
159 new_card
->vcard_buffer_response
= NULL
;
160 new_card
->type
= VCARD_VM
;
161 new_card
->vcard_private
= private;
162 new_card
->vcard_private_free
= private_free
;
163 new_card
->vcard_get_atr
= NULL
;
164 new_card
->reference_count
= 1;
169 vcard_reference(VCard
*vcard
)
174 vcard
->reference_count
++;
179 vcard_free(VCard
*vcard
)
181 VCardApplet
*current_applet
= NULL
;
182 VCardApplet
*next_applet
= NULL
;
187 vcard
->reference_count
--;
188 if (vcard
->reference_count
!= 0) {
191 if (vcard
->vcard_private_free
) {
192 (*vcard
->vcard_private_free
)(vcard
->vcard_private
);
193 vcard
->vcard_private_free
= 0;
194 vcard
->vcard_private
= 0;
196 for (current_applet
= vcard
->applet_list
; current_applet
;
197 current_applet
= next_applet
) {
198 next_applet
= current_applet
->next
;
199 vcard_delete_applet(current_applet
);
201 vcard_buffer_response_delete(vcard
->vcard_buffer_response
);
206 vcard_get_atr(VCard
*vcard
, unsigned char *atr
, int *atr_len
)
208 if (vcard
->vcard_get_atr
) {
209 (*vcard
->vcard_get_atr
)(vcard
, atr
, atr_len
);
212 vcard_emul_get_atr(vcard
, atr
, atr_len
);
216 vcard_set_atr_func(VCard
*card
, VCardGetAtr vcard_get_atr
)
218 card
->vcard_get_atr
= vcard_get_atr
;
223 vcard_add_applet(VCard
*card
, VCardApplet
*applet
)
225 applet
->next
= card
->applet_list
;
226 card
->applet_list
= applet
;
227 /* if our card-type is direct, always call the applet */
228 if (card
->type
== VCARD_DIRECT
) {
231 for (i
= 0; i
< MAX_CHANNEL
; i
++) {
232 card
->current_applet
[i
] = applet
;
242 vcard_find_applet(VCard
*card
, unsigned char *aid
, int aid_len
)
244 VCardApplet
*current_applet
;
246 for (current_applet
= card
->applet_list
; current_applet
;
247 current_applet
= current_applet
->next
) {
248 if (current_applet
->aid_len
!= aid_len
) {
251 if (memcmp(current_applet
->aid
, aid
, aid_len
) == 0) {
255 return current_applet
;
259 vcard_applet_get_aid(VCardApplet
*applet
, int *aid_len
)
261 if (applet
== NULL
) {
264 *aid_len
= applet
->aid_len
;
270 vcard_select_applet(VCard
*card
, int channel
, VCardApplet
*applet
)
272 assert(channel
< MAX_CHANNEL
);
273 card
->current_applet
[channel
] = applet
;
274 /* reset the applet */
275 if (applet
&& applet
->reset_applet
) {
276 applet
->reset_applet(card
, channel
);
281 vcard_get_current_applet_private(VCard
*card
, int channel
)
283 VCardApplet
*applet
= card
->current_applet
[channel
];
285 if (applet
== NULL
) {
288 return applet
->applet_private
;
292 vcard_process_applet_apdu(VCard
*card
, VCardAPDU
*apdu
,
293 VCardResponse
**response
)
295 if (card
->current_applet
[apdu
->a_channel
]) {
296 return card
->current_applet
[apdu
->a_channel
]->process_apdu(
297 card
, apdu
, response
);
305 /* accessor functions for the response buffer */
306 VCardBufferResponse
*
307 vcard_get_buffer_response(VCard
*card
)
309 return card
->vcard_buffer_response
;
313 vcard_set_buffer_response(VCard
*card
, VCardBufferResponse
*buffer
)
315 card
->vcard_buffer_response
= buffer
;
319 /* accessor functions for the type */
321 vcard_get_type(VCard
*card
)
327 vcard_set_type(VCard
*card
, VCardType type
)
332 /* accessor for private data */
334 vcard_get_private(VCard
*vcard
)
336 return vcard
->vcard_private
;