crypto_box.phpt 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. --TEST--
  2. Check for libsodium box
  3. --EXTENSIONS--
  4. sodium
  5. --FILE--
  6. <?php
  7. $keypair = sodium_crypto_box_keypair();
  8. var_dump(strlen($keypair) === SODIUM_CRYPTO_BOX_KEYPAIRBYTES);
  9. $sk = sodium_crypto_box_secretkey($keypair);
  10. var_dump(strlen($sk) === SODIUM_CRYPTO_BOX_SECRETKEYBYTES);
  11. $pk = sodium_crypto_box_publickey($keypair);
  12. var_dump(strlen($pk) === SODIUM_CRYPTO_BOX_PUBLICKEYBYTES);
  13. var_dump($pk !== $sk);
  14. $pk2 = sodium_crypto_box_publickey_from_secretkey($sk);
  15. var_dump($pk === $pk2);
  16. $pk2 = sodium_crypto_scalarmult_base($sk);
  17. var_dump($pk === $pk2);
  18. $keypair2 = sodium_crypto_box_keypair_from_secretkey_and_publickey($sk, $pk);
  19. var_dump($keypair === $keypair2);
  20. $seed_x = str_repeat('x', SODIUM_CRYPTO_BOX_SEEDBYTES);
  21. $seed_y = str_repeat('y', SODIUM_CRYPTO_BOX_SEEDBYTES);
  22. $alice_box_kp = sodium_crypto_box_seed_keypair($seed_x);
  23. $bob_box_kp = sodium_crypto_box_seed_keypair($seed_y);
  24. $message_nonce = random_bytes(SODIUM_CRYPTO_BOX_NONCEBYTES);
  25. $alice_box_secretkey = sodium_crypto_box_secretkey($alice_box_kp);
  26. $bob_box_publickey = sodium_crypto_box_publickey($bob_box_kp);
  27. $alice_to_bob_kp = sodium_crypto_box_keypair_from_secretkey_and_publickey(
  28. $alice_box_secretkey,
  29. $bob_box_publickey
  30. );
  31. $msg = "Here is another message, to be signed using Alice's secret key, and " .
  32. "to be encrypted using Bob's public key. The keys will always be the same " .
  33. "since they are derived from a fixed seeds";
  34. $ciphertext = sodium_crypto_box(
  35. $msg,
  36. $message_nonce,
  37. $alice_to_bob_kp
  38. );
  39. try {
  40. $ciphertext = sodium_crypto_box(
  41. $msg,
  42. $message_nonce,
  43. substr($alice_to_bob_kp, 1)
  44. );
  45. } catch (SodiumException $ex) {
  46. echo $ex->getMessage(), PHP_EOL;
  47. }
  48. sodium_memzero($alice_box_kp);
  49. sodium_memzero($bob_box_kp);
  50. $alice_box_kp = sodium_crypto_box_seed_keypair($seed_x);
  51. $bob_box_kp = sodium_crypto_box_seed_keypair($seed_y);
  52. $alice_box_publickey = sodium_crypto_box_publickey($alice_box_kp);
  53. $bob_box_secretkey = sodium_crypto_box_secretkey($bob_box_kp);
  54. $bob_to_alice_kp = sodium_crypto_box_keypair_from_secretkey_and_publickey(
  55. $bob_box_secretkey,
  56. $alice_box_publickey
  57. );
  58. $plaintext = sodium_crypto_box_open(
  59. $ciphertext,
  60. $message_nonce,
  61. $bob_to_alice_kp
  62. );
  63. var_dump($msg === $plaintext);
  64. $alice_kp = sodium_crypto_box_keypair();
  65. $alice_secretkey = sodium_crypto_box_secretkey($alice_kp);
  66. $alice_publickey = sodium_crypto_box_publickey($alice_kp);
  67. $bob_kp = sodium_crypto_box_keypair();
  68. $bob_secretkey = sodium_crypto_box_secretkey($bob_kp);
  69. $bob_publickey = sodium_crypto_box_publickey($bob_kp);
  70. $alice_to_bob_kp = sodium_crypto_box_keypair_from_secretkey_and_publickey
  71. ($alice_secretkey, $bob_publickey);
  72. $bob_to_alice_kp = sodium_crypto_box_keypair_from_secretkey_and_publickey
  73. ($bob_secretkey, $alice_publickey);
  74. $alice_to_bob_message_nonce = random_bytes(SODIUM_CRYPTO_BOX_NONCEBYTES);
  75. $alice_to_bob_ciphertext = sodium_crypto_box('Hi, this is Alice',
  76. $alice_to_bob_message_nonce,
  77. $alice_to_bob_kp);
  78. $alice_message_decrypted_by_bob = sodium_crypto_box_open($alice_to_bob_ciphertext,
  79. $alice_to_bob_message_nonce,
  80. $bob_to_alice_kp);
  81. $bob_to_alice_message_nonce = random_bytes(SODIUM_CRYPTO_BOX_NONCEBYTES);
  82. $bob_to_alice_ciphertext = sodium_crypto_box('Hi Alice! This is Bob',
  83. $bob_to_alice_message_nonce,
  84. $bob_to_alice_kp);
  85. $bob_message_decrypted_by_alice = sodium_crypto_box_open($bob_to_alice_ciphertext,
  86. $bob_to_alice_message_nonce,
  87. $alice_to_bob_kp);
  88. var_dump($alice_message_decrypted_by_bob);
  89. var_dump($bob_message_decrypted_by_alice);
  90. if (SODIUM_LIBRARY_MAJOR_VERSION > 7 ||
  91. (SODIUM_LIBRARY_MAJOR_VERSION == 7 &&
  92. SODIUM_LIBRARY_MINOR_VERSION >= 5)) {
  93. $anonymous_message_to_alice = sodium_crypto_box_seal('Anonymous message',
  94. $alice_publickey);
  95. $decrypted_message = sodium_crypto_box_seal_open($anonymous_message_to_alice,
  96. $alice_kp);
  97. } else {
  98. $decrypted_message = 'Anonymous message';
  99. }
  100. var_dump($decrypted_message);
  101. $msg = sodium_hex2bin(
  102. '7375f4094f1151640bd853cb13dbc1a0ee9e13b0287a89d34fa2f6732be9de13f88457553d'.
  103. '768347116522d6d32c9cb353ef07aa7c83bd129b2bb5db35b28334c935b24f2639405a0604'
  104. );
  105. $kp = sodium_hex2bin(
  106. '36a6c2b96a650d80bf7e025e0f58f3d636339575defb370801a54213bd54582d'.
  107. '5aecbcf7866e7a4d58a6c1317e2b955f54ecbe2fcbbf7d262c10636ed524480c'
  108. );
  109. var_dump(sodium_crypto_box_seal_open($msg, $kp));
  110. ?>
  111. --EXPECT--
  112. bool(true)
  113. bool(true)
  114. bool(true)
  115. bool(true)
  116. bool(true)
  117. bool(true)
  118. bool(true)
  119. sodium_crypto_box(): Argument #3 ($key_pair) must be SODIUM_CRYPTO_BOX_KEYPAIRBYTES bytes long
  120. bool(true)
  121. string(17) "Hi, this is Alice"
  122. string(21) "Hi Alice! This is Bob"
  123. string(17) "Anonymous message"
  124. string(26) "This is for your eyes only"