[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 07/17] libcacard/vscard_common.h update (v15->v16)
From: |
Alon Levy |
Subject: |
[Qemu-devel] [PATCH 07/17] libcacard/vscard_common.h update (v15->v16) |
Date: |
Thu, 3 Feb 2011 23:07:04 +0200 |
Protocol change:
* VSCMsgInit capabilities and magic
* removed ReaderResponse, will use Error instead with code==VSC_SUCCESS.
* adaded Flush and FlushComplete, remove Reconnect.
* define VSCARD_MAGIC
* added error code VSC_SUCCESS.
Fixes:
* update VSCMsgInit comment
* fix message type enum
* remove underscore from wrapping define
* update copyright
* updated comments.
* Header comment updated
* remove C++ style comment
* fix comment for VSCMsgError
* give names to enums in typedefs
Signed-off-by: Alon Levy <address@hidden>
---
libcacard/vscard_common.h | 103 ++++++++++++++++++++++++++++++--------------
1 files changed, 70 insertions(+), 33 deletions(-)
diff --git a/libcacard/vscard_common.h b/libcacard/vscard_common.h
index 9ff1295..5cb6eb5 100644
--- a/libcacard/vscard_common.h
+++ b/libcacard/vscard_common.h
@@ -1,20 +1,25 @@
/* Virtual Smart Card protocol definition
*
- * This protocol is between a host implementing a group of virtual smart card
- * reader, and a client implementing a virtual smart card, or passthrough to
- * a real card.
+ * 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 and provide for error responses.
+ * removal of cards, negotiate the protocol via capabilities and provide
+ * for error responses.
*
- * Copyright (c) 2010 Red Hat.
+ * Copyright (c) 2011 Red Hat.
*
* This code is licensed under the LGPL.
*/
-#ifndef _VSCARD_COMMON_H
-#define _VSCARD_COMMON_H
+#ifndef VSCARD_COMMON_H
+#define VSCARD_COMMON_H
#include <stdint.h>
@@ -40,91 +45,123 @@
* something that cannot be accomodated with the existing protocol.
*/
-#define VSCARD_VERSION MAKE_VERSION(0,0,1)
+#define VSCARD_VERSION MAKE_VERSION(0,0,2)
-typedef enum {
- VSC_Init,
+typedef enum VSCMsgType {
+ VSC_Init = 1,
VSC_Error,
VSC_ReaderAdd,
- VSC_ReaderAddResponse,
VSC_ReaderRemove,
VSC_ATR,
VSC_CardRemove,
VSC_APDU,
- VSC_Reconnect
+ VSC_Flush,
+ VSC_FlushComplete
} VSCMsgType;
-typedef enum {
+typedef enum VSCErrorCode {
+ VSC_SUCCESS=0,
VSC_GENERAL_ERROR=1,
VSC_CANNOT_ADD_MORE_READERS,
+ VSC_CARD_ALREAY_INSERTED,
} VSCErrorCode;
-typedef uint32_t reader_id_t;
-#define VSCARD_UNDEFINED_READER_ID 0xffffffff
+#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 {
- VSCMsgType type;
- reader_id_t reader_id;
+ uint32_t type;
+ uint32_t reader_id;
uint32_t length;
uint8_t data[0];
} VSCMsgHeader;
/* VSCMsgInit Client <-> Host
- * Host replies with allocated reader id in ReaderAddResponse
+ * 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 ReaderAddResponse
- * name - name of the reader on client side.
+ * 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;
-/* VSCMsgReaderAddResponse Host -> Client
- * Reply to ReaderAdd
- * */
-typedef struct VSCMsgReaderAddResponse {
-} VSCMsgReaderAddResponse;
-
/* 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.
+ * 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 existance. Transfer a single APDU in either direction.
* */
typedef struct VSCMsgAPDU {
uint8_t data[0];
} VSCMsgAPDU;
-/* VSCMsgReconnect Host -> Client
+/* VSCMsgFlush Host -> Client
+ * Request client to send a FlushComplete message when it is done
+ * servicing all outstanding APDUs
* */
-typedef struct VSCMsgReconnect {
- uint32_t ip;
- uint16_t port;
-} VSCMsgReconnect;
+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 */
-#endif
--
1.7.4
- [Qemu-devel] [PATCH 00/20] usb-ccid (v17), Alon Levy, 2011/02/03
- [Qemu-devel] [PATCH 01/17] qdev: add print_options callback, Alon Levy, 2011/02/03
- [Qemu-devel] [PATCH 02/17] qdev: add data pointer to Property, Alon Levy, 2011/02/03
- [Qemu-devel] [PATCH 03/17] qdev-properties: add PROP_TYPE_ENUM, Alon Levy, 2011/02/03
- [Qemu-devel] [PATCH 04/17] qdev-properties: parse_enum: don't cast a void*, Alon Levy, 2011/02/03
- [Qemu-devel] [PATCH 07/17] libcacard/vscard_common.h update (v15->v16),
Alon Levy <=
- [Qemu-devel] [PATCH 06/17] introduce libcacard/vscard_common.h, Alon Levy, 2011/02/03
- [Qemu-devel] [PATCH 08/17] ccid: add passthru card device, Alon Levy, 2011/02/03
- [Qemu-devel] [PATCH 05/17] usb-ccid: add CCID bus, Alon Levy, 2011/02/03
- [Qemu-devel] [PATCH 13/17] ccid: add qdev description strings, Alon Levy, 2011/02/03
- [Qemu-devel] [PATCH 12/17] ccid: configure: add --enable/disable and nss only disable, Alon Levy, 2011/02/03
- [Qemu-devel] [PATCH 10/17] ccid: add ccid-card-emulated device (v2), Alon Levy, 2011/02/03
- [Qemu-devel] [PATCH 11/17] ccid: add docs, Alon Levy, 2011/02/03
- [Qemu-devel] [PATCH 14/17] smartcard, configure: add --enable-smartcard-nss, report only nss, Alon Levy, 2011/02/03
- [Qemu-devel] [PATCH 15/17] smartcard,configure: report only nss, Alon Levy, 2011/02/03
- [Qemu-devel] [PATCH 16/17] ccid-card-emulated: don't link with NSS if --disable-smartcard-nss, Alon Levy, 2011/02/03