Skip to content

Commit d1fd6a4

Browse files
hreineckeigaw
authored andcommitted
linux: Add nvme_scan_tls_keys()
Add a function to iterate existing TLS keys in a given keyring. Signed-off-by: Hannes Reinecke <[email protected]>
1 parent 774b034 commit d1fd6a4

2 files changed

Lines changed: 99 additions & 0 deletions

File tree

src/nvme/linux.c

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1244,6 +1244,67 @@ long nvme_update_key(long keyring_id, const char *key_type,
12441244
return key;
12451245
}
12461246

1247+
struct __scan_keys_data {
1248+
nvme_scan_tls_keys_cb_t cb;
1249+
key_serial_t keyring;
1250+
void *data;
1251+
};
1252+
1253+
int __scan_keys_cb(key_serial_t parent, key_serial_t key,
1254+
char *desc, int desc_len, void *data)
1255+
{
1256+
struct __scan_keys_data *d = data;
1257+
int ver, hmac, uid, gid, perm;
1258+
char type, *ptr;
1259+
1260+
if (desc_len < 6)
1261+
return 0;
1262+
if (sscanf(desc, "psk;%d;%d;%08x;NVMe%01d%c%02d %*s",
1263+
&uid, &gid, &perm, &ver, &type, &hmac) != 6)
1264+
return 0;
1265+
/* skip key type */
1266+
ptr = strchr(desc, ';');
1267+
if (!ptr)
1268+
return 0;
1269+
/* skip key uid */
1270+
ptr = strchr(ptr + 1, ';');
1271+
if (!ptr)
1272+
return 0;
1273+
/* skip key gid */
1274+
ptr = strchr(ptr + 1, ';');
1275+
if (!ptr)
1276+
return 0;
1277+
/* skip key permissions */
1278+
ptr = strchr(ptr + 1, ';');
1279+
if (!ptr)
1280+
return 0;
1281+
/* Only use the key description for the callback */
1282+
(d->cb)(d->keyring, key, ptr + 1, strlen(ptr) - 1, d->data);
1283+
return 1;
1284+
}
1285+
1286+
int nvme_scan_tls_keys(const char *keyring, nvme_scan_tls_keys_cb_t cb,
1287+
void *data)
1288+
{
1289+
struct __scan_keys_data d;
1290+
key_serial_t keyring_id = nvme_lookup_keyring(keyring);
1291+
int ret;
1292+
1293+
if (!keyring_id) {
1294+
errno = EINVAL;
1295+
return -1;
1296+
}
1297+
ret = nvme_set_keyring(keyring_id);
1298+
if (ret < 0)
1299+
return ret;
1300+
1301+
d.keyring = keyring_id;
1302+
d.cb = cb;
1303+
d.data = data;
1304+
ret = recursive_key_scan(keyring_id, __scan_keys_cb, &d);
1305+
return ret;
1306+
}
1307+
12471308
long nvme_insert_tls_key_versioned(const char *keyring, const char *key_type,
12481309
const char *hostnqn, const char *subsysnqn,
12491310
int version, int hmac,
@@ -1341,6 +1402,13 @@ long nvme_update_key(long keyring_id, const char *key_type,
13411402
return 0;
13421403
}
13431404

1405+
int nvme_scan_tls_keys(const char *keyring, nvme_scan_tls_keys_cb_t cb,
1406+
void *data)
1407+
{
1408+
errno = ENOTSUP;
1409+
return -1;
1410+
}
1411+
13441412
long nvme_insert_tls_key_versioned(const char *keyring, const char *key_type,
13451413
const char *hostnqn, const char *subsysnqn,
13461414
int version, int hmac,

src/nvme/linux.h

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,37 @@ long nvme_update_key(long keyring_id, const char *key_type,
308308
const char *identity, unsigned char *key_data,
309309
int key_len);
310310

311+
/**
312+
* typedef nvme_scan_tls_keys_cb_t - Callback for iterating TLS keys
313+
* @keyring: Keyring which has been iterated
314+
* @key: Key for which the callback has been invoked
315+
* @desc: Description of the key
316+
* @desc_len: Length of @desc
317+
* @data: Pointer for caller data
318+
*
319+
* Called for each TLS PSK in the keyring.
320+
*/
321+
typedef void (*nvme_scan_tls_keys_cb_t)(long keyring, long key,
322+
char *desc, int desc_len, void *data);
323+
324+
/**
325+
* nvme_scan_tls_keys() - Iterate over TLS keys in a keyring
326+
* @keyring: Keyring holding TLS keys
327+
* @cb: Callback function
328+
* @data: Pointer for data to be passed to @cb
329+
*
330+
* Iterates @keyring and call @cb for each TLS key. When @keyring is NULL
331+
* the default '.nvme' keyring is used.
332+
* A TLS key must be of type 'psk' and the description must be of the
333+
* form 'NVMe<0|1><R|G>0<1|2> <identity>', otherwise it will be skipped
334+
* during iteration.
335+
*
336+
* Return: Number of keys for which @cb was called, or -1 with errno set
337+
* on error.
338+
*/
339+
int nvme_scan_tls_keys(const char *keyring, nvme_scan_tls_keys_cb_t cb,
340+
void *data);
341+
311342
/**
312343
* nvme_insert_tls_key() - Derive and insert TLS key
313344
* @keyring: Keyring to use

0 commit comments

Comments
 (0)