Added async modPow worker
This commit is contained in:
parent
d150de0bc5
commit
45f3798794
@ -516,3 +516,17 @@ function pqPrimeLeemon (what) {
|
|||||||
|
|
||||||
return [bytesFromLeemonBigInt(P), bytesFromLeemonBigInt(Q), it];
|
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
Normal file
17
app/js/lib/mp_worker.js
Normal file
@ -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]));
|
||||||
|
}
|
@ -85,9 +85,7 @@ angular.module('izhukov.mtproto', ['izhukov.utils'])
|
|||||||
var fingerprintBytes = sha1Hash(buffer).slice(-8);
|
var fingerprintBytes = sha1Hash(buffer).slice(-8);
|
||||||
fingerprintBytes.reverse();
|
fingerprintBytes.reverse();
|
||||||
|
|
||||||
var fingerprint = new BigInteger(fingerprintBytes).toString(16);
|
publicKeysParsed[bytesToHex(fingerprintBytes)] = {
|
||||||
|
|
||||||
publicKeysParsed[fingerprint] = {
|
|
||||||
modulus: keyParsed.modulus,
|
modulus: keyParsed.modulus,
|
||||||
exponent: keyParsed.exponent
|
exponent: keyParsed.exponent
|
||||||
};
|
};
|
||||||
@ -404,16 +402,38 @@ angular.module('izhukov.mtproto', ['izhukov.utils'])
|
|||||||
MtpMessageIdGenerator.applyServerTime(auth.serverTime, auth.localTime);
|
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) {
|
function mtpSendSetClientDhParams(auth) {
|
||||||
var deferred = auth.deferred;
|
var deferred = auth.deferred,
|
||||||
|
gBytes = bytesFromHex(auth.g.toString(16));
|
||||||
|
|
||||||
auth.b = new Array(256);
|
auth.b = new Array(256);
|
||||||
MtpSecureRandom.nextBytes(auth.b);
|
MtpSecureRandom.nextBytes(auth.b);
|
||||||
|
|
||||||
var bBigInt = new BigInteger(auth.b);
|
mtpAsyncModPow(gBytes, auth.b, auth.dhPrime).then(function (gB) {
|
||||||
var dhPrimeBigInt = new BigInteger(auth.dhPrime);
|
|
||||||
|
|
||||||
var gB = bytesFromBigInt(bigint(auth.g).modPow(bBigInt, dhPrimeBigInt));
|
|
||||||
|
|
||||||
var data = new TLSerialization({mtproto: true});
|
var data = new TLSerialization({mtproto: true});
|
||||||
data.storeObject({
|
data.storeObject({
|
||||||
@ -455,11 +475,8 @@ angular.module('izhukov.mtproto', ['izhukov.utils'])
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
var bBigInt = new BigInteger(auth.b);
|
mtpAsyncModPow(auth.gA, auth.b, auth.dhPrime).then(function (authKey) {
|
||||||
var dhPrimeBigInt = new BigInteger(auth.dhPrime);
|
var authKeyHash = sha1Hash(authKey),
|
||||||
|
|
||||||
var authKey = bytesFromBigInt((new BigInteger(auth.gA)).modPow(bBigInt, dhPrimeBigInt)),
|
|
||||||
authKeyHash = sha1Hash(authKey),
|
|
||||||
authKeyAux = authKeyHash.slice(0, 8),
|
authKeyAux = authKeyHash.slice(0, 8),
|
||||||
authKeyID = authKeyHash.slice(-8);
|
authKeyID = authKeyHash.slice(-8);
|
||||||
|
|
||||||
@ -502,10 +519,15 @@ angular.module('izhukov.mtproto', ['izhukov.utils'])
|
|||||||
deferred.reject(new Error('Set_client_DH_params_answer fail'));
|
deferred.reject(new Error('Set_client_DH_params_answer fail'));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
}, function (error) {
|
||||||
|
deferred.reject(error);
|
||||||
|
})
|
||||||
}, function (error) {
|
}, function (error) {
|
||||||
deferred.reject(error);
|
deferred.reject(error);
|
||||||
});
|
});
|
||||||
|
}, function (error) {
|
||||||
|
deferred.reject(error);
|
||||||
|
})
|
||||||
};
|
};
|
||||||
|
|
||||||
var cached = {};
|
var cached = {};
|
||||||
|
Loading…
Reference in New Issue
Block a user