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