S/MIME allow changing private key passphrase due to #1505

This commit is contained in:
the-djmaze 2024-03-18 17:17:25 +01:00
parent 570c7e1a1a
commit b98b21c1c6
44 changed files with 198 additions and 21 deletions

View file

@ -251,14 +251,14 @@ export class AppUser extends AbstractApp {
}
}
AskPopupView.password = function(sAskDesc, btnText) {
AskPopupView.password = function(sAskDesc, btnText, ask) {
return new Promise(resolve => {
this.showModal([
sAskDesc,
view => resolve({password:view.passphrase(), remember:view.remember()}),
() => resolve(null),
true,
5,
ask || 5,
btnText
]);
});

View file

@ -33,7 +33,7 @@ export class IdentityModel extends AbstractModel {
addComputablesTo(this, {
smimeKeyEncrypted: () => this.smimeKey().includes('-----BEGIN ENCRYPTED PRIVATE KEY-----'),
smimeKeyValid: () => /^-----BEGIN (ENCRYPTED )?PRIVATE KEY-----/.test(this.smimeKey()),
smimeKeyValid: () => /^-----BEGIN (ENCRYPTED |RSA )?PRIVATE KEY-----/.test(this.smimeKey()),
smimeCertificateValid: () => /^-----BEGIN CERTIFICATE-----/.test(this.smimeCertificate())
});
}

View file

@ -42,26 +42,54 @@ export class IdentityPopupView extends AbstractViewPopup {
this.defaultOptionsAfterRender = defaultOptionsAfterRender;
this.createSelfSigned = this.createSelfSigned.bind(this);
this.setSMimeKeyPass = this.setSMimeKeyPass.bind(this);
}
async createSelfSigned() {
const identity = this.identity(),
pass = await AskPopupView.password('', 'CRYPTO/CREATE_SELF_SIGNED');
if (pass) {
Remote.request('SMimeCreateCertificate', (iError, oData) => {
if (oData.Result.x509) {
identity.smimeKey(oData.Result.pkey);
identity.smimeCertificate(oData.Result.x509);
} else {
this.submitError(oData.ErrorMessage);
}
}, {
name: identity.name(),
email: identity.email(),
privateKey: identity.smimeKey(),
passphrase: pass.password
});
createSelfSigned() {
AskPopupView.password('', 'CRYPTO/CREATE_SELF_SIGNED').then(pass => {
if (pass) {
const identity = this.identity();
Remote.request('SMimeCreateCertificate', (iError, oData) => {
if (oData.Result.x509) {
identity.smimeKey(oData.Result.pkey);
identity.smimeCertificate(oData.Result.x509);
} else {
this.submitError(oData.ErrorMessage);
}
}, {
name: identity.name(),
email: identity.email(),
privateKey: identity.smimeKey(),
passphrase: pass.password
});
}
});
}
async setSMimeKeyPass() {
const identity = this.identity();
let old = null
if (identity.smimeKeyEncrypted()) {
old = await AskPopupView.password(i18n('CRYPTO/CURRENT_PASS'), 'CRYPTO/DECRYPT', 1);
if (!old) {
return;
}
}
AskPopupView.password(i18n('CRYPTO/NEW_PASS'), 'GLOBAL/SAVE', 1).then(pass => {
if (pass) {
Remote.request('SMimeExportPrivateKey', (iError, oData) => {
if (oData.Result) {
identity.smimeKey(oData.Result);
} else {
this.submitError(oData.ErrorMessage);
}
}, {
privateKey: identity.smimeKey(),
oldPassphrase: old?.password,
newPassphrase: pass.password
});
}
});
}
submitForm(form) {

View file

@ -68,6 +68,20 @@ trait SMime
return $this->DefaultResponse($result ?: false);
}
public function DoSMimeExportPrivateKey() : array
{
$SMIME = $this->SMIME();
$SMIME->setPrivateKey(
$this->GetActionParam('privateKey'),
new \SnappyMail\SensitiveString($this->GetActionParam('oldPassphrase', ''))
);
$result = $SMIME->exportPrivateKey(
new \SnappyMail\SensitiveString($this->GetActionParam('newPassphrase', ''))
);
return $this->DefaultResponse($result);
}
public function DoSMimeDecryptMessage() : array
{
$sFolderName = $this->GetActionParam('folder', '');

View file

@ -13,7 +13,7 @@ class OpenSSL
private string $homedir;
private array $headers = [];
private int $flags = 0;
private int $cipher_algo = \OPENSSL_CIPHER_AES_128_CBC;
private int $cipher_algo = \OPENSSL_CIPHER_AES_128_CBC; // \OPENSSL_CIPHER_AES_256_CBC
private ?string $untrusted_certificates_filename = null;
// Used for sign and decrypt
@ -144,6 +144,22 @@ class OpenSSL
}
}
public function exportPrivateKey(?\SnappyMail\SensitiveString $passphrase = null): string
{
if (!$this->privateKey) {
throw new \RuntimeException('OpenSSL exportPrivateKey: key not loaded');
}
$options = [
'encrypt_key' => true,
'encrypt_key_cipher' => \OPENSSL_CIPHER_AES_256_CBC
];
$output = '';
if (!\openssl_pkey_export($this->privateKey, $output, $passphrase/*, $options*/)) {
throw new \RuntimeException('OpenSSL exportPrivateKey: ' . \openssl_error_string());
}
return $output;
}
/*
public function asn1parse(/*string|Temporary* / $input) : ?string
{

View file

@ -285,6 +285,9 @@
"CREATE_SELF_SIGNED": "Create self-signed",
"VALID_UNTIL": "Valid until",
"PRIVATE_KEY": "Private key",
"CHANGE_PASS": "Change passphrase",
"CURRENT_PASS": "Current passphrase",
"NEW_PASS": "New passphrase",
"ASK_CRYPTKEY_PASS": "Your login passphrase has changed. Please fill in your old login password to decrypt data"
},
"OPENPGP": {

View file

@ -285,6 +285,9 @@
"CREATE_SELF_SIGNED": "Create self-signed",
"VALID_UNTIL": "Valid until",
"PRIVATE_KEY": "Private key",
"CHANGE_PASS": "Change passphrase",
"CURRENT_PASS": "Current passphrase",
"NEW_PASS": "New passphrase",
"ASK_CRYPTKEY_PASS": "Your login passphrase has changed. Please fill in your old login password to decrypt data"
},
"OPENPGP": {

View file

@ -285,6 +285,9 @@
"CREATE_SELF_SIGNED": "Create self-signed",
"VALID_UNTIL": "Valid until",
"PRIVATE_KEY": "Private key",
"CHANGE_PASS": "Change passphrase",
"CURRENT_PASS": "Current passphrase",
"NEW_PASS": "New passphrase",
"ASK_CRYPTKEY_PASS": "Your login passphrase has changed. Please fill in your old login password to decrypt data"
},
"OPENPGP": {

View file

@ -285,6 +285,9 @@
"CREATE_SELF_SIGNED": "Create self-signed",
"VALID_UNTIL": "Valid until",
"PRIVATE_KEY": "Private key",
"CHANGE_PASS": "Change passphrase",
"CURRENT_PASS": "Current passphrase",
"NEW_PASS": "New passphrase",
"ASK_CRYPTKEY_PASS": "Your login passphrase has changed. Please fill in your old login password to decrypt data"
},
"OPENPGP": {

View file

@ -285,6 +285,9 @@
"CREATE_SELF_SIGNED": "Create self-signed",
"VALID_UNTIL": "Valid until",
"PRIVATE_KEY": "Private key",
"CHANGE_PASS": "Change passphrase",
"CURRENT_PASS": "Current passphrase",
"NEW_PASS": "New passphrase",
"ASK_CRYPTKEY_PASS": "Your login passphrase has changed. Please fill in your old login password to decrypt data"
},
"OPENPGP": {

View file

@ -285,6 +285,9 @@
"CREATE_SELF_SIGNED": "Create self-signed",
"VALID_UNTIL": "Valid until",
"PRIVATE_KEY": "Private key",
"CHANGE_PASS": "Change passphrase",
"CURRENT_PASS": "Current passphrase",
"NEW_PASS": "New passphrase",
"ASK_CRYPTKEY_PASS": "Your login passphrase has changed. Please fill in your old login password to decrypt data"
},
"OPENPGP": {

View file

@ -285,6 +285,9 @@
"CREATE_SELF_SIGNED": "Create self-signed",
"VALID_UNTIL": "Valid until",
"PRIVATE_KEY": "Private key",
"CHANGE_PASS": "Change passphrase",
"CURRENT_PASS": "Current passphrase",
"NEW_PASS": "New passphrase",
"ASK_CRYPTKEY_PASS": "Your login passphrase has changed. Please fill in your old login password to decrypt data"
},
"OPENPGP": {

View file

@ -285,6 +285,9 @@
"CREATE_SELF_SIGNED": "Create self-signed",
"VALID_UNTIL": "Valid until",
"PRIVATE_KEY": "Private key",
"CHANGE_PASS": "Change passphrase",
"CURRENT_PASS": "Current passphrase",
"NEW_PASS": "New passphrase",
"ASK_CRYPTKEY_PASS": "Your login passphrase has changed. Please fill in your old login password to decrypt data"
},
"OPENPGP": {

View file

@ -285,6 +285,9 @@
"CREATE_SELF_SIGNED": "Create self-signed",
"VALID_UNTIL": "Valid until",
"PRIVATE_KEY": "Private key",
"CHANGE_PASS": "Change passphrase",
"CURRENT_PASS": "Current passphrase",
"NEW_PASS": "New passphrase",
"ASK_CRYPTKEY_PASS": "Your login passphrase has changed. Please fill in your old login password to decrypt data"
},
"OPENPGP": {

View file

@ -285,6 +285,9 @@
"CREATE_SELF_SIGNED": "Create self-signed",
"VALID_UNTIL": "Valid until",
"PRIVATE_KEY": "Private key",
"CHANGE_PASS": "Change passphrase",
"CURRENT_PASS": "Current passphrase",
"NEW_PASS": "New passphrase",
"ASK_CRYPTKEY_PASS": "Your login passphrase has changed. Please fill in your old login password to decrypt data"
},
"OPENPGP": {

View file

@ -285,6 +285,9 @@
"CREATE_SELF_SIGNED": "Create self-signed",
"VALID_UNTIL": "Valid until",
"PRIVATE_KEY": "Private key",
"CHANGE_PASS": "Change passphrase",
"CURRENT_PASS": "Current passphrase",
"NEW_PASS": "New passphrase",
"ASK_CRYPTKEY_PASS": "Your login passphrase has changed. Please fill in your old login password to decrypt data"
},
"OPENPGP": {

View file

@ -285,6 +285,9 @@
"CREATE_SELF_SIGNED": "Create self-signed",
"VALID_UNTIL": "Valid until",
"PRIVATE_KEY": "Private key",
"CHANGE_PASS": "Change passphrase",
"CURRENT_PASS": "Current passphrase",
"NEW_PASS": "New passphrase",
"ASK_CRYPTKEY_PASS": "Your login passphrase has changed. Please fill in your old login password to decrypt data"
},
"OPENPGP": {

View file

@ -285,6 +285,9 @@
"CREATE_SELF_SIGNED": "Create self-signed",
"VALID_UNTIL": "Valid until",
"PRIVATE_KEY": "Private key",
"CHANGE_PASS": "Change passphrase",
"CURRENT_PASS": "Current passphrase",
"NEW_PASS": "New passphrase",
"ASK_CRYPTKEY_PASS": "Your login passphrase has changed. Please fill in your old login password to decrypt data"
},
"OPENPGP": {

View file

@ -285,6 +285,9 @@
"CREATE_SELF_SIGNED": "Create self-signed",
"VALID_UNTIL": "Valable jusque",
"PRIVATE_KEY": "Clé privée",
"CHANGE_PASS": "Change passphrase",
"CURRENT_PASS": "Current passphrase",
"NEW_PASS": "New passphrase",
"ASK_CRYPTKEY_PASS": "Your login passphrase has changed. Please fill in your old login password to decrypt data"
},
"OPENPGP": {

View file

@ -285,6 +285,9 @@
"CREATE_SELF_SIGNED": "Create self-signed",
"VALID_UNTIL": "Valid until",
"PRIVATE_KEY": "Private key",
"CHANGE_PASS": "Change passphrase",
"CURRENT_PASS": "Current passphrase",
"NEW_PASS": "New passphrase",
"ASK_CRYPTKEY_PASS": "Your login passphrase has changed. Please fill in your old login password to decrypt data"
},
"OPENPGP": {

View file

@ -285,6 +285,9 @@
"CREATE_SELF_SIGNED": "Create self-signed",
"VALID_UNTIL": "Valid until",
"PRIVATE_KEY": "Private key",
"CHANGE_PASS": "Change passphrase",
"CURRENT_PASS": "Current passphrase",
"NEW_PASS": "New passphrase",
"ASK_CRYPTKEY_PASS": "Your login passphrase has changed. Please fill in your old login password to decrypt data"
},
"OPENPGP": {

View file

@ -285,6 +285,9 @@
"CREATE_SELF_SIGNED": "Create self-signed",
"VALID_UNTIL": "Valid until",
"PRIVATE_KEY": "Private key",
"CHANGE_PASS": "Change passphrase",
"CURRENT_PASS": "Current passphrase",
"NEW_PASS": "New passphrase",
"ASK_CRYPTKEY_PASS": "Your login passphrase has changed. Please fill in your old login password to decrypt data"
},
"OPENPGP": {

View file

@ -285,6 +285,9 @@
"CREATE_SELF_SIGNED": "Create self-signed",
"VALID_UNTIL": "Valid until",
"PRIVATE_KEY": "Private key",
"CHANGE_PASS": "Change passphrase",
"CURRENT_PASS": "Current passphrase",
"NEW_PASS": "New passphrase",
"ASK_CRYPTKEY_PASS": "Your login passphrase has changed. Please fill in your old login password to decrypt data"
},
"OPENPGP": {

View file

@ -285,6 +285,9 @@
"CREATE_SELF_SIGNED": "Create self-signed",
"VALID_UNTIL": "Valid until",
"PRIVATE_KEY": "Private key",
"CHANGE_PASS": "Change passphrase",
"CURRENT_PASS": "Current passphrase",
"NEW_PASS": "New passphrase",
"ASK_CRYPTKEY_PASS": "Your login passphrase has changed. Please fill in your old login password to decrypt data"
},
"OPENPGP": {

View file

@ -285,6 +285,9 @@
"CREATE_SELF_SIGNED": "Create self-signed",
"VALID_UNTIL": "Valid until",
"PRIVATE_KEY": "Private key",
"CHANGE_PASS": "Change passphrase",
"CURRENT_PASS": "Current passphrase",
"NEW_PASS": "New passphrase",
"ASK_CRYPTKEY_PASS": "Your login passphrase has changed. Please fill in your old login password to decrypt data"
},
"OPENPGP": {

View file

@ -285,6 +285,9 @@
"CREATE_SELF_SIGNED": "Create self-signed",
"VALID_UNTIL": "Valid until",
"PRIVATE_KEY": "Private key",
"CHANGE_PASS": "Change passphrase",
"CURRENT_PASS": "Current passphrase",
"NEW_PASS": "New passphrase",
"ASK_CRYPTKEY_PASS": "Your login passphrase has changed. Please fill in your old login password to decrypt data"
},
"OPENPGP": {

View file

@ -285,6 +285,9 @@
"CREATE_SELF_SIGNED": "Create self-signed",
"VALID_UNTIL": "Valid until",
"PRIVATE_KEY": "Private key",
"CHANGE_PASS": "Change passphrase",
"CURRENT_PASS": "Current passphrase",
"NEW_PASS": "New passphrase",
"ASK_CRYPTKEY_PASS": "Your login passphrase has changed. Please fill in your old login password to decrypt data"
},
"OPENPGP": {

View file

@ -285,6 +285,9 @@
"CREATE_SELF_SIGNED": "Create self-signed",
"VALID_UNTIL": "Valid until",
"PRIVATE_KEY": "Private key",
"CHANGE_PASS": "Change passphrase",
"CURRENT_PASS": "Current passphrase",
"NEW_PASS": "New passphrase",
"ASK_CRYPTKEY_PASS": "Your login passphrase has changed. Please fill in your old login password to decrypt data"
},
"OPENPGP": {

View file

@ -285,6 +285,9 @@
"CREATE_SELF_SIGNED": "Zelfondertekend certificaat aanmaken",
"VALID_UNTIL": "Geldig tot",
"PRIVATE_KEY": "Privésleutel",
"CHANGE_PASS": "Change passphrase",
"CURRENT_PASS": "Current passphrase",
"NEW_PASS": "New passphrase",
"ASK_CRYPTKEY_PASS": "Your login passphrase has changed. Please fill in your old login password to decrypt data"
},
"OPENPGP": {

View file

@ -285,6 +285,9 @@
"CREATE_SELF_SIGNED": "Utwórz samodzielnie podpisany certyfikat",
"VALID_UNTIL": "Ważny do",
"PRIVATE_KEY": "Private key",
"CHANGE_PASS": "Change passphrase",
"CURRENT_PASS": "Current passphrase",
"NEW_PASS": "New passphrase",
"ASK_CRYPTKEY_PASS": "Your login passphrase has changed. Please fill in your old login password to decrypt data"
},
"OPENPGP": {

View file

@ -285,6 +285,9 @@
"CREATE_SELF_SIGNED": "Create self-signed",
"VALID_UNTIL": "Valid until",
"PRIVATE_KEY": "Private key",
"CHANGE_PASS": "Change passphrase",
"CURRENT_PASS": "Current passphrase",
"NEW_PASS": "New passphrase",
"ASK_CRYPTKEY_PASS": "Your login passphrase has changed. Please fill in your old login password to decrypt data"
},
"OPENPGP": {

View file

@ -285,6 +285,9 @@
"CREATE_SELF_SIGNED": "Criar auto-assinado",
"VALID_UNTIL": "Válido até",
"PRIVATE_KEY": "Chave privada",
"CHANGE_PASS": "Change passphrase",
"CURRENT_PASS": "Current passphrase",
"NEW_PASS": "New passphrase",
"ASK_CRYPTKEY_PASS": "Your login passphrase has changed. Please fill in your old login password to decrypt data"
},
"OPENPGP": {

View file

@ -285,6 +285,9 @@
"CREATE_SELF_SIGNED": "Criar auto-assinado",
"VALID_UNTIL": "Válido até",
"PRIVATE_KEY": "Chave privada",
"CHANGE_PASS": "Change passphrase",
"CURRENT_PASS": "Current passphrase",
"NEW_PASS": "New passphrase",
"ASK_CRYPTKEY_PASS": "Your login passphrase has changed. Please fill in your old login password to decrypt data"
},
"OPENPGP": {

View file

@ -285,6 +285,9 @@
"CREATE_SELF_SIGNED": "Create self-signed",
"VALID_UNTIL": "Valid until",
"PRIVATE_KEY": "Private key",
"CHANGE_PASS": "Change passphrase",
"CURRENT_PASS": "Current passphrase",
"NEW_PASS": "New passphrase",
"ASK_CRYPTKEY_PASS": "Your login passphrase has changed. Please fill in your old login password to decrypt data"
},
"OPENPGP": {

View file

@ -285,6 +285,9 @@
"CREATE_SELF_SIGNED": "Create self-signed",
"VALID_UNTIL": "Valid until",
"PRIVATE_KEY": "Private key",
"CHANGE_PASS": "Change passphrase",
"CURRENT_PASS": "Current passphrase",
"NEW_PASS": "New passphrase",
"ASK_CRYPTKEY_PASS": "Your login passphrase has changed. Please fill in your old login password to decrypt data"
},
"OPENPGP": {

View file

@ -285,6 +285,9 @@
"CREATE_SELF_SIGNED": "Create self-signed",
"VALID_UNTIL": "Valid until",
"PRIVATE_KEY": "Private key",
"CHANGE_PASS": "Change passphrase",
"CURRENT_PASS": "Current passphrase",
"NEW_PASS": "New passphrase",
"ASK_CRYPTKEY_PASS": "Your login passphrase has changed. Please fill in your old login password to decrypt data"
},
"OPENPGP": {

View file

@ -285,6 +285,9 @@
"CREATE_SELF_SIGNED": "Create self-signed",
"VALID_UNTIL": "Valid until",
"PRIVATE_KEY": "Private key",
"CHANGE_PASS": "Change passphrase",
"CURRENT_PASS": "Current passphrase",
"NEW_PASS": "New passphrase",
"ASK_CRYPTKEY_PASS": "Your login passphrase has changed. Please fill in your old login password to decrypt data"
},
"OPENPGP": {

View file

@ -285,6 +285,9 @@
"CREATE_SELF_SIGNED": "Create self-signed",
"VALID_UNTIL": "Valid until",
"PRIVATE_KEY": "Private key",
"CHANGE_PASS": "Change passphrase",
"CURRENT_PASS": "Current passphrase",
"NEW_PASS": "New passphrase",
"ASK_CRYPTKEY_PASS": "Your login passphrase has changed. Please fill in your old login password to decrypt data"
},
"OPENPGP": {

View file

@ -285,6 +285,9 @@
"CREATE_SELF_SIGNED": "Create self-signed",
"VALID_UNTIL": "Valid until",
"PRIVATE_KEY": "Private key",
"CHANGE_PASS": "Change passphrase",
"CURRENT_PASS": "Current passphrase",
"NEW_PASS": "New passphrase",
"ASK_CRYPTKEY_PASS": "Your login passphrase has changed. Please fill in your old login password to decrypt data"
},
"OPENPGP": {

View file

@ -285,6 +285,9 @@
"CREATE_SELF_SIGNED": "Create self-signed",
"VALID_UNTIL": "Valid until",
"PRIVATE_KEY": "Private key",
"CHANGE_PASS": "Change passphrase",
"CURRENT_PASS": "Current passphrase",
"NEW_PASS": "New passphrase",
"ASK_CRYPTKEY_PASS": "Your login passphrase has changed. Please fill in your old login password to decrypt data"
},
"OPENPGP": {

View file

@ -285,6 +285,9 @@
"CREATE_SELF_SIGNED": "Create self-signed",
"VALID_UNTIL": "Valid until",
"PRIVATE_KEY": "Private key",
"CHANGE_PASS": "Change passphrase",
"CURRENT_PASS": "Current passphrase",
"NEW_PASS": "New passphrase",
"ASK_CRYPTKEY_PASS": "Your login passphrase has changed. Please fill in your old login password to decrypt data"
},
"OPENPGP": {

View file

@ -285,6 +285,9 @@
"CREATE_SELF_SIGNED": "Create self-signed",
"VALID_UNTIL": "Valid until",
"PRIVATE_KEY": "Private key",
"CHANGE_PASS": "Change passphrase",
"CURRENT_PASS": "Current passphrase",
"NEW_PASS": "New passphrase",
"ASK_CRYPTKEY_PASS": "Your login passphrase has changed. Please fill in your old login password to decrypt data"
},
"OPENPGP": {

View file

@ -285,6 +285,9 @@
"CREATE_SELF_SIGNED": "Create self-signed",
"VALID_UNTIL": "Valid until",
"PRIVATE_KEY": "Private key",
"CHANGE_PASS": "Change passphrase",
"CURRENT_PASS": "Current passphrase",
"NEW_PASS": "New passphrase",
"ASK_CRYPTKEY_PASS": "Your login passphrase has changed. Please fill in your old login password to decrypt data"
},
"OPENPGP": {

View file

@ -92,6 +92,11 @@
<label data-i18n="CRYPTO/PRIVATE_KEY"></label>
<textarea name="smimeKey" class="input-xxlarge" rows="14" autofocus="" autocomplete="off" data-bind="value: smimeKey"></textarea>
</div>
<!-- <div class="control-group" data-bind="visible:smimeKeyValid() && !smimeKeyEncrypted()"> -->
<div class="control-group" data-bind="visible:smimeKeyValid">
<label></label>
<button type="button" data-bind="click: $root.setSMimeKeyPass" data-i18n="CRYPTO/CHANGE_PASS"></button>
</div>
<div class="control-group" data-bind="css: {'error': smimeCertificate() && !smimeCertificateValid()}">
<label data-i18n="SMIME/CERTIFICATE"></label>
<textarea name="smimeCertificate" class="input-xxlarge" rows="14" autofocus="" autocomplete="off" data-bind="value: smimeCertificate"></textarea>