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
*)qemu_malloc(sizeof(VCardBufferResponse
));
41 new_buffer
->buffer
= (unsigned char *)qemu_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 qemu_free(buffer_response
->buffer
);
58 qemu_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
*)qemu_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
= qemu_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
;
130 qemu_free(applet
->aid
);
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
*)qemu_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
);
207 vcard_get_atr(VCard
*vcard
, unsigned char *atr
, int *atr_len
)
209 if (vcard
->vcard_get_atr
) {
210 (*vcard
->vcard_get_atr
)(vcard
, atr
, atr_len
);
213 vcard_emul_get_atr(vcard
, atr
, atr_len
);
217 vcard_set_atr_func(VCard
*card
, VCardGetAtr vcard_get_atr
)
219 card
->vcard_get_atr
= vcard_get_atr
;
224 vcard_add_applet(VCard
*card
, VCardApplet
*applet
)
226 applet
->next
= card
->applet_list
;
227 card
->applet_list
= applet
;
228 /* if our card-type is direct, always call the applet */
229 if (card
->type
== VCARD_DIRECT
) {
232 for (i
= 0; i
< MAX_CHANNEL
; i
++) {
233 card
->current_applet
[i
] = applet
;
243 vcard_find_applet(VCard
*card
, unsigned char *aid
, int aid_len
)
245 VCardApplet
*current_applet
;
247 for (current_applet
= card
->applet_list
; current_applet
;
248 current_applet
= current_applet
->next
) {
249 if (current_applet
->aid_len
!= aid_len
) {
252 if (memcmp(current_applet
->aid
, aid
, aid_len
) == 0) {
256 return current_applet
;
260 vcard_applet_get_aid(VCardApplet
*applet
, int *aid_len
)
262 if (applet
== NULL
) {
265 *aid_len
= applet
->aid_len
;
271 vcard_select_applet(VCard
*card
, int channel
, VCardApplet
*applet
)
273 assert(channel
< MAX_CHANNEL
);
274 card
->current_applet
[channel
] = applet
;
275 /* reset the applet */
276 if (applet
&& applet
->reset_applet
) {
277 applet
->reset_applet(card
, channel
);
282 vcard_get_current_applet_private(VCard
*card
, int channel
)
284 VCardApplet
*applet
= card
->current_applet
[channel
];
286 if (applet
== NULL
) {
289 return applet
->applet_private
;
293 vcard_process_applet_apdu(VCard
*card
, VCardAPDU
*apdu
,
294 VCardResponse
**response
)
296 if (card
->current_applet
[apdu
->a_channel
]) {
297 return card
->current_applet
[apdu
->a_channel
]->process_apdu(
298 card
, apdu
, response
);
306 /* accessor functions for the response buffer */
307 VCardBufferResponse
*
308 vcard_get_buffer_response(VCard
*card
)
310 return card
->vcard_buffer_response
;
314 vcard_set_buffer_response(VCard
*card
, VCardBufferResponse
*buffer
)
316 card
->vcard_buffer_response
= buffer
;
320 /* accessor functions for the type */
322 vcard_get_type(VCard
*card
)
328 vcard_set_type(VCard
*card
, VCardType type
)
333 /* accessor for private data */
335 vcard_get_private(VCard
*vcard
)
337 return vcard
->vcard_private
;