#89 decrypt using OpenPGP.js

This commit is contained in:
the-djmaze 2022-01-31 11:51:15 +01:00
parent e28c5bdbb6
commit c012fe09f0
4 changed files with 150 additions and 131 deletions

View file

@ -32,6 +32,90 @@ class OpenPgpKeyPopupView extends AbstractViewPopup {
onShow(openPgpKey) {
// TODO: show more info
this.key(openPgpKey ? openPgpKey.armor : '');
/*
this.key = key;
const aEmails = [];
if (key.users) {
key.users.forEach(user => user.userID.email && aEmails.push(user.userID.email));
}
this.id = key.getKeyID().toHex();
this.fingerprint = key.getFingerprint();
this.can_encrypt = !!key.getEncryptionKey();
this.can_sign = !!key.getSigningKey();
this.emails = aEmails;
this.armor = armor;
this.askDelete = ko.observable(false);
this.openForDeletion = ko.observable(null).askDeleteHelper();
key.id = key.subkeys[0].keyid;
key.fingerprint = key.subkeys[0].fingerprint;
key.uids.forEach(uid => uid.email && aEmails.push(uid.email));
key.emails = aEmails;
"disabled": false,
"expired": false,
"revoked": false,
"is_secret": true,
"can_sign": true,
"can_decrypt": true
"can_verify": true
"can_encrypt": true,
"uids": [
{
"name": "demo",
"comment": "",
"email": "demo@snappymail.eu",
"uid": "demo <demo@snappymail.eu>",
"revoked": false,
"invalid": false
}
],
"subkeys": [
{
"fingerprint": "2C223F20EA2ADB4CB68F81D95F3A5CDC09AD8AE3",
"keyid": "5F3A5CDC09AD8AE3",
"timestamp": 1643381672,
"expires": 0,
"is_secret": false,
"invalid": false,
"can_encrypt": false,
"can_sign": true,
"disabled": false,
"expired": false,
"revoked": false,
"can_certify": true,
"can_authenticate": false,
"is_qualified": false,
"is_de_vs": false,
"pubkey_algo": 303,
"length": 256,
"keygrip": "5A1A6C7310D0508C68E8E74F15068301E83FD1AE",
"is_cardkey": false,
"curve": "ed25519"
},
{
"fingerprint": "3CD720549D8833872C267D08F1230DCE2A561ADE",
"keyid": "F1230DCE2A561ADE",
"timestamp": 1643381672,
"expires": 0,
"is_secret": false,
"invalid": false,
"can_encrypt": true,
"can_sign": false,
"disabled": false,
"expired": false,
"revoked": false,
"can_certify": false,
"can_authenticate": false,
"is_qualified": false,
"is_de_vs": false,
"pubkey_algo": 302,
"length": 256,
"keygrip": "886921A7E06BE56F8E8C51797BB476BB26DF21BF",
"is_cardkey": false,
"curve": "cv25519"
}
]
*/
}
onBuild() {

View file

@ -41,6 +41,7 @@ import { decorateKoCommands, createCommand } from 'Knoin/Knoin';
import { AbstractViewRight } from 'Knoin/AbstractViews';
import { PgpUserStore } from 'Stores/User/Pgp';
import { OpenPGPUserStore } from 'Stores/User/OpenPGP';
const currentMessage = () => MessageUserStore.message();
@ -626,6 +627,7 @@ export class MailMessageView extends AbstractViewRight {
pgpDecrypt(self) {
const message = self.message(),
sender = message && message.from[0].email,
pgpInfo = message && message.pgpEncrypted();
if (pgpInfo) {
// Also check message.from[0].email
@ -652,7 +654,7 @@ export class MailMessageView extends AbstractViewRight {
message.plain(),
PgpUserStore.mailvelopeKeyring,
{
senderAddress: message.from[0].email
senderAddress: sender
}
).then(status => {
if (status.error && status.error.message) {
@ -665,8 +667,18 @@ export class MailMessageView extends AbstractViewRight {
});
}
else if ('openpgp' === result[0]) {
// TODO
// PgpUserStore.decryptMessage(message, recipients, fCallback)
const publicKey = OpenPGPUserStore.getPublicKeyFor(sender);
// OpenPGPUserStore.decrypt(message.plain(), result[1].armor
OpenPGPUserStore.decrypt(message.plain(), result[1].key, publicKey ? publicKey.key : null).then(result => {
if (result) {
// TODO: if result.data is not cleartext then
// parse mime to find and verify signature
message.plain(result.data);
message.viewPlain();
} else {
// controlsHelper(dom, this, false, i18n('PGP_NOTIFICATIONS/DECRYPTION_ERROR'));
}
});
}
else if ('gnupg' === result[0]) {
let params = {
@ -695,7 +707,8 @@ export class MailMessageView extends AbstractViewRight {
pgpVerify(self) {
if (self.pgpSigned()) {
const message = self.message();
const message = self.message(),
sender = message && message.from[0].email;
PgpUserStore.hasPublicKeyForEmails([message.from[0].email]).then(mode => {
if ('gnupg' === mode) {
let params = message.pgpSigned(); // { BodyPartId: "1", SigPartId: "2", MicAlg: "pgp-sha256" }
@ -713,16 +726,15 @@ export class MailMessageView extends AbstractViewRight {
});
}
} else if ('openpgp' === mode) {
let text = null;
try {
// TODO: if message.pgpSigned().SigPartId then fetch raw from server
text = PgpUserStore.openpgp.cleartext.readArmored(message.plain);
} catch (e) {
console.error(e);
}
if (text && text.getText && text.verify) {
PgpUserStore.verifyMessage(text, (validKey, signingKeyIds) => {
console.dir([validKey, signingKeyIds]);
const publicKey = OpenPGPUserStore.getPublicKeyFor(sender);
OpenPGPUserStore.verify(message.plain(), null/*detachedSignature*/, publicKey).then(result => {
if (result) {
// TODO: if result.data is not cleartext then
// parse mime to find and verify signature
message.plain(result.data);
message.viewPlain();
console.dir({signatures:result.signatures});
}
/*
if (validKey) {
i18n('PGP_NOTIFICATIONS/GOOD_SIGNATURE', {
@ -738,10 +750,7 @@ export class MailMessageView extends AbstractViewRight {
i18n('PGP_NOTIFICATIONS/UNVERIFIRED_SIGNATURE') + (additional ? ' (' + additional + ')' : '');
}
*/
});
} else {
// controlsHelper(dom, this, false, i18n('PGP_NOTIFICATIONS/DECRYPTION_ERROR'));
}
});
}
});
}