/*	$NetBSD: res_mkquery.c,v 1.6 2006/01/24 17:40:32 christos Exp $	*/

/*
 * Copyright (c) 1985, 1993
 *    The Regents of the University of California.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 * 	This product includes software developed by the University of
 * 	California, Berkeley and its contributors.
 * 4. Neither the name of the University nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 */

/*
 * Portions Copyright (c) 1993 by Digital Equipment Corporation.
 *
 * Permission to use, copy, modify, and distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies, and that
 * the name of Digital Equipment Corporation not be used in advertising or
 * publicity pertaining to distribution of the document or software without
 * specific, written prior permission.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
 * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS.   IN NO EVENT SHALL DIGITAL EQUIPMENT
 * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
 * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
 * SOFTWARE.
 */

/*
 * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
 * Portions Copyright (c) 1996-1999 by Internet Software Consortium.
 *
 * Permission to use, copy, modify, and distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
 * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

#define LOG_TAG "resolv"

#include <algorithm>  // std::min()

#include <arpa/nameser.h>
#include <netdb.h>
#include <netinet/in.h>
#include <string.h>

#include <android-base/logging.h>
#include <netd_resolv/resolv.h>  // NET_CONTEXT_FLAG_USE_DNS_OVER_TLS

#include "res_comp.h"
#include "res_debug.h"
#include "resolv_private.h"  // ResState*

// Queries will be padded to a multiple of this length when EDNS0 is active.
constexpr uint16_t kEdns0Padding = 128;

extern const char* const _res_opcodes[] = {
        "QUERY",  "IQUERY", "CQUERYM", "CQUERYU", /* experimental */
        "NOTIFY",                                 /* experimental */
        "UPDATE", "6",      "7",       "8",        "9",       "10",
        "11",     "12",     "13",      "ZONEINIT", "ZONEREF",
};

// Form all types of queries. Returns the size of the result or -1.
int res_nmkquery(int op,                         // opcode of query
                 const char* dname,              // domain name
                 int cl, int type,               // class and type of query
                 std::span<const uint8_t> data,  // resource record data
                 std::span<uint8_t> buf,         // buffer to put query
                 int netcontext_flags) {
    HEADER* hp;
    uint8_t *cp, *ep;
    int n;
    uint8_t *dnptrs[20], **dpp, **lastdnptr;

    LOG(INFO) << __func__ << ": (" << _res_opcodes[op] << ", " << p_class(cl) << ", "
              << p_type(type) << ")";

    /*
     * Initialize header fields.
     */
    if (buf.empty() || (buf.size() < HFIXEDSZ)) return (-1);
    memset(buf.data(), 0, HFIXEDSZ);
    hp = (HEADER*)(void*)buf.data();
    hp->id = htons(arc4random_uniform(65536));
    hp->opcode = op;
    hp->rd = true;
    hp->ad = (netcontext_flags & NET_CONTEXT_FLAG_USE_DNS_OVER_TLS) != 0U;
    hp->rcode = NOERROR;
    cp = buf.data() + HFIXEDSZ;
    ep = buf.data() + buf.size();
    dpp = dnptrs;
    *dpp++ = buf.data();
    *dpp++ = NULL;
    lastdnptr = dnptrs + sizeof dnptrs / sizeof dnptrs[0];
    /*
     * perform opcode specific processing
     */
    switch (op) {
        case QUERY:
            [[fallthrough]];
        case NS_NOTIFY_OP:
            if (ep - cp < QFIXEDSZ) return (-1);
            if ((n = dn_comp(dname, cp, ep - cp - QFIXEDSZ, dnptrs, lastdnptr)) < 0) return (-1);
            cp += n;
            *reinterpret_cast<uint16_t*>(cp) = htons(type);
            cp += INT16SZ;
            *reinterpret_cast<uint16_t*>(cp) = htons(cl);
            cp += INT16SZ;
            hp->qdcount = htons(1);
            if (op == QUERY || data.empty()) break;
            /*
             * Make an additional record for completion domain.
             */
            if ((ep - cp) < RRFIXEDSZ) return (-1);
            n = dn_comp((const char*)data.data(), cp, ep - cp - RRFIXEDSZ, dnptrs, lastdnptr);
            if (n < 0) return (-1);
            cp += n;
            *reinterpret_cast<uint16_t*>(cp) = htons(ns_t_null);
            cp += INT16SZ;
            *reinterpret_cast<uint16_t*>(cp) = htons(cl);
            cp += INT16SZ;
            *reinterpret_cast<uint32_t*>(cp) = htonl(0);
            cp += INT32SZ;
            *reinterpret_cast<uint16_t*>(cp) = htons(0);
            cp += INT16SZ;
            hp->arcount = htons(1);
            break;

        case IQUERY:
            /*
             * Initialize answer section
             */
            if (ep - cp < static_cast<ptrdiff_t>(1 + RRFIXEDSZ + data.size())) return (-1);
            *cp++ = '\0'; /* no domain name */
            *reinterpret_cast<uint16_t*>(cp) = htons(type);
            cp += INT16SZ;
            *reinterpret_cast<uint16_t*>(cp) = htons(cl);
            cp += INT16SZ;
            *reinterpret_cast<uint32_t*>(cp) = htonl(0);
            cp += INT32SZ;
            *reinterpret_cast<uint16_t*>(cp) = htons(data.size());
            cp += INT16SZ;
            if (data.size()) {
                memcpy(cp, data.data(), data.size());
                cp += data.size();
            }
            hp->ancount = htons(1);
            break;

        default:
            return (-1);
    }
    return (cp - buf.data());
}

int res_nopt(ResState* statp, int n0, /* current offset in buffer */
             std::span<uint8_t> buf,  /* buffer to put query */
             int anslen)              /* UDP answer buffer size */
{
    HEADER* hp = reinterpret_cast<HEADER*>(buf.data());
    uint8_t *cp, *ep;
    uint16_t flags = 0;

    LOG(DEBUG) << __func__;

    cp = buf.data() + n0;
    ep = buf.data() + buf.size();

    if ((ep - cp) < 1 + RRFIXEDSZ) return (-1);

    *cp++ = 0; /* "." */

    // Attach OPT pseudo-RR, as documented in RFC2671 (EDNS0).
    *reinterpret_cast<uint16_t*>(cp) = htons(ns_t_opt); /* TYPE */
    cp += INT16SZ;
    if (anslen > 0xffff) anslen = 0xffff;
    *reinterpret_cast<uint16_t*>(cp) = htons(anslen); /* CLASS = UDP payload size */
    cp += INT16SZ;
    *cp++ = NOERROR; /* extended RCODE */
    *cp++ = 0;       /* EDNS version */
    if (statp->netcontext_flags & NET_CONTEXT_FLAG_USE_DNS_OVER_TLS) {
        LOG(DEBUG) << __func__ << ": ENDS0 DNSSEC";
        flags |= NS_OPT_DNSSEC_OK;
    }
    *reinterpret_cast<uint16_t*>(cp) = htons(flags);
    cp += INT16SZ;

    // EDNS0 padding
    const uint16_t minlen = static_cast<uint16_t>(cp - buf.data()) + 3 * INT16SZ;
    const uint16_t extra = minlen % kEdns0Padding;
    uint16_t padlen = (kEdns0Padding - extra) % kEdns0Padding;
    if (minlen > buf.size()) {
        return -1;
    }
    padlen = std::min(padlen, static_cast<uint16_t>(buf.size() - minlen));
    *reinterpret_cast<uint16_t*>(cp) = htons(padlen + 2 * INT16SZ); /* RDLEN */
    cp += INT16SZ;
    *reinterpret_cast<uint16_t*>(cp) = htons(NS_OPT_PADDING); /* OPTION-CODE */
    cp += INT16SZ;
    *reinterpret_cast<uint16_t*>(cp) = htons(padlen); /* OPTION-LENGTH */
    cp += INT16SZ;
    memset(cp, 0, padlen);
    cp += padlen;

    hp->arcount = htons(ntohs(hp->arcount) + 1);
    return (cp - buf.data());
}
