diff --git a/native/handlers/peer-to-peer-message-handler.js b/native/handlers/peer-to-peer-message-handler.js --- a/native/handlers/peer-to-peer-message-handler.js +++ b/native/handlers/peer-to-peer-message-handler.js @@ -5,6 +5,7 @@ peerToPeerMessageTypes, } from 'lib/types/tunnelbroker/peer-to-peer-message-types.js'; +import { commCoreModule } from '../native-modules.js'; import { nativeInboundContentSessionCreator } from '../utils/crypto-utils.js'; async function peerToPeerMessageHandler( @@ -24,7 +25,21 @@ ); } } else if (message.type === peerToPeerMessageTypes.ENCRYPTED_MESSAGE) { - console.log('Received encrypted message'); + try { + const decrypted = await commCoreModule.decrypt( + message.encryptedContent, + message.senderInfo.deviceID, + ); + console.log( + 'Decrypted message from device ' + + `${message.senderInfo.deviceID}: ${decrypted}`, + ); + } catch (e) { + console.log( + 'Error decrypting message from device ' + + `${message.senderInfo.deviceID}: ${e.message}`, + ); + } } } diff --git a/native/profile/tunnelbroker-menu.react.js b/native/profile/tunnelbroker-menu.react.js --- a/native/profile/tunnelbroker-menu.react.js +++ b/native/profile/tunnelbroker-menu.react.js @@ -7,13 +7,22 @@ import { useTunnelbroker } from 'lib/tunnelbroker/tunnelbroker-context.js'; import type { TunnelbrokerMessage } from 'lib/types/tunnelbroker/messages.js'; +import { + type EncryptedMessage, + peerToPeerMessageTypes, +} from 'lib/types/tunnelbroker/peer-to-peer-message-types.js'; import type { ProfileNavigationProp } from './profile.react.js'; import Button from '../components/button.react.js'; import TextInput from '../components/text-input.react.js'; +import { commCoreModule } from '../native-modules.js'; import type { NavigationRoute } from '../navigation/route-names.js'; +import { useSelector } from '../redux/redux-utils.js'; import { useColors, useStyles } from '../themes/colors.js'; -import { createOlmSessionsWithOwnDevices } from '../utils/crypto-utils.js'; +import { + createOlmSessionsWithOwnDevices, + getContentSigningKey, +} from '../utils/crypto-utils.js'; type Props = { +navigation: ProfileNavigationProp<'TunnelbrokerMenu'>, @@ -23,6 +32,9 @@ function TunnelbrokerMenu(props: Props): React.Node { const styles = useStyles(unboundStyles); const colors = useColors(); + const currentUserID = useSelector( + state => state.currentUserInfo && state.currentUserInfo.id, + ); const { connected, addListener, sendMessage, removeListener } = useTunnelbroker(); @@ -56,6 +68,33 @@ } }, [sendMessage]); + const onSendEncryptedMessage = React.useCallback(async () => { + try { + if (!currentUserID) { + return; + } + const encrypted = await commCoreModule.encrypt( + `Encrypted message to ${recipient}`, + recipient, + ); + const deviceID = await getContentSigningKey(); + const encryptedMessage: EncryptedMessage = { + type: peerToPeerMessageTypes.ENCRYPTED_MESSAGE, + senderInfo: { + deviceID, + userID: currentUserID, + }, + encryptedContent: encrypted, + }; + await sendMessage({ + deviceID: recipient, + payload: JSON.stringify(encryptedMessage), + }); + } catch (e) { + console.log(`Error sending encrypted content to device: ${e.message}`); + } + }, [currentUserID, recipient, sendMessage]); + return ( + MESSAGES