Skip to content

Commit

Permalink
Merge pull request #748 from hreinecke/TP8018
Browse files Browse the repository at this point in the history
Implement version 1 TLS identities as specified in TP8018
  • Loading branch information
hreinecke authored Nov 20, 2023
2 parents 200198c + 225a6ed commit f284041
Show file tree
Hide file tree
Showing 6 changed files with 544 additions and 52 deletions.
2 changes: 2 additions & 0 deletions src/libnvme.map
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ LIBNVME_1_7 {
global:
nvme_init_copy_range_f2;
nvme_init_copy_range_f3;
nvme_insert_tls_key_versioned;
nvme_generate_tls_key_identity;
};

LIBNVME_1_6 {
Expand Down
1 change: 1 addition & 0 deletions src/meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ sources = [
'nvme/log.c',
'nvme/tree.c',
'nvme/util.c',
'nvme/base64.c'
]

mi_sources = [
Expand Down
94 changes: 94 additions & 0 deletions src/nvme/base64.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
// SPDX-License-Identifier: GPL-2.0-or-later
/*
* base64.c - RFC4648-compliant base64 encoding
*
* Copyright (c) 2020 SUSE LLC
*
* Author: Hannes Reinecke <[email protected]>
*/

#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>

static const char base64_table[65] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

/**
* base64_encode() - base64-encode some bytes
* @src: the bytes to encode
* @srclen: number of bytes to encode
* @dst: (output) the base64-encoded string. Not NUL-terminated.
*
* Encodes the input string using characters from the set [A-Za-z0-9+,].
* The encoded string is roughly 4/3 times the size of the input string.
*
* Return: length of the encoded string
*/
int base64_encode(const unsigned char *src, int srclen, char *dst)
{
int i, bits = 0;
u_int32_t ac = 0;
char *cp = dst;

for (i = 0; i < srclen; i++) {
ac = (ac << 8) | src[i];
bits += 8;
do {
bits -= 6;
*cp++ = base64_table[(ac >> bits) & 0x3f];
} while (bits >= 6);
}
if (bits) {
*cp++ = base64_table[(ac << (6 - bits)) & 0x3f];
bits -= 6;
}
while (bits < 0) {
*cp++ = '=';
bits += 2;
}

return cp - dst;
}

/**
* base64_decode() - base64-decode some bytes
* @src: the base64-encoded string to decode
* @len: number of bytes to decode
* @dst: (output) the decoded bytes.
*
* Decodes the base64-encoded bytes @src according to RFC 4648.
*
* Return: number of decoded bytes
*/
int base64_decode(const char *src, int srclen, unsigned char *dst)
{
u_int32_t ac = 0;
int i, bits = 0;
unsigned char *bp = dst;

for (i = 0; i < srclen; i++) {
const char *p = strchr(base64_table, src[i]);

if (src[i] == '=') {
ac = (ac << 6);
bits += 6;
if (bits >= 8)
bits -= 8;
continue;
}
if (!p || !src[i])
return -EINVAL;
ac = (ac << 6) | (p - base64_table);
bits += 6;
if (bits >= 8) {
bits -= 8;
*bp++ = (unsigned char)(ac >> bits);
}
}
if (ac && ((1 << bits) - 1))
return -EAGAIN;

return bp - dst;
}
8 changes: 8 additions & 0 deletions src/nvme/base64.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/* SPDX-License-Identifier: GPL-2.0-or-later */
#ifndef _BASE64_H
#define _BASE64_H

int base64_encode(const unsigned char *src, int len, char *dst);
int base64_decode(const char *src, int len, unsigned char *dst);

#endif /* _BASE64_H */
Loading

0 comments on commit f284041

Please sign in to comment.