123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- <?php
- namespace Aws\Crypto;
- use Aws\Crypto\Polyfill\AesGcm;
- use Aws\Crypto\Polyfill\Key;
- use GuzzleHttp\Psr7;
- use GuzzleHttp\Psr7\StreamDecoratorTrait;
- use Psr\Http\Message\StreamInterface;
- use \RuntimeException;
- /**
- * @internal Represents a stream of data to be gcm encrypted.
- */
- class AesGcmEncryptingStream implements AesStreamInterface, AesStreamInterfaceV2
- {
- use StreamDecoratorTrait;
- private $aad;
- private $initializationVector;
- private $key;
- private $keySize;
- private $plaintext;
- private $tag = '';
- private $tagLength;
- /**
- * @var StreamInterface
- */
- private $stream;
- /**
- * Same as non-static 'getAesName' method, allowing calls in a static
- * context.
- *
- * @return string
- */
- public static function getStaticAesName()
- {
- return 'AES/GCM/NoPadding';
- }
- /**
- * @param StreamInterface $plaintext
- * @param string $key
- * @param string $initializationVector
- * @param string $aad
- * @param int $tagLength
- * @param int $keySize
- */
- public function __construct(
- StreamInterface $plaintext,
- $key,
- $initializationVector,
- $aad = '',
- $tagLength = 16,
- $keySize = 256
- ) {
- $this->plaintext = $plaintext;
- $this->key = $key;
- $this->initializationVector = $initializationVector;
- $this->aad = $aad;
- $this->tagLength = $tagLength;
- $this->keySize = $keySize;
- // unsetting the property forces the first access to go through
- // __get().
- unset($this->stream);
- }
- public function getOpenSslName()
- {
- return "aes-{$this->keySize}-gcm";
- }
- /**
- * Same as static method and retained for backwards compatibility
- *
- * @return string
- */
- public function getAesName()
- {
- return self::getStaticAesName();
- }
- public function getCurrentIv()
- {
- return $this->initializationVector;
- }
- public function createStream()
- {
- if (version_compare(PHP_VERSION, '7.1', '<')) {
- return Psr7\Utils::streamFor(AesGcm::encrypt(
- (string) $this->plaintext,
- $this->initializationVector,
- new Key($this->key),
- $this->aad,
- $this->tag,
- $this->keySize
- ));
- } else {
- return Psr7\Utils::streamFor(\openssl_encrypt(
- (string)$this->plaintext,
- $this->getOpenSslName(),
- $this->key,
- OPENSSL_RAW_DATA,
- $this->initializationVector,
- $this->tag,
- $this->aad,
- $this->tagLength
- ));
- }
- }
- /**
- * @return string
- */
- public function getTag()
- {
- return $this->tag;
- }
- public function isWritable(): bool
- {
- return false;
- }
- }
|