123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980 |
- /*
- This file is part of GNUnet
- Copyright (C) 2010-2014 GNUnet e.V.
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
- SPDX-License-Identifier: AGPL3.0-or-later
- */
- /**
- * @author Philipp Toelke
- * @author Christian Grothoff
- *
- * @file
- * API for helper library to parse DNS packets.
- *
- * @defgroup dns-parser DNS parser library
- * Helper library to parse DNS packets.
- * @{
- */
- #ifndef GNUNET_DNSPARSER_LIB_H
- #define GNUNET_DNSPARSER_LIB_H
- #include "gnunet_util_lib.h"
- /**
- * Maximum length of a label in DNS.
- */
- #define GNUNET_DNSPARSER_MAX_LABEL_LENGTH 63
- /**
- * Maximum length of a name in DNS.
- */
- #define GNUNET_DNSPARSER_MAX_NAME_LENGTH 253
- /**
- * A few common DNS types.
- */
- #define GNUNET_DNSPARSER_TYPE_ANY 0
- #define GNUNET_DNSPARSER_TYPE_A 1
- #define GNUNET_DNSPARSER_TYPE_NS 2
- #define GNUNET_DNSPARSER_TYPE_CNAME 5
- #define GNUNET_DNSPARSER_TYPE_SOA 6
- #define GNUNET_DNSPARSER_TYPE_PTR 12
- #define GNUNET_DNSPARSER_TYPE_MX 15
- #define GNUNET_DNSPARSER_TYPE_TXT 16
- #define GNUNET_DNSPARSER_TYPE_RP 17
- #define GNUNET_DNSPARSER_TYPE_AFSDB 18
- #define GNUNET_DNSPARSER_TYPE_SIG 24
- #define GNUNET_DNSPARSER_TYPE_KEY 25
- #define GNUNET_DNSPARSER_TYPE_AAAA 28
- #define GNUNET_DNSPARSER_TYPE_LOC 29
- #define GNUNET_DNSPARSER_TYPE_SRV 33
- #define GNUNET_DNSPARSER_TYPE_NAPTR 35
- #define GNUNET_DNSPARSER_TYPE_KX 36
- #define GNUNET_DNSPARSER_TYPE_CERT 37
- #define GNUNET_DNSPARSER_TYPE_DNAME 39
- #define GNUNET_DNSPARSER_TYPE_APL 42
- #define GNUNET_DNSPARSER_TYPE_DS 43
- #define GNUNET_DNSPARSER_TYPE_SSHFP 44
- #define GNUNET_DNSPARSER_TYPE_IPSECKEY 45
- #define GNUNET_DNSPARSER_TYPE_RRSIG 46
- #define GNUNET_DNSPARSER_TYPE_NSEC 47
- #define GNUNET_DNSPARSER_TYPE_DNSKEY 48
- #define GNUNET_DNSPARSER_TYPE_DHCID 49
- #define GNUNET_DNSPARSER_TYPE_NSEC3 50
- #define GNUNET_DNSPARSER_TYPE_NSEC3PARAM 51
- #define GNUNET_DNSPARSER_TYPE_TLSA 52
- #define GNUNET_DNSPARSER_TYPE_HIP 55
- #define GNUNET_DNSPARSER_TYPE_CDS 59
- #define GNUNET_DNSPARSER_TYPE_CDNSKEY 60
- #define GNUNET_DNSPARSER_TYPE_OPENPGPKEY 61
- #define GNUNET_DNSPARSER_TYPE_TKEY 249
- #define GNUNET_DNSPARSER_TYPE_TSIG 250
- #define GNUNET_DNSPARSER_TYPE_ALL 255
- #define GNUNET_DNSPARSER_TYPE_URI 256
- #define GNUNET_DNSPARSER_TYPE_CAA 257
- #define GNUNET_DNSPARSER_TYPE_TA 32768
- /**
- * A DNS query.
- */
- struct GNUNET_DNSPARSER_Query
- {
- /**
- * Name of the record that the query is for (0-terminated).
- * In UTF-8 format. The library will convert from and to DNS-IDNA
- * as necessary. Use #GNUNET_DNSPARSER_check_label() to test if an
- * individual label is well-formed. If a given name is not well-formed,
- * creating the DNS packet will fail.
- */
- char *name;
- /**
- * See GNUNET_DNSPARSER_TYPE_*.
- */
- uint16_t type;
- /**
- * See GNUNET_TUN_DNS_CLASS_*.
- */
- uint16_t dns_traffic_class;
- };
- /**
- * Information from MX records (RFC 1035).
- */
- struct GNUNET_DNSPARSER_MxRecord
- {
- /**
- * Preference for this entry (lower value is higher preference).
- */
- uint16_t preference;
- /**
- * Name of the mail server.
- * In UTF-8 format. The library will convert from and to DNS-IDNA
- * as necessary. Use #GNUNET_DNSPARSER_check_label() to test if an
- * individual label is well-formed. If a given name is not well-formed,
- * creating the DNS packet will fail.
- */
- char *mxhost;
- };
- /**
- * Information from SRV records (RFC 2782).
- */
- struct GNUNET_DNSPARSER_SrvRecord
- {
- /**
- * Hostname offering the service.
- * In UTF-8 format. The library will convert from and to DNS-IDNA
- * as necessary. Use #GNUNET_DNSPARSER_check_label() to test if an
- * individual label is well-formed. If a given name is not well-formed,
- * creating the DNS packet will fail.
- */
- char *target;
- /**
- * Preference for this entry (lower value is higher preference). Clients
- * will contact hosts from the lowest-priority group first and fall back
- * to higher priorities if the low-priority entries are unavailable.
- */
- uint16_t priority;
- /**
- * Relative weight for records with the same priority. Clients will use
- * the hosts of the same (lowest) priority with a probability proportional
- * to the weight given.
- */
- uint16_t weight;
- /**
- * TCP or UDP port of the service.
- */
- uint16_t port;
- };
- /**
- * DNS CERT types as defined in RFC 4398.
- */
- enum GNUNET_DNSPARSER_CertType
- {
- /**
- * Reserved value
- */
- GNUNET_DNSPARSER_CERTTYPE_RESERVED = 0,
- /**
- * An x509 PKIX certificate
- */
- GNUNET_DNSPARSER_CERTTYPE_PKIX = 1,
- /**
- * A SKPI certificate
- */
- GNUNET_DNSPARSER_CERTTYPE_SKPI = 2,
- /**
- * A PGP certificate
- */
- GNUNET_DNSPARSER_CERTTYPE_PGP = 3,
- /**
- * An x509 PKIX cert URL
- */
- GNUNET_DNSPARSER_CERTTYPE_IPKIX = 4,
- /**
- * A SKPI cert URL
- */
- GNUNET_DNSPARSER_CERTTYPE_ISKPI = 5,
- /**
- * A PGP cert fingerprint and URL
- */
- GNUNET_DNSPARSER_CERTTYPE_IPGP = 6,
- /**
- * An attribute Certificate
- */
- GNUNET_DNSPARSER_CERTTYPE_ACPKIX = 7,
- /**
- * An attribute cert URL
- */
- GNUNET_DNSPARSER_CERTTYPE_IACKPIX = 8
- };
- /**
- * DNSCERT algorithms as defined in http://www.iana.org/assignments/
- * dns-sec-alg-numbers/dns-sec-alg-numbers.xhtml, under dns-sec-alg-numbers-1
- */
- enum GNUNET_DNSPARSER_CertAlgorithm
- {
- /**
- * No defined
- */
- GNUNET_DNSPARSER_CERTALGO_UNDEFINED = 0,
- /**
- * RSA/MD5
- */
- GNUNET_DNSPARSER_CERTALGO_RSAMD5 = 1,
- /**
- * Diffie-Hellman
- */
- GNUNET_DNSPARSER_CERTALGO_DH = 2,
- /**
- * DSA/SHA1
- */
- GNUNET_DNSPARSER_CERTALGO_DSASHA = 3,
- /**
- * Reserved
- */
- GNUNET_DNSPARSER_CERTALGO_RSRVD4 = 4,
- /**
- * RSA/SHA1
- */
- GNUNET_DNSPARSER_CERTALGO_RSASHA = 5,
- /**
- * DSA/NSEC3/SHA
- */
- GNUNET_DNSPARSER_CERTALGO_DSANSEC3 = 6,
- /**
- * RSA/NSEC3/SHA
- */
- GNUNET_DNSPARSER_CERTALGO_RSANSEC3 = 7,
- /**
- * RSA/SHA256
- */
- GNUNET_DNSPARSER_CERTALGO_RSASHA256 = 8,
- /**
- * Reserved
- */
- GNUNET_DNSPARSER_CERTALGO_RSRVD9 = 9,
- /**
- * RSA/SHA512
- */
- GNUNET_DNSPARSER_CERTALGO_RSASHA512 = 10,
- /**
- * GHOST R 34.10-2001
- */
- GNUNET_DNSPARSER_CERTALGO_GOST_R34 = 12,
- /**
- * ECDSA Curve P-256/SHA256
- */
- GNUNET_DNSPARSER_CERTALGO_ECDSA_P256SHA256 = 13,
- /**
- * ECDSA Curve P-384/SHA384
- */
- GNUNET_DNSPARSER_CERTALGO_ECDSA_P384SHA384 = 14
- };
- /**
- * Information from CERT records (RFC 4034).
- */
- struct GNUNET_DNSPARSER_CertRecord
- {
- /**
- * Certificate type
- */
- enum GNUNET_DNSPARSER_CertType cert_type;
- /**
- * Certificate KeyTag
- */
- uint16_t cert_tag;
- /**
- * Algorithm
- */
- enum GNUNET_DNSPARSER_CertAlgorithm algorithm;
- /**
- * Number of bytes in @e certificate_data
- */
- size_t certificate_size;
- /**
- * Data of the certificate.
- */
- char *certificate_data;
- };
- /**
- * Information from SOA records (RFC 1035).
- */
- struct GNUNET_DNSPARSER_SoaRecord
- {
- /**
- * The domainname of the name server that was the
- * original or primary source of data for this zone.
- * In UTF-8 format. The library will convert from and to DNS-IDNA
- * as necessary. Use #GNUNET_DNSPARSER_check_label() to test if an
- * individual label is well-formed. If a given name is not well-formed,
- * creating the DNS packet will fail.
- */
- char *mname;
- /**
- * A domainname which specifies the mailbox of the
- * person responsible for this zone.
- * In UTF-8 format. The library will convert from and to DNS-IDNA
- * as necessary. Use #GNUNET_DNSPARSER_check_label() to test if an
- * individual label is well-formed. If a given name is not well-formed,
- * creating the DNS packet will fail.
- */
- char *rname;
- /**
- * The version number of the original copy of the zone.
- */
- uint32_t serial;
- /**
- * Time interval before the zone should be refreshed.
- */
- uint32_t refresh;
- /**
- * Time interval that should elapse before a failed refresh should
- * be retried.
- */
- uint32_t retry;
- /**
- * Time value that specifies the upper limit on the time interval
- * that can elapse before the zone is no longer authoritative.
- */
- uint32_t expire;
- /**
- * The bit minimum TTL field that should be exported with any RR
- * from this zone.
- */
- uint32_t minimum_ttl;
- };
- /**
- * Information from CAA records (RFC 6844).
- * The tag is followed by the tag_len.
- * The value is followed by the tag for (d - tag_len - 2) bytes
- */
- struct GNUNET_DNSPARSER_CaaRecord
- {
- /**
- * The flags of the CAA record.
- */
- uint8_t flags;
- /**
- * The length of the tag.
- */
- uint8_t tag_len;
- };
- /**
- * Binary record information (unparsed).
- */
- struct GNUNET_DNSPARSER_RawRecord
- {
- /**
- * Binary record data.
- */
- void *data;
- /**
- * Number of bytes in data.
- */
- size_t data_len;
- };
- /**
- * A DNS response record.
- */
- struct GNUNET_DNSPARSER_Record
- {
- /**
- * Name of the record that the query is for (0-terminated).
- * In UTF-8 format. The library will convert from and to DNS-IDNA
- * as necessary. Use #GNUNET_DNSPARSER_check_label() to test if an
- * individual label is well-formed. If a given name is not well-formed,
- * creating the DNS packet will fail.
- */
- char *name;
- /**
- * Payload of the record (which one of these is valid depends on the 'type').
- */
- union
- {
- /**
- * For NS, CNAME and PTR records, this is the uncompressed 0-terminated hostname.
- * In UTF-8 format. The library will convert from and to DNS-IDNA
- * as necessary. Use #GNUNET_DNSPARSER_check_label() to test if an
- * individual label is well-formed. If a given name is not well-formed,
- * creating the DNS packet will fail.
- */
- char *hostname;
- /**
- * SOA data for SOA records.
- */
- struct GNUNET_DNSPARSER_SoaRecord *soa;
- /**
- * CERT data for CERT records.
- */
- struct GNUNET_DNSPARSER_CertRecord *cert;
- /**
- * MX data for MX records.
- */
- struct GNUNET_DNSPARSER_MxRecord *mx;
- /**
- * SRV data for SRV records.
- */
- struct GNUNET_DNSPARSER_SrvRecord *srv;
- /**
- * Raw data for all other types.
- */
- struct GNUNET_DNSPARSER_RawRecord raw;
- } data;
- /**
- * When does the record expire?
- */
- struct GNUNET_TIME_Absolute expiration_time;
- /**
- * See GNUNET_DNSPARSER_TYPE_*.
- */
- uint16_t type;
- /**
- * See GNUNET_TUN_DNS_CLASS_*.
- */
- uint16_t dns_traffic_class;
- };
- /**
- * Easy-to-process, parsed version of a DNS packet.
- */
- struct GNUNET_DNSPARSER_Packet
- {
- /**
- * Array of all queries in the packet, must contain "num_queries" entries.
- */
- struct GNUNET_DNSPARSER_Query *queries;
- /**
- * Array of all answers in the packet, must contain "num_answers" entries.
- */
- struct GNUNET_DNSPARSER_Record *answers;
- /**
- * Array of all authority records in the packet, must contain "num_authority_records" entries.
- */
- struct GNUNET_DNSPARSER_Record *authority_records;
- /**
- * Array of all additional answers in the packet, must contain "num_additional_records" entries.
- */
- struct GNUNET_DNSPARSER_Record *additional_records;
- /**
- * Number of queries in the packet.
- */
- unsigned int num_queries;
- /**
- * Number of answers in the packet, should be 0 for queries.
- */
- unsigned int num_answers;
- /**
- * Number of authoritative answers in the packet, should be 0 for queries.
- */
- unsigned int num_authority_records;
- /**
- * Number of additional records in the packet, should be 0 for queries.
- */
- unsigned int num_additional_records;
- /**
- * Bitfield of DNS flags.
- */
- struct GNUNET_TUN_DnsFlags flags;
- /**
- * DNS ID (to match replies to requests).
- */
- uint16_t id;
- };
- /**
- * Check if a label in UTF-8 format can be coded into valid IDNA.
- * This can fail if the ASCII-conversion becomes longer than 63 characters.
- *
- * @param label label to check (UTF-8 string)
- * @return #GNUNET_OK if the label can be converted to IDNA,
- * #GNUNET_SYSERR if the label is not valid for DNS names
- */
- int
- GNUNET_DNSPARSER_check_label (const char *label);
- /**
- * Check if a hostname in UTF-8 format can be coded into valid IDNA.
- * This can fail if a label becomes longer than 63 characters or if
- * the entire name exceeds 253 characters.
- *
- * @param name name to check (UTF-8 string)
- * @return #GNUNET_OK if the label can be converted to IDNA,
- * #GNUNET_SYSERR if the label is not valid for DNS names
- */
- int
- GNUNET_DNSPARSER_check_name (const char *name);
- /**
- * Parse a UDP payload of a DNS packet in to a nice struct for further
- * processing and manipulation.
- *
- * @param udp_payload wire-format of the DNS packet
- * @param udp_payload_length number of bytes in @a udp_payload
- * @return NULL on error, otherwise the parsed packet
- */
- struct GNUNET_DNSPARSER_Packet *
- GNUNET_DNSPARSER_parse (const char *udp_payload,
- size_t udp_payload_length);
- /**
- * Free memory taken by a packet.
- *
- * @param p packet to free
- */
- void
- GNUNET_DNSPARSER_free_packet (struct GNUNET_DNSPARSER_Packet *p);
- /**
- * Given a DNS packet @a p, generate the corresponding UDP payload.
- * Note that we do not attempt to pack the strings with pointers
- * as this would complicate the code and this is about being
- * simple and secure, not fast, fancy and broken like bind.
- *
- * @param p packet to pack
- * @param max maximum allowed size for the resulting UDP payload
- * @param buf set to a buffer with the packed message
- * @param buf_length set to the length of @a buf
- * @return #GNUNET_SYSERR if @a p is invalid
- * #GNUNET_NO if @a p was truncated (but there is still a result in @a buf)
- * #GNUNET_OK if @a p was packed completely into @a buf
- */
- int
- GNUNET_DNSPARSER_pack (const struct GNUNET_DNSPARSER_Packet *p,
- uint16_t max,
- char **buf,
- size_t *buf_length);
- /* ***************** low-level packing API ******************** */
- /**
- * Add a DNS name to the UDP packet at the given location, converting
- * the name to IDNA notation as necessary.
- *
- * @param dst where to write the name (UDP packet)
- * @param dst_len number of bytes in @a dst
- * @param off pointer to offset where to write the name (increment by bytes used)
- * must not be changed if there is an error
- * @param name name to write
- * @return #GNUNET_SYSERR if @a name is invalid
- * #GNUNET_NO if @a name did not fit
- * #GNUNET_OK if @a name was added to @a dst
- */
- int
- GNUNET_DNSPARSER_builder_add_name (char *dst,
- size_t dst_len,
- size_t *off,
- const char *name);
- /**
- * Add a DNS query to the UDP packet at the given location.
- *
- * @param dst where to write the query
- * @param dst_len number of bytes in @a dst
- * @param off pointer to offset where to write the query (increment by bytes used)
- * must not be changed if there is an error
- * @param query query to write
- * @return #GNUNET_SYSERR if @a query is invalid
- * #GNUNET_NO if @a query did not fit
- * #GNUNET_OK if @a query was added to @a dst
- */
- int
- GNUNET_DNSPARSER_builder_add_query (char *dst,
- size_t dst_len,
- size_t *off,
- const struct GNUNET_DNSPARSER_Query *query);
- /**
- * Add an MX record to the UDP packet at the given location.
- *
- * @param dst where to write the mx record
- * @param dst_len number of bytes in @a dst
- * @param off pointer to offset where to write the mx information (increment by bytes used);
- * can also change if there was an error
- * @param mx mx information to write
- * @return #GNUNET_SYSERR if @a mx is invalid
- * #GNUNET_NO if @a mx did not fit
- * #GNUNET_OK if @a mx was added to @a dst
- */
- int
- GNUNET_DNSPARSER_builder_add_mx (char *dst,
- size_t dst_len,
- size_t *off,
- const struct GNUNET_DNSPARSER_MxRecord *mx);
- /**
- * Add an SOA record to the UDP packet at the given location.
- *
- * @param dst where to write the SOA record
- * @param dst_len number of bytes in @a dst
- * @param off pointer to offset where to write the SOA information (increment by bytes used)
- * can also change if there was an error
- * @param soa SOA information to write
- * @return #GNUNET_SYSERR if @a soa is invalid
- * #GNUNET_NO if @a soa did not fit
- * #GNUNET_OK if @a soa was added to @a dst
- */
- int
- GNUNET_DNSPARSER_builder_add_soa (char *dst,
- size_t dst_len,
- size_t *off,
- const struct GNUNET_DNSPARSER_SoaRecord *soa);
- /**
- * Add CERT record to the UDP packet at the given location.
- *
- * @param dst where to write the CERT record
- * @param dst_len number of bytes in @a dst
- * @param off pointer to offset where to write the CERT information (increment by bytes used)
- * can also change if there was an error
- * @param cert CERT information to write
- * @return #GNUNET_SYSERR if @a soa is invalid
- * #GNUNET_NO if @a soa did not fit
- * #GNUNET_OK if @a soa was added to @a dst
- */
- int
- GNUNET_DNSPARSER_builder_add_cert (char *dst,
- size_t dst_len,
- size_t *off,
- const struct
- GNUNET_DNSPARSER_CertRecord *cert);
- /**
- * Add an SRV record to the UDP packet at the given location.
- *
- * @param dst where to write the SRV record
- * @param dst_len number of bytes in @a dst
- * @param off pointer to offset where to write the SRV information (increment by bytes used)
- * can also change if there was an error
- * @param srv SRV information to write
- * @return #GNUNET_SYSERR if @a srv is invalid
- * #GNUNET_NO if @a srv did not fit
- * #GNUNET_OK if @a srv was added to @a dst
- */
- int
- GNUNET_DNSPARSER_builder_add_srv (char *dst,
- size_t dst_len,
- size_t *off,
- const struct GNUNET_DNSPARSER_SrvRecord *srv);
- /* ***************** low-level parsing API ******************** */
- /**
- * Parse a DNS record entry.
- *
- * @param udp_payload entire UDP payload
- * @param udp_payload_length length of @a udp_payload
- * @param off pointer to the offset of the record to parse in the udp_payload (to be
- * incremented by the size of the record)
- * @param r where to write the record information
- * @return #GNUNET_OK on success, #GNUNET_SYSERR if the record is malformed
- */
- int
- GNUNET_DNSPARSER_parse_record (const char *udp_payload,
- size_t udp_payload_length,
- size_t *off,
- struct GNUNET_DNSPARSER_Record *r);
- /**
- * Parse name inside of a DNS query or record.
- *
- * @param udp_payload entire UDP payload
- * @param udp_payload_length length of @a udp_payload
- * @param off pointer to the offset of the name to parse in the udp_payload (to be
- * incremented by the size of the name)
- * @return name as 0-terminated C string on success, NULL if the payload is malformed
- */
- char *
- GNUNET_DNSPARSER_parse_name (const char *udp_payload,
- size_t udp_payload_length,
- size_t *off);
- /**
- * Parse a DNS query entry.
- *
- * @param udp_payload entire UDP payload
- * @param udp_payload_length length of @a udp_payload
- * @param off pointer to the offset of the query to parse in the udp_payload (to be
- * incremented by the size of the query)
- * @param q where to write the query information
- * @return #GNUNET_OK on success, #GNUNET_SYSERR if the query is malformed
- */
- int
- GNUNET_DNSPARSER_parse_query (const char *udp_payload,
- size_t udp_payload_length,
- size_t *off,
- struct GNUNET_DNSPARSER_Query *q);
- /**
- * Parse a DNS SOA record.
- *
- * @param udp_payload reference to UDP packet
- * @param udp_payload_length length of @a udp_payload
- * @param off pointer to the offset of the query to parse in the SOA record (to be
- * incremented by the size of the record), unchanged on error
- * @return the parsed SOA record, NULL on error
- */
- struct GNUNET_DNSPARSER_SoaRecord *
- GNUNET_DNSPARSER_parse_soa (const char *udp_payload,
- size_t udp_payload_length,
- size_t *off);
- /**
- * Parse a DNS CERT record.
- *
- * @param udp_payload reference to UDP packet
- * @param udp_payload_length length of @a udp_payload
- * @param off pointer to the offset of the query to parse in the CERT record (to be
- * incremented by the size of the record), unchanged on error
- * @return the parsed CERT record, NULL on error
- */
- struct GNUNET_DNSPARSER_CertRecord *
- GNUNET_DNSPARSER_parse_cert (const char *udp_payload,
- size_t udp_payload_length,
- size_t *off);
- /**
- * Parse a DNS MX record.
- *
- * @param udp_payload reference to UDP packet
- * @param udp_payload_length length of @a udp_payload
- * @param off pointer to the offset of the query to parse in the MX record (to be
- * incremented by the size of the record), unchanged on error
- * @return the parsed MX record, NULL on error
- */
- struct GNUNET_DNSPARSER_MxRecord *
- GNUNET_DNSPARSER_parse_mx (const char *udp_payload,
- size_t udp_payload_length,
- size_t *off);
- /**
- * Parse a DNS SRV record.
- *
- * @param udp_payload reference to UDP packet
- * @param udp_payload_length length of @a udp_payload
- * @param off pointer to the offset of the query to parse in the SRV record (to be
- * incremented by the size of the record), unchanged on error
- * @return the parsed SRV record, NULL on error
- */
- struct GNUNET_DNSPARSER_SrvRecord *
- GNUNET_DNSPARSER_parse_srv (const char *udp_payload,
- size_t udp_payload_length,
- size_t *off);
- /* ***************** low-level duplication API ******************** */
- /**
- * Duplicate (deep-copy) the given DNS record
- *
- * @param r the record
- * @return the newly allocated record
- */
- struct GNUNET_DNSPARSER_Record *
- GNUNET_DNSPARSER_duplicate_record (const struct GNUNET_DNSPARSER_Record *r);
- /**
- * Duplicate (deep-copy) the given DNS record
- *
- * @param r the record
- * @return the newly allocated record
- */
- struct GNUNET_DNSPARSER_SoaRecord *
- GNUNET_DNSPARSER_duplicate_soa_record (const struct
- GNUNET_DNSPARSER_SoaRecord *r);
- /**
- * Duplicate (deep-copy) the given DNS record
- *
- * @param r the record
- * @return the newly allocated record
- */
- struct GNUNET_DNSPARSER_CertRecord *
- GNUNET_DNSPARSER_duplicate_cert_record (const struct
- GNUNET_DNSPARSER_CertRecord *r);
- /**
- * Duplicate (deep-copy) the given DNS record
- *
- * @param r the record
- * @return the newly allocated record
- */
- struct GNUNET_DNSPARSER_MxRecord *
- GNUNET_DNSPARSER_duplicate_mx_record (const struct
- GNUNET_DNSPARSER_MxRecord *r);
- /**
- * Duplicate (deep-copy) the given DNS record
- *
- * @param r the record
- * @return the newly allocated record
- */
- struct GNUNET_DNSPARSER_SrvRecord *
- GNUNET_DNSPARSER_duplicate_srv_record (const struct
- GNUNET_DNSPARSER_SrvRecord *r);
- /* ***************** low-level deallocation API ******************** */
- /**
- * Free the given DNS record.
- *
- * @param r record to free
- */
- void
- GNUNET_DNSPARSER_free_record (struct GNUNET_DNSPARSER_Record *r);
- /**
- * Free MX information record.
- *
- * @param mx record to free
- */
- void
- GNUNET_DNSPARSER_free_mx (struct GNUNET_DNSPARSER_MxRecord *mx);
- /**
- * Free SRV information record.
- *
- * @param srv record to free
- */
- void
- GNUNET_DNSPARSER_free_srv (struct GNUNET_DNSPARSER_SrvRecord *srv);
- /**
- * Free SOA information record.
- *
- * @param soa record to free
- */
- void
- GNUNET_DNSPARSER_free_soa (struct GNUNET_DNSPARSER_SoaRecord *soa);
- /**
- * Free CERT information record.
- *
- * @param cert record to free
- */
- void
- GNUNET_DNSPARSER_free_cert (struct GNUNET_DNSPARSER_CertRecord *cert);
- /**
- * Convert a block of binary data to HEX.
- *
- * @param data binary data to convert
- * @param data_size number of bytes in @a data
- * @return HEX string (lower case)
- */
- char *
- GNUNET_DNSPARSER_bin_to_hex (const void *data,
- size_t data_size);
- /**
- * Convert a HEX string to block of binary data.
- *
- * @param hex HEX string to convert (may contain mixed case)
- * @param data where to write result, must be
- * at least `strlen(hex)/2` bytes long
- * @return number of bytes written to data
- */
- size_t
- GNUNET_DNSPARSER_hex_to_bin (const char *hex,
- void *data);
- #endif
- /** @} */ /* end of group */
|