簡體   English   中英

錯誤:concatUint8Array:數據必須是 Uint8Array 的形式

[英]Error: concatUint8Array: Data must be in the form of a Uint8Array

我正在使用 Jest 測試我的一個小型 function,它使用 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

我的 function:

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)

有什么線索嗎?

我遇到了同樣的問題,然后我不得不使用特定的 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)

請讓我知道這對你有沒有用

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM