summaryrefslogtreecommitdiff
path: root/usr/src/lib/libpcsc/common/winscard.h
blob: f144f13da9fc455597cd8ae504f9a3140032f827 (plain)
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
/*
 * This file and its contents are supplied under the terms of the
 * Common Development and Distribution License ("CDDL"), version 1.0.
 * You may only use this file in accordance with the terms of version
 * 1.0 of the CDDL.
 *
 * A full copy of the text of the CDDL should have accompanied this
 * source.  A copy of the CDDL is also available via the Internet at
 * http://www.illumos.org/license/CDDL.
 */

/*
 * Copyright 2019 Joyent, Inc.
 */

#ifndef _WINSCARD_H
#define	_WINSCARD_H

/*
 * This library provides a compatibility interface with programs designed
 * against the PC SmartCard Library. This originates from Microsoft and has been
 * used on a few different forms over the years by folks. The purpose of this
 * library is for compatibility.
 *
 * At the time of this writing, Microsofts API documentation can be found here:
 * https://docs.microsoft.com/en-us/windows/win32/api/winscard/
 *
 * New consumers should not use this library and instead should leverage
 * ccid(4D) instead.
 */

#include <stdint.h>
#include <wintypes.h>

#ifdef __cplusplus
extern "C" {
#endif

/*
 * This is a departure from the PCSC system which defines this as a LONG,
 * which is the same size on 32bit and 64bit Windows (ILP32 and LLP64).
 * We need to use the real native pointer size for the context handle as
 * it wouldn't fit into a LONG on our LP64 platform.
 */
typedef void *SCARDCONTEXT;
typedef void **PSCARDCONTEXT;
typedef void **LPSCARDCONTEXT;
typedef void *SCARDHANDLE;
typedef void **PSCARDHANDLE;
typedef void **LPSCARDHANDLE;

/*
 * Conventionally this is supposed to be packed.
 */
#pragma pack(1)
typedef struct {
	unsigned long dwProtocol;
	unsigned long cbPciLength;
} SCARD_IO_REQUEST, *PSCARD_IO_REQUEST, *LPSCARD_IO_REQUEST;
#pragma pack()

extern SCARD_IO_REQUEST g_rgSCardT0Pci, g_rgSCardT1Pci, g_rgSCardRawPci;
#define	SCARD_PCI_T0	(&g_rgSCardT0Pci)
#define	SCARD_PCI_T1	(&g_rgSCardT1Pci)
#define	SCARD_PCI_RAW	(&g_rgSCardRawPci)

/*
 * Return values and error codes. We strive to use the same error codes as
 * Microsoft.
 */
#define	SCARD_S_SUCCESS			((LONG)0x00000000)
#define	SCARD_F_INTERNAL_ERROR		((LONG)0x80100001)
#define	SCARD_E_CANCELLED		((LONG)0x80100002)
#define	SCARD_E_INVALID_HANDLE		((LONG)0x80100003)
#define	SCARD_E_INVALID_PARAMETER	((LONG)0x80100004)
#define	SCARD_E_NO_MEMORY		((LONG)0x80100006)
#define	SCARD_E_INSUFFICIENT_BUFFER	((LONG)0x80100008)
#define	SCARD_E_UNKNOWN_READER		((LONG)0x80100009)
#define	SCARD_E_TIMEOUT			((LONG)0x8010000a)
#define	SCARD_E_SHARING_VIOLATION	((LONG)0x8010000b)
#define	SCARD_E_NO_SMARTCARD		((LONG)0x8010000c)
#define	SCARD_E_UNKNOWN_CARD		((LONG)0x8010000d)
#define	SCARD_E_PROTO_MISMATCH		((LONG)0x8010000f)
#define	SCARD_E_INVALID_VALUE		((LONG)0x80100011)
#define	SCARD_F_COMM_ERROR		((LONG)0x80100013)
#define	SCARD_F_UNKNOWN_ERROR		((LONG)0x80100014)
#define	SCARD_E_READER_UNAVAILABLE	((LONG)0x80100017)
#define	SCARD_E_NO_SERVICE		((LONG)0x8010001D)
#define	SCARD_E_UNSUPPORTED_FEATURE	((LONG)0x80100022)
#define	SCARD_E_NO_READERS_AVAILABLE	((LONG)0x8010002E)
#define	SCARD_W_UNSUPPORTED_CARD	((LONG)0x80100065)
#define	SCARD_W_UNPOWERED_CARD		((LONG)0x80100067)
#define	SCARD_W_RESET_CARD		((LONG)0x80100068)
#define	SCARD_W_REMOVED_CARD		((LONG)0x80100069)

#define	SCARD_SCOPE_USER		0x0000
#define	SCARD_SCOPE_TERMINAL		0x0001
#define	SCARD_SCOPE_SYSTEM		0x0002
#define	SCARD_SCOPE_GLOBAL		0x0003

#define	SCARD_SHARE_EXCLUSIVE	0x0001
#define	SCARD_SHARE_SHARED	0x0002
#define	SCARD_SHARE_DIRECT	0x0003

#define	SCARD_PROTOCOL_T0	0x0001
#define	SCARD_PROTOCOL_T1	0x0002
#define	SCARD_PROTOCOL_RAW	0x0004
#define	SCARD_PROTOCOL_T15	0x0008

#define	SCARD_LEAVE_CARD	0x0000
#define	SCARD_RESET_CARD	0x0001
#define	SCARD_UNPOWER_CARD	0x0002
#define	SCARD_EJECT_CARD	0x0003

/*
 * This is used to indicate that the framework should allocate memory.
 */
#define	SCARD_AUTOALLOCATE		UINT32_MAX

extern LONG SCardEstablishContext(DWORD, LPCVOID, LPCVOID, LPSCARDCONTEXT);
extern LONG SCardReleaseContext(SCARDCONTEXT);

extern LONG SCardListReaders(SCARDCONTEXT, LPCSTR, LPSTR, LPDWORD);

extern LONG SCardFreeMemory(SCARDCONTEXT, LPCVOID);

extern LONG SCardConnect(SCARDCONTEXT, LPCSTR, DWORD, DWORD, LPSCARDHANDLE,
    LPDWORD);
extern LONG SCardDisconnect(SCARDHANDLE, DWORD);

extern LONG SCardBeginTransaction(SCARDHANDLE);
extern LONG SCardEndTransaction(SCARDHANDLE, DWORD);
extern LONG SCardReconnect(SCARDHANDLE, DWORD, DWORD, DWORD, LPDWORD);

extern LONG SCardTransmit(SCARDHANDLE, const SCARD_IO_REQUEST *, LPCBYTE,
    DWORD, SCARD_IO_REQUEST *, LPBYTE, LPDWORD);

extern const char *pcsc_stringify_error(const LONG);

#ifdef __cplusplus
}
#endif

#endif /* _WINSCARD_H */