1 static const char rcsid
[] = "$Header: /proj/cvs/prod/bind9/lib/bind/dst/Attic/support.c,v 1.6 2005/10/11 00:10:13 marka Exp $";
5 * Portions Copyright (c) 1995-1998 by Trusted Information Systems, Inc.
7 * Permission to use, copy modify, and distribute this software for any
8 * purpose with or without fee is hereby granted, provided that the above
9 * copyright notice and this permission notice appear in all copies.
11 * THE SOFTWARE IS PROVIDED "AS IS" AND TRUSTED INFORMATION SYSTEMS
12 * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
13 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
14 * TRUSTED INFORMATION SYSTEMS BE LIABLE FOR ANY SPECIAL, DIRECT,
15 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
16 * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
17 * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
18 * WITH THE USE OR PERFORMANCE OF THE SOFTWARE.
21 #include "port_before.h"
29 #include <netinet/in.h>
30 #include <arpa/nameser.h>
33 #include "dst_internal.h"
35 #include "port_after.h"
39 * Validate that the input string(*str) is at the head of the input
40 * buffer(**buf). If so, move the buffer head pointer (*buf) to
41 * the first byte of data following the string(*str).
46 * 0 *str is not the head of **buff
47 * 1 *str is the head of **buff, *buf is is advanced to
52 dst_s_verify_str(const char **buf
, const char *str
)
55 if (*buf
== NULL
) /*%< error checks */
57 if (str
== NULL
|| *str
== '\0')
60 b
= strlen(*buf
); /*%< get length of strings */
62 if (s
> b
|| strncmp(*buf
, str
, s
)) /*%< check if same */
63 return (0); /*%< not a match */
64 (*buf
) += s
; /*%< advance pointer */
69 * dst_s_calculate_bits
70 * Given a binary number represented in a u_char[], determine
71 * the number of significant bits used.
73 * str An input character string containing a binary number.
74 * max_bits The maximum possible significant bits.
76 * N The number of significant bits in str.
80 dst_s_calculate_bits(const u_char
*str
, const int max_bits
)
82 const u_char
*p
= str
;
85 for (bits
= max_bits
; *p
== 0x00 && bits
> 0; p
++)
87 for (i
= *p
; (i
& j
) != j
; j
>>= 1)
93 * calculates a checksum used in dst for an id.
94 * takes an array of bytes and a length.
95 * returns a 16 bit checksum.
98 dst_s_id_calc(const u_char
*key
, const int keysize
)
101 const u_char
*kp
= key
;
104 if (!key
|| (keysize
<= 0))
107 for (ac
= 0; size
> 1; size
-= 2, kp
+= 2)
108 ac
+= ((*kp
) << 8) + *(kp
+ 1);
112 ac
+= (ac
>> 16) & 0xffff;
114 return (ac
& 0xffff);
118 * dst_s_dns_key_id() Function to calculate DNSSEC footprint from KEY record
121 * dns_key_rdata: the raw data in wire format
122 * rdata_len: the size of the input data
124 * the key footprint/id calculated from the key data
127 dst_s_dns_key_id(const u_char
*dns_key_rdata
, const int rdata_len
)
133 if (dns_key_rdata
[3] == KEY_RSA
) /*%< Algorithm RSA */
134 return dst_s_get_int16((const u_char
*)
135 &dns_key_rdata
[rdata_len
- 3]);
136 else if (dns_key_rdata
[3] == KEY_HMAC_MD5
)
140 /* compute a checksum on the key part of the key rr */
141 return dst_s_id_calc(dns_key_rdata
, rdata_len
);
146 * This routine extracts a 16 bit integer from a two byte character
147 * string. The character string is assumed to be in network byte
148 * order and may be unaligned. The number returned is in host order.
150 * buf A two byte character string.
152 * The converted integer value.
156 dst_s_get_int16(const u_char
*buf
)
158 register u_int16_t a
= 0;
159 a
= ((u_int16_t
)(buf
[0] << 8)) | ((u_int16_t
)(buf
[1]));
165 * This routine extracts a 32 bit integer from a four byte character
166 * string. The character string is assumed to be in network byte
167 * order and may be unaligned. The number returned is in host order.
169 * buf A four byte character string.
171 * The converted integer value.
175 dst_s_get_int32(const u_char
*buf
)
177 register u_int32_t a
= 0;
178 a
= ((u_int32_t
)(buf
[0] << 24)) | ((u_int32_t
)(buf
[1] << 16)) |
179 ((u_int32_t
)(buf
[2] << 8)) | ((u_int32_t
)(buf
[3]));
185 * Take a 16 bit integer and store the value in a two byte
186 * character string. The integer is assumed to be in network
187 * order and the string is returned in host order.
190 * buf Storage for a two byte character string.
191 * val 16 bit integer.
195 dst_s_put_int16(u_int8_t
*buf
, const u_int16_t val
)
197 buf
[0] = (u_int8_t
)(val
>> 8);
198 buf
[1] = (u_int8_t
)(val
);
203 * Take a 32 bit integer and store the value in a four byte
204 * character string. The integer is assumed to be in network
205 * order and the string is returned in host order.
208 * buf Storage for a four byte character string.
209 * val 32 bit integer.
213 dst_s_put_int32(u_int8_t
*buf
, const u_int32_t val
)
215 buf
[0] = (u_int8_t
)(val
>> 24);
216 buf
[1] = (u_int8_t
)(val
>> 16);
217 buf
[2] = (u_int8_t
)(val
>> 8);
218 buf
[3] = (u_int8_t
)(val
);
222 * dst_s_filename_length
224 * This function returns the number of bytes needed to hold the
225 * filename for a key file. '/', '\' and ':' are not allowed.
226 * form: K<keyname>+<alg>+<id>.<suffix>
228 * Returns 0 if the filename would contain either '\', '/' or ':'
231 dst_s_filename_length(const char *name
, const char *suffix
)
235 if (strrchr(name
, '\\'))
237 if (strrchr(name
, '/'))
239 if (strrchr(name
, ':'))
243 if (strrchr(suffix
, '\\'))
245 if (strrchr(suffix
, '/'))
247 if (strrchr(suffix
, ':'))
249 return (1 + strlen(name
) + 6 + strlen(suffix
));
253 * dst_s_build_filename ()
254 * Builds a key filename from the key name, it's id, and a
255 * suffix. '\', '/' and ':' are not allowed. fA filename is of the
256 * form: K<keyname><id>.<suffix>
257 * form: K<keyname>+<alg>+<id>.<suffix>
259 * Returns -1 if the conversion fails:
260 * if the filename would be too long for space allotted
261 * if the filename would contain a '\', '/' or ':'
262 * Returns 0 on success
266 dst_s_build_filename(char *filename
, const char *name
, u_int16_t id
,
267 int alg
, const char *suffix
, size_t filename_length
)
270 if (filename
== NULL
)
272 memset(filename
, 0, filename_length
);
277 if (filename_length
< 1 + strlen(name
) + 4 + 6 + 1 + strlen(suffix
))
280 sprintf(filename
, "K%s+%03d+%05d.%s", name
, alg
, my_id
,
281 (const char *) suffix
);
282 if (strrchr(filename
, '/'))
284 if (strrchr(filename
, '\\'))
286 if (strrchr(filename
, ':'))
293 * Open a file in the dst_path directory. If perm is specified, the
294 * file is checked for existence first, and not opened if it exists.
296 * filename File to open
297 * mode Mode to open the file (passed directly to fopen)
298 * perm File permission, if creating a new file.
301 * NON-NULL (FILE *) of opened file.
304 dst_s_fopen(const char *filename
, const char *mode
, int perm
)
307 char pathname
[PATH_MAX
];
309 if (strlen(filename
) + strlen(dst_path
) >= sizeof(pathname
))
312 if (*dst_path
!= '\0') {
313 strcpy(pathname
, dst_path
);
314 strcat(pathname
, filename
);
316 strcpy(pathname
, filename
);
318 fp
= fopen(pathname
, mode
);
320 chmod(pathname
, perm
);
325 dst_s_dump(const int mode
, const u_char
*data
, const int size
,
332 static u_char scratch
[1000];
334 n
= b64_ntop(data
, scratch
, size
, sizeof(scratch
));
335 printf("%s: %x %d %s\n", msg
, mode
, n
, scratch
);
337 printf("%s,%x %d\n", msg
, mode
, size
);