smartcard: split up standard and sense4 commands, remove default PIN handling
This commit is contained in:
parent
c0973f37c5
commit
1c52c5b667
|
@ -25,49 +25,6 @@ struct nsl_smartcard_apdu
|
|||
struct nsl_smartcard_r_apdu response;
|
||||
};
|
||||
|
||||
enum nsl_smartcard_apdu_instruction {
|
||||
NSL_SMARTCARD_APDU_INS_DEACTIVATE = 0x04,
|
||||
NSL_SMARTCARD_APDU_INS_RECORD_ERASE = 0x0C,
|
||||
NSL_SMARTCARD_APDU_INS_BINARY_ERASE = 0x0E,
|
||||
NSL_SMARTCARD_APDU_INS_OP_SCOL = 0x10,
|
||||
NSL_SMARTCARD_APDU_INS_OP_TRANSACTION = 0x12,
|
||||
NSL_SMARTCARD_APDU_INS_OP_USER = 0x14,
|
||||
NSL_SMARTCARD_APDU_INS_VERIFY = 0x20,
|
||||
NSL_SMARTCARD_APDU_INS_ENV_MANAGE = 0x22,
|
||||
NSL_SMARTCARD_APDU_INS_REFDATA_CHANGE = 0x24,
|
||||
NSL_SMARTCARD_APDU_INS_VERIFY_DISABLE = 0x26,
|
||||
NSL_SMARTCARD_APDU_INS_VERIFY_ENABLE = 0x28,
|
||||
NSL_SMARTCARD_APDU_INS_OP_SECURITY = 0x2A,
|
||||
NSL_SMARTCARD_APDU_INS_RETRY_RESET = 0x2C,
|
||||
NSL_SMARTCARD_APDU_INS_ACTIVATE = 0x44,
|
||||
NSL_SMARTCARD_APDU_INS_KEYPAIR_GEN = 0x46,
|
||||
NSL_SMARTCARD_APDU_INS_SECRET_IMPORT = 0x48,
|
||||
NSL_SMARTCARD_APDU_INS_CHANNEL_MANAGE = 0x70,
|
||||
NSL_SMARTCARD_APDU_INS_AUTH_EXTERNAL = 0x82,
|
||||
NSL_SMARTCARD_APDU_INS_CHALLENGE_GET = 0x84,
|
||||
NSL_SMARTCARD_APDU_INS_AUTH_GENERAL = 0x86,
|
||||
NSL_SMARTCARD_APDU_INS_AUTH_INTERNAL = 0x88,
|
||||
NSL_SMARTCARD_APDU_INS_BINARY_SEARCH = 0xA0,
|
||||
NSL_SMARTCARD_APDU_INS_RECORD_SEARCH = 0xA2,
|
||||
NSL_SMARTCARD_APDU_INS_SELECT = 0xA4,
|
||||
NSL_SMARTCARD_APDU_INS_BINARY_READ = 0xB0,
|
||||
NSL_SMARTCARD_APDU_INS_RECORD_READ = 0xB2,
|
||||
NSL_SMARTCARD_APDU_INS_RESPONSE_GET = 0xC0,
|
||||
NSL_SMARTCARD_APDU_INS_ENVELOPE = 0xC2,
|
||||
NSL_SMARTCARD_APDU_INS_DATA_GET = 0xCA,
|
||||
NSL_SMARTCARD_APDU_INS_DATA_MANAGE = 0xCF,
|
||||
NSL_SMARTCARD_APDU_INS_BINARY_WRITE = 0xD0,
|
||||
NSL_SMARTCARD_APDU_INS_RECORD_WRITE = 0xD2,
|
||||
NSL_SMARTCARD_APDU_INS_BINARY_UPDATE = 0xD6,
|
||||
NSL_SMARTCARD_APDU_INS_DATA_PUT = 0xDA,
|
||||
NSL_SMARTCARD_APDU_INS_RECORD_UPDATE = 0xDC,
|
||||
NSL_SMARTCARD_APDU_INS_CREATE = 0xE0,
|
||||
NSL_SMARTCARD_APDU_INS_RECORD_APPEND = 0xE2,
|
||||
NSL_SMARTCARD_APDU_INS_DELETE = 0xE4,
|
||||
NSL_SMARTCARD_APDU_INS_TERMINATE = 0xE6,
|
||||
NSL_SMARTCARD_APDU_INS_FILE_TERMINATE = 0xE8,
|
||||
NSL_SMARTCARD_APDU_INS_TERMINATE_CARD = 0xEF,
|
||||
};
|
||||
|
||||
enum nsl_smartcard_apdu_status {
|
||||
NSL_SMARTCARD_APDU_STATUS_SUCCESS = 0x90,
|
||||
|
@ -88,17 +45,11 @@ enum nsl_smartcard_apdu_status {
|
|||
NSL_SMARTCARD_APDU_STATUS_ERROR_MISC = 0x6F,
|
||||
};
|
||||
|
||||
enum nsl_smartcard_apdu_data_tag {
|
||||
NSL_SMARTCARD_APDU_DATA_SERIAL_NUMBER = 0x2,
|
||||
NSL_SMARTCARD_APDU_DATA_DF_SPACE = 0x3,
|
||||
NSL_SMARTCARD_APDU_DATA_CURRENT_DF = 0x4,
|
||||
NSL_SMARTCARD_APDU_DATA_DEVICE_TYPE = 0x6,
|
||||
NSL_SMARTCARD_APDU_DATA_DEVICE_SUBTYPE = 0x7,
|
||||
NSL_SMARTCARD_APDU_DATA_USABLE_SPACE = 0x8,
|
||||
NSL_SMARTCARD_APDU_DATA_E2_FILE = 0x9,
|
||||
NSL_SMARTCARD_APDU_DATA_METADATA = 0xA,
|
||||
NSL_SMARTCARD_APDU_DATA_CURRENT_TIME = 0xB,
|
||||
};
|
||||
|
||||
static inline int nsl_smartcard_apdu_is_proprietary(struct nsl_smartcard_apdu *apdu)
|
||||
{
|
||||
return apdu->command.class & 0x80;
|
||||
}
|
||||
|
||||
void nsl_smartcard_apdu_init(struct nsl_smartcard_apdu *);
|
||||
int nsl_smartcard_apdu_read_command(struct nsl_smartcard_apdu *, const uint8_t *data, size_t len);
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
#include "iso7816.h"
|
||||
|
||||
|
||||
void nsl_smartcard_iso7816_init(nsl_smartcard_handler_t cmds[static 0x100])
|
||||
{
|
||||
|
||||
}
|
|
@ -0,0 +1,50 @@
|
|||
#pragma once
|
||||
#include "../smartcard.h"
|
||||
|
||||
|
||||
enum nsl_smartcard_iso7816_instruction {
|
||||
NSL_SMARTCARD_ISO7816_INS_DEACTIVATE = 0x04,
|
||||
NSL_SMARTCARD_ISO7816_INS_RECORD_ERASE = 0x0C,
|
||||
NSL_SMARTCARD_ISO7816_INS_BINARY_ERASE = 0x0E,
|
||||
NSL_SMARTCARD_ISO7816_INS_OP_SCOL = 0x10,
|
||||
NSL_SMARTCARD_ISO7816_INS_OP_TRANSACTION = 0x12,
|
||||
NSL_SMARTCARD_ISO7816_INS_OP_USER = 0x14,
|
||||
NSL_SMARTCARD_ISO7816_INS_VERIFY = 0x20, /* ! */
|
||||
NSL_SMARTCARD_ISO7816_INS_ENV_MANAGE = 0x22,
|
||||
NSL_SMARTCARD_ISO7816_INS_REFDATA_CHANGE = 0x24,
|
||||
NSL_SMARTCARD_ISO7816_INS_VERIFY_DISABLE = 0x26,
|
||||
NSL_SMARTCARD_ISO7816_INS_VERIFY_ENABLE = 0x28,
|
||||
NSL_SMARTCARD_ISO7816_INS_OP_SECURITY = 0x2A,
|
||||
NSL_SMARTCARD_ISO7816_INS_RETRY_RESET = 0x2C,
|
||||
NSL_SMARTCARD_ISO7816_INS_ACTIVATE = 0x44,
|
||||
NSL_SMARTCARD_ISO7816_INS_KEYPAIR_GEN = 0x46,
|
||||
NSL_SMARTCARD_ISO7816_INS_SECRET_IMPORT = 0x48,
|
||||
NSL_SMARTCARD_ISO7816_INS_CHANNEL_MANAGE = 0x70,
|
||||
NSL_SMARTCARD_ISO7816_INS_AUTH_EXTERNAL = 0x82,
|
||||
NSL_SMARTCARD_ISO7816_INS_CHALLENGE_GET = 0x84,
|
||||
NSL_SMARTCARD_ISO7816_INS_AUTH_GENERAL = 0x86,
|
||||
NSL_SMARTCARD_ISO7816_INS_AUTH_INTERNAL = 0x88,
|
||||
NSL_SMARTCARD_ISO7816_INS_BINARY_SEARCH = 0xA0,
|
||||
NSL_SMARTCARD_ISO7816_INS_RECORD_SEARCH = 0xA2,
|
||||
NSL_SMARTCARD_ISO7816_INS_SELECT = 0xA4, /* ! */
|
||||
NSL_SMARTCARD_ISO7816_INS_BINARY_READ = 0xB0, /* ! */
|
||||
NSL_SMARTCARD_ISO7816_INS_RECORD_READ = 0xB2,
|
||||
NSL_SMARTCARD_ISO7816_INS_RESPONSE_GET = 0xC0,
|
||||
NSL_SMARTCARD_ISO7816_INS_ENVELOPE = 0xC2,
|
||||
NSL_SMARTCARD_ISO7816_INS_DATA_GET = 0xCA,
|
||||
NSL_SMARTCARD_ISO7816_INS_DATA_MANAGE = 0xCF,
|
||||
NSL_SMARTCARD_ISO7816_INS_BINARY_WRITE = 0xD0,
|
||||
NSL_SMARTCARD_ISO7816_INS_RECORD_WRITE = 0xD2,
|
||||
NSL_SMARTCARD_ISO7816_INS_BINARY_UPDATE = 0xD6, /* ! */
|
||||
NSL_SMARTCARD_ISO7816_INS_DATA_PUT = 0xDA,
|
||||
NSL_SMARTCARD_ISO7816_INS_RECORD_UPDATE = 0xDC,
|
||||
NSL_SMARTCARD_ISO7816_INS_CREATE = 0xE0,
|
||||
NSL_SMARTCARD_ISO7816_INS_RECORD_APPEND = 0xE2,
|
||||
NSL_SMARTCARD_ISO7816_INS_DELETE = 0xE4,
|
||||
NSL_SMARTCARD_ISO7816_INS_TERMINATE = 0xE6,
|
||||
NSL_SMARTCARD_ISO7816_INS_FILE_TERMINATE = 0xE8,
|
||||
NSL_SMARTCARD_ISO7816_INS_TERMINATE_CARD = 0xEF,
|
||||
};
|
||||
|
||||
|
||||
void nsl_smartcard_iso7816_init(nsl_smartcard_handler_t cmds[static 0x100]);
|
|
@ -0,0 +1,34 @@
|
|||
#include "sense4.h"
|
||||
|
||||
|
||||
|
||||
static int get_data(struct nsl_smartcard *smartcard, struct nsl_smartcard_apdu *apdu)
|
||||
{
|
||||
switch (apdu->command.params[0]) {
|
||||
case NSL_SMARTCARD_SENSE4_DATA_SERIAL_NUMBER:
|
||||
break;
|
||||
case NSL_SMARTCARD_SENSE4_DATA_DF_SPACE:
|
||||
break;
|
||||
case NSL_SMARTCARD_SENSE4_DATA_CURRENT_DF:
|
||||
break;
|
||||
case NSL_SMARTCARD_SENSE4_DATA_DEVICE_TYPE:
|
||||
break;
|
||||
case NSL_SMARTCARD_SENSE4_DATA_DEVICE_SUBTYPE:
|
||||
break;
|
||||
case NSL_SMARTCARD_SENSE4_DATA_USABLE_SPACE:
|
||||
break;
|
||||
case NSL_SMARTCARD_SENSE4_DATA_E2_FILE:
|
||||
break;
|
||||
case NSL_SMARTCARD_SENSE4_DATA_METADATA:
|
||||
break;
|
||||
case NSL_SMARTCARD_SENSE4_DATA_CURRENT_TIME:
|
||||
break;
|
||||
default:
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
void nsl_smartcard_sense4_init(nsl_smartcard_handler_t cmds[static 0x100])
|
||||
{
|
||||
cmds[NSL_SMARTCARD_SENSE4_INS_DATA_GET] = get_data;
|
||||
}
|
|
@ -0,0 +1,38 @@
|
|||
#pragma once
|
||||
#include "../smartcard.h"
|
||||
|
||||
|
||||
/* special files:
|
||||
* 0x3F00: root dir
|
||||
* 0x3F03: PED file
|
||||
* 0x3F02: license file
|
||||
* 0x3F01: key file
|
||||
* 0x3F04: license file
|
||||
* 0x001E: SF
|
||||
*/
|
||||
|
||||
enum nsl_smartcard_sense4_instruction {
|
||||
NSL_SMARTCARD_SENSE4_INS_BINARY_ERASE = 0x0E,
|
||||
NSL_SMARTCARD_SENSE4_INS_EXECUTE = 0x32,
|
||||
NSL_SMARTCARD_SENSE4_INS_UNK = 0x34,
|
||||
NSL_SMARTCARD_SENSE4_INS_MANAGE_LICENSE = 0x3A,
|
||||
NSL_SMARTCARD_SENSE4_INS_CHANGE_PIN = 0x5E,
|
||||
NSL_SMARTCARD_SENSE4_INS_DATA_GET = 0xCA,
|
||||
NSL_SMARTCARD_SENSE4_INS_GEN_RSA = 0xCE,
|
||||
NSL_SMARTCARD_SENSE4_INS_SET_PIN = 0xD4,
|
||||
NSL_SMARTCARD_SENSE4_INS_CREATE = 0xE0,
|
||||
};
|
||||
|
||||
enum nsl_smartcard_sense4_data_tag {
|
||||
NSL_SMARTCARD_SENSE4_DATA_SERIAL_NUMBER = 0x2,
|
||||
NSL_SMARTCARD_SENSE4_DATA_DF_SPACE = 0x3,
|
||||
NSL_SMARTCARD_SENSE4_DATA_CURRENT_DF = 0x4,
|
||||
NSL_SMARTCARD_SENSE4_DATA_DEVICE_TYPE = 0x6,
|
||||
NSL_SMARTCARD_SENSE4_DATA_DEVICE_SUBTYPE = 0x7,
|
||||
NSL_SMARTCARD_SENSE4_DATA_USABLE_SPACE = 0x8,
|
||||
NSL_SMARTCARD_SENSE4_DATA_E2_FILE = 0x9,
|
||||
NSL_SMARTCARD_SENSE4_DATA_METADATA = 0xA,
|
||||
NSL_SMARTCARD_SENSE4_DATA_CURRENT_TIME = 0xB,
|
||||
};
|
||||
|
||||
void nsl_smartcard_sense4_init(nsl_smartcard_handler_t cmds[static 0x100]);
|
|
@ -4,8 +4,6 @@
|
|||
#include "../util.h"
|
||||
|
||||
|
||||
#define NSL_SMARTCARD_USER_PIN_DEFAULT "12345678"
|
||||
#define NSL_SMARTCARD_DEV_PIN_DEFAULT "123456781234567812345678"
|
||||
#define NSL_SMARTCARD_PIN_LEN_REPORT_CUTOFF 16
|
||||
|
||||
|
||||
|
@ -154,8 +152,8 @@ static void init_dir(struct nsl_smartcard_file *file, nsl_smartcard_file_id_t id
|
|||
|
||||
file->contents.dir.auth = NSL_SMARTCARD_AUTH_NONE;
|
||||
file->contents.dir.auth_attempts = 0;
|
||||
memcpy(file->contents.dir.user_pin, NSL_SMARTCARD_USER_PIN_DEFAULT, sizeof(file->contents.dir.user_pin));
|
||||
memcpy(file->contents.dir.dev_pin, NSL_SMARTCARD_DEV_PIN_DEFAULT, sizeof(file->contents.dir.user_pin));
|
||||
memset(file->contents.dir.user_pin, 0, sizeof(file->contents.dir.user_pin));
|
||||
memset(file->contents.dir.dev_pin, 0, sizeof(file->contents.dir.user_pin));
|
||||
}
|
||||
|
||||
static int init_file(struct nsl_smartcard_file *file, nsl_smartcard_file_id_t id, enum nsl_smartcard_file_type type)
|
||||
|
@ -349,7 +347,7 @@ int nsl_smartcard_dir_find(struct nsl_smartcard_file *file, nsl_smartcard_file_i
|
|||
if (!nsl_smartcard_is_dir(file)) {
|
||||
return NSL_SMARTCARD_ERROR_WRONG_TYPE;
|
||||
}
|
||||
for (struct nsl_smartcard_file *f = nsl_smartcard_file_iter(file); f; f = nsl_smartcard_file_next(f)) {
|
||||
for (struct nsl_smartcard_file *f = nsl_smartcard_dir_iter(file); f; f = nsl_smartcard_file_next(f)) {
|
||||
if (f->id == id) {
|
||||
if (child) {
|
||||
*child = f;
|
||||
|
@ -369,7 +367,7 @@ int nsl_smartcard_dir_clear(struct nsl_smartcard_file *file)
|
|||
return NSL_SMARTCARD_ERROR_UNAUTHORIZED;
|
||||
}
|
||||
|
||||
for (struct nsl_smartcard_file *child = nsl_smartcard_file_iter(file); child; child = nsl_smartcard_file_next(child)) {
|
||||
for (struct nsl_smartcard_file *child = nsl_smartcard_dir_iter(file); child; child = nsl_smartcard_file_next(child)) {
|
||||
if (nsl_smartcard_is_dir(child)) {
|
||||
nsl_smartcard_dir_delete(child);
|
||||
} else {
|
||||
|
|
|
@ -124,10 +124,7 @@ int nsl_smartcard_dir_internal_end(struct nsl_smartcard_file *);
|
|||
int nsl_smartcard_dir_find(struct nsl_smartcard_file *, nsl_smartcard_file_id_t id, struct nsl_smartcard_file **child);
|
||||
int nsl_smartcard_dir_clear(struct nsl_smartcard_file *);
|
||||
|
||||
int nsl_smartcard_create_root(void *mem, size_t size, struct nsl_smartcard_file **);
|
||||
|
||||
|
||||
static inline struct nsl_smartcard_file *nsl_smartcard_file_iter(struct nsl_smartcard_file *file)
|
||||
static inline struct nsl_smartcard_file *nsl_smartcard_dir_iter(struct nsl_smartcard_file *file)
|
||||
{
|
||||
return spaceship_get_first_child(&file->spaceship);
|
||||
}
|
||||
|
@ -141,3 +138,6 @@ static inline struct nsl_smartcard_file *nsl_smartcard_file_parent(struct nsl_sm
|
|||
{
|
||||
return spaceship_get_parent(&file->spaceship);
|
||||
}
|
||||
|
||||
|
||||
int nsl_smartcard_create_root(void *mem, size_t size, struct nsl_smartcard_file **);
|
||||
|
|
|
@ -1,8 +1,10 @@
|
|||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include "smartcard.h"
|
||||
#include "error.h"
|
||||
#include "../util.h"
|
||||
#include "error.h"
|
||||
#include "smartcard.h"
|
||||
#include "commands/iso7816.h"
|
||||
#include "commands/sense4.h"
|
||||
|
||||
|
||||
static void set_error(struct nsl_smartcard *smartcard, uint8_t sw1, uint8_t sw2)
|
||||
|
@ -15,16 +17,19 @@ static void set_error(struct nsl_smartcard *smartcard, uint8_t sw1, uint8_t sw2)
|
|||
|
||||
int nsl_smartcard_init(struct nsl_smartcard *smartcard)
|
||||
{
|
||||
smartcard->curdir = NULL;
|
||||
memset(smartcard->handles, 0, sizeof(smartcard->handles));
|
||||
smartcard->last_handle = 0;
|
||||
|
||||
memset(smartcard->standard_handlers, 0, sizeof(smartcard->standard_handlers));
|
||||
memset(smartcard->proprietary_handlers, 0, sizeof(smartcard->proprietary_handlers));
|
||||
nsl_smartcard_iso7816_init(smartcard->standard_handlers);
|
||||
nsl_smartcard_sense4_init(smartcard->proprietary_handlers);
|
||||
|
||||
int err = nsl_smartcard_create_root(smartcard->memory, sizeof(smartcard->memory), &smartcard->rootdir);
|
||||
if (err) {
|
||||
return err;
|
||||
}
|
||||
|
||||
memset(smartcard->standard_handlers, 0, sizeof(smartcard->standard_handlers));
|
||||
memset(smartcard->proprietary_handlers, 0, sizeof(smartcard->proprietary_handlers));
|
||||
smartcard->curdir = NULL;
|
||||
|
||||
nsl_smartcard_emu_init(&smartcard->emu, 0xFFFF, 0xFFFF);
|
||||
return nsl_smartcard_reset(smartcard);
|
||||
|
|
Loading…
Reference in New Issue