Skip to content
Snippets Groups Projects
Commit eb28503d authored by Niels Möller's avatar Niels Möller
Browse files

Major reorganization.

Rev: src/nettle/base64.h:1.8
parent 280dc5c1
No related branches found
No related tags found
No related merge requests found
...@@ -28,56 +28,96 @@ ...@@ -28,56 +28,96 @@
#include <inttypes.h> #include <inttypes.h>
/* Base64 encoding */
#define BASE64_BINARY_BLOCK_SIZE 3 #define BASE64_BINARY_BLOCK_SIZE 3
#define BASE64_TEXT_BLOCK_SIZE 4 #define BASE64_TEXT_BLOCK_SIZE 4
/* Overlapping source and destination is allowed, as long as the start /* Base64 encoding */
* of the source area is not later than the start of the destination
* area. */ /* Maximum length of output for base64_encode_update. NOTE: Doesn't
unsigned /* Returns the length of encoded data */ * include any padding that base64_encode_final may add. */
base64_encode(uint8_t *dst, /* FIXME: Rewrite to only evaluate LENGTH once. */
unsigned src_length, #define BASE64_ENCODE_LENGTH(length) ((length) + ((length) + 2)/3)
/* 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); const uint8_t *src);
/* Precise length of encoded data (including padding) */ /* DST should point to an area of size at least
#define BASE64_ENCODE_LENGTH(src_length) \ * BASE64_ENCODE_FINAL_SIZE */
((BASE64_BINARY_BLOCK_SIZE - 1 + (src_length)) \ unsigned
/ BASE64_BINARY_BLOCK_SIZE * BASE64_TEXT_BLOCK_SIZE) 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 void
base64_encode_group(uint8_t *dst, uint32_t group); 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 */ enum
int16_t shift; /* Bitshift for the next 6-bit segment added to buffer */ {
BASE64_DECODE_OK,
BASE64_DECODE_ERROR,
BASE64_DECODE_END
} status;
unsigned word; /* Leftover bits */
unsigned bits; /* Number buffered bits */
}; };
void void
base64_decode_init(struct base64_ctx *ctx); base64_decode_init(struct base64_decode_ctx *ctx);
/* Overlapping source and destination is allowed, as long as the start /* Returns the number of output characters. DST should point to an
* of the source area is not before the start of the destination * area of size at least BASE64_DECODE_LENGTH(length). */
* area. */ unsigned
unsigned /* Returns the length of decoded data */ base64_decode_update(struct base64_decode_ctx *ctx,
base64_decode_update(struct base64_ctx *ctx,
uint8_t *dst, uint8_t *dst,
unsigned src_length, unsigned length,
const uint8_t *src); const uint8_t *src);
/* Maximum length of decoded data. /* Returns 1 on success. */
* int
* NOTE: This size should work even for improper base 64 data. For base64_decode_status(struct base64_decode_ctx *ctx);
* 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)
#endif /* NETTLE_BASE64_H_INCLUDED */ #endif /* NETTLE_BASE64_H_INCLUDED */
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment