Skip to content

Commit

Permalink
make more cross-browser, in case chrome ever gets their shit together
Browse files Browse the repository at this point in the history
  • Loading branch information
mimecuvalo committed Mar 13, 2012
1 parent 01f971a commit 8a5eb26
Show file tree
Hide file tree
Showing 16 changed files with 512 additions and 91 deletions.
14 changes: 9 additions & 5 deletions client.js
Expand Up @@ -250,7 +250,7 @@ paramikojs.SSHClient.prototype = {
establishing an SSH session
@raise socket.error: if a socket error occurred while connecting
*/
connect : function(observer, controlOutstream, auth_success,
connect : function(observer, writeCallback, auth_success,
hostname, port, username, password, pkey,
key_filename, timeout, allow_agent, look_for_keys,
compress) {
Expand Down Expand Up @@ -288,9 +288,13 @@ paramikojs.SSHClient.prototype = {
self._policy.missing_host_key(self, server_hostkey_name, server_key);
// if the callback returns, assume the key is ok
}
} catch (ex if ex instanceof paramikojs.ssh_exception.UserRequestedDisconnect) {
self.close(true);
return;
} catch (ex) {
if (ex instanceof paramikojs.ssh_exception.UserRequestedDisconnect) {
self.close(true);
return;
} else {
throw ex;
}
}

var key_filenames;
Expand All @@ -306,7 +310,7 @@ paramikojs.SSHClient.prototype = {

this._observer = observer;
this._transport = new paramikojs.transport(observer);
this._transport.controlOutstream = controlOutstream;
this._transport.writeCallback = writeCallback;
this._transport.use_compression(compress);
this._transport.connect(null, authenticatedCallback, username, password, pkey, auth_success);

Expand Down
60 changes: 47 additions & 13 deletions crypto/Hash/HMAC.js
@@ -1,15 +1,49 @@
crypto.hash.HMAC = function(key, msg, digestmod) {
var hasher = Components.classes["@mozilla.org/security/hmac;1"].createInstance(Components.interfaces.nsICryptoHMAC);
var keyObject = Components.classes["@mozilla.org/security/keyobjectfactory;1"]
.getService(Components.interfaces.nsIKeyObjectFactory)
.keyFromString(Components.interfaces.nsIKeyObject.HMAC, key);

hasher.init(digestmod, keyObject);
var data = crypto.toByteArray(msg);
hasher.update(data, data.length);
return hasher.finish(false);
}
if (Components) { // Mozilla
crypto.hash.HMAC = function(key, msg, digestmod) {
var hasher = Components.classes["@mozilla.org/security/hmac;1"].createInstance(Components.interfaces.nsICryptoHMAC);
var keyObject = Components.classes["@mozilla.org/security/keyobjectfactory;1"]
.getService(Components.interfaces.nsIKeyObjectFactory)
.keyFromString(Components.interfaces.nsIKeyObject.HMAC, key);

hasher.init(digestmod, keyObject);
var data = crypto.toByteArray(msg);
hasher.update(data, data.length);
return hasher.finish(false);
};

crypto.hash.HMAC_SHA = Components.classes["@mozilla.org/security/hmac;1"].createInstance(Components.interfaces.nsICryptoHMAC).SHA1;
crypto.hash.HMAC_MD5 = Components.classes["@mozilla.org/security/hmac;1"].createInstance(Components.interfaces.nsICryptoHMAC).MD5;
} else { // Chrome
crypto.hash.HMAC = function(key, msg, digestmod) {
var blocksize = 64;
var ipad = 0x36;
var opad = 0x5C;

var hasher = digestmod == 3 ? crypto.hash.SHA : crypto.hash.MD5;

var outer = new hasher();
var inner = new hasher();

crypto.hash.HMAC_SHA = Components.classes["@mozilla.org/security/hmac;1"].createInstance(Components.interfaces.nsICryptoHMAC).SHA1;
crypto.hash.HMAC_MD5 = Components.classes["@mozilla.org/security/hmac;1"].createInstance(Components.interfaces.nsICryptoHMAC).MD5;
if (key.length > blocksize) {
key = new hasher(key).digest();
}

key = key + new Array(blocksize - key.length + 1).join('\x00');

var okey = crypto.toByteArray(key).slice(0);
var ikey = crypto.toByteArray(key).slice(0);

for (var x = 0; x < blocksize; ++x) {
okey[x] ^= opad;
ikey[x] ^= ipad;
}

outer.update(okey);
inner.update(ikey);
inner.update(msg);
outer.update(inner.digest());
return outer.digest();
};
crypto.hash.HMAC_SHA = 3;
crypto.hash.HMAC_MD5 = 2;
}
145 changes: 145 additions & 0 deletions crypto/Hash/MD5.js
Expand Up @@ -7,3 +7,148 @@ crypto.hash.MD5.digest_size = 16;
crypto.hash.MD5.prototype = {
type : 'md5'
};

// http://code.google.com/p/crypto-js/source/browse/branches/2.x/src/MD5.js
// BSD license: http://www.opensource.org/licenses/bsd-license.php
if (!Components) { // Chrome
crypto.hash.MD5.prototype = {
digest: function() {
var hashData = crypto.toByteArray(this.data);

var m = crypto.bytesToWords(hashData),
l = hashData.length * 8,
a = 1732584193,
b = -271733879,
c = -1732584194,
d = 271733878;

// Swap endian
for (var i = 0; i < m.length; i++) {
m[i] = ((m[i] << 8) | (m[i] >>> 24)) & 0x00FF00FF |
((m[i] << 24) | (m[i] >>> 8)) & 0xFF00FF00;
}

// Padding
m[l >>> 5] |= 0x80 << (l % 32);
m[(((l + 64) >>> 9) << 4) + 14] = l;

// Method shortcuts
var FF = function (a, b, c, d, x, s, t) {
var n = a + (b & c | ~b & d) + (x >>> 0) + t;
return ((n << s) | (n >>> (32 - s))) + b;
};
var GG = function (a, b, c, d, x, s, t) {
var n = a + (b & d | c & ~d) + (x >>> 0) + t;
return ((n << s) | (n >>> (32 - s))) + b;
};
var HH = function (a, b, c, d, x, s, t) {
var n = a + (b ^ c ^ d) + (x >>> 0) + t;
return ((n << s) | (n >>> (32 - s))) + b;
};
var II = function (a, b, c, d, x, s, t) {
var n = a + (c ^ (b | ~d)) + (x >>> 0) + t;
return ((n << s) | (n >>> (32 - s))) + b;
};

for (var i = 0; i < m.length; i += 16) {
var aa = a,
bb = b,
cc = c,
dd = d;

a = FF(a, b, c, d, m[i+ 0], 7, -680876936);
d = FF(d, a, b, c, m[i+ 1], 12, -389564586);
c = FF(c, d, a, b, m[i+ 2], 17, 606105819);
b = FF(b, c, d, a, m[i+ 3], 22, -1044525330);
a = FF(a, b, c, d, m[i+ 4], 7, -176418897);
d = FF(d, a, b, c, m[i+ 5], 12, 1200080426);
c = FF(c, d, a, b, m[i+ 6], 17, -1473231341);
b = FF(b, c, d, a, m[i+ 7], 22, -45705983);
a = FF(a, b, c, d, m[i+ 8], 7, 1770035416);
d = FF(d, a, b, c, m[i+ 9], 12, -1958414417);
c = FF(c, d, a, b, m[i+10], 17, -42063);
b = FF(b, c, d, a, m[i+11], 22, -1990404162);
a = FF(a, b, c, d, m[i+12], 7, 1804603682);
d = FF(d, a, b, c, m[i+13], 12, -40341101);
c = FF(c, d, a, b, m[i+14], 17, -1502002290);
b = FF(b, c, d, a, m[i+15], 22, 1236535329);

a = GG(a, b, c, d, m[i+ 1], 5, -165796510);
d = GG(d, a, b, c, m[i+ 6], 9, -1069501632);
c = GG(c, d, a, b, m[i+11], 14, 643717713);
b = GG(b, c, d, a, m[i+ 0], 20, -373897302);
a = GG(a, b, c, d, m[i+ 5], 5, -701558691);
d = GG(d, a, b, c, m[i+10], 9, 38016083);
c = GG(c, d, a, b, m[i+15], 14, -660478335);
b = GG(b, c, d, a, m[i+ 4], 20, -405537848);
a = GG(a, b, c, d, m[i+ 9], 5, 568446438);
d = GG(d, a, b, c, m[i+14], 9, -1019803690);
c = GG(c, d, a, b, m[i+ 3], 14, -187363961);
b = GG(b, c, d, a, m[i+ 8], 20, 1163531501);
a = GG(a, b, c, d, m[i+13], 5, -1444681467);
d = GG(d, a, b, c, m[i+ 2], 9, -51403784);
c = GG(c, d, a, b, m[i+ 7], 14, 1735328473);
b = GG(b, c, d, a, m[i+12], 20, -1926607734);

a = HH(a, b, c, d, m[i+ 5], 4, -378558);
d = HH(d, a, b, c, m[i+ 8], 11, -2022574463);
c = HH(c, d, a, b, m[i+11], 16, 1839030562);
b = HH(b, c, d, a, m[i+14], 23, -35309556);
a = HH(a, b, c, d, m[i+ 1], 4, -1530992060);
d = HH(d, a, b, c, m[i+ 4], 11, 1272893353);
c = HH(c, d, a, b, m[i+ 7], 16, -155497632);
b = HH(b, c, d, a, m[i+10], 23, -1094730640);
a = HH(a, b, c, d, m[i+13], 4, 681279174);
d = HH(d, a, b, c, m[i+ 0], 11, -358537222);
c = HH(c, d, a, b, m[i+ 3], 16, -722521979);
b = HH(b, c, d, a, m[i+ 6], 23, 76029189);
a = HH(a, b, c, d, m[i+ 9], 4, -640364487);
d = HH(d, a, b, c, m[i+12], 11, -421815835);
c = HH(c, d, a, b, m[i+15], 16, 530742520);
b = HH(b, c, d, a, m[i+ 2], 23, -995338651);

a = II(a, b, c, d, m[i+ 0], 6, -198630844);
d = II(d, a, b, c, m[i+ 7], 10, 1126891415);
c = II(c, d, a, b, m[i+14], 15, -1416354905);
b = II(b, c, d, a, m[i+ 5], 21, -57434055);
a = II(a, b, c, d, m[i+12], 6, 1700485571);
d = II(d, a, b, c, m[i+ 3], 10, -1894986606);
c = II(c, d, a, b, m[i+10], 15, -1051523);
b = II(b, c, d, a, m[i+ 1], 21, -2054922799);
a = II(a, b, c, d, m[i+ 8], 6, 1873313359);
d = II(d, a, b, c, m[i+15], 10, -30611744);
c = II(c, d, a, b, m[i+ 6], 15, -1560198380);
b = II(b, c, d, a, m[i+13], 21, 1309151649);
a = II(a, b, c, d, m[i+ 4], 6, -145523070);
d = II(d, a, b, c, m[i+11], 10, -1120210379);
c = II(c, d, a, b, m[i+ 2], 15, 718787259);
b = II(b, c, d, a, m[i+ 9], 21, -343485551);

a = (a + aa) >>> 0;
b = (b + bb) >>> 0;
c = (c + cc) >>> 0;
d = (d + dd) >>> 0;
}

var rotl = function (n, b) {
return (n << b) | (n >>> (32 - b));
};

var endian = function (n) {
// If number given, swap endian
if (n.constructor == Number) {
return rotl(n, 8) & 0x00FF00FF |
rotl(n, 24) & 0xFF00FF00;
}

// Else, assume array and swap all items
for (var i = 0; i < n.length; i++) {
n[i] = endian(n[i]);
}
return n;
};

return crypto.fromByteArray(crypto.wordsToBytes(endian([a, b, c, d])));
}
};
}
60 changes: 60 additions & 0 deletions crypto/Hash/SHA.js
Expand Up @@ -7,3 +7,63 @@ crypto.hash.SHA.digest_size = 20;
crypto.hash.SHA.prototype = {
type : 'sha1'
};

// http://code.google.com/p/crypto-js/source/browse/branches/2.x/src/SHA1.js
// BSD license: http://www.opensource.org/licenses/bsd-license.php
if (!Components) { // Chrome
crypto.hash.SHA.prototype = {
digest: function() {
var hashData = crypto.toByteArray(this.data);

var m = crypto.bytesToWords(hashData),
l = hashData.length * 8,
w = [],
H0 = 1732584193,
H1 = -271733879,
H2 = -1732584194,
H3 = 271733878,
H4 = -1009589776;

// Padding
m[l >> 5] |= 0x80 << (24 - l % 32);
m[((l + 64 >>> 9) << 4) + 15] = l;

for (var i = 0; i < m.length; i += 16) {
var a = H0,
b = H1,
c = H2,
d = H3,
e = H4;

for (var j = 0; j < 80; j++) {
if (j < 16) {
w[j] = m[i + j];
} else {
var n = w[j-3] ^ w[j-8] ^ w[j-14] ^ w[j-16];
w[j] = (n << 1) | (n >>> 31);
}

var t = ((H0 << 5) | (H0 >>> 27)) + H4 + (w[j] >>> 0) + (
j < 20 ? (H1 & H2 | ~H1 & H3) + 1518500249 :
j < 40 ? (H1 ^ H2 ^ H3) + 1859775393 :
j < 60 ? (H1 & H2 | H1 & H3 | H2 & H3) - 1894007588 :
(H1 ^ H2 ^ H3) - 899497514);

H4 = H3;
H3 = H2;
H2 = (H1 << 30) | (H1 >>> 2);
H1 = H0;
H0 = t;
}

H0 += a;
H1 += b;
H2 += c;
H3 += d;
H4 += e;
}

return crypto.fromByteArray(crypto.wordsToBytes([H0, H1, H2, H3, H4]));
}
};
}

0 comments on commit 8a5eb26

Please sign in to comment.