-
Notifications
You must be signed in to change notification settings - Fork 81
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #50 from owncloud/md5
md5 1.0.1
- Loading branch information
Showing
3 changed files
with
372 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,97 @@ | ||
# JavaScript MD5 | ||
|
||
## Demo | ||
[JavaScript MD5 Demo](http://blueimp.github.io/JavaScript-MD5/) | ||
|
||
## Description | ||
JavaScript MD5 implementation. Compatible with server-side environments like node.js, module loaders like RequireJS and all web browsers. | ||
|
||
## Usage | ||
|
||
### Client-side | ||
Include the (minified) JavaScript [MD5](http://en.wikipedia.org/wiki/MD5) script in your HTML markup: | ||
|
||
```html | ||
<script src="js/md5.min.js"></script> | ||
``` | ||
|
||
In your application code, calculate the ([hex](http://en.wikipedia.org/wiki/Hexadecimal)-encoded) [MD5](http://en.wikipedia.org/wiki/MD5) hash of a string by calling the **md5** method with the string as argument: | ||
|
||
```js | ||
var hash = md5("value"); // "2063c1608d6e0baf80249c42e2be5804" | ||
``` | ||
|
||
### Server-side | ||
|
||
The following is an example how to use the JavaScript MD5 module on the server-side with [node.js](http://nodejs.org/). | ||
|
||
Create a new directory and add the **md5.js** file. Or alternatively, install the **blueimp-md5** package with [npm](http://npmjs.org/): | ||
|
||
```sh | ||
npm install blueimp-md5 | ||
``` | ||
|
||
Add a file **server.js** with the following content: | ||
|
||
```js | ||
require("http").createServer(function (req, res) { | ||
// The md5 module exports the md5() function: | ||
var md5 = require("./md5").md5, | ||
// Use the following version if you installed the package with npm: | ||
// var md5 = require("blueimp-md5").md5, | ||
url = require("url"), | ||
query = url.parse(req.url).query; | ||
res.writeHead(200, {"Content-Type": "text/plain"}); | ||
// Calculate and print the MD5 hash of the url query: | ||
res.end(md5(query)); | ||
}).listen(8080, "localhost"); | ||
console.log("Server running at http://localhost:8080/"); | ||
``` | ||
|
||
Run the application with the following command: | ||
|
||
```sh | ||
node server.js | ||
``` | ||
|
||
## Requirements | ||
The JavaScript MD5 script has zero dependencies. | ||
|
||
## API | ||
|
||
Calculate the ([hex](http://en.wikipedia.org/wiki/Hexadecimal)-encoded) [MD5](http://en.wikipedia.org/wiki/MD5) hash of a given string value: | ||
|
||
```js | ||
var hash = md5("value"); // "2063c1608d6e0baf80249c42e2be5804" | ||
``` | ||
|
||
Calculate the ([hex](http://en.wikipedia.org/wiki/Hexadecimal)-encoded) [HMAC](http://en.wikipedia.org/wiki/HMAC)-MD5 hash of a given string value and key: | ||
|
||
```js | ||
var hash = md5("value", "key"); // "01433efd5f16327ea4b31144572c67f6" | ||
``` | ||
|
||
Calculate the raw [MD5](http://en.wikipedia.org/wiki/MD5) hash of a given string value: | ||
|
||
```js | ||
var hash = md5("value", null, true); | ||
``` | ||
|
||
Calculate the raw [HMAC](http://en.wikipedia.org/wiki/HMAC)-MD5 hash of a given string value and key: | ||
|
||
```js | ||
var hash = md5("value", "key", true); | ||
``` | ||
|
||
## Tests | ||
The JavaScript MD5 project comes with [Unit Tests](http://en.wikipedia.org/wiki/Unit_testing). | ||
There are two different ways to run the tests: | ||
|
||
* Open test/index.html in your browser or | ||
* run `npm test` in the Terminal in the root path of the repository package. | ||
|
||
The first one tests the browser integration, the second one the [node.js](http://nodejs.org/) integration. | ||
|
||
|
||
## License | ||
The JavaScript MD5 script is released under the [MIT license](http://www.opensource.org/licenses/MIT). |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,274 @@ | ||
/* | ||
* JavaScript MD5 1.0.1 | ||
* https://github.com/blueimp/JavaScript-MD5 | ||
* | ||
* Copyright 2011, Sebastian Tschan | ||
* https://blueimp.net | ||
* | ||
* Licensed under the MIT license: | ||
* http://www.opensource.org/licenses/MIT | ||
* | ||
* Based on | ||
* A JavaScript implementation of the RSA Data Security, Inc. MD5 Message | ||
* Digest Algorithm, as defined in RFC 1321. | ||
* Version 2.2 Copyright (C) Paul Johnston 1999 - 2009 | ||
* Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet | ||
* Distributed under the BSD License | ||
* See http://pajhome.org.uk/crypt/md5 for more info. | ||
*/ | ||
|
||
/*jslint bitwise: true */ | ||
/*global unescape, define */ | ||
|
||
(function ($) { | ||
'use strict'; | ||
|
||
/* | ||
* Add integers, wrapping at 2^32. This uses 16-bit operations internally | ||
* to work around bugs in some JS interpreters. | ||
*/ | ||
function safe_add(x, y) { | ||
var lsw = (x & 0xFFFF) + (y & 0xFFFF), | ||
msw = (x >> 16) + (y >> 16) + (lsw >> 16); | ||
return (msw << 16) | (lsw & 0xFFFF); | ||
} | ||
|
||
/* | ||
* Bitwise rotate a 32-bit number to the left. | ||
*/ | ||
function bit_rol(num, cnt) { | ||
return (num << cnt) | (num >>> (32 - cnt)); | ||
} | ||
|
||
/* | ||
* These functions implement the four basic operations the algorithm uses. | ||
*/ | ||
function md5_cmn(q, a, b, x, s, t) { | ||
return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b); | ||
} | ||
function md5_ff(a, b, c, d, x, s, t) { | ||
return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t); | ||
} | ||
function md5_gg(a, b, c, d, x, s, t) { | ||
return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t); | ||
} | ||
function md5_hh(a, b, c, d, x, s, t) { | ||
return md5_cmn(b ^ c ^ d, a, b, x, s, t); | ||
} | ||
function md5_ii(a, b, c, d, x, s, t) { | ||
return md5_cmn(c ^ (b | (~d)), a, b, x, s, t); | ||
} | ||
|
||
/* | ||
* Calculate the MD5 of an array of little-endian words, and a bit length. | ||
*/ | ||
function binl_md5(x, len) { | ||
/* append padding */ | ||
x[len >> 5] |= 0x80 << (len % 32); | ||
x[(((len + 64) >>> 9) << 4) + 14] = len; | ||
|
||
var i, olda, oldb, oldc, oldd, | ||
a = 1732584193, | ||
b = -271733879, | ||
c = -1732584194, | ||
d = 271733878; | ||
|
||
for (i = 0; i < x.length; i += 16) { | ||
olda = a; | ||
oldb = b; | ||
oldc = c; | ||
oldd = d; | ||
|
||
a = md5_ff(a, b, c, d, x[i], 7, -680876936); | ||
d = md5_ff(d, a, b, c, x[i + 1], 12, -389564586); | ||
c = md5_ff(c, d, a, b, x[i + 2], 17, 606105819); | ||
b = md5_ff(b, c, d, a, x[i + 3], 22, -1044525330); | ||
a = md5_ff(a, b, c, d, x[i + 4], 7, -176418897); | ||
d = md5_ff(d, a, b, c, x[i + 5], 12, 1200080426); | ||
c = md5_ff(c, d, a, b, x[i + 6], 17, -1473231341); | ||
b = md5_ff(b, c, d, a, x[i + 7], 22, -45705983); | ||
a = md5_ff(a, b, c, d, x[i + 8], 7, 1770035416); | ||
d = md5_ff(d, a, b, c, x[i + 9], 12, -1958414417); | ||
c = md5_ff(c, d, a, b, x[i + 10], 17, -42063); | ||
b = md5_ff(b, c, d, a, x[i + 11], 22, -1990404162); | ||
a = md5_ff(a, b, c, d, x[i + 12], 7, 1804603682); | ||
d = md5_ff(d, a, b, c, x[i + 13], 12, -40341101); | ||
c = md5_ff(c, d, a, b, x[i + 14], 17, -1502002290); | ||
b = md5_ff(b, c, d, a, x[i + 15], 22, 1236535329); | ||
|
||
a = md5_gg(a, b, c, d, x[i + 1], 5, -165796510); | ||
d = md5_gg(d, a, b, c, x[i + 6], 9, -1069501632); | ||
c = md5_gg(c, d, a, b, x[i + 11], 14, 643717713); | ||
b = md5_gg(b, c, d, a, x[i], 20, -373897302); | ||
a = md5_gg(a, b, c, d, x[i + 5], 5, -701558691); | ||
d = md5_gg(d, a, b, c, x[i + 10], 9, 38016083); | ||
c = md5_gg(c, d, a, b, x[i + 15], 14, -660478335); | ||
b = md5_gg(b, c, d, a, x[i + 4], 20, -405537848); | ||
a = md5_gg(a, b, c, d, x[i + 9], 5, 568446438); | ||
d = md5_gg(d, a, b, c, x[i + 14], 9, -1019803690); | ||
c = md5_gg(c, d, a, b, x[i + 3], 14, -187363961); | ||
b = md5_gg(b, c, d, a, x[i + 8], 20, 1163531501); | ||
a = md5_gg(a, b, c, d, x[i + 13], 5, -1444681467); | ||
d = md5_gg(d, a, b, c, x[i + 2], 9, -51403784); | ||
c = md5_gg(c, d, a, b, x[i + 7], 14, 1735328473); | ||
b = md5_gg(b, c, d, a, x[i + 12], 20, -1926607734); | ||
|
||
a = md5_hh(a, b, c, d, x[i + 5], 4, -378558); | ||
d = md5_hh(d, a, b, c, x[i + 8], 11, -2022574463); | ||
c = md5_hh(c, d, a, b, x[i + 11], 16, 1839030562); | ||
b = md5_hh(b, c, d, a, x[i + 14], 23, -35309556); | ||
a = md5_hh(a, b, c, d, x[i + 1], 4, -1530992060); | ||
d = md5_hh(d, a, b, c, x[i + 4], 11, 1272893353); | ||
c = md5_hh(c, d, a, b, x[i + 7], 16, -155497632); | ||
b = md5_hh(b, c, d, a, x[i + 10], 23, -1094730640); | ||
a = md5_hh(a, b, c, d, x[i + 13], 4, 681279174); | ||
d = md5_hh(d, a, b, c, x[i], 11, -358537222); | ||
c = md5_hh(c, d, a, b, x[i + 3], 16, -722521979); | ||
b = md5_hh(b, c, d, a, x[i + 6], 23, 76029189); | ||
a = md5_hh(a, b, c, d, x[i + 9], 4, -640364487); | ||
d = md5_hh(d, a, b, c, x[i + 12], 11, -421815835); | ||
c = md5_hh(c, d, a, b, x[i + 15], 16, 530742520); | ||
b = md5_hh(b, c, d, a, x[i + 2], 23, -995338651); | ||
|
||
a = md5_ii(a, b, c, d, x[i], 6, -198630844); | ||
d = md5_ii(d, a, b, c, x[i + 7], 10, 1126891415); | ||
c = md5_ii(c, d, a, b, x[i + 14], 15, -1416354905); | ||
b = md5_ii(b, c, d, a, x[i + 5], 21, -57434055); | ||
a = md5_ii(a, b, c, d, x[i + 12], 6, 1700485571); | ||
d = md5_ii(d, a, b, c, x[i + 3], 10, -1894986606); | ||
c = md5_ii(c, d, a, b, x[i + 10], 15, -1051523); | ||
b = md5_ii(b, c, d, a, x[i + 1], 21, -2054922799); | ||
a = md5_ii(a, b, c, d, x[i + 8], 6, 1873313359); | ||
d = md5_ii(d, a, b, c, x[i + 15], 10, -30611744); | ||
c = md5_ii(c, d, a, b, x[i + 6], 15, -1560198380); | ||
b = md5_ii(b, c, d, a, x[i + 13], 21, 1309151649); | ||
a = md5_ii(a, b, c, d, x[i + 4], 6, -145523070); | ||
d = md5_ii(d, a, b, c, x[i + 11], 10, -1120210379); | ||
c = md5_ii(c, d, a, b, x[i + 2], 15, 718787259); | ||
b = md5_ii(b, c, d, a, x[i + 9], 21, -343485551); | ||
|
||
a = safe_add(a, olda); | ||
b = safe_add(b, oldb); | ||
c = safe_add(c, oldc); | ||
d = safe_add(d, oldd); | ||
} | ||
return [a, b, c, d]; | ||
} | ||
|
||
/* | ||
* Convert an array of little-endian words to a string | ||
*/ | ||
function binl2rstr(input) { | ||
var i, | ||
output = ''; | ||
for (i = 0; i < input.length * 32; i += 8) { | ||
output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF); | ||
} | ||
return output; | ||
} | ||
|
||
/* | ||
* Convert a raw string to an array of little-endian words | ||
* Characters >255 have their high-byte silently ignored. | ||
*/ | ||
function rstr2binl(input) { | ||
var i, | ||
output = []; | ||
output[(input.length >> 2) - 1] = undefined; | ||
for (i = 0; i < output.length; i += 1) { | ||
output[i] = 0; | ||
} | ||
for (i = 0; i < input.length * 8; i += 8) { | ||
output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (i % 32); | ||
} | ||
return output; | ||
} | ||
|
||
/* | ||
* Calculate the MD5 of a raw string | ||
*/ | ||
function rstr_md5(s) { | ||
return binl2rstr(binl_md5(rstr2binl(s), s.length * 8)); | ||
} | ||
|
||
/* | ||
* Calculate the HMAC-MD5, of a key and some data (raw strings) | ||
*/ | ||
function rstr_hmac_md5(key, data) { | ||
var i, | ||
bkey = rstr2binl(key), | ||
ipad = [], | ||
opad = [], | ||
hash; | ||
ipad[15] = opad[15] = undefined; | ||
if (bkey.length > 16) { | ||
bkey = binl_md5(bkey, key.length * 8); | ||
} | ||
for (i = 0; i < 16; i += 1) { | ||
ipad[i] = bkey[i] ^ 0x36363636; | ||
opad[i] = bkey[i] ^ 0x5C5C5C5C; | ||
} | ||
hash = binl_md5(ipad.concat(rstr2binl(data)), 512 + data.length * 8); | ||
return binl2rstr(binl_md5(opad.concat(hash), 512 + 128)); | ||
} | ||
|
||
/* | ||
* Convert a raw string to a hex string | ||
*/ | ||
function rstr2hex(input) { | ||
var hex_tab = '0123456789abcdef', | ||
output = '', | ||
x, | ||
i; | ||
for (i = 0; i < input.length; i += 1) { | ||
x = input.charCodeAt(i); | ||
output += hex_tab.charAt((x >>> 4) & 0x0F) + | ||
hex_tab.charAt(x & 0x0F); | ||
} | ||
return output; | ||
} | ||
|
||
/* | ||
* Encode a string as utf-8 | ||
*/ | ||
function str2rstr_utf8(input) { | ||
return unescape(encodeURIComponent(input)); | ||
} | ||
|
||
/* | ||
* Take string arguments and return either raw or hex encoded strings | ||
*/ | ||
function raw_md5(s) { | ||
return rstr_md5(str2rstr_utf8(s)); | ||
} | ||
function hex_md5(s) { | ||
return rstr2hex(raw_md5(s)); | ||
} | ||
function raw_hmac_md5(k, d) { | ||
return rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d)); | ||
} | ||
function hex_hmac_md5(k, d) { | ||
return rstr2hex(raw_hmac_md5(k, d)); | ||
} | ||
|
||
function md5(string, key, raw) { | ||
if (!key) { | ||
if (!raw) { | ||
return hex_md5(string); | ||
} | ||
return raw_md5(string); | ||
} | ||
if (!raw) { | ||
return hex_hmac_md5(key, string); | ||
} | ||
return raw_hmac_md5(key, string); | ||
} | ||
|
||
if (typeof define === 'function' && define.amd) { | ||
define(function () { | ||
return md5; | ||
}); | ||
} else { | ||
$.md5 = md5; | ||
} | ||
}(this)); |
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.