src/Crypto/AesCtrCipherBuilder.php (49 lines of code) (raw):
<?php
declare(strict_types=1);
namespace AlibabaCloud\Oss\V2\Crypto;
/**
* Class AesCtrCipherBuilder
* @package AlibabaCloud\Oss\V2\Crypto
*/
final class AesCtrCipherBuilder
{
private MasterCipherInterface $masterCipher;
public function __construct(MasterCipherInterface $masterCipher)
{
$this->masterCipher = $masterCipher;
}
public function createCipherData()
{
$key = AesCtr::randomKey();
$iv = AesCtr::randomIv();
$encIv = $this->masterCipher->encrypt($iv);
$enckey = $this->masterCipher->encrypt($key);
return new CipherData(
$iv,
$key,
$encIv,
$enckey,
$this->masterCipher->getMatDesc(),
$this->masterCipher->getWrapAlgorithm(),
AesCtr::ALGORITHM
);
}
public function fromCipherData(?CipherData $cipherData = null): ContentCipherInterface
{
if ($cipherData == null) {
$cipherData = $this->createCipherData();
}
return new AesCtrCipher($cipherData);
}
public function fromEnvelope(Envelope $envelope): ContentCipherInterface
{
$plainIv = $this->masterCipher->decrypt($envelope->iv);
$plainKey = $this->masterCipher->decrypt($envelope->key);
$cipherData = new CipherData(
$plainIv,
$plainKey,
$envelope->iv,
$envelope->key,
$envelope->matDesc,
$envelope->wrapAlg,
$envelope->cekAlg
);
return $this->fromCipherData($cipherData);
}
}