From e1991a6c9d39cfb92869f527684468fb7f0ce99b Mon Sep 17 00:00:00 2001 From: michael1011 Date: Sun, 20 Oct 2024 13:43:03 +0200 Subject: [PATCH] feat: fetch BIP-353 with DNSSEC prover (#700) --- .gitmodules | 3 + .prettierignore | 1 + babel.config.js | 1 + build.py | 2 +- build_dnssec_prover.py | 27 ++ dnssec-prover | 1 + package-lock.json | 15 + package.json | 1 + src/utils/dnssec/README.md | 7 + src/utils/dnssec/dnssec_prover_wasm.d.ts | 86 +++++ src/utils/dnssec/dnssec_prover_wasm.js | 339 ++++++++++++++++++ src/utils/dnssec/dnssec_prover_wasm_bg.wasm | Bin 0 -> 203212 bytes .../dnssec/dnssec_prover_wasm_bg.wasm.d.ts | 15 + src/utils/dnssec/dohLookup.ts | 94 +++++ src/utils/invoice.ts | 59 +-- 15 files changed, 629 insertions(+), 22 deletions(-) create mode 100644 .prettierignore create mode 100755 build_dnssec_prover.py create mode 160000 dnssec-prover create mode 100644 src/utils/dnssec/README.md create mode 100644 src/utils/dnssec/dnssec_prover_wasm.d.ts create mode 100644 src/utils/dnssec/dnssec_prover_wasm.js create mode 100644 src/utils/dnssec/dnssec_prover_wasm_bg.wasm create mode 100644 src/utils/dnssec/dnssec_prover_wasm_bg.wasm.d.ts create mode 100644 src/utils/dnssec/dohLookup.ts diff --git a/.gitmodules b/.gitmodules index f18645c2..a8ef7faf 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "regtest"] path = regtest url = https://github.com/BoltzExchange/regtest.git +[submodule "dnssec-prover"] + path = dnssec-prover + url = https://git.bitcoin.ninja/dnssec-prover diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 00000000..008427ea --- /dev/null +++ b/.prettierignore @@ -0,0 +1 @@ +src/utils/dnssec/dnssec* diff --git a/babel.config.js b/babel.config.js index a6920cc1..c8eed905 100644 --- a/babel.config.js +++ b/babel.config.js @@ -5,6 +5,7 @@ module.exports = { "@babel/preset-typescript", ], plugins: [ + "babel-plugin-transform-import-meta", "babel-plugin-transform-vite-meta-env", [ "@babel/plugin-transform-modules-commonjs", diff --git a/build.py b/build.py index 39851474..c7574788 100755 --- a/build.py +++ b/build.py @@ -21,7 +21,7 @@ def handle_coop_disabled(): data = json.load(f) network = data["network"] - + if data.get("cooperativeDisabled", False): handle_coop_disabled() diff --git a/build_dnssec_prover.py b/build_dnssec_prover.py new file mode 100755 index 00000000..69fda8d6 --- /dev/null +++ b/build_dnssec_prover.py @@ -0,0 +1,27 @@ +#! /bin/python3 + +import os +import shutil +from pathlib import Path + +def build(): + target_dir = Path(os.path.dirname(__file__)).joinpath("src/utils/dnssec") + + build_dir = Path(os.path.dirname(__file__)).joinpath("dnssec-prover/wasmpack") + os.chdir(build_dir) + os.system("wasm-pack build --target web --release && rm Cargo.lock && rm -r target/") + + os.chdir(os.path.dirname(__file__)) + os.makedirs(target_dir, exist_ok=True) + + for base, _, files in os.walk(build_dir.joinpath("pkg")): + for file in files: + if file in ["package.json", ".gitignore"]: + continue + + shutil.copy2( + Path(base).joinpath(file), + Path(target_dir).joinpath(file) + ) + +build() diff --git a/dnssec-prover b/dnssec-prover new file mode 160000 index 00000000..c4e06c7d --- /dev/null +++ b/dnssec-prover @@ -0,0 +1 @@ +Subproject commit c4e06c7d6099683b080d2f0c3b8b15d2d9e63824 diff --git a/package-lock.json b/package-lock.json index 9a40e8e9..af2ba9b5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -47,6 +47,7 @@ "@types/jest": "^29.5.12", "@webbtc/webln-types": "^3.0.0", "babel-jest": "^29.7.0", + "babel-plugin-transform-import-meta": "^2.2.1", "babel-plugin-transform-vite-meta-env": "^1.0.3", "babel-preset-jest": "^29.6.3", "babel-preset-solid": "^1.8.19", @@ -5281,6 +5282,20 @@ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, + "node_modules/babel-plugin-transform-import-meta": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-import-meta/-/babel-plugin-transform-import-meta-2.2.1.tgz", + "integrity": "sha512-AxNh27Pcg8Kt112RGa3Vod2QS2YXKKJ6+nSvRtv7qQTJAdx0MZa4UHZ4lnxHUWA2MNbLuZQv5FVab4P1CoLOWw==", + "dev": true, + "license": "BSD", + "dependencies": { + "@babel/template": "^7.4.4", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@babel/core": "^7.10.0" + } + }, "node_modules/babel-plugin-transform-vite-meta-env": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/babel-plugin-transform-vite-meta-env/-/babel-plugin-transform-vite-meta-env-1.0.3.tgz", diff --git a/package.json b/package.json index 666de3da..ea3cf9d3 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,7 @@ "@types/jest": "^29.5.12", "@webbtc/webln-types": "^3.0.0", "babel-jest": "^29.7.0", + "babel-plugin-transform-import-meta": "^2.2.1", "babel-plugin-transform-vite-meta-env": "^1.0.3", "babel-preset-jest": "^29.6.3", "babel-preset-solid": "^1.8.19", diff --git a/src/utils/dnssec/README.md b/src/utils/dnssec/README.md new file mode 100644 index 00000000..19fef312 --- /dev/null +++ b/src/utils/dnssec/README.md @@ -0,0 +1,7 @@ +# DNSSEC prover + +## Copyright + +Compiled artifacts of https://git.bitcoin.ninja/dnssec-prover which was created +by Matt Corallo and is licensed under the MIT or Apache 2.0 open source +licenses. diff --git a/src/utils/dnssec/dnssec_prover_wasm.d.ts b/src/utils/dnssec/dnssec_prover_wasm.d.ts new file mode 100644 index 00000000..beb07a00 --- /dev/null +++ b/src/utils/dnssec/dnssec_prover_wasm.d.ts @@ -0,0 +1,86 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * Builds a proof builder which can generate a proof for records of the given `ty`pe at the given + * `name`. + * + * After calling this [`get_next_query`] should be called to fetch the initial query. + * @param {string} name + * @param {number} ty + * @returns {WASMProofBuilder | undefined} + */ +export function init_proof_builder(name: string, ty: number): WASMProofBuilder | undefined; +/** + * Processes a response to a query previously fetched from [`get_next_query`]. + * + * After calling this, [`get_next_query`] should be called until pending queries are exhausted and + * no more pending queries exist, at which point [`get_unverified_proof`] should be called. + * @param {WASMProofBuilder} proof_builder + * @param {Uint8Array} response + */ +export function process_query_response(proof_builder: WASMProofBuilder, response: Uint8Array): void; +/** + * Gets the next query (if any) that should be sent to the resolver for the given proof builder. + * + * Once the resolver responds [`process_query_response`] should be called with the response. + * @param {WASMProofBuilder} proof_builder + * @returns {Uint8Array | undefined} + */ +export function get_next_query(proof_builder: WASMProofBuilder): Uint8Array | undefined; +/** + * Gets the final, unverified, proof once all queries fetched via [`get_next_query`] have + * completed and their responses passed to [`process_query_response`]. + * @param {WASMProofBuilder} proof_builder + * @returns {Uint8Array} + */ +export function get_unverified_proof(proof_builder: WASMProofBuilder): Uint8Array; +/** + * Verifies an RFC 9102-formatted proof and returns verified records matching the given name + * (resolving any C/DNAMEs as required). + * @param {Uint8Array} stream + * @param {string} name_to_resolve + * @returns {string} + */ +export function verify_byte_stream(stream: Uint8Array, name_to_resolve: string): string; +export class WASMProofBuilder { + free(): void; +} + +export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module; + +export interface InitOutput { + readonly memory: WebAssembly.Memory; + readonly __wbg_wasmproofbuilder_free: (a: number, b: number) => void; + readonly init_proof_builder: (a: number, b: number, c: number) => number; + readonly process_query_response: (a: number, b: number, c: number) => void; + readonly get_next_query: (a: number) => Array; + readonly get_unverified_proof: (a: number) => Array; + readonly verify_byte_stream: (a: number, b: number, c: number, d: number) => Array; + readonly __wbindgen_export_0: WebAssembly.Table; + readonly __wbindgen_malloc: (a: number, b: number) => number; + readonly __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number; + readonly __wbindgen_free: (a: number, b: number, c: number) => void; + readonly __externref_table_dealloc: (a: number) => void; + readonly __wbindgen_start: () => void; +} + +export type SyncInitInput = BufferSource | WebAssembly.Module; +/** +* Instantiates the given `module`, which can either be bytes or +* a precompiled `WebAssembly.Module`. +* +* @param {{ module: SyncInitInput }} module - Passing `SyncInitInput` directly is deprecated. +* +* @returns {InitOutput} +*/ +export function initSync(module: { module: SyncInitInput } | SyncInitInput): InitOutput; + +/** +* If `module_or_path` is {RequestInfo} or {URL}, makes a request and +* for everything else, calls `WebAssembly.instantiate` directly. +* +* @param {{ module_or_path: InitInput | Promise }} module_or_path - Passing `InitInput` directly is deprecated. +* +* @returns {Promise} +*/ +export default function __wbg_init (module_or_path?: { module_or_path: InitInput | Promise } | InitInput | Promise): Promise; diff --git a/src/utils/dnssec/dnssec_prover_wasm.js b/src/utils/dnssec/dnssec_prover_wasm.js new file mode 100644 index 00000000..0a0e655e --- /dev/null +++ b/src/utils/dnssec/dnssec_prover_wasm.js @@ -0,0 +1,339 @@ +let wasm; + +const cachedTextDecoder = (typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }) : { decode: () => { throw Error('TextDecoder not available') } } ); + +if (typeof TextDecoder !== 'undefined') { cachedTextDecoder.decode(); }; + +let cachedUint8ArrayMemory0 = null; + +function getUint8ArrayMemory0() { + if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) { + cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer); + } + return cachedUint8ArrayMemory0; +} + +function getStringFromWasm0(ptr, len) { + ptr = ptr >>> 0; + return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len)); +} + +let WASM_VECTOR_LEN = 0; + +const cachedTextEncoder = (typeof TextEncoder !== 'undefined' ? new TextEncoder('utf-8') : { encode: () => { throw Error('TextEncoder not available') } } ); + +const encodeString = (typeof cachedTextEncoder.encodeInto === 'function' + ? function (arg, view) { + return cachedTextEncoder.encodeInto(arg, view); +} + : function (arg, view) { + const buf = cachedTextEncoder.encode(arg); + view.set(buf); + return { + read: arg.length, + written: buf.length + }; +}); + +function passStringToWasm0(arg, malloc, realloc) { + + if (realloc === undefined) { + const buf = cachedTextEncoder.encode(arg); + const ptr = malloc(buf.length, 1) >>> 0; + getUint8ArrayMemory0().subarray(ptr, ptr + buf.length).set(buf); + WASM_VECTOR_LEN = buf.length; + return ptr; + } + + let len = arg.length; + let ptr = malloc(len, 1) >>> 0; + + const mem = getUint8ArrayMemory0(); + + let offset = 0; + + for (; offset < len; offset++) { + const code = arg.charCodeAt(offset); + if (code > 0x7F) break; + mem[ptr + offset] = code; + } + + if (offset !== len) { + if (offset !== 0) { + arg = arg.slice(offset); + } + ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0; + const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len); + const ret = encodeString(arg, view); + + offset += ret.written; + ptr = realloc(ptr, len, offset, 1) >>> 0; + } + + WASM_VECTOR_LEN = offset; + return ptr; +} +/** + * Builds a proof builder which can generate a proof for records of the given `ty`pe at the given + * `name`. + * + * After calling this [`get_next_query`] should be called to fetch the initial query. + * @param {string} name + * @param {number} ty + * @returns {WASMProofBuilder | undefined} + */ +export function init_proof_builder(name, ty) { + const ptr0 = passStringToWasm0(name, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.init_proof_builder(ptr0, len0, ty); + return ret === 0 ? undefined : WASMProofBuilder.__wrap(ret); +} + +function _assertClass(instance, klass) { + if (!(instance instanceof klass)) { + throw new Error(`expected instance of ${klass.name}`); + } + return instance.ptr; +} + +function passArray8ToWasm0(arg, malloc) { + const ptr = malloc(arg.length * 1, 1) >>> 0; + getUint8ArrayMemory0().set(arg, ptr / 1); + WASM_VECTOR_LEN = arg.length; + return ptr; +} +/** + * Processes a response to a query previously fetched from [`get_next_query`]. + * + * After calling this, [`get_next_query`] should be called until pending queries are exhausted and + * no more pending queries exist, at which point [`get_unverified_proof`] should be called. + * @param {WASMProofBuilder} proof_builder + * @param {Uint8Array} response + */ +export function process_query_response(proof_builder, response) { + _assertClass(proof_builder, WASMProofBuilder); + const ptr0 = passArray8ToWasm0(response, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + wasm.process_query_response(proof_builder.__wbg_ptr, ptr0, len0); +} + +function getArrayU8FromWasm0(ptr, len) { + ptr = ptr >>> 0; + return getUint8ArrayMemory0().subarray(ptr / 1, ptr / 1 + len); +} +/** + * Gets the next query (if any) that should be sent to the resolver for the given proof builder. + * + * Once the resolver responds [`process_query_response`] should be called with the response. + * @param {WASMProofBuilder} proof_builder + * @returns {Uint8Array | undefined} + */ +export function get_next_query(proof_builder) { + _assertClass(proof_builder, WASMProofBuilder); + const ret = wasm.get_next_query(proof_builder.__wbg_ptr); + let v1; + if (ret[0] !== 0) { + v1 = getArrayU8FromWasm0(ret[0], ret[1]).slice(); + wasm.__wbindgen_free(ret[0], ret[1] * 1, 1); + } + return v1; +} + +function takeFromExternrefTable0(idx) { + const value = wasm.__wbindgen_export_0.get(idx); + wasm.__externref_table_dealloc(idx); + return value; +} +/** + * Gets the final, unverified, proof once all queries fetched via [`get_next_query`] have + * completed and their responses passed to [`process_query_response`]. + * @param {WASMProofBuilder} proof_builder + * @returns {Uint8Array} + */ +export function get_unverified_proof(proof_builder) { + _assertClass(proof_builder, WASMProofBuilder); + var ptr0 = proof_builder.__destroy_into_raw(); + const ret = wasm.get_unverified_proof(ptr0); + if (ret[3]) { + throw takeFromExternrefTable0(ret[2]); + } + var v2 = getArrayU8FromWasm0(ret[0], ret[1]).slice(); + wasm.__wbindgen_free(ret[0], ret[1] * 1, 1); + return v2; +} + +/** + * Verifies an RFC 9102-formatted proof and returns verified records matching the given name + * (resolving any C/DNAMEs as required). + * @param {Uint8Array} stream + * @param {string} name_to_resolve + * @returns {string} + */ +export function verify_byte_stream(stream, name_to_resolve) { + let deferred3_0; + let deferred3_1; + try { + const ptr0 = passArray8ToWasm0(stream, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + const ptr1 = passStringToWasm0(name_to_resolve, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + const ret = wasm.verify_byte_stream(ptr0, len0, ptr1, len1); + deferred3_0 = ret[0]; + deferred3_1 = ret[1]; + return getStringFromWasm0(ret[0], ret[1]); + } finally { + wasm.__wbindgen_free(deferred3_0, deferred3_1, 1); + } +} + +const WASMProofBuilderFinalization = (typeof FinalizationRegistry === 'undefined') + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry(ptr => wasm.__wbg_wasmproofbuilder_free(ptr >>> 0, 1)); + +export class WASMProofBuilder { + + static __wrap(ptr) { + ptr = ptr >>> 0; + const obj = Object.create(WASMProofBuilder.prototype); + obj.__wbg_ptr = ptr; + WASMProofBuilderFinalization.register(obj, obj.__wbg_ptr, obj); + return obj; + } + + __destroy_into_raw() { + const ptr = this.__wbg_ptr; + this.__wbg_ptr = 0; + WASMProofBuilderFinalization.unregister(this); + return ptr; + } + + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_wasmproofbuilder_free(ptr, 0); + } +} + +async function __wbg_load(module, imports) { + if (typeof Response === 'function' && module instanceof Response) { + if (typeof WebAssembly.instantiateStreaming === 'function') { + try { + return await WebAssembly.instantiateStreaming(module, imports); + + } catch (e) { + if (module.headers.get('Content-Type') != 'application/wasm') { + console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e); + + } else { + throw e; + } + } + } + + const bytes = await module.arrayBuffer(); + return await WebAssembly.instantiate(bytes, imports); + + } else { + const instance = await WebAssembly.instantiate(module, imports); + + if (instance instanceof WebAssembly.Instance) { + return { instance, module }; + + } else { + return instance; + } + } +} + +function __wbg_get_imports() { + const imports = {}; + imports.wbg = {}; + imports.wbg.__wbindgen_string_new = function(arg0, arg1) { + const ret = getStringFromWasm0(arg0, arg1); + return ret; + }; + imports.wbg.__wbindgen_throw = function(arg0, arg1) { + throw new Error(getStringFromWasm0(arg0, arg1)); + }; + imports.wbg.__wbindgen_init_externref_table = function() { + const table = wasm.__wbindgen_export_0; + const offset = table.grow(4); + table.set(0, undefined); + table.set(offset + 0, undefined); + table.set(offset + 1, null); + table.set(offset + 2, true); + table.set(offset + 3, false); + ; + }; + + return imports; +} + +function __wbg_init_memory(imports, memory) { + +} + +function __wbg_finalize_init(instance, module) { + wasm = instance.exports; + __wbg_init.__wbindgen_wasm_module = module; + cachedUint8ArrayMemory0 = null; + + + wasm.__wbindgen_start(); + return wasm; +} + +function initSync(module) { + if (wasm !== undefined) return wasm; + + + if (typeof module !== 'undefined') { + if (Object.getPrototypeOf(module) === Object.prototype) { + ({module} = module) + } else { + console.warn('using deprecated parameters for `initSync()`; pass a single object instead') + } + } + + const imports = __wbg_get_imports(); + + __wbg_init_memory(imports); + + if (!(module instanceof WebAssembly.Module)) { + module = new WebAssembly.Module(module); + } + + const instance = new WebAssembly.Instance(module, imports); + + return __wbg_finalize_init(instance, module); +} + +async function __wbg_init(module_or_path) { + if (wasm !== undefined) return wasm; + + + if (typeof module_or_path !== 'undefined') { + if (Object.getPrototypeOf(module_or_path) === Object.prototype) { + ({module_or_path} = module_or_path) + } else { + console.warn('using deprecated parameters for the initialization function; pass a single object instead') + } + } + + if (typeof module_or_path === 'undefined') { + module_or_path = new URL('dnssec_prover_wasm_bg.wasm', import.meta.url); + } + const imports = __wbg_get_imports(); + + if (typeof module_or_path === 'string' || (typeof Request === 'function' && module_or_path instanceof Request) || (typeof URL === 'function' && module_or_path instanceof URL)) { + module_or_path = fetch(module_or_path); + } + + __wbg_init_memory(imports); + + const { instance, module } = await __wbg_load(await module_or_path, imports); + + return __wbg_finalize_init(instance, module); +} + +export { initSync }; +export default __wbg_init; diff --git a/src/utils/dnssec/dnssec_prover_wasm_bg.wasm b/src/utils/dnssec/dnssec_prover_wasm_bg.wasm new file mode 100644 index 0000000000000000000000000000000000000000..790bae3571fa32921b562bc509d63ccca2fa5bfd GIT binary patch literal 203212 zcmdSC37lP3mH&IsoyV$MV=Ac(`<^6FfdG|(B!sDMDG)@PNas(ZpZ+{(yXnS?0|fqx z?^BVo3F*+Sb{xE&juV!16m5fJY(U~16`Ls9#+JtS{jGh@y|=28Tj}>P z@AH2~>g==jK5Os2roGnM`<$EjiyL1UBoc|>RYBi1satNjC2>tM`V-t@04{0ZR0RBI zML>zfH3=GClU3C%w*bjZEvUKL*#p8Ey!e{r%LR%aNr3(3FIO|)#Qq9pa0`Ev&rPLX z`no37pRqAl0{_0>21#q(ZpZ6cTYR`3nxoKB}T@j@XTWD|)b#URbCV99hQ zNCfF1kxCQ;)ds0_B9jVIiFCmKia|0VqVYtK<-b&CGDrqMcqCm?AsZwznN&5ANhC7a zbSX(8LphZQa>Aa>X41*7k~$TZ1ejAvp-+IOm`&!&-95mwy~$)blVL2WWRjYIKNR%8 zAeXZ%4;V0|C)0)G^+CP<;>1M2U=v;00z9ZsOiU(9xi=*%*%w~>!WVCOSu!yw68+89 zFNOElZ+Y>H|N43V`}r^Ut82Gh{nuNry*6=Gw^7Y1u8wLFf8EdhUtW9TjaT3Bzpvf$ zva7dTd*k&le$kEBCSKO@H`m?-Pj0@+*Ch4?y@LGj7ro@#Ezke!=U@9*R~x3p+k=>vEcsTL%|1wyMudz zJAyy`WH1@r@Y23huN&JH+!_2`u=!2FUBLt`>K_k2AABO%LDM$}_Xe*Gz8HKV*dKf@ zcr|yg3!eQza9{A@U|;Zt;9r9;2k#BG1^?Io{Vl5A7#s+`68u~6f#4&-y4ME}2F3UN zy7Z0U-G7$6^5w}}Trxe98gU7i7)nkC^*P zmC<##-^SnEj@!n^)z$SUqpQ^D8MnLCXo{{cF48pI$-rC|=An~;`RO9i(~Uq+Z*uvnlhGCCcUfxSWMHmp5>=Z- z)wHFAwq&F&8Pk@G*Or_hIfLXpBrizbAbAfd3Q{yk(L*}MF)ZLu8UB>vzi8YQO^&WP z8Pln&ySjB(x9 U4GnMDDZ^_zRr2I=vTIfBeF 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 literal 0 HcmV?d00001 diff --git a/src/utils/dnssec/dnssec_prover_wasm_bg.wasm.d.ts b/src/utils/dnssec/dnssec_prover_wasm_bg.wasm.d.ts new file mode 100644 index 00000000..9dd3f0a4 --- /dev/null +++ b/src/utils/dnssec/dnssec_prover_wasm_bg.wasm.d.ts @@ -0,0 +1,15 @@ +/* tslint:disable */ +/* eslint-disable */ +export const memory: WebAssembly.Memory; +export function __wbg_wasmproofbuilder_free(a: number, b: number): void; +export function init_proof_builder(a: number, b: number, c: number): number; +export function process_query_response(a: number, b: number, c: number): void; +export function get_next_query(a: number): Array; +export function get_unverified_proof(a: number): Array; +export function verify_byte_stream(a: number, b: number, c: number, d: number): Array; +export const __wbindgen_export_0: WebAssembly.Table; +export function __wbindgen_malloc(a: number, b: number): number; +export function __wbindgen_realloc(a: number, b: number, c: number, d: number): number; +export function __wbindgen_free(a: number, b: number, c: number): void; +export function __externref_table_dealloc(a: number): void; +export function __wbindgen_start(): void; diff --git a/src/utils/dnssec/dohLookup.ts b/src/utils/dnssec/dohLookup.ts new file mode 100644 index 00000000..826a0231 --- /dev/null +++ b/src/utils/dnssec/dohLookup.ts @@ -0,0 +1,94 @@ +import init, { WASMProofBuilder } from "./dnssec_prover_wasm.js"; +import * as wasm from "./dnssec_prover_wasm.js"; + +/* + * Based on: https://github.com/TheBlueMatt/satsto.me/blob/6fe1d5c027db0cbf928e961277b19addfa955577/static/doh_lookup.js + * Copyright: Matt Corallo 2024 + */ + +type DnsType = "txt" | "tsla" | "a" | "aaaa"; + +type RRS = { + type: DnsType; + name: string; + contents: string; +}; + +type LookupResult = { + expires: number; + valid_from: number; + max_cache_ttl: number; + verified_rrs: RRS[]; +}; + +const sendQuery = async ( + builder: WASMProofBuilder, + domain: string, + dohEndpoint: string, +) => { + const query = wasm.get_next_query(builder); + if (query === null || query === undefined) { + const proof = wasm.get_unverified_proof(builder); + if (proof === null) { + throw "failed to build proof"; + } + + return JSON.parse(wasm.verify_byte_stream(proof, domain)); + } + + const b64url = btoa(String.fromCodePoint(...query)) + .replace(/\+/g, "-") + .replace(/\//g, "_") + .replace(/=/g, ""); + + const resp = await fetch(dohEndpoint + "?dns=" + b64url, { + headers: { accept: "application/dns-message" }, + }); + if (!resp.ok) { + throw "DoH query failed"; + } + + const buf = new Uint8Array(await resp.arrayBuffer()); + wasm.process_query_response(builder, buf); + + return await sendQuery(builder, domain, dohEndpoint); +}; + +export const lookup = async ( + domain: string, + dnsType: DnsType, + dohEndpoint: string, +): Promise => { + await init(); + + if (!domain.endsWith(".")) domain += "."; + + let ty: number; + switch (dnsType) { + case "txt": + ty = 16; + break; + + case "tsla": + ty = 52; + break; + + case "a": + ty = 1; + break; + + case "aaaa": + ty = 28; + break; + + default: + throw "invalid DNS lookup type"; + } + + const builder = wasm.init_proof_builder(domain, ty); + if (builder == null) { + throw "bad domain"; + } + + return await sendQuery(builder, domain, dohEndpoint); +}; diff --git a/src/utils/invoice.ts b/src/utils/invoice.ts index 46a938df..043527ce 100644 --- a/src/utils/invoice.ts +++ b/src/utils/invoice.ts @@ -6,6 +6,7 @@ import log from "loglevel"; import { config } from "../config"; import { fetchBolt12Invoice } from "./boltzClient"; +import { lookup } from "./dnssec/dohLookup"; import { checkResponse } from "./http"; type LnurlResponse = { @@ -104,10 +105,7 @@ export const fetchLnurl = async ( return await fetchLnurlInvoice(amount, res); }; -export const fetchBip353 = async ( - bip353: string, - amountSat: number, -): Promise => { +export const resolveBip353 = async (bip353: string): Promise => { const split = bip353.split("@"); if (split.length !== 2) { throw "invalid BIP-353"; @@ -119,26 +117,45 @@ export const fetchBip353 = async ( log.debug(`Fetching BIP-353: ${bip353}`); - const params = new URLSearchParams({ - type: "TXT", - name: `${split[0]}.user._bitcoin-payment.${split[1]}`, - }); - const res = await fetch(`${config.dnsOverHttps}?${params.toString()}`, { - headers: { - Accept: "application/dns-json", - }, - }); - const resBody = await res.json(); - if (resBody.Answer === undefined || resBody.Answer.length === 0) { + const res = await lookup( + `${split[0]}.user._bitcoin-payment.${split[1]}`, + "txt", + config.dnsOverHttps, + ); + + const nowUnix = Date.now() / 1_000; + if (nowUnix < res.valid_from) { + throw "proof is not valid yet"; + } + if (nowUnix > res.expires) { + throw "proof has expired"; + } + + if (res.verified_rrs === undefined || res.verified_rrs.length === 0) { throw "no TXT record"; } - const paymentRequest = resBody.Answer[0].data; - const offer = new URLSearchParams(paymentRequest.split("?")[1]).get("lno"); - const invoice = ( - await fetchBolt12Invoice(offer.replaceAll('"', ""), amountSat) - ).invoice; - log.debug(`Resolved invoice for BIP-353:`, invoice); + if (res.verified_rrs[0].type !== "txt") { + throw "invalid proof"; + } + + const paymentRequest = res.verified_rrs[0].contents; + const offer = new URLSearchParams(paymentRequest.split("?")[1]) + .get("lno") + .replaceAll('"', ""); + + log.debug("Resolved offer for BIP-353:", offer); + return offer; +}; + +export const fetchBip353 = async ( + bip353: string, + amountSat: number, +): Promise => { + const offer = await resolveBip353(bip353); + const invoice = (await fetchBolt12Invoice(offer, amountSat)).invoice; + log.debug(`Resolved invoice for offer:`, invoice); + return invoice; };