aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Austein <sra@hactrn.net>2016-11-05 00:44:42 -0400
committerRob Austein <sra@hactrn.net>2016-11-05 00:44:42 -0400
commit1d7ff81bd24dc14730f84f040f63a8da5a344d39 (patch)
tree5501b077db1eea26b045dead5d02bb18ab330288
parent8ffe3e5451fa0a4494d4d15ee3ed58245b287b19 (diff)
ks_list() was returning garbage for keys not visible to current session.
-rw-r--r--ks_flash.c9
-rw-r--r--ks_volatile.c12
2 files changed, 12 insertions, 9 deletions
diff --git a/ks_flash.c b/ks_flash.c
index 2eda9e3..7a11f0f 100644
--- a/ks_flash.c
+++ b/ks_flash.c
@@ -1097,17 +1097,16 @@ static hal_error_t ks_list(hal_ks_t *ks,
if (ks != &db.ks || result == NULL || result_len == NULL)
return HAL_ERROR_BAD_ARGUMENTS;
- if (db.ksi.used > result_max)
- return HAL_ERROR_RESULT_TOO_LONG;
-
flash_block_t *block;
hal_error_t err;
- unsigned b;
*result_len = 0;
for (int i = 0; i < db.ksi.used; i++) {
- b = db.ksi.index[i];
+ unsigned b = db.ksi.index[i];
+
+ if (*result_len >= result_max)
+ return HAL_ERROR_RESULT_TOO_LONG;
if ((err = block_read_cached(b, &block)) != HAL_OK)
return err;
diff --git a/ks_volatile.c b/ks_volatile.c
index c416263..c8a424c 100644
--- a/ks_volatile.c
+++ b/ks_volatile.c
@@ -360,23 +360,27 @@ static hal_error_t ks_list(hal_ks_t *ks,
if (ksv->db == NULL)
return HAL_ERROR_KEYSTORE_ACCESS;
- if (ksv->db->ksi.used > result_max)
- return HAL_ERROR_RESULT_TOO_LONG;
+ *result_len = 0;
for (int i = 0; i < ksv->db->ksi.used; i++) {
unsigned b = ksv->db->ksi.index[i];
+
if (ksv->db->ksi.names[b].chunk > 0)
continue;
+
if (!key_visible_to_session(ksv, client, session, &ksv->db->keys[b]))
continue;
+
+ if (*result_len >= result_max)
+ return HAL_ERROR_RESULT_TOO_LONG;
+
result[i].name = ksv->db->ksi.names[b].name;
result[i].type = ksv->db->keys[b].type;
result[i].curve = ksv->db->keys[b].curve;
result[i].flags = ksv->db->keys[b].flags;
+ ++ *result_len;
}
- *result_len = ksv->db->ksi.used;
-
return HAL_OK;
}