]> git.proxmox.com Git - qemu.git/blame - libcacard/vscard_common.h
acpi: add dummy write function for acpi timer
[qemu.git] / libcacard / vscard_common.h
CommitLineData
0c165247
AL
1/* Virtual Smart Card protocol definition
2 *
3 * This protocol is between a host using virtual smart card readers,
4 * and a client providing the smart cards, perhaps by emulating them or by
5 * access to real cards.
6 *
7 * Definitions for this protocol:
8 * Host - user of the card
9 * Client - owner of the card
10 *
11 * The current implementation passes the raw APDU's from 7816 and additionally
12 * contains messages to setup and teardown readers, handle insertion and
13 * removal of cards, negotiate the protocol via capabilities and provide
14 * for error responses.
15 *
16 * Copyright (c) 2011 Red Hat.
17 *
18 * This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
19 * See the COPYING.LIB file in the top-level directory.
20 */
21
22#ifndef VSCARD_COMMON_H
23#define VSCARD_COMMON_H
24
25#include <stdint.h>
26
27#define VERSION_MAJOR_BITS 11
28#define VERSION_MIDDLE_BITS 11
29#define VERSION_MINOR_BITS 10
30
31#define MAKE_VERSION(major, middle, minor) \
32 ((major << (VERSION_MINOR_BITS + VERSION_MIDDLE_BITS)) \
33 | (middle << VERSION_MINOR_BITS) \
34 | (minor))
35
36/*
37 * IMPORTANT NOTE on VERSION
38 *
39 * The version below MUST be changed whenever a change in this file is made.
40 *
41 * The last digit, the minor, is for bug fix changes only.
42 *
43 * The middle digit is for backward / forward compatible changes, updates
44 * to the existing messages, addition of fields.
45 *
46 * The major digit is for a breaking change of protocol, presumably
cba919da 47 * something that cannot be accommodated with the existing protocol.
0c165247
AL
48 */
49
50#define VSCARD_VERSION MAKE_VERSION(0, 0, 2)
51
52typedef enum VSCMsgType {
53 VSC_Init = 1,
54 VSC_Error,
55 VSC_ReaderAdd,
56 VSC_ReaderRemove,
57 VSC_ATR,
58 VSC_CardRemove,
59 VSC_APDU,
60 VSC_Flush,
61 VSC_FlushComplete
62} VSCMsgType;
63
64typedef enum VSCErrorCode {
65 VSC_SUCCESS = 0,
66 VSC_GENERAL_ERROR = 1,
67 VSC_CANNOT_ADD_MORE_READERS,
68 VSC_CARD_ALREAY_INSERTED,
69} VSCErrorCode;
70
71#define VSCARD_UNDEFINED_READER_ID 0xffffffff
72#define VSCARD_MINIMAL_READER_ID 0
73
74#define VSCARD_MAGIC (*(uint32_t *)"VSCD")
75
76/*
77 * Header
78 * Each message starts with the header.
79 * type - message type
80 * reader_id - used by messages that are reader specific
81 * length - length of payload (not including header, i.e. zero for
82 * messages containing empty payloads)
83 */
84typedef struct VSCMsgHeader {
85 uint32_t type;
86 uint32_t reader_id;
87 uint32_t length;
88 uint8_t data[0];
89} VSCMsgHeader;
90
91/*
92 * VSCMsgInit Client <-> Host
93 * Client sends it on connection, with its own capabilities.
94 * Host replies with VSCMsgInit filling in its capabilities.
95 *
96 * It is not meant to be used for negotiation, i.e. sending more then
97 * once from any side, but could be used for that in the future.
98 */
99typedef struct VSCMsgInit {
100 uint32_t magic;
101 uint32_t version;
102 uint32_t capabilities[1]; /* receiver must check length,
103 array may grow in the future*/
104} VSCMsgInit;
105
106/*
107 * VSCMsgError Client <-> Host
108 * This message is a response to any of:
109 * Reader Add
110 * Reader Remove
111 * Card Remove
112 * If the operation was successful then VSC_SUCCESS
113 * is returned, other wise a specific error code.
114 */
115typedef struct VSCMsgError {
116 uint32_t code;
117} VSCMsgError;
118
119/*
120 * VSCMsgReaderAdd Client -> Host
121 * Host replies with allocated reader id in VSCMsgError with code==SUCCESS.
122 *
123 * name - name of the reader on client side, UTF-8 encoded. Only used
124 * for client presentation (may be translated to the device presented to the
125 * guest), protocol wise only reader_id is important.
126 */
127typedef struct VSCMsgReaderAdd {
128 uint8_t name[0];
129} VSCMsgReaderAdd;
130
131/*
132 * VSCMsgReaderRemove Client -> Host
133 * The client's reader has been removed.
134 */
135typedef struct VSCMsgReaderRemove {
136} VSCMsgReaderRemove;
137
138/*
139 * VSCMsgATR Client -> Host
140 * Answer to reset. Sent for card insertion or card reset. The reset/insertion
141 * happens on the client side, they do not require any action from the host.
142 */
143typedef struct VSCMsgATR {
144 uint8_t atr[0];
145} VSCMsgATR;
146
147/*
148 * VSCMsgCardRemove Client -> Host
149 * The client card has been removed.
150 */
151typedef struct VSCMsgCardRemove {
152} VSCMsgCardRemove;
153
154/*
155 * VSCMsgAPDU Client <-> Host
0cf818c4 156 * Main reason of existence. Transfer a single APDU in either direction.
0c165247
AL
157 */
158typedef struct VSCMsgAPDU {
159 uint8_t data[0];
160} VSCMsgAPDU;
161
162/*
163 * VSCMsgFlush Host -> Client
164 * Request client to send a FlushComplete message when it is done
165 * servicing all outstanding APDUs
166 */
167typedef struct VSCMsgFlush {
168} VSCMsgFlush;
169
170/*
171 * VSCMsgFlush Client -> Host
172 * Client response to Flush after all APDUs have been processed and
173 * responses sent.
174 */
175typedef struct VSCMsgFlushComplete {
176} VSCMsgFlushComplete;
177
178#endif /* VSCARD_COMMON_H */