<?php 
declare(strict_types=1); 
namespace ParagonIE\HPKE\Tests\AEAD; 
 
use ParagonIE\HPKE\AEAD\AES128GCM; 
use ParagonIE\HPKE\Interfaces\SymmetricKeyInterface; 
use ParagonIE\HPKE\SymmetricKey; 
use PHPUnit\Framework\Attributes\CoversClass; 
use PHPUnit\Framework\Attributes\DataProvider; 
use PHPUnit\Framework\TestCase; 
 
#[CoversClass('ParagonIE\HPKE\AEAD\AES128GCM')] 
class AES128GCMTest extends TestCase 
{ 
    private AES128GCM $aes; 
 
    public function setUp(): void 
    { 
        $this->aes = new AES128GCM(); 
    } 
 
    public static function rfcVectors(): array 
    { 
        return [ 
            'DHKEM(X25519, HKDF-SHA256), HKDF-SHA256, AES-128-GCM' => [ 
                new SymmetricKey(sodium_hex2bin('4531685d41d65f03dc48f6b8302c05b0')), 
                sodium_hex2bin('56d890e5accaaf011cff4b7d'), 
                sodium_hex2bin('4265617574792069732074727574682c20747275746820626561757479'), 
                sodium_hex2bin('436f756e742d30'), 
                sodium_hex2bin('f938558b5d72f1a23810b4be2ab4f84331acc02fc97babc53a52ae8218'), 
                sodium_hex2bin('a355a96d8770ac83d07bea87e13c512a') 
            ] 
        ]; 
    } 
 
    #[DataProvider('rfcVectors')] 
    public function testVector( 
        SymmetricKeyInterface $key, 
        string $nonce, 
        string $plaintexxt, 
        string $aad, 
        string $ciphertext, 
        string $tag 
    ) { 
        [$actual_ct, $actual_tag] = $this->aes->encrypt($key, $plaintexxt, $nonce, $aad); 
        $this->assertSame($ciphertext, $actual_ct, 'Ciphertext'); 
        $this->assertSame($tag, $actual_tag, 'Authentication tag'); 
        $decrypt = $this->aes->decrypt($key, $ciphertext, $tag, $nonce, $aad); 
        $this->assertSame($plaintexxt, $decrypt, 'Decryption'); 
    } 
} 
 
 |