Openpgpjs: readArmored regression: does not care about checksum

Created on 4 Jul 2019  路  7Comments  路  Source: openpgpjs/openpgpjs

OpenPGP.js no longer throws / rejects on failed armor checksum.

-----BEGIN PGP MESSAGE-----

wcFMA0taL/zmLZUBAQ//emRzho+LD8fveAcSw0ihNVLR5rCi7/2kNKw6IikG
9RtnEnmLwl0uzrp2HVFiUMG0Wvh/RCwsAEaquIL9OHuFZ3tLYkQwfKB2atNT
rP/waMsyaNkwdzowcIgrAlkyurPhTXn+e7kOnHNirb7t31LMaWB4wAF521mM
2XqMvAUjvMVp3XtWimcR+z36JSDqN+8DP9z9R3pxPH/NL8yNHUoVeQ39Hgx1
VCu6pZ/uCglZLGhJu6Ue7kj1siu0MwKAPYAA7SMZoqH2CS4m8q0Ja21NY9Vj
MnXoYOJ4CPLkDi8FccOm7jxPmxHVWyfVGI2FwZJZX0AsidAmefAVFGFEaFqM
dCbp3T6Iz2rv5orVO5U6gH6bNZKBrZkaenw0Mi0F3PFYk+BQeNho1Wguh8pH
Kg/i6sO9IrrP2f3ypdDkq0bNFc5lspuSg6b8il8wKZFHzaz0PQUWwePvSks9
X1MzC39t2AEjihnzL4YexoBbwu1UlfohPLJvJVDBEj7XzpF7oylzFa38d0Ik
bEiFJQN/rBODiNzLCf1FZpw1/dst5lawko2jTZO1FAd9940jcV0oy/B5J8BZ
cSfhsecESm6ubShJ395svRVrUn1uulTPOUEePlu/TPb/ixoNyOfBlOY1v2RE
pXJylhf/GxvrQpuRjOq3o5zzcSOxxocSNGDEShKHYyrBwUwDvb12YPaZjcQB
D/0WVNHb3R1wJ/FO0frZYwcSdAOS3hhTxPuecnjZBa2b3nMNS/kuJ26QBEvX
QNNwSKgjoQ/wbKJ8xbw29hKMG4NhJONL5T9K5gFt4zFouJZ8LdlYqW6iWFeW
vJxnMIZi5Puw6+pggjoZarWqbyTzh3yaBCxezmyr/kQHmCnFH+ryGqRE/ka7
PSs2Jgm45vk2cxRUIcZt+BLK/cR8AnJRJdKJk9ecjfoZkvMxDrFAKkCEse9A
QIoZmb+FF8RrigHkwf51ird8aJ1sCLE2uHNcHHR08IFadq7Hvr5yhwdHx8Om
hQGOWVJXCs048eAzbgd5jmWKEV4bUQ+M0hAVP7OlmL6GCdVFgwLcKdaJ+mMj
2fZW+Jsz45vqopAwGU61sWO+FE297MKQr9IrkMLOmSjvAgo9lDwqXO2/o4x2
8Z1RZRJB5r5pHodWSUZc8hf7UeDpyOC06wvUZG7akbjJsXEPatu+sDQ556fK
DcWX0DqZvLdUrQQ+9gWtJ8FN+DajjkBEaQKcnPATgwvrT4BbWZQ6UwAC5YE3
RrnGAWkBSM5DxeLbjPMWy3PeFgoKAIFHB2VTDh4WR/Hi9DTO59sq8kfVmQaO
nu/8BbEnPgfNohqL0/m85MB8IIllA8fA0auZCqxXwCjey3dHUzvGSCrmtKFC
bJ5xZ9y/0Tn4AnBmEQjxKAlHWNLAwAFIpQRcXo7LPLMQlGiHELlQ3S+0QkkZ
o2iFq5R6MZVB8DZkhhbIaX0vmXLgzCzCXtOSt4bohYXkmhDjqW1KMI0ALgAS
w0bMQrytzLzjT+ZwL4E0pSbCX8Yk7XJDv5wMQk+FBm2yZhZODJ7ufP3vBUVS
SwXaIYE5Gkxkd5txzVEbpQwUoZuTWbdZQJtFUEY1xL+qV/zOs8kRbqifUr3M
ZxzSWwmQWOz41dCrk2NOFFJIAa5hCmZC5GEcuTPxEx3WsVneTf7jPg15Fqzu
KSmT5wxWfY2jVSxlqLk45fMCJp1HKUEUVXCbD/CRwmfF7jh2P1BZ2K4seROA
Np6fYKNpnEmDRaDPH3Mc6dRuHdeXoEQuuYugxq+xdG+CXF6F0UVTeYFnREjy
RxtQ1CIiRyp98Ap9MOle93JiD/7wZJQ4XUHYEkR1r6rgiVxI/eYLhJvJXCUC
X5bo+ZNaYDaqBfdv44bc9G86fEifu3j70v13+PjKOBQ08S9ndDuw/+Tn6i7I
OA==
=aaaa
-----END PGP MESSAGE-----

Notice I manually edited the checksum in the armored text to =aaaa.

OpenPGP.js v2:

image

OpenPGP.js v4:

image

Most helpful comment

On a general note, I really like the attention this library is getting lately, thanks for the ongoing work! :muscle:

All 7 comments

Since streaming support, OpenPGP.js no longer reads the entire message until you start reading the decrypted message. When not streaming, this should result in openpgp.decrypt throwing. Is this happening for you?

If you need to know about this error in advance for some reason, you could probably do something like

  const input = await openpgp.armor.decode(armoredText);
  const data = await openpgp.stream.readToEnd(input.data); // Should throw on checksum mismatch
  const message = await openpgp.message.read(data);

I use message.decrypt(...) which doesn't throw, without streaming. I can try to make a small repro if message.decrypt is expected to throw.

Hmm, weird. Yes, please do!

Here, didn't throw:

(async () => {
  const { privateKeyArmored } = await openpgp.generateKey({ curve: 'curve25519', userIds: [{ email: '[email protected]' }] });
  const { keys: [key] } = await openpgp.key.readArmored(privateKeyArmored);
  const { data } = await openpgp.encrypt({ message: openpgp.message.fromText('msg'), publicKeys: [key.toPublic()] });
  console.log('\n\noriginal msg:\n', data);
  const badSumData = data.replace(/\n=[a-zA-Z0-9/+]{4}/, '\n=aaaa');
  console.log('\n\nbadSumData msg:\n', badSumData);
  const m = await openpgp.message.readArmored(badSumData);
  const decrypted = await m.decrypt([key]);
  const content = await openpgp.stream.readToEnd(decrypted.getLiteralData());
  console.log(`\n\ndecrypted content:\n${openpgp.util.Uint8Array_to_str(content)}`);
})().catch(console.error);

image

I could reproduce.

Oof, right. Even the high-level API doesn't throw when not streaming. This was broken in 5dcaf85 (src/packet/packet.js), I think. It's unfortunate that we didn't even have tests for this. I can look at this more when I get back from 馃尨.

On a general note, I really like the attention this library is getting lately, thanks for the ongoing work! :muscle:

Was this page helpful?
0 / 5 - 0 ratings

Related issues

ThierryIT picture ThierryIT  路  4Comments

jpbochi picture jpbochi  路  5Comments

ama4tf picture ama4tf  路  10Comments

kingleecha picture kingleecha  路  10Comments

jas4711 picture jas4711  路  8Comments