smartcard: split up standard and sense4 commands, remove default PIN handling

This commit is contained in:
Shiz 2020-04-14 03:32:25 +02:00
parent c0973f37c5
commit 1c52c5b667
10 changed files with 153 additions and 70 deletions

View File

@ -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);

View File

@ -0,0 +1,7 @@
#include "iso7816.h"
void nsl_smartcard_iso7816_init(nsl_smartcard_handler_t cmds[static 0x100])
{
}

View File

@ -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]);

View File

@ -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;
}

View File

@ -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]);

View File

@ -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 {

View File

@ -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 **);

View 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);