Skip to content
Snippets Groups Projects
Commit d09a6da4 authored by Greg Fodor's avatar Greg Fodor
Browse files

e2e encryption working for xfer

parent 5508945a
No related branches found
No related tags found
No related merge requests found
...@@ -15,9 +15,7 @@ async function publicKeyToString(key) { ...@@ -15,9 +15,7 @@ async function publicKeyToString(key) {
} }
async function stringToPublicKey(s) { async function stringToPublicKey(s) {
return await crypto.subtle.importKey("jwk", JSON.parse(s), { name: "ECDH", namedCurve: "P-256" }, true, [ return await crypto.subtle.importKey("jwk", JSON.parse(s), { name: "ECDH", namedCurve: "P-256" }, true, []);
"deriveKey"
]);
} }
function stringToArrayBuffer(s) { function stringToArrayBuffer(s) {
...@@ -30,7 +28,8 @@ function stringToArrayBuffer(s) { ...@@ -30,7 +28,8 @@ function stringToArrayBuffer(s) {
return buf; return buf;
} }
function arrayBufferToString(buf) { function arrayBufferToString(b) {
const buf = new Uint8Array(b);
let s = ""; let s = "";
for (let i = 0; i < buf.byteLength; i++) { for (let i = 0; i < buf.byteLength; i++) {
...@@ -56,8 +55,11 @@ export async function generatePublicKeyAndEncryptedObject(incomingPublicKeyStrin ...@@ -56,8 +55,11 @@ export async function generatePublicKeyAndEncryptedObject(incomingPublicKeyStrin
const keyPair = await crypto.subtle.generateKey({ name: "ECDH", namedCurve: "P-256" }, true, ["deriveKey"]); const keyPair = await crypto.subtle.generateKey({ name: "ECDH", namedCurve: "P-256" }, true, ["deriveKey"]);
const publicKeyString = await publicKeyToString(keyPair.publicKey); const publicKeyString = await publicKeyToString(keyPair.publicKey);
const secret = await deriveKey(keyPair.privateKey, incomingPublicKey); const secret = await deriveKey(keyPair.privateKey, incomingPublicKey);
const encryptedData = btoa( const encryptedData = btoa(
await crypto.subtle.encrypt({ name: "AES-CBC", iv }, secret, stringToArrayBuffer(JSON.stringify(obj))) arrayBufferToString(
await crypto.subtle.encrypt({ name: "AES-CBC", iv }, secret, stringToArrayBuffer(JSON.stringify(obj)))
)
); );
return { publicKeyString, encryptedData }; return { publicKeyString, encryptedData };
...@@ -66,14 +68,9 @@ export async function generatePublicKeyAndEncryptedObject(incomingPublicKeyStrin ...@@ -66,14 +68,9 @@ export async function generatePublicKeyAndEncryptedObject(incomingPublicKeyStrin
// Requestor then takes the receiver's public key, the private key (returned from generateKeys()), and the data from the receiver. // Requestor then takes the receiver's public key, the private key (returned from generateKeys()), and the data from the receiver.
export async function decryptObject(publicKeyString, privateKey, base64value) { export async function decryptObject(publicKeyString, privateKey, base64value) {
const iv = new Uint8Array(16); const iv = new Uint8Array(16);
const publicKey = await publicKeyToString(publicKeyString); const publicKey = await stringToPublicKey(publicKeyString);
const secret = await deriveKey(privateKey, publicKey); const secret = await deriveKey(privateKey, publicKey);
const ciphertext = stringToArrayBuffer(atob(base64value));
return JSON.parse( const data = await crypto.subtle.decrypt({ name: "AES-CBC", iv }, secret, ciphertext);
arrayBufferToString( return JSON.parse(arrayBufferToString(data));
new Uint8Array(
await crypto.subtle.decrypt({ name: "AES-CBC", iv }, secret, stringToArrayBuffer(atob(base64value)))
)
)
);
} }
...@@ -55,7 +55,7 @@ export default class XferChannel { ...@@ -55,7 +55,7 @@ export default class XferChannel {
data.profile = { ...this.store.state.profile }; data.profile = { ...this.store.state.profile };
} }
this.generatePublicKeyAndEncryptedObject(incoming.public_key).then( generatePublicKeyAndEncryptedObject(incoming.public_key, data).then(
({ publicKeyString, encryptedData }) => { ({ publicKeyString, encryptedData }) => {
const payload = { const payload = {
target_session_id: incoming.reply_to_session_id, target_session_id: incoming.reply_to_session_id,
...@@ -118,7 +118,7 @@ export default class XferChannel { ...@@ -118,7 +118,7 @@ export default class XferChannel {
finished = true; finished = true;
channel.leave(); channel.leave();
this.decryptObject(payload.public_key, privateKey, payload.data).then(resolve); decryptObject(payload.public_key, privateKey, payload.data).then(resolve);
}); });
channel.join().receive("error", r => console.error(r)); channel.join().receive("error", r => console.error(r));
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment