public function InMemoryIdentityKeyStore() { $this->trustedKeys = []; $identityKeyPairKeys = Curve::generateKeyPair(); $this->identityKeyPair = new IdentityKeyPair(new IdentityKey($identityKeyPairKeys->getPublicKey()), $identityKeyPairKeys->getPrivateKey()); $this->localRegistrationId = KeyHelper::generateRegistrationId(); }
public function getOrCreateChainKey($sessionState, $ECPublicKey_theirEphemeral) { $theirEphemeral = $ECPublicKey_theirEphemeral; if ($sessionState->hasReceiverChain($theirEphemeral)) { return $sessionState->getReceiverChainKey($theirEphemeral); } else { $rootKey = $sessionState->getRootKey(); $ourEphemeral = $sessionState->getSenderRatchetKeyPair(); $receiverChain = $rootKey->createChain($theirEphemeral, $ourEphemeral); $ourNewEphemeral = Curve::generateKeyPair(); $senderChain = $receiverChain[0]->createChain($theirEphemeral, $ourNewEphemeral); $sessionState->setRootKey($senderChain[0]); $sessionState->addReceiverChain($theirEphemeral, $receiverChain[1]); $sessionState->setPreviousCounter(max($sessionState->getSenderChainKey()->getIndex() - 1, 0)); $sessionState->setSenderChain($ourNewEphemeral, $senderChain[1]); return $receiverChain[1]; } }
public static function generateSenderSigningKey() { return Curve::generateKeyPair(); }
public function processInitKeyExchangeMessage() { try { $sequence = KeyHelper::getRandomSequence(65534) + 1; $flags = KeyExchangeMessage::INITIATE_FLAG; $baseKey = Curve::generateKeyPair(); $ratchetKey = Curve::generateKeyPair(); $identityKey = $this->identityKeyStore->getIdentityKeyPair(); $baseKeySignature = Curve::calculateSignature($identityKey->getPrivateKey(), $baseKey->getPublicKey()->serialize()); $sessionRecord = $this->sessionStore->loadSession($this->recipientId, $this->deviceId); $sessionRecord->getSessionState()->setPendingKeyExchange($sequence, $baseKey, $ratchetKey, $identityKey); $this->sessionStore->storeSession($this->recipientId, $this->deviceId, $sessionRecord); return new KeyExchangeMessage(2, $sequence, $flags, $baseKey->getPublicKey(), $baseKeySignature, $ratchetKey->getPublicKey(), $identityKey->getPublicKey()); } catch (InvalidKeyException $ex) { throw new Exception($ex->getMessage()); } }
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); }