Added access checks.
Signed-off-by: Pol Henarejos <pol.henarejos@cttc.es>
This commit is contained in:
@@ -75,17 +75,9 @@ static int cmd_select() {
|
|||||||
file_t *pe = NULL;
|
file_t *pe = NULL;
|
||||||
uint16_t fid = 0x0;
|
uint16_t fid = 0x0;
|
||||||
|
|
||||||
// Only "first or only occurence" supported
|
|
||||||
//if ((p2 & 0xF3) != 0x00) {
|
|
||||||
// return SW_INCORRECT_P1P2();
|
|
||||||
//}
|
|
||||||
|
|
||||||
if (apdu.cmd_apdu_data_len >= 2)
|
if (apdu.cmd_apdu_data_len >= 2)
|
||||||
fid = get_uint16_t(apdu.cmd_apdu_data, 0);
|
fid = get_uint16_t(apdu.cmd_apdu_data, 0);
|
||||||
|
|
||||||
//if ((fid & 0xff00) == (KEY_PREFIX << 8))
|
|
||||||
// fid = (PRKD_PREFIX << 8) | (fid & 0xff);
|
|
||||||
|
|
||||||
if (!pe) {
|
if (!pe) {
|
||||||
if (p1 == 0x0) { //Select MF, DF or EF - File identifier or absent
|
if (p1 == 0x0) { //Select MF, DF or EF - File identifier or absent
|
||||||
if (apdu.cmd_apdu_data_len == 0) {
|
if (apdu.cmd_apdu_data_len == 0) {
|
||||||
@@ -974,6 +966,8 @@ static int cmd_keypair_gen() {
|
|||||||
return SW_INCORRECT_P1P2();
|
return SW_INCORRECT_P1P2();
|
||||||
if (apdu.cmd_apdu_data_len != 2 && apdu.cmd_apdu_data_len != 5)
|
if (apdu.cmd_apdu_data_len != 2 && apdu.cmd_apdu_data_len != 5)
|
||||||
return SW_WRONG_LENGTH();
|
return SW_WRONG_LENGTH();
|
||||||
|
if (!has_pw3 && P1(apdu) == 0x80)
|
||||||
|
return SW_SECURITY_STATUS_NOT_SATISFIED();
|
||||||
|
|
||||||
uint16_t fid = 0x0;
|
uint16_t fid = 0x0;
|
||||||
int r = CCID_OK;
|
int r = CCID_OK;
|
||||||
@@ -1141,10 +1135,14 @@ int ecdsa_sign(mbedtls_ecdsa_context *ctx, const uint8_t *data, size_t data_len,
|
|||||||
static int cmd_pso() {
|
static int cmd_pso() {
|
||||||
uint16_t algo_fid = 0x0, pk_fid = 0x0;
|
uint16_t algo_fid = 0x0, pk_fid = 0x0;
|
||||||
if (P1(apdu) == 0x9E && P2(apdu) == 0x9A) {
|
if (P1(apdu) == 0x9E && P2(apdu) == 0x9A) {
|
||||||
|
if (!has_pw3 && !has_pw1)
|
||||||
|
return SW_SECURITY_STATUS_NOT_SATISFIED();
|
||||||
algo_fid = EF_ALGO_PRIV1;
|
algo_fid = EF_ALGO_PRIV1;
|
||||||
pk_fid = EF_PK_SIG;
|
pk_fid = EF_PK_SIG;
|
||||||
}
|
}
|
||||||
else if (P1(apdu) == 0x80 && P2(apdu) == 0x86) {
|
else if (P1(apdu) == 0x80 && P2(apdu) == 0x86) {
|
||||||
|
if (!has_pw3 && !has_pw2)
|
||||||
|
return SW_SECURITY_STATUS_NOT_SATISFIED();
|
||||||
algo_fid = EF_ALGO_PRIV2;
|
algo_fid = EF_ALGO_PRIV2;
|
||||||
pk_fid = EF_PK_DEC;
|
pk_fid = EF_PK_DEC;
|
||||||
}
|
}
|
||||||
@@ -1252,6 +1250,11 @@ static int cmd_pso() {
|
|||||||
static int cmd_terminate_df() {
|
static int cmd_terminate_df() {
|
||||||
if (P1(apdu) != 0x0 && P2(apdu) != 0x0)
|
if (P1(apdu) != 0x0 && P2(apdu) != 0x0)
|
||||||
return SW_INCORRECT_P1P2();
|
return SW_INCORRECT_P1P2();
|
||||||
|
file_t *retries;
|
||||||
|
if (!(retries = search_by_fid(EF_PW3_RETRIES, NULL, SPECIFY_EF)))
|
||||||
|
return SW_REFERENCE_NOT_FOUND();
|
||||||
|
if (!has_pw3 && file_read_uint8(retries->data+2) > 0)
|
||||||
|
return SW_SECURITY_STATUS_NOT_SATISFIED();
|
||||||
if (apdu.cmd_apdu_data_len != 0)
|
if (apdu.cmd_apdu_data_len != 0)
|
||||||
return SW_WRONG_LENGTH();
|
return SW_WRONG_LENGTH();
|
||||||
initialize_flash(true);
|
initialize_flash(true);
|
||||||
@@ -1275,6 +1278,8 @@ static int cmd_challenge() {
|
|||||||
static int cmd_internal_aut() {
|
static int cmd_internal_aut() {
|
||||||
if (P1(apdu) != 0x00 || P2(apdu) != 0x00)
|
if (P1(apdu) != 0x00 || P2(apdu) != 0x00)
|
||||||
return SW_WRONG_P1P2();
|
return SW_WRONG_P1P2();
|
||||||
|
if (!has_pw3 && !has_pw2)
|
||||||
|
return SW_SECURITY_STATUS_NOT_SATISFIED();
|
||||||
file_t *algo_ef = search_by_fid(EF_ALGO_PRIV3, NULL, SPECIFY_EF);
|
file_t *algo_ef = search_by_fid(EF_ALGO_PRIV3, NULL, SPECIFY_EF);
|
||||||
if (!algo_ef)
|
if (!algo_ef)
|
||||||
return SW_FILE_NOT_FOUND();
|
return SW_FILE_NOT_FOUND();
|
||||||
|
|||||||
Reference in New Issue
Block a user