public function InMemoryIdentityKeyStore()
 {
     $this->trustedKeys = [];
     $identityKeyPairKeys = Curve::generateKeyPair();
     $this->identityKeyPair = new IdentityKeyPair(new IdentityKey($identityKeyPairKeys->getPublicKey()), $identityKeyPairKeys->getPrivateKey());
     $this->localRegistrationId = KeyHelper::generateRegistrationId();
 }
Example #2
0
 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];
     }
 }
Example #3
0
 public static function generateSenderSigningKey()
 {
     return Curve::generateKeyPair();
 }
Example #4
0
 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());
     }
 }
Example #5
0
 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);
 }