Annotation of embedaddon/dhcp/minires/res_sendsigned.c, revision 1.1.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>