Add emscripten-compiled curve25519 module
Build with `grunt compile && grunt concat:curve25519` after installing emscripten. Enable by either (a) not loading nativeclient.js or (b) setting `textsecure.NATIVE_CLIENT = false` before loading nativeclient.js.pull/749/head
parent
3d27c98845
commit
b4f4f87a7c
@ -1,2 +1,3 @@
|
|||||||
node_modules
|
node_modules
|
||||||
.sass-cache
|
.sass-cache
|
||||||
|
build
|
||||||
|
@ -0,0 +1,2 @@
|
|||||||
|
|
||||||
|
})();
|
@ -0,0 +1 @@
|
|||||||
|
;(function() {
|
@ -0,0 +1,113 @@
|
|||||||
|
/* vim: ts=4:sw=4:expandtab
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
;(function() {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
// Insert some bytes into the emscripten memory and return a pointer
|
||||||
|
function _allocate(bytes) {
|
||||||
|
var address = Module._malloc(bytes.length);
|
||||||
|
Module.HEAPU8.set(bytes, address);
|
||||||
|
|
||||||
|
return address;
|
||||||
|
}
|
||||||
|
|
||||||
|
function _readBytes(address, length, array) {
|
||||||
|
array.set(Module.HEAPU8.subarray(address, address + length));
|
||||||
|
}
|
||||||
|
|
||||||
|
var basepoint = new Uint8Array(32);
|
||||||
|
basepoint[0] = 9;
|
||||||
|
|
||||||
|
window.curve25519 = {
|
||||||
|
privToPub: function(privKey) {
|
||||||
|
var priv = new Uint8Array(privKey);
|
||||||
|
priv[0] &= 248;
|
||||||
|
priv[31] &= 127;
|
||||||
|
priv[31] |= 64
|
||||||
|
|
||||||
|
// Where to store the result
|
||||||
|
var pubKey = new Uint8Array(32);
|
||||||
|
//var publicKey_ptr = Module._malloc(32);
|
||||||
|
var publicKey_ptr = _allocate(pubKey);
|
||||||
|
|
||||||
|
// Get a pointer to the private key
|
||||||
|
var privateKey_ptr = _allocate(priv);
|
||||||
|
|
||||||
|
// The basepoint for generating public keys is 0x09 followed by 31 null bytes
|
||||||
|
var basepoint_ptr = _allocate(basepoint);
|
||||||
|
|
||||||
|
// The return value is just 0, the operation is done in place
|
||||||
|
var err = Module._curve25519_donna(publicKey_ptr, privateKey_ptr, basepoint_ptr);
|
||||||
|
|
||||||
|
var res = new Uint8Array(32);
|
||||||
|
_readBytes(publicKey_ptr, 32, res);
|
||||||
|
|
||||||
|
return Promise.resolve({ pubKey: res.buffer, privKey: privKey });
|
||||||
|
},
|
||||||
|
ECDHE: function(pubKey, privKey) {
|
||||||
|
// Where to store the result
|
||||||
|
var sharedKey_ptr = Module._malloc(32);
|
||||||
|
|
||||||
|
// Get a pointer to our private key
|
||||||
|
var privateKey_ptr = _allocate(new Uint8Array(privKey));
|
||||||
|
|
||||||
|
// Get a pointer to their public key, the basepoint when you're generating a shared secret
|
||||||
|
var basepoint_ptr = _allocate(new Uint8Array(pubKey));
|
||||||
|
|
||||||
|
// Return value is 0 here too of course
|
||||||
|
var err = Module._curve25519_donna(sharedKey_ptr, privateKey_ptr, basepoint_ptr);
|
||||||
|
|
||||||
|
var res = new Uint8Array(32);
|
||||||
|
_readBytes(sharedKey_ptr, 32, res);
|
||||||
|
return Promise.resolve(res.buffer);
|
||||||
|
},
|
||||||
|
Ed25519Sign: function(privKey, message) {
|
||||||
|
// Where to store the result
|
||||||
|
var signature_ptr = Module._malloc(32);
|
||||||
|
|
||||||
|
// Get a pointer to our private key
|
||||||
|
var privateKey_ptr = _allocate(new Uint8Array(privKey));
|
||||||
|
|
||||||
|
// Get a pointer to the message
|
||||||
|
var message_ptr = _allocate(new Uint8Array(message));
|
||||||
|
|
||||||
|
var err = Module._curve25519_sign(signature_ptr, privateKey_ptr, message_ptr, message.byteLength);
|
||||||
|
|
||||||
|
var res = new Uint8Array(64);
|
||||||
|
_readBytes(signature_ptr, 64, res);
|
||||||
|
return Promise.resolve(res.buffer);
|
||||||
|
},
|
||||||
|
Ed25519Verify: function(pubKey, message, sig) {
|
||||||
|
// Get a pointer to their public key
|
||||||
|
var publicKey_ptr = _allocate(new Uint8Array(pubKey));
|
||||||
|
|
||||||
|
// Get a pointer to the signature
|
||||||
|
var signature_ptr = _allocate(new Uint8Array(sig));
|
||||||
|
|
||||||
|
// Get a pointer to the message
|
||||||
|
var message_ptr = _allocate(new Uint8Array(message));
|
||||||
|
|
||||||
|
var res = Module._curve25519_verify(signature_ptr, publicKey_ptr, message_ptr, message.byteLength);
|
||||||
|
return new Promise(function(resolve, reject) {
|
||||||
|
if (res !== 0) {
|
||||||
|
reject(new Error("Invalid signature"));
|
||||||
|
}
|
||||||
|
resolve();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
})();
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -0,0 +1,28 @@
|
|||||||
|
/* vim: ts=4:sw=4
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
|
||||||
|
describe('curve25519_compiled.js', function() {
|
||||||
|
describe('curve25519_donna', function() {
|
||||||
|
it('exists', function() {
|
||||||
|
var curve25519_donna = Module.cwrap('curve25519_sign', 'string', 'string');
|
||||||
|
assert.isDefined(Module.cwrap);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
test_curve25519_implementation(curve25519);
|
||||||
|
});
|
Loading…
Reference in New Issue