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