Page MenuHomePhabricator

D11233.id38335.diff
No OneTemporary

D11233.id38335.diff

diff --git a/native/cpp/CommonCpp/CryptoTools/CryptoModule.h b/native/cpp/CommonCpp/CryptoTools/CryptoModule.h
--- a/native/cpp/CommonCpp/CryptoTools/CryptoModule.h
+++ b/native/cpp/CommonCpp/CryptoTools/CryptoModule.h
@@ -67,6 +67,7 @@
const OlmBuffer &oneTimeKey);
bool hasSessionFor(const std::string &targetDeviceId);
std::shared_ptr<Session> getSessionByDeviceId(const std::string &deviceId);
+ void removeSessionByDeviceId(const std::string &deviceId);
Persist storeAsB64(const std::string &secretKey);
void restoreFromB64(const std::string &secretKey, Persist persist);
diff --git a/native/cpp/CommonCpp/CryptoTools/CryptoModule.cpp b/native/cpp/CommonCpp/CryptoTools/CryptoModule.cpp
--- a/native/cpp/CommonCpp/CryptoTools/CryptoModule.cpp
+++ b/native/cpp/CommonCpp/CryptoTools/CryptoModule.cpp
@@ -309,6 +309,10 @@
return this->sessions.at(deviceId);
}
+void CryptoModule::removeSessionByDeviceId(const std::string &deviceId) {
+ this->sessions.erase(deviceId);
+}
+
Persist CryptoModule::storeAsB64(const std::string &secretKey) {
Persist persist;
size_t accountPickleLength =
@@ -355,11 +359,8 @@
std::unordered_map<std::string, OlmBuffer>::iterator it;
for (it = persist.sessions.begin(); it != persist.sessions.end(); ++it) {
- std::unique_ptr<Session> session = session->restoreFromB64(
- this->getOlmAccount(),
- this->keys.identityKeys.data(),
- secretKey,
- it->second);
+ std::unique_ptr<Session> session =
+ session->restoreFromB64(secretKey, it->second);
this->sessions.insert(make_pair(it->first, move(session)));
}
}
@@ -398,48 +399,7 @@
if (!this->hasSessionFor(targetDeviceId)) {
throw std::runtime_error{"error decrypt => uninitialized session"};
}
- OlmSession *session = this->sessions.at(targetDeviceId)->getOlmSession();
-
- OlmBuffer utilityBuffer(::olm_utility_size());
- OlmUtility *olmUtility = ::olm_utility(utilityBuffer.data());
-
- OlmBuffer messageHashBuffer(::olm_sha256_length(olmUtility));
- ::olm_sha256(
- olmUtility,
- encryptedData.message.data(),
- encryptedData.message.size(),
- messageHashBuffer.data(),
- messageHashBuffer.size());
-
- OlmBuffer tmpEncryptedMessage(encryptedData.message);
- size_t maxSize = ::olm_decrypt_max_plaintext_length(
- session,
- encryptedData.messageType,
- tmpEncryptedMessage.data(),
- tmpEncryptedMessage.size());
-
- if (maxSize == -1) {
- throw std::runtime_error{
- "error decrypt_max_plaintext_length => " +
- std::string{::olm_session_last_error(session)} + ". Hash: " +
- std::string{messageHashBuffer.begin(), messageHashBuffer.end()}};
- }
-
- OlmBuffer decryptedMessage(maxSize);
- size_t decryptedSize = ::olm_decrypt(
- session,
- encryptedData.messageType,
- encryptedData.message.data(),
- encryptedData.message.size(),
- decryptedMessage.data(),
- decryptedMessage.size());
- if (decryptedSize == -1) {
- throw std::runtime_error{
- "error decrypt => " + std::string{::olm_session_last_error(session)} +
- ". Hash: " +
- std::string{messageHashBuffer.begin(), messageHashBuffer.end()}};
- }
- return std::string{(char *)decryptedMessage.data(), decryptedSize};
+ return this->sessions.at(targetDeviceId)->decrypt(encryptedData);
}
std::string CryptoModule::signMessage(const std::string &message) {
diff --git a/native/cpp/CommonCpp/CryptoTools/Session.h b/native/cpp/CommonCpp/CryptoTools/Session.h
--- a/native/cpp/CommonCpp/CryptoTools/Session.h
+++ b/native/cpp/CommonCpp/CryptoTools/Session.h
@@ -11,15 +11,8 @@
namespace crypto {
class Session {
- OlmAccount *ownerUserAccount;
- std::uint8_t *ownerIdentityKeys;
-
OlmBuffer olmSessionBuffer;
- Session(OlmAccount *account, std::uint8_t *ownerIdentityKeys)
- : ownerUserAccount(account), ownerIdentityKeys(ownerIdentityKeys) {
- }
-
public:
static std::unique_ptr<Session> createSessionAsInitializer(
OlmAccount *account,
@@ -34,12 +27,10 @@
const OlmBuffer &encryptedMessage,
const OlmBuffer &idKeys);
OlmBuffer storeAsB64(const std::string &secretKey);
- static std::unique_ptr<Session> restoreFromB64(
- OlmAccount *account,
- std::uint8_t *ownerIdentityKeys,
- const std::string &secretKey,
- OlmBuffer &b64);
+ static std::unique_ptr<Session>
+ restoreFromB64(const std::string &secretKey, OlmBuffer &b64);
OlmSession *getOlmSession();
+ std::string decrypt(EncryptedData &encryptedData);
};
} // namespace crypto
diff --git a/native/cpp/CommonCpp/CryptoTools/Session.cpp b/native/cpp/CommonCpp/CryptoTools/Session.cpp
--- a/native/cpp/CommonCpp/CryptoTools/Session.cpp
+++ b/native/cpp/CommonCpp/CryptoTools/Session.cpp
@@ -17,7 +17,7 @@
const OlmBuffer &preKeys,
const OlmBuffer &preKeySignature,
const OlmBuffer &oneTimeKey) {
- std::unique_ptr<Session> session(new Session(account, ownerIdentityKeys));
+ std::unique_ptr<Session> session(new Session());
session->olmSessionBuffer.resize(::olm_session_size());
::olm_session(session->olmSessionBuffer.data());
@@ -30,7 +30,7 @@
if (-1 ==
::olm_create_outbound_session(
session->getOlmSession(),
- session->ownerUserAccount,
+ account,
idKeys.data() + ID_KEYS_PREFIX_OFFSET,
KEYSIZE,
idKeys.data() + SIGNING_KEYS_PREFIX_OFFSET,
@@ -55,7 +55,7 @@
std::uint8_t *ownerIdentityKeys,
const OlmBuffer &encryptedMessage,
const OlmBuffer &idKeys) {
- std::unique_ptr<Session> session(new Session(account, ownerIdentityKeys));
+ std::unique_ptr<Session> session(new Session());
OlmBuffer tmpEncryptedMessage(encryptedMessage);
session->olmSessionBuffer.resize(::olm_session_size());
@@ -63,7 +63,7 @@
if (-1 ==
::olm_create_inbound_session(
session->getOlmSession(),
- session->ownerUserAccount,
+ account,
tmpEncryptedMessage.data(),
encryptedMessage.size())) {
throw std::runtime_error(
@@ -94,12 +94,9 @@
return pickle;
}
-std::unique_ptr<Session> Session::restoreFromB64(
- OlmAccount *account,
- std::uint8_t *ownerIdentityKeys,
- const std::string &secretKey,
- OlmBuffer &b64) {
- std::unique_ptr<Session> session(new Session(account, ownerIdentityKeys));
+std::unique_ptr<Session>
+Session::restoreFromB64(const std::string &secretKey, OlmBuffer &b64) {
+ std::unique_ptr<Session> session(new Session());
session->olmSessionBuffer.resize(::olm_session_size());
::olm_session(session->olmSessionBuffer.data());
@@ -115,5 +112,50 @@
return session;
}
+std::string Session::decrypt(EncryptedData &encryptedData) {
+ OlmSession *session = this->getOlmSession();
+
+ OlmBuffer utilityBuffer(::olm_utility_size());
+ OlmUtility *olmUtility = ::olm_utility(utilityBuffer.data());
+
+ OlmBuffer messageHashBuffer(::olm_sha256_length(olmUtility));
+ ::olm_sha256(
+ olmUtility,
+ encryptedData.message.data(),
+ encryptedData.message.size(),
+ messageHashBuffer.data(),
+ messageHashBuffer.size());
+
+ OlmBuffer tmpEncryptedMessage(encryptedData.message);
+ size_t maxSize = ::olm_decrypt_max_plaintext_length(
+ session,
+ encryptedData.messageType,
+ tmpEncryptedMessage.data(),
+ tmpEncryptedMessage.size());
+
+ if (maxSize == -1) {
+ throw std::runtime_error{
+ "error decrypt_max_plaintext_length => " +
+ std::string{::olm_session_last_error(session)} + ". Hash: " +
+ std::string{messageHashBuffer.begin(), messageHashBuffer.end()}};
+ }
+
+ OlmBuffer decryptedMessage(maxSize);
+ size_t decryptedSize = ::olm_decrypt(
+ session,
+ encryptedData.messageType,
+ encryptedData.message.data(),
+ encryptedData.message.size(),
+ decryptedMessage.data(),
+ decryptedMessage.size());
+ if (decryptedSize == -1) {
+ throw std::runtime_error{
+ "error decrypt => " + std::string{::olm_session_last_error(session)} +
+ ". Hash: " +
+ std::string{messageHashBuffer.begin(), messageHashBuffer.end()}};
+ }
+ return std::string{(char *)decryptedMessage.data(), decryptedSize};
+}
+
} // namespace crypto
} // namespace comm

File Metadata

Mime Type
text/plain
Expires
Fri, Nov 29, 8:17 PM (19 h, 35 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
2598030
Default Alt Text
D11233.id38335.diff (8 KB)

Event Timeline