DecryptorTest.php 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. <?php
  2. namespace Tests\RNCryptor;
  3. use PHPUnit\Framework\TestCase;
  4. use RNCryptor\RNCryptor\Decryptor;
  5. class DecryptorTest extends TestCase
  6. {
  7. const IOS_PASSWORD = 'mypassword123$!';
  8. const PLAINTEXT_V0_LESS_THAN_ONE_BLOCK = 'Monkey';
  9. const IOS_ENCRYPTED_V0_LESS_THAN_ONE_BLOCK
  10. = 'AACoGb/5NAItZ9gY0YkCXK0Q7d+1p2mNyFFKIDldCA5QRqX5i9MNpezRS7CDX8jUDKGtIlZU6d8CZQeJAAAAAAAAAAAAAAAA';
  11. const PLAINTEXT_V0_EXACTLY_ONE_BLOCK = 'O happy day now.';
  12. const IOS_ENCRYPTED_V0_EXACTLY_ONE_BLOCK
  13. = 'AADsM/JbTInOMSm0epc/7MqQ1Ol2Fu/ySnQ0FknhJeTD6GpZo+SF8JDloHN82yZIHrOcJ3vZuXmrCUt3AysLYg6Vpu4KDwAAAAAAAAAAAAAA'
  14. . 'AA==';
  15. const PLAINTEXT_V0_EXACTLY_TWO_BLOCKS = 'Earth is round, sun is round too';
  16. const IOS_ENCRYPTED_V0_EXACTLY_TWO_BLOCKS
  17. = 'AAApp4OoYpg4Fz+WSZDbcf5KPJasOkhdCnptrmwVkt58BZi/lnTWoIOf2IhIZhHsvTKYYEJsds6bFL/nZC/GtENusHWFyEw1IdtQ7KFSp8XZ'
  18. . 'EhiAT88AAAAAAAAAAAAAAAA=';
  19. const PLAINTEXT_V0_NON_BLOCK_INTERVAL = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do...';
  20. const IOS_ENCRYPTED_V0_NON_BLOCK_INTERVAL
  21. = 'AADu55As8qH9KsSR17p1akydMUlbHrsHudMOr/yTj4olfQedJPTZg8hK4ua99zNkj3Nw7Hle1f1onHclWIYoLkWtMVk4Cp96CcxRhaWbBZqA'
  22. . 'VvTabtVruxcAi+GEB2K4rrmyARxB2QJH9tfz2yTFoFNMln+xOCUm0wAAAAAAAAAAAAAAAA==';
  23. const PLAINTEXT_V1_EXACTLY_ONE_BLOCK = 'Lorem ipsum dolor sit amet, cons';
  24. const IOS_ENCRYPTED_V1_EXACTLY_ONE_BLOCK
  25. = 'AQEjdvTrgCAo8UMn9omCd30um3iMfq/Swiglr5I/wAESEuHBcdbtpbqpUliyDs6NyI83SQGzV9wpAdW8EYBzGdJ1AcE/nld27XX9jPF4Fj+X'
  26. . '++Ws4EL2gEoJYO1fGuX3+hUFhIWaPCzxg/HvLMTDVq4k';
  27. const PLAINTEXT_V1_NON_BLOCK_INTERVAL = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do...';
  28. const IOS_ENCRYPTED_V1_NON_BLOCK_INTERVAL
  29. = 'AQE9u3aB1APkWDRHcfy1cvD3kwwoXUw+8JhtCkZ3xDkSQghIyFoqLgazX3cXBxv3Mj75sSofHoDI35KaFTdXovY3HQYAaQmMdPNvSRVGvlpt'
  30. . 'kyr5LSBMUA3/Uj7lmhnaf515pN8pUbcbOV8RP+oWhXX4iKN009mrcMaX2j1KQz2JfFj8bfpbu9BOtj+1NotIe14=';
  31. const PLAINTEXT_V2_EXACTLY_ONE_BLOCK = 'Lorem ipsum dolor sit amet, cons';
  32. const IOS_ENCRYPTED_V2_EXACTLY_ONE_BLOCK
  33. = 'AgEjDKHOcviYJbHBiZ4l0sku8Dd+0EZIUEz69uTtQI/yJorbiCu3mxpbTVrM6Kj4/vywmOdXdwSR0ov2S/oJ1rVtA8gJ2ulKyrYOOySfDS0/'
  34. . 'YioWKe21zJMfizK8PHveyjBoKmIJdPhT5/caF3l/+JCs';
  35. const PLAINTEXT_V2_NON_BLOCK_INTERVAL = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do...';
  36. const IOS_ENCRYPTED_V2_NON_BLOCK_INTERVAL
  37. = 'AgG8X+ixN6HN9zFnuK1NMJAPntIuC0+WPsmFhGL314zLuq1T9xWDHYzpnzW8EqDz81Amj36+EqrjazQ1gO9ao6bpMwUKdT2xY4ZUrhtCQm3L'
  38. . 'D2okbEIGjj5dtMJtB3i759WdnmNf8K0ULDWNzNQHPzdNDcEE2BPh+2kRaqVzWyBOzJppJoD5n+WdglS7BEBU+4U=';
  39. public function testCanDecryptIosEncryptedVersion0WithPlaintextLengthLessThanOneBlock()
  40. {
  41. $decryptor = new Decryptor;
  42. $decrypted = $decryptor->decrypt(self::IOS_ENCRYPTED_V0_LESS_THAN_ONE_BLOCK, self::IOS_PASSWORD);
  43. $this->assertEquals(self::PLAINTEXT_V0_LESS_THAN_ONE_BLOCK, $decrypted);
  44. }
  45. public function testCanDecryptIosEncryptedVersion0WithPlaintextReallyLong()
  46. {
  47. $decryptor = new Decryptor;
  48. $decrypted = $decryptor->decrypt(
  49. file_get_contents(__DIR__ . '/_files/lorem-ipsum-encrypted-base64-schema0.txt'),
  50. self::IOS_PASSWORD
  51. );
  52. $this->assertEquals(file_get_contents(__DIR__ . '/_files/lorem-ipsum.txt'), $decrypted);
  53. }
  54. public function testCanDecryptIosEncryptedVersion0WithPlaintextLengthExactlyOneBlock()
  55. {
  56. $decryptor = new Decryptor;
  57. $decrypted = $decryptor->decrypt(self::IOS_ENCRYPTED_V0_EXACTLY_ONE_BLOCK, self::IOS_PASSWORD);
  58. $this->assertEquals(self::PLAINTEXT_V0_EXACTLY_ONE_BLOCK, $decrypted);
  59. }
  60. public function testCanDecryptIosEncryptedVersion0WithPlaintextLengthExactlyTwoBlocks()
  61. {
  62. $decryptor = new Decryptor;
  63. $decrypted = $decryptor->decrypt(self::IOS_ENCRYPTED_V0_EXACTLY_TWO_BLOCKS, self::IOS_PASSWORD);
  64. $this->assertEquals(self::PLAINTEXT_V0_EXACTLY_TWO_BLOCKS, $decrypted);
  65. }
  66. public function testCanDecryptIosEncryptedVersion0WithPlaintextLengthNotOnBlockInterval()
  67. {
  68. $decryptor = new Decryptor;
  69. $decrypted = $decryptor->decrypt(self::IOS_ENCRYPTED_V0_NON_BLOCK_INTERVAL, self::IOS_PASSWORD);
  70. $this->assertEquals(self::PLAINTEXT_V0_NON_BLOCK_INTERVAL, $decrypted);
  71. }
  72. public function testCanDecryptIosEncryptedVersion1WithPlaintextReallyLong()
  73. {
  74. $decryptor = new Decryptor;
  75. $decrypted = $decryptor->decrypt(
  76. file_get_contents(__DIR__ . '/_files/lorem-ipsum-encrypted-base64-schema1.txt'),
  77. self::IOS_PASSWORD
  78. );
  79. $this->assertEquals(file_get_contents(__DIR__ . '/_files/lorem-ipsum.txt'), $decrypted);
  80. }
  81. public function testCanDecryptIosEncryptedVersion1WithPlaintextLengthExactlyOneBlock()
  82. {
  83. $decryptor = new Decryptor;
  84. $decrypted = $decryptor->decrypt(self::IOS_ENCRYPTED_V1_EXACTLY_ONE_BLOCK, self::IOS_PASSWORD);
  85. $this->assertEquals(self::PLAINTEXT_V1_EXACTLY_ONE_BLOCK, $decrypted);
  86. }
  87. public function testCanDecryptIosEncryptedVersion1WithPlaintextLengthNotOnBlockInterval()
  88. {
  89. $decryptor = new Decryptor;
  90. $decrypted = $decryptor->decrypt(self::IOS_ENCRYPTED_V1_NON_BLOCK_INTERVAL, self::IOS_PASSWORD);
  91. $this->assertEquals(self::PLAINTEXT_V1_NON_BLOCK_INTERVAL, $decrypted);
  92. }
  93. public function testCanDecryptIosEncryptedVersion2WithPlaintextReallyLong()
  94. {
  95. $decryptor = new Decryptor;
  96. $decrypted = $decryptor->decrypt(
  97. file_get_contents(__DIR__ . '/_files/lorem-ipsum-encrypted-base64-schema2.txt'),
  98. self::IOS_PASSWORD
  99. );
  100. $this->assertEquals(file_get_contents(__DIR__ . '/_files/lorem-ipsum.txt'), $decrypted);
  101. }
  102. public function testCanDecryptIosEncryptedVersion2WithPlaintextLengthExactlyOneBlock()
  103. {
  104. $decryptor = new Decryptor;
  105. $decrypted = $decryptor->decrypt(self::IOS_ENCRYPTED_V2_EXACTLY_ONE_BLOCK, self::IOS_PASSWORD);
  106. $this->assertEquals(self::PLAINTEXT_V2_EXACTLY_ONE_BLOCK, $decrypted);
  107. }
  108. public function testCanDecryptIosEncryptedVersion2WithPlaintextLengthNotOnBlockInterval()
  109. {
  110. $decryptor = new Decryptor;
  111. $decrypted = $decryptor->decrypt(self::IOS_ENCRYPTED_V2_NON_BLOCK_INTERVAL, self::IOS_PASSWORD);
  112. $this->assertEquals(self::PLAINTEXT_V2_NON_BLOCK_INTERVAL, $decrypted);
  113. }
  114. public function testDecryptingWithBadPasswordFails()
  115. {
  116. $decryptor = new Decryptor;
  117. $decrypted = $decryptor->decrypt(self::IOS_ENCRYPTED_V2_NON_BLOCK_INTERVAL, 'bad-password');
  118. $this->assertEquals(false, $decrypted);
  119. }
  120. }