Skip to content

Commit 225a6ed

Browse files
committed
libnvme: Implement 'nvme_generate_tls_key_identity()'
Implement a function to generate the TLS key identity. Signed-off-by: Hannes Reinecke <[email protected]>
1 parent dc6fc7b commit 225a6ed

3 files changed

Lines changed: 62 additions & 0 deletions

File tree

src/libnvme.map

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ LIBNVME_1_7 {
44
nvme_init_copy_range_f2;
55
nvme_init_copy_range_f3;
66
nvme_insert_tls_key_versioned;
7+
nvme_generate_tls_key_identity;
78
};
89

910
LIBNVME_1_6 {

src/nvme/linux.c

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1233,6 +1233,38 @@ long nvme_insert_tls_key_versioned(const char *keyring, const char *key_type,
12331233
return key;
12341234
}
12351235

1236+
char *nvme_generate_tls_key_identity(const char *hostnqn, const char *subsysnqn,
1237+
int version, int hmac,
1238+
unsigned char *configured_key, int key_len)
1239+
{
1240+
char *identity;
1241+
size_t identity_len;
1242+
unsigned char *psk;
1243+
int ret = -1;
1244+
1245+
identity_len = nvme_identity_len(hmac, version, hostnqn, subsysnqn);
1246+
if (identity_len < 0)
1247+
return NULL;
1248+
1249+
identity = malloc(identity_len);
1250+
if (!identity)
1251+
return NULL;
1252+
1253+
psk = malloc(key_len);
1254+
if (!psk)
1255+
goto out_free_identity;
1256+
1257+
memset(psk, 0, key_len);
1258+
ret = derive_nvme_keys(hostnqn, subsysnqn, identity, version, hmac,
1259+
configured_key, psk, key_len);
1260+
free(psk);
1261+
out_free_identity:
1262+
if (ret < 0) {
1263+
free(identity);
1264+
identity = NULL;
1265+
}
1266+
return identity;
1267+
}
12361268
#else
12371269
long nvme_lookup_keyring(const char *keyring)
12381270
{
@@ -1276,6 +1308,16 @@ long nvme_insert_tls_key_versioned(const char *keyring, const char *key_type,
12761308
errno = ENOTSUP;
12771309
return -1;
12781310
}
1311+
1312+
char *nvme_generate_tls_key_identity(const char *hostnqn, const char *subsysnqn,
1313+
int version, int hmac,
1314+
unsigned char *configured_key, int key_len)
1315+
{
1316+
nvme_msg(NULL, LOG_ERR, "key operations not supported; "
1317+
"recompile with keyutils support.\n");
1318+
errno = ENOTSUP;
1319+
return -1;
1320+
}
12791321
#endif
12801322

12811323
long nvme_insert_tls_key(const char *keyring, const char *key_type,

src/nvme/linux.h

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -316,4 +316,23 @@ long nvme_insert_tls_key_versioned(const char *keyring, const char *key_type,
316316
int version, int hmac,
317317
unsigned char *configured_key, int key_len);
318318

319+
/**
320+
* nvme_generate_tls_key_identity() - Generate the TLS key identity
321+
* @hostnqn: Host NVMe Qualified Name
322+
* @subsysnqn: Subsystem NVMe Qualified Name
323+
* @version: Key version to use
324+
* @hmac: HMAC algorithm
325+
* @configured_key: Configured key data to derive the key from
326+
* @key_len: Length of @configured_key
327+
*
328+
* Derives a 'retained' TLS key as specified in NVMe TCP and
329+
* generate the corresponding TLs identity.
330+
*
331+
* Return: The string containing the TLS identity. It is the responsibility
332+
* of the caller to free the returned string.
333+
*/
334+
char *nvme_generate_tls_key_identity(const char *hostnqn, const char *subsysnqn,
335+
int version, int hmac,
336+
unsigned char *configured_key, int key_len);
337+
319338
#endif /* _LIBNVME_LINUX_H */

0 commit comments

Comments
 (0)