libcacard: move atr setting from macro to function

Only because qemu's checkpatch complains about it.

Signed-off-by: Alon Levy <alevy@redhat.com>
Reviewed-by: Marc-André Lureau <mlureau@redhat.com>
This commit is contained in:
Alon Levy 2013-03-05 16:27:43 +02:00
parent 7a68589624
commit 0b6a16c1a4
5 changed files with 58 additions and 16 deletions

View File

@ -32,6 +32,7 @@ libcacard-y += libcacard/vcard.o libcacard/vreader.o
libcacard-y += libcacard/vcard_emul_nss.o libcacard-y += libcacard/vcard_emul_nss.o
libcacard-y += libcacard/vcard_emul_type.o libcacard-y += libcacard/vcard_emul_type.o
libcacard-y += libcacard/card_7816.o libcacard-y += libcacard/card_7816.o
libcacard-y += libcacard/vcardt.o
###################################################################### ######################################################################
# Target independent part of system emulation. The long term path is to # Target independent part of system emulation. The long term path is to

View File

@ -33,6 +33,9 @@
#include "vreader.h" #include "vreader.h"
#include "vevent.h" #include "vevent.h"
#include "libcacard/vcardt_internal.h"
typedef enum { typedef enum {
VCardEmulUnknown = -1, VCardEmulUnknown = -1,
VCardEmulFalse = 0, VCardEmulFalse = 0,
@ -519,18 +522,23 @@ vcard_emul_reader_get_slot(VReader *vreader)
} }
/* /*
* Card ATR's map to physical cards. VCARD_ATR_PREFIX will set appropriate * Card ATR's map to physical cards. vcard_alloc_atr will set appropriate
* historical bytes for any software emulated card. The remaining bytes can be * historical bytes for any software emulated card. The remaining bytes can be
* used to indicate the actual emulator * used to indicate the actual emulator
*/ */
static const unsigned char nss_atr[] = { VCARD_ATR_PREFIX(3), 'N', 'S', 'S' }; static unsigned char *nss_atr;
static int nss_atr_len;
void void
vcard_emul_get_atr(VCard *card, unsigned char *atr, int *atr_len) vcard_emul_get_atr(VCard *card, unsigned char *atr, int *atr_len)
{ {
int len = MIN(sizeof(nss_atr), *atr_len); int len;
assert(atr != NULL); assert(atr != NULL);
if (nss_atr == NULL) {
nss_atr = vcard_alloc_atr("NSS", &nss_atr_len);
}
len = MIN(nss_atr_len, *atr_len);
memcpy(atr, nss_atr, len); memcpy(atr, nss_atr, len);
*atr_len = len; *atr_len = len;
} }

40
libcacard/vcardt.c Normal file
View File

@ -0,0 +1,40 @@
#include <stdlib.h>
#include <string.h>
#include <glib.h>
#include "libcacard/vcardt.h"
#include "libcacard/vcardt_internal.h"
/* create an ATR with appropriate historical bytes */
#define ATR_TS_DIRECT_CONVENTION 0x3b
#define ATR_TA_PRESENT 0x10
#define ATR_TB_PRESENT 0x20
#define ATR_TC_PRESENT 0x40
#define ATR_TD_PRESENT 0x80
unsigned char *vcard_alloc_atr(const char *postfix, int *atr_len)
{
int postfix_len;
const char prefix[] = "VCARD_";
const char default_postfix[] = "DEFAULT";
const int prefix_len = sizeof(prefix) - 1;
int total_len;
unsigned char *atr;
if (postfix == NULL) {
postfix = default_postfix;
}
postfix_len = strlen(postfix);
total_len = 3 + prefix_len + postfix_len;
atr = g_malloc(total_len);
atr[0] = ATR_TS_DIRECT_CONVENTION;
atr[1] = ATR_TD_PRESENT + prefix_len + postfix_len;
atr[2] = 0x00;
memcpy(&atr[3], prefix, prefix_len);
memcpy(&atr[3 + prefix_len], postfix, postfix_len);
if (atr_len) {
*atr_len = total_len;
}
return atr;
}

View File

@ -25,19 +25,6 @@ typedef struct VCardEmulStruct VCardEmul;
#define MAX_CHANNEL 4 #define MAX_CHANNEL 4
/* create an ATR with appropriate historical bytes */
#define TS_DIRECT_CONVENTION 0x3b
#define TA_PRESENT 0x10
#define TB_PRESENT 0x20
#define TC_PRESENT 0x40
#define TD_PRESENT 0x80
#define VCARD_ATR_PREFIX(size) \
TS_DIRECT_CONVENTION, \
TD_PRESENT + (6 + size), \
0x00, \
'V', 'C', 'A', 'R', 'D', '_'
typedef enum { typedef enum {
VCARD_DONE, VCARD_DONE,
VCARD_NEXT, VCARD_NEXT,

View File

@ -0,0 +1,6 @@
#ifndef VCARDT_INTERNAL_H
#define VCARDT_INTERNAL_H
unsigned char *vcard_alloc_atr(const char *postfix, int *atr_len);
#endif