diff --git a/js/privatebin.js b/js/privatebin.js
index bdbafa94..57fbeda8 100644
--- a/js/privatebin.js
+++ b/js/privatebin.js
@@ -851,10 +851,12 @@ jQuery.PrivateBin = (function($, RawDeflate) {
* @param {string} key
* @param {string} password
* @param {array} spec cryptographic specification
+ * @param {bool} exportKey
* @return {CryptoKey} derived key
*/
- async function deriveKey(key, password, spec)
+ async function deriveKey(key, password, spec, exportKey)
{
+ exportKey = exportKey || false;
let keyArray = stringToArraybuffer(key);
if (password.length > 0) {
// version 1 pastes did append the passwords SHA-256 hash in hex
@@ -899,7 +901,7 @@ jQuery.PrivateBin = (function($, RawDeflate) {
name: 'AES-' + spec[6].toUpperCase(), // can be any supported AES algorithm ("AES-CTR", "AES-CBC", "AES-CMAC", "AES-GCM", "AES-CFB", "AES-KW", "ECDH", "DH" or "HMAC")
length: spec[3] // can be 128, 192 or 256
},
- false, // the key may not be exported
+ exportKey, // may the key get exported, false by default
['encrypt', 'decrypt'] // we may only use it for en- and decryption
);
}
@@ -935,40 +937,18 @@ jQuery.PrivateBin = (function($, RawDeflate) {
*/
me.getCredentials = async function(key, password)
{
- let keyArray = stringToArraybuffer(key);
- if (password.length > 0) {
- let passwordArray = stringToArraybuffer(password),
- newKeyArray = new Uint8Array(keyArray.length + passwordArray.length);
- newKeyArray.set(keyArray, 0);
- newKeyArray.set(passwordArray, keyArray.length);
- keyArray = newKeyArray;
- }
-
- // import raw key
- const importedKey = await window.crypto.subtle.importKey(
- 'raw', // only 'raw' is allowed
- keyArray.slice(16),
- {name: 'PBKDF2'}, // we use PBKDF2 for key derivation
- false, // the key may not be exported
- ['deriveKey'] // we may only use it for key derivation
- );
-
- // derive a stronger key for use with AES
- const derivedKey = await window.crypto.subtle.deriveKey(
- {
- name: 'PBKDF2', // we use PBKDF2 for key derivation
- salt: keyArray.slice(0, 16), // salt used in HMAC
- iterations: 100000, // amount of iterations to apply
- hash: {name: 'SHA-256'} // can be "SHA-1", "SHA-256", "SHA-384" or "SHA-512"
- },
- importedKey,
- {
- name: 'AES-GCM', // can be any supported AES algorithm ("AES-CTR", "AES-CBC", "AES-CMAC", "AES-GCM", "AES-CFB", "AES-KW", "ECDH", "DH" or "HMAC")
- length: 256 // can be 128, 192 or 256
- },
- true, // the key can be exported
- ['encrypt'] // we want to export it
- );
+ const spec = [
+ null, // initialization vector
+ key.slice(0, 16), // salt
+ 100000, // iterations
+ 256, // key size
+ null, // tag size
+ null, // algorithm
+ 'gcm', // algorithm mode
+ 'none' // compression
+ ];
+ key = key.slice(16);
+ let derivedKey = await deriveKey(key, password, spec, true);
return btoa(
arraybufferToString(
await window.crypto.subtle.exportKey('raw', derivedKey)
diff --git a/tpl/bootstrap.php b/tpl/bootstrap.php
index fdb7a0ab..c73b6738 100644
--- a/tpl/bootstrap.php
+++ b/tpl/bootstrap.php
@@ -71,7 +71,7 @@ if ($MARKDOWN):
endif;
?>
-
+
diff --git a/tpl/page.php b/tpl/page.php
index 2e98dce4..bbf55845 100644
--- a/tpl/page.php
+++ b/tpl/page.php
@@ -49,7 +49,7 @@ if ($MARKDOWN):
endif;
?>
-
+