524 lines
17 KiB
JavaScript
524 lines
17 KiB
JavaScript
/*
|
|
|
|
This file is part of TALER
|
|
Copyright (C) 2014, 2015 Christian Grothoff (and other contributing authors)
|
|
|
|
TALER is free software; you can redistribute it and/or modify it under the
|
|
terms of the GNU General Public License as published by the Free Software
|
|
Foundation; either version 3, or (at your option) any later version.
|
|
|
|
TALER 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 General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License along with
|
|
TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
|
|
*/
|
|
|
|
"use strict";
|
|
|
|
|
|
/* According to emscripten's design, we need our emscripted library to be executed
|
|
with a 'window' object as its global scope.
|
|
Note: that holds on emscripten's functions too, that is they need to be *explicitly*
|
|
run with some 'window' object as their global scope. In practice, given a function
|
|
'foo' pointing to some emscripted function, that is accomplished by the mean of 'call()'
|
|
or 'apply()' methods; so, being 'someWin' a 'window' object, the statements
|
|
|
|
foo.call('someWin', arg1, .., argN) or foo.apply('someWin', ['arg1', .., 'argN']) will
|
|
execute foo(arg1, .., argN) with 'someWin' as its global scope.
|
|
See http://www.bennadel.com/blog/2265-changing-the-execution-context-of-javascript
|
|
-functions-using-call-and-apply.htm. */
|
|
|
|
/* The naming convention is such that:
|
|
- 'GCfunctionName' takes its code from GNUNET_CRYPTO_function_name
|
|
- 'GCALLfunctionName' takes its code from GNUNET_CRYPTO_function_name and returns
|
|
a pointer that must be deallocated using 'WRgnunetFree' (that takes its code from
|
|
'GNUNET_free' in the wrapper)
|
|
- 'GSfunctionName' and 'GSALLfunctionName' comply to the same convention respect to
|
|
GNUNET_STRINGS_* realm.
|
|
- 'TWRfunctionName' takes its code from 'TALER_function_name' in the wrapper.
|
|
- 'TWRALLfunctionName' takes its code from 'TALER_ALL_function_name' in the wrapper
|
|
and returns a pointer that must be deallocated using 'TWRgnunetFree' (or a function
|
|
provided by some emscripted routine) (the 'wrapper' is an additional layer written in
|
|
C that does some struct(s) manipulations where that is uncovenient to do from JavaScript.
|
|
Currently located at '../../emscripten/testcases/wrap.c')
|
|
- The same applies to 'TfunctionName' and 'TALLfunctionName', to indicate that the
|
|
respective functions come from (the emscripted version of) TALER_* realm. */
|
|
|
|
|
|
const PTR_SIZE = 4;
|
|
|
|
// shortcut to emscr's 'malloc'
|
|
function emscMalloc(size) {
|
|
var ptr = Module._malloc(size);
|
|
return ptr;
|
|
}
|
|
|
|
/* shortcut to emscr's 'free'. This function is problematic:
|
|
it randomly stops working giving 'emscFree is not a function'
|
|
error */
|
|
function emscFree(ptr) {
|
|
Module._free(ptr);
|
|
}
|
|
|
|
var getEmsc = Module.cwrap;
|
|
|
|
var TWRhelloWorld = getEmsc('TALER_WR_hello_world', 'void', []);
|
|
|
|
var TWRverifyConfirmation = getEmsc('TALER_WR_verify_confirmation',
|
|
'number',
|
|
['number',
|
|
'number',
|
|
'number',
|
|
'number',
|
|
'number',
|
|
'number',
|
|
'number',
|
|
'number',
|
|
'number',
|
|
'number',
|
|
'number']);
|
|
var TWRgetValue = getEmsc('TALER_WR_get_value',
|
|
'number',
|
|
['number']);
|
|
|
|
var TWRgetFraction = getEmsc('TALER_WR_get_fraction',
|
|
'number',
|
|
['number']);
|
|
|
|
var TWRgetCurrency = getEmsc('TALER_WR_get_currency',
|
|
'string',
|
|
['number']);
|
|
|
|
|
|
var TWRmultiplyAmounts = getEmsc('TALER_WR_multiply_amounts',
|
|
'number',
|
|
['number',
|
|
'number'] );
|
|
|
|
var TWRmultiplyAmount = getEmsc('TALER_WR_multiply_amount',
|
|
'number',
|
|
['number',
|
|
'number'] );
|
|
|
|
var TWRALLrsaPublicKeyHash = getEmsc('TALER_WRALL_rsa_public_key_hash',
|
|
'number',
|
|
['number']);
|
|
|
|
var TWRverifyDenom = getEmsc('TALER_WR_verify_denom',
|
|
'number',
|
|
['number',
|
|
'number',
|
|
'number',
|
|
'number',
|
|
'number',
|
|
'number',
|
|
'number',
|
|
'number',
|
|
'number',
|
|
'number',
|
|
'number']);
|
|
|
|
var TWRverifyDenoms = getEmsc('TALER_WR_verify_denoms',
|
|
'number',
|
|
['number',
|
|
'number',
|
|
'number',
|
|
'number',
|
|
'number']);
|
|
|
|
var TWRverifySignKey = getEmsc('TALER_WR_verify_sign_key',
|
|
'number',
|
|
['number',
|
|
'number',
|
|
'number',
|
|
'number',
|
|
'number',
|
|
'number']);
|
|
|
|
|
|
var TWRALLgetEncodingFromRsaSignature = getEmsc('TALER_WRALL_get_encoding_from_rsa_signature',
|
|
'number',
|
|
['number']);
|
|
|
|
var TamountCmp = getEmsc('TALER_amount_cmp',
|
|
'number',
|
|
['number',
|
|
'number']);
|
|
|
|
var DWRdumpAmount = getEmsc('DEBUG_WR_dump_amount',
|
|
'void'
|
|
['number']);
|
|
|
|
var DWRtestStringCmp = getEmsc('DEBUG_WR_test_string_cmp',
|
|
'number',
|
|
['number',
|
|
'string']);
|
|
|
|
var TWRALLgetAmount = getEmsc('TALER_WRALL_get_amount',
|
|
'number',
|
|
['number',
|
|
'number',
|
|
'number',
|
|
'string']);
|
|
|
|
var DWRgetPurpose = getEmsc('DEBUG_WR_get_purpose',
|
|
'number',
|
|
['number']);
|
|
|
|
var TWReddsaVerify = getEmsc('TALER_WR_eddsa_verify',
|
|
'number',
|
|
['string',
|
|
'number',
|
|
'number',
|
|
'number']);
|
|
|
|
var TWRALLmakeEddsaSignature = getEmsc('TALER_WRALL_make_eddsa_signature',
|
|
'number',
|
|
['number',
|
|
'number']);
|
|
|
|
var TWRALLamountAdd = getEmsc('TALER_WRALL_amount_add',
|
|
'number',
|
|
['number',
|
|
'number',
|
|
'number',
|
|
'number',
|
|
'number',
|
|
'number',
|
|
'string']);
|
|
|
|
var TamountSubtract = getEmsc('TALER_amount_subtract',
|
|
'number',
|
|
['number',
|
|
'number',
|
|
'number']);
|
|
|
|
var TamountAdd = getEmsc('TALER_amount_add',
|
|
'number',
|
|
['number',
|
|
'number',
|
|
'number']);
|
|
var TWRALLeddsaPublicKeyFromPrivate = getEmsc('TALER_WRALL_eddsa_public_key_from_private',
|
|
'number',
|
|
['number']);
|
|
|
|
var TWRALLeddsaPublicKeyFromPrivString = getEmsc('TALER_WRALL_eddsa_public_key_from_priv_string',
|
|
'number',
|
|
['string']);
|
|
|
|
var TWRALLsignDepositPermission = getEmsc('TALER_WRALL_sign_deposit_permission',
|
|
'number',
|
|
['number',
|
|
'number',
|
|
'number',
|
|
'number',
|
|
'number',
|
|
'number',
|
|
'number',
|
|
'number',
|
|
'number',
|
|
'number']);
|
|
|
|
var TWRALLeddsaPrivateKeyFromString = getEmsc('TALER_WRALL_eddsa_private_key_from_string',
|
|
'number',
|
|
['string']);
|
|
|
|
var TWRALLrsaPublicKeyDecodeFromString = getEmsc('TALER_WRALL_rsa_public_key_decode_from_string',
|
|
'number',
|
|
['string']);
|
|
|
|
var TWRALLecdhePublicKeyFromPrivateKey = getEmsc('TALER_WRALL_ecdhe_public_key_from_private_key',
|
|
'number',
|
|
['number']);
|
|
|
|
var TWRALLeccEcdh = getEmsc('TALER_WRALL_ecc_ecdh',
|
|
'number',
|
|
['number',
|
|
'number',
|
|
'number']);
|
|
|
|
var TWRALLmakeWithdrawBundle = getEmsc('TALER_WRALL_make_withdraw_bundle',
|
|
'number',
|
|
['number',
|
|
'number',
|
|
'number',
|
|
'number',
|
|
'number',
|
|
'number']);
|
|
|
|
var WRALLmakePurpose = getEmsc('WRALL_make_purpose',
|
|
'number',
|
|
['string',
|
|
'number',
|
|
'number',
|
|
'number']);
|
|
|
|
var GCALLrsaSignatureDecode = getEmsc('GNUNET_CRYPTO_rsa_signature_decode',
|
|
'number',
|
|
['number',
|
|
'number']);
|
|
|
|
var GCALLrsaSignatureEncode = getEmsc('GNUNET_CRYPTO_rsa_signature_encode',
|
|
'number',
|
|
['number',
|
|
'number']);
|
|
|
|
var GCALLrsaPublicKeyEncode = getEmsc('GNUNET_CRYPTO_rsa_public_key_encode',
|
|
'number',
|
|
['number',
|
|
'number']);
|
|
|
|
var GCALLrsaPublicKeyDecode = getEmsc('GNUNET_CRYPTO_rsa_public_key_decode',
|
|
'number',
|
|
['number',
|
|
'number']);
|
|
|
|
var GCALLrsaPrivateKeyGetPublic = getEmsc('GNUNET_CRYPTO_rsa_private_key_get_public',
|
|
'number',
|
|
['number']);
|
|
|
|
var GCALLrsaPrivateKeyCreate = getEmsc('GNUNET_CRYPTO_rsa_private_key_create',
|
|
'number',
|
|
['number']);
|
|
|
|
var GCALLrsaBlindingKeyCreate = getEmsc('GNUNET_CRYPTO_rsa_blinding_key_create',
|
|
'number',
|
|
['number']);
|
|
|
|
|
|
var GCALLrsaBlindingKeyEncode = getEmsc('GNUNET_CRYPTO_rsa_blinding_key_encode',
|
|
'number',
|
|
['number', 'number']);
|
|
|
|
var GCrsaBlindingKeyFree = getEmsc('GNUNET_CRYPTO_rsa_blinding_key_free',
|
|
'void',
|
|
['number']);
|
|
|
|
var GCrsaPublicKeyFree = getEmsc('GNUNET_CRYPTO_rsa_public_key_free',
|
|
'void',
|
|
['number']);
|
|
|
|
var GCrsaPrivateKeyFree = getEmsc('GNUNET_CRYPTO_rsa_private_key_free',
|
|
'void',
|
|
['number']);
|
|
|
|
var GCALLrsaBlind = getEmsc('GNUNET_CRYPTO_rsa_blind',
|
|
'number',
|
|
['number',
|
|
'number',
|
|
'number',
|
|
'number']);
|
|
|
|
var GCALLrsaUnblind = getEmsc('GNUNET_CRYPTO_rsa_unblind',
|
|
'number',
|
|
['number',
|
|
'number',
|
|
'number']);
|
|
|
|
var GCALLrsaSign = getEmsc('GNUNET_CRYPTO_rsa_sign',
|
|
'number',
|
|
['number',
|
|
'number',
|
|
'number']);
|
|
|
|
var GCrsaVerify = getEmsc('GNUNET_CRYPTO_rsa_verify',
|
|
'number',
|
|
['number',
|
|
'number',
|
|
'number']);
|
|
|
|
var GCrsaSignatureFree = getEmsc('GNUNET_CRYPTO_rsa_signature_free',
|
|
'void',
|
|
['number']);
|
|
|
|
var GChkdf = getEmsc('GNUNET_CRYPTO_hkdf',
|
|
'number',
|
|
['number',
|
|
'number',
|
|
'number',
|
|
'number',
|
|
'number',
|
|
'number',
|
|
'number',
|
|
'number']);
|
|
|
|
var TWRALLgenKeyFromBlob = getEmsc('TALER_WRALL_gen_key_from_blob',
|
|
'number',
|
|
['string',
|
|
'number',
|
|
'number']);
|
|
|
|
var DWRtestString = getEmsc('DEBUG_WR_test_string',
|
|
'void',
|
|
['number',
|
|
'number',
|
|
'string']);
|
|
|
|
var GCsymmetricDecrypt = getEmsc('GNUNET_CRYPTO_symmetric_decrypt',
|
|
'number',
|
|
['number',
|
|
'number',
|
|
'number',
|
|
'number',
|
|
'number']);
|
|
|
|
var GCsymmetricEncrypt = getEmsc('GNUNET_CRYPTO_symmetric_encrypt',
|
|
'number',
|
|
['number',
|
|
'number',
|
|
'number',
|
|
'number',
|
|
'number']);
|
|
|
|
/* returns a pointer to a symmetric session key strucure and takes a salt, a
|
|
(pointer to) binary data used to generate the key, and the length of that
|
|
data */
|
|
var TWRALLgenSymmetricKey = getEmsc('TALER_WRALL_gen_symmetric_key',
|
|
'number',
|
|
['string',
|
|
'number',
|
|
'number']);
|
|
|
|
/* returns a pointer to a init. vector strucure and takes a salt, a
|
|
(pointer to) binary data used to generate the key, and the length of that
|
|
data */
|
|
var TWRALLgenInitVector = getEmsc('TALER_WRALL_gen_init_vector',
|
|
'number',
|
|
['string',
|
|
'number',
|
|
'number']);
|
|
|
|
// return key material from ECC keys
|
|
var GCeccEcdh = getEmsc('GNUNET_CRYPTO_ecc_ecdh',
|
|
'number',
|
|
['number',
|
|
'number',
|
|
'number']);
|
|
|
|
// return a pointer to a freshly allocated EddsaPublicKey structure
|
|
/* var WRALLeddsaPublicKey = getEmsc('WRALL_eddsa_public_key',
|
|
'number'); */
|
|
|
|
// return a pointer to a freshly allocated EcdhePublicKey structure
|
|
/* var WRALLecdhePublicKey = getEmsc('WRALL_ecdhe_public_key',
|
|
'number'); */
|
|
|
|
/* generates a new eddsa private key, returning a pointer to EddsaPrivateKey
|
|
structure */
|
|
var GCALLeddsaKeyCreate = getEmsc('GNUNET_CRYPTO_eddsa_key_create',
|
|
'number');
|
|
|
|
/* extract eddsa public key from a pointer to a EddsaPrivateKey structure
|
|
and put it in second argument */
|
|
var GCeddsaKeyGetPublic = getEmsc('GNUNET_CRYPTO_eddsa_key_get_public',
|
|
'void',
|
|
['number',
|
|
'number']);
|
|
|
|
/* generates a new ecdhe private key, returning a pointer to EcdhePrivateKey
|
|
structure */
|
|
var GCALLecdheKeyCreate = getEmsc('GNUNET_CRYPTO_ecdhe_key_create',
|
|
'number');
|
|
|
|
/* extract eddsa public key from a pointer to a EddsaPrivateKey structure and
|
|
put it in second argument */
|
|
var GCecdheKeyGetPublic = getEmsc('GNUNET_CRYPTO_ecdhe_key_get_public',
|
|
'void',
|
|
['number',
|
|
'number']);
|
|
|
|
// what to sign, the reason to sign, the location to store the signature
|
|
var GCeddsaSign = getEmsc('GNUNET_CRYPTO_eddsa_sign',
|
|
'int',
|
|
['number',
|
|
'number',
|
|
'number']);
|
|
|
|
/* get reference to the emscripted primitive: the first parameter is a
|
|
pointer (note that it points to the emscripten's heap) to the data being
|
|
encoded, the second is its length */
|
|
var GSALLdataToStringAlloc = getEmsc('GNUNET_STRINGS_data_to_string_alloc',
|
|
'number',
|
|
['number',
|
|
'number']);
|
|
|
|
// import GNUnet's memory deallocator
|
|
var TWRgnunetFree = getEmsc('TALER_WR_GNUNET_free',
|
|
'void',
|
|
['number']);
|
|
|
|
// GNUnet's base32 decoder
|
|
var GSstringToData = getEmsc('GNUNET_STRINGS_string_to_data',
|
|
'number',
|
|
['number',
|
|
'number',
|
|
'number',
|
|
'number']);
|
|
|
|
// get absolute time. Returned value has to be freed by gnunetFree
|
|
var TWRALLgetCurrentTime = getEmsc('TALER_WRALL_get_current_time',
|
|
'number');
|
|
|
|
// prettyfy time
|
|
var TWRgetFancyTime = getEmsc('TALER_WR_get_fancy_time',
|
|
'string',
|
|
['number']);
|
|
|
|
var TWRALLhash = getEmsc('TALER_WRALL_hash',
|
|
'number',
|
|
['number',
|
|
'number']);
|
|
|
|
/* computes the hashcode of the value pointed to by 'val' and sets the
|
|
pointer to the location holding the hashcode (which has to be previously
|
|
allocated and is a reflection of GNUNET_HashCode type). The returned
|
|
pointer has to be freed by gnunetFree.
|
|
Its interface is hash('val', 'valSize', 'hashedBuf') */
|
|
var GChash = getEmsc('GNUNET_CRYPTO_hash',
|
|
'void',
|
|
['number',
|
|
'number',
|
|
'number']);
|
|
|
|
/* this test just takes the private key to sign a dummy hardcoded
|
|
message. Return a pointer to the signed message (to be freed) */
|
|
var TWRALLsignTest = getEmsc('TALER_WRALL_sign_test',
|
|
'number',
|
|
['number']);
|
|
|
|
/* this test just takes the public key and the signed dummy
|
|
message. Return GNUNET_OK (=1) if it succeeds, otherwise
|
|
GNUNET_SYSERR (=-1) */
|
|
var WRverifyTest = getEmsc('WR_verify_test',
|
|
'number',
|
|
['number']);
|
|
|
|
|
|
let d2s = getEmsc('GNUNET_STRINGS_data_to_string_alloc',
|
|
'string',
|
|
['number', 'number']);
|
|
|
|
|
|
let sizeof_EddsaPrivateKey = 32;
|
|
let sizeof_EddsaPublicKey = 32;
|
|
|
|
function createEddsaKeyPair() {
|
|
let privPtr = GCALLeddsaKeyCreate();
|
|
let pubPtr = emscMalloc(sizeof_EddsaPublicKey);
|
|
GCeddsaKeyGetPublic(privPtr, pubPtr);
|
|
let privStr = d2s(privPtr, sizeof_EddsaPrivateKey);
|
|
let pubStr = d2s(pubPtr, sizeof_EddsaPublicKey);
|
|
return {priv: privStr, pub: pubStr};
|
|
}
|
|
|
|
function createRsaBlindingKey() {
|
|
let blindFac = GCALLrsaBlindingKeyCreate(1024);
|
|
let bufPtr = emscMalloc(PTR_SIZE);
|
|
let size = GCALLrsaBlindingKeyEncode (blindFac, bufPtr);
|
|
let key = d2s(Module.getValue(bufPtr, '*'), size);
|
|
emscFree(bufPtr);
|
|
return key;
|
|
}
|