This is an automated email from Gerrit.

"Bernhard Rosenkraenzer <b...@baylibre.com>" just uploaded a new patch set to 
Gerrit, which you can find at https://review.openocd.org/c/openocd/+/8895

-- gerrit

commit 7cdd566109499fedd5442cf1c586ac813213d688
Author: Bernhard Rosenkränzer <b...@baylibre.com>
Date:   Tue May 6 01:07:06 2025 +0200

    Add base64 encoding/decoding helpers from FreeBSD
    
    These helpers are needed by the updated RISC-V target files.
    
    Change-Id: I5aa9f4e58eb75e1c7a1e8e0e3961725e2a915ebb
    Signed-off-by: Bernhard Rosenkränzer <b...@baylibre.com>

diff --git a/src/helper/Makefile.am b/src/helper/Makefile.am
index e0fa331ea2..e69ca7aa21 100644
--- a/src/helper/Makefile.am
+++ b/src/helper/Makefile.am
@@ -3,6 +3,7 @@
 noinst_LTLIBRARIES += %D%/libhelper.la
 
 %C%_libhelper_la_SOURCES = \
+       %D%/base64.c \
        %D%/binarybuffer.c \
        %D%/options.c \
        %D%/time_support_common.c \
@@ -18,6 +19,7 @@ noinst_LTLIBRARIES += %D%/libhelper.la
        %D%/jim-nvp.c \
        %D%/nvp.c \
        %D%/align.h \
+       %D%/base64.h \
        %D%/binarybuffer.h \
        %D%/bits.h \
        %D%/configuration.h \
diff --git a/src/helper/base64.c b/src/helper/base64.c
new file mode 100644
index 0000000000..5e0ee0846e
--- /dev/null
+++ b/src/helper/base64.c
@@ -0,0 +1,160 @@
+// SPDX-License-Identifier: BSD-3-Clause
+
+/*
+ * Base64 encoding/decoding (RFC1341)
+ * Copyright (c) 2005-2011, Jouni Malinen <j...@w1.fi>
+ *
+ * Original file from FreeBSD code
+ * 
https://cgit.freebsd.org/src/tree/contrib/wpa/src/utils/base64.c?id=f05cddf940db
+ */
+
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "base64.h"
+
+static const unsigned char base64_table[65] =
+       "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+
+/**
+ * base64_encode - Base64 encode
+ * @src: Data to be encoded
+ * @len: Length of the data to be encoded
+ * @out_len: Pointer to output length variable, or %NULL if not used
+ * Returns: Allocated buffer of out_len bytes of encoded data,
+ * or %NULL on failure
+ *
+ * Caller is responsible for freeing the returned buffer. Returned buffer is
+ * nul terminated to make it easier to use as a C string. The nul terminator is
+ * not included in out_len.
+ */
+unsigned char *base64_encode(const unsigned char *src, size_t len,
+                             size_t *out_len)
+{
+       unsigned char *out, *pos;
+       const unsigned char *end, *in;
+       size_t olen;
+       int line_len;
+
+       olen = len * 4 / 3 + 4; /* 3-byte blocks to 4-byte */
+       olen += olen / 72; /* line feeds */
+       olen++; /* nul termination */
+       if (olen < len)
+               return NULL; /* integer overflow */
+       out = malloc(olen);
+       if (!out)
+               return NULL;
+
+       end = src + len;
+       in = src;
+       pos = out;
+       line_len = 0;
+       while (end - in >= 3) {
+               *pos++ = base64_table[in[0] >> 2];
+               *pos++ = base64_table[((in[0] & 0x03) << 4) | (in[1] >> 4)];
+               *pos++ = base64_table[((in[1] & 0x0f) << 2) | (in[2] >> 6)];
+               *pos++ = base64_table[in[2] & 0x3f];
+               in += 3;
+               line_len += 4;
+               if (line_len >= 72) {
+                       *pos++ = '\n';
+                       line_len = 0;
+               }
+       }
+
+       if (end - in) {
+               *pos++ = base64_table[in[0] >> 2];
+               if (end - in == 1) {
+                       *pos++ = base64_table[(in[0] & 0x03) << 4];
+                       *pos++ = '=';
+               } else {
+                       *pos++ = base64_table[((in[0] & 0x03) << 4) |
+                                             (in[1] >> 4)];
+                       *pos++ = base64_table[(in[1] & 0x0f) << 2];
+               }
+               *pos++ = '=';
+               line_len += 4;
+       }
+
+       if (line_len)
+               *pos++ = '\n';
+
+       *pos = '\0';
+       if (out_len)
+               *out_len = pos - out;
+       return out;
+}
+
+
+/**
+ * base64_decode - Base64 decode
+ * @src: Data to be decoded
+ * @len: Length of the data to be decoded
+ * @out_len: Pointer to output length variable
+ * Returns: Allocated buffer of out_len bytes of decoded data,
+ * or %NULL on failure
+ *
+ * Caller is responsible for freeing the returned buffer.
+ */
+unsigned char *base64_decode(const unsigned char *src, size_t len,
+                             size_t *out_len)
+{
+       unsigned char dtable[256], *out, *pos, block[4], tmp;
+       size_t i, count, olen;
+       int pad = 0;
+
+       memset(dtable, 0x80, 256);
+       for (i = 0; i < sizeof(base64_table) - 1; i++)
+               dtable[base64_table[i]] = (unsigned char)i;
+       dtable['='] = 0;
+
+       count = 0;
+       for (i = 0; i < len; i++) {
+               if (dtable[src[i]] != 0x80)
+                       count++;
+       }
+
+       if (count == 0 || count % 4)
+               return NULL;
+
+       olen = count / 4 * 3;
+       out = malloc(olen);
+       if (!out)
+               return NULL;
+       pos = out;
+
+       count = 0;
+       for (i = 0; i < len; i++) {
+               tmp = dtable[src[i]];
+               if (tmp == 0x80)
+                       continue;
+
+               if (src[i] == '=')
+                       pad++;
+               block[count] = tmp;
+               count++;
+               if (count == 4) {
+                       *pos++ = (block[0] << 2) | (block[1] >> 4);
+                       *pos++ = (block[1] << 4) | (block[2] >> 2);
+                       *pos++ = (block[2] << 6) | block[3];
+                       count = 0;
+                       if (pad) {
+                               if (pad == 1) {
+                                       pos--;
+                               } else if (pad == 2) {
+                                       pos -= 2;
+                               } else {
+                                       /* Invalid padding */
+                                       free(out);
+                                       return NULL;
+                               }
+                               break;
+                       }
+               }
+       }
+
+       *out_len = pos - out;
+       return out;
+}
diff --git a/src/helper/base64.h b/src/helper/base64.h
new file mode 100644
index 0000000000..77515fda00
--- /dev/null
+++ b/src/helper/base64.h
@@ -0,0 +1,19 @@
+// SPDX-License-Identifier: BSD-3-Clause
+
+/*
+ * Base64 encoding/decoding (RFC1341)
+ * Copyright (c) 2005, Jouni Malinen <j...@w1.fi>
+ *
+ * Original file from FreeBSD code
+ * 
https://cgit.freebsd.org/src/tree/contrib/wpa/src/utils/base64.h?id=f05cddf940db
+ */
+
+#ifndef BASE64_H
+#define BASE64_H
+
+unsigned char *base64_encode(const unsigned char *src, size_t len,
+                             size_t *out_len);
+unsigned char *base64_decode(const unsigned char *src, size_t len,
+                             size_t *out_len);
+
+#endif /* BASE64_H */

-- 

Reply via email to