From 7d8acca7f948ded5f188e2fb9af6b0a11f9c0572 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Thu, 3 Mar 2022 17:49:28 -0300 Subject: changed implementation of bech32 to https://github.com/sipa/bech32/tree/master/ref/javascript --- packages/taler-util/src/segwit_addr.ts | 91 ++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 packages/taler-util/src/segwit_addr.ts (limited to 'packages/taler-util/src/segwit_addr.ts') diff --git a/packages/taler-util/src/segwit_addr.ts b/packages/taler-util/src/segwit_addr.ts new file mode 100644 index 000000000..becc5d197 --- /dev/null +++ b/packages/taler-util/src/segwit_addr.ts @@ -0,0 +1,91 @@ +// Copyright (c) 2017, 2021 Pieter Wuille +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +import bech32 from "./bech32.js" + +export default { + encode: encode, + decode: decode +}; + +function convertbits(data: any, frombits: number, tobits: number, pad: boolean): any[] { + var acc = 0; + var bits = 0; + var ret = []; + var maxv = (1 << tobits) - 1; + for (var p = 0; p < data.length; ++p) { + var value = data[p]; + if (value < 0 || (value >> frombits) !== 0) { + return []; //check this, was returning null + } + acc = (acc << frombits) | value; + bits += frombits; + while (bits >= tobits) { + bits -= tobits; + ret.push((acc >> bits) & maxv); + } + } + if (pad) { + if (bits > 0) { + ret.push((acc << (tobits - bits)) & maxv); + } + } else if (bits >= frombits || ((acc << (tobits - bits)) & maxv)) { + return []; //check this, was returning null + } + return ret; +} + +function decode(hrp: any, addr: string) { + var bech32m = false; + var dec = bech32.decode(addr, bech32.encodings.BECH32); + if (dec === null) { + dec = bech32.decode(addr, bech32.encodings.BECH32M); + bech32m = true; + } + if (dec === null || dec.hrp !== hrp || dec.data.length < 1 || dec.data[0] > 16) { + return null; + } + var res = convertbits(dec.data.slice(1), 5, 8, false); + if (res === null || res.length < 2 || res.length > 40) { + return null; + } + if (dec.data[0] === 0 && res.length !== 20 && res.length !== 32) { + return null; + } + if (dec.data[0] === 0 && bech32m) { + return null; + } + if (dec.data[0] !== 0 && !bech32m) { + return null; + } + return { version: dec.data[0], program: res }; +} + +function encode(hrp: any, version: number, program: any): string { + var enc = bech32.encodings.BECH32; + if (version > 0) { + enc = bech32.encodings.BECH32M; + } + var ret = bech32.encode(hrp, [version].concat(convertbits(program, 8, 5, true)), enc); + if (decode(hrp, ret/*, enc*/) === null) { + return ""; //check this was returning null + } + return ret; +} \ No newline at end of file -- cgit v1.2.3