diff options
Diffstat (limited to 'packages/taler-util')
| -rw-r--r-- | packages/taler-util/package.json | 2 | ||||
| -rw-r--r-- | packages/taler-util/src/contract-terms.ts | 2 | ||||
| -rw-r--r-- | packages/taler-util/src/kdf.ts | 40 | ||||
| -rw-r--r-- | packages/taler-util/src/taler-crypto.test.ts | 3 | ||||
| -rw-r--r-- | packages/taler-util/src/taler-crypto.ts | 63 | 
5 files changed, 63 insertions, 47 deletions
diff --git a/packages/taler-util/package.json b/packages/taler-util/package.json index 6406f3f49..15197c086 100644 --- a/packages/taler-util/package.json +++ b/packages/taler-util/package.json @@ -22,7 +22,7 @@      "pretty": "prettier --write src"    },    "devDependencies": { -    "@types/node": "^18.8.5", +    "@types/node": "^18.11.17",      "ava": "^4.3.3",      "esbuild": "^0.14.21",      "prettier": "^2.5.1", diff --git a/packages/taler-util/src/contract-terms.ts b/packages/taler-util/src/contract-terms.ts index 3567b50d8..b906a1d7f 100644 --- a/packages/taler-util/src/contract-terms.ts +++ b/packages/taler-util/src/contract-terms.ts @@ -16,12 +16,12 @@  import { canonicalJson } from "./helpers.js";  import { Logger } from "./logging.js"; -import { kdf } from "./kdf.js";  import {    decodeCrock,    encodeCrock,    getRandomBytes,    hash, +  kdf,    stringToBytes,  } from "./taler-crypto.js"; diff --git a/packages/taler-util/src/kdf.ts b/packages/taler-util/src/kdf.ts index dd8a2a459..8f4314340 100644 --- a/packages/taler-util/src/kdf.ts +++ b/packages/taler-util/src/kdf.ts @@ -16,7 +16,6 @@  import * as nacl from "./nacl-fast.js";  import { sha256 } from "./sha256.js"; -import { useNative } from "./taler-crypto.js";  export function sha512(data: Uint8Array): Uint8Array {    return nacl.hash(data); @@ -59,42 +58,3 @@ export function hmacSha512(key: Uint8Array, message: Uint8Array): Uint8Array {  export function hmacSha256(key: Uint8Array, message: Uint8Array): Uint8Array {    return hmac(sha256, 64, key, message);  } - -export function kdf( -  outputLength: number, -  ikm: Uint8Array, -  salt?: Uint8Array, -  info?: Uint8Array, -): Uint8Array { -  if (useNative && "_kdf" in globalThis) { -    // @ts-ignore -    return globalThis._kdf(outputLength, ikm, salt, info); -  } -  salt = salt ?? new Uint8Array(64); -  // extract -  const prk = hmacSha512(salt, ikm); - -  info = info ?? new Uint8Array(0); - -  // expand -  const N = Math.ceil(outputLength / 32); -  const output = new Uint8Array(N * 32); -  for (let i = 0; i < N; i++) { -    let buf; -    if (i == 0) { -      buf = new Uint8Array(info.byteLength + 1); -      buf.set(info, 0); -    } else { -      buf = new Uint8Array(info.byteLength + 1 + 32); -      for (let j = 0; j < 32; j++) { -        buf[j] = output[(i - 1) * 32 + j]; -      } -      buf.set(info, 32); -    } -    buf[buf.length - 1] = i + 1; -    const chunk = hmacSha256(prk, buf); -    output.set(chunk, i * 32); -  } - -  return output.slice(0, outputLength); -} diff --git a/packages/taler-util/src/taler-crypto.test.ts b/packages/taler-util/src/taler-crypto.test.ts index f154cb258..021730c7e 100644 --- a/packages/taler-util/src/taler-crypto.test.ts +++ b/packages/taler-util/src/taler-crypto.test.ts @@ -37,8 +37,9 @@ import {    getRandomBytes,    bigintToNaclArr,    bigintFromNaclArr, +  kdf,  } from "./taler-crypto.js"; -import { sha512, kdf } from "./kdf.js"; +import { sha512 } from "./kdf.js";  import * as nacl from "./nacl-fast.js";  import { initNodePrng } from "./prng-node.js"; diff --git a/packages/taler-util/src/taler-crypto.ts b/packages/taler-util/src/taler-crypto.ts index 0f8d2d950..66ad478d3 100644 --- a/packages/taler-util/src/taler-crypto.ts +++ b/packages/taler-util/src/taler-crypto.ts @@ -22,7 +22,7 @@   * Imports.   */  import * as nacl from "./nacl-fast.js"; -import { kdf } from "./kdf.js"; +import { hmacSha256, hmacSha512 } from "./kdf.js";  import bigint from "big-integer";  import {    CoinEnvelope, @@ -76,7 +76,10 @@ interface NativeTartLib {    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 +  rsaVerify(hmsg: Uint8Array, rsaSig: Uint8Array, rsaPub: Uint8Array): boolean; +  hashStateInit(): any; +  hashStateUpdate(st: any, data: Uint8Array): any; +  hashStateFinish(st: any): Uint8Array;  }  // @ts-ignore @@ -158,6 +161,45 @@ export function encodeCrock(data: ArrayBuffer): string {    return sb;  } +export function kdf( +  outputLength: number, +  ikm: Uint8Array, +  salt?: Uint8Array, +  info?: Uint8Array, +): Uint8Array { +  if (tart) { +    return tart.kdf(outputLength, ikm, salt, info) +  } +  salt = salt ?? new Uint8Array(64); +  // extract +  const prk = hmacSha512(salt, ikm); + +  info = info ?? new Uint8Array(0); + +  // expand +  const N = Math.ceil(outputLength / 32); +  const output = new Uint8Array(N * 32); +  for (let i = 0; i < N; i++) { +    let buf; +    if (i == 0) { +      buf = new Uint8Array(info.byteLength + 1); +      buf.set(info, 0); +    } else { +      buf = new Uint8Array(info.byteLength + 1 + 32); +      for (let j = 0; j < 32; j++) { +        buf[j] = output[(i - 1) * 32 + j]; +      } +      buf.set(info, 32); +    } +    buf[buf.length - 1] = i + 1; +    const chunk = hmacSha256(prk, buf); +    output.set(chunk, i * 32); +  } + +  return output.slice(0, outputLength); +} + +  /**   * HMAC-SHA512-SHA256 (see RFC 5869).   */ @@ -708,7 +750,7 @@ const logger = new Logger("talerCrypto.ts");  export function hashCoinEvInner(    coinEv: CoinEnvelope, -  hashState: nacl.HashState, +  hashState: TalerHashState,  ): void {    const hashInputBuf = new ArrayBuffer(4);    const uint8ArrayBuf = new Uint8Array(hashInputBuf); @@ -785,7 +827,20 @@ export function eddsaVerify(    return nacl.sign_detached_verify(msg, sig, eddsaPub);  } -export function createHashContext(): nacl.HashState { +export interface TalerHashState { +  update(data: Uint8Array): void; +  finish(): Uint8Array; +} + +export function createHashContext(): TalerHashState { +  if (tart) { +    const t = tart; +    const st = tart.hashStateInit(); +    return { +      finish: () => t.hashStateFinish(st), +      update: (d) => t.hashStateUpdate(st, d), +    } +  }    return new nacl.HashState();  }  | 
