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