| /* Virtual Smart Card protocol definition |
| * |
| * This protocol is between a host using virtual smart card readers, |
| * and a client providing the smart cards, perhaps by emulating them or by |
| * access to real cards. |
| * |
| * Definitions for this protocol: |
| * Host - user of the card |
| * Client - owner of the card |
| * |
| * 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 via capabilities and provide |
| * for error responses. |
| * |
| * Copyright (c) 2011 Red Hat. |
| * |
| * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. |
| * See the COPYING.LIB file in the top-level directory. |
| */ |
| |
| #ifndef VSCARD_COMMON_H |
| #define VSCARD_COMMON_H |
| |
| #include <stdint.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 accommodated with the existing protocol. |
| */ |
| |
| #define VSCARD_VERSION MAKE_VERSION(0, 0, 2) |
| |
| typedef enum VSCMsgType { |
| VSC_Init = 1, |
| VSC_Error, |
| VSC_ReaderAdd, |
| VSC_ReaderRemove, |
| VSC_ATR, |
| VSC_CardRemove, |
| VSC_APDU, |
| VSC_Flush, |
| VSC_FlushComplete |
| } VSCMsgType; |
| |
| typedef enum VSCErrorCode { |
| VSC_SUCCESS = 0, |
| VSC_GENERAL_ERROR = 1, |
| VSC_CANNOT_ADD_MORE_READERS, |
| VSC_CARD_ALREAY_INSERTED, |
| } VSCErrorCode; |
| |
| #define VSCARD_UNDEFINED_READER_ID 0xffffffff |
| #define VSCARD_MINIMAL_READER_ID 0 |
| |
| #define VSCARD_MAGIC (*(uint32_t *)"VSCD") |
| |
| /* |
| * Header |
| * Each message starts with the header. |
| * type - message type |
| * reader_id - used by messages that are reader specific |
| * length - length of payload (not including header, i.e. zero for |
| * messages containing empty payloads) |
| */ |
| typedef struct VSCMsgHeader { |
| uint32_t type; |
| uint32_t reader_id; |
| uint32_t length; |
| uint8_t data[0]; |
| } VSCMsgHeader; |
| |
| /* |
| * VSCMsgInit Client <-> Host |
| * Client sends it on connection, with its own capabilities. |
| * Host replies with VSCMsgInit filling in its capabilities. |
| * |
| * It is not meant to be used for negotiation, i.e. sending more then |
| * once from any side, but could be used for that in the future. |
| */ |
| typedef struct VSCMsgInit { |
| uint32_t magic; |
| uint32_t version; |
| uint32_t capabilities[1]; /* receiver must check length, |
| array may grow in the future*/ |
| } VSCMsgInit; |
| |
| /* |
| * VSCMsgError Client <-> Host |
| * This message is a response to any of: |
| * Reader Add |
| * Reader Remove |
| * Card Remove |
| * If the operation was successful then VSC_SUCCESS |
| * is returned, other wise a specific error code. |
| */ |
| typedef struct VSCMsgError { |
| uint32_t code; |
| } VSCMsgError; |
| |
| /* |
| * VSCMsgReaderAdd Client -> Host |
| * Host replies with allocated reader id in VSCMsgError with code==SUCCESS. |
| * |
| * name - name of the reader on client side, UTF-8 encoded. Only used |
| * for client presentation (may be translated to the device presented to the |
| * guest), protocol wise only reader_id is important. |
| */ |
| typedef struct VSCMsgReaderAdd { |
| uint8_t name[0]; |
| } VSCMsgReaderAdd; |
| |
| /* |
| * VSCMsgReaderRemove Client -> Host |
| * The client's reader has been removed. |
| */ |
| typedef struct VSCMsgReaderRemove { |
| } VSCMsgReaderRemove; |
| |
| /* |
| * VSCMsgATR Client -> Host |
| * Answer to reset. Sent for card insertion or card reset. The reset/insertion |
| * happens on the client side, they do not require any action from the host. |
| */ |
| typedef struct VSCMsgATR { |
| uint8_t atr[0]; |
| } VSCMsgATR; |
| |
| /* |
| * VSCMsgCardRemove Client -> Host |
| * The client card has been removed. |
| */ |
| typedef struct VSCMsgCardRemove { |
| } VSCMsgCardRemove; |
| |
| /* |
| * VSCMsgAPDU Client <-> Host |
| * Main reason of existence. Transfer a single APDU in either direction. |
| */ |
| typedef struct VSCMsgAPDU { |
| uint8_t data[0]; |
| } VSCMsgAPDU; |
| |
| /* |
| * VSCMsgFlush Host -> Client |
| * Request client to send a FlushComplete message when it is done |
| * servicing all outstanding APDUs |
| */ |
| typedef struct VSCMsgFlush { |
| } VSCMsgFlush; |
| |
| /* |
| * VSCMsgFlush Client -> Host |
| * Client response to Flush after all APDUs have been processed and |
| * responses sent. |
| */ |
| typedef struct VSCMsgFlushComplete { |
| } VSCMsgFlushComplete; |
| |
| #endif /* VSCARD_COMMON_H */ |