从流 Openpgp.js 加载消息时格式错误的装甲文本
Misformed armored text when loading Message from Stream Openpgp.js
我有一个作业在后台处理解密作业的执行。
这是解密代码:
export default async function (
job: Job<DecryptionJobPayload>,
cb: DoneCallback,
) {
console.log(
`[${process.pid}] Attempting Decryption delegated to job with UUID: ${job.id}`,
);
const {privateKey, sourcePath, outputPath} = job.data;
const pKey = await opengpg.readPrivateKey({armoredKey: privateKey});
const sourceStream = createReadStream(sourcePath);
opengpg
.readMessage({
armoredMessage: sourceStream,
})
.then((M) => {
opengpg
.decrypt({
message: M,
decryptionKeys: pKey,
})
.then((e) => {
e.data
.pipe(createWriteStream(outputPath))
.on('end', cb(null, 'SUCCESS'))
.on('error', cb(new Error('Error Occured'), 'FAILED'));
})
.catch((err) => cb(err, 'FAILED'));
})
.catch((err) => {
cb(err, 'FAILED READING THE MESSAGE FROM STREAM');
});
异常发生在这个catch块:
.catch((err) => {
cb(err, 'FAILED READING THE MESSAGE FROM STREAM');
});
有以下例外情况:
Misformed armored text
at /usr/src/app/node_modules/openpgp/src/encoding/armor.js:250:25
at processTicksAndRejections (internal/process/task_queues.js:93:5)
在检查 openpgp.js 代码以查看导致 unarmor
函数中此类异常提升的原因之后。我找到了这 3 个案例:
- 它读取了一个未定义的行:
if (line === undefined) {
throw new Error('Misformed armored text');
}
- 如果编写器在实际关闭之前完成:
const { done, value } = await reader.read();
if (done) {
throw new Error('Misformed armored text');}
- 我不太确定...但如果有人可以提供帮助,请提供代码!
const { done, value } = await reader.read();
const reSplit = /^-----[^-]+-----$/m;
const line = value + '';
if (line.indexOf('=') === -1 && line.indexOf('-') === -1) {
await writer.write(line);
} else {
let remainder = await reader.readToEnd();
if (!remainder.length) remainder = '';
remainder = line + remainder;
remainder = util.removeTrailingSpaces(remainder.replace(/\r/g, ''));
const parts = remainder.split(reSplit);
if (parts.length === 1) {
throw new Error('Misformed armored text');
}
起初我以为问题可能出在文件格式上,但该文件是在之前的工作中由同一个包生成的...
更新 1
我在我的文件中测试了第三个可能的原因以弄清楚它的作用。
当我们到达消息中有“=”或“-”的部分时,最后一段代码开始执行,例如在我使用的这个测试文件中:
-----BEGIN PGP MESSAGE-----
wV4D657zkXTrd+wSAQdA2p3p2iMnFX7oHSPSFSJP20J4ibR3ilwz1T6XO7jo
.....
.....
zef62S0eNiLhU1KTThfYNKLuiG8y4N90MSlH92ruYC8RFiMvuaDud52sl4jX
D/IuUi0yPSdwbuc=
=j9F8
-----END PGP MESSAGE-----
当 Reader 到达最后 3 行时,它读取直到末尾清除空格并由正则表达式拆分以找到部分 =["D/IuUi0yPSdwbuc==j9F8",""]。并且检查通过 (parts.length!==1)。
所以我认为可以肯定地说这不是问题的原因!
我找到了解决方案。感谢 openpgp.js 团队的 Daniel Huigens!
文档中未指定,但解决此问题的方法是读取 utf8 编码的数据,而不是二进制数据。所以解决方案是:
const sourceStream = createReadStream(sourcePath,'utf8')
我有一个作业在后台处理解密作业的执行。 这是解密代码:
export default async function (
job: Job<DecryptionJobPayload>,
cb: DoneCallback,
) {
console.log(
`[${process.pid}] Attempting Decryption delegated to job with UUID: ${job.id}`,
);
const {privateKey, sourcePath, outputPath} = job.data;
const pKey = await opengpg.readPrivateKey({armoredKey: privateKey});
const sourceStream = createReadStream(sourcePath);
opengpg
.readMessage({
armoredMessage: sourceStream,
})
.then((M) => {
opengpg
.decrypt({
message: M,
decryptionKeys: pKey,
})
.then((e) => {
e.data
.pipe(createWriteStream(outputPath))
.on('end', cb(null, 'SUCCESS'))
.on('error', cb(new Error('Error Occured'), 'FAILED'));
})
.catch((err) => cb(err, 'FAILED'));
})
.catch((err) => {
cb(err, 'FAILED READING THE MESSAGE FROM STREAM');
});
异常发生在这个catch块:
.catch((err) => {
cb(err, 'FAILED READING THE MESSAGE FROM STREAM');
});
有以下例外情况:
Misformed armored text
at /usr/src/app/node_modules/openpgp/src/encoding/armor.js:250:25
at processTicksAndRejections (internal/process/task_queues.js:93:5)
在检查 openpgp.js 代码以查看导致 unarmor
函数中此类异常提升的原因之后。我找到了这 3 个案例:
- 它读取了一个未定义的行:
if (line === undefined) {
throw new Error('Misformed armored text');
}
- 如果编写器在实际关闭之前完成:
const { done, value } = await reader.read();
if (done) {
throw new Error('Misformed armored text');}
- 我不太确定...但如果有人可以提供帮助,请提供代码!
const { done, value } = await reader.read();
const reSplit = /^-----[^-]+-----$/m;
const line = value + '';
if (line.indexOf('=') === -1 && line.indexOf('-') === -1) {
await writer.write(line);
} else {
let remainder = await reader.readToEnd();
if (!remainder.length) remainder = '';
remainder = line + remainder;
remainder = util.removeTrailingSpaces(remainder.replace(/\r/g, ''));
const parts = remainder.split(reSplit);
if (parts.length === 1) {
throw new Error('Misformed armored text');
}
起初我以为问题可能出在文件格式上,但该文件是在之前的工作中由同一个包生成的...
更新 1 我在我的文件中测试了第三个可能的原因以弄清楚它的作用。 当我们到达消息中有“=”或“-”的部分时,最后一段代码开始执行,例如在我使用的这个测试文件中:
-----BEGIN PGP MESSAGE-----
wV4D657zkXTrd+wSAQdA2p3p2iMnFX7oHSPSFSJP20J4ibR3ilwz1T6XO7jo
.....
.....
zef62S0eNiLhU1KTThfYNKLuiG8y4N90MSlH92ruYC8RFiMvuaDud52sl4jX
D/IuUi0yPSdwbuc=
=j9F8
-----END PGP MESSAGE-----
当 Reader 到达最后 3 行时,它读取直到末尾清除空格并由正则表达式拆分以找到部分 =["D/IuUi0yPSdwbuc==j9F8",""]。并且检查通过 (parts.length!==1)。 所以我认为可以肯定地说这不是问题的原因!
我找到了解决方案。感谢 openpgp.js 团队的 Daniel Huigens! 文档中未指定,但解决此问题的方法是读取 utf8 编码的数据,而不是二进制数据。所以解决方案是:
const sourceStream = createReadStream(sourcePath,'utf8')