Page MenuHomePhabricator

[ecash-lib] Add `payment` with `asn1` and `x509`
Needs ReviewPublic

Authored by tobias_ruck on Sun, Mar 2, 22:19.

Details

Reviewers
bytesofman
Group Reviewers
Restricted Project
Summary

Allows parsing X509 certificates. This is needed for verifying BIP70 PaymentRequests.

This is based on:

Names for the OID variables have been taken from https://oid-base.com/ (screaming snake case-ified). This is the reason why the OID constant of the secp256k1 curve is called OID_ANSIP256K1, because that's the official name.

Depends on D17733.

Test Plan

npm test

Also, consider creating your own certificate and verify its signature using Ecc:

  1. openssl ecparam -genkey -out key.pem -name secp256k1
  2. openssl req -x509 -new -key key.pem -out cert.pem -sha256 -days 36500 -nodes -subj "/C=CA/ST=British Columbia/L=Vancouver/O=eCash Palace/OU=Software/CN=example.e.cash/emailAddress=example@e.cash"
  3. Replace the contents of the CERT variable with the inner content of cert.pem (without BEGIN CERTIFICATE)
  4. npm test -- -g 'asn1.readCert', and update some of the variables

Event Timeline

Tail of the build log:

To address all issues, run:
  npm audit fix

Run `npm audit` for details.

> ecashaddrjs@2.0.0 build
> tsc

/work/modules/chronik-client /work/abc-ci-builds/ecash-lib-tests

> chronik-client@3.0.0 prepublish
> npm run build


> chronik-client@3.0.0 build
> tsc


added 265 packages, and audited 267 packages in 5s

48 packages are looking for funding
  run `npm fund` for details

6 vulnerabilities (4 moderate, 2 high)

To address issues that do not require attention, run:
  npm audit fix

To address all issues (including breaking changes), run:
  npm audit fix --force

Run `npm audit` for details.

> chronik-client@3.0.0 build
> tsc

/work/modules/ecash-lib /work/abc-ci-builds/ecash-lib-tests

added 365 packages, and audited 369 packages in 2s

60 packages are looking for funding
  run `npm fund` for details

6 vulnerabilities (5 moderate, 1 high)

To address all issues, run:
  npm audit fix

Run `npm audit` for details.
CI configured to test build. Building...

> ecash-lib@3.0.0 build
> tsc && tsc -p ./tsconfig.build.json && cp -r ./src/ffi ./dist

src/initBrowser.ts(16,10): error TS2345: Argument of type 'import("/work/modules/ecash-lib/src/ffi/ecash_lib_wasm_browser").Ecc' is not assignable to parameter of type 'import("/work/modules/ecash-lib/src/ecc").Ecc'.
  Property 'compressPk' is missing in type 'import("/work/modules/ecash-lib/src/ffi/ecash_lib_wasm_browser").Ecc' but required in type 'import("/work/modules/ecash-lib/src/ecc").Ecc'.
src/initNodeJs.ts(9,10): error TS2345: Argument of type 'import("/work/modules/ecash-lib/src/ffi/ecash_lib_wasm_nodejs").Ecc' is not assignable to parameter of type 'import("/work/modules/ecash-lib/src/ecc").Ecc'.
  Property 'compressPk' is missing in type 'import("/work/modules/ecash-lib/src/ffi/ecash_lib_wasm_nodejs").Ecc' but required in type 'import("/work/modules/ecash-lib/src/ecc").Ecc'.
Build ecash-lib-tests failed with exit code 2

Tail of the build log:

5 vulnerabilities (4 moderate, 1 high)

To address all issues, run:
  npm audit fix

Run `npm audit` for details.

> ecashaddrjs@2.0.0 build
> tsc

/work/modules/chronik-client /work/abc-ci-builds/ecash-agora-tests

> chronik-client@3.0.0 prepublish
> npm run build


> chronik-client@3.0.0 build
> tsc


added 265 packages, and audited 267 packages in 5s

48 packages are looking for funding
  run `npm fund` for details

6 vulnerabilities (4 moderate, 2 high)

To address issues that do not require attention, run:
  npm audit fix

To address all issues (including breaking changes), run:
  npm audit fix --force

Run `npm audit` for details.

> chronik-client@3.0.0 build
> tsc

/work/modules/ecash-lib /work/abc-ci-builds/ecash-agora-tests

added 365 packages, and audited 369 packages in 2s

60 packages are looking for funding
  run `npm fund` for details

6 vulnerabilities (5 moderate, 1 high)

To address all issues, run:
  npm audit fix

Run `npm audit` for details.

> ecash-lib@3.0.0 build
> tsc && tsc -p ./tsconfig.build.json && cp -r ./src/ffi ./dist

src/initBrowser.ts(16,10): error TS2345: Argument of type 'import("/work/modules/ecash-lib/src/ffi/ecash_lib_wasm_browser").Ecc' is not assignable to parameter of type 'import("/work/modules/ecash-lib/src/ecc").Ecc'.
  Property 'compressPk' is missing in type 'import("/work/modules/ecash-lib/src/ffi/ecash_lib_wasm_browser").Ecc' but required in type 'import("/work/modules/ecash-lib/src/ecc").Ecc'.
src/initNodeJs.ts(9,10): error TS2345: Argument of type 'import("/work/modules/ecash-lib/src/ffi/ecash_lib_wasm_nodejs").Ecc' is not assignable to parameter of type 'import("/work/modules/ecash-lib/src/ecc").Ecc'.
  Property 'compressPk' is missing in type 'import("/work/modules/ecash-lib/src/ffi/ecash_lib_wasm_nodejs").Ecc' but required in type 'import("/work/modules/ecash-lib/src/ecc").Ecc'.
Build ecash-agora-tests failed with exit code 2

Tail of the build log:

5 vulnerabilities (4 moderate, 1 high)

To address all issues, run:
  npm audit fix

Run `npm audit` for details.

> ecashaddrjs@2.0.0 build
> tsc

/work/modules/chronik-client /work/abc-ci-builds/cashtab-tests

> chronik-client@3.0.0 prepublish
> npm run build


> chronik-client@3.0.0 build
> tsc


added 265 packages, and audited 267 packages in 5s

48 packages are looking for funding
  run `npm fund` for details

6 vulnerabilities (4 moderate, 2 high)

To address issues that do not require attention, run:
  npm audit fix

To address all issues (including breaking changes), run:
  npm audit fix --force

Run `npm audit` for details.

> chronik-client@3.0.0 build
> tsc

/work/modules/ecash-lib /work/abc-ci-builds/cashtab-tests

added 365 packages, and audited 369 packages in 2s

60 packages are looking for funding
  run `npm fund` for details

6 vulnerabilities (5 moderate, 1 high)

To address all issues, run:
  npm audit fix

Run `npm audit` for details.

> ecash-lib@3.0.0 build
> tsc && tsc -p ./tsconfig.build.json && cp -r ./src/ffi ./dist

src/initBrowser.ts(16,10): error TS2345: Argument of type 'import("/work/modules/ecash-lib/src/ffi/ecash_lib_wasm_browser").Ecc' is not assignable to parameter of type 'import("/work/modules/ecash-lib/src/ecc").Ecc'.
  Property 'compressPk' is missing in type 'import("/work/modules/ecash-lib/src/ffi/ecash_lib_wasm_browser").Ecc' but required in type 'import("/work/modules/ecash-lib/src/ecc").Ecc'.
src/initNodeJs.ts(9,10): error TS2345: Argument of type 'import("/work/modules/ecash-lib/src/ffi/ecash_lib_wasm_nodejs").Ecc' is not assignable to parameter of type 'import("/work/modules/ecash-lib/src/ecc").Ecc'.
  Property 'compressPk' is missing in type 'import("/work/modules/ecash-lib/src/ffi/ecash_lib_wasm_nodejs").Ecc' but required in type 'import("/work/modules/ecash-lib/src/ecc").Ecc'.
Build cashtab-tests failed with exit code 2

Tail of the build log:

5 vulnerabilities (4 moderate, 1 high)

To address all issues, run:
  npm audit fix

Run `npm audit` for details.

> ecashaddrjs@2.0.0 build
> tsc

/work/modules/chronik-client /work/abc-ci-builds/ecash-agora-integration-tests

> chronik-client@3.0.0 prepublish
> npm run build


> chronik-client@3.0.0 build
> tsc


added 265 packages, and audited 267 packages in 5s

48 packages are looking for funding
  run `npm fund` for details

6 vulnerabilities (4 moderate, 2 high)

To address issues that do not require attention, run:
  npm audit fix

To address all issues (including breaking changes), run:
  npm audit fix --force

Run `npm audit` for details.

> chronik-client@3.0.0 build
> tsc

/work/modules/ecash-lib /work/abc-ci-builds/ecash-agora-integration-tests

added 365 packages, and audited 369 packages in 2s

60 packages are looking for funding
  run `npm fund` for details

6 vulnerabilities (5 moderate, 1 high)

To address all issues, run:
  npm audit fix

Run `npm audit` for details.

> ecash-lib@3.0.0 build
> tsc && tsc -p ./tsconfig.build.json && cp -r ./src/ffi ./dist

src/initBrowser.ts(16,10): error TS2345: Argument of type 'import("/work/modules/ecash-lib/src/ffi/ecash_lib_wasm_browser").Ecc' is not assignable to parameter of type 'import("/work/modules/ecash-lib/src/ecc").Ecc'.
  Property 'compressPk' is missing in type 'import("/work/modules/ecash-lib/src/ffi/ecash_lib_wasm_browser").Ecc' but required in type 'import("/work/modules/ecash-lib/src/ecc").Ecc'.
src/initNodeJs.ts(9,10): error TS2345: Argument of type 'import("/work/modules/ecash-lib/src/ffi/ecash_lib_wasm_nodejs").Ecc' is not assignable to parameter of type 'import("/work/modules/ecash-lib/src/ecc").Ecc'.
  Property 'compressPk' is missing in type 'import("/work/modules/ecash-lib/src/ffi/ecash_lib_wasm_nodejs").Ecc' but required in type 'import("/work/modules/ecash-lib/src/ecc").Ecc'.
Build ecash-agora-integration-tests failed with exit code 2

Tail of the build log:

[552/589] Building CXX object src/qt/CMakeFiles/bitcoin-qt-base.dir/addressbookpage.cpp.o
[553/589] Building CXX object src/qt/CMakeFiles/bitcoin-qt-base.dir/createwalletdialog.cpp.o
[554/589] Building CXX object src/qt/CMakeFiles/bitcoin-qt-base.dir/coincontroltreewidget.cpp.o
[555/589] Building CXX object src/qt/CMakeFiles/bitcoin-qt-base.dir/editaddressdialog.cpp.o
[556/589] Building CXX object src/qt/CMakeFiles/bitcoin-qt-base.dir/trafficgraphwidget.cpp.o
[557/589] Building CXX object src/qt/CMakeFiles/bitcoin-qt-base.dir/splashscreen.cpp.o
[558/589] Building CXX object src/qt/CMakeFiles/bitcoin-qt-base.dir/qrc_bitcoin_locale.cpp.o
[559/589] Building CXX object src/qt/CMakeFiles/bitcoin-qt-base.dir/askpassphrasedialog.cpp.o
[560/589] Building CXX object src/qt/CMakeFiles/bitcoin-qt-base.dir/qrimagewidget.cpp.o
[561/589] Building CXX object src/qt/CMakeFiles/bitcoin-qt-base.dir/openuridialog.cpp.o
[562/589] Building CXX object src/qt/CMakeFiles/bitcoin-qt-base.dir/transactionfilterproxy.cpp.o
[563/589] Building CXX object src/qt/CMakeFiles/bitcoin-qt-base.dir/addresstablemodel.cpp.o
[564/589] Building CXX object src/qt/CMakeFiles/bitcoin-qt-base.dir/receiverequestdialog.cpp.o
[565/589] Building CXX object src/qt/CMakeFiles/bitcoin-qt-base.dir/overviewpage.cpp.o
[566/589] Building CXX object src/qt/CMakeFiles/bitcoin-qt-base.dir/transactiondescdialog.cpp.o
[567/589] Building CXX object src/qt/CMakeFiles/bitcoin-qt-base.dir/recentrequeststablemodel.cpp.o
[568/589] Building CXX object src/qt/CMakeFiles/bitcoin-qt-base.dir/sendcoinsentry.cpp.o
[569/589] Building CXX object src/qt/CMakeFiles/bitcoin-qt-base.dir/receivecoinsdialog.cpp.o
[570/589] Building CXX object src/qt/CMakeFiles/bitcoin-qt-base.dir/transactionrecord.cpp.o
[571/589] Building CXX object src/qt/CMakeFiles/bitcoin-qt-base.dir/coincontroldialog.cpp.o
[572/589] Building CXX object src/qt/CMakeFiles/bitcoin-qt-base.dir/rpcconsole.cpp.o
[573/589] Building CXX object src/qt/CMakeFiles/bitcoin-qt-base.dir/walletframe.cpp.o
[574/589] Building CXX object src/qt/CMakeFiles/bitcoin-qt-base.dir/walletmodeltransaction.cpp.o
[575/589] Building CXX object src/qt/CMakeFiles/bitcoin-qt-base.dir/transactiontablemodel.cpp.o
[576/589] Building CXX object src/qt/CMakeFiles/bitcoin-qt-base.dir/transactionview.cpp.o
[577/589] Building CXX object src/qt/CMakeFiles/bitcoin-qt-base.dir/signverifymessagedialog.cpp.o
[578/589] Building CXX object src/qt/CMakeFiles/bitcoin-qt-base.dir/transactiondesc.cpp.o
[579/589] Building CXX object src/qt/CMakeFiles/bitcoin-qt-base.dir/paymentserver.cpp.o
[580/589] Building CXX object src/qt/CMakeFiles/bitcoin-qt-base.dir/paymentrequestplus.cpp.o
[581/589] Building CXX object src/qt/CMakeFiles/bitcoin-qt-base.dir/sendcoinsdialog.cpp.o
[582/589] Building CXX object src/qt/CMakeFiles/bitcoin-qt-base.dir/walletcontroller.cpp.o
[583/589] Building CXX object src/qt/CMakeFiles/bitcoin-qt-base.dir/walletmodel.cpp.o
[584/589] Building CXX object src/qt/CMakeFiles/bitcoin-qt-base.dir/walletview.cpp.o
[585/589] Linking CXX static library src/qt/libbitcoin-qt-base.a
[586/589] Automatic MOC for target bitcoin-qt
[587/589] Building CXX object src/qt/CMakeFiles/bitcoin-qt.dir/bitcoin-qt_autogen/mocs_compilation.cpp.o
[588/589] Building CXX object src/qt/CMakeFiles/bitcoin-qt.dir/main.cpp.o
[589/589] Linking CXX executable src/qt/bitcoin-qt
/work/modules/ecash-lib /work/abc-ci-builds/ecash-lib-integration-tests

added 365 packages, and audited 369 packages in 2s

60 packages are looking for funding
  run `npm fund` for details

6 vulnerabilities (5 moderate, 1 high)

To address all issues, run:
  npm audit fix

Run `npm audit` for details.

> ecash-lib@3.0.0 build
> tsc && tsc -p ./tsconfig.build.json && cp -r ./src/ffi ./dist

src/initBrowser.ts(16,10): error TS2345: Argument of type 'import("/work/modules/ecash-lib/src/ffi/ecash_lib_wasm_browser").Ecc' is not assignable to parameter of type 'import("/work/modules/ecash-lib/src/ecc").Ecc'.
  Property 'compressPk' is missing in type 'import("/work/modules/ecash-lib/src/ffi/ecash_lib_wasm_browser").Ecc' but required in type 'import("/work/modules/ecash-lib/src/ecc").Ecc'.
src/initNodeJs.ts(9,10): error TS2345: Argument of type 'import("/work/modules/ecash-lib/src/ffi/ecash_lib_wasm_nodejs").Ecc' is not assignable to parameter of type 'import("/work/modules/ecash-lib/src/ecc").Ecc'.
  Property 'compressPk' is missing in type 'import("/work/modules/ecash-lib/src/ffi/ecash_lib_wasm_nodejs").Ecc' but required in type 'import("/work/modules/ecash-lib/src/ecc").Ecc'.
Build ecash-lib-integration-tests failed with exit code 2

change readCert to parseCert

change readString to return Uint8Array

Failed tests logs:

====== CashTab Unit Tests: <Token /> available actions rendered We can list an SLP1 fungible token ======
TestingLibraryElementError: Unable to find an accessible element with the role "button" and name `/List Vespene Gas/`

Here are the accessible roles:

  region:

  Name "Notifications Alt+T":
  <section
    aria-atomic="false"
    aria-label="Notifications Alt+T"
    aria-live="polite"
    aria-relevant="additions text"
    class="Toastify"
  />

  --------------------------------------------------
  combobox:

  Name "":
  <select
    class="sc-crNyjn bXFivV"
    data-testid="wallet-select"
    id="wallets"
    name="wallets"
  />

  --------------------------------------------------
  option:

  Name "Token Test":
  <option
    class="sc-cpHetk jodErs"
    value="Token Test"
  />

  --------------------------------------------------
  button:

  Name "Copy ecash:qqq9f9z3uhpzkxrgdjkd7dxuuey7tmpmugpmnw0kue":
  <button
    aria-label="Copy ecash:qqq9f9z3uhpzkxrgdjkd7dxuuey7tmpmugpmnw0kue"
    class="sc-cJSrbW kZNvLw"
  />

  Name "icon for 20a0b9337a78603c6681ed2bc541593375535dcd9979196620ce71f233f2f6f8":
  <button
    class="sc-hzNEM eBXvVM"
  />

  Name "Click for more info about this token type":
  <button
    aria-label="Click for more info about this token type"
    class="sc-cJSrbW kZNvLw"
  />

  Name "Copy Token ID":
  <button
    aria-label="Copy Token ID"
    class="sc-cJSrbW kZNvLw"
  />

  Name "Click for more info about agora partial sales":
  <button
    aria-label="Click for more info about agora partial sales"
    class="sc-cJSrbW kZNvLw"
  />

  Name "Transactions":
  <button
    class="sc-hycgNl fdpVNO"
  />

  Name "Send Screen":
  <button
    aria-label="Send Screen"
    class="sc-hycgNl fdpVNO"
  />

  Name "Tokens":
  <button
    aria-label="Tokens"
    class="sc-hycgNl fdpVNO"
  />

  Name "Receive":
  <button
    aria-label="Receive"
    class="sc-hycgNl fdpVNO"
  />

  Name "Wallet Backup":
  <button
    class="sc-chAAoq hxqjDv"
  />

  Name "Wallets":
  <button
    class="sc-chAAoq hxqjDv"
  />

  Name "Listed NFTs":
  <button
    class="sc-chAAoq hxqjDv"
  />

  Name "Agora":
  <button
    class="sc-chAAoq hxqjDv"
  />

  Name "Contacts":
  <button
    class="sc-chAAoq hxqjDv"
  />

  Name "Airdrop":
  <button
    class="sc-chAAoq hxqjDv"
  />

  Name "Rewards":
  <button
    class="sc-chAAoq hxqjDv"
  />

  Name "Sign & Verify":
  <button
    class="sc-chAAoq hxqjDv"
  />

  Name "Settings":
  <button
    class="sc-chAAoq hxqjDv"
  />

  --------------------------------------------------
  link:

  Name "XECX":
  <a
    href="/#/token/c67bf5c2b6d91cfb46a5c1772582eff80d88686887be10aa63b0945479cf4ed4"
  />

  Name "FIRMA":
  <a
    href="/#/token/0387947fd575db4fb19a3e322f635dec37fd192b5941625b66bc4b2c3008cbf0"
  />

  Name "20a...6f8":
  <a
    href="https://explorer.e.cash/tx/20a0b9337a78603c6681ed2bc541593375535dcd9979196620ce71f233f2f6f8"
    rel="noopener noreferrer"
    target="_blank"
  />

  Name "simple.wikipedia.org/wiki/StarCraft#Gameplay":
  <a
    href="https://simple.wikipedia.org/wiki/StarCraft#Gameplay"
    rel="noreferrer"
    target="_blank"
  />

  --------------------------------------------------
  paragraph:

  Name "Price in Local Currency":
  <p
    class="sc-AnqlK fLVAuQ"
    title="Price in Local Currency"
  />

  Name "":
  <p />

  Name "":
  <p />

  Name "":
  <p />

  Name "":
  <p />

  Name "":
  <p />

  Name "":
  <p />

  Name "":
  <p />

  Name "":
  <p />

  Name "":
  <p />

  --------------------------------------------------
  img:

  Name "icon for 20a0b9337a78603c6681ed2bc541593375535dcd9979196620ce71f233f2f6f8":
  <img
    alt="icon for 20a0b9337a78603c6681ed2bc541593375535dcd9979196620ce71f233f2f6f8"
    height="128"
    src="https://icons.etokens.cash/128/20a0b9337a78603c6681ed2bc541593375535dcd9979196620ce71f233f2f6f8.png"
    width="128"
  />

  Name "cashtab":
  <img
    alt="cashtab"
    class="sc-cCbXAZ jOUSPN"
    src="test-file-stub"
  />

  --------------------------------------------------
  heading:

  Name "Vespene Gas":
  <h2 />

  --------------------------------------------------

Ignored nodes: comments, script, style
<body>
  <div>
    <div
      class="sc-keFjpB fuvsSf"
    >
      <section
        aria-atomic="false"
        aria-label="Notifications Alt+T"
        aria-live="polite"
        aria-relevant="additions text"
        class="Toastify"
      />
      <div
        class="sc-jWojfa gOMhPW"
      >
        <div
          class="sc-kVrTmx dSIcDd"
        >
          <div
            class="sc-ivVeuv hQBWoJ"
          >
            <img
              alt="cashtab"
              class="sc-cCbXAZ jOUSPN"
              src="test-file-stub"
            />
          </div>
          <div
            class="sc-cmIlrE ckvYmi"
          >
            <div
              class="sc-jkCMRl gxKbjs"
            >
              <select
                class="sc-crNyjn bXFivV"
                data-testid="wallet-select"
                id="wallets"
                name="wallets"
              >
                <option
                  class="sc-cpHetk jodErs"
                  value="Token Test"
                >
                  Token Test
                </option>
              </select>
              <div
                class="sc-bqjOQT kauMuv"
              >
                <button
                  aria-label="Copy ecash:qqq9f9z3uhpzkxrgdjkd7dxuuey7tmpmugpmnw0kue"
                  class="sc-cJSrbW kZNvLw"
                >
                  <svg
                    title="copy-paste"
                  />
                </button>
                <div
                  class="sc-eerKOB cvXwwv"
                >
                  <div
                    class="sc-emmjRN bSWkUh"
                  >
                    <input
                      checked=""
                      class="sc-gFaPwZ iPJMNd"
                      id="show-hide-balance"
                      name="show-hide-balance"
                      title="show-hide-balance"
                      type="checkbox"
                    />
                    <label
                      class="sc-cpmLhU iUeRKn"
                      for="show-hide-balance"
                    >
                      <span
                        class="sc-dymIpo hGwQkt"
                        data-off=""
                        data-on=""
                      />
                      <span
                        class="sc-bnXvFD cpOMDW"
                      />
                    </label>
                  </div>
                </div>
              </div>
            </div>
            <div
              class="sc-gleUXh fSfkBQ"
              title="Wallet Info"
            >
              <div
                class="sc-nrwXf erXBln"
              >
                <div
                  class="sc-eitiEO isWDMZ"
                  title="Balance XEC"
                >
                  9,970.81
                   
                  XEC
                </div>
                <div
                  class="sc-eitiEO gaHDhC"
                  title="Balance XECX"
                >
                  10,000.00
                   
                  <a
                    href="/#/token/c67bf5c2b6d91cfb46a5c1772582eff80d88686887be10aa63b0945479cf4ed4"
                  >
                    XECX
                  </a>
                </div>
                <div
                  class="sc-eitiEO gaHDhC"
                  title="Balance FIRMA"
                >
                  100.0000
                   
                  <a
                    href="/#/token/0387947fd575db4fb19a3e322f635dec37fd192b5941625b66bc4b2c3008cbf0"
                  >
                    FIRMA
                  </a>
                </div>
              </div>
              <div
                class="sc-bhlBdH kdHsOB"
                title="Balance in Local Currency"
              >
                $
                100.60
                 
                USD
              </div>
              <p
                class="sc-AnqlK fLVAuQ"
                title="Price in Local Currency"
              >
                1 
                XEC
                 = 
                0.00003000
                 
                USD
              </p>
            </div>
          </div>
          <div
            class="sc-dTLGrV eQoClh"
          >
            <div
              class="sc-jKVCRD kVWwbS"
            >
              <div
                class="sc-fcdeBU chTKnN"
                title="Token Stats"
              >
                <div
                  class="sc-RcBXQ kItXmO"
                >
                  <button
                    class="sc-hzNEM eBXvVM"
                  >
                    <img
                      alt="icon for 20a0b9337a78603c6681ed2bc541593375535dcd9979196620ce71f233f2f6f8"
                      height="128"
   ...
    at Object.getElementError (/work/cashtab/node_modules/@testing-library/dom/dist/config.js:37:19)
    at /work/cashtab/node_modules/@testing-library/dom/dist/query-helpers.js:76:38
    at /work/cashtab/node_modules/@testing-library/dom/dist/query-helpers.js:52:17
    at /work/cashtab/node_modules/@testing-library/dom/dist/query-helpers.js:95:19
    at Object.getByRole (/work/cashtab/src/components/Etokens/__tests__/TokenActions.test.js:272:35)

Each failure log is accessible here:
CashTab Unit Tests: <Token /> available actions rendered We can list an SLP1 fungible token

Is there any reason for not using an existing off-the-shelf lib for this task ?

modules/ecash-lib/src/payment/asn1.test.ts
34

Thanks. This has been missing from the qt bip70 test and after it expired we lost tons of time figuring out how to regen the cert.