Pure Elixir SM4 block cipher (GM/T 0002-2012).
@type error_reason() :: :invalid_key_size | :invalid_iv_size | :invalid_block_size | :invalid_padding | :unsupported
@spec decrypt(binary(), binary(), keyword()) :: {:ok, binary()} | {:error, error_reason()}
@spec decrypt_cbc(binary(), binary(), binary(), keyword()) :: {:ok, binary()} | {:error, error_reason()}
@spec decrypt_ctr(binary(), binary(), binary(), keyword()) :: {:ok, binary()} | {:error, error_reason()}
@spec encrypt(binary(), binary(), keyword()) :: {:ok, binary()} | {:error, error_reason()}
@spec encrypt_cbc(binary(), binary(), binary(), keyword()) :: {:ok, binary()} | {:error, error_reason()}
@spec encrypt_ctr(binary(), binary(), binary(), keyword()) :: {:ok, binary()} | {:error, error_reason()}
@spec supported?() :: boolean()