Browse Source

Added async modPow worker

master
Igor Zhukov 10 years ago
parent
commit
45f3798794
  1. 14
      app/js/lib/bin_utils.js
  2. 17
      app/js/lib/mp_worker.js
  3. 50
      app/js/lib/mtproto.js

14
app/js/lib/bin_utils.js

@ -516,3 +516,17 @@ function pqPrimeLeemon (what) { @@ -516,3 +516,17 @@ function pqPrimeLeemon (what) {
return [bytesFromLeemonBigInt(P), bytesFromLeemonBigInt(Q), it];
}
function bytesModPow (x, y, m) {
try {
var xBigInt = str2bigInt(x, 64),
yBigInt = str2bigInt(y, 64),
mBigInt = str2bigInt(bytesToHex(m), 16, 2),
resBigInt = powMod(xBigInt, yBigInt, mBigInt);
return bytesFromHex(bigInt2str(resBigInt, 16));
} catch (e) {}
return bytesFromBigInt(new BigInteger(x).modPow(new BigInteger(y), new BigInteger(m)));
}

17
app/js/lib/mp_worker.js

@ -0,0 +1,17 @@ @@ -0,0 +1,17 @@
/*!
* Webogram v0.2 - messaging web application for MTProto
* https://github.com/zhukov/webogram
* Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>
* https://github.com/zhukov/webogram/blob/master/LICENSE
*/
importScripts(
'../../vendor/console-polyfill/console-polyfill.js',
'bin_utils.js',
'../../vendor/leemon_bigint/bigint.js',
'../../vendor/jsbn/jsbn_combined.js'
);
onmessage = function (e) {
postMessage(bytesModPow(e.data[0], e.data[1], e.data[2]));
}

50
app/js/lib/mtproto.js

@ -85,9 +85,7 @@ angular.module('izhukov.mtproto', ['izhukov.utils']) @@ -85,9 +85,7 @@ angular.module('izhukov.mtproto', ['izhukov.utils'])
var fingerprintBytes = sha1Hash(buffer).slice(-8);
fingerprintBytes.reverse();
var fingerprint = new BigInteger(fingerprintBytes).toString(16);
publicKeysParsed[fingerprint] = {
publicKeysParsed[bytesToHex(fingerprintBytes)] = {
modulus: keyParsed.modulus,
exponent: keyParsed.exponent
};
@ -404,16 +402,38 @@ angular.module('izhukov.mtproto', ['izhukov.utils']) @@ -404,16 +402,38 @@ angular.module('izhukov.mtproto', ['izhukov.utils'])
MtpMessageIdGenerator.applyServerTime(auth.serverTime, auth.localTime);
};
function mtpAsyncModPow (x, y, m) {
console.log(dT(), 'modPow start');
if (!window.Worker) {
var result = bytesModPow(x, y, m);
console.log(dT(), 'sync modPow done');
return $q.when(result);
}
var deferred = $q.defer(),
worker = new Worker('js/lib/mp_worker.js');
worker.onmessage = function (e) {
console.log(dT(), 'async modPow done');
deferred.resolve(e.data);
};
worker.onerror = function(error) {
console.log('Worker error', error, error.stack);
deferred.reject(error);
};
worker.postMessage([x, y, m]);
return deferred.promise;
}
function mtpSendSetClientDhParams(auth) {
var deferred = auth.deferred;
var deferred = auth.deferred,
gBytes = bytesFromHex(auth.g.toString(16));
auth.b = new Array(256);
MtpSecureRandom.nextBytes(auth.b);
var bBigInt = new BigInteger(auth.b);
var dhPrimeBigInt = new BigInteger(auth.dhPrime);
var gB = bytesFromBigInt(bigint(auth.g).modPow(bBigInt, dhPrimeBigInt));
mtpAsyncModPow(gBytes, auth.b, auth.dhPrime).then(function (gB) {
var data = new TLSerialization({mtproto: true});
data.storeObject({
@ -455,11 +475,8 @@ angular.module('izhukov.mtproto', ['izhukov.utils']) @@ -455,11 +475,8 @@ angular.module('izhukov.mtproto', ['izhukov.utils'])
return false;
}
var bBigInt = new BigInteger(auth.b);
var dhPrimeBigInt = new BigInteger(auth.dhPrime);
var authKey = bytesFromBigInt((new BigInteger(auth.gA)).modPow(bBigInt, dhPrimeBigInt)),
authKeyHash = sha1Hash(authKey),
mtpAsyncModPow(auth.gA, auth.b, auth.dhPrime).then(function (authKey) {
var authKeyHash = sha1Hash(authKey),
authKeyAux = authKeyHash.slice(0, 8),
authKeyID = authKeyHash.slice(-8);
@ -502,10 +519,15 @@ angular.module('izhukov.mtproto', ['izhukov.utils']) @@ -502,10 +519,15 @@ angular.module('izhukov.mtproto', ['izhukov.utils'])
deferred.reject(new Error('Set_client_DH_params_answer fail'));
return false;
}
}, function (error) {
deferred.reject(error);
})
}, function (error) {
deferred.reject(error);
});
}, function (error) {
deferred.reject(error);
})
};
var cached = {};

Loading…
Cancel
Save