]>
git.ipfire.org Git - thirdparty/squid.git/blob - include/base64.h
2 * Copyright (C) 1996-2017 The Squid Software Foundation and contributors
4 * Squid software is distributed under GPLv2+ license and includes
5 * contributions from numerous individuals and organizations.
6 * Please see the COPYING and CONTRIBUTORS files for details.
9 #ifndef _SQUID_BASE64_H
10 #define _SQUID_BASE64_H
12 #if HAVE_NETTLE_BASE64_H && HAVE_NETTLE30_BASE64
13 #include <nettle/base64.h>
15 #else /* Base64 functions copied from Nettle 3.0 under GPLv2, with adjustments */
23 /// Maximum length of output for base64_decode_update.
24 /// We have at most 6 buffered bits, and a total of (length + 1) * 6 bits.
25 # define BASE64_DECODE_LENGTH(length) ((((length) + 1) * 6) / 8)
27 struct base64_decode_ctx
29 unsigned word
; /* Leftover bits */
30 unsigned bits
; /* Number buffered bits */
32 /* Number of padding characters encountered */
36 void base64_decode_init(struct base64_decode_ctx
*ctx
);
38 /* Returns 1 on success, 0 on error. DST should point to an area of
39 * size at least BASE64_DECODE_LENGTH(length). The amount of data
40 * generated is returned in *DST_LENGTH.
42 int base64_decode_update(struct base64_decode_ctx
*ctx
,
48 /* Returns 1 on success. */
49 int base64_decode_final(struct base64_decode_ctx
*ctx
);
53 /* Maximum length of output for base64_encode_update. NOTE: Doesn't
54 * include any padding that base64_encode_final may add. */
55 /* We have at most 4 buffered bits, and a total of (4 + length * 8) bits. */
56 # define BASE64_ENCODE_LENGTH(length) (((length) * 8 + 4)/6)
58 /* Maximum length of output generated by base64_encode_final. */
59 # define BASE64_ENCODE_FINAL_LENGTH 3
61 /* Exact length of output generated by base64_encode_raw, including
64 # define BASE64_ENCODE_RAW_LENGTH(length) ((((length) + 2)/3)*4)
66 struct base64_encode_ctx
68 unsigned word
; /* Leftover bits */
69 unsigned bits
; /* Number of bits, always 0, 2, or 4. */
72 void base64_encode_init(struct base64_encode_ctx
*ctx
);
74 /// Encodes a single byte. Returns amount of output (always 1 or 2).
75 size_t base64_encode_single(struct base64_encode_ctx
*ctx
, uint8_t *dst
, uint8_t src
);
77 /* Returns the number of output characters. DST should point to an
78 * area of size at least BASE64_ENCODE_LENGTH(length).
80 size_t base64_encode_update(struct base64_encode_ctx
*ctx
, uint8_t *dst
, size_t length
, const uint8_t *src
);
82 /// DST should point to an area of size at least BASE64_ENCODE_FINAL_LENGTH
83 size_t base64_encode_final(struct base64_encode_ctx
*ctx
, uint8_t *dst
);
89 #endif /* HAVE_NETTLE_BASE64_H */
91 /// Calculate the buffer size required to hold the encoded form of
92 /// a string of length 'decodedLen' including all terminator bytes.
93 # define base64_encode_len(length) (BASE64_ENCODE_LENGTH(length)+BASE64_ENCODE_FINAL_LENGTH+1)
95 #endif /* _SQUID_BASE64_H */