| 
<?phpuse \ParagonIE\ConstantTime\Base64;
 use \ParagonIE\EasyRSA\EasyRSA;
 use \ParagonIE\EasyRSA\KeyPair;
 
 class EncryptionTest extends PHPUnit_Framework_TestCase
 {
 public function testEncrypt()
 {
 $keyPair = KeyPair::generateKeyPair(2048);
 $secretKey = $keyPair->getPrivateKey();
 $publicKey = $keyPair->getPublicKey();
 
 $plain = str_repeat(
 'This is a relatively long plaintext message, far longer than RSA could safely encrypt directly.' . "\n",
 mt_rand(128, 512)
 );
 $encrypt = EasyRSA::encrypt($plain, $publicKey);
 $decrypt = EasyRSA::decrypt($encrypt, $secretKey);
 
 $dissect = explode('$', $encrypt);
 $this->assertEquals(EasyRSA::VERSION_TAG, $dissect[0]);
 $this->assertEquals($decrypt, $plain);
 
 $size = strlen($plain);
 $size += 4;  // Header
 $size += 16; // IV
 $size += 32; // HHKF Salt
 $size += 32; // HMAC
 $this->assertEquals(
 strlen(Base64::decode($dissect[2])),
 $size
 );
 }
 
 public function testFailure()
 {
 try {
 KeyPair::generateKeyPair(1024);
 $this->fail('Accepts too small of a key size!');
 return;
 } catch (\Exception $ex) {
 $keyPair = KeyPair::generateKeyPair(2048);
 }
 $secretKey = $keyPair->getPrivateKey();
 $publicKey = $keyPair->getPublicKey();
 
 $plain = 'Short Message';
 $encrypt = EasyRSA::encrypt($plain, $publicKey);
 
 $dissect = explode('$', $encrypt);
 // Flip a bit in the key, randomly!
 $dissect[1] = base64_decode($dissect[1]);
 
 $l = mt_rand(0, strlen($dissect[1]) - 1);
 $dissect[1][$l] = \chr(
 \ord($dissect[1][$l]) ^ (1 << mt_rand(0, 7))
 );
 $dissect[1] = base64_encode($dissect[1]);
 try {
 EasyRSA::decrypt(implode('$', $dissect), $secretKey);
 $this->fail('Checksum collision or logic error.');
 return;
 } catch (\Exception $ex) {
 $this->assertInstanceOf('\ParagonIE\EasyRSA\Exception\InvalidChecksumException', $ex);
 }
 $dissect[3] = substr(
 hash('sha256', implode('$', array_slice($dissect, 0, 3))),
 0,
 16
 );
 
 try {
 EasyRSA::decrypt(implode('$', $dissect), $secretKey);
 $this->fail('This should not have passed.');
 } catch (\Exception $ex) {
 $this->assertInstanceOf('\ParagonIE\EasyRSA\Exception\InvalidCiphertextException', $ex);
 }
 
 ///////////////////////////////////////////////////////////////////////
 
 $dissect = explode('$', $encrypt);
 
 // Flip a bit in the message, randomly!
 $dissect[2] = base64_decode($dissect[2]);
 $l = mt_rand(0, strlen($dissect[2]) - 1);
 $dissect[2][$l] = \chr(
 \ord($dissect[2][$l]) ^ (1 << mt_rand(0, 7))
 );
 $dissect[2] = Base64::encode($dissect[2]);
 try {
 $dummy = EasyRSA::decrypt(implode('$', $dissect), $secretKey);
 $this->fail('Checksum collision or logic error.');
 unset($dummy);
 return;
 } catch (\Exception $ex) {
 $this->assertInstanceOf('\ParagonIE\EasyRSA\Exception\InvalidChecksumException', $ex);
 }
 $dissect[3] = substr(
 hash('sha256', implode('$', array_slice($dissect, 0, 3))),
 0,
 16
 );
 
 try {
 EasyRSA::decrypt(implode('$', $dissect), $secretKey);
 $this->fail('This should not have passed.');
 } catch (\Exception $ex) {
 $this->assertInstanceOf('\Defuse\Crypto\Exception\WrongKeyOrModifiedCiphertextException', $ex);
 }
 }
 }
 
 |