FreeRDP
Loading...
Searching...
No Matches
TestSmartcardPack.c
1
17#include <stdio.h>
18#include <string.h>
19
20#include <winpr/stream.h>
21#include <freerdp/channels/scard.h>
22#include <freerdp/utils/smartcard_pack.h>
23
24/* Build a LocateCardsByATRA call (cbContext=0, cAtrs=1, cReaders=0) holding a single
25 * LocateCards_ATRMask whose cbAtr is set to the requested value. */
26static wStream* build_locate_cards_by_atr_a(UINT32 cbAtr)
27{
28 wStream* s = Stream_New(nullptr, 24 + 8 + sizeof(LocateCards_ATRMask));
29 if (!s)
30 return nullptr;
31
32 Stream_Write_UINT32(s, 0); /* cbContext = 0 */
33 Stream_Write_UINT32(s, 0); /* pbContextNdrPtr = 0 */
34 Stream_Write_UINT32(s, 1); /* cAtrs = 1 */
35 Stream_Write_UINT32(s, 0x00020000); /* rgAtrMasksNdrPtr */
36 Stream_Write_UINT32(s, 0); /* cReaders = 0 */
37 Stream_Write_UINT32(s, 0); /* rgReaderStatesNdrPtr = 0 */
38 Stream_Write_UINT32(s, 1); /* conformant count = cAtrs */
39 Stream_Write_UINT32(s, cbAtr); /* LocateCards_ATRMask::cbAtr */
40 Stream_Zero(s, 36); /* rgbAtr[36] */
41 Stream_Zero(s, 36); /* rgbMask[36] */
42
43 Stream_SealLength(s);
44 if (!Stream_SetPosition(s, 0))
45 {
46 Stream_Free(s, TRUE);
47 return nullptr;
48 }
49 return s;
50}
51
52static BOOL run_case(UINT32 cbAtr, BOOL expectAccept)
53{
54 wStream* s = build_locate_cards_by_atr_a(cbAtr);
55 if (!s)
56 return FALSE;
57
58 LocateCardsByATRA_Call call = { 0 };
59 const LONG status = smartcard_unpack_locate_cards_by_atr_a_call(s, &call);
60 Stream_Free(s, TRUE);
61
62 const BOOL accepted = status == SCARD_S_SUCCESS;
63 if (accepted != expectAccept)
64 {
65 printf("cbAtr=%" PRIu32 ": expected %s, unpack returned 0x%08" PRIX32 "\n", cbAtr,
66 expectAccept ? "accept" : "reject", (UINT32)status);
67 free(call.rgAtrMasks);
68 return FALSE;
69 }
70
71 free(call.rgAtrMasks);
72 return TRUE;
73}
74
75int TestSmartcardPack(int argc, char* argv[])
76{
77 WINPR_UNUSED(argc);
78 WINPR_UNUSED(argv);
79
80 /* Valid: cbAtr within the fixed 36-byte rgbAtr/rgbMask arrays. */
81 if (!run_case(0, TRUE))
82 return -1;
83 if (!run_case(36, TRUE))
84 return -1;
85
86 /* Out of range: cbAtr larger than the buffers would later overrun them. */
87 if (!run_case(37, FALSE))
88 return -1;
89 if (!run_case(0xFFFFFFFF, FALSE))
90 return -1;
91
92 return 0;
93}