]> git.ipfire.org Git - thirdparty/squid.git/blob - include/base64.h
Crypto-NG: Base64 crypto replacement
[thirdparty/squid.git] / include / base64.h
1 /*
2 * Copyright (C) 1996-2014 The Squid Software Foundation and contributors
3 *
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.
7 */
8
9 #ifndef _SQUID_BASE64_H
10 #define _SQUID_BASE64_H
11
12 #if HAVE_NETTLE_BASE64_H
13 #include <nettle/base64.h>
14
15 #else /* Base64 functions copied from Nettle 3.0 under GPLv2, with adjustments */
16
17 #ifdef __cplusplus
18 extern "C" {
19 #endif
20
21 // Decoding functions
22
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)
26
27 struct base64_decode_ctx
28 {
29 unsigned word; /* Leftover bits */
30 unsigned bits; /* Number buffered bits */
31
32 /* Number of padding characters encountered */
33 unsigned padding;
34 };
35
36 void base64_decode_init(struct base64_decode_ctx *ctx);
37
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.
41 */
42 int base64_decode_update(struct base64_decode_ctx *ctx,
43 size_t *dst_length,
44 uint8_t *dst,
45 size_t src_length,
46 const uint8_t *src);
47
48 /* Returns 1 on success. */
49 int base64_decode_final(struct base64_decode_ctx *ctx);
50
51 // Encoding functions
52
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)
57
58 /* Maximum length of output generated by base64_encode_final. */
59 # define BASE64_ENCODE_FINAL_LENGTH 3
60
61 /* Exact length of output generated by base64_encode_raw, including
62 * padding.
63 */
64 # define BASE64_ENCODE_RAW_LENGTH(length) ((((length) + 2)/3)*4)
65
66 struct base64_encode_ctx
67 {
68 unsigned word; /* Leftover bits */
69 unsigned bits; /* Number of bits, always 0, 2, or 4. */
70 };
71
72 void base64_encode_init(struct base64_encode_ctx *ctx);
73
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);
76
77 /* Returns the number of output characters. DST should point to an
78 * area of size at least BASE64_ENCODE_LENGTH(length).
79 */
80 size_t base64_encode_update(struct base64_encode_ctx *ctx, uint8_t *dst, size_t length, const uint8_t *src);
81
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);
84
85 #ifdef __cplusplus
86 }
87 #endif
88
89 #endif /* HAVE_NETTLE_BASE64_H */
90
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)
94
95 #endif /* _SQUID_BASE64_H */
96