Skip to main content

Sm4Cipher

Struct Sm4Cipher 

Source
pub struct Sm4Cipher { /* private fields */ }
Expand description

SM4 cipher with pre-computed round keys.

Sm4Cipher zeroizes its round-key buffer on drop via the workspace zeroize policy. Construction runs the key schedule (32 round keys × secret-key-touching S-box invocations); see the W1 dudect target ct_sm4_key_schedule.

Implementations§

Source§

impl Sm4Cipher

Source

pub fn new(key: &[u8; 16]) -> Self

Construct a cipher from a 128-bit key and run the key schedule.

Source

pub fn encrypt_block(&self, block: &mut [u8; 16])

Encrypt one 16-byte block in place.

Source

pub fn decrypt_block(&self, block: &mut [u8; 16])

Decrypt one 16-byte block in place.

Source

pub fn encrypt_blocks(&self, blocks: &mut [[u8; 16]])

v0.7 W1 — Encrypt N 16-byte blocks in place. Byte-identical to calling encrypt_block N times; under the sm4-bitsliced-simd feature this fans the SM4 round loop across the SIMD register width (8-block batches on x86_64 AVX2 via sbox_x32, 4-block batches on aarch64 NEON via sbox_x16). blocks.len() may be any value including zero; the tail after the largest multiple of SIMD_BATCH falls back to per-block encrypt_block. Cross-checked in tests/sm4_batch_api.rs.

Source

pub fn decrypt_blocks(&self, blocks: &mut [[u8; 16]])

v0.7 W1 — Decrypt N 16-byte blocks in place. Symmetric counterpart of encrypt_blocks; see that method’s docstring for the SIMD-fanout posture.

Trait Implementations§

Source§

impl BlockCipher for Sm4Cipher

Source§

fn new(key: &[u8]) -> Self

Construct from a key slice. key.len() must equal KEY_SIZE.

§Panics

Panics if key.len() != KEY_SIZE.

Source§

fn encrypt_block(&self, block: &mut [u8])

Encrypt one 16-byte block in place.

§Panics

Panics if block.len() != BLOCK_SIZE.

Source§

fn decrypt_block(&self, block: &mut [u8])

Decrypt one 16-byte block in place.

§Panics

Panics if block.len() != BLOCK_SIZE.

Source§

const BLOCK_SIZE: usize = BLOCK_SIZE

Block size in bytes (e.g. 16 for SM4).
Source§

impl BlockDecrypt for Sm4Cipher

Source§

fn decrypt_with_backend( &self, f: impl BlockClosure<BlockSize = Self::BlockSize>, )

Decrypt data using backend provided to the rank-2 closure.
Source§

fn decrypt_block_inout( &self, block: InOut<'_, '_, GenericArray<u8, Self::BlockSize>>, )

Decrypt single inout block.
Source§

fn decrypt_blocks_inout( &self, blocks: InOutBuf<'_, '_, GenericArray<u8, Self::BlockSize>>, )

Decrypt inout blocks.
Source§

fn decrypt_block(&self, block: &mut GenericArray<u8, Self::BlockSize>)

Decrypt single block in-place.
Source§

fn decrypt_block_b2b( &self, in_block: &GenericArray<u8, Self::BlockSize>, out_block: &mut GenericArray<u8, Self::BlockSize>, )

Decrypt in_block and write result to out_block.
Source§

fn decrypt_blocks(&self, blocks: &mut [GenericArray<u8, Self::BlockSize>])

Decrypt blocks in-place.
Source§

fn decrypt_blocks_b2b( &self, in_blocks: &[GenericArray<u8, Self::BlockSize>], out_blocks: &mut [GenericArray<u8, Self::BlockSize>], ) -> Result<(), NotEqualError>

Decrypt blocks buffer-to-buffer. Read more
Source§

impl BlockEncrypt for Sm4Cipher

Source§

fn encrypt_with_backend( &self, f: impl BlockClosure<BlockSize = Self::BlockSize>, )

Encrypt data using backend provided to the rank-2 closure.
Source§

fn encrypt_block_inout( &self, block: InOut<'_, '_, GenericArray<u8, Self::BlockSize>>, )

Encrypt single inout block.
Source§

fn encrypt_blocks_inout( &self, blocks: InOutBuf<'_, '_, GenericArray<u8, Self::BlockSize>>, )

Encrypt inout blocks.
Source§

fn encrypt_block(&self, block: &mut GenericArray<u8, Self::BlockSize>)

Encrypt single block in-place.
Source§

fn encrypt_block_b2b( &self, in_block: &GenericArray<u8, Self::BlockSize>, out_block: &mut GenericArray<u8, Self::BlockSize>, )

Encrypt in_block and write result to out_block.
Source§

fn encrypt_blocks(&self, blocks: &mut [GenericArray<u8, Self::BlockSize>])

Encrypt blocks in-place.
Source§

fn encrypt_blocks_b2b( &self, in_blocks: &[GenericArray<u8, Self::BlockSize>], out_blocks: &mut [GenericArray<u8, Self::BlockSize>], ) -> Result<(), NotEqualError>

Encrypt blocks buffer-to-buffer. Read more
Source§

impl BlockSizeUser for Sm4Cipher

Source§

type BlockSize = UInt<UInt<UInt<UInt<UInt<UTerm, B1>, B0>, B0>, B0>, B0>

Size of the block in bytes.
Source§

fn block_size() -> usize

Return block size in bytes.
Source§

impl Clone for Sm4Cipher

Source§

fn clone(&self) -> Sm4Cipher

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Drop for Sm4Cipher

Source§

fn drop(&mut self)

Executes the destructor for this type. Read more
Source§

fn pin_drop(self: Pin<&mut Self>)

🔬This is a nightly-only experimental API. (pin_ergonomics)
Execute the destructor for this type, but different to Drop::drop, it requires self to be pinned. Read more
Source§

impl KeyInit for Sm4Cipher

Source§

fn new(key: &Key<Self>) -> Self

Create new value from fixed size key.
Source§

fn new_from_slice(key: &[u8]) -> Result<Self, InvalidLength>

Create new value from variable size key.
Source§

impl KeySizeUser for Sm4Cipher

Source§

type KeySize = UInt<UInt<UInt<UInt<UInt<UTerm, B1>, B0>, B0>, B0>, B0>

Key size in bytes.
Source§

fn key_size() -> usize

Return key size in bytes.
Source§

impl Zeroize for Sm4Cipher

Source§

fn zeroize(&mut self)

Zero out this object from memory using Rust intrinsics which ensure the zeroization operation is not “optimized away” by the compiler.
Source§

impl BlockCipher for Sm4Cipher

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<Alg> BlockDecryptMut for Alg
where Alg: BlockDecrypt,

Source§

fn decrypt_with_backend_mut( &mut self, f: impl BlockClosure<BlockSize = <Alg as BlockSizeUser>::BlockSize>, )

Decrypt data using backend provided to the rank-2 closure.
Source§

fn decrypt_block_inout_mut( &mut self, block: InOut<'_, '_, GenericArray<u8, Self::BlockSize>>, )

Decrypt single inout block.
Source§

fn decrypt_blocks_inout_mut( &mut self, blocks: InOutBuf<'_, '_, GenericArray<u8, Self::BlockSize>>, )

Decrypt inout blocks.
Source§

fn decrypt_block_mut(&mut self, block: &mut GenericArray<u8, Self::BlockSize>)

Decrypt single block in-place.
Source§

fn decrypt_block_b2b_mut( &mut self, in_block: &GenericArray<u8, Self::BlockSize>, out_block: &mut GenericArray<u8, Self::BlockSize>, )

Decrypt in_block and write result to out_block.
Source§

fn decrypt_blocks_mut( &mut self, blocks: &mut [GenericArray<u8, Self::BlockSize>], )

Decrypt blocks in-place.
Source§

fn decrypt_blocks_b2b_mut( &mut self, in_blocks: &[GenericArray<u8, Self::BlockSize>], out_blocks: &mut [GenericArray<u8, Self::BlockSize>], ) -> Result<(), NotEqualError>

Decrypt blocks buffer-to-buffer. Read more
Source§

impl<Alg> BlockEncryptMut for Alg
where Alg: BlockEncrypt,

Source§

fn encrypt_with_backend_mut( &mut self, f: impl BlockClosure<BlockSize = <Alg as BlockSizeUser>::BlockSize>, )

Encrypt data using backend provided to the rank-2 closure.
Source§

fn encrypt_block_inout_mut( &mut self, block: InOut<'_, '_, GenericArray<u8, Self::BlockSize>>, )

Encrypt single inout block.
Source§

fn encrypt_blocks_inout_mut( &mut self, blocks: InOutBuf<'_, '_, GenericArray<u8, Self::BlockSize>>, )

Encrypt inout blocks.
Source§

fn encrypt_block_mut(&mut self, block: &mut GenericArray<u8, Self::BlockSize>)

Encrypt single block in-place.
Source§

fn encrypt_block_b2b_mut( &mut self, in_block: &GenericArray<u8, Self::BlockSize>, out_block: &mut GenericArray<u8, Self::BlockSize>, )

Encrypt in_block and write result to out_block.
Source§

fn encrypt_blocks_mut( &mut self, blocks: &mut [GenericArray<u8, Self::BlockSize>], )

Encrypt blocks in-place.
Source§

fn encrypt_blocks_b2b_mut( &mut self, in_blocks: &[GenericArray<u8, Self::BlockSize>], out_blocks: &mut [GenericArray<u8, Self::BlockSize>], ) -> Result<(), NotEqualError>

Encrypt blocks buffer-to-buffer. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.