You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

CryptoTest.php 4.8KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. <?php
  2. /**
  3. * Copyright (c) 2014 Lukas Reschke <lukas@owncloud.com>
  4. * This file is licensed under the Affero General Public License version 3 or
  5. * later.
  6. * See the COPYING-README file.
  7. */
  8. namespace Test\Security;
  9. use OC\Security\Crypto;
  10. class CryptoTest extends \Test\TestCase {
  11. public function defaultEncryptionProvider() {
  12. return [
  13. ['Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt.'],
  14. [''],
  15. ['我看这本书。 我看這本書']
  16. ];
  17. }
  18. /** @var Crypto */
  19. protected $crypto;
  20. protected function setUp(): void {
  21. parent::setUp();
  22. $this->crypto = new Crypto(\OC::$server->getConfig());
  23. }
  24. /**
  25. * @dataProvider defaultEncryptionProvider
  26. */
  27. public function testDefaultEncrypt($stringToEncrypt) {
  28. $ciphertext = $this->crypto->encrypt($stringToEncrypt);
  29. $this->assertEquals($stringToEncrypt, $this->crypto->decrypt($ciphertext));
  30. }
  31. public function testWrongPassword() {
  32. $this->expectException(\Exception::class);
  33. $this->expectExceptionMessage('HMAC does not match.');
  34. $stringToEncrypt = 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt.';
  35. $ciphertext = $this->crypto->encrypt($stringToEncrypt);
  36. $this->crypto->decrypt($ciphertext, 'A wrong password!');
  37. }
  38. public function testLaterDecryption() {
  39. $stringToEncrypt = 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt.';
  40. $encryptedString = '44a35023cca2e7a6125e06c29fc4b2ad9d8a33d0873a8b45b0de4ef9284f260c6c46bf25dc62120644c59b8bafe4281ddc47a70c35ae6c29ef7a63d79eefacc297e60b13042ac582733598d0a6b4de37311556bb5c480fd2633de4e6ebafa868c2d1e2d80a5d24f9660360dba4d6e0c8|lhrFgK0zd9U160Wo|a75e57ab701f9124e1113543fd1dc596f21e20d456a0d1e813d5a8aaec9adcb11213788e96598b67fe9486a9f0b99642c18296d0175db44b1ae426e4e91080ee';
  41. $this->assertEquals($stringToEncrypt, $this->crypto->decrypt($encryptedString, 'ThisIsAVeryS3cur3P4ssw0rd'));
  42. }
  43. public function testWrongIV() {
  44. $this->expectException(\Exception::class);
  45. $this->expectExceptionMessage('HMAC does not match.');
  46. $encryptedString = '560f5436ba864b9f12f7f7ca6d41c327554a6f2c0a160a03316b202af07c65163274993f3a46e7547c07ba89304f00594a2f3bd99f83859097c58049c39d0d4ade10e0de914ff0604961e7c849d0271ed6c0b23f984ba16e7d033e3305fb0910e7b6a2a65c988d17dbee71d8f953684d|d2kdFUspVjC0o0sr|1a5feacf87eaa6869a6abdfba9a296e7bbad45b6ad89f7dce67cdc98e2da5dc4379cc672cc655e52bbf19599bf59482fbea13a73937697fa656bf10f3fc4f1aa';
  47. $this->crypto->decrypt($encryptedString, 'ThisIsAVeryS3cur3P4ssw0rd');
  48. }
  49. public function testWrongParameters() {
  50. $this->expectException(\Exception::class);
  51. $this->expectExceptionMessage('Authenticated ciphertext could not be decoded.');
  52. $encryptedString = '1|2';
  53. $this->crypto->decrypt($encryptedString, 'ThisIsAVeryS3cur3P4ssw0rd');
  54. }
  55. public function testLegacy() {
  56. $cipherText = 'e16599188e3d212f5c7f17fdc2abca46|M1WfLAxbcAmITeD6|509457885d6ca5e6c3bfd3741852687a7f2bffce197f8d5ae97b65818b15a1b7f616b68326ff312371540f4ca8ac55f8e2de4aa13aab3474bd3431e51214e3ee';
  57. $password = 'mypass';
  58. $this->assertSame('legacy test', $this->crypto->decrypt($cipherText, $password));
  59. }
  60. public function testVersion2CiphertextDecryptsToCorrectPlaintext() {
  61. $this->assertSame(
  62. 'This is a plaintext value that will be encrypted with version 2. Which addresses the reduced permutations on the IV.',
  63. $this->crypto->decrypt(
  64. 'be006387f753e8728717e43cfc5526c37adf7b2c9b4a113ceec03b7b0bccfebee74e0acfa0015c5712b4376dacbd7bce26a8fbca916fdccee46203d8289f6b2e4c19318044d375edfc67c72e6c3ae329d4c276b8d866ac1b281844e81f7681fe83d90bc4b6fffa4f3cbc157d64257a493b67fd2af3c8976cb76df520f5739305|02e78ea7c73a32f3b407c54227a9d2ce|3e7a09628f818b7b1cd7724467f5b1b33135de6d2ec62d8c0361be4f2c5203385f10babdcae017d7b30abe5be2117803e3195fb6d9ef20949fe35dad5e9241ea|2',
  65. 'insecure-static-password'
  66. )
  67. );
  68. }
  69. public function testVersion3CiphertextDecryptsToCorrectPlaintext() {
  70. $this->assertSame(
  71. 'Another plaintext value that will be encrypted with version 3. It addresses the related key issue. Old ciphertexts should be decrypted properly, but only use the better version for encryption.',
  72. $this->crypto->decrypt(
  73. 'c99823461db746aa74f819c8640e9e3c367fa3bb9c21dff905b5dd14072c1d1b0da8b7e6b7307bf1561b6ba7aaa932a16c23b1fd5217dc019d55233ef0813c65fccaeabd6ea3a971ce1bbbdfda790ae00fb4442693cbb50072e02875b9f50591df74d00e96fd5b9bd13cb02a5f57b062ec98a4c64fc518ed325d097454883adbfc1687c2af995a392407c5e040a54afee4b2997ab158fe48ef67ccf721a6a7031fcb44d51170892ce7971021a7f3a00d19002eb9b007efe7aecf397ec0dc22064fb5d4a15ad83949f0804feca3c69cdd|8476f53c8d49a7e119798a70086d8911|ae3f7e23d469fbc791714ceb07d854624b1bbd39ac6a4edc05d552e10659adfdcada3a059fae737ffd7d842dd3fcc84bcc364cd298e814dd4967de4ad4a658eb|3',
  74. 'insecure-static-password'
  75. )
  76. );
  77. }
  78. }