diff options
author | Rob Austein <sra@hactrn.net> | 2016-11-05 00:44:42 -0400 |
---|---|---|
committer | Rob Austein <sra@hactrn.net> | 2016-11-05 00:44:42 -0400 |
commit | 1d7ff81bd24dc14730f84f040f63a8da5a344d39 (patch) | |
tree | 5501b077db1eea26b045dead5d02bb18ab330288 | |
parent | 8ffe3e5451fa0a4494d4d15ee3ed58245b287b19 (diff) |
ks_list() was returning garbage for keys not visible to current session.
-rw-r--r-- | ks_flash.c | 9 | ||||
-rw-r--r-- | ks_volatile.c | 12 |
2 files changed, 12 insertions, 9 deletions
@@ -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; } |