diff --git a/lib/utils/crypto-utils.js b/lib/utils/crypto-utils.js --- a/lib/utils/crypto-utils.js +++ b/lib/utils/crypto-utils.js @@ -110,9 +110,70 @@ } } +async function createOlmSessionWithPeer( + authMetadata: AuthMetadata, + identityClient: IdentityServiceClient, + sendMessage: (message: TunnelbrokerClientMessageToDevice) => Promise, + userID: string, + deviceID: string, +): Promise { + const { olmAPI } = getConfig(); + await olmAPI.initializeCryptoAccount(); + + const { + userID: authUserID, + deviceID: authDeviceID, + accessToken, + } = authMetadata; + if (!authUserID || !authDeviceID || !accessToken) { + throw new Error('CommServicesAuthMetadata is missing'); + } + + const keysResponse = await identityClient.getOutboundKeysForUser(userID); + const deviceKeysResponse = keysResponse.find( + keys => keys.deviceID === deviceID, + ); + if (!deviceKeysResponse || !deviceKeysResponse.keys) { + throw new Error(`Keys missing for device ${deviceID}`); + } + const { keys } = deviceKeysResponse; + + const { primaryIdentityPublicKeys } = keys.identityKeysBlob; + const recipientDeviceID = primaryIdentityPublicKeys.ed25519; + + if (!keys.contentInitializationInfo.oneTimeKey) { + throw new Error(`One-time key is missing for device ${recipientDeviceID}`); + } + + const { sessionVersion, encryptedData } = + await olmAPI.contentOutboundSessionCreator( + primaryIdentityPublicKeys, + keys.contentInitializationInfo, + ); + + const sessionCreationMessage: OutboundSessionCreation = { + type: peerToPeerMessageTypes.OUTBOUND_SESSION_CREATION, + senderInfo: { + userID: authUserID, + deviceID: authDeviceID, + }, + encryptedData, + sessionVersion, + }; + + await sendMessage({ + deviceID: recipientDeviceID, + payload: JSON.stringify(sessionCreationMessage), + }); + console.log( + `Request to create a session with device ${recipientDeviceID} sent.`, + ); +} + export { signedIdentityKeysBlobValidator, identityKeysBlobValidator, getContentSigningKey, createOlmSessionsWithOwnDevices, + createOlmSessionWithPeer, };