diff --git a/src/fido/cbor.c b/src/fido/cbor.c index 4928626..818ddfe 100644 --- a/src/fido/cbor.c +++ b/src/fido/cbor.c @@ -23,6 +23,7 @@ #include "fido.h" #include "usb.h" #include "apdu.h" +#include "management.h" const bool _btrue = true, _bfalse = false; @@ -52,41 +53,43 @@ int cbor_parse(uint8_t cmd, const uint8_t *data, size_t len) { if (len > 0) { DEBUG_DATA(data + 1, len - 1); } - driver_prepare_response_hid(); - if (cmd == CTAPHID_CBOR) { - if (data[0] == CTAP_MAKE_CREDENTIAL) { - return cbor_make_credential(data + 1, len - 1); + if (cap_supported(CAP_FIDO2)) { + driver_prepare_response_hid(); + if (cmd == CTAPHID_CBOR) { + if (data[0] == CTAP_MAKE_CREDENTIAL) { + return cbor_make_credential(data + 1, len - 1); + } + if (data[0] == CTAP_GET_INFO) { + return cbor_get_info(); + } + else if (data[0] == CTAP_RESET) { + return cbor_reset(); + } + else if (data[0] == CTAP_CLIENT_PIN) { + return cbor_client_pin(data + 1, len - 1); + } + else if (data[0] == CTAP_GET_ASSERTION) { + return cbor_get_assertion(data + 1, len - 1, false); + } + else if (data[0] == CTAP_GET_NEXT_ASSERTION) { + return cbor_get_next_assertion(data + 1, len - 1); + } + else if (data[0] == CTAP_SELECTION) { + return cbor_selection(); + } + else if (data[0] == CTAP_CREDENTIAL_MGMT || data[0] == 0x41) { + return cbor_cred_mgmt(data + 1, len - 1); + } + else if (data[0] == CTAP_CONFIG) { + return cbor_config(data + 1, len - 1); + } + else if (data[0] == CTAP_LARGE_BLOBS) { + return cbor_large_blobs(data + 1, len - 1); + } } - if (data[0] == CTAP_GET_INFO) { - return cbor_get_info(); + else if (cmd == CTAP_VENDOR_CBOR) { + return cbor_vendor(data, len); } - else if (data[0] == CTAP_RESET) { - return cbor_reset(); - } - else if (data[0] == CTAP_CLIENT_PIN) { - return cbor_client_pin(data + 1, len - 1); - } - else if (data[0] == CTAP_GET_ASSERTION) { - return cbor_get_assertion(data + 1, len - 1, false); - } - else if (data[0] == CTAP_GET_NEXT_ASSERTION) { - return cbor_get_next_assertion(data + 1, len - 1); - } - else if (data[0] == CTAP_SELECTION) { - return cbor_selection(); - } - else if (data[0] == CTAP_CREDENTIAL_MGMT || data[0] == 0x41) { - return cbor_cred_mgmt(data + 1, len - 1); - } - else if (data[0] == CTAP_CONFIG) { - return cbor_config(data + 1, len - 1); - } - else if (data[0] == CTAP_LARGE_BLOBS) { - return cbor_large_blobs(data + 1, len - 1); - } - } - else if (cmd == CTAP_VENDOR_CBOR) { - return cbor_vendor(data, len); } return CTAP1_ERR_INVALID_CMD; } diff --git a/src/fido/cmd_register.c b/src/fido/cmd_register.c index 806deea..837cb90 100644 --- a/src/fido/cmd_register.c +++ b/src/fido/cmd_register.c @@ -153,10 +153,12 @@ int u2f_process_apdu() { if (CLA(apdu) != 0x00) { return SW_CLA_NOT_SUPPORTED(); } - for (const cmd_t *cmd = cmds; cmd->ins != 0x00; cmd++) { - if (cmd->ins == INS(apdu)) { - int r = cmd->cmd_handler(); - return r; + if (cap_supported(CAP_U2F)) { + for (const cmd_t *cmd = cmds; cmd->ins != 0x00; cmd++) { + if (cmd->ins == INS(apdu)) { + int r = cmd->cmd_handler(); + return r; + } } } return SW_INS_NOT_SUPPORTED(); diff --git a/src/fido/fido.c b/src/fido/fido.c index 080246c..e86d7c6 100644 --- a/src/fido/fido.c +++ b/src/fido/fido.c @@ -415,10 +415,12 @@ int fido_process_apdu() { if (CLA(apdu) != 0x00) { return SW_CLA_NOT_SUPPORTED(); } - for (const cmd_t *cmd = cmds; cmd->ins != 0x00; cmd++) { - if (cmd->ins == INS(apdu)) { - int r = cmd->cmd_handler(); - return r; + if (cap_supported(CAP_U2F)) { + for (const cmd_t *cmd = cmds; cmd->ins != 0x00; cmd++) { + if (cmd->ins == INS(apdu)) { + int r = cmd->cmd_handler(); + return r; + } } } return SW_INS_NOT_SUPPORTED(); diff --git a/src/fido/oath.c b/src/fido/oath.c index 0e5be64..060ece3 100644 --- a/src/fido/oath.c +++ b/src/fido/oath.c @@ -645,10 +645,12 @@ int oath_process_apdu() { if (CLA(apdu) != 0x00) { return SW_CLA_NOT_SUPPORTED(); } - for (const cmd_t *cmd = cmds; cmd->ins != 0x00; cmd++) { - if (cmd->ins == INS(apdu)) { - int r = cmd->cmd_handler(); - return r; + if (cap_supported(CAP_OATH)) { + for (const cmd_t *cmd = cmds; cmd->ins != 0x00; cmd++) { + if (cmd->ins == INS(apdu)) { + int r = cmd->cmd_handler(); + return r; + } } } return SW_INS_NOT_SUPPORTED(); diff --git a/src/fido/otp.c b/src/fido/otp.c index cedcb71..eb12a31 100644 --- a/src/fido/otp.c +++ b/src/fido/otp.c @@ -463,10 +463,12 @@ int otp_process_apdu() { if (CLA(apdu) != 0x00) { return SW_CLA_NOT_SUPPORTED(); } - for (const cmd_t *cmd = cmds; cmd->ins != 0x00; cmd++) { - if (cmd->ins == INS(apdu)) { - int r = cmd->cmd_handler(); - return r; + if (cap_supported(CAP_OTP)) { + for (const cmd_t *cmd = cmds; cmd->ins != 0x00; cmd++) { + if (cmd->ins == INS(apdu)) { + int r = cmd->cmd_handler(); + return r; + } } } return SW_INS_NOT_SUPPORTED();