Source code for alibabacloud_oss_v2.crypto.aes_ctr_cipher
from typing import Any
from .types import (
ContentCipherBuilder,
MasterCipher,
ContentCipher,
CipherData,
Envelope
)
from .aes_ctr import _AesCtr
class _AESCtrCipher(ContentCipher):
def __init__(
self,
cipher_data: CipherData,
offset: int
):
self._cipher_data = cipher_data
self._cipher = _AesCtr(cipher_data, offset)
def encrypt_content(self, data: Any) -> Any:
"""encrypt content
"""
return self._cipher.encrypt(data)
def decrypt_content(self, data: Any) -> Any:
"""decrypt content
"""
reader = self._cipher.decrypt(data)
return reader
def clone(self, **kwargs) -> ContentCipher:
"""clone
"""
return _AESCtrCipher(
cipher_data=self._cipher_data,
offset = kwargs.get("offset", 0)
)
def get_encrypted_len(self, plain_text_len: int) -> int:
"""AES CTR encryption mode does not change content length
"""
return plain_text_len
def get_cipher_data(self) -> CipherData:
return self._cipher_data
def get_align_len(self) -> int:
return len(self._cipher_data.iv)
[docs]
class AESCtrCipherBuilder(ContentCipherBuilder):
"""AES Ctr Cipher Builder
Args:
ContentCipherBuilder (_type_): _description_
"""
def __init__(
self,
master_cipher: MasterCipher,
):
self.master_cipher = master_cipher
[docs]
def content_cipher(self) -> ContentCipher:
cd = self._create_cipher_data()
return self._content_cipher_from_cd(cd, 0)
[docs]
def content_cipher_from_env(self, env: Envelope, **kwargs) -> ContentCipher:
encrypted_key = env.cipher_key
encrypted_iv = env.iv
key = self.master_cipher.decrypt(encrypted_key)
iv = self.master_cipher.decrypt(encrypted_iv)
offset = kwargs.get("offset", 0)
return self._content_cipher_from_cd(
CipherData(
key=key,
iv=iv,
encrypted_key=encrypted_key,
encrypted_iv=encrypted_iv,
wrap_algorithm=env.wrap_algorithm,
cek_algorithm=env.cek_algorithm,
mat_desc=env.mat_desc
),
offset)
[docs]
def get_mat_desc(self) -> str:
return self.master_cipher.get_mat_desc()
def _create_cipher_data(self) -> CipherData:
key = _AesCtr.random_key()
iv = _AesCtr.random_iv()
encrypted_key = self.master_cipher.encrypt(key)
encrypted_iv = self.master_cipher.encrypt(iv)
return CipherData(
key=key,
iv=iv,
encrypted_key=encrypted_key,
encrypted_iv=encrypted_iv,
wrap_algorithm=self.master_cipher.get_wrap_algorithm(),
cek_algorithm='AES/CTR/NoPadding',
mat_desc=self.master_cipher.get_mat_desc()
)
def _content_cipher_from_cd(self, cd:CipherData, offset: int) -> ContentCipher:
return _AESCtrCipher(cipher_data=cd, offset=offset)