size_t CRYPTO_nistcts128_decrypt_block(const unsigned char *in, unsigned char *out, size_t len, const void *key, unsigned char ivec[16], block128_f block) { size_t residue, n; union { size_t align; unsigned char c[32]; } tmp; assert(in && out && key && ivec); if (len < 16) return 0; residue = len % 16; if (residue == 0) { CRYPTO_cbc128_decrypt(in, out, len, key, ivec, block); return len; } len -= 16 + residue; if (len) { CRYPTO_cbc128_decrypt(in, out, len, key, ivec, block); in += len; out += len; } (*block) (in + residue, tmp.c + 16, key); memcpy(tmp.c, tmp.c + 16, 16); memcpy(tmp.c, in, residue); (*block) (tmp.c, tmp.c, key); for (n = 0; n < 16; ++n) { unsigned char c = in[n]; out[n] = tmp.c[n] ^ ivec[n]; ivec[n] = in[n + residue]; tmp.c[n] = c; } for (residue += 16; n < residue; ++n) out[n] = tmp.c[n] ^ tmp.c[n - 16]; return 16 + len + residue; }
void Camellia_cbc_encrypt (const unsigned char *in, unsigned char *out, size_t len, const CAMELLIA_KEY * key, unsigned char *ivec, const int enc) { if (enc) CRYPTO_cbc128_encrypt (in, out, len, key, ivec, (block128_f) Camellia_encrypt); else CRYPTO_cbc128_decrypt (in, out, len, key, ivec, (block128_f) Camellia_decrypt); }
void AES_cbc_encrypt (const unsigned char *in, unsigned char *out, size_t len, const AES_KEY * key, unsigned char *ivec, const int enc) { if (enc) CRYPTO_cbc128_encrypt (in, out, len, key, ivec, (block128_f) AES_encrypt); else CRYPTO_cbc128_decrypt (in, out, len, key, ivec, (block128_f) AES_decrypt); }
void sms4_cbc_encrypt(const unsigned char *in, unsigned char *out, size_t len, const sms4_key_t *key, unsigned char *ivec, int encrypt) { if(encrypt) CRYPTO_cbc128_encrypt(in,out,len,key,ivec,(block128_f)sms4_encrypt); else CRYPTO_cbc128_decrypt(in,out,len,key,ivec,(block128_f)sms4_encrypt); }
static int aes_cbc_cipher(EVP_CIPHER_CTX *ctx, uint8_t *out, const uint8_t *in, size_t len) { EVP_AES_KEY *dat = (EVP_AES_KEY *)ctx->cipher_data; if (dat->stream.cbc) { (*dat->stream.cbc)(in, out, len, &dat->ks, ctx->iv, ctx->encrypt); } else if (ctx->encrypt) { CRYPTO_cbc128_encrypt(in, out, len, &dat->ks, ctx->iv, dat->block); } else { CRYPTO_cbc128_decrypt(in, out, len, &dat->ks, ctx->iv, dat->block); } return 1; }
static int camellia_cbc_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t len) { EVP_CAMELLIA_KEY *dat = (EVP_CAMELLIA_KEY *) ctx->cipher_data; if (dat->stream.cbc) (*dat->stream.cbc) (in, out, len, &dat->ks, ctx->iv, ctx->encrypt); else if (ctx->encrypt) CRYPTO_cbc128_encrypt(in, out, len, &dat->ks, ctx->iv, dat->block); else CRYPTO_cbc128_decrypt(in, out, len, &dat->ks, ctx->iv, dat->block); return 1; }
static int camellia_cbc_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t len) { EVP_CAMELLIA_KEY *dat = EVP_C_DATA(EVP_CAMELLIA_KEY,ctx); if (dat->stream.cbc) (*dat->stream.cbc) (in, out, len, &dat->ks, EVP_CIPHER_CTX_iv_noconst(ctx), EVP_CIPHER_CTX_encrypting(ctx)); else if (EVP_CIPHER_CTX_encrypting(ctx)) CRYPTO_cbc128_encrypt(in, out, len, &dat->ks, EVP_CIPHER_CTX_iv_noconst(ctx), dat->block); else CRYPTO_cbc128_decrypt(in, out, len, &dat->ks, EVP_CIPHER_CTX_iv_noconst(ctx), dat->block); return 1; }