CTS_BLOCK_SIZE
residue = len % CTS_BLOCK_SIZE;
if (!ctx->hw->cipher(ctx, out - CTS_BLOCK_SIZE + residue, tmp_in.c,
CTS_BLOCK_SIZE))
residue = len % CTS_BLOCK_SIZE;
len -= CTS_BLOCK_SIZE + residue;
memcpy(mid_iv.c, ctx->iv, CTS_BLOCK_SIZE);
memcpy(cn.c, in + residue, CTS_BLOCK_SIZE);
memset(ctx->iv, 0, CTS_BLOCK_SIZE);
if (!ctx->hw->cipher(ctx, pt_last.c, in + residue, CTS_BLOCK_SIZE))
memcpy(ct_mid.c + residue, pt_last.c + residue, CTS_BLOCK_SIZE - residue);
do_xor(ct_mid.c, pt_last.c, residue, out + CTS_BLOCK_SIZE);
memcpy(ctx->iv, mid_iv.c, CTS_BLOCK_SIZE);
if (!ctx->hw->cipher(ctx, out, ct_mid.c, CTS_BLOCK_SIZE))
memcpy(ctx->iv, cn.c, CTS_BLOCK_SIZE);
return len + CTS_BLOCK_SIZE + residue;
if (len < CTS_BLOCK_SIZE) /* CS3 requires at least one block */
if (len == CTS_BLOCK_SIZE)
residue = len % CTS_BLOCK_SIZE;
residue = CTS_BLOCK_SIZE;
memcpy(out, out - CTS_BLOCK_SIZE, residue);
if (!ctx->hw->cipher(ctx, out - CTS_BLOCK_SIZE, tmp_in.c, CTS_BLOCK_SIZE))
if (len < CTS_BLOCK_SIZE) /* CS3 requires at least one block */
if (len == CTS_BLOCK_SIZE)
residue = len % CTS_BLOCK_SIZE;
residue = CTS_BLOCK_SIZE;
len -= CTS_BLOCK_SIZE + residue;
memcpy(mid_iv.c, ctx->iv, CTS_BLOCK_SIZE);
memcpy(cn.c, in, CTS_BLOCK_SIZE);
memset(ctx->iv, 0, CTS_BLOCK_SIZE);
if (!ctx->hw->cipher(ctx, pt_last.c, in, CTS_BLOCK_SIZE))
memcpy(ct_mid.c, in + CTS_BLOCK_SIZE, residue);
if (residue != CTS_BLOCK_SIZE)
memcpy(ct_mid.c + residue, pt_last.c + residue, CTS_BLOCK_SIZE - residue);
do_xor(ct_mid.c, pt_last.c, residue, out + CTS_BLOCK_SIZE);
memcpy(ctx->iv, mid_iv.c, CTS_BLOCK_SIZE);
if (!ctx->hw->cipher(ctx, out, ct_mid.c, CTS_BLOCK_SIZE))
memcpy(ctx->iv, cn.c, CTS_BLOCK_SIZE);
return len + CTS_BLOCK_SIZE + residue;
if (len % CTS_BLOCK_SIZE == 0) {
if (len % CTS_BLOCK_SIZE == 0) {
if (inl < CTS_BLOCK_SIZE) /* There must be at least one block for CTS mode */
unsigned char c[CTS_BLOCK_SIZE];