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