11dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 21dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Copyright (c) 1995 - 2001 Kungliga Tekniska H�gskolan 31dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * (Royal Institute of Technology, Stockholm, Sweden). 41dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * All rights reserved. 51dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 61dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Redistribution and use in source and binary forms, with or without 71dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * modification, are permitted provided that the following conditions 81dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * are met: 91dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * notice, this list of conditions and the following disclaimer. 121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * documentation and/or other materials provided with the distribution. 161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 3. Neither the name of the Institute nor the names of its contributors 181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * may be used to endorse or promote products derived from this software 191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * without specific prior written permission. 201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * SUCH DAMAGE. 321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef HAVE_CONFIG_H 351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include "config.h" 361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__RCSID("$Heimdal: md5.c,v 1.15 2001/01/29 04:33:44 assar Exp $" 381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project "$NetBSD: md5.c,v 1.1.1.4 2002/09/12 12:41:42 joda Exp $"); 391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 41865e3789dd222ca2ec4f173f43085851165a0ecbPaul Lind#include <endian.h> 421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include "md5.h" 431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include "hash.h" 441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define A m->counter[0] 461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define B m->counter[1] 471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define C m->counter[2] 481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define D m->counter[3] 491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define X data 501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectvoid 521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source ProjectMD5_Init (struct md5 *m) 531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{ 541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project m->sz[0] = 0; 551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project m->sz[1] = 0; 561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project D = 0x10325476; 571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project C = 0x98badcfe; 581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project B = 0xefcdab89; 591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project A = 0x67452301; 601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define F(x,y,z) CRAYFIX((x & y) | (~x & z)) 631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define G(x,y,z) CRAYFIX((x & z) | (y & ~z)) 641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define H(x,y,z) (x ^ y ^ z) 651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define I(x,y,z) CRAYFIX(y ^ (x | ~z)) 661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define DOIT(a,b,c,d,k,s,i,OP) \ 681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projecta = b + cshift(a + OP(b,c,d) + X[k] + (i), s) 691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define DO1(a,b,c,d,k,s,i) DOIT(a,b,c,d,k,s,i,F) 711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define DO2(a,b,c,d,k,s,i) DOIT(a,b,c,d,k,s,i,G) 721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define DO3(a,b,c,d,k,s,i) DOIT(a,b,c,d,k,s,i,H) 731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define DO4(a,b,c,d,k,s,i) DOIT(a,b,c,d,k,s,i,I) 741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic inline void 761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectcalc (struct md5 *m, u_int32_t *data) 771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{ 781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_int32_t AA, BB, CC, DD; 791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project AA = A; 811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project BB = B; 821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project CC = C; 831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DD = D; 841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* Round 1 */ 861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DO1(A,B,C,D,0,7,0xd76aa478); 881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DO1(D,A,B,C,1,12,0xe8c7b756); 891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DO1(C,D,A,B,2,17,0x242070db); 901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DO1(B,C,D,A,3,22,0xc1bdceee); 911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DO1(A,B,C,D,4,7,0xf57c0faf); 931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DO1(D,A,B,C,5,12,0x4787c62a); 941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DO1(C,D,A,B,6,17,0xa8304613); 951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DO1(B,C,D,A,7,22,0xfd469501); 961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DO1(A,B,C,D,8,7,0x698098d8); 981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DO1(D,A,B,C,9,12,0x8b44f7af); 991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DO1(C,D,A,B,10,17,0xffff5bb1); 1001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DO1(B,C,D,A,11,22,0x895cd7be); 1011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DO1(A,B,C,D,12,7,0x6b901122); 1031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DO1(D,A,B,C,13,12,0xfd987193); 1041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DO1(C,D,A,B,14,17,0xa679438e); 1051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DO1(B,C,D,A,15,22,0x49b40821); 1061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* Round 2 */ 1081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DO2(A,B,C,D,1,5,0xf61e2562); 1101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DO2(D,A,B,C,6,9,0xc040b340); 1111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DO2(C,D,A,B,11,14,0x265e5a51); 1121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DO2(B,C,D,A,0,20,0xe9b6c7aa); 1131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DO2(A,B,C,D,5,5,0xd62f105d); 1151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DO2(D,A,B,C,10,9,0x2441453); 1161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DO2(C,D,A,B,15,14,0xd8a1e681); 1171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DO2(B,C,D,A,4,20,0xe7d3fbc8); 1181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DO2(A,B,C,D,9,5,0x21e1cde6); 1201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DO2(D,A,B,C,14,9,0xc33707d6); 1211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DO2(C,D,A,B,3,14,0xf4d50d87); 1221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DO2(B,C,D,A,8,20,0x455a14ed); 1231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DO2(A,B,C,D,13,5,0xa9e3e905); 1251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DO2(D,A,B,C,2,9,0xfcefa3f8); 1261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DO2(C,D,A,B,7,14,0x676f02d9); 1271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DO2(B,C,D,A,12,20,0x8d2a4c8a); 1281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* Round 3 */ 1301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DO3(A,B,C,D,5,4,0xfffa3942); 1321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DO3(D,A,B,C,8,11,0x8771f681); 1331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DO3(C,D,A,B,11,16,0x6d9d6122); 1341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DO3(B,C,D,A,14,23,0xfde5380c); 1351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DO3(A,B,C,D,1,4,0xa4beea44); 1371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DO3(D,A,B,C,4,11,0x4bdecfa9); 1381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DO3(C,D,A,B,7,16,0xf6bb4b60); 1391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DO3(B,C,D,A,10,23,0xbebfbc70); 1401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DO3(A,B,C,D,13,4,0x289b7ec6); 1421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DO3(D,A,B,C,0,11,0xeaa127fa); 1431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DO3(C,D,A,B,3,16,0xd4ef3085); 1441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DO3(B,C,D,A,6,23,0x4881d05); 1451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DO3(A,B,C,D,9,4,0xd9d4d039); 1471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DO3(D,A,B,C,12,11,0xe6db99e5); 1481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DO3(C,D,A,B,15,16,0x1fa27cf8); 1491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DO3(B,C,D,A,2,23,0xc4ac5665); 1501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* Round 4 */ 1521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DO4(A,B,C,D,0,6,0xf4292244); 1541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DO4(D,A,B,C,7,10,0x432aff97); 1551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DO4(C,D,A,B,14,15,0xab9423a7); 1561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DO4(B,C,D,A,5,21,0xfc93a039); 1571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DO4(A,B,C,D,12,6,0x655b59c3); 1591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DO4(D,A,B,C,3,10,0x8f0ccc92); 1601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DO4(C,D,A,B,10,15,0xffeff47d); 1611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DO4(B,C,D,A,1,21,0x85845dd1); 1621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DO4(A,B,C,D,8,6,0x6fa87e4f); 1641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DO4(D,A,B,C,15,10,0xfe2ce6e0); 1651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DO4(C,D,A,B,6,15,0xa3014314); 1661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DO4(B,C,D,A,13,21,0x4e0811a1); 1671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DO4(A,B,C,D,4,6,0xf7537e82); 1691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DO4(D,A,B,C,11,10,0xbd3af235); 1701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DO4(C,D,A,B,2,15,0x2ad7d2bb); 1711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DO4(B,C,D,A,9,21,0xeb86d391); 1721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project A += AA; 1741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project B += BB; 1751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project C += CC; 1761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project D += DD; 1771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 1781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 1801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * From `Performance analysis of MD5' by Joseph D. Touch <touch@isi.edu> 1811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 182865e3789dd222ca2ec4f173f43085851165a0ecbPaul Lind#if !defined(__BYTE_ORDER) || !defined (__BIG_ENDIAN) 183865e3789dd222ca2ec4f173f43085851165a0ecbPaul Lind#error __BYTE_ORDER macros not defined 184865e3789dd222ca2ec4f173f43085851165a0ecbPaul Lind#endif 1851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 186865e3789dd222ca2ec4f173f43085851165a0ecbPaul Lind#if __BYTE_ORDER == __BIG_ENDIAN 1871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic inline u_int32_t 1881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectswap_u_int32_t (u_int32_t t) 1891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{ 1901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_int32_t temp1, temp2; 1911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project temp1 = cshift(t, 16); 1931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project temp2 = temp1 >> 8; 1941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project temp1 &= 0x00ff00ff; 1951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project temp2 &= 0x00ff00ff; 1961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project temp1 <<= 8; 1971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return temp1 | temp2; 1981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 1991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 2001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstruct x32{ 2021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project unsigned int a:32; 2031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project unsigned int b:32; 2041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}; 2051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectvoid 2071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source ProjectMD5_Update (struct md5 *m, const void *v, size_t len) 2081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{ 2091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project const unsigned char *p = v; 2101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project size_t old_sz = m->sz[0]; 2111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project size_t offset; 2121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project m->sz[0] += len * 8; 2141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (m->sz[0] < old_sz) 2151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ++m->sz[1]; 2161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project offset = (old_sz / 8) % 64; 2171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while(len > 0){ 2181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project size_t l = min(len, 64 - offset); 2191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project memcpy(m->save + offset, p, l); 2201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project offset += l; 2211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project p += l; 2221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project len -= l; 2231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if(offset == 64){ 224865e3789dd222ca2ec4f173f43085851165a0ecbPaul Lind#if __BYTE_ORDER == __BIG_ENDIAN 2251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int i; 2261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_int32_t current[16]; 2271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project struct x32 *u = (struct x32*)m->save; 2281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project for(i = 0; i < 8; i++){ 2291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project current[2*i+0] = swap_u_int32_t(u[i].a); 2301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project current[2*i+1] = swap_u_int32_t(u[i].b); 2311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 2321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project calc(m, current); 2331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#else 2341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project calc(m, (u_int32_t*)m->save); 2351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 2361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project offset = 0; 2371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 2381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 2391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 2401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectvoid 2421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source ProjectMD5_Final (void *res, struct md5 *m) 2431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{ 244a37cf34eded8a84227e9cbb53befaf4b58cf60c0Glenn Kasten unsigned char zeros[72]; 2451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project unsigned offset = (m->sz[0] / 8) % 64; 2461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project unsigned int dstart = (120 - offset - 1) % 64 + 1; 2471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *zeros = 0x80; 2491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project memset (zeros + 1, 0, sizeof(zeros) - 1); 2501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project zeros[dstart+0] = (m->sz[0] >> 0) & 0xff; 2511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project zeros[dstart+1] = (m->sz[0] >> 8) & 0xff; 2521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project zeros[dstart+2] = (m->sz[0] >> 16) & 0xff; 2531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project zeros[dstart+3] = (m->sz[0] >> 24) & 0xff; 2541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project zeros[dstart+4] = (m->sz[1] >> 0) & 0xff; 2551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project zeros[dstart+5] = (m->sz[1] >> 8) & 0xff; 2561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project zeros[dstart+6] = (m->sz[1] >> 16) & 0xff; 2571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project zeros[dstart+7] = (m->sz[1] >> 24) & 0xff; 2581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project MD5_Update (m, zeros, dstart + 8); 2591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project { 2601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int i; 2611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project unsigned char *r = (unsigned char *)res; 2621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project for (i = 0; i < 4; ++i) { 2641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project r[4*i] = m->counter[i] & 0xFF; 2651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project r[4*i+1] = (m->counter[i] >> 8) & 0xFF; 2661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project r[4*i+2] = (m->counter[i] >> 16) & 0xFF; 2671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project r[4*i+3] = (m->counter[i] >> 24) & 0xFF; 2681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 2691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 2701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#if 0 2711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project { 2721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int i; 2731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_int32_t *r = (u_int32_t *)res; 2741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project for (i = 0; i < 4; ++i) 2761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project r[i] = swap_u_int32_t (m->counter[i]); 2771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 2781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 2791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 280