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
|
/* Virtual Smart Card protocol definition
*
* This protocol is between a host implementing one or more virtual smart card
* readers, and a client implementing one or more virtual smart cards, or pass
* through to real cards.
*
* The current implementation passes the raw APDU's from 7816 and additionally
* contains messages to setup and teardown readers, handle insertion and
* removal of cards, negotiate the protocol and provide for error responses.
*
* Copyright (c) 2010 Red Hat.
*
* This code is licensed under the LGPL.
*/
#ifndef _VSCARD_COMMON_H
#define _VSCARD_COMMON_H
#define VERSION_MAJOR_BITS 11
#define VERSION_MIDDLE_BITS 11
#define VERSION_MINOR_BITS 10
#define MAKE_VERSION(major, middle, minor) \
( (major << (VERSION_MINOR_BITS + VERSION_MIDDLE_BITS)) \
| (middle << VERSION_MINOR_BITS) \
| (minor) )
/** IMPORTANT NOTE on VERSION
*
* The version below MUST be changed whenever a change in this file is made.
*
* The last digit, the minor, is for bug fix changes only.
*
* The middle digit is for backward / forward compatible changes, updates
* to the existing messages, addition of fields.
*
* The major digit is for a breaking change of protocol, presumably
* something that cannot be accomodated with the existing protocol.
*/
#define VSCARD_VERSION MAKE_VERSION(0,0,1)
#define VSCARD_UNDEFINED_READER_ID -1
#define VSCARD_MINIMAL_READER_ID 0
typedef enum {
VSC_Init,
VSC_Error,
VSC_ReaderAdd,
VSC_ReaderAddResponse,
VSC_ReaderRemove,
VSC_ATR,
VSC_CardRemove,
VSC_APDU
} VSCMsgType;
typedef enum {
VSC_GENERAL_ERROR=1,
VSC_CANNOT_ADD_MORE_READERS,
} VSCErrorCode;
typedef struct VSCMsgHeader {
VSCMsgType type;
uint32_t reader_id;
uint32_t length;
} VSCMsgHeader;
/* VSCMsgInit Client <-> Host
* Host replies with allocated reader id in ReaderAddResponse
* */
typedef struct VSCMsgInit {
uint32_t version;
} VSCMsgInit;
/* VSCMsgError Client <-> Host
* */
typedef struct VSCMsgError {
VSCErrorCode code;
} VSCMsgError;
/* VSCMsgReaderAdd Client -> Host
* Host replies with allocated reader id in ReaderAddResponse
* */
typedef struct VSCMsgReaderAdd {
uint8_t name[0];
} VSCMsgReaderAdd;
/* VSCMsgReaderAddResponse Host -> Client
* Reply to ReaderAdd
* */
typedef struct VSCMsgReaderAddResponse {
} VSCMsgReaderAddResponse;
/* VSCMsgReaderRemove Client -> Host
* */
typedef struct VSCMsgReaderRemove {
} VSCMsgReaderRemove;
/* VSCMsgATR Client -> Host
* Answer to reset. Sent for card insertion or card reset.
* */
typedef struct VSCMsgATR {
uint8_t atr[0];
} VSCMsgATR;
/* VSCMsgCardRemove Client -> Host
* */
typedef struct VSCMsgCardRemove {
} VSCMsgCardRemove;
/* VSCMsgAPDU Client <-> Host
* */
typedef struct VSCMsgAPDU {
uint8_t data[0];
} VSCMsgAPDU;
#endif
|