| 
<?phpdeclare(strict_types=1);
 namespace ParagonIE\HPKE\AEAD;
 
 use ParagonIE\HPKE\HPKEException;
 use ParagonIE\HPKE\Interfaces\AEADInterface;
 use ParagonIE\HPKE\SymmetricKey;
 
 class AES256GCM implements AEADInterface
 {
 const AEAD_ID = "\x00\x02";
 
 public function getAeadId(): string
 {
 return self::AEAD_ID;
 }
 
 public function keyLength(): int
 {
 return 32;
 }
 
 public function nonceLength(): int
 {
 return 12;
 }
 
 public function tagLength(): int
 {
 return 16;
 }
 
 
 public function encrypt(
 #[\SensitiveParameter] SymmetricKey $key,
 #[\SensitiveParameter] string $plaintext,
 string $nonce,
 string $aad = ''
 ): array {
 $tag = '';
 $ciphertext = openssl_encrypt(
 $plaintext,
 'aes-256-gcm',
 $key->bytes,
 OPENSSL_RAW_DATA | OPENSSL_NO_PADDING,
 $nonce,
 $tag,
 $aad
 );
 return [$ciphertext, $tag];
 }
 
 /**
 * @throws HPKEException
 */
 public function decrypt(
 #[\SensitiveParameter] SymmetricKey $key,
 string $ciphertext,
 string $tag,
 string $nonce,
 string $aad = ''
 ): string {
 $result = openssl_decrypt(
 $ciphertext,
 'aes-256-gcm',
 $key->bytes,
 OPENSSL_RAW_DATA | OPENSSL_NO_PADDING,
 $nonce,
 $tag,
 $aad
 );
 if (!is_string($result)) {
 throw new HPKEException('Decryption error');
 }
 return $result;
 }
 }
 
 |