18ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
28ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
38ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
48ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ***********************************************************************
58ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ** md5.c -- the source code for MD5 routines                         **
68ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ** RSA Data Security, Inc. MD5 Message-Digest Algorithm              **
78ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ** Created: 2/17/90 RLR                                              **
88ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ** Revised: 1/91 SRD,AJ,BSK,JT Reference C ver., 7/10 constant corr. **
98ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ***********************************************************************
108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ***********************************************************************
148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ** Copyright (C) 1990, RSA Data Security, Inc. All rights reserved.  **
158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project **                                                                   **
168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ** License to copy and use this software is granted provided that    **
178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ** it is identified as the "RSA Data Security, Inc. MD5 Message-     **
188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ** Digest Algorithm" in all material mentioning or referencing this  **
198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ** software or this function.                                        **
208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project **                                                                   **
218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ** License is also granted to make and use derivative works          **
228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ** provided that such works are identified as "derived from the RSA  **
238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ** Data Security, Inc. MD5 Message-Digest Algorithm" in all          **
248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ** material mentioning or referencing the derived work.              **
258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project **                                                                   **
268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ** RSA Data Security, Inc. makes no representations concerning       **
278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ** either the merchantability of this software or the suitability    **
288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ** of this software for any particular purpose.  It is provided "as  **
298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ** is" without express or implied warranty of any kind.              **
308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project **                                                                   **
318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ** These notices must be retained in any copies of any part of this  **
328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ** documentation and/or software.                                    **
338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ***********************************************************************
348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <string.h>
378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include "md5.h"
388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ***********************************************************************
418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project **  Message-digest routines:                                         **
428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project **  To form the message digest for a message M                       **
438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project **    (1) Initialize a context buffer mdContext using MD5_Init       **
448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project **    (2) Call MD5_Update on mdContext and M                         **
458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project **    (3) Call MD5_Final on mdContext                                **
468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project **  The message digest is now in mdContext->digest[0...15]           **
478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ***********************************************************************
488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* forward declaration */
518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic void Transform ();
528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic unsigned char PADDING[64] = {
548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project};
638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* F, G, H and I are basic MD5 functions */
658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define H(x, y, z) ((x) ^ (y) ^ (z))
688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define I(x, y, z) ((y) ^ ((x) | (~z)))
698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* ROTATE_LEFT rotates x left n bits */
718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4 */
748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* Rotation is separate from addition to prevent recomputation */
758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define FF(a, b, c, d, x, s, ac) \
768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  {(a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); \
778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project   (a) = ROTATE_LEFT ((a), (s)); \
788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project   (a) += (b); \
798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  }
808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define GG(a, b, c, d, x, s, ac) \
818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  {(a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); \
828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project   (a) = ROTATE_LEFT ((a), (s)); \
838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project   (a) += (b); \
848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  }
858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define HH(a, b, c, d, x, s, ac) \
868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  {(a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); \
878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project   (a) = ROTATE_LEFT ((a), (s)); \
888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project   (a) += (b); \
898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  }
908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define II(a, b, c, d, x, s, ac) \
918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  {(a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); \
928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project   (a) = ROTATE_LEFT ((a), (s)); \
938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project   (a) += (b); \
948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  }
958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#ifdef __STDC__
978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define UL(x)	x##U
988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#else
998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define UL(x)	x
1008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif
1018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* The routine MD5_Init initializes the message-digest context
1038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project   mdContext. All fields are set to zero.
1048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
1058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid MD5_Init (mdContext)
1068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source ProjectMD5_CTX *mdContext;
1078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
1088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  mdContext->i[0] = mdContext->i[1] = (UINT4)0;
1098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  /* Load magic initialization constants.
1118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project   */
1128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  mdContext->buf[0] = (UINT4)0x67452301;
1138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  mdContext->buf[1] = (UINT4)0xefcdab89;
1148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  mdContext->buf[2] = (UINT4)0x98badcfe;
1158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  mdContext->buf[3] = (UINT4)0x10325476;
1168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
1178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* The routine MD5Update updates the message-digest context to
1198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project   account for the presence of each of the characters inBuf[0..inLen-1]
1208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project   in the message whose digest is being computed.
1218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
1228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid MD5_Update (mdContext, inBuf, inLen)
1238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source ProjectMD5_CTX *mdContext;
1248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectunsigned char *inBuf;
1258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectunsigned int inLen;
1268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
1278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  UINT4 in[16];
1288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  int mdi;
1298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  unsigned int i, ii;
1308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  /* compute number of bytes mod 64 */
1328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  mdi = (int)((mdContext->i[0] >> 3) & 0x3F);
1338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  /* update number of bits */
1358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  if ((mdContext->i[0] + ((UINT4)inLen << 3)) < mdContext->i[0])
1368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    mdContext->i[1]++;
1378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  mdContext->i[0] += ((UINT4)inLen << 3);
1388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  mdContext->i[1] += ((UINT4)inLen >> 29);
1398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  while (inLen--) {
1418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    /* add new character to buffer, increment mdi */
1428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    mdContext->in[mdi++] = *inBuf++;
1438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    /* transform if necessary */
1458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    if (mdi == 0x40) {
1468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project      for (i = 0, ii = 0; i < 16; i++, ii += 4)
1478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project        in[i] = (((UINT4)mdContext->in[ii+3]) << 24) |
1488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project                (((UINT4)mdContext->in[ii+2]) << 16) |
1498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project                (((UINT4)mdContext->in[ii+1]) << 8) |
1508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project                ((UINT4)mdContext->in[ii]);
1518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project      Transform (mdContext->buf, in);
1528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project      mdi = 0;
1538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    }
1548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  }
1558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
1568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* The routine MD5Final terminates the message-digest computation and
1588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project   ends with the desired message digest in mdContext->digest[0...15].
1598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
1608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid MD5_Final (hash, mdContext)
1618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectunsigned char hash[];
1628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source ProjectMD5_CTX *mdContext;
1638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
1648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  UINT4 in[16];
1658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  int mdi;
1668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  unsigned int i, ii;
1678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  unsigned int padLen;
1688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  /* save number of bits */
1708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  in[14] = mdContext->i[0];
1718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  in[15] = mdContext->i[1];
1728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  /* compute number of bytes mod 64 */
1748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  mdi = (int)((mdContext->i[0] >> 3) & 0x3F);
1758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  /* pad out to 56 mod 64 */
1778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  padLen = (mdi < 56) ? (56 - mdi) : (120 - mdi);
1788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  MD5_Update (mdContext, PADDING, padLen);
1798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  /* append length in bits and transform */
1818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  for (i = 0, ii = 0; i < 14; i++, ii += 4)
1828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    in[i] = (((UINT4)mdContext->in[ii+3]) << 24) |
1838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project            (((UINT4)mdContext->in[ii+2]) << 16) |
1848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project            (((UINT4)mdContext->in[ii+1]) << 8) |
1858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project            ((UINT4)mdContext->in[ii]);
1868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  Transform (mdContext->buf, in);
1878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  /* store buffer in digest */
1898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  for (i = 0, ii = 0; i < 4; i++, ii += 4) {
1908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    mdContext->digest[ii] = (unsigned char)(mdContext->buf[i] & 0xFF);
1918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    mdContext->digest[ii+1] =
1928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project      (unsigned char)((mdContext->buf[i] >> 8) & 0xFF);
1938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    mdContext->digest[ii+2] =
1948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project      (unsigned char)((mdContext->buf[i] >> 16) & 0xFF);
1958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    mdContext->digest[ii+3] =
1968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project      (unsigned char)((mdContext->buf[i] >> 24) & 0xFF);
1978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  }
1988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  memcpy(hash, mdContext->digest, 16);
1998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
2008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* Basic MD5 step. Transforms buf based on in.
2028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
2038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic void Transform (buf, in)
2048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source ProjectUINT4 *buf;
2058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source ProjectUINT4 *in;
2068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
2078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  UINT4 a = buf[0], b = buf[1], c = buf[2], d = buf[3];
2088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  /* Round 1 */
2108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define S11 7
2118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define S12 12
2128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define S13 17
2138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define S14 22
2148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  FF ( a, b, c, d, in[ 0], S11, UL(3614090360)); /* 1 */
2158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  FF ( d, a, b, c, in[ 1], S12, UL(3905402710)); /* 2 */
2168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  FF ( c, d, a, b, in[ 2], S13, UL( 606105819)); /* 3 */
2178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  FF ( b, c, d, a, in[ 3], S14, UL(3250441966)); /* 4 */
2188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  FF ( a, b, c, d, in[ 4], S11, UL(4118548399)); /* 5 */
2198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  FF ( d, a, b, c, in[ 5], S12, UL(1200080426)); /* 6 */
2208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  FF ( c, d, a, b, in[ 6], S13, UL(2821735955)); /* 7 */
2218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  FF ( b, c, d, a, in[ 7], S14, UL(4249261313)); /* 8 */
2228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  FF ( a, b, c, d, in[ 8], S11, UL(1770035416)); /* 9 */
2238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  FF ( d, a, b, c, in[ 9], S12, UL(2336552879)); /* 10 */
2248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  FF ( c, d, a, b, in[10], S13, UL(4294925233)); /* 11 */
2258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  FF ( b, c, d, a, in[11], S14, UL(2304563134)); /* 12 */
2268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  FF ( a, b, c, d, in[12], S11, UL(1804603682)); /* 13 */
2278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  FF ( d, a, b, c, in[13], S12, UL(4254626195)); /* 14 */
2288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  FF ( c, d, a, b, in[14], S13, UL(2792965006)); /* 15 */
2298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  FF ( b, c, d, a, in[15], S14, UL(1236535329)); /* 16 */
2308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  /* Round 2 */
2328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define S21 5
2338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define S22 9
2348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define S23 14
2358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define S24 20
2368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  GG ( a, b, c, d, in[ 1], S21, UL(4129170786)); /* 17 */
2378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  GG ( d, a, b, c, in[ 6], S22, UL(3225465664)); /* 18 */
2388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  GG ( c, d, a, b, in[11], S23, UL( 643717713)); /* 19 */
2398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  GG ( b, c, d, a, in[ 0], S24, UL(3921069994)); /* 20 */
2408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  GG ( a, b, c, d, in[ 5], S21, UL(3593408605)); /* 21 */
2418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  GG ( d, a, b, c, in[10], S22, UL(  38016083)); /* 22 */
2428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  GG ( c, d, a, b, in[15], S23, UL(3634488961)); /* 23 */
2438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  GG ( b, c, d, a, in[ 4], S24, UL(3889429448)); /* 24 */
2448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  GG ( a, b, c, d, in[ 9], S21, UL( 568446438)); /* 25 */
2458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  GG ( d, a, b, c, in[14], S22, UL(3275163606)); /* 26 */
2468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  GG ( c, d, a, b, in[ 3], S23, UL(4107603335)); /* 27 */
2478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  GG ( b, c, d, a, in[ 8], S24, UL(1163531501)); /* 28 */
2488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  GG ( a, b, c, d, in[13], S21, UL(2850285829)); /* 29 */
2498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  GG ( d, a, b, c, in[ 2], S22, UL(4243563512)); /* 30 */
2508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  GG ( c, d, a, b, in[ 7], S23, UL(1735328473)); /* 31 */
2518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  GG ( b, c, d, a, in[12], S24, UL(2368359562)); /* 32 */
2528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  /* Round 3 */
2548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define S31 4
2558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define S32 11
2568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define S33 16
2578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define S34 23
2588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  HH ( a, b, c, d, in[ 5], S31, UL(4294588738)); /* 33 */
2598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  HH ( d, a, b, c, in[ 8], S32, UL(2272392833)); /* 34 */
2608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  HH ( c, d, a, b, in[11], S33, UL(1839030562)); /* 35 */
2618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  HH ( b, c, d, a, in[14], S34, UL(4259657740)); /* 36 */
2628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  HH ( a, b, c, d, in[ 1], S31, UL(2763975236)); /* 37 */
2638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  HH ( d, a, b, c, in[ 4], S32, UL(1272893353)); /* 38 */
2648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  HH ( c, d, a, b, in[ 7], S33, UL(4139469664)); /* 39 */
2658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  HH ( b, c, d, a, in[10], S34, UL(3200236656)); /* 40 */
2668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  HH ( a, b, c, d, in[13], S31, UL( 681279174)); /* 41 */
2678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  HH ( d, a, b, c, in[ 0], S32, UL(3936430074)); /* 42 */
2688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  HH ( c, d, a, b, in[ 3], S33, UL(3572445317)); /* 43 */
2698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  HH ( b, c, d, a, in[ 6], S34, UL(  76029189)); /* 44 */
2708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  HH ( a, b, c, d, in[ 9], S31, UL(3654602809)); /* 45 */
2718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  HH ( d, a, b, c, in[12], S32, UL(3873151461)); /* 46 */
2728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  HH ( c, d, a, b, in[15], S33, UL( 530742520)); /* 47 */
2738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  HH ( b, c, d, a, in[ 2], S34, UL(3299628645)); /* 48 */
2748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  /* Round 4 */
2768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define S41 6
2778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define S42 10
2788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define S43 15
2798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define S44 21
2808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  II ( a, b, c, d, in[ 0], S41, UL(4096336452)); /* 49 */
2818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  II ( d, a, b, c, in[ 7], S42, UL(1126891415)); /* 50 */
2828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  II ( c, d, a, b, in[14], S43, UL(2878612391)); /* 51 */
2838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  II ( b, c, d, a, in[ 5], S44, UL(4237533241)); /* 52 */
2848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  II ( a, b, c, d, in[12], S41, UL(1700485571)); /* 53 */
2858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  II ( d, a, b, c, in[ 3], S42, UL(2399980690)); /* 54 */
2868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  II ( c, d, a, b, in[10], S43, UL(4293915773)); /* 55 */
2878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  II ( b, c, d, a, in[ 1], S44, UL(2240044497)); /* 56 */
2888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  II ( a, b, c, d, in[ 8], S41, UL(1873313359)); /* 57 */
2898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  II ( d, a, b, c, in[15], S42, UL(4264355552)); /* 58 */
2908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  II ( c, d, a, b, in[ 6], S43, UL(2734768916)); /* 59 */
2918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  II ( b, c, d, a, in[13], S44, UL(1309151649)); /* 60 */
2928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  II ( a, b, c, d, in[ 4], S41, UL(4149444226)); /* 61 */
2938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  II ( d, a, b, c, in[11], S42, UL(3174756917)); /* 62 */
2948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  II ( c, d, a, b, in[ 2], S43, UL( 718787259)); /* 63 */
2958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  II ( b, c, d, a, in[ 9], S44, UL(3951481745)); /* 64 */
2968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  buf[0] += a;
2988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  buf[1] += b;
2998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  buf[2] += c;
3008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project  buf[3] += d;
3018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
3028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
3048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ***********************************************************************
3058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ** End of md5.c                                                      **
3068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ******************************** (cut) ********************************
3078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
308