20#include <winpr/stream.h>
21#include <freerdp/channels/scard.h>
22#include <freerdp/utils/smartcard_pack.h>
26static wStream* build_locate_cards_by_atr_a(UINT32 cbAtr)
32 Stream_Write_UINT32(s, 0);
33 Stream_Write_UINT32(s, 0);
34 Stream_Write_UINT32(s, 1);
35 Stream_Write_UINT32(s, 0x00020000);
36 Stream_Write_UINT32(s, 0);
37 Stream_Write_UINT32(s, 0);
38 Stream_Write_UINT32(s, 1);
39 Stream_Write_UINT32(s, cbAtr);
44 if (!Stream_SetPosition(s, 0))
52static BOOL run_case(UINT32 cbAtr, BOOL expectAccept)
54 wStream* s = build_locate_cards_by_atr_a(cbAtr);
59 const LONG status = smartcard_unpack_locate_cards_by_atr_a_call(s, &call);
62 const BOOL accepted = status == SCARD_S_SUCCESS;
63 if (accepted != expectAccept)
65 printf(
"cbAtr=%" PRIu32
": expected %s, unpack returned 0x%08" PRIX32
"\n", cbAtr,
66 expectAccept ?
"accept" :
"reject", (UINT32)status);
67 free(call.rgAtrMasks);
71 free(call.rgAtrMasks);
75int TestSmartcardPack(
int argc,
char* argv[])
81 if (!run_case(0, TRUE))
83 if (!run_case(36, TRUE))
87 if (!run_case(37, FALSE))
89 if (!run_case(0xFFFFFFFF, FALSE))