forked from Telodendria/Telodendria
Move Base64 documentation to man page.
This commit is contained in:
parent
5ecb810a88
commit
acffd82b48
4 changed files with 88 additions and 114 deletions
|
@ -1,4 +1,4 @@
|
||||||
.Dd $Mdocdate: September 25 2022 $
|
.Dd $Mdocdate: September 27 2022 $
|
||||||
.Dt ARRAY 3
|
.Dt ARRAY 3
|
||||||
.Os Telodendria Project
|
.Os Telodendria Project
|
||||||
.Sh NAME
|
.Sh NAME
|
||||||
|
@ -87,7 +87,9 @@ the opposite: the second element should appear after the first in the array.
|
||||||
is used to get the element at the specified index.
|
is used to get the element at the specified index.
|
||||||
.Sh RETURN VALUES
|
.Sh RETURN VALUES
|
||||||
.Fn ArrayCreate
|
.Fn ArrayCreate
|
||||||
returns a pointer on the heap to a newly allocated array structure.
|
returns a pointer on the heap to a newly allocated array structure, or
|
||||||
|
.Dv NULL
|
||||||
|
if the allocation fails.
|
||||||
.Pp
|
.Pp
|
||||||
.Fn ArrayGet
|
.Fn ArrayGet
|
||||||
and
|
and
|
||||||
|
|
81
docs/Base64.3
Normal file
81
docs/Base64.3
Normal file
|
@ -0,0 +1,81 @@
|
||||||
|
.Dd $Mdocdate: September 27 2022 $
|
||||||
|
.Dt BASE64 3
|
||||||
|
.Os Telodendria Project
|
||||||
|
.Sh NAME
|
||||||
|
.Nm Base64
|
||||||
|
.Nd A simple base64 encoder/decoder with "unpadded base64" support.
|
||||||
|
.Sh SYNOPSIS
|
||||||
|
.In Base64.h
|
||||||
|
.Ft size_t
|
||||||
|
.Fn Base64EncodedSize "size_t"
|
||||||
|
.Ft size_t
|
||||||
|
.Fn Base64DecodedSize "const char *" "size_t"
|
||||||
|
.Ft char *
|
||||||
|
.Fn Base64Encode "const char *" "size_t"
|
||||||
|
.Ft char *
|
||||||
|
.Fn Base64Decode "const char *" "size_t"
|
||||||
|
.Ft void
|
||||||
|
.Fn Base64Unpad "char *" "size_t"
|
||||||
|
.Ft int
|
||||||
|
.Fn Base64Pad "char **" "size_t"
|
||||||
|
.Sh DESCRIPTION
|
||||||
|
This is an efficient yet simple base64 encoding and decoding
|
||||||
|
library that supports regular base64, as well as the Matrix
|
||||||
|
specification's extension to base64, called "unpadded base64."
|
||||||
|
.Nm provides the ability to convert between the two, instead of
|
||||||
|
just implementing "unpadded base64."
|
||||||
|
.Pp
|
||||||
|
.Fn Base64EncodedSize
|
||||||
|
and
|
||||||
|
.Fn Base64DecodedSize
|
||||||
|
compute the amount of characters needed to store an encoded or
|
||||||
|
decoded message, respectively. Both functions take the size of
|
||||||
|
the message being encoded or decoded, but
|
||||||
|
.Fn Base64DecodedSize
|
||||||
|
also takes a pointer to an encoded string, because a few bytes of
|
||||||
|
the string need to be read in order to compute the size.
|
||||||
|
.Pp
|
||||||
|
.Fn Base64Encode
|
||||||
|
and
|
||||||
|
.Fn Base64Decode
|
||||||
|
do the actual work of encoding and decoding base64 data. They both
|
||||||
|
take a string and its length.
|
||||||
|
.Pp
|
||||||
|
.Fn Base64Unpad
|
||||||
|
and
|
||||||
|
.Fn Base64Pad
|
||||||
|
are used to implement Matrix unpadded base64.
|
||||||
|
.Fn Base64Unpad
|
||||||
|
takes a valid base64 string and strips off the trailing equal signs,
|
||||||
|
as per the specification.
|
||||||
|
.Fn Base64Pad
|
||||||
|
does the opposite; it takes an unpadded base64 input string, and pads
|
||||||
|
it with equal signs as necessary, so that it can be properly decoded
|
||||||
|
with
|
||||||
|
.Fn Base64Decode
|
||||||
|
if necessary. However, the Matrix specification envisons unpadded base64
|
||||||
|
as opaque; that is, once it's encoded, it never needs to be decoded.
|
||||||
|
In practice, a homeserver might need to decode an unpadded base64 string.
|
||||||
|
.Sh RETURN VALUES
|
||||||
|
.Fn Base64EncodedSize
|
||||||
|
and
|
||||||
|
.Fn Base64DecodedSize
|
||||||
|
simply return unsigned integers representing a number of bytes generated
|
||||||
|
from a simple computation.
|
||||||
|
.Pp
|
||||||
|
.Fn Base64Encode
|
||||||
|
and
|
||||||
|
.Fn Base64Decode
|
||||||
|
return pointers to new strings, allocated on the heap, or
|
||||||
|
.Dv NULL
|
||||||
|
if a heap allocation fails. These pointers must be
|
||||||
|
.Xr free 3 -ed
|
||||||
|
at some point when they are no longer needed.
|
||||||
|
.Pp
|
||||||
|
.Fn Base64Unpad
|
||||||
|
modifies the passed string in-place. It thus has no return value, because
|
||||||
|
it cannot fail. If the passed pointer is invalid, the behavior is undefined.
|
||||||
|
.Fn Base64Pad
|
||||||
|
returns a boolean value indicating whether the pad operation was successful.
|
||||||
|
In practice, this function will only fail if a bigger string is necessary, but
|
||||||
|
could not be automatically allocated on the heap.
|
|
@ -1,4 +1,4 @@
|
||||||
.Dd $Mdocdate: September 23 2022 $
|
.Dd $Mdocdate: September 27 2022 $
|
||||||
.Dt TELODENDRIA 7
|
.Dt TELODENDRIA 7
|
||||||
.Os Telodendria Project
|
.Os Telodendria Project
|
||||||
.Sh NAME
|
.Sh NAME
|
||||||
|
@ -88,10 +88,8 @@ up the data directory and you're good to go.
|
||||||
.Sh PROJECT GOALS
|
.Sh PROJECT GOALS
|
||||||
The goals of this project are generally divided into user goals and developer
|
The goals of this project are generally divided into user goals and developer
|
||||||
goals, depending on who they impact the most. This isn't an exaustive list
|
goals, depending on who they impact the most. This isn't an exaustive list
|
||||||
of
|
of the project's goals, but it is a list of things that I want to prioritize,
|
||||||
.Nm 's
|
because other server implementations lack them.
|
||||||
goals, but it is a list of things that I want to prioritize, because other
|
|
||||||
server implementations lack them.
|
|
||||||
.sp
|
.sp
|
||||||
The user goals are as follows:
|
The user goals are as follows:
|
||||||
.Bl -bullet
|
.Bl -bullet
|
||||||
|
|
|
@ -22,133 +22,26 @@
|
||||||
* SOFTWARE.
|
* SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
|
||||||
* Base64.h: An efficient base64 encoder and decoder that supports
|
|
||||||
* both regular base64, and the Matrix spec's "unpadded base64."
|
|
||||||
*/
|
|
||||||
#ifndef TELODENDRIA_BASE64_H
|
#ifndef TELODENDRIA_BASE64_H
|
||||||
#define TELODENDRIA_BASE64_H
|
#define TELODENDRIA_BASE64_H
|
||||||
|
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
|
||||||
/*
|
|
||||||
* Compute the encoded size, including padding, of an input with the
|
|
||||||
* provided size.
|
|
||||||
*
|
|
||||||
* Params:
|
|
||||||
*
|
|
||||||
* (size_t) The size of the input data to be encoded.
|
|
||||||
*
|
|
||||||
* Return: The size of the string needed to hold the data in its
|
|
||||||
* encoded form. Note that base64 is not compression; base64 strings
|
|
||||||
* are actually 25% larger than the unencoded input.
|
|
||||||
*/
|
|
||||||
extern size_t
|
extern size_t
|
||||||
Base64EncodedSize(size_t);
|
Base64EncodedSize(size_t);
|
||||||
|
|
||||||
/*
|
|
||||||
* Compute the decoded size of the provide base64 input and length.
|
|
||||||
*
|
|
||||||
* Note that both the size and the actual base64 string itself is
|
|
||||||
* needed for this computation, unlike Base64EncodedSize(). This is
|
|
||||||
* because base64 strings are padded, and that padding is used in the
|
|
||||||
* calculations.
|
|
||||||
*
|
|
||||||
* Params:
|
|
||||||
*
|
|
||||||
* (const char *) A padded base64 string. If you are dealing with
|
|
||||||
* potentially user-provided base64, you should call
|
|
||||||
* Base64Pad() on it to normalize it before computing
|
|
||||||
* the decoded size.
|
|
||||||
* (size_t) The length of the base64 string. Instead of scanning the
|
|
||||||
* string for a null terminator, and then working backwards,
|
|
||||||
* the length of the string must be passed here.
|
|
||||||
*
|
|
||||||
* Return: The number of bytes that can be decoded from this base64
|
|
||||||
* string. Note that this will be smaller than the length of the base64
|
|
||||||
* string because base64 is larger than the unencoded form.
|
|
||||||
*/
|
|
||||||
extern size_t
|
extern size_t
|
||||||
Base64DecodedSize(const char *, size_t);
|
Base64DecodedSize(const char *, size_t);
|
||||||
|
|
||||||
/*
|
|
||||||
* Copy the given input string to a new string, base64 encoding it in
|
|
||||||
* the process. This function will produce standard padded base64. If
|
|
||||||
* you want unpadded base64, call Base64Unpad() on the return value
|
|
||||||
* of this function.
|
|
||||||
*
|
|
||||||
* Params:
|
|
||||||
*
|
|
||||||
* (const char *) The raw, unencoded input to be encoded as base64.
|
|
||||||
* (size_t) The length of the unencoded input string.
|
|
||||||
*
|
|
||||||
* Return: A new string, allocated on the heap, that holds the base64
|
|
||||||
* representation of the input. This string must be free()-ed when it
|
|
||||||
* is no longer needed. If the allocation of the proper size fails,
|
|
||||||
* or the input is inaccessible, then this function will return NULL.
|
|
||||||
*/
|
|
||||||
extern char *
|
extern char *
|
||||||
Base64Encode(const char *, size_t);
|
Base64Encode(const char *, size_t);
|
||||||
|
|
||||||
/*
|
|
||||||
* Decode a standard padded base64 string. This function expects that
|
|
||||||
* the input will be padded, so if you are recieving untrusted input,
|
|
||||||
* you should run Base64Pad() on it before attempting to decode it.
|
|
||||||
*
|
|
||||||
* Params:
|
|
||||||
*
|
|
||||||
* (const char *) The base64 string to decode.
|
|
||||||
* (size_t) The length of the base64 string to decode.
|
|
||||||
*
|
|
||||||
* Return: A new string, allocated on the heap, that contains the
|
|
||||||
* decoded string, or NULL if a decoding error occurred.
|
|
||||||
*/
|
|
||||||
extern char *
|
extern char *
|
||||||
Base64Decode(const char *, size_t);
|
Base64Decode(const char *, size_t);
|
||||||
|
|
||||||
/*
|
|
||||||
* Remove the padding from a base64 string. This is to implement the
|
|
||||||
* Matrix spec's "unpadded base64" functionality. When base64 strings
|
|
||||||
* are sent to other servers and clients, their padding must be
|
|
||||||
* stripped.
|
|
||||||
*
|
|
||||||
* Params:
|
|
||||||
*
|
|
||||||
* (char *) The base64 string to remove padding from. Note that
|
|
||||||
* this string is modified in place.
|
|
||||||
* (size_t) The length of the provided base64 string.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
extern void
|
extern void
|
||||||
Base64Unpad(char *, size_t);
|
Base64Unpad(char *, size_t);
|
||||||
|
|
||||||
/*
|
|
||||||
* Pad a base64 string in place. This is to implement the Matrix spec's
|
|
||||||
* "unpadded base64." As we will most likely be getting unpadded base64
|
|
||||||
* from clients and other servers, we should pad it before attempting
|
|
||||||
* to decode it.
|
|
||||||
*
|
|
||||||
* I technically could have just had the decoder accept unpadded as
|
|
||||||
* well as padded strings, but Matrix is the only thing I know of that
|
|
||||||
* actually makes "unpadded" base64 a thing, so I thought it best to
|
|
||||||
* make it clear in this library that unpadded base64 is an extension,
|
|
||||||
* not the norm.
|
|
||||||
*
|
|
||||||
* Params:
|
|
||||||
*
|
|
||||||
* (char **) A pointer to a base64 string pointer. The reason we
|
|
||||||
* take a pointer pointer is because the string may need
|
|
||||||
* to be reallocated, as characters may be added to the
|
|
||||||
* end of it. If the string is reallocated, then the
|
|
||||||
* passed pointer must be updated. If the string is not
|
|
||||||
* reallocated, the original pointer is not touched.
|
|
||||||
* (size_t) The length of the given base64 string.
|
|
||||||
*
|
|
||||||
* Return: Whether or not the pad operation was successful. This
|
|
||||||
* function will fail if a larger string cannot be allocated when it
|
|
||||||
* is needed. Note that not all cases require the string to be
|
|
||||||
* reallocated.
|
|
||||||
*/
|
|
||||||
extern int
|
extern int
|
||||||
Base64Pad(char **, size_t);
|
Base64Pad(char **, size_t);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue