diff --git a/base64.h b/base64.h index 75deb04341cba0012c91c7de19486a2c71d9956f..bb62d6a307f6be5e86442124c5fb9e6793a82091 100644 --- a/base64.h +++ b/base64.h @@ -1,4 +1,4 @@ -/* armor.h +/* base64.h * * "ASCII armor" codecs. */ @@ -23,24 +23,44 @@ * MA 02111-1307, USA. */ -#ifndef NETTLE_ARMOR_H_INCLUDED -#define NETTLE_ARMOR_H_INCLUDED +#ifndef NETTLE_BASE64_H_INCLUDED +#define NETTLE_BASE64_H_INCLUDED #include <inttypes.h> /* Base64 encoding */ -#define BASE64_ASCII_BLOCK_SIZE 4 -#define BASE64_RAW_BLOCK_SIZE 3 +#define BASE64_BINARY_BLOCK_SIZE 3 +#define BASE64_TEXT_BLOCK_SIZE 4 unsigned /* Returns the length of encoded data */ base64_encode(uint8_t *dst, unsigned src_length, const uint8_t *src); +/* 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) + +struct base64_ctx /* Internal, do not modify */ +{ + uint16_t accum; /* Partial byte accumulated so far, filled msb first */ + int16_t shift; /* Bitshift for the next 6-bit segment added to buffer */ +}; + +void +base64_decode_init(struct base64_ctx *ctx); + unsigned /* Returns the length of decoded data */ -base64_decode(uint8_t *dst, - unsigned src_length, - const uint8_t *src); +base64_decode_update(struct base64_ctx *ctx, + uint8_t *dst, + unsigned src_length, + const uint8_t *src); + +/* FIXME: Does this always round correctly? */ +/* Maximum length of decoded data */ +#define BASE64_DECODE_LENGTH(src_length) \ + ((src_length) * BASE64_BINARY_BLOCK_SIZE / BASE64_TEXT_BLOCK_SIZE) -#endif /* NETTLE_ARMOR_H_INCLUDED */ +#endif /* NETTLE_BASE64_H_INCLUDED */