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 47 * something that cannot be accommodated with the existing protocol. 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 156 * Main reason of existence. Transfer a single APDU in either direction. 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 */ 179