hmac.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:6k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.  * FILE:    hmac.c
  3.  * AUTHORS: Colin Perkins
  4.  *
  5.  * HMAC message authentication (RFC2104)
  6.  * 
  7.  * Copyright (c) 1998-2000 University College London
  8.  * All rights reserved.
  9.  *
  10.  * Redistribution and use in source and binary forms, with or without
  11.  * modification, is permitted provided that the following conditions 
  12.  * are met:
  13.  * 1. Redistributions of source code must retain the above copyright
  14.  *    notice, this list of conditions and the following disclaimer.
  15.  * 2. Redistributions in binary form must reproduce the above copyright
  16.  *    notice, this list of conditions and the following disclaimer in the
  17.  *    documentation and/or other materials provided with the distribution.
  18.  * 3. All advertising materials mentioning features or use of this software
  19.  *    must display the following acknowledgement:
  20.  *      This product includes software developed by the Computer Science
  21.  *      Department at University College London
  22.  * 4. Neither the name of the University nor of the Department may be used
  23.  *    to endorse or promote products derived from this software without
  24.  *    specific prior written permission.
  25.  * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
  26.  * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  27.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  28.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
  29.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  30.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  31.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  32.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  33.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  34.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  35.  * SUCH DAMAGE.
  36.  */
  37. #include "config_unix.h"
  38. #include "config_win32.h"
  39. #include "md5.h"
  40. #include "hmac.h"
  41. /**
  42.  * hmac_md5:
  43.  * @data: pointer to data stream.
  44.  * @data_len: length of data stream in bytes.
  45.  * @key: pointer to authentication key.
  46.  * @key_len: length of authentication key in bytes.
  47.  * @digest: digest to be filled in.
  48.  * 
  49.  * Computes MD5 @digest of @data using key @key. 
  50.  * 
  51.  **/
  52. void hmac_md5(unsigned char   *data,    
  53.       int              data_len,   
  54.       unsigned char   *key,     
  55.       int              key_len,    
  56.       unsigned char    digest[16]) 
  57. {
  58.         MD5_CTX       context;
  59.         unsigned char k_ipad[65];    /* inner padding - key XORd with ipad */
  60.         unsigned char k_opad[65];    /* outer padding - key XORd with opad */
  61.         unsigned char tk[16];
  62.         int           i;
  63.         /* If key is longer than 64 bytes reset it to key=MD5(key) */
  64.         if (key_len > 64) {
  65.                 MD5_CTX      tctx;
  66.                 MD5Init(&tctx);
  67.                 MD5Update(&tctx, key, key_len);
  68.                 MD5Final(tk, &tctx);
  69.                 key     = tk;
  70.                 key_len = 16;
  71.         }
  72.         /*
  73.          * The HMAC_MD5 transform looks like:
  74.          *
  75.          * MD5(K XOR opad, MD5(K XOR ipad, data))
  76.          *
  77.          * where K is an n byte key
  78.          * ipad is the byte 0x36 repeated 64 times
  79.          * opad is the byte 0x5c repeated 64 times
  80.          * and text is the data being protected
  81.          */
  82.         /* Start out by storing key in pads */
  83.         memset(k_ipad, 0, sizeof(k_ipad));
  84.         memset(k_opad, 0, sizeof(k_opad));
  85.         memcpy(k_ipad, key, key_len);
  86.         memcpy(k_opad, key, key_len);
  87.         /* XOR key with ipad and opad values */
  88.         for (i=0; i<64; i++) {
  89.                 k_ipad[i] ^= 0x36;
  90.                 k_opad[i] ^= 0x5c;
  91.         }
  92.         /*
  93.          * perform inner MD5
  94.          */
  95.         MD5Init(&context);                   /* init context for 1st pass */
  96.         MD5Update(&context, k_ipad, 64);     /* start with inner pad      */
  97.         MD5Update(&context, data, data_len); /* then text of datagram     */
  98.         MD5Final(digest, &context);          /* finish up 1st pass        */
  99.         /*
  100.          * perform outer MD5
  101.          */
  102.         MD5Init(&context);                   /* init context for 2nd pass */
  103.         MD5Update(&context, k_opad, 64);     /* start with outer pad      */
  104.         MD5Update(&context, digest, 16);     /* then results of 1st hash  */
  105.         MD5Final(digest, &context);          /* finish up 2nd pass        */
  106. }
  107. /*
  108.  * Test Vectors (Trailing '' of a character string not included in test):
  109.  * 
  110.  * key =         0x0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b
  111.  * key_len =     16 bytes
  112.  * data =        "Hi There"
  113.  * data_len =    8  bytes
  114.  * digest =      0x9294727a3638bb1c13f48ef8158bfc9d
  115.  *
  116.  * key =         "Jefe"
  117.  * data =        "what do ya want for nothing?"
  118.  * data_len =    28 bytes
  119.  * digest =      0x750c783e6ab0b503eaa86e310a5db738
  120.  *
  121.  * key =         0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  122.  * key_len       16 bytes
  123.  * data =        0xDDDDDDDDDDDDDDDDDDDD...
  124.  *               ..DDDDDDDDDDDDDDDDDDDD...
  125.  *               ..DDDDDDDDDDDDDDDDDDDD...
  126.  *               ..DDDDDDDDDDDDDDDDDDDD...
  127.  *               ..DDDDDDDDDDDDDDDDDDDD
  128.  * data_len =    50 bytes
  129.  * digest =      0x56be34521d144c88dbb8c733f0e8b3f6
  130.  */
  131. #ifdef TEST_HMAC
  132. int main()
  133. {
  134. unsigned char *key  = "Jefe";
  135. unsigned char *data = "what do ya want for nothing?";
  136. unsigned char  digest[16];
  137. int  i;
  138. hmac_md5(data, 28, key, 4, digest);
  139. for (i = 0; i < 16; i++) {
  140. printf("%02x", digest[i]);
  141. }
  142. printf("n");
  143. return 0;
  144. }
  145. #endif