1--TEST--
2Crypto\Cipher::setTag in CCM mode basic usage.
3--SKIPIF--
4<?php
5if (!Crypto\Cipher::hasMode(Crypto\Cipher::MODE_CCM)) {
6	die("Skip: CCM mode not defined (update OpenSSL version)");
7}
8?>
9--FILE--
10<?php
11$key = pack("H*", 'ceb009aea4454451feadf0e6b36f45555dd04723baa448e8');
12$nonce = pack("H*", '764043c49460b7');
13
14$data = pack("H*", '8a0f3d8229e48e7487fd95a28ad392c80b3681d4fbc7bbfd');
15$tag = pack("H*", '3ec1bc9d62356008ce6a4f78f6e3ceb1');
16
17$cipher = new Crypto\Cipher('aes-192-ccm');
18$cipher->setTag('wrong tag');
19try {
20	echo $cipher->decrypt($data, $key, $nonce) . "\n";
21} catch (Crypto\CipherException $e) {
22	if (Crypto\CipherException::FINISH_FAILED) {
23		echo "WRONG TAG\n";
24	}
25}
26
27try {
28	$cipher = new Crypto\Cipher('aes-192-ccm');
29	$cipher->setTag($tag);
30	$cipher->decryptInit($key, $nonce);
31	$pt = $cipher->decryptUpdate(substr($data, 0, 10));
32	$pt .= $cipher->decryptUpdate(substr($data, 10));
33} catch (Crypto\CipherException $e) {
34	if (Crypto\CipherException::UPDATE_FAILED) {
35		echo "MULTI UPDATE\n";
36	}
37}
38
39// test single decrypt
40$cipher = new Crypto\Cipher('aes-192-ccm');
41$cipher->setTag($tag);
42echo bin2hex($cipher->decrypt($data, $key, $nonce)) . "\n";
43
44try {
45	$cipher->setTag($tag);
46}
47catch (Crypto\CipherException $e) {
48	if ($e->getCode() == Crypto\CipherException::TAG_SETTER_FORBIDDEN) {
49		echo "FLOW\n";
50	}
51}
52
53// test ctx decrypt
54$cipher = new Crypto\Cipher('aes-192-ccm');
55$cipher->setTag($tag);
56$cipher->decryptInit($key, $nonce);
57$pt = $cipher->decryptUpdate($data);
58$pt .= $cipher->decryptFinish();
59echo bin2hex($pt) . "\n";
60
61?>
62--EXPECT--
63WRONG TAG
64MULTI UPDATE
65c8d275f919e17d7fe69c2a1f58939dfe4d403791b5df1310
66FLOW
67c8d275f919e17d7fe69c2a1f58939dfe4d403791b5df1310
68