fixed bug when open sender's encrypted data
This commit is contained in:
parent
4ee9833314
commit
27843d8970
@ -98,7 +98,6 @@ export const encryptData = ({ data64, recipientPublicKey }) => {
|
|||||||
recipientPublicKey
|
recipientPublicKey
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.log({ error })
|
|
||||||
throw new Error("Error in encrypting data")
|
throw new Error("Error in encrypting data")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -156,14 +155,16 @@ export const encryptDataGroup = ({ data64, publicKeys }) => {
|
|||||||
|
|
||||||
encryptedKeys.push(encryptedKey);
|
encryptedKeys.push(encryptedKey);
|
||||||
});
|
});
|
||||||
|
|
||||||
const str = "qortalGroupEncryptedData";
|
const str = "qortalGroupEncryptedData";
|
||||||
const strEncoder = new TextEncoder();
|
const strEncoder = new TextEncoder();
|
||||||
const strUint8Array = strEncoder.encode(str);
|
const strUint8Array = strEncoder.encode(str);
|
||||||
|
|
||||||
|
// Convert sender's public key to Uint8Array and add to the message
|
||||||
|
const senderPublicKeyUint8Array = window.parent.Base58.decode(userPublicKey);
|
||||||
|
|
||||||
// Combine all data into a single Uint8Array.
|
// Combine all data into a single Uint8Array.
|
||||||
// Calculate size of combinedData
|
// Calculate size of combinedData
|
||||||
let combinedDataSize = strUint8Array.length + nonce.length + keyNonce.length + encryptedData.length + 4;
|
let combinedDataSize = strUint8Array.length + nonce.length + keyNonce.length + senderPublicKeyUint8Array.length + encryptedData.length + 4;
|
||||||
let encryptedKeysSize = 0;
|
let encryptedKeysSize = 0;
|
||||||
|
|
||||||
encryptedKeys.forEach((key) => {
|
encryptedKeys.forEach((key) => {
|
||||||
@ -177,10 +178,11 @@ export const encryptDataGroup = ({ data64, publicKeys }) => {
|
|||||||
combinedData.set(strUint8Array);
|
combinedData.set(strUint8Array);
|
||||||
combinedData.set(nonce, strUint8Array.length);
|
combinedData.set(nonce, strUint8Array.length);
|
||||||
combinedData.set(keyNonce, strUint8Array.length + nonce.length);
|
combinedData.set(keyNonce, strUint8Array.length + nonce.length);
|
||||||
combinedData.set(encryptedData, strUint8Array.length + nonce.length + keyNonce.length);
|
combinedData.set(senderPublicKeyUint8Array, strUint8Array.length + nonce.length + keyNonce.length);
|
||||||
|
combinedData.set(encryptedData, strUint8Array.length + nonce.length + keyNonce.length + senderPublicKeyUint8Array.length);
|
||||||
|
|
||||||
// Initialize offset for encryptedKeys
|
// Initialize offset for encryptedKeys
|
||||||
let encryptedKeysOffset = strUint8Array.length + nonce.length + encryptedData.length + keyNonce.length;
|
let encryptedKeysOffset = strUint8Array.length + nonce.length + keyNonce.length + senderPublicKeyUint8Array.length + encryptedData.length;
|
||||||
encryptedKeys.forEach((key) => {
|
encryptedKeys.forEach((key) => {
|
||||||
combinedData.set(key, encryptedKeysOffset);
|
combinedData.set(key, encryptedKeysOffset);
|
||||||
encryptedKeysOffset += key.length;
|
encryptedKeysOffset += key.length;
|
||||||
@ -261,13 +263,18 @@ export function decryptGroupData(data64EncryptedData) {
|
|||||||
const keyNonceEndPosition = keyNonceStartPosition + 24; // Nonce is 24 bytes
|
const keyNonceEndPosition = keyNonceStartPosition + 24; // Nonce is 24 bytes
|
||||||
const keyNonce = allCombined.slice(keyNonceStartPosition, keyNonceEndPosition);
|
const keyNonce = allCombined.slice(keyNonceStartPosition, keyNonceEndPosition);
|
||||||
|
|
||||||
|
// Extract the sender's public key
|
||||||
|
const senderPublicKeyStartPosition = keyNonceEndPosition;
|
||||||
|
const senderPublicKeyEndPosition = senderPublicKeyStartPosition + 32; // Public keys are 32 bytes
|
||||||
|
const senderPublicKey = allCombined.slice(senderPublicKeyStartPosition, senderPublicKeyEndPosition);
|
||||||
|
|
||||||
// Calculate count first
|
// Calculate count first
|
||||||
const countStartPosition = allCombined.length - 4; // 4 bytes before the end, since count is stored in Uint32 (4 bytes)
|
const countStartPosition = allCombined.length - 4; // 4 bytes before the end, since count is stored in Uint32 (4 bytes)
|
||||||
const countArray = allCombined.slice(countStartPosition, countStartPosition + 4);
|
const countArray = allCombined.slice(countStartPosition, countStartPosition + 4);
|
||||||
const count = new Uint32Array(countArray.buffer)[0];
|
const count = new Uint32Array(countArray.buffer)[0];
|
||||||
|
|
||||||
// Then use count to calculate encryptedData
|
// Then use count to calculate encryptedData
|
||||||
const encryptedDataStartPosition = keyNonceEndPosition; // start position of encryptedData
|
const encryptedDataStartPosition = senderPublicKeyEndPosition; // start position of encryptedData
|
||||||
const encryptedDataEndPosition = allCombined.length - ((count * (32 + 16)) + 4);
|
const encryptedDataEndPosition = allCombined.length - ((count * (32 + 16)) + 4);
|
||||||
const encryptedData = allCombined.slice(encryptedDataStartPosition, encryptedDataEndPosition);
|
const encryptedData = allCombined.slice(encryptedDataStartPosition, encryptedDataEndPosition);
|
||||||
|
|
||||||
@ -275,20 +282,21 @@ export function decryptGroupData(data64EncryptedData) {
|
|||||||
// 32+16 = 48
|
// 32+16 = 48
|
||||||
const combinedKeys = allCombined.slice(encryptedDataEndPosition, encryptedDataEndPosition + (count * 48));
|
const combinedKeys = allCombined.slice(encryptedDataEndPosition, encryptedDataEndPosition + (count * 48));
|
||||||
const privateKey = window.parent.reduxStore.getState().app.selectedAddress.keyPair.privateKey
|
const privateKey = window.parent.reduxStore.getState().app.selectedAddress.keyPair.privateKey
|
||||||
const publicKey = window.parent.reduxStore.getState().app.selectedAddress.keyPair.publicKey
|
|
||||||
|
|
||||||
if (!privateKey || !publicKey) {
|
if (!privateKey) {
|
||||||
throw new Error("Unable to retrieve keys")
|
throw new Error("Unable to retrieve keys")
|
||||||
}
|
}
|
||||||
|
|
||||||
const convertedPrivateKey = ed2curve.convertSecretKey(privateKey)
|
const convertedPrivateKey = ed2curve.convertSecretKey(privateKey)
|
||||||
const convertedPublicKey = ed2curve.convertPublicKey(publicKey)
|
const convertedSenderPublicKey = ed2curve.convertPublicKey(senderPublicKey)
|
||||||
const sharedSecret = new Uint8Array(32)
|
const sharedSecret = new Uint8Array(32)
|
||||||
nacl.lowlevel.crypto_scalarmult(sharedSecret, convertedPrivateKey, convertedPublicKey)
|
nacl.lowlevel.crypto_scalarmult(sharedSecret, convertedPrivateKey, convertedSenderPublicKey)
|
||||||
for (let i = 0; i < count; i++) {
|
for (let i = 0; i < count; i++) {
|
||||||
const encryptedKey = combinedKeys.slice(i * 48, (i + 1) * 48);
|
const encryptedKey = combinedKeys.slice(i * 48, (i + 1) * 48);
|
||||||
|
|
||||||
// Decrypt the symmetric key.
|
// Decrypt the symmetric key.
|
||||||
const decryptedKey = nacl.secretbox.open(encryptedKey, keyNonce, sharedSecret);
|
const decryptedKey = nacl.secretbox.open(encryptedKey, keyNonce, sharedSecret);
|
||||||
|
|
||||||
// If decryption was successful, decryptedKey will not be null.
|
// If decryption was successful, decryptedKey will not be null.
|
||||||
if (decryptedKey) {
|
if (decryptedKey) {
|
||||||
// Decrypt the data using the symmetric key.
|
// Decrypt the data using the symmetric key.
|
||||||
@ -296,15 +304,11 @@ export function decryptGroupData(data64EncryptedData) {
|
|||||||
|
|
||||||
// If decryption was successful, decryptedData will not be null.
|
// If decryption was successful, decryptedData will not be null.
|
||||||
if (decryptedData) {
|
if (decryptedData) {
|
||||||
console.log({ decryptedData })
|
|
||||||
return decryptedData
|
|
||||||
|
|
||||||
|
return decryptedData
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!response) {
|
throw new Error("Unable to decrypt data")
|
||||||
throw new Erorr("Unable to decrypt data")
|
}
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user