@@ -9,9 +9,12 @@ import {
99import SignalProtocolStore from './store' ;
1010import { CustomError } from './../utils/CustomError' ;
1111import {
12- AesEncryptToBase64 ,
12+ AesEncrypt ,
1313 generateKeyAndIv ,
14- base64ToWordArray
14+ base64ToWordArray ,
15+ wordArrayToByteArray ,
16+ wordArrayToBase64 ,
17+ byteArrayToWordArray
1518} from '../utils/AESUtils' ;
1619
1720const KeyHelper = libsignal . KeyHelper ;
@@ -199,6 +202,7 @@ const encryptPostEmail = async ({
199202 peer ,
200203 fileKeyParams
201204 ) ;
205+ const fileKey = criptextEmails [ 0 ] ? criptextEmails [ 0 ] . fileKey : null ;
202206
203207 const allExternalRecipients = [
204208 ...externalRecipients . to ,
@@ -207,7 +211,7 @@ const encryptPostEmail = async ({
207211 ] ;
208212 const hasExternalRecipients = allExternalRecipients . length > 0 ;
209213 const { session, encryptedBody } = externalEmailPassword . length
210- ? await encryptExternalEmail ( body , externalEmailPassword )
214+ ? await encryptExternalEmail ( body , externalEmailPassword , fileKey )
211215 : { session : null , encryptedBody : null } ;
212216
213217 const guestEmail = hasExternalRecipients
@@ -235,7 +239,7 @@ const encryptPostEmail = async ({
235239 return res ;
236240} ;
237241
238- const createDummyKeyBundle = async ( ) => {
242+ const createDummyKeyBundle = async fileKey => {
239243 const preKeyId = 1 ;
240244 const signedPreKeyId = 1 ;
241245 const { identityKey, registrationId } = await generateIdentity ( ) ;
@@ -252,6 +256,7 @@ const createDummyKeyBundle = async () => {
252256 signedPreKey
253257 } ;
254258 const dummySession = {
259+ fileKey,
255260 identityKey : {
256261 publicKey : util . toBase64 ( identityKey . pubKey ) ,
257262 privateKey : util . toBase64 ( identityKey . privKey )
@@ -295,10 +300,10 @@ const generatePreKeyBundle = async ({
295300 return { preKey, signedPreKey } ;
296301} ;
297302
298- const encryptExternalEmail = async ( body , password ) => {
303+ const encryptExternalEmail = async ( body , password , fileKey ) => {
299304 const recipient = password ;
300305 const deviceId = 1 ;
301- const { dummySession, sessionParams } = await createDummyKeyBundle ( ) ;
306+ const { dummySession, sessionParams } = await createDummyKeyBundle ( fileKey ) ;
302307 const keys = {
303308 preKey : {
304309 id : sessionParams . preKey . keyId ,
@@ -319,12 +324,26 @@ const encryptExternalEmail = async (body, password) => {
319324 ) ;
320325
321326 const saltLength = 8 ;
322- const keyLength = 128 / 32 ;
323- const { key, iv } = generateKeyAndIv ( password , saltLength , keyLength ) ;
324- const keyArray = base64ToWordArray ( key ) ;
325- const ivArray = base64ToWordArray ( iv ) ;
326- const sessionString = JSON . stringify ( dummySession ) ;
327- const session = AesEncryptToBase64 ( sessionString , keyArray , ivArray ) ;
327+ const { key, iv, salt } = generateKeyAndIv ( password , saltLength ) ;
328+ const saltWArray = base64ToWordArray ( salt ) ;
329+ const ivWArray = base64ToWordArray ( iv ) ;
330+ const keyWArray = base64ToWordArray ( key ) ;
331+
332+ const dummySessionString = JSON . stringify ( dummySession ) ;
333+ const encryptedSessionWArray = AesEncrypt (
334+ dummySessionString ,
335+ keyWArray ,
336+ ivWArray
337+ ) ;
338+ const saltBArray = wordArrayToByteArray ( saltWArray ) ;
339+ const ivBArray = wordArrayToByteArray ( ivWArray ) ;
340+ const encryptedSessionBArray = wordArrayToByteArray ( encryptedSessionWArray ) ;
341+ const sessionByteArray = saltBArray . concat (
342+ ivBArray . concat ( encryptedSessionBArray )
343+ ) ;
344+
345+ const sessionWordArray = byteArrayToWordArray ( sessionByteArray ) ;
346+ const session = wordArrayToBase64 ( sessionWordArray ) ;
328347 return {
329348 session,
330349 encryptedBody : encryptedBody . body
0 commit comments