Annotation of embedaddon/ntp/lib/isc/hmacmd5.c, revision 1.1

1.1     ! misho       1: /*
        !             2:  * Copyright (C) 2004-2007  Internet Systems Consortium, Inc. ("ISC")
        !             3:  * Copyright (C) 2000, 2001  Internet Software Consortium.
        !             4:  *
        !             5:  * Permission to use, copy, modify, and/or 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 WITH
        !            10:  * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
        !            11:  * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
        !            12:  * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
        !            13:  * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
        !            14:  * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
        !            15:  * PERFORMANCE OF THIS SOFTWARE.
        !            16:  */
        !            17: 
        !            18: /* $Id: hmacmd5.c,v 1.14 2007/06/19 23:47:17 tbox Exp $ */
        !            19: 
        !            20: /*! \file
        !            21:  * This code implements the HMAC-MD5 keyed hash algorithm
        !            22:  * described in RFC2104.
        !            23:  */
        !            24: 
        !            25: #include "config.h"
        !            26: 
        !            27: #include <isc/assertions.h>
        !            28: #include <isc/hmacmd5.h>
        !            29: #include <isc/md5.h>
        !            30: #include <isc/string.h>
        !            31: #include <isc/types.h>
        !            32: #include <isc/util.h>
        !            33: 
        !            34: #define PADLEN 64
        !            35: #define IPAD 0x36
        !            36: #define OPAD 0x5C
        !            37: 
        !            38: /*!
        !            39:  * Start HMAC-MD5 process.  Initialize an md5 context and digest the key.
        !            40:  */
        !            41: void
        !            42: isc_hmacmd5_init(isc_hmacmd5_t *ctx, const unsigned char *key,
        !            43:                 unsigned int len)
        !            44: {
        !            45:        unsigned char ipad[PADLEN];
        !            46:        int i;
        !            47: 
        !            48:        memset(ctx->key, 0, sizeof(ctx->key));
        !            49:        if (len > sizeof(ctx->key)) {
        !            50:                isc_md5_t md5ctx;
        !            51:                isc_md5_init(&md5ctx);
        !            52:                isc_md5_update(&md5ctx, key, len);
        !            53:                isc_md5_final(&md5ctx, ctx->key);
        !            54:        } else
        !            55:                memcpy(ctx->key, key, len);
        !            56: 
        !            57:        isc_md5_init(&ctx->md5ctx);
        !            58:        memset(ipad, IPAD, sizeof(ipad));
        !            59:        for (i = 0; i < PADLEN; i++)
        !            60:                ipad[i] ^= ctx->key[i];
        !            61:        isc_md5_update(&ctx->md5ctx, ipad, sizeof(ipad));
        !            62: }
        !            63: 
        !            64: void
        !            65: isc_hmacmd5_invalidate(isc_hmacmd5_t *ctx) {
        !            66:        isc_md5_invalidate(&ctx->md5ctx);
        !            67:        memset(ctx->key, 0, sizeof(ctx->key));
        !            68: }
        !            69: 
        !            70: /*!
        !            71:  * Update context to reflect the concatenation of another buffer full
        !            72:  * of bytes.
        !            73:  */
        !            74: void
        !            75: isc_hmacmd5_update(isc_hmacmd5_t *ctx, const unsigned char *buf,
        !            76:                   unsigned int len)
        !            77: {
        !            78:        isc_md5_update(&ctx->md5ctx, buf, len);
        !            79: }
        !            80: 
        !            81: /*!
        !            82:  * Compute signature - finalize MD5 operation and reapply MD5.
        !            83:  */
        !            84: void
        !            85: isc_hmacmd5_sign(isc_hmacmd5_t *ctx, unsigned char *digest) {
        !            86:        unsigned char opad[PADLEN];
        !            87:        int i;
        !            88: 
        !            89:        isc_md5_final(&ctx->md5ctx, digest);
        !            90: 
        !            91:        memset(opad, OPAD, sizeof(opad));
        !            92:        for (i = 0; i < PADLEN; i++)
        !            93:                opad[i] ^= ctx->key[i];
        !            94: 
        !            95:        isc_md5_init(&ctx->md5ctx);
        !            96:        isc_md5_update(&ctx->md5ctx, opad, sizeof(opad));
        !            97:        isc_md5_update(&ctx->md5ctx, digest, ISC_MD5_DIGESTLENGTH);
        !            98:        isc_md5_final(&ctx->md5ctx, digest);
        !            99:        isc_hmacmd5_invalidate(ctx);
        !           100: }
        !           101: 
        !           102: /*!
        !           103:  * Verify signature - finalize MD5 operation and reapply MD5, then
        !           104:  * compare to the supplied digest.
        !           105:  */
        !           106: isc_boolean_t
        !           107: isc_hmacmd5_verify(isc_hmacmd5_t *ctx, unsigned char *digest) {
        !           108:        return (isc_hmacmd5_verify2(ctx, digest, ISC_MD5_DIGESTLENGTH));
        !           109: }
        !           110: 
        !           111: isc_boolean_t
        !           112: isc_hmacmd5_verify2(isc_hmacmd5_t *ctx, unsigned char *digest, size_t len) {
        !           113:        unsigned char newdigest[ISC_MD5_DIGESTLENGTH];
        !           114: 
        !           115:        REQUIRE(len <= ISC_MD5_DIGESTLENGTH);
        !           116:        isc_hmacmd5_sign(ctx, newdigest);
        !           117:        return (ISC_TF(memcmp(digest, newdigest, len) == 0));
        !           118: }

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