xref: /freebsd/contrib/unbound/sldns/parseutil.h (revision a39a5a6905612447def27b66ffe73b9d11efd80c)
109a3aaf3SDag-Erling Smørgrav /*
209a3aaf3SDag-Erling Smørgrav  * parseutil.h - parse utilities for string and wire conversion
309a3aaf3SDag-Erling Smørgrav  *
409a3aaf3SDag-Erling Smørgrav  * (c) NLnet Labs, 2004
509a3aaf3SDag-Erling Smørgrav  *
609a3aaf3SDag-Erling Smørgrav  * See the file LICENSE for the license
709a3aaf3SDag-Erling Smørgrav  */
809a3aaf3SDag-Erling Smørgrav /**
909a3aaf3SDag-Erling Smørgrav  * \file
1009a3aaf3SDag-Erling Smørgrav  *
1109a3aaf3SDag-Erling Smørgrav  * Utility functions for parsing, base32(DNS variant) and base64 encoding
1209a3aaf3SDag-Erling Smørgrav  * and decoding, Hex, Time units, Escape codes.
1309a3aaf3SDag-Erling Smørgrav  */
1409a3aaf3SDag-Erling Smørgrav 
1509a3aaf3SDag-Erling Smørgrav #ifndef LDNS_PARSEUTIL_H
1609a3aaf3SDag-Erling Smørgrav #define LDNS_PARSEUTIL_H
1709a3aaf3SDag-Erling Smørgrav struct tm;
1809a3aaf3SDag-Erling Smørgrav 
1909a3aaf3SDag-Erling Smørgrav /**
2009a3aaf3SDag-Erling Smørgrav  *  A general purpose lookup table
2109a3aaf3SDag-Erling Smørgrav  *
2209a3aaf3SDag-Erling Smørgrav  *  Lookup tables are arrays of (id, name) pairs,
2309a3aaf3SDag-Erling Smørgrav  *  So you can for instance lookup the RCODE 3, which is "NXDOMAIN",
2409a3aaf3SDag-Erling Smørgrav  *  and vice versa. The lookup tables themselves are defined wherever needed,
2509a3aaf3SDag-Erling Smørgrav  *  for instance in host2str.c
2609a3aaf3SDag-Erling Smørgrav  */
2709a3aaf3SDag-Erling Smørgrav struct sldns_struct_lookup_table {
2809a3aaf3SDag-Erling Smørgrav         int id;
2909a3aaf3SDag-Erling Smørgrav         const char *name;
3009a3aaf3SDag-Erling Smørgrav };
3109a3aaf3SDag-Erling Smørgrav typedef struct sldns_struct_lookup_table sldns_lookup_table;
3209a3aaf3SDag-Erling Smørgrav 
3309a3aaf3SDag-Erling Smørgrav /**
3409a3aaf3SDag-Erling Smørgrav  * Looks up the table entry by name, returns NULL if not found.
3509a3aaf3SDag-Erling Smørgrav  * \param[in] table the lookup table to search in
3609a3aaf3SDag-Erling Smørgrav  * \param[in] name what to search for
3709a3aaf3SDag-Erling Smørgrav  * \return the item found
3809a3aaf3SDag-Erling Smørgrav  */
3909a3aaf3SDag-Erling Smørgrav sldns_lookup_table *sldns_lookup_by_name(sldns_lookup_table table[],
4009a3aaf3SDag-Erling Smørgrav                                        const char *name);
4109a3aaf3SDag-Erling Smørgrav /**
4209a3aaf3SDag-Erling Smørgrav  * Looks up the table entry by id, returns NULL if not found.
4309a3aaf3SDag-Erling Smørgrav  * \param[in] table the lookup table to search in
4409a3aaf3SDag-Erling Smørgrav  * \param[in] id what to search for
4509a3aaf3SDag-Erling Smørgrav  * \return the item found
4609a3aaf3SDag-Erling Smørgrav  */
4709a3aaf3SDag-Erling Smørgrav sldns_lookup_table *sldns_lookup_by_id(sldns_lookup_table table[], int id);
4809a3aaf3SDag-Erling Smørgrav 
4909a3aaf3SDag-Erling Smørgrav /**
5009a3aaf3SDag-Erling Smørgrav  * Convert TM to seconds since epoch (midnight, January 1st, 1970).
5109a3aaf3SDag-Erling Smørgrav  * Like timegm(3), which is not always available.
5209a3aaf3SDag-Erling Smørgrav  * \param[in] tm a struct tm* with the date
5309a3aaf3SDag-Erling Smørgrav  * \return the seconds since epoch
5409a3aaf3SDag-Erling Smørgrav  */
5509a3aaf3SDag-Erling Smørgrav time_t sldns_mktime_from_utc(const struct tm *tm);
5609a3aaf3SDag-Erling Smørgrav 
5709a3aaf3SDag-Erling Smørgrav /**
5809a3aaf3SDag-Erling Smørgrav  * The function interprets time as the number of seconds since epoch
5905ab2901SDag-Erling Smørgrav  * with respect to now using serial arithmetics (rfc1982).
6009a3aaf3SDag-Erling Smørgrav  * That number of seconds is then converted to broken-out time information.
6124e36522SCy Schubert  * This is especially useful when converting the inception and expiration
6209a3aaf3SDag-Erling Smørgrav  * fields of RRSIG records.
6309a3aaf3SDag-Erling Smørgrav  *
6409a3aaf3SDag-Erling Smørgrav  * \param[in] time number of seconds since epoch (midnight, January 1st, 1970)
658a384985SDag-Erling Smørgrav  *            to be interpreted as a serial arithmetics number relative to now.
6609a3aaf3SDag-Erling Smørgrav  * \param[in] now number of seconds since epoch (midnight, January 1st, 1970)
6709a3aaf3SDag-Erling Smørgrav  *            to which the time value is compared to determine the final value.
6809a3aaf3SDag-Erling Smørgrav  * \param[out] result the struct with the broken-out time information
6909a3aaf3SDag-Erling Smørgrav  * \return result on success or NULL on error
7009a3aaf3SDag-Erling Smørgrav  */
718a384985SDag-Erling Smørgrav struct tm * sldns_serial_arithmetics_gmtime_r(int32_t time, time_t now, struct tm *result);
7209a3aaf3SDag-Erling Smørgrav 
7309a3aaf3SDag-Erling Smørgrav /**
7409a3aaf3SDag-Erling Smørgrav  * converts a ttl value (like 5d2h) to a long.
7509a3aaf3SDag-Erling Smørgrav  * \param[in] nptr the start of the string
7609a3aaf3SDag-Erling Smørgrav  * \param[out] endptr points to the last char in case of error
77*a39a5a69SCy Schubert  * \param[out] overflow returns if the string causes integer overflow error,
78*a39a5a69SCy Schubert  * 	       the number is too big, string of digits too long.
7909a3aaf3SDag-Erling Smørgrav  * \return the convert duration value
8009a3aaf3SDag-Erling Smørgrav  */
81*a39a5a69SCy Schubert uint32_t sldns_str2period(const char *nptr, const char **endptr, int* overflow);
8209a3aaf3SDag-Erling Smørgrav 
8309a3aaf3SDag-Erling Smørgrav /**
8409a3aaf3SDag-Erling Smørgrav  * Returns the int value of the given (hex) digit
8509a3aaf3SDag-Erling Smørgrav  * \param[in] ch the hex char to convert
8609a3aaf3SDag-Erling Smørgrav  * \return the converted decimal value
8709a3aaf3SDag-Erling Smørgrav  */
8809a3aaf3SDag-Erling Smørgrav int sldns_hexdigit_to_int(char ch);
8909a3aaf3SDag-Erling Smørgrav 
9009a3aaf3SDag-Erling Smørgrav /**
9109a3aaf3SDag-Erling Smørgrav  * calculates the size needed to store the result of b64_ntop
9209a3aaf3SDag-Erling Smørgrav  */
9309a3aaf3SDag-Erling Smørgrav size_t sldns_b64_ntop_calculate_size(size_t srcsize);
9409a3aaf3SDag-Erling Smørgrav 
9509a3aaf3SDag-Erling Smørgrav int sldns_b64_ntop(uint8_t const *src, size_t srclength,
9609a3aaf3SDag-Erling Smørgrav 	char *target, size_t targsize);
97c0caa2e2SCy Schubert int sldns_b64url_ntop(uint8_t const *src, size_t srclength, char *target,
98c0caa2e2SCy Schubert 	size_t targsize);
9909a3aaf3SDag-Erling Smørgrav 
10009a3aaf3SDag-Erling Smørgrav /**
10109a3aaf3SDag-Erling Smørgrav  * calculates the size needed to store the result of sldns_b64_pton
10209a3aaf3SDag-Erling Smørgrav  */
10309a3aaf3SDag-Erling Smørgrav size_t sldns_b64_pton_calculate_size(size_t srcsize);
10409a3aaf3SDag-Erling Smørgrav int sldns_b64_pton(char const *src, uint8_t *target, size_t targsize);
105c0caa2e2SCy Schubert int sldns_b64url_pton(char const *src, size_t srcsize, uint8_t *target,
106c0caa2e2SCy Schubert 	size_t targsize);
1075469a995SCy Schubert int sldns_b64_contains_nonurl(char const *src, size_t srcsize);
10809a3aaf3SDag-Erling Smørgrav 
10909a3aaf3SDag-Erling Smørgrav /**
11009a3aaf3SDag-Erling Smørgrav  * calculates the size needed to store the result of b32_ntop
11109a3aaf3SDag-Erling Smørgrav  */
11209a3aaf3SDag-Erling Smørgrav size_t sldns_b32_ntop_calculate_size(size_t src_data_length);
11309a3aaf3SDag-Erling Smørgrav 
11409a3aaf3SDag-Erling Smørgrav size_t sldns_b32_ntop_calculate_size_no_padding(size_t src_data_length);
11509a3aaf3SDag-Erling Smørgrav 
11609a3aaf3SDag-Erling Smørgrav int sldns_b32_ntop(const uint8_t* src_data, size_t src_data_length,
11709a3aaf3SDag-Erling Smørgrav 	char* target_text_buffer, size_t target_text_buffer_size);
11809a3aaf3SDag-Erling Smørgrav 
11909a3aaf3SDag-Erling Smørgrav int sldns_b32_ntop_extended_hex(const uint8_t* src_data, size_t src_data_length,
12009a3aaf3SDag-Erling Smørgrav 	char* target_text_buffer, size_t target_text_buffer_size);
12109a3aaf3SDag-Erling Smørgrav 
12209a3aaf3SDag-Erling Smørgrav /**
12309a3aaf3SDag-Erling Smørgrav  * calculates the size needed to store the result of b32_pton
12409a3aaf3SDag-Erling Smørgrav  */
12509a3aaf3SDag-Erling Smørgrav size_t sldns_b32_pton_calculate_size(size_t src_text_length);
12609a3aaf3SDag-Erling Smørgrav 
12709a3aaf3SDag-Erling Smørgrav int sldns_b32_pton(const char* src_text, size_t src_text_length,
12809a3aaf3SDag-Erling Smørgrav 	uint8_t* target_data_buffer, size_t target_data_buffer_size);
12909a3aaf3SDag-Erling Smørgrav 
13009a3aaf3SDag-Erling Smørgrav int sldns_b32_pton_extended_hex(const char* src_text, size_t src_text_length,
13109a3aaf3SDag-Erling Smørgrav 	uint8_t* target_data_buffer, size_t target_data_buffer_size);
13209a3aaf3SDag-Erling Smørgrav 
13309a3aaf3SDag-Erling Smørgrav /*
13409a3aaf3SDag-Erling Smørgrav  * Checks whether the escaped value at **s is an octal value or
13509a3aaf3SDag-Erling Smørgrav  * a 'normally' escaped character (and not eos)
13609a3aaf3SDag-Erling Smørgrav  *
13709a3aaf3SDag-Erling Smørgrav  * @param ch_p: the parsed character
13809a3aaf3SDag-Erling Smørgrav  * @param str_p: the string. moved along for characters read.
13909a3aaf3SDag-Erling Smørgrav  * The string pointer at *s is increased by either 0 (on error), 1 (on
14009a3aaf3SDag-Erling Smørgrav  * normal escapes), or 3 (on octals)
14109a3aaf3SDag-Erling Smørgrav  *
14209a3aaf3SDag-Erling Smørgrav  * @return 0 on error
14309a3aaf3SDag-Erling Smørgrav  */
14409a3aaf3SDag-Erling Smørgrav int sldns_parse_escape(uint8_t *ch_p, const char** str_p);
14509a3aaf3SDag-Erling Smørgrav 
14609a3aaf3SDag-Erling Smørgrav /**
14709a3aaf3SDag-Erling Smørgrav  * Parse one character, with escape codes,
14809a3aaf3SDag-Erling Smørgrav  * @param ch_p: the parsed character
14909a3aaf3SDag-Erling Smørgrav  * @param str_p: the string. moved along for characters read.
15009a3aaf3SDag-Erling Smørgrav  * @return 0 on error
15109a3aaf3SDag-Erling Smørgrav  */
15209a3aaf3SDag-Erling Smørgrav int sldns_parse_char(uint8_t *ch_p, const char** str_p);
15309a3aaf3SDag-Erling Smørgrav 
15409a3aaf3SDag-Erling Smørgrav #endif /* LDNS_PARSEUTIL_H */
155