Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Brian Smith
nettle
Commits
eb28503d
Commit
eb28503d
authored
Oct 19, 2002
by
Niels Möller
Browse files
Major reorganization.
Rev: src/nettle/base64.h:1.8
parent
280dc5c1
Changes
1
Hide whitespace changes
Inline
Side-by-side
base64.h
View file @
eb28503d
...
...
@@ -28,56 +28,96 @@
#include <inttypes.h>
/* Base64 encoding */
#define BASE64_BINARY_BLOCK_SIZE 3
#define BASE64_TEXT_BLOCK_SIZE 4
/* Overlapping source and destination is allowed, as long as the start
* of the source area is not later than the start of the destination
* area. */
unsigned
/* Returns the length of encoded data */
base64_encode
(
uint8_t
*
dst
,
unsigned
src_length
,
const
uint8_t
*
src
);
/* Base64 encoding */
/* Maximum length of output for base64_encode_update. NOTE: Doesn't
* include any padding that base64_encode_final may add. */
/* FIXME: Rewrite to only evaluate LENGTH once. */
#define BASE64_ENCODE_LENGTH(length) ((length) + ((length) + 2)/3)
/* Precise length of encoded data (including padding) */
#define BASE64_ENCODE_LENGTH(src_length) \
((BASE64_BINARY_BLOCK_SIZE - 1 + (src_length)) \
/ BASE64_BINARY_BLOCK_SIZE * BASE64_TEXT_BLOCK_SIZE)
/* Maximum lengbth of output generated by base64_encode_final. */
#define BASE64_ENCODE_FINAL_LENGTH 3
/* Exact length of output generated by base64_encode_raw, including
* padding. */
#define BASE64_ENCODE_RAW_LENGTH(length) ((((length) + 2)/3)*4)
struct
base64_encode_ctx
{
unsigned
word
;
/* Leftover bits */
unsigned
bits
;
/* Number of bits, always 0, 2, or 4. */
};
void
base64_encode_init
(
struct
base64_encode_ctx
*
ctx
);
/* Encodes a single byte. Returns amoutn of output (always 1 or 2). */
unsigned
base64_encode_single
(
struct
base64_encode_ctx
*
ctx
,
uint8_t
*
dst
,
uint8_t
src
);
/* Returns the number of output characters. DST should point to an
* area of size at least BASE64_ENCODE_LENGTH(length). */
unsigned
base64_encode_update
(
struct
base64_encode_ctx
*
ctx
,
uint8_t
*
dst
,
unsigned
length
,
const
uint8_t
*
src
);
/* DST should point to an area of size at least
* BASE64_ENCODE_FINAL_SIZE */
unsigned
base64_encode_final
(
struct
base64_encode_ctx
*
ctx
,
uint8_t
*
dst
);
/* Lower level functions */
/* Encodes a string in one go, including any padding at the end.
* Generates exactly BASE64_ENCODE_RAW_LENGTH(length) bytes of output.
* Supports overlapped operation, if src <= dst. */
void
base64_encode_raw
(
uint8_t
*
dst
,
unsigned
length
,
const
uint8_t
*
src
);
/* Encode a single group */
void
base64_encode_group
(
uint8_t
*
dst
,
uint32_t
group
);
/* FIXME: Perhaps rename to base64_decode_ctx? */
struct
base64_ctx
/* Internal, do not modify */
/* Base64 decoding */
/* FIXME: Think more about this definition. */
#define BASE64_DECODE_LENGTH(length) \
((length) * BASE64_BINARY_BLOCK_SIZE / BASE64_TEXT_BLOCK_SIZE)
struct
base64_decode_ctx
{
uint16_t
accum
;
/* Partial byte accumulated so far, filled msb first */
int16_t
shift
;
/* Bitshift for the next 6-bit segment added to buffer */
enum
{
BASE64_DECODE_OK
,
BASE64_DECODE_ERROR
,
BASE64_DECODE_END
}
status
;
unsigned
word
;
/* Leftover bits */
unsigned
bits
;
/* Number buffered bits */
};
void
base64_decode_init
(
struct
base64_ctx
*
ctx
);
/* Overlapping source and destination is allowed, as long as the start
* of the source area is not before the start of the destination
* area. */
unsigned
/* Returns the length of decoded data */
base64_decode_update
(
struct
base64_ctx
*
ctx
,
uint8_t
*
dst
,
unsigned
src_length
,
const
uint8_t
*
src
);
/* Maximum length of decoded data.
*
* NOTE: This size should work even for improper base 64 data. For
* example, consider an (encoded) input string of two bytes. When
* we'll generate one byte of output before noticing that the input is
* truncated. And BASE64_DECODE_LENGTH(2) == 2*3/4 == 1, so that is
* just fine. */
#define BASE64_DECODE_LENGTH(src_length) \
((src_length) * BASE64_BINARY_BLOCK_SIZE / BASE64_TEXT_BLOCK_SIZE)
base64_decode_init
(
struct
base64_decode_ctx
*
ctx
);
/* Returns the number of output characters. DST should point to an
* area of size at least BASE64_DECODE_LENGTH(length). */
unsigned
base64_decode_update
(
struct
base64_decode_ctx
*
ctx
,
uint8_t
*
dst
,
unsigned
length
,
const
uint8_t
*
src
);
/* Returns 1 on success. */
int
base64_decode_status
(
struct
base64_decode_ctx
*
ctx
);
#endif
/* NETTLE_BASE64_H_INCLUDED */
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment