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>