Fix enabled cap detection when applet is already selected.
Signed-off-by: Pol Henarejos <pol.henarejos@cttc.es>
This commit is contained in:
@@ -23,6 +23,7 @@
|
|||||||
#include "fido.h"
|
#include "fido.h"
|
||||||
#include "usb.h"
|
#include "usb.h"
|
||||||
#include "apdu.h"
|
#include "apdu.h"
|
||||||
|
#include "management.h"
|
||||||
|
|
||||||
const bool _btrue = true, _bfalse = false;
|
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) {
|
if (len > 0) {
|
||||||
DEBUG_DATA(data + 1, len - 1);
|
DEBUG_DATA(data + 1, len - 1);
|
||||||
}
|
}
|
||||||
driver_prepare_response_hid();
|
if (cap_supported(CAP_FIDO2)) {
|
||||||
if (cmd == CTAPHID_CBOR) {
|
driver_prepare_response_hid();
|
||||||
if (data[0] == CTAP_MAKE_CREDENTIAL) {
|
if (cmd == CTAPHID_CBOR) {
|
||||||
return cbor_make_credential(data + 1, len - 1);
|
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) {
|
else if (cmd == CTAP_VENDOR_CBOR) {
|
||||||
return cbor_get_info();
|
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;
|
return CTAP1_ERR_INVALID_CMD;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -153,10 +153,12 @@ int u2f_process_apdu() {
|
|||||||
if (CLA(apdu) != 0x00) {
|
if (CLA(apdu) != 0x00) {
|
||||||
return SW_CLA_NOT_SUPPORTED();
|
return SW_CLA_NOT_SUPPORTED();
|
||||||
}
|
}
|
||||||
for (const cmd_t *cmd = cmds; cmd->ins != 0x00; cmd++) {
|
if (cap_supported(CAP_U2F)) {
|
||||||
if (cmd->ins == INS(apdu)) {
|
for (const cmd_t *cmd = cmds; cmd->ins != 0x00; cmd++) {
|
||||||
int r = cmd->cmd_handler();
|
if (cmd->ins == INS(apdu)) {
|
||||||
return r;
|
int r = cmd->cmd_handler();
|
||||||
|
return r;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return SW_INS_NOT_SUPPORTED();
|
return SW_INS_NOT_SUPPORTED();
|
||||||
|
|||||||
@@ -415,10 +415,12 @@ int fido_process_apdu() {
|
|||||||
if (CLA(apdu) != 0x00) {
|
if (CLA(apdu) != 0x00) {
|
||||||
return SW_CLA_NOT_SUPPORTED();
|
return SW_CLA_NOT_SUPPORTED();
|
||||||
}
|
}
|
||||||
for (const cmd_t *cmd = cmds; cmd->ins != 0x00; cmd++) {
|
if (cap_supported(CAP_U2F)) {
|
||||||
if (cmd->ins == INS(apdu)) {
|
for (const cmd_t *cmd = cmds; cmd->ins != 0x00; cmd++) {
|
||||||
int r = cmd->cmd_handler();
|
if (cmd->ins == INS(apdu)) {
|
||||||
return r;
|
int r = cmd->cmd_handler();
|
||||||
|
return r;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return SW_INS_NOT_SUPPORTED();
|
return SW_INS_NOT_SUPPORTED();
|
||||||
|
|||||||
@@ -645,10 +645,12 @@ int oath_process_apdu() {
|
|||||||
if (CLA(apdu) != 0x00) {
|
if (CLA(apdu) != 0x00) {
|
||||||
return SW_CLA_NOT_SUPPORTED();
|
return SW_CLA_NOT_SUPPORTED();
|
||||||
}
|
}
|
||||||
for (const cmd_t *cmd = cmds; cmd->ins != 0x00; cmd++) {
|
if (cap_supported(CAP_OATH)) {
|
||||||
if (cmd->ins == INS(apdu)) {
|
for (const cmd_t *cmd = cmds; cmd->ins != 0x00; cmd++) {
|
||||||
int r = cmd->cmd_handler();
|
if (cmd->ins == INS(apdu)) {
|
||||||
return r;
|
int r = cmd->cmd_handler();
|
||||||
|
return r;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return SW_INS_NOT_SUPPORTED();
|
return SW_INS_NOT_SUPPORTED();
|
||||||
|
|||||||
@@ -463,10 +463,12 @@ int otp_process_apdu() {
|
|||||||
if (CLA(apdu) != 0x00) {
|
if (CLA(apdu) != 0x00) {
|
||||||
return SW_CLA_NOT_SUPPORTED();
|
return SW_CLA_NOT_SUPPORTED();
|
||||||
}
|
}
|
||||||
for (const cmd_t *cmd = cmds; cmd->ins != 0x00; cmd++) {
|
if (cap_supported(CAP_OTP)) {
|
||||||
if (cmd->ins == INS(apdu)) {
|
for (const cmd_t *cmd = cmds; cmd->ins != 0x00; cmd++) {
|
||||||
int r = cmd->cmd_handler();
|
if (cmd->ins == INS(apdu)) {
|
||||||
return r;
|
int r = cmd->cmd_handler();
|
||||||
|
return r;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return SW_INS_NOT_SUPPORTED();
|
return SW_INS_NOT_SUPPORTED();
|
||||||
|
|||||||
Reference in New Issue
Block a user