public function processV3($sessionRecord, $message) { /* :param sessionRecord: :param message: :type message: PreKeyWhisperMessage :return: */ if ($sessionRecord->hasSessionState($message->getMessageVersion(), $message->getBaseKey()->serialize())) { Log::warn('v3', "We've already setup a session for this V3 message, letting bundled message fall through..."); return; } $ourSignedPreKey = $this->signedPreKeyStore->loadSignedPreKey($message->getSignedPreKeyId())->getKeyPair(); $parameters = new BobBuilder(); $parameters->setTheirBaseKey($message->getBaseKey())->setTheirIdentityKey($message->getIdentityKey())->setOurIdentityKey($this->identityKeyStore->getIdentityKeyPair())->setOurSignedPreKey($ourSignedPreKey)->setOurRatchetKey($ourSignedPreKey); if ($message->getPreKeyId() != null) { $parameters->setOurOneTimePreKey($this->preKeyStore->loadPreKey($message->getPreKeyId())->getKeyPair()); } else { $parameters->setOurOneTimePreKey(null); } if (!$sessionRecord->isFresh()) { $sessionRecord->archiveCurrentState(); } RatchetingSession::initializeSessionAsBob($sessionRecord->getSessionState(), $message->getMessageVersion(), $parameters->create()); $sessionRecord->getSessionState()->setLocalRegistrationId($this->identityKeyStore->getLocalRegistrationId()); $sessionRecord->getSessionState()->setRemoteRegistrationId($message->getRegistrationId()); $sessionRecord->getSessionState()->setAliceBaseKey($message->getBaseKey()->serialize()); if ($message->getPreKeyId() != null && $message->getPreKeyId() != Medium::MAX_VALUE) { return $message->getPreKeyId(); } else { return; } }
protected function initializeSessionsV3($aliceSessionState, $bobSessionState) { $aliceIdentityKeyPair = Curve::generateKeyPair(); $aliceIdentityKey = new IdentityKeyPair(new IdentityKey($aliceIdentityKeyPair->getPublicKey()), $aliceIdentityKeyPair->getPrivateKey()); $aliceBaseKey = Curve::generateKeyPair(); $aliceEphemeralKey = Curve::generateKeyPair(); $alicePreKey = $aliceBaseKey; $bobIdentityKeyPair = Curve::generateKeyPair(); $bobIdentityKey = new IdentityKeyPair(new IdentityKey($bobIdentityKeyPair->getPublicKey()), $bobIdentityKeyPair->getPrivateKey()); $bobBaseKey = Curve::generateKeyPair(); $bobEphemeralKey = $bobBaseKey; $bobPreKey = Curve::generateKeyPair(); $aliceParameters = AliceAxolotlParameters::newBuilder()->setOurBaseKey($aliceBaseKey)->setOurIdentityKey($aliceIdentityKey)->setTheirOneTimePreKey(null)->setTheirRatchetKey($bobEphemeralKey->getPublicKey())->setTheirSignedPreKey($bobBaseKey->getPublicKey())->setTheirIdentityKey($bobIdentityKey->getPublicKey())->create(); $bobParameters = BobAxolotlParameters::newBuilder()->setOurRatchetKey($bobEphemeralKey)->setOurSignedPreKey($bobBaseKey)->setOurOneTimePreKey(null)->setOurIdentityKey($bobIdentityKey)->setTheirIdentityKey($aliceIdentityKey->getPublicKey())->setTheirBaseKey($aliceBaseKey->getPublicKey())->create(); RatchetingSession::initializeSessionAsAlice($aliceSessionState, 3, $aliceParameters); RatchetingSession::initializeSessionAsBob($bobSessionState, 3, $bobParameters); }