Skip to main content

browser_protocol/smartcardemulation/
mod.rs

1use serde::{Serialize, Deserialize};
2
3/// Indicates the PC/SC error code.
4/// 
5/// This maps to:
6/// PC/SC Lite: <https://pcsclite.apdu.fr/api/group__ErrorCodes.html>
7/// Microsoft: <https://learn.microsoft.com/en-us/windows/win32/secauthn/authentication-return-values>
8
9#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
10pub enum ResultCode {
11    #[default]
12    Success,
13    RemovedCard,
14    ResetCard,
15    UnpoweredCard,
16    UnresponsiveCard,
17    UnsupportedCard,
18    ReaderUnavailable,
19    SharingViolation,
20    NotTransacted,
21    NoSmartcard,
22    ProtoMismatch,
23    SystemCancelled,
24    NotReady,
25    Cancelled,
26    InsufficientBuffer,
27    InvalidHandle,
28    InvalidParameter,
29    InvalidValue,
30    NoMemory,
31    Timeout,
32    UnknownReader,
33    UnsupportedFeature,
34    NoReadersAvailable,
35    ServiceStopped,
36    NoService,
37    CommError,
38    InternalError,
39    ServerTooBusy,
40    Unexpected,
41    Shutdown,
42    UnknownCard,
43    Unknown,
44}
45
46/// Maps to the |SCARD_SHARE_*| values.
47
48#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
49pub enum ShareMode {
50    #[default]
51    Shared,
52    Exclusive,
53    Direct,
54}
55
56/// Indicates what the reader should do with the card.
57
58#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
59pub enum Disposition {
60    #[default]
61    LeaveCard,
62    ResetCard,
63    UnpowerCard,
64    EjectCard,
65}
66
67/// Maps to |SCARD_*| connection state values.
68
69#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
70pub enum ConnectionState {
71    #[default]
72    Absent,
73    Present,
74    Swallowed,
75    Powered,
76    Negotiable,
77    Specific,
78}
79
80/// Maps to the |SCARD_STATE_*| flags.
81
82#[derive(Debug, Clone, Serialize, Deserialize, Default)]
83#[serde(rename_all = "camelCase")]
84pub struct ReaderStateFlags {
85
86    #[serde(skip_serializing_if = "Option::is_none")]
87    pub unaware: Option<bool>,
88
89    #[serde(skip_serializing_if = "Option::is_none")]
90    pub ignore: Option<bool>,
91
92    #[serde(skip_serializing_if = "Option::is_none")]
93    pub changed: Option<bool>,
94
95    #[serde(skip_serializing_if = "Option::is_none")]
96    pub unknown: Option<bool>,
97
98    #[serde(skip_serializing_if = "Option::is_none")]
99    pub unavailable: Option<bool>,
100
101    #[serde(skip_serializing_if = "Option::is_none")]
102    pub empty: Option<bool>,
103
104    #[serde(skip_serializing_if = "Option::is_none")]
105    pub present: Option<bool>,
106
107    #[serde(skip_serializing_if = "Option::is_none")]
108    pub exclusive: Option<bool>,
109
110    #[serde(skip_serializing_if = "Option::is_none")]
111    pub inuse: Option<bool>,
112
113    #[serde(skip_serializing_if = "Option::is_none")]
114    pub mute: Option<bool>,
115
116    #[serde(skip_serializing_if = "Option::is_none")]
117    pub unpowered: Option<bool>,
118}
119
120/// Maps to the |SCARD_PROTOCOL_*| flags.
121
122#[derive(Debug, Clone, Serialize, Deserialize, Default)]
123#[serde(rename_all = "camelCase")]
124pub struct ProtocolSet {
125
126    #[serde(skip_serializing_if = "Option::is_none")]
127    pub t0: Option<bool>,
128
129    #[serde(skip_serializing_if = "Option::is_none")]
130    pub t1: Option<bool>,
131
132    #[serde(skip_serializing_if = "Option::is_none")]
133    pub raw: Option<bool>,
134}
135
136/// Maps to the |SCARD_PROTOCOL_*| values.
137
138#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
139pub enum Protocol {
140    #[default]
141    T0,
142    T1,
143    Raw,
144}
145
146
147#[derive(Debug, Clone, Serialize, Deserialize, Default)]
148#[serde(rename_all = "camelCase")]
149pub struct ReaderStateIn {
150
151    pub reader: String,
152
153    pub currentState: ReaderStateFlags,
154
155    pub currentInsertionCount: u64,
156}
157
158
159#[derive(Debug, Clone, Serialize, Deserialize, Default)]
160#[serde(rename_all = "camelCase")]
161pub struct ReaderStateOut {
162
163    pub reader: String,
164
165    pub eventState: ReaderStateFlags,
166
167    pub eventCount: u64,
168
169    pub atr: String,
170}
171
172/// Reports the successful result of a |SCardEstablishContext| call.
173/// 
174/// This maps to:
175/// PC/SC Lite: <https://pcsclite.apdu.fr/api/group__API.html#gaa1b8970169fd4883a6dc4a8f43f19b67>
176/// Microsoft: <https://learn.microsoft.com/en-us/windows/win32/api/winscard/nf-winscard-scardestablishcontext>
177
178#[derive(Debug, Clone, Serialize, Deserialize, Default)]
179#[serde(rename_all = "camelCase")]
180pub struct ReportEstablishContextResultParams {
181
182    pub requestId: String,
183
184    pub contextId: u64,
185}
186
187/// Reports the successful result of a |SCardReleaseContext| call.
188/// 
189/// This maps to:
190/// PC/SC Lite: <https://pcsclite.apdu.fr/api/group__API.html#ga6aabcba7744c5c9419fdd6404f73a934>
191/// Microsoft: <https://learn.microsoft.com/en-us/windows/win32/api/winscard/nf-winscard-scardreleasecontext>
192
193#[derive(Debug, Clone, Serialize, Deserialize, Default)]
194#[serde(rename_all = "camelCase")]
195pub struct ReportReleaseContextResultParams {
196
197    pub requestId: String,
198}
199
200/// Reports the successful result of a |SCardListReaders| call.
201/// 
202/// This maps to:
203/// PC/SC Lite: <https://pcsclite.apdu.fr/api/group__API.html#ga93b07815789b3cf2629d439ecf20f0d9>
204/// Microsoft: <https://learn.microsoft.com/en-us/windows/win32/api/winscard/nf-winscard-scardlistreadersa>
205
206#[derive(Debug, Clone, Serialize, Deserialize, Default)]
207#[serde(rename_all = "camelCase")]
208pub struct ReportListReadersResultParams {
209
210    pub requestId: String,
211
212    pub readers: Vec<String>,
213}
214
215/// Reports the successful result of a |SCardGetStatusChange| call.
216/// 
217/// This maps to:
218/// PC/SC Lite: <https://pcsclite.apdu.fr/api/group__API.html#ga33247d5d1257d59e55647c3bb717db24>
219/// Microsoft: <https://learn.microsoft.com/en-us/windows/win32/api/winscard/nf-winscard-scardgetstatuschangea>
220
221#[derive(Debug, Clone, Serialize, Deserialize, Default)]
222#[serde(rename_all = "camelCase")]
223pub struct ReportGetStatusChangeResultParams {
224
225    pub requestId: String,
226
227    pub readerStates: Vec<ReaderStateOut>,
228}
229
230/// Reports the result of a |SCardBeginTransaction| call.
231/// On success, this creates a new transaction object.
232/// 
233/// This maps to:
234/// PC/SC Lite: <https://pcsclite.apdu.fr/api/group__API.html#gaddb835dce01a0da1d6ca02d33ee7d861>
235/// Microsoft: <https://learn.microsoft.com/en-us/windows/win32/api/winscard/nf-winscard-scardbegintransaction>
236
237#[derive(Debug, Clone, Serialize, Deserialize, Default)]
238#[serde(rename_all = "camelCase")]
239pub struct ReportBeginTransactionResultParams {
240
241    pub requestId: String,
242
243    pub handle: i64,
244}
245
246/// Reports the successful result of a call that returns only a result code.
247/// Used for: |SCardCancel|, |SCardDisconnect|, |SCardSetAttrib|, |SCardEndTransaction|.
248/// 
249/// This maps to:
250/// 1. SCardCancel
251/// PC/SC Lite: <https://pcsclite.apdu.fr/api/group__API.html#gaacbbc0c6d6c0cbbeb4f4debf6fbeeee6>
252/// Microsoft: <https://learn.microsoft.com/en-us/windows/win32/api/winscard/nf-winscard-scardcancel>
253/// 
254/// 2. SCardDisconnect
255/// PC/SC Lite: <https://pcsclite.apdu.fr/api/group__API.html#ga4be198045c73ec0deb79e66c0ca1738a>
256/// Microsoft: <https://learn.microsoft.com/en-us/windows/win32/api/winscard/nf-winscard-scarddisconnect>
257/// 
258/// 3. SCardSetAttrib
259/// PC/SC Lite: <https://pcsclite.apdu.fr/api/group__API.html#ga060f0038a4ddfd5dd2b8fadf3c3a2e4f>
260/// Microsoft: <https://learn.microsoft.com/en-us/windows/win32/api/winscard/nf-winscard-scardsetattrib>
261/// 
262/// 4. SCardEndTransaction
263/// PC/SC Lite: <https://pcsclite.apdu.fr/api/group__API.html#gae8742473b404363e5c587f570d7e2f3b>
264/// Microsoft: <https://learn.microsoft.com/en-us/windows/win32/api/winscard/nf-winscard-scardendtransaction>
265
266#[derive(Debug, Clone, Serialize, Deserialize, Default)]
267#[serde(rename_all = "camelCase")]
268pub struct ReportPlainResultParams {
269
270    pub requestId: String,
271}
272
273/// Reports the successful result of a |SCardConnect| call.
274/// 
275/// This maps to:
276/// PC/SC Lite: <https://pcsclite.apdu.fr/api/group__API.html#ga4e515829752e0a8dbc4d630696a8d6a5>
277/// Microsoft: <https://learn.microsoft.com/en-us/windows/win32/api/winscard/nf-winscard-scardconnecta>
278
279#[derive(Debug, Clone, Serialize, Deserialize, Default)]
280#[serde(rename_all = "camelCase")]
281pub struct ReportConnectResultParams {
282
283    pub requestId: String,
284
285    pub handle: i64,
286
287    #[serde(skip_serializing_if = "Option::is_none")]
288    pub activeProtocol: Option<Protocol>,
289}
290
291/// Reports the successful result of a call that sends back data on success.
292/// Used for |SCardTransmit|, |SCardControl|, and |SCardGetAttrib|.
293/// 
294/// This maps to:
295/// 1. SCardTransmit
296/// PC/SC Lite: <https://pcsclite.apdu.fr/api/group__API.html#ga9a2d77242a271310269065e64633ab99>
297/// Microsoft: <https://learn.microsoft.com/en-us/windows/win32/api/winscard/nf-winscard-scardtransmit>
298/// 
299/// 2. SCardControl
300/// PC/SC Lite: <https://pcsclite.apdu.fr/api/group__API.html#gac3454d4657110fd7f753b2d3d8f4e32f>
301/// Microsoft: <https://learn.microsoft.com/en-us/windows/win32/api/winscard/nf-winscard-scardcontrol>
302/// 
303/// 3. SCardGetAttrib
304/// PC/SC Lite: <https://pcsclite.apdu.fr/api/group__API.html#gaacfec51917255b7a25b94c5104961602>
305/// Microsoft: <https://learn.microsoft.com/en-us/windows/win32/api/winscard/nf-winscard-scardgetattrib>
306
307#[derive(Debug, Clone, Serialize, Deserialize, Default)]
308#[serde(rename_all = "camelCase")]
309pub struct ReportDataResultParams {
310
311    pub requestId: String,
312
313    pub data: String,
314}
315
316/// Reports the successful result of a |SCardStatus| call.
317/// 
318/// This maps to:
319/// PC/SC Lite: <https://pcsclite.apdu.fr/api/group__API.html#gae49c3c894ad7ac12a5b896bde70d0382>
320/// Microsoft: <https://learn.microsoft.com/en-us/windows/win32/api/winscard/nf-winscard-scardstatusa>
321
322#[derive(Debug, Clone, Serialize, Deserialize, Default)]
323#[serde(rename_all = "camelCase")]
324pub struct ReportStatusResultParams {
325
326    pub requestId: String,
327
328    pub readerName: String,
329
330    pub state: ConnectionState,
331
332    pub atr: String,
333
334    #[serde(skip_serializing_if = "Option::is_none")]
335    pub protocol: Option<Protocol>,
336}
337
338/// Reports an error result for the given request.
339
340#[derive(Debug, Clone, Serialize, Deserialize, Default)]
341#[serde(rename_all = "camelCase")]
342pub struct ReportErrorParams {
343
344    pub requestId: String,
345
346    pub resultCode: ResultCode,
347}