Skip to content

This issue was moved to a discussion.

You can continue the conversation there. Go to discussion →

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Session key decryption failed because of Message.fromBinary() instead of Message.read() #1372

Closed
drzraf opened this issue Jul 14, 2021 · 1 comment

Comments

@drzraf
Copy link

drzraf commented Jul 14, 2021

import openpgp from 'openpgp';

const privkey = `-----BEGIN PGP PRIVATE KEY BLOCK-----

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
RC+wIdk83uxpqoMIZXt3mS2D3fCwse1bF5gZ
=7vmo
-----END PGP PRIVATE KEY BLOCK-----`,
      pubkey = `-----BEGIN PGP PUBLIC KEY BLOCK-----

mQENBGDtxQUBCADOlWqUON79hoQHMP53dGpY/+CrQNBLWXLCmINDF9HYFimp5WMp
OPZN3r4CSuq3cKDsqKmk66CI8XekEcOaEiecp6Pcx8um325RJS6Ot0rdM4DXGe8M
KJu/UKCaTV2iJoFSWGVDrLL+L+ai+kx2pwuCY1+Qp4LXndpay7VDsTVPYyvBu/Fa
RtA2G/cMCcFjzwSMqxibCbOUWQZtAaZszlokNrRAGXadJShS3tJxCnXwPIZS+QMt
0tIxx5xlIHOIG6oKjRDCPNx1dqyOqztqzyECNh2y92SmqBLD5tcSXTsOZGx2+gCJ
eSbcDK7nOgbszufmM0tty3C2YU2qqs/nLUuhABEBAAG0IERldiBMb3BlcjIgPGRl
dkBsb2NhbGhvc3QubG9jYWw+iQFUBBMBCgA+FiEEKL8mzDbCZ2ao3H115dcTkQr6
Ec0FAmDtxxsCGwMFCQPCZwAFCwkIBwIGFQoJCAsCBBYCAwECHgECF4AACgkQ5dcT
kQr6Ec1p+Qf/a6Wpdb070TxBw6nzHVzu1iI+a8qoeDdotA0HChET+YCLS8kq0pFy
3IiodXCZcQsEl90oJYzyKPihDPCGeHs9a5cUEAs7GXd0GSMFKMqt/i6lgnzlWLQn
MFGMZGrxL/lEszdzx9KH0cTrRmX3yDxcvcjcQJoDJGJz/yztYYdFqICEJi5YhwDW
80MRrkJbz/We/u7C4CfALweKkr4/QmTgT4auUiFtu3CeZARq80tnOS8zBhwyEwtV
fZmk6yrXAS452GXnEWZ3Fo3AYPCRdzL/pwLCFxTozhoWfA2uktv4fjZx2xMpBs2S
53fd2TgM+YwetMZQ0DR57FrRi+WvGV1IZLkBDQRg7cU0AQgA2D3Ye92VOp4gEKWw
a+67jhez9Lb0YT+FKtel+wLPVZjxAGTvNWBmaKZqO+VvYdJdxIBNfAO0u+Mzl2tX
+Cn09psinlHysNthzQM/BE4qpK+nScQxwzycRD3pdM8nLDjk2HWVSoXS1ZR6AJ69
7xbk+Xei124o2mj5+t/wQyr9A0JvYCl/Uxl5MGLIH8OSNA7XY2q+I+immPH1bk6l
WrMjRt8urhDbwqZmjgFOfZV0myGlmHu9tSKTbk3OC8VLTkfkKhcdlJf/r8CJo7FM
zdsmeYDVBMwBQdQ69Is6dyBdyijDjzTWvThJHoFGZRVq8DRrdMw7NbtwSrL/COag
xP6MNQARAQABiQE8BBgBCgAmFiEEKL8mzDbCZ2ao3H115dcTkQr6Ec0FAmDtxTQC
GwwFCQWjmoAACgkQ5dcTkQr6Ec0xKAf/Q9so7HMUvzEnC/Ggob+9l385IjqqExTJ
rk4OwW7a3xWHVnM3xnGw5+IobYeUW7cayNUu0W8BO2T/8qyowBv0jha460M+RrTD
sYQtyNqAY8NEtvHBPTBCUgX5XuuMei5a5xcDQmzNireP+rz+poFbX5de0AmYBrBI
qVnBp8TlYeDEIm6lZXNCrDulQnx/HcaEgXAOoCbleDkXGaLuUDNhwVaUtQxhVU9F
IPqWc1jAcVOCrnkIyvruRlhJV2lLAzJ55WXjMXpsOwO/HjWa/WP9mluoTsOgB+4m
A2Nis8e1wD/iusGR70QvsCHZPN7saaqDCGV7d5ktg93wsLHtWxeYGQ==
=wPR/
-----END PGP PUBLIC KEY BLOCK-----`;

var origin = 'abcd',
    cleartext = (new TextEncoder()).encode(origin),
    cleartext_message = openpgp.message.fromBinary(cleartext),
    { keys: [publicKey] } = await openpgp.key.readArmored(pubkey),
    { keys: [privateKey] } = await openpgp.key.readArmored(privkey);

async function as_armored() {
    const {data: encrypted } = await openpgp.encrypt({message: cleartext_message, publicKeys: publicKey, armor: true});
    return await openpgp.message.readArmored(encrypted);
}

async function as_bin() {
    var encrypted = await openpgp.encrypt({message: cleartext_message, publicKeys: publicKey, armor: false});
    encrypted = encrypted.message.packets.write();
    // WRONG! openpgp.message.read(encrypted) must be used here !
    return await openpgp.message.fromBinary(encrypted);
}

// works
// var { data: decrypted } = await openpgp.decrypt({message: await as_armored(), privateKeys: privateKey});
// does not work
var { data: decrypted } = await openpgp.decrypt({message: await as_bin(), privateKeys: privateKey});

console.assert(decrypted == origin);

With the above sample, we get an error Error decrypting message: Session key decryption failed.
This is terribly hard to debug as one could expect this to come from a variety of problems related to the private key itself (non-encrypting key) or the public key. But no way to suspect the message to have been wrongly read. Moreover, using fromBinary as a Message counterpart works and seems plausible and logical.

I know it's 4.10.10 and v5 may have an improved API, but for v4 it's definitely a source of confusion.

@larabr
Copy link
Collaborator

larabr commented Jul 19, 2021

Hi @drzraf , the v5 API has been changed to avoid this kind of confusion, by introducing the createMessage and readMessage functions. We are not planning to make changes to v4, since v5 is going to be released soon.

@openpgpjs openpgpjs locked and limited conversation to collaborators Jul 19, 2021
@larabr larabr closed this as completed Jul 19, 2021

This issue was moved to a discussion.

You can continue the conversation there. Go to discussion →

Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants