| 
<?phpdeclare(strict_types=1);
 namespace ParagonIE\EasyECC\Integration;
 use Defuse\Crypto\Crypto;
 use Defuse\Crypto\Encoding;
 use Defuse\Crypto\Exception\BadFormatException;
 use Defuse\Crypto\Exception\EnvironmentIsBrokenException;
 use Defuse\Crypto\Exception\WrongKeyOrModifiedCiphertextException;
 use Defuse\Crypto\Key;
 use Mdanter\Ecc\Crypto\Key\PrivateKeyInterface;
 use Mdanter\Ecc\Crypto\Key\PublicKeyInterface;
 use ParagonIE\ConstantTime\Base64UrlSafe;
 use ParagonIE\EasyECC\EasyECC;
 
 /**
 * Class Defuse
 * @package ParagonIE\EasyECC\Integration
 */
 class Defuse
 {
 /** @var EasyECC $ecc */
 protected $ecc;
 
 /**
 * Defuse constructor.
 * @param EasyECC $ecc
 */
 public function __construct(EasyECC $ecc)
 {
 $this->ecc = $ecc;
 }
 
 /**
 * @param PrivateKeyInterface $private
 * @param PublicKeyInterface $public
 * @param bool $isClient
 * @return Key
 *
 * @throws \Defuse\Crypto\Exception\BadFormatException
 * @throws \Defuse\Crypto\Exception\EnvironmentIsBrokenException
 * @throws \SodiumException
 * @throws \TypeError
 */
 public function keyExchange(
 PrivateKeyInterface $private,
 PublicKeyInterface $public,
 bool $isClient
 ): Key {
 return Key::loadFromAsciiSafeString(
 Encoding::saveBytesToChecksummedAsciiSafeString(
 Key::KEY_CURRENT_VERSION,
 $this->ecc->keyExchange($private, $public, $isClient, 'sha256')
 )
 );
 }
 
 /**
 * @param string $message
 * @param PrivateKeyInterface $privateKey
 * @param PublicKeyInterface $publicKey
 * @return string
 *
 * @throws EnvironmentIsBrokenException
 * @throws BadFormatException
 * @throws \SodiumException
 * @throws \TypeError
 */
 public function asymmetricEncrypt(
 string $message,
 PrivateKeyInterface $privateKey,
 PublicKeyInterface $publicKey
 ): string {
 return $this->symmetricEncrypt(
 $message,
 $this->keyExchange($privateKey, $publicKey, true)
 );
 }
 
 /**
 * @param string $message
 * @param PrivateKeyInterface $privateKey
 * @param PublicKeyInterface $publicKey
 * @return string
 *
 * @throws EnvironmentIsBrokenException
 * @throws WrongKeyOrModifiedCiphertextException
 * @throws BadFormatException
 * @throws \SodiumException
 * @throws \TypeError
 */
 public function asymmetricDecrypt(
 string $message,
 PrivateKeyInterface $privateKey,
 PublicKeyInterface $publicKey
 ): string {
 return $this->symmetricDecrypt(
 $message,
 $this->keyExchange($privateKey, $publicKey, false)
 );
 }
 
 /**
 * @param string $message
 * @param Key $key
 * @return string
 *
 * @throws EnvironmentIsBrokenException
 */
 public function symmetricEncrypt(string $message, Key $key): string
 {
 return Base64UrlSafe::encode(
 Crypto::encrypt($message, $key, true)
 );
 }
 
 /**
 * @param string $message
 * @param Key $key
 * @return string
 *
 * @throws EnvironmentIsBrokenException
 * @throws WrongKeyOrModifiedCiphertextException
 * @throws \TypeError
 */
 public function symmetricDecrypt(string $message, Key $key): string
 {
 return Crypto::decrypt(
 Base64UrlSafe::decode($message),
 $key,
 true
 );
 }
 }
 
 |