crypto_aead.phpt 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. --TEST--
  2. Check for libsodium AEAD
  3. --EXTENSIONS--
  4. sodium
  5. --SKIPIF--
  6. <?php
  7. if (!defined('SODIUM_CRYPTO_AEAD_AES256GCM_NPUBBYTES')) print "skip libsodium without AESGCM";
  8. ?>
  9. --FILE--
  10. <?php
  11. echo "aead_chacha20poly1305:\n";
  12. $msg = random_bytes(random_int(1, 1000));
  13. $nonce = random_bytes(SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_NPUBBYTES);
  14. $key = sodium_crypto_aead_chacha20poly1305_keygen();
  15. $ad = random_bytes(random_int(1, 1000));
  16. $ciphertext = sodium_crypto_aead_chacha20poly1305_encrypt($msg, $ad, $nonce, $key);
  17. $msg2 = sodium_crypto_aead_chacha20poly1305_decrypt($ciphertext, $ad, $nonce, $key);
  18. var_dump($ciphertext !== $msg);
  19. var_dump($msg === $msg2);
  20. var_dump(sodium_crypto_aead_chacha20poly1305_decrypt($ciphertext, 'x' . $ad, $nonce, $key));
  21. try {
  22. // Switched order
  23. $msg2 = sodium_crypto_aead_chacha20poly1305_decrypt($ciphertext, $ad, $key, $nonce);
  24. var_dump(false);
  25. } catch (SodiumException $ex) {
  26. var_dump(true);
  27. }
  28. echo "aead_chacha20poly1305_ietf:\n";
  29. if (SODIUM_LIBRARY_MAJOR_VERSION > 7 ||
  30. (SODIUM_LIBRARY_MAJOR_VERSION == 7 &&
  31. SODIUM_LIBRARY_MINOR_VERSION >= 6)) {
  32. $msg = random_bytes(random_int(1, 1000));
  33. $nonce = random_bytes(SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_IETF_NPUBBYTES);
  34. $key = sodium_crypto_aead_chacha20poly1305_ietf_keygen();
  35. $ad = random_bytes(random_int(1, 1000));
  36. $ciphertext = sodium_crypto_aead_chacha20poly1305_ietf_encrypt($msg, $ad, $nonce, $key);
  37. $msg2 = sodium_crypto_aead_chacha20poly1305_ietf_decrypt($ciphertext, $ad, $nonce, $key);
  38. var_dump($ciphertext !== $msg);
  39. var_dump($msg === $msg2);
  40. var_dump(sodium_crypto_aead_chacha20poly1305_ietf_decrypt($ciphertext, 'x' . $ad, $nonce, $key));
  41. try {
  42. // Switched order
  43. $msg2 = sodium_crypto_aead_chacha20poly1305_ietf_decrypt($ciphertext, $ad, $key, $nonce);
  44. var_dump(false);
  45. } catch (SodiumException $ex) {
  46. var_dump(true);
  47. }
  48. } else {
  49. var_dump(true);
  50. var_dump(true);
  51. var_dump(false);
  52. var_dump(true);
  53. }
  54. echo "aead_xchacha20poly1305_ietf:\n";
  55. if (SODIUM_LIBRARY_MAJOR_VERSION > 9 ||
  56. (SODIUM_LIBRARY_MAJOR_VERSION == 9 &&
  57. SODIUM_LIBRARY_MINOR_VERSION >= 4)) {
  58. $msg = random_bytes(random_int(1, 1000));
  59. $nonce = random_bytes(SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES);
  60. $key = sodium_crypto_aead_xchacha20poly1305_ietf_keygen();
  61. $ad = random_bytes(random_int(1, 1000));
  62. $ciphertext = sodium_crypto_aead_xchacha20poly1305_ietf_encrypt($msg, $ad, $nonce, $key);
  63. $msg2 = sodium_crypto_aead_xchacha20poly1305_ietf_decrypt($ciphertext, $ad, $nonce, $key);
  64. var_dump($ciphertext !== $msg);
  65. var_dump($msg === $msg2);
  66. var_dump(sodium_crypto_aead_xchacha20poly1305_ietf_decrypt($ciphertext, 'x' . $ad, $nonce, $key));
  67. try {
  68. // Switched order
  69. $msg2 = sodium_crypto_aead_xchacha20poly1305_ietf_decrypt($ciphertext, $ad, $key, $nonce);
  70. var_dump(false);
  71. } catch (SodiumException $ex) {
  72. var_dump(true);
  73. }
  74. } else {
  75. var_dump(true);
  76. var_dump(true);
  77. var_dump(false);
  78. var_dump(true);
  79. }
  80. echo "aead_aes256gcm:\n";
  81. if (sodium_crypto_aead_aes256gcm_is_available()) {
  82. $msg = random_bytes(random_int(1, 1000));
  83. $nonce = random_bytes(SODIUM_CRYPTO_AEAD_AES256GCM_NPUBBYTES);
  84. $ad = random_bytes(random_int(1, 1000));
  85. $key = sodium_crypto_aead_aes256gcm_keygen();
  86. $ciphertext = sodium_crypto_aead_aes256gcm_encrypt($msg, $ad, $nonce, $key);
  87. $msg2 = sodium_crypto_aead_aes256gcm_decrypt($ciphertext, $ad, $nonce, $key);
  88. var_dump($ciphertext !== $msg);
  89. var_dump($msg === $msg2);
  90. var_dump(sodium_crypto_aead_aes256gcm_decrypt($ciphertext, 'x' . $ad, $nonce, $key));
  91. try {
  92. // Switched order
  93. $msg2 = sodium_crypto_aead_aes256gcm_decrypt($ciphertext, $ad, $key, $nonce);
  94. var_dump(false);
  95. } catch (SodiumException $ex) {
  96. var_dump(true);
  97. }
  98. } else {
  99. var_dump(true);
  100. var_dump(true);
  101. var_dump(false);
  102. var_dump(true);
  103. }
  104. ?>
  105. --EXPECT--
  106. aead_chacha20poly1305:
  107. bool(true)
  108. bool(true)
  109. bool(false)
  110. bool(true)
  111. aead_chacha20poly1305_ietf:
  112. bool(true)
  113. bool(true)
  114. bool(false)
  115. bool(true)
  116. aead_xchacha20poly1305_ietf:
  117. bool(true)
  118. bool(true)
  119. bool(false)
  120. bool(true)
  121. aead_aes256gcm:
  122. bool(true)
  123. bool(true)
  124. bool(false)
  125. bool(true)