qemu
1/*
2* QEMU base64 helpers
3*
4* Copyright (c) 2015 Red Hat, Inc.
5*
6* This library is free software; you can redistribute it and/or
7* modify it under the terms of the GNU Lesser General Public
8* License as published by the Free Software Foundation; either
9* version 2.1 of the License, or (at your option) any later version.
10*
11* This library is distributed in the hope that it will be useful,
12* but WITHOUT ANY WARRANTY; without even the implied warranty of
13* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14* Lesser General Public License for more details.
15*
16* You should have received a copy of the GNU Lesser General Public
17* License along with this library; if not, see <http://www.gnu.org/licenses/>.
18*
19*/
20
21#include "qemu/osdep.h"22#include "qapi/error.h"23#include "qemu/base64.h"24
25static const char *base64_valid_chars =26"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n";27
28uint8_t *qbase64_decode(const char *input,29size_t in_len,30size_t *out_len,31Error **errp)32{
33*out_len = 0;34
35if (in_len != -1) {36/* Lack of NUL terminator is an error */37if (input[in_len] != '\0') {38error_setg(errp, "Base64 data is not NUL terminated");39return NULL;40}41/* Check there's no NULs embedded since we expect42* this to be valid base64 data */
43if (memchr(input, '\0', in_len) != NULL) {44error_setg(errp, "Base64 data contains embedded NUL characters");45return NULL;46}47
48/* Now we know its a valid nul terminated string49* strspn is safe to use... */
50} else {51in_len = strlen(input);52}53
54if (strspn(input, base64_valid_chars) != in_len) {55error_setg(errp, "Base64 data contains invalid characters");56return NULL;57}58
59return g_base64_decode(input, out_len);60}
61