From 8a98a5f880b9559312779232b6086016c008969b Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Wed, 21 Dec 2022 18:50:15 +0100 Subject: wallet: use taler runtime (tart) if available --- packages/taler-util/src/taler-crypto.ts | 90 ++++++++++++++---------- packages/taler-wallet-embedded/src/wallet-qjs.ts | 2 +- 2 files changed, 55 insertions(+), 37 deletions(-) diff --git a/packages/taler-util/src/taler-crypto.ts b/packages/taler-util/src/taler-crypto.ts index 3e55f68f1..0f8d2d950 100644 --- a/packages/taler-util/src/taler-crypto.ts +++ b/packages/taler-util/src/taler-crypto.ts @@ -57,6 +57,36 @@ export function getRandomBytesF( export const useNative = true; +/** + * Interface of the native Taler runtime library. + */ +interface NativeTartLib { + decodeUtf8(buf: Uint8Array): string; + decodeUtf8(str: string): Uint8Array; + randomBytes(n: number): Uint8Array; + encodeCrock(buf: Uint8Array | ArrayBuffer): string; + decodeCrock(str: string): Uint8Array; + hash(buf: Uint8Array): Uint8Array; + eddsaGetPublic(buf: Uint8Array): Uint8Array; + ecdheGetPublic(buf: Uint8Array): Uint8Array; + eddsaSign(msg: Uint8Array, priv: Uint8Array): Uint8Array; + eddsaVerify(msg: Uint8Array, sig: Uint8Array, pub: Uint8Array): boolean; + kdf(outLen: number, ikm: Uint8Array, salt?: Uint8Array, info?: Uint8Array): Uint8Array; + keyExchangeEcdhEddsa(ecdhPriv: Uint8Array, eddsaPub: Uint8Array): Uint8Array; + keyExchangeEddsaEcdh(eddsaPriv: Uint8Array, ecdhPub: Uint8Array): Uint8Array; + rsaBlind(hmsg: Uint8Array, bks: Uint8Array, rsaPub: Uint8Array): Uint8Array; + rsaUnblind(blindSig: Uint8Array, rsaPub: Uint8Array, bks: Uint8Array): Uint8Array; + rsaVerify(hmsg: Uint8Array, rsaSig: Uint8Array, rsaPub: Uint8Array): boolean +} + +// @ts-ignore +let tart: NativeTartLib | undefined; + +if (useNative) { + // @ts-ignore + tart = globalThis._tart; +} + const encTable = "0123456789ABCDEFGHJKMNPQRSTVWXYZ"; class EncodingError extends Error { @@ -101,9 +131,8 @@ function getValue(chr: string): number { } export function encodeCrock(data: ArrayBuffer): string { - if (useNative && "_encodeCrock" in globalThis) { - // @ts-ignore - return globalThis._encodeCrock(data); + if (tart) { + return tart.encodeCrock(data); } const dataBytes = new Uint8Array(data); let sb = ""; @@ -142,9 +171,8 @@ export function kdfKw(args: { } export function decodeCrock(encoded: string): Uint8Array { - if (useNative && "_decodeCrock" in globalThis) { - // @ts-ignore - return globalThis._decodeCrock(encoded); + if (tart) { + return tart.decodeCrock(encoded); } const size = encoded.length; let bitpos = 0; @@ -174,18 +202,16 @@ export function decodeCrock(encoded: string): Uint8Array { } export function eddsaGetPublic(eddsaPriv: Uint8Array): Uint8Array { - if (useNative && "_eddsaGetPublic" in globalThis) { - // @ts-ignore - return globalThis._eddsaGetPublic(eddsaPriv); + if (tart) { + return tart.eddsaGetPublic(eddsaPriv); } const pair = nacl.crypto_sign_keyPair_fromSeed(eddsaPriv); return pair.publicKey; } export function ecdhGetPublic(ecdhePriv: Uint8Array): Uint8Array { - if (useNative && "_ecdheGetPublic" in globalThis) { - // @ts-ignore - return globalThis._ecdheGetPublic(ecdhePriv); + if (tart) { + return tart.ecdheGetPublic(ecdhePriv); } return nacl.scalarMult_base(ecdhePriv); } @@ -194,9 +220,8 @@ export function keyExchangeEddsaEcdh( eddsaPriv: Uint8Array, ecdhPub: Uint8Array, ): Uint8Array { - if (useNative && "_keyExchangeEddsaEcdh" in globalThis) { - // @ts-ignore - return globalThis._keyExchangeEddsaEcdh(eddsaPriv, ecdhPub); + if (tart) { + return tart.keyExchangeEddsaEcdh(eddsaPriv, ecdhPub); } const ph = hash(eddsaPriv); const a = new Uint8Array(32); @@ -211,9 +236,8 @@ export function keyExchangeEcdhEddsa( ecdhPriv: Uint8Array & MaterialEcdhePriv, eddsaPub: Uint8Array & MaterialEddsaPub, ): Uint8Array { - if (useNative && "_keyExchangeEcdhEddsa" in globalThis) { - // @ts-ignore - return globalThis._keyExchangeEcdhEddsa(ecdhPriv, eddsaPub); + if (tart) { + return tart.keyExchangeEcdhEddsa(ecdhPriv, eddsaPub); } const curve25519Pub = nacl.sign_ed25519_pk_to_curve25519(eddsaPub); const x = nacl.scalarMult(ecdhPriv, curve25519Pub); @@ -377,9 +401,8 @@ export function rsaBlind( bks: Uint8Array, rsaPubEnc: Uint8Array, ): Uint8Array { - if (useNative && "_rsaBlind" in globalThis) { - // @ts-ignore - return globalThis._rsaBlind(hm, bks, rsaPubEnc); + if (tart) { + return tart.rsaBlind(hm, bks, rsaPubEnc); } const rsaPub = rsaPubDecode(rsaPubEnc); const data = rsaFullDomainHash(hm, rsaPub); @@ -394,9 +417,8 @@ export function rsaUnblind( rsaPubEnc: Uint8Array, bks: Uint8Array, ): Uint8Array { - if (useNative && "_rsaUnblind" in globalThis) { - // @ts-ignore - return globalThis._rsaUnblind(sig, rsaPubEnc, bks); + if (tart) { + return tart.rsaUnblind(sig, rsaPubEnc, bks) } const rsaPub = rsaPubDecode(rsaPubEnc); const blinded_s = loadBigInt(sig); @@ -411,9 +433,8 @@ export function rsaVerify( rsaSig: Uint8Array, rsaPubEnc: Uint8Array, ): boolean { - if (useNative && "_rsaVerify" in globalThis) { - // @ts-ignore - return globalThis._rsaVerify(hm, rsaSig, rsaPubEnc); + if (tart) { + return tart.rsaVerify(hm, rsaSig, rsaPubEnc); } const rsaPub = rsaPubDecode(rsaPubEnc); const d = rsaFullDomainHash(hm, rsaPub); @@ -658,9 +679,8 @@ export function createEcdheKeyPair(): EcdheKeyPair { } export function hash(d: Uint8Array): Uint8Array { - if (useNative && "_hash" in globalThis) { - // @ts-ignore - return globalThis._hash(d); + if (tart) { + return tart.hash(d); } return nacl.hash(d); } @@ -747,9 +767,8 @@ export function hashDenomPub(pub: DenominationPubKey): Uint8Array { } export function eddsaSign(msg: Uint8Array, eddsaPriv: Uint8Array): Uint8Array { - if (useNative && "_eddsaSign" in globalThis) { - // @ts-ignore - return globalThis._eddsaSign(msg, eddsaPriv); + if (tart) { + return tart.eddsaSign(msg, eddsaPriv); } const pair = nacl.crypto_sign_keyPair_fromSeed(eddsaPriv); return nacl.sign_detached(msg, pair.secretKey); @@ -760,9 +779,8 @@ export function eddsaVerify( sig: Uint8Array, eddsaPub: Uint8Array, ): boolean { - if (useNative && "_eddsaVerify" in globalThis) { - // @ts-ignore - return globalThis._eddsaVerify(msg, sig, eddsaPub); + if (tart) { + return tart.eddsaVerify(msg, sig, eddsaPub); } return nacl.sign_detached_verify(msg, sig, eddsaPub); } diff --git a/packages/taler-wallet-embedded/src/wallet-qjs.ts b/packages/taler-wallet-embedded/src/wallet-qjs.ts index 889cbd83a..cdd5400cf 100644 --- a/packages/taler-wallet-embedded/src/wallet-qjs.ts +++ b/packages/taler-wallet-embedded/src/wallet-qjs.ts @@ -59,7 +59,7 @@ setGlobalLogLevelFromString("trace"); setPRNG(function (x: Uint8Array, n: number) { // @ts-ignore - const va = globalThis._randomBytes(n); + const va = globalThis._tart.randomBytes(n); const v = new Uint8Array(va); for (let i = 0; i < n; i++) x[i] = v[i]; for (let i = 0; i < v.length; i++) v[i] = 0; -- cgit v1.2.3