1d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// Copyright 2013 the V8 project authors. All rights reserved. 2d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. 3d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// 4d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// Redistribution and use in source and binary forms, with or without 5d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// modification, are permitted provided that the following conditions 6d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// are met: 7d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// 1. Redistributions of source code must retain the above copyright 8d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// notice, this list of conditions and the following disclaimer. 9d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// 2. Redistributions in binary form must reproduce the above copyright 10d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// notice, this list of conditions and the following disclaimer in the 11d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// documentation and/or other materials provided with the distribution. 12d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// 13d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY 14d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 15d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 16d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY 17d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 18d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 19d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 20d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 21d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 22d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 23d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org 24d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgdescription("KDE JS Test"); 25d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgshouldBe("hexMD5('kde')", "'186cf28b76f2264e9fea8fcf91cb4f5d'"); 26d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org 27d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org/* 28d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message 29d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org * Digest Algorithm, as defined in RFC 1321. 30d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org * Version 1.1 Copyright (C) Paul Johnston 1999 - 2002. 31d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org * Code also contributed by Greg Holt 32d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org * See http://pajhome.org.uk/site/legal.html for details. 33d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org */ 34d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org 35d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org/* 36d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org * Add integers, wrapping at 2^32. This uses 16-bit operations internally 37d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org * to work around bugs in some JS interpreters. 38d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org */ 39d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgfunction safe_add(x, y) 40d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org{ 41d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org var lsw = (x & 0xFFFF) + (y & 0xFFFF) 42d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org var msw = (x >> 16) + (y >> 16) + (lsw >> 16) 43d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org return (msw << 16) | (lsw & 0xFFFF) 44d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org} 45d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org 46d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org/* 47d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org * Bitwise rotate a 32-bit number to the left. 48d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org */ 49d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgfunction rol(num, cnt) 50d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org{ 51d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org return (num << cnt) | (num >>> (32 - cnt)) 52d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org} 53d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org 54d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org/* 55d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org * These functions implement the four basic operations the algorithm uses. 56d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org */ 57d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgfunction cmn(q, a, b, x, s, t) 58d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org{ 59d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org return safe_add(rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b) 60d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org} 61d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgfunction ff(a, b, c, d, x, s, t) 62d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org{ 63d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org return cmn((b & c) | ((~b) & d), a, b, x, s, t) 64d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org} 65d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgfunction gg(a, b, c, d, x, s, t) 66d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org{ 67d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org return cmn((b & d) | (c & (~d)), a, b, x, s, t) 68d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org} 69d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgfunction hh(a, b, c, d, x, s, t) 70d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org{ 71d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org return cmn(b ^ c ^ d, a, b, x, s, t) 72d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org} 73d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgfunction ii(a, b, c, d, x, s, t) 74d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org{ 75d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org return cmn(c ^ (b | (~d)), a, b, x, s, t) 76d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org} 77d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org 78d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org/* 79d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org * Calculate the MD5 of an array of little-endian words, producing an array 80d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org * of little-endian words. 81d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org */ 82d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgfunction coreMD5(x) 83d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org{ 84d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org var a = 1732584193 85d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org var b = -271733879 86d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org var c = -1732584194 87d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org var d = 271733878 88d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org 89d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org for(i = 0; i < x.length; i += 16) 90d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org { 91d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org var olda = a 92d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org var oldb = b 93d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org var oldc = c 94d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org var oldd = d 95d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org 96d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org a = ff(a, b, c, d, x[i+ 0], 7 , -680876936) 97d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org d = ff(d, a, b, c, x[i+ 1], 12, -389564586) 98d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org c = ff(c, d, a, b, x[i+ 2], 17, 606105819) 99d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org b = ff(b, c, d, a, x[i+ 3], 22, -1044525330) 100d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org a = ff(a, b, c, d, x[i+ 4], 7 , -176418897) 101d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org d = ff(d, a, b, c, x[i+ 5], 12, 1200080426) 102d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org c = ff(c, d, a, b, x[i+ 6], 17, -1473231341) 103d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org b = ff(b, c, d, a, x[i+ 7], 22, -45705983) 104d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org a = ff(a, b, c, d, x[i+ 8], 7 , 1770035416) 105d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org d = ff(d, a, b, c, x[i+ 9], 12, -1958414417) 106d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org c = ff(c, d, a, b, x[i+10], 17, -42063) 107d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org b = ff(b, c, d, a, x[i+11], 22, -1990404162) 108d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org a = ff(a, b, c, d, x[i+12], 7 , 1804603682) 109d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org d = ff(d, a, b, c, x[i+13], 12, -40341101) 110d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org c = ff(c, d, a, b, x[i+14], 17, -1502002290) 111d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org b = ff(b, c, d, a, x[i+15], 22, 1236535329) 112d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org 113d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org a = gg(a, b, c, d, x[i+ 1], 5 , -165796510) 114d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org d = gg(d, a, b, c, x[i+ 6], 9 , -1069501632) 115d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org c = gg(c, d, a, b, x[i+11], 14, 643717713) 116d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org b = gg(b, c, d, a, x[i+ 0], 20, -373897302) 117d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org a = gg(a, b, c, d, x[i+ 5], 5 , -701558691) 118d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org d = gg(d, a, b, c, x[i+10], 9 , 38016083) 119d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org c = gg(c, d, a, b, x[i+15], 14, -660478335) 120d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org b = gg(b, c, d, a, x[i+ 4], 20, -405537848) 121d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org a = gg(a, b, c, d, x[i+ 9], 5 , 568446438) 122d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org d = gg(d, a, b, c, x[i+14], 9 , -1019803690) 123d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org c = gg(c, d, a, b, x[i+ 3], 14, -187363961) 124d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org b = gg(b, c, d, a, x[i+ 8], 20, 1163531501) 125d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org a = gg(a, b, c, d, x[i+13], 5 , -1444681467) 126d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org d = gg(d, a, b, c, x[i+ 2], 9 , -51403784) 127d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org c = gg(c, d, a, b, x[i+ 7], 14, 1735328473) 128d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org b = gg(b, c, d, a, x[i+12], 20, -1926607734) 129d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org 130d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org a = hh(a, b, c, d, x[i+ 5], 4 , -378558) 131d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org d = hh(d, a, b, c, x[i+ 8], 11, -2022574463) 132d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org c = hh(c, d, a, b, x[i+11], 16, 1839030562) 133d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org b = hh(b, c, d, a, x[i+14], 23, -35309556) 134d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org a = hh(a, b, c, d, x[i+ 1], 4 , -1530992060) 135d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org d = hh(d, a, b, c, x[i+ 4], 11, 1272893353) 136d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org c = hh(c, d, a, b, x[i+ 7], 16, -155497632) 137d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org b = hh(b, c, d, a, x[i+10], 23, -1094730640) 138d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org a = hh(a, b, c, d, x[i+13], 4 , 681279174) 139d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org d = hh(d, a, b, c, x[i+ 0], 11, -358537222) 140d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org c = hh(c, d, a, b, x[i+ 3], 16, -722521979) 141d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org b = hh(b, c, d, a, x[i+ 6], 23, 76029189) 142d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org a = hh(a, b, c, d, x[i+ 9], 4 , -640364487) 143d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org d = hh(d, a, b, c, x[i+12], 11, -421815835) 144d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org c = hh(c, d, a, b, x[i+15], 16, 530742520) 145d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org b = hh(b, c, d, a, x[i+ 2], 23, -995338651) 146d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org 147d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org a = ii(a, b, c, d, x[i+ 0], 6 , -198630844) 148d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org d = ii(d, a, b, c, x[i+ 7], 10, 1126891415) 149d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org c = ii(c, d, a, b, x[i+14], 15, -1416354905) 150d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org b = ii(b, c, d, a, x[i+ 5], 21, -57434055) 151d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org a = ii(a, b, c, d, x[i+12], 6 , 1700485571) 152d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org d = ii(d, a, b, c, x[i+ 3], 10, -1894986606) 153d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org c = ii(c, d, a, b, x[i+10], 15, -1051523) 154d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org b = ii(b, c, d, a, x[i+ 1], 21, -2054922799) 155d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org a = ii(a, b, c, d, x[i+ 8], 6 , 1873313359) 156d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org d = ii(d, a, b, c, x[i+15], 10, -30611744) 157d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org c = ii(c, d, a, b, x[i+ 6], 15, -1560198380) 158d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org b = ii(b, c, d, a, x[i+13], 21, 1309151649) 159d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org a = ii(a, b, c, d, x[i+ 4], 6 , -145523070) 160d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org d = ii(d, a, b, c, x[i+11], 10, -1120210379) 161d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org c = ii(c, d, a, b, x[i+ 2], 15, 718787259) 162d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org b = ii(b, c, d, a, x[i+ 9], 21, -343485551) 163d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org 164d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org a = safe_add(a, olda) 165d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org b = safe_add(b, oldb) 166d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org c = safe_add(c, oldc) 167d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org d = safe_add(d, oldd) 168d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org } 169d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org return [a, b, c, d] 170d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org} 171d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org 172d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org/* 173d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org * Convert an array of little-endian words to a hex string. 174d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org */ 175d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgfunction binl2hex(binarray) 176d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org{ 177d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org var hex_tab = "0123456789abcdef" 178d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org var str = "" 179d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org for(var i = 0; i < binarray.length * 4; i++) 180d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org { 181d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org str += hex_tab.charAt((binarray[i>>2] >> ((i%4)*8+4)) & 0xF) + 182d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org hex_tab.charAt((binarray[i>>2] >> ((i%4)*8)) & 0xF) 183d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org } 184d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org return str 185d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org} 186d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org 187d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org/* 188d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org * Convert an array of little-endian words to a base64 encoded string. 189d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org */ 190d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgfunction binl2b64(binarray) 191d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org{ 192d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" 193d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org var str = "" 194d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org for(var i = 0; i < binarray.length * 32; i += 6) 195d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org { 196d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org str += tab.charAt(((binarray[i>>5] << (i%32)) & 0x3F) | 197d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org ((binarray[i>>5+1] >> (32-i%32)) & 0x3F)) 198d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org } 199d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org return str 200d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org} 201d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org 202d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org/* 203d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org * Convert an 8-bit character string to a sequence of 16-word blocks, stored 204d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org * as an array, and append appropriate padding for MD4/5 calculation. 205d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org * If any of the characters are >255, the high byte is silently ignored. 206d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org */ 207d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgfunction str2binl(str) 208d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org{ 209d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org var nblk = ((str.length + 8) >> 6) + 1 // number of 16-word blocks 210d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org var blks = new Array(nblk * 16) 211d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org for(var i = 0; i < nblk * 16; i++) blks[i] = 0 212d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org for(var i = 0; i < str.length; i++) 213d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org blks[i>>2] |= (str.charCodeAt(i) & 0xFF) << ((i%4) * 8) 214d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org blks[i>>2] |= 0x80 << ((i%4) * 8) 215d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org blks[nblk*16-2] = str.length * 8 216d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org return blks 217d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org} 218d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org 219d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org/* 220d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org * Convert a wide-character string to a sequence of 16-word blocks, stored as 221d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org * an array, and append appropriate padding for MD4/5 calculation. 222d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org */ 223d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgfunction strw2binl(str) 224d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org{ 225d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org var nblk = ((str.length + 4) >> 5) + 1 // number of 16-word blocks 226d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org var blks = new Array(nblk * 16) 227d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org for(var i = 0; i < nblk * 16; i++) blks[i] = 0 228d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org for(var i = 0; i < str.length; i++) 229d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org blks[i>>1] |= str.charCodeAt(i) << ((i%2) * 16) 230d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org blks[i>>1] |= 0x80 << ((i%2) * 16) 231d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org blks[nblk*16-2] = str.length * 16 232d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org return blks 233d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org} 234d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org 235d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org/* 236d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org * External interface 237d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org */ 238d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgfunction hexMD5 (str) { return binl2hex(coreMD5( str2binl(str))) } 239d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgfunction hexMD5w(str) { return binl2hex(coreMD5(strw2binl(str))) } 240d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgfunction b64MD5 (str) { return binl2b64(coreMD5( str2binl(str))) } 241d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgfunction b64MD5w(str) { return binl2b64(coreMD5(strw2binl(str))) } 242d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org/* Backward compatibility */ 243f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.orgfunction calcMD5(str) { return binl2hex(coreMD5( str2binl(str))) } 244