File: BufferOverflow_SCardControl.c

package info (click to toggle)
pcsc-lite 2.4.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,700 kB
  • sloc: ansic: 13,894; python: 3,231; lex: 609; makefile: 246; sh: 54; xml: 22
file content (90 lines) | stat: -rw-r--r-- 2,245 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
/*
 * MUSCLE SmartCard Development ( https://pcsclite.apdu.fr/ )
 *
 * Copyright (C) 2009
 *  Ludovic Rousseau <ludovic.rousseau@free.fr>
 */
#include <stdio.h>
#include <string.h>

#ifdef __APPLE__
#include <PCSC/winscard.h>
#include <PCSC/wintypes.h>
#else
#include <winscard.h>
#include <reader.h>
#endif

#define GREEN "\33[32m"
#define BRIGHT_RED "\33[01;31m"
#define NORMAL "\33[0m"

int main(void)
{
	SCARDCONTEXT hContext;
	SCARDHANDLE hCard;
	DWORD dwActiveProtocol;
	LONG rv;
	char mszReaders[1024];
	DWORD dwReaders = sizeof(mszReaders);
	unsigned char bRecvBuffer[MAX_BUFFER_SIZE];
	DWORD length;

	rv = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &hContext);
	printf("SCardEstablishContext %lX\n", rv);

	rv = SCardListReaders(hContext, NULL, mszReaders, &dwReaders);
	printf("SCardListReaders %lX\n", rv);

	rv = SCardConnect(hContext, mszReaders, SCARD_SHARE_DIRECT,
		SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1, &hCard,
		&dwActiveProtocol);
	printf("SCardConnect %lX\n", rv);

	/* expected size is at least 4 bytes */
	length = 3;
	rv = SCardControl(hCard, CM_IOCTL_GET_FEATURE_REQUEST, NULL, 0,
        bRecvBuffer, length, &length);
	if (SCARD_E_INSUFFICIENT_BUFFER == rv)
	{
		printf(GREEN "test PASS. Insufficient buffer is expected\n" NORMAL);
	}
	else
	{
		printf(BRIGHT_RED "test FAIL\n" NORMAL);
	}
	printf("SCardControl %lX: %s\n", rv, pcsc_stringify_error(rv));
	printf("Expected length: %ld\n", length);
	if (SCARD_S_SUCCESS == rv)
	{
		int i;

		for (i=0; i<length; i++)
			printf("%02X ", bRecvBuffer[i]);
		printf("\n");
	}

	rv = SCardControl(hCard, CM_IOCTL_GET_FEATURE_REQUEST, NULL, 0,
        bRecvBuffer, sizeof bRecvBuffer, &length);
	printf("SCardControl %lX: %s\n", rv, pcsc_stringify_error(rv));
	printf("Expected length: %ld\n", length);
	if (SCARD_S_SUCCESS == rv)
	{
		int i;

		for (i=0; i<length; i++)
			printf("%02X ", bRecvBuffer[i]);
		printf("\n");
	}

	rv = SCardControl(hCard, CM_IOCTL_GET_FEATURE_REQUEST, NULL, 0,
        bRecvBuffer, MAX_BUFFER_SIZE_EXTENDED +1, &length);
	printf("SCardControl %lX: %s\n", rv, pcsc_stringify_error(rv));
	printf("Expected length: %ld\n", length);
	if (SCARD_E_INSUFFICIENT_BUFFER == rv)
	{
		printf(BRIGHT_RED "test FAIL\n" NORMAL);
	}

	return 0;
}