Reset internal state of GA to avoid phantom requests on GNA.
When a previous GA had more than 1 credential, it stored the full list in the internal state. Later, if a GA had only 1 credential, subsequent GNA returned older state of previous non-related GA. Signed-off-by: Pol Henarejos <pol.henarejos@cttc.es>
This commit is contained in:
@@ -41,6 +41,7 @@ int cbor_cred_mgmt(const uint8_t *data, size_t len);
|
|||||||
int cbor_config(const uint8_t *data, size_t len);
|
int cbor_config(const uint8_t *data, size_t len);
|
||||||
int cbor_vendor(const uint8_t *data, size_t len);
|
int cbor_vendor(const uint8_t *data, size_t len);
|
||||||
int cbor_large_blobs(const uint8_t *data, size_t len);
|
int cbor_large_blobs(const uint8_t *data, size_t len);
|
||||||
|
extern void reset_gna_state();
|
||||||
|
|
||||||
extern int cmd_read_config();
|
extern int cmd_read_config();
|
||||||
|
|
||||||
@@ -59,6 +60,9 @@ int cbor_parse(uint8_t cmd, const uint8_t *data, size_t len) {
|
|||||||
}
|
}
|
||||||
if (cap_supported(CAP_FIDO2)) {
|
if (cap_supported(CAP_FIDO2)) {
|
||||||
if (cmd == CTAPHID_CBOR) {
|
if (cmd == CTAPHID_CBOR) {
|
||||||
|
if (data[0] != CTAP_GET_NEXT_ASSERTION) {
|
||||||
|
reset_gna_state();
|
||||||
|
}
|
||||||
if (data[0] == CTAP_MAKE_CREDENTIAL) {
|
if (data[0] == CTAP_MAKE_CREDENTIAL) {
|
||||||
return cbor_make_credential(data + 1, len - 1);
|
return cbor_make_credential(data + 1, len - 1);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -42,6 +42,22 @@ uint32_t timerx = 0;
|
|||||||
uint8_t *datax = NULL;
|
uint8_t *datax = NULL;
|
||||||
size_t lenx = 0;
|
size_t lenx = 0;
|
||||||
|
|
||||||
|
void reset_gna_state() {
|
||||||
|
for (int i = 0; i < MAX_CREDENTIAL_COUNT_IN_LIST; i++) {
|
||||||
|
credential_free(&credsx[i]);
|
||||||
|
}
|
||||||
|
if (datax) {
|
||||||
|
free(datax);
|
||||||
|
datax = NULL;
|
||||||
|
}
|
||||||
|
lenx = 0;
|
||||||
|
residentx = false;
|
||||||
|
timerx = 0;
|
||||||
|
flagsx = 0;
|
||||||
|
credentialCounter = 0;
|
||||||
|
numberOfCredentialsx = 0;
|
||||||
|
}
|
||||||
|
|
||||||
int cbor_get_next_assertion(const uint8_t *data, size_t len) {
|
int cbor_get_next_assertion(const uint8_t *data, size_t len) {
|
||||||
(void) data;
|
(void) data;
|
||||||
(void) len;
|
(void) len;
|
||||||
@@ -57,19 +73,7 @@ int cbor_get_next_assertion(const uint8_t *data, size_t len) {
|
|||||||
credentialCounter++;
|
credentialCounter++;
|
||||||
err:
|
err:
|
||||||
if (error != CborNoError || credentialCounter == numberOfCredentialsx) {
|
if (error != CborNoError || credentialCounter == numberOfCredentialsx) {
|
||||||
for (int i = 0; i < MAX_CREDENTIAL_COUNT_IN_LIST; i++) {
|
reset_gna_state();
|
||||||
credential_free(&credsx[i]);
|
|
||||||
}
|
|
||||||
if (datax) {
|
|
||||||
free(datax);
|
|
||||||
datax = NULL;
|
|
||||||
}
|
|
||||||
lenx = 0;
|
|
||||||
residentx = false;
|
|
||||||
timerx = 0;
|
|
||||||
flagsx = 0;
|
|
||||||
credentialCounter = 0;
|
|
||||||
numberOfCredentialsx = 0;
|
|
||||||
if (error == CborErrorImproperValue) {
|
if (error == CborErrorImproperValue) {
|
||||||
return CTAP2_ERR_CBOR_UNEXPECTED_TYPE;
|
return CTAP2_ERR_CBOR_UNEXPECTED_TYPE;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user