diff --git a/native/cpp/CommonCpp/NativeModules/CommCoreModule.h b/native/cpp/CommonCpp/NativeModules/CommCoreModule.h --- a/native/cpp/CommonCpp/NativeModules/CommCoreModule.h +++ b/native/cpp/CommonCpp/NativeModules/CommCoreModule.h @@ -121,7 +121,7 @@ virtual jsi::Value initializeContentInboundSession( jsi::Runtime &rt, jsi::String identityKeys, - jsi::String encryptedMessage, + jsi::Object encryptedDataJSI, jsi::String deviceID) override; virtual jsi::Value encrypt(jsi::Runtime &rt, jsi::String message, jsi::String deviceID) override; diff --git a/native/cpp/CommonCpp/NativeModules/CommCoreModule.cpp b/native/cpp/CommonCpp/NativeModules/CommCoreModule.cpp --- a/native/cpp/CommonCpp/NativeModules/CommCoreModule.cpp +++ b/native/cpp/CommonCpp/NativeModules/CommCoreModule.cpp @@ -1122,7 +1122,7 @@ rt, [=](jsi::Runtime &innerRt, std::shared_ptr promise) { taskType job = [=, &innerRt]() { std::string error; - crypto::EncryptedData initialEncryptedMessage; + crypto::EncryptedData initialEncryptedData; try { this->contentCryptoModule->initializeOutboundForSendingSession( deviceIDCpp, @@ -1135,8 +1135,9 @@ oneTimeKeyCpp.begin(), oneTimeKeyCpp.end())); const std::string initMessage = "{\"type\": \"init\"}"; - initialEncryptedMessage = + initialEncryptedData = contentCryptoModule->encrypt(deviceIDCpp, initMessage); + this->persistCryptoModules(true, false); } catch (const std::exception &e) { error = e.what(); @@ -1146,11 +1147,18 @@ promise->reject(error); return; } - promise->resolve(jsi::String::createFromUtf8( + auto initialEncryptedDataJSI = jsi::Object(innerRt); + auto message = std::string{ + initialEncryptedData.message.begin(), + initialEncryptedData.message.end()}; + auto messageJSI = jsi::String::createFromUtf8(innerRt, message); + initialEncryptedDataJSI.setProperty(innerRt, "message", messageJSI); + initialEncryptedDataJSI.setProperty( innerRt, - std::string{ - initialEncryptedMessage.message.begin(), - initialEncryptedMessage.message.end()})); + "messageType", + static_cast(initialEncryptedData.messageType)); + + promise->resolve(std::move(initialEncryptedDataJSI)); }); }; this->cryptoThread->scheduleTask(job); @@ -1160,10 +1168,13 @@ jsi::Value CommCoreModule::initializeContentInboundSession( jsi::Runtime &rt, jsi::String identityKeys, - jsi::String encryptedMessage, + jsi::Object encryptedDataJSI, jsi::String deviceID) { auto identityKeysCpp{identityKeys.utf8(rt)}; - auto encryptedMessageCpp{encryptedMessage.utf8(rt)}; + size_t messageType = + std::lround(encryptedDataJSI.getProperty(rt, "messageType").asNumber()); + std::string encryptedMessageCpp = + encryptedDataJSI.getProperty(rt, "message").asString(rt).utf8(rt); auto deviceIDCpp{deviceID.utf8(rt)}; return createPromiseAsJSIValue( rt, [=](jsi::Runtime &innerRt, std::shared_ptr promise) { @@ -1177,8 +1188,10 @@ encryptedMessageCpp.begin(), encryptedMessageCpp.end()), std::vector( identityKeysCpp.begin(), identityKeysCpp.end())); - crypto::EncryptedData encryptedData{std::vector( - encryptedMessageCpp.begin(), encryptedMessageCpp.end())}; + crypto::EncryptedData encryptedData{ + std::vector( + encryptedMessageCpp.begin(), encryptedMessageCpp.end()), + messageType}; decryptedMessage = this->contentCryptoModule->decrypt(deviceIDCpp, encryptedData); this->persistCryptoModules(true, false); diff --git a/native/cpp/CommonCpp/_generated/commJSI-generated.cpp b/native/cpp/CommonCpp/_generated/commJSI-generated.cpp --- a/native/cpp/CommonCpp/_generated/commJSI-generated.cpp +++ b/native/cpp/CommonCpp/_generated/commJSI-generated.cpp @@ -103,7 +103,7 @@ return static_cast(&turboModule)->initializeContentOutboundSession(rt, args[0].asString(rt), args[1].asString(rt), args[2].asString(rt), args[3].asString(rt), args[4].asString(rt)); } static jsi::Value __hostFunction_CommCoreModuleSchemaCxxSpecJSI_initializeContentInboundSession(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { - return static_cast(&turboModule)->initializeContentInboundSession(rt, args[0].asString(rt), args[1].asString(rt), args[2].asString(rt)); + return static_cast(&turboModule)->initializeContentInboundSession(rt, args[0].asString(rt), args[1].asObject(rt), args[2].asString(rt)); } static jsi::Value __hostFunction_CommCoreModuleSchemaCxxSpecJSI_encrypt(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { return static_cast(&turboModule)->encrypt(rt, args[0].asString(rt), args[1].asString(rt)); diff --git a/native/cpp/CommonCpp/_generated/commJSI.h b/native/cpp/CommonCpp/_generated/commJSI.h --- a/native/cpp/CommonCpp/_generated/commJSI.h +++ b/native/cpp/CommonCpp/_generated/commJSI.h @@ -49,7 +49,7 @@ virtual jsi::Value removeKeyserverDataFromNotifStorage(jsi::Runtime &rt, jsi::Array keyserverIDsToDelete) = 0; virtual jsi::Value getKeyserverDataFromNotifStorage(jsi::Runtime &rt, jsi::Array keyserverIDs) = 0; virtual jsi::Value initializeContentOutboundSession(jsi::Runtime &rt, jsi::String identityKeys, jsi::String prekey, jsi::String prekeySignature, jsi::String oneTimeKey, jsi::String deviceID) = 0; - virtual jsi::Value initializeContentInboundSession(jsi::Runtime &rt, jsi::String identityKeys, jsi::String encryptedMessage, jsi::String deviceID) = 0; + virtual jsi::Value initializeContentInboundSession(jsi::Runtime &rt, jsi::String identityKeys, jsi::Object encryptedContent, jsi::String deviceID) = 0; virtual jsi::Value encrypt(jsi::Runtime &rt, jsi::String message, jsi::String deviceID) = 0; virtual jsi::Value decrypt(jsi::Runtime &rt, jsi::Object encryptedData, jsi::String deviceID) = 0; virtual jsi::Value signMessage(jsi::Runtime &rt, jsi::String message) = 0; @@ -327,13 +327,13 @@ return bridging::callFromJs( rt, &T::initializeContentOutboundSession, jsInvoker_, instance_, std::move(identityKeys), std::move(prekey), std::move(prekeySignature), std::move(oneTimeKey), std::move(deviceID)); } - jsi::Value initializeContentInboundSession(jsi::Runtime &rt, jsi::String identityKeys, jsi::String encryptedMessage, jsi::String deviceID) override { + jsi::Value initializeContentInboundSession(jsi::Runtime &rt, jsi::String identityKeys, jsi::Object encryptedContent, jsi::String deviceID) override { static_assert( bridging::getParameterCount(&T::initializeContentInboundSession) == 4, "Expected initializeContentInboundSession(...) to have 4 parameters"); return bridging::callFromJs( - rt, &T::initializeContentInboundSession, jsInvoker_, instance_, std::move(identityKeys), std::move(encryptedMessage), std::move(deviceID)); + rt, &T::initializeContentInboundSession, jsInvoker_, instance_, std::move(identityKeys), std::move(encryptedContent), std::move(deviceID)); } jsi::Value encrypt(jsi::Runtime &rt, jsi::String message, jsi::String deviceID) override { static_assert( diff --git a/native/crypto/olm-api.js b/native/crypto/olm-api.js --- a/native/crypto/olm-api.js +++ b/native/crypto/olm-api.js @@ -7,7 +7,6 @@ type OlmAPI, type OLMIdentityKeys, type EncryptedData, - olmEncryptedMessageTypes, } from 'lib/types/crypto-types.js'; import type { OlmSessionInitializationInfo } from 'lib/types/request-types.js'; @@ -30,7 +29,7 @@ }); return commCoreModule.initializeContentInboundSession( identityKeys, - initialEncryptedData.message, + initialEncryptedData, contentIdentityKeys.ed25519, ); }, @@ -44,17 +43,13 @@ ed25519: contentIdentityKeys.ed25519, }); - const message = await commCoreModule.initializeContentOutboundSession( + return commCoreModule.initializeContentOutboundSession( identityKeys, prekey, prekeySignature, oneTimeKey, contentIdentityKeys.ed25519, ); - return { - message, - messageType: olmEncryptedMessageTypes.PREKEY, - }; }, notificationsSessionCreator( cookie: ?string, diff --git a/native/schema/CommCoreModuleSchema.js b/native/schema/CommCoreModuleSchema.js --- a/native/schema/CommCoreModuleSchema.js +++ b/native/schema/CommCoreModuleSchema.js @@ -102,10 +102,10 @@ prekeySignature: string, oneTimeKey: string, deviceID: string, - ) => Promise; + ) => Promise; +initializeContentInboundSession: ( identityKeys: string, - encryptedMessage: string, + encryptedContent: Object, deviceID: string, ) => Promise; +encrypt: (message: string, deviceID: string) => Promise; @@ -148,6 +148,11 @@ backupID: string, ) => Promise; +decrypt: (encryptedData: EncryptedData, deviceID: string) => Promise; + +initializeContentInboundSession: ( + identityKeys: string, + encryptedContent: EncryptedData, + deviceID: string, + ) => Promise; } export default (TurboModuleRegistry.getEnforcing(