Annotation of embedaddon/dhcp/minires/res_sendsigned.c, revision 1.1

1.1     ! misho       1: /*
        !             2:  * Copyright (c) 2004,2007,2009 by Internet Systems Consortium, Inc. ("ISC")
        !             3:  * Copyright (c) 1995-2003 by Internet Software Consortium
        !             4:  *
        !             5:  * Permission to use, copy, modify, and distribute this software for any
        !             6:  * purpose with or without fee is hereby granted, provided that the above
        !             7:  * copyright notice and this permission notice appear in all copies.
        !             8:  *
        !             9:  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
        !            10:  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
        !            11:  * MERCHANTABILITY AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR
        !            12:  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
        !            13:  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
        !            14:  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
        !            15:  * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
        !            16:  *
        !            17:  *   Internet Systems Consortium, Inc.
        !            18:  *   950 Charter Street
        !            19:  *   Redwood City, CA 94063
        !            20:  *   <info@isc.org>
        !            21:  *   https://www.isc.org/
        !            22:  */
        !            23: 
        !            24: #include <sys/types.h>
        !            25: #include <sys/param.h>
        !            26: 
        !            27: #include <netinet/in.h>
        !            28: #include <arpa/inet.h>
        !            29: #include <sys/socket.h>
        !            30: 
        !            31: #include <errno.h>
        !            32: #include <netdb.h>
        !            33: #include <stdio.h>
        !            34: #include <stdlib.h>
        !            35: #include <string.h>
        !            36: #include <unistd.h>
        !            37: 
        !            38: #include "minires/minires.h"
        !            39: #include "arpa/nameser.h"
        !            40: 
        !            41: #include <isc-dhcp/dst.h>
        !            42: 
        !            43: /* res_nsendsigned */
        !            44: isc_result_t
        !            45: res_nsendsigned(res_state statp,
        !            46:                double *msg, unsigned msglen, ns_tsig_key *key,
        !            47:                double *answer, unsigned anslen, unsigned *anssize)
        !            48: {
        !            49:        res_state nstatp;
        !            50:        DST_KEY *dstkey;
        !            51:        int usingTCP = 0;
        !            52:        double *newmsg;
        !            53:        unsigned newmsglen;
        !            54:        unsigned bufsize, siglen;
        !            55:        u_char sig[64];
        !            56:        HEADER *hp;
        !            57:        time_t tsig_time;
        !            58:        unsigned ret;
        !            59:        isc_result_t rcode;
        !            60: 
        !            61:        dst_init();
        !            62: 
        !            63:        nstatp = (res_state) malloc(sizeof(*statp));
        !            64:        if (nstatp == NULL)
        !            65:                return ISC_R_NOMEMORY;
        !            66:        memcpy(nstatp, statp, sizeof(*statp));
        !            67: 
        !            68:        bufsize = msglen + 1024;
        !            69:        newmsg = (double *) malloc(bufsize);
        !            70:        if (newmsg == NULL) {
        !            71:                free(nstatp);
        !            72:                return ISC_R_NOMEMORY;
        !            73:        }
        !            74:        memcpy(newmsg, msg, msglen);
        !            75:        newmsglen = msglen;
        !            76: 
        !            77:        if (ns_samename(key->alg, NS_TSIG_ALG_HMAC_MD5) != 1)
        !            78:                dstkey = NULL;
        !            79:        else
        !            80:                dstkey = dst_buffer_to_key(key->name, KEY_HMAC_MD5,
        !            81:                                           NS_KEY_TYPE_AUTH_ONLY,
        !            82:                                           NS_KEY_PROT_ANY,
        !            83:                                           key->data, key->len);
        !            84:        if (dstkey == NULL) {
        !            85:                free(nstatp);
        !            86:                free(newmsg);
        !            87:                return ISC_R_BADKEY;
        !            88:        }
        !            89: 
        !            90:        nstatp->nscount = 1;
        !            91:        siglen = sizeof(sig);
        !            92:        rcode = ns_sign((u_char *)newmsg, &newmsglen, bufsize,
        !            93:                        NOERROR, dstkey, NULL, 0,
        !            94:                        sig, &siglen, 0);
        !            95:        if (rcode != ISC_R_SUCCESS) {
        !            96:                dst_free_key(dstkey);
        !            97:                free (nstatp);
        !            98:                free (newmsg);
        !            99:                return rcode;
        !           100:        }
        !           101: 
        !           102:        if (newmsglen > PACKETSZ || (nstatp->options & RES_IGNTC))
        !           103:                usingTCP = 1;
        !           104:        if (usingTCP == 0)
        !           105:                nstatp->options |= RES_IGNTC;
        !           106:        else
        !           107:                nstatp->options |= RES_USEVC;
        !           108: 
        !           109: retry:
        !           110: 
        !           111:        rcode = res_nsend(nstatp, newmsg, newmsglen, answer, anslen, &ret);
        !           112:        if (rcode != ISC_R_SUCCESS) {
        !           113:                dst_free_key(dstkey);
        !           114:                free (nstatp);
        !           115:                free (newmsg);
        !           116:                return rcode;
        !           117:        }
        !           118: 
        !           119:        anslen = ret;
        !           120:        rcode = ns_verify((u_char *)answer, &anslen, dstkey, sig, siglen,
        !           121:                          NULL, NULL, &tsig_time,
        !           122:                          (nstatp->options & RES_KEEPTSIG) ? 1 : 0);
        !           123:        if (rcode != ISC_R_SUCCESS) {
        !           124:                Dprint(nstatp->pfcode & RES_PRF_REPLY,
        !           125:                       (stdout, ";; TSIG invalid (%s)\n", p_rcode(ret)));
        !           126:                dst_free_key(dstkey);
        !           127:                free (nstatp);
        !           128:                free (newmsg);
        !           129:                return rcode;
        !           130:        }
        !           131:        Dprint(nstatp->pfcode & RES_PRF_REPLY, (stdout, ";; TSIG ok\n"));
        !           132: 
        !           133:        hp = (HEADER *) answer;
        !           134:        if (hp->tc && usingTCP == 0) {
        !           135:                nstatp->options &= ~RES_IGNTC;
        !           136:                usingTCP = 1;
        !           137:                goto retry;
        !           138:        }
        !           139: 
        !           140:        dst_free_key(dstkey);
        !           141:        free (nstatp);
        !           142:        free (newmsg);
        !           143:        *anssize = anslen;
        !           144:        return ISC_R_SUCCESS;
        !           145: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>