You are here

public static function ParagonIE_Sodium_Compat::crypto_kx_client_session_keys in Automatic Updates 7

Same name and namespace in other branches
  1. 8 vendor/paragonie/sodium_compat/src/Compat.php \ParagonIE_Sodium_Compat::crypto_kx_client_session_keys()

Parameters

string $keypair:

string $serverPublicKey:

Return value

array{0: string, 1: string}

Throws

SodiumException

1 call to ParagonIE_Sodium_Compat::crypto_kx_client_session_keys()
php72compat.php in vendor/paragonie/sodium_compat/lib/php72compat.php

File

vendor/paragonie/sodium_compat/src/Compat.php, line 1790

Class

ParagonIE_Sodium_Compat

Code

public static function crypto_kx_client_session_keys($keypair, $serverPublicKey) {
  ParagonIE_Sodium_Core_Util::declareScalarType($keypair, 'string', 1);
  ParagonIE_Sodium_Core_Util::declareScalarType($serverPublicKey, 'string', 2);
  $keypair = (string) $keypair;
  $serverPublicKey = (string) $serverPublicKey;
  if (ParagonIE_Sodium_Core_Util::strlen($keypair) !== self::CRYPTO_KX_KEYPAIRBYTES) {
    throw new SodiumException('keypair should be SODIUM_CRYPTO_KX_KEYPAIRBYTES bytes');
  }
  if (ParagonIE_Sodium_Core_Util::strlen($serverPublicKey) !== self::CRYPTO_KX_PUBLICKEYBYTES) {
    throw new SodiumException('public keys must be SODIUM_CRYPTO_KX_PUBLICKEYBYTES bytes');
  }
  $sk = self::crypto_kx_secretkey($keypair);
  $pk = self::crypto_kx_publickey($keypair);
  $h = self::crypto_generichash_init(null, self::CRYPTO_KX_SESSIONKEYBYTES * 2);
  self::crypto_generichash_update($h, self::crypto_scalarmult($sk, $serverPublicKey));
  self::crypto_generichash_update($h, $pk);
  self::crypto_generichash_update($h, $serverPublicKey);
  $sessionKeys = self::crypto_generichash_final($h, self::CRYPTO_KX_SESSIONKEYBYTES * 2);
  return array(
    ParagonIE_Sodium_Core_Util::substr($sessionKeys, 0, self::CRYPTO_KX_SESSIONKEYBYTES),
    ParagonIE_Sodium_Core_Util::substr($sessionKeys, self::CRYPTO_KX_SESSIONKEYBYTES, self::CRYPTO_KX_SESSIONKEYBYTES),
  );
}