FormatV2Test.php 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. <?php declare(strict_types=1);
  2. use PHPUnit\Framework\TestCase;
  3. use PrivateBin\FormatV2;
  4. class FormatV2Test extends TestCase
  5. {
  6. public function testFormatV2ValidatorValidatesCorrectly()
  7. {
  8. $paste = Helper::getPastePost();
  9. $comment = Helper::getCommentPost();
  10. $this->assertTrue(FormatV2::isValid($paste), 'valid format');
  11. $this->assertTrue(FormatV2::isValid($comment, true), 'valid format');
  12. $paste['adata'][0][0] = '$';
  13. $this->assertFalse(FormatV2::isValid($paste), 'invalid base64 encoding of iv');
  14. $paste = Helper::getPastePost();
  15. $paste['adata'][0][1] = '$';
  16. $this->assertFalse(FormatV2::isValid($paste), 'invalid base64 encoding of salt');
  17. $paste = Helper::getPastePost();
  18. $paste['adata'][] = 0;
  19. $this->assertFalse(FormatV2::isValid($paste), 'invalid extra adata entry');
  20. $paste = Helper::getPastePost();
  21. $paste['adata'][] = 0;
  22. $this->assertFalse(FormatV2::isValid($paste), 'invalid extra adata entry');
  23. $paste = Helper::getPastePost();
  24. $paste['ct'] = '$';
  25. $this->assertFalse(FormatV2::isValid($paste), 'invalid base64 encoding of ct');
  26. $paste = Helper::getPastePost();
  27. $paste['ct'] = 'bm9kYXRhbm9kYXRhbm9kYXRhbm9kYXRhbm9kYXRhCg==';
  28. $this->assertFalse(FormatV2::isValid($paste), 'low ct entropy');
  29. $paste = Helper::getPastePost();
  30. $paste['adata'][0][0] = 'MTIzNDU2Nzg5MDEyMzQ1Njc4OTA=';
  31. $this->assertFalse(FormatV2::isValid($paste), 'iv too long');
  32. $paste = Helper::getPastePost();
  33. $paste['adata'][0][1] = 'MTIzNDU2Nzg5MDEyMzQ1Njc4OTA=';
  34. $this->assertFalse(FormatV2::isValid($paste), 'salt too long');
  35. $paste = Helper::getPastePost();
  36. $paste['foo'] = 'bar';
  37. $this->assertFalse(FormatV2::isValid($paste), 'invalid additional key');
  38. unset($paste['meta']);
  39. $this->assertFalse(FormatV2::isValid($paste), 'invalid missing key');
  40. $paste = Helper::getPastePost();
  41. $paste['v'] = 0.9;
  42. $this->assertFalse(FormatV2::isValid($paste), 'unsupported version');
  43. $paste = Helper::getPastePost();
  44. $paste['adata'][0][2] = 1000;
  45. $this->assertFalse(FormatV2::isValid($paste), 'not enough iterations');
  46. $paste = Helper::getPastePost();
  47. $paste['adata'][0][3] = 127;
  48. $this->assertFalse(FormatV2::isValid($paste), 'invalid key size');
  49. $paste = Helper::getPastePost();
  50. $paste['adata'][0][4] = 63;
  51. $this->assertFalse(FormatV2::isValid($paste), 'invalid tag length');
  52. $paste = Helper::getPastePost();
  53. $paste['adata'][0][5] = '!#@';
  54. $this->assertFalse(FormatV2::isValid($paste), 'invalid algorithm');
  55. $paste = Helper::getPastePost();
  56. $paste['adata'][0][6] = '!#@';
  57. $this->assertFalse(FormatV2::isValid($paste), 'invalid mode');
  58. $paste = Helper::getPastePost();
  59. $paste['adata'][0][7] = '!#@';
  60. $this->assertFalse(FormatV2::isValid($paste), 'invalid compression');
  61. $paste = Helper::getPaste();
  62. $this->assertFalse(FormatV2::isValid($paste), 'invalid meta key');
  63. }
  64. public function testFormatV2ValidatorRejectsMalformedTypes()
  65. {
  66. // malformed input must yield "false" (Invalid data) rather than a
  67. // fatal type error under strict_types
  68. $paste = Helper::getPastePost();
  69. $paste['v'] = 'abc';
  70. $this->assertFalse(FormatV2::isValid($paste), 'non-numeric version');
  71. $paste = Helper::getPastePost();
  72. $paste['v'] = [];
  73. $this->assertFalse(FormatV2::isValid($paste), 'array version');
  74. $paste = Helper::getPastePost();
  75. $paste['ct'] = ['not', 'a', 'string'];
  76. $this->assertFalse(FormatV2::isValid($paste), 'non-string ciphertext');
  77. $paste = Helper::getPastePost();
  78. $paste['meta'] = 'not-an-array';
  79. $this->assertFalse(FormatV2::isValid($paste), 'non-array meta');
  80. $paste = Helper::getPastePost();
  81. $paste['adata'][0] = 'not-an-array';
  82. $this->assertFalse(FormatV2::isValid($paste), 'non-array cipher parameters');
  83. $paste = Helper::getPastePost();
  84. $paste['adata'][0] = [];
  85. $this->assertFalse(FormatV2::isValid($paste), 'empty cipher parameters');
  86. $paste = Helper::getPastePost();
  87. $paste['adata'][0][0] = [];
  88. $this->assertFalse(FormatV2::isValid($paste), 'non-string iv');
  89. $comment = Helper::getCommentPost();
  90. $comment['ct'] = 42;
  91. $this->assertFalse(FormatV2::isValid($comment, true), 'non-string comment ciphertext');
  92. $comment = Helper::getCommentPost();
  93. $comment['adata'][] = $comment['pasteid'];
  94. $comment['adata'][] = $comment['parentid'];
  95. $this->assertTrue(FormatV2::isValid($comment, true), 'comment with authenticated IDs');
  96. $comment = Helper::getCommentPost();
  97. $comment['adata'][] = $comment['pasteid'];
  98. $this->assertFalse(FormatV2::isValid($comment, true), 'comment with incomplete authenticated IDs');
  99. $comment = Helper::getCommentPost();
  100. $comment['adata'][] = $comment['pasteid'];
  101. $comment['adata'][] = $comment['parentid'];
  102. $comment['adata'][] = $comment['parentid'];
  103. $this->assertFalse(FormatV2::isValid($comment, true), 'comment with too many cipher parameters');
  104. $comment = Helper::getCommentPost();
  105. $comment['adata'][] = '1111111111111111';
  106. $comment['adata'][] = $comment['parentid'];
  107. $this->assertFalse(FormatV2::isValid($comment, true), 'comment with mismatched document ID');
  108. $comment = Helper::getCommentPost();
  109. $comment['adata'][] = $comment['pasteid'];
  110. $comment['adata'][] = '1111111111111111';
  111. $this->assertFalse(FormatV2::isValid($comment, true), 'comment with mismatched parent ID');
  112. $comment = Helper::getCommentPost();
  113. $comment['adata'][] = $comment['pasteid'];
  114. $comment['adata'][] = [];
  115. $this->assertFalse(FormatV2::isValid($comment, true), 'comment with non-string parent ID');
  116. }
  117. }