首页 > 解决方案 > 错误:concatUint8Array:数据必须是 Uint8Array 的形式

问题描述

我正在使用 Jest 来测试我的一个使用 OpenPGP.js https://openpgpjs.org/(最新版本,4.10.9)的小功能。

我看到了一些使用该库的解决方法text-encoding-utf-8,我在测试中这样做了,但不幸的是,错误仍然存​​在。

即使:

const textEncoding = await import("text-encoding-utf-8")
global.TextEncoder = textEncoding.TextEncoder
global.TextDecoder = textEncoding.TextDecoder

我的功能:

import * as openpgp from "openpgp"

export async function decryptMessage(privateKeyArmored, passphrase, message) {
  const {
    keys: [privateKey],
  } = await openpgp.key.readArmored(privateKeyArmored)

  await privateKey.decrypt(passphrase)

  const { data } = await openpgp.decrypt({
    message: await openpgp.message.readArmored(message),
    privateKeys: [privateKey],
  })

  return data
}

这是我的测试

import * as openpgp from "openpgp"

import { decryptMessage } from "../src/crypto"

let privateKey
let publicKey

const passphrase = "password"

const oldTextEncoder = global.TextEncoder
const oldTextDecoder = global.TextDecoder

describe("crypto test suite", () => {
  beforeAll(async () => {
    // workaround to openpgp works with jest
    const textEncoding = await import("text-encoding-utf-8")
    global.TextEncoder = textEncoding.TextEncoder
    global.TextDecoder = textEncoding.TextDecoder

    const { privateKeyArmored, publicKeyArmored } = await openpgp.generateKey({
      userIds: [{ name: "username" }],
      curve: "ed25519",
      passphrase,
    })

    privateKey = privateKeyArmored
    publicKey = publicKeyArmored
  })

  afterAll(() => {
    global.TextEncoder = oldTextEncoder
    global.TextDecoder = oldTextDecoder
  })

  test("decrypt message", async () => {
    const text = "test"

    const { data } = await openpgp.encrypt({
      message: openpgp.message.fromText(text),
      publicKeys: (await openpgp.key.readArmored(publicKey)).keys,
    })

    const result = decryptMessage(privateKey, passphrase, data)

    expect(result).toBe(text)
  })
})

当我跑步时,我得到:

(node:10804) UnhandledPromiseRejectionWarning: Error: concatUint8Array: Data must be in the form of a Uint8Array
(node:10804) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 25)

有什么线索吗?

标签: javascriptnode.jsjestjsopenpgp.js

解决方案


我遇到了同样的问题,然后我不得不使用特定的 openpgp 版本。这最终为我工作:

"openpgp": "4.10.10",
"text-encoding-utf-8": "^1.0.2",

因此,我必须使用这个 openpgp 版本固有的正确功能,如下所示:

test('Encrypts a file using the GPG file', async () => {
    const textEncoding = await import("text-encoding-utf-8")
    global.TextEncoder = textEncoding.TextEncoder
    global.TextDecoder = textEncoding.TextDecoder


    const publicKey = fs.readFileSync('/path/file.asc')

    const input = fs.createReadStream('a.txt')

    const encrypted = await openpgp.encrypt({
        message: await openpgp.message.fromBinary(input),
        publicKeys: (await openpgp.key.readArmored(publicKey)).keys,
    })
    console.log(encrypted)

请让我知道这对你有没有用


推荐阅读