Home | History | Annotate | Line # | Download | only in dist
      1  1.1  christos /*	$NetBSD: md5.c,v 1.1.1.1 2012/03/23 21:20:01 christos Exp $	*/
      2  1.1  christos 
      3  1.1  christos 
      4  1.1  christos 
      5  1.1  christos /*
      6  1.1  christos  ***********************************************************************
      7  1.1  christos  ** md5.c -- the source code for MD5 routines                         **
      8  1.1  christos  ** RSA Data Security, Inc. MD5 Message-Digest Algorithm              **
      9  1.1  christos  ** Created: 2/17/90 RLR                                              **
     10  1.1  christos  ** Revised: 1/91 SRD,AJ,BSK,JT Reference C ver., 7/10 constant corr. **
     11  1.1  christos  ***********************************************************************
     12  1.1  christos  */
     13  1.1  christos 
     14  1.1  christos /*
     15  1.1  christos  ***********************************************************************
     16  1.1  christos  ** Copyright (C) 1990, RSA Data Security, Inc. All rights reserved.  **
     17  1.1  christos  **                                                                   **
     18  1.1  christos  ** License to copy and use this software is granted provided that    **
     19  1.1  christos  ** it is identified as the "RSA Data Security, Inc. MD5 Message-     **
     20  1.1  christos  ** Digest Algorithm" in all material mentioning or referencing this  **
     21  1.1  christos  ** software or this function.                                        **
     22  1.1  christos  **                                                                   **
     23  1.1  christos  ** License is also granted to make and use derivative works          **
     24  1.1  christos  ** provided that such works are identified as "derived from the RSA  **
     25  1.1  christos  ** Data Security, Inc. MD5 Message-Digest Algorithm" in all          **
     26  1.1  christos  ** material mentioning or referencing the derived work.              **
     27  1.1  christos  **                                                                   **
     28  1.1  christos  ** RSA Data Security, Inc. makes no representations concerning       **
     29  1.1  christos  ** either the merchantability of this software or the suitability    **
     30  1.1  christos  ** of this software for any particular purpose.  It is provided "as  **
     31  1.1  christos  ** is" without express or implied warranty of any kind.              **
     32  1.1  christos  **                                                                   **
     33  1.1  christos  ** These notices must be retained in any copies of any part of this  **
     34  1.1  christos  ** documentation and/or software.                                    **
     35  1.1  christos  ***********************************************************************
     36  1.1  christos  */
     37  1.1  christos 
     38  1.1  christos #if defined(linux) && defined(_KERNEL)
     39  1.1  christos extern void *memcpy(void *, const void *, unsigned long);
     40  1.1  christos # define	bcopy(a,b,c)	memcpy(b,a,c)
     41  1.1  christos #else
     42  1.1  christos # if defined(_KERNEL) && !defined(__sgi)
     43  1.1  christos #  include <sys/systm.h>
     44  1.1  christos # else
     45  1.1  christos #  include <string.h>
     46  1.1  christos # endif
     47  1.1  christos #endif
     48  1.1  christos 
     49  1.1  christos #include "md5.h"
     50  1.1  christos 
     51  1.1  christos /*
     52  1.1  christos  ***********************************************************************
     53  1.1  christos  **  Message-digest routines:                                         **
     54  1.1  christos  **  To form the message digest for a message M                       **
     55  1.1  christos  **    (1) Initialize a context buffer mdContext using MD5Init        **
     56  1.1  christos  **    (2) Call MD5Update on mdContext and M                          **
     57  1.1  christos  **    (3) Call MD5Final on mdContext                                 **
     58  1.1  christos  **  The message digest is now in mdContext->digest[0...15]           **
     59  1.1  christos  ***********************************************************************
     60  1.1  christos  */
     61  1.1  christos 
     62  1.1  christos /* forward declaration */
     63  1.1  christos static void Transform __P((UINT4 *, UINT4 *));
     64  1.1  christos 
     65  1.1  christos static unsigned char PADDING[64] = {
     66  1.1  christos   0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     67  1.1  christos   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     68  1.1  christos   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     69  1.1  christos   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     70  1.1  christos   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     71  1.1  christos   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     72  1.1  christos   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     73  1.1  christos   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
     74  1.1  christos };
     75  1.1  christos 
     76  1.1  christos /* F, G, H and I are basic MD5 functions */
     77  1.1  christos #define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
     78  1.1  christos #define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
     79  1.1  christos #define H(x, y, z) ((x) ^ (y) ^ (z))
     80  1.1  christos #define I(x, y, z) ((y) ^ ((x) | (~z)))
     81  1.1  christos 
     82  1.1  christos /* ROTATE_LEFT rotates x left n bits */
     83  1.1  christos #define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
     84  1.1  christos 
     85  1.1  christos /* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4 */
     86  1.1  christos /* Rotation is separate from addition to prevent recomputation */
     87  1.1  christos #define FF(a, b, c, d, x, s, ac) \
     88  1.1  christos   {(a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); \
     89  1.1  christos    (a) = ROTATE_LEFT ((a), (s)); \
     90  1.1  christos    (a) += (b); \
     91  1.1  christos   }
     92  1.1  christos #define GG(a, b, c, d, x, s, ac) \
     93  1.1  christos   {(a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); \
     94  1.1  christos    (a) = ROTATE_LEFT ((a), (s)); \
     95  1.1  christos    (a) += (b); \
     96  1.1  christos   }
     97  1.1  christos #define HH(a, b, c, d, x, s, ac) \
     98  1.1  christos   {(a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); \
     99  1.1  christos    (a) = ROTATE_LEFT ((a), (s)); \
    100  1.1  christos    (a) += (b); \
    101  1.1  christos   }
    102  1.1  christos #define II(a, b, c, d, x, s, ac) \
    103  1.1  christos   {(a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); \
    104  1.1  christos    (a) = ROTATE_LEFT ((a), (s)); \
    105  1.1  christos    (a) += (b); \
    106  1.1  christos   }
    107  1.1  christos 
    108  1.1  christos #ifdef __STDC__
    109  1.1  christos #define UL(x)	x##U
    110  1.1  christos #else
    111  1.1  christos #define UL(x)	x
    112  1.1  christos #endif
    113  1.1  christos 
    114  1.1  christos /* The routine MD5Init initializes the message-digest context
    115  1.1  christos    mdContext. All fields are set to zero.
    116  1.1  christos  */
    117  1.1  christos void MD5Init (mdContext)
    118  1.1  christos MD5_CTX *mdContext;
    119  1.1  christos {
    120  1.1  christos   mdContext->i[0] = mdContext->i[1] = (UINT4)0;
    121  1.1  christos 
    122  1.1  christos   /* Load magic initialization constants.
    123  1.1  christos    */
    124  1.1  christos   mdContext->buf[0] = (UINT4)0x67452301;
    125  1.1  christos   mdContext->buf[1] = (UINT4)0xefcdab89;
    126  1.1  christos   mdContext->buf[2] = (UINT4)0x98badcfe;
    127  1.1  christos   mdContext->buf[3] = (UINT4)0x10325476;
    128  1.1  christos }
    129  1.1  christos 
    130  1.1  christos /* The routine MD5Update updates the message-digest context to
    131  1.1  christos    account for the presence of each of the characters inBuf[0..inLen-1]
    132  1.1  christos    in the message whose digest is being computed.
    133  1.1  christos  */
    134  1.1  christos void MD5Update (mdContext, inBuf, inLen)
    135  1.1  christos MD5_CTX *mdContext;
    136  1.1  christos unsigned char *inBuf;
    137  1.1  christos unsigned int inLen;
    138  1.1  christos {
    139  1.1  christos   UINT4 in[16];
    140  1.1  christos   int mdi;
    141  1.1  christos   unsigned int i, ii;
    142  1.1  christos 
    143  1.1  christos   /* compute number of bytes mod 64 */
    144  1.1  christos   mdi = (int)((mdContext->i[0] >> 3) & 0x3F);
    145  1.1  christos 
    146  1.1  christos   /* update number of bits */
    147  1.1  christos   if ((mdContext->i[0] + ((UINT4)inLen << 3)) < mdContext->i[0])
    148  1.1  christos     mdContext->i[1]++;
    149  1.1  christos   mdContext->i[0] += ((UINT4)inLen << 3);
    150  1.1  christos   mdContext->i[1] += ((UINT4)inLen >> 29);
    151  1.1  christos 
    152  1.1  christos   while (inLen--) {
    153  1.1  christos     /* add new character to buffer, increment mdi */
    154  1.1  christos     mdContext->in[mdi++] = *inBuf++;
    155  1.1  christos 
    156  1.1  christos     /* transform if necessary */
    157  1.1  christos     if (mdi == 0x40) {
    158  1.1  christos       for (i = 0, ii = 0; i < 16; i++, ii += 4)
    159  1.1  christos         in[i] = (((UINT4)mdContext->in[ii+3]) << 24) |
    160  1.1  christos                 (((UINT4)mdContext->in[ii+2]) << 16) |
    161  1.1  christos                 (((UINT4)mdContext->in[ii+1]) << 8) |
    162  1.1  christos                 ((UINT4)mdContext->in[ii]);
    163  1.1  christos       Transform (mdContext->buf, in);
    164  1.1  christos       mdi = 0;
    165  1.1  christos     }
    166  1.1  christos   }
    167  1.1  christos }
    168  1.1  christos 
    169  1.1  christos /* The routine MD5Final terminates the message-digest computation and
    170  1.1  christos    ends with the desired message digest in mdContext->digest[0...15].
    171  1.1  christos  */
    172  1.1  christos void MD5Final (hash, mdContext)
    173  1.1  christos unsigned char hash[];
    174  1.1  christos MD5_CTX *mdContext;
    175  1.1  christos {
    176  1.1  christos   UINT4 in[16];
    177  1.1  christos   int mdi;
    178  1.1  christos   unsigned int i, ii;
    179  1.1  christos   unsigned int padLen;
    180  1.1  christos 
    181  1.1  christos   /* save number of bits */
    182  1.1  christos   in[14] = mdContext->i[0];
    183  1.1  christos   in[15] = mdContext->i[1];
    184  1.1  christos 
    185  1.1  christos   /* compute number of bytes mod 64 */
    186  1.1  christos   mdi = (int)((mdContext->i[0] >> 3) & 0x3F);
    187  1.1  christos 
    188  1.1  christos   /* pad out to 56 mod 64 */
    189  1.1  christos   padLen = (mdi < 56) ? (56 - mdi) : (120 - mdi);
    190  1.1  christos   MD5Update (mdContext, PADDING, padLen);
    191  1.1  christos 
    192  1.1  christos   /* append length in bits and transform */
    193  1.1  christos   for (i = 0, ii = 0; i < 14; i++, ii += 4)
    194  1.1  christos     in[i] = (((UINT4)mdContext->in[ii+3]) << 24) |
    195  1.1  christos             (((UINT4)mdContext->in[ii+2]) << 16) |
    196  1.1  christos             (((UINT4)mdContext->in[ii+1]) << 8) |
    197  1.1  christos             ((UINT4)mdContext->in[ii]);
    198  1.1  christos   Transform (mdContext->buf, in);
    199  1.1  christos 
    200  1.1  christos   /* store buffer in digest */
    201  1.1  christos   for (i = 0, ii = 0; i < 4; i++, ii += 4) {
    202  1.1  christos     mdContext->digest[ii] = (unsigned char)(mdContext->buf[i] & 0xFF);
    203  1.1  christos     mdContext->digest[ii+1] =
    204  1.1  christos       (unsigned char)((mdContext->buf[i] >> 8) & 0xFF);
    205  1.1  christos     mdContext->digest[ii+2] =
    206  1.1  christos       (unsigned char)((mdContext->buf[i] >> 16) & 0xFF);
    207  1.1  christos     mdContext->digest[ii+3] =
    208  1.1  christos       (unsigned char)((mdContext->buf[i] >> 24) & 0xFF);
    209  1.1  christos   }
    210  1.1  christos   bcopy((char *)mdContext->digest, (char *)hash, 16);
    211  1.1  christos }
    212  1.1  christos 
    213  1.1  christos /* Basic MD5 step. Transforms buf based on in.
    214  1.1  christos  */
    215  1.1  christos static void Transform (buf, in)
    216  1.1  christos UINT4 *buf;
    217  1.1  christos UINT4 *in;
    218  1.1  christos {
    219  1.1  christos   UINT4 a = buf[0], b = buf[1], c = buf[2], d = buf[3];
    220  1.1  christos 
    221  1.1  christos   /* Round 1 */
    222  1.1  christos #define S11 7
    223  1.1  christos #define S12 12
    224  1.1  christos #define S13 17
    225  1.1  christos #define S14 22
    226  1.1  christos   FF ( a, b, c, d, in[ 0], S11, UL(3614090360)); /* 1 */
    227  1.1  christos   FF ( d, a, b, c, in[ 1], S12, UL(3905402710)); /* 2 */
    228  1.1  christos   FF ( c, d, a, b, in[ 2], S13, UL( 606105819)); /* 3 */
    229  1.1  christos   FF ( b, c, d, a, in[ 3], S14, UL(3250441966)); /* 4 */
    230  1.1  christos   FF ( a, b, c, d, in[ 4], S11, UL(4118548399)); /* 5 */
    231  1.1  christos   FF ( d, a, b, c, in[ 5], S12, UL(1200080426)); /* 6 */
    232  1.1  christos   FF ( c, d, a, b, in[ 6], S13, UL(2821735955)); /* 7 */
    233  1.1  christos   FF ( b, c, d, a, in[ 7], S14, UL(4249261313)); /* 8 */
    234  1.1  christos   FF ( a, b, c, d, in[ 8], S11, UL(1770035416)); /* 9 */
    235  1.1  christos   FF ( d, a, b, c, in[ 9], S12, UL(2336552879)); /* 10 */
    236  1.1  christos   FF ( c, d, a, b, in[10], S13, UL(4294925233)); /* 11 */
    237  1.1  christos   FF ( b, c, d, a, in[11], S14, UL(2304563134)); /* 12 */
    238  1.1  christos   FF ( a, b, c, d, in[12], S11, UL(1804603682)); /* 13 */
    239  1.1  christos   FF ( d, a, b, c, in[13], S12, UL(4254626195)); /* 14 */
    240  1.1  christos   FF ( c, d, a, b, in[14], S13, UL(2792965006)); /* 15 */
    241  1.1  christos   FF ( b, c, d, a, in[15], S14, UL(1236535329)); /* 16 */
    242  1.1  christos 
    243  1.1  christos   /* Round 2 */
    244  1.1  christos #define S21 5
    245  1.1  christos #define S22 9
    246  1.1  christos #define S23 14
    247  1.1  christos #define S24 20
    248  1.1  christos   GG ( a, b, c, d, in[ 1], S21, UL(4129170786)); /* 17 */
    249  1.1  christos   GG ( d, a, b, c, in[ 6], S22, UL(3225465664)); /* 18 */
    250  1.1  christos   GG ( c, d, a, b, in[11], S23, UL( 643717713)); /* 19 */
    251  1.1  christos   GG ( b, c, d, a, in[ 0], S24, UL(3921069994)); /* 20 */
    252  1.1  christos   GG ( a, b, c, d, in[ 5], S21, UL(3593408605)); /* 21 */
    253  1.1  christos   GG ( d, a, b, c, in[10], S22, UL(  38016083)); /* 22 */
    254  1.1  christos   GG ( c, d, a, b, in[15], S23, UL(3634488961)); /* 23 */
    255  1.1  christos   GG ( b, c, d, a, in[ 4], S24, UL(3889429448)); /* 24 */
    256  1.1  christos   GG ( a, b, c, d, in[ 9], S21, UL( 568446438)); /* 25 */
    257  1.1  christos   GG ( d, a, b, c, in[14], S22, UL(3275163606)); /* 26 */
    258  1.1  christos   GG ( c, d, a, b, in[ 3], S23, UL(4107603335)); /* 27 */
    259  1.1  christos   GG ( b, c, d, a, in[ 8], S24, UL(1163531501)); /* 28 */
    260  1.1  christos   GG ( a, b, c, d, in[13], S21, UL(2850285829)); /* 29 */
    261  1.1  christos   GG ( d, a, b, c, in[ 2], S22, UL(4243563512)); /* 30 */
    262  1.1  christos   GG ( c, d, a, b, in[ 7], S23, UL(1735328473)); /* 31 */
    263  1.1  christos   GG ( b, c, d, a, in[12], S24, UL(2368359562)); /* 32 */
    264  1.1  christos 
    265  1.1  christos   /* Round 3 */
    266  1.1  christos #define S31 4
    267  1.1  christos #define S32 11
    268  1.1  christos #define S33 16
    269  1.1  christos #define S34 23
    270  1.1  christos   HH ( a, b, c, d, in[ 5], S31, UL(4294588738)); /* 33 */
    271  1.1  christos   HH ( d, a, b, c, in[ 8], S32, UL(2272392833)); /* 34 */
    272  1.1  christos   HH ( c, d, a, b, in[11], S33, UL(1839030562)); /* 35 */
    273  1.1  christos   HH ( b, c, d, a, in[14], S34, UL(4259657740)); /* 36 */
    274  1.1  christos   HH ( a, b, c, d, in[ 1], S31, UL(2763975236)); /* 37 */
    275  1.1  christos   HH ( d, a, b, c, in[ 4], S32, UL(1272893353)); /* 38 */
    276  1.1  christos   HH ( c, d, a, b, in[ 7], S33, UL(4139469664)); /* 39 */
    277  1.1  christos   HH ( b, c, d, a, in[10], S34, UL(3200236656)); /* 40 */
    278  1.1  christos   HH ( a, b, c, d, in[13], S31, UL( 681279174)); /* 41 */
    279  1.1  christos   HH ( d, a, b, c, in[ 0], S32, UL(3936430074)); /* 42 */
    280  1.1  christos   HH ( c, d, a, b, in[ 3], S33, UL(3572445317)); /* 43 */
    281  1.1  christos   HH ( b, c, d, a, in[ 6], S34, UL(  76029189)); /* 44 */
    282  1.1  christos   HH ( a, b, c, d, in[ 9], S31, UL(3654602809)); /* 45 */
    283  1.1  christos   HH ( d, a, b, c, in[12], S32, UL(3873151461)); /* 46 */
    284  1.1  christos   HH ( c, d, a, b, in[15], S33, UL( 530742520)); /* 47 */
    285  1.1  christos   HH ( b, c, d, a, in[ 2], S34, UL(3299628645)); /* 48 */
    286  1.1  christos 
    287  1.1  christos   /* Round 4 */
    288  1.1  christos #define S41 6
    289  1.1  christos #define S42 10
    290  1.1  christos #define S43 15
    291  1.1  christos #define S44 21
    292  1.1  christos   II ( a, b, c, d, in[ 0], S41, UL(4096336452)); /* 49 */
    293  1.1  christos   II ( d, a, b, c, in[ 7], S42, UL(1126891415)); /* 50 */
    294  1.1  christos   II ( c, d, a, b, in[14], S43, UL(2878612391)); /* 51 */
    295  1.1  christos   II ( b, c, d, a, in[ 5], S44, UL(4237533241)); /* 52 */
    296  1.1  christos   II ( a, b, c, d, in[12], S41, UL(1700485571)); /* 53 */
    297  1.1  christos   II ( d, a, b, c, in[ 3], S42, UL(2399980690)); /* 54 */
    298  1.1  christos   II ( c, d, a, b, in[10], S43, UL(4293915773)); /* 55 */
    299  1.1  christos   II ( b, c, d, a, in[ 1], S44, UL(2240044497)); /* 56 */
    300  1.1  christos   II ( a, b, c, d, in[ 8], S41, UL(1873313359)); /* 57 */
    301  1.1  christos   II ( d, a, b, c, in[15], S42, UL(4264355552)); /* 58 */
    302  1.1  christos   II ( c, d, a, b, in[ 6], S43, UL(2734768916)); /* 59 */
    303  1.1  christos   II ( b, c, d, a, in[13], S44, UL(1309151649)); /* 60 */
    304  1.1  christos   II ( a, b, c, d, in[ 4], S41, UL(4149444226)); /* 61 */
    305  1.1  christos   II ( d, a, b, c, in[11], S42, UL(3174756917)); /* 62 */
    306  1.1  christos   II ( c, d, a, b, in[ 2], S43, UL( 718787259)); /* 63 */
    307  1.1  christos   II ( b, c, d, a, in[ 9], S44, UL(3951481745)); /* 64 */
    308  1.1  christos 
    309  1.1  christos   buf[0] += a;
    310  1.1  christos   buf[1] += b;
    311  1.1  christos   buf[2] += c;
    312  1.1  christos   buf[3] += d;
    313  1.1  christos }
    314  1.1  christos 
    315  1.1  christos /*
    316  1.1  christos  ***********************************************************************
    317  1.1  christos  ** End of md5.c                                                      **
    318  1.1  christos  ******************************** (cut) ********************************
    319  1.1  christos  */
    320