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