1 /* base64.h -- Encode binary data using printable characters.
2 Copyright (C) 2004-2006, 2009-2023 Free Software Foundation, Inc.
3 Written by Simon Josefsson.
4
5 This file is free software: you can redistribute it and/or modify
6 it under the terms of the GNU Lesser General Public License as
7 published by the Free Software Foundation; either version 2.1 of the
8 License, or (at your option) any later version.
9
10 This file is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public License
16 along with this program. If not, see <https://www.gnu.org/licenses/>. */
17
18 #ifndef BASE64_H
19 # define BASE64_H
20
21 /* This file uses _GL_ATTRIBUTE_CONST. */
22 #if !_GL_CONFIG_H_INCLUDED
23 #error "Please include config.h first."
24 #endif
25
26 /* Get idx_t. */
27 # include <idx.h>
28
29 # ifdef __cplusplus
30 extern "C" {
31 # endif
32
33 /* This uses that the expression (n+(k-1))/k means the smallest
34 integer >= n/k, i.e., the ceiling of n/k. */
35 # define BASE64_LENGTH(inlen) ((((inlen) + 2) / 3) * 4)
36
37 struct base64_decode_context
38 {
39 int i;
40 char buf[4];
41 };
42
43 extern bool isbase64 (char ch) _GL_ATTRIBUTE_CONST;
44
45 extern void base64_encode (const char *restrict in, idx_t inlen,
46 char *restrict out, idx_t outlen);
47
48 extern idx_t base64_encode_alloc (const char *in, idx_t inlen, char **out);
49
50 extern void base64_decode_ctx_init (struct base64_decode_context *ctx);
51
52 extern bool base64_decode_ctx (struct base64_decode_context *ctx,
53 const char *restrict in, idx_t inlen,
54 char *restrict out, idx_t *outlen);
55
56 extern bool base64_decode_alloc_ctx (struct base64_decode_context *ctx,
57 const char *in, idx_t inlen,
58 char **out, idx_t *outlen);
59
60 #define base64_decode(in, inlen, out, outlen) \
61 base64_decode_ctx (NULL, in, inlen, out, outlen)
62
63 #define base64_decode_alloc(in, inlen, out, outlen) \
64 base64_decode_alloc_ctx (NULL, in, inlen, out, outlen)
65
66 # ifdef __cplusplus
67 }
68 # endif
69
70 #endif /* BASE64_H */