| | |
| | |
| | |
| |
|
| | from __future__ import annotations |
| |
|
| | import abc |
| |
|
| | from cryptography import utils |
| | from cryptography.hazmat.bindings._rust import ( |
| | ANSIX923PaddingContext, |
| | ANSIX923UnpaddingContext, |
| | PKCS7PaddingContext, |
| | PKCS7UnpaddingContext, |
| | ) |
| |
|
| |
|
| | class PaddingContext(metaclass=abc.ABCMeta): |
| | @abc.abstractmethod |
| | def update(self, data: utils.Buffer) -> bytes: |
| | """ |
| | Pads the provided bytes and returns any available data as bytes. |
| | """ |
| |
|
| | @abc.abstractmethod |
| | def finalize(self) -> bytes: |
| | """ |
| | Finalize the padding, returns bytes. |
| | """ |
| |
|
| |
|
| | def _byte_padding_check(block_size: int) -> None: |
| | if not (0 <= block_size <= 2040): |
| | raise ValueError("block_size must be in range(0, 2041).") |
| |
|
| | if block_size % 8 != 0: |
| | raise ValueError("block_size must be a multiple of 8.") |
| |
|
| |
|
| | class PKCS7: |
| | def __init__(self, block_size: int): |
| | _byte_padding_check(block_size) |
| | self.block_size = block_size |
| |
|
| | def padder(self) -> PaddingContext: |
| | return PKCS7PaddingContext(self.block_size) |
| |
|
| | def unpadder(self) -> PaddingContext: |
| | return PKCS7UnpaddingContext(self.block_size) |
| |
|
| |
|
| | PaddingContext.register(PKCS7PaddingContext) |
| | PaddingContext.register(PKCS7UnpaddingContext) |
| |
|
| |
|
| | class ANSIX923: |
| | def __init__(self, block_size: int): |
| | _byte_padding_check(block_size) |
| | self.block_size = block_size |
| |
|
| | def padder(self) -> PaddingContext: |
| | return ANSIX923PaddingContext(self.block_size) |
| |
|
| | def unpadder(self) -> PaddingContext: |
| | return ANSIX923UnpaddingContext(self.block_size) |
| |
|
| |
|
| | PaddingContext.register(ANSIX923PaddingContext) |
| | PaddingContext.register(ANSIX923UnpaddingContext) |
| |
|