Print this page

        

*** 1,15 **** /* ! * Copyright 2004 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ - #pragma ident "%Z%%M% %I% %E% SMI" #ifdef HMAC_MD5 #ifndef LINT ! static const char rcsid[] = "$Header: /proj/cvs/isc/bind8/src/lib/dst/hmac_link.c,v 1.9 2001/05/29 05:48:10 marka Exp $"; #endif /* * Portions Copyright (c) 1995-1998 by Trusted Information Systems, Inc. * * Permission to use, copy modify, and distribute this software for any --- 1,14 ---- /* ! * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ #ifdef HMAC_MD5 #ifndef LINT ! static const char rcsid[] = "$Header: /proj/cvs/prod/libbind/dst/hmac_link.c,v 1.8 2007/09/24 17:18:25 each Exp $"; #endif /* * Portions Copyright (c) 1995-1998 by Trusted Information Systems, Inc. * * Permission to use, copy modify, and distribute this software for any
*** 24,34 **** * 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 THE SOFTWARE. */ ! /* * This file contains an implementation of the HMAC-MD5 algorithm. */ #include "port_before.h" #include <stdio.h> --- 23,33 ---- * 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 THE SOFTWARE. */ ! /*% * This file contains an implementation of the HMAC-MD5 algorithm. */ #include "port_before.h" #include <stdio.h>
*** 41,58 **** #include <netinet/in.h> #include <arpa/nameser.h> #include <resolv.h> #include "dst_internal.h" #ifdef USE_MD5 ! #ifndef SUNW_LIBMD5 # include "md5.h" ! #else ! #include <sys/md5.h> ! #endif # ifndef _MD5_H_ ! # define _MD5_H_ 1 /* make sure we do not include rsaref md5.h file */ # endif #endif #include "port_after.h" --- 40,60 ---- #include <netinet/in.h> #include <arpa/nameser.h> #include <resolv.h> #include "dst_internal.h" + #ifdef USE_MD5 ! # ifndef HAVE_MD5 # include "md5.h" ! # else ! # ifdef SOLARIS2 ! # include <sys/md5.h> ! # endif ! # endif # ifndef _MD5_H_ ! # define _MD5_H_ 1 /*%< make sure we do not include rsaref md5.h file */ # endif #endif #include "port_after.h"
*** 95,113 **** { HMAC_Key *key; int sign_len = 0; MD5_CTX *ctx = NULL; if (mode & SIG_MODE_INIT) ctx = (MD5_CTX *) malloc(sizeof(*ctx)); else if (context) ctx = (MD5_CTX *) *context; if (ctx == NULL) return (-1); - if (d_key == NULL || d_key->dk_KEY_struct == NULL) - return (-1); key = (HMAC_Key *) d_key->dk_KEY_struct; if (mode & SIG_MODE_INIT) { MD5Init(ctx); MD5Update(ctx, key->hk_ipad, HMAC_LEN); --- 97,116 ---- { HMAC_Key *key; int sign_len = 0; MD5_CTX *ctx = NULL; + if (d_key == NULL || d_key->dk_KEY_struct == NULL) + return (-1); + if (mode & SIG_MODE_INIT) ctx = (MD5_CTX *) malloc(sizeof(*ctx)); else if (context) ctx = (MD5_CTX *) *context; if (ctx == NULL) return (-1); key = (HMAC_Key *) d_key->dk_KEY_struct; if (mode & SIG_MODE_INIT) { MD5Init(ctx); MD5Update(ctx, key->hk_ipad, HMAC_LEN);
*** 162,181 **** const u_char *signature, const int sig_len) { HMAC_Key *key; MD5_CTX *ctx = NULL; if (mode & SIG_MODE_INIT) ctx = (MD5_CTX *) malloc(sizeof(*ctx)); else if (context) ctx = (MD5_CTX *) *context; if (ctx == NULL) return (-1); - if (d_key == NULL || d_key->dk_KEY_struct == NULL) - return (-1); - key = (HMAC_Key *) d_key->dk_KEY_struct; if (mode & SIG_MODE_INIT) { MD5Init(ctx); MD5Update(ctx, key->hk_ipad, HMAC_LEN); } --- 165,184 ---- const u_char *signature, const int sig_len) { HMAC_Key *key; MD5_CTX *ctx = NULL; + if (d_key == NULL || d_key->dk_KEY_struct == NULL) + return (-1); + if (mode & SIG_MODE_INIT) ctx = (MD5_CTX *) malloc(sizeof(*ctx)); else if (context) ctx = (MD5_CTX *) *context; if (ctx == NULL) return (-1); key = (HMAC_Key *) d_key->dk_KEY_struct; if (mode & SIG_MODE_INIT) { MD5Init(ctx); MD5Update(ctx, key->hk_ipad, HMAC_LEN); }
*** 224,233 **** --- 227,237 ---- { int i; HMAC_Key *hkey = NULL; MD5_CTX ctx; int local_keylen = keylen; + u_char tk[MD5_LEN]; if (dkey == NULL || key == NULL || keylen < 0) return (-1); if ((hkey = (HMAC_Key *) malloc(sizeof(HMAC_Key))) == NULL)
*** 236,246 **** memset(hkey->hk_ipad, 0, sizeof(hkey->hk_ipad)); memset(hkey->hk_opad, 0, sizeof(hkey->hk_opad)); /* if key is longer than HMAC_LEN bytes reset it to key=MD5(key) */ if (keylen > HMAC_LEN) { - u_char tk[MD5_LEN]; MD5Init(&ctx); MD5Update(&ctx, key, keylen); MD5Final(tk, &ctx); memset((void *) &ctx, 0, sizeof(ctx)); key = tk; --- 240,249 ----
*** 277,324 **** static int dst_hmac_md5_key_to_file_format(const DST_KEY *dkey, char *buff, const int buff_len) { char *bp; ! int len, b_len, i, key_len; u_char key[HMAC_LEN]; HMAC_Key *hkey; if (dkey == NULL || dkey->dk_KEY_struct == NULL) return (0); ! if (buff == NULL || buff_len <= (int) strlen(key_file_fmt_str)) ! return (-1); /* no OR not enough space in output area */ ! hkey = (HMAC_Key *) dkey->dk_KEY_struct; ! memset(buff, 0, buff_len); /* just in case */ /* write file header */ sprintf(buff, key_file_fmt_str, KEY_FILE_FORMAT, KEY_HMAC_MD5, "HMAC"); ! bp = (char *) strchr(buff, '\0'); ! b_len = buff_len - (bp - buff); memset(key, 0, HMAC_LEN); for (i = 0; i < HMAC_LEN; i++) key[i] = hkey->hk_ipad[i] ^ HMAC_IPAD; for (i = HMAC_LEN - 1; i >= 0; i--) if (key[i] != 0) break; key_len = i + 1; strcat(bp, "Key: "); bp += strlen("Key: "); - b_len = buff_len - (bp - buff); ! len = b64_ntop(key, key_len, bp, b_len); if (len < 0) return (-1); bp += len; *(bp++) = '\n'; *bp = '\0'; - b_len = buff_len - (bp - buff); ! return (buff_len - b_len); } /************************************************************************** * dst_hmac_md5_key_from_file_format --- 280,332 ---- static int dst_hmac_md5_key_to_file_format(const DST_KEY *dkey, char *buff, const int buff_len) { char *bp; ! int len, i, key_len; u_char key[HMAC_LEN]; HMAC_Key *hkey; if (dkey == NULL || dkey->dk_KEY_struct == NULL) return (0); ! /* ! * Using snprintf() would be so much simpler here. ! */ ! if (buff == NULL || ! buff_len <= (int)(strlen(key_file_fmt_str) + ! strlen(KEY_FILE_FORMAT) + 4)) ! return (-1); /*%< no OR not enough space in output area */ hkey = (HMAC_Key *) dkey->dk_KEY_struct; ! memset(buff, 0, buff_len); /*%< just in case */ /* write file header */ sprintf(buff, key_file_fmt_str, KEY_FILE_FORMAT, KEY_HMAC_MD5, "HMAC"); ! bp = buff + strlen(buff); memset(key, 0, HMAC_LEN); for (i = 0; i < HMAC_LEN; i++) key[i] = hkey->hk_ipad[i] ^ HMAC_IPAD; for (i = HMAC_LEN - 1; i >= 0; i--) if (key[i] != 0) break; key_len = i + 1; + if (buff_len - (bp - buff) < 6) + return (-1); strcat(bp, "Key: "); bp += strlen("Key: "); ! len = b64_ntop(key, key_len, bp, buff_len - (bp - buff)); if (len < 0) return (-1); bp += len; + if (buff_len - (bp - buff) < 2) + return (-1); *(bp++) = '\n'; *bp = '\0'; ! return (bp - buff); } /************************************************************************** * dst_hmac_md5_key_from_file_format
*** 357,378 **** eol = strchr(p, '\n'); if (eol == NULL) return (-4); len = eol - p; tmp = malloc(len + 2); memcpy(tmp, p, len); *(tmp + len) = 0x0; ! key_len = b64_pton((char *)tmp, key, HMAC_LEN+1); /* see above */ SAFE_FREE2(tmp, len + 2); if (dst_buffer_to_hmac_md5(dkey, key, key_len) < 0) { return (-6); } return (0); } ! /* * dst_hmac_md5_to_dns_key() * function to extract hmac key from DST_KEY structure * intput: * in_key: HMAC-MD5 key * output: --- 365,388 ---- eol = strchr(p, '\n'); if (eol == NULL) return (-4); len = eol - p; tmp = malloc(len + 2); + if (tmp == NULL) + return (-5); memcpy(tmp, p, len); *(tmp + len) = 0x0; ! key_len = b64_pton((char *)tmp, key, HMAC_LEN+1); /*%< see above */ SAFE_FREE2(tmp, len + 2); if (dst_buffer_to_hmac_md5(dkey, key, key_len) < 0) { return (-6); } return (0); } ! /*% * dst_hmac_md5_to_dns_key() * function to extract hmac key from DST_KEY structure * intput: * in_key: HMAC-MD5 key * output:
*** 437,483 **** */ static int dst_hmac_md5_generate_key(DST_KEY *key, const int nothing) { ! u_char *buff; ! int i, n, size; ! ! i = nothing; ! ! if (key == NULL || key->dk_alg != KEY_HMAC_MD5) ! return (0); ! size = (key->dk_key_size + 7) / 8; /* convert to bytes */ ! if (size <= 0) ! return(0); ! ! i = size > 64 ? 64 : size; ! buff = malloc(i+8); ! ! n = dst_random(DST_RAND_SEMI, i, buff); ! n += dst_random(DST_RAND_KEY, i, buff); ! if (n <= i) { /* failed getting anything */ ! SAFE_FREE2(buff, i); return (-1); - } - n = dst_buffer_to_hmac_md5(key, buff, i); - SAFE_FREE2(buff, i); - if (n <= 0) - return (n); - return (1); } ! /* * dst_hmac_md5_init() Function to answer set up function pointers for HMAC * related functions */ int - #ifdef ORIGINAL_ISC_CODE dst_hmac_md5_init() - #else - dst_md5_hmac_init() - #endif { if (dst_t_func[KEY_HMAC_MD5] != NULL) return (1); dst_t_func[KEY_HMAC_MD5] = malloc(sizeof(struct dst_func)); if (dst_t_func[KEY_HMAC_MD5] == NULL) --- 447,467 ---- */ static int dst_hmac_md5_generate_key(DST_KEY *key, const int nothing) { ! (void)key; ! (void)nothing; return (-1); } ! /*% * dst_hmac_md5_init() Function to answer set up function pointers for HMAC * related functions */ int dst_hmac_md5_init() { if (dst_t_func[KEY_HMAC_MD5] != NULL) return (1); dst_t_func[KEY_HMAC_MD5] = malloc(sizeof(struct dst_func)); if (dst_t_func[KEY_HMAC_MD5] == NULL)
*** 494,510 **** dst_t_func[KEY_HMAC_MD5]->from_file_fmt = dst_hmac_md5_key_from_file_format; return (1); } #else int dst_hmac_md5_init(){ return (0); } #endif ! ! ! ! ! ! --- 478,491 ---- dst_t_func[KEY_HMAC_MD5]->from_file_fmt = dst_hmac_md5_key_from_file_format; return (1); } #else + #define dst_hmac_md5_init __dst_hmac_md5_init + int dst_hmac_md5_init(){ return (0); } #endif ! /*! \file */