* communication to fail after 2^64 - 1 keys. We do this on the encrypting
* side only.
*/
- if (ctx->encrypt && ++gctx->tls_enc_records == 0) {
+ if (enc && ++gctx->tls_enc_records == 0) {
ERR_raise(ERR_LIB_EVP, EVP_R_TOO_MANY_RECORDS);
goto err;
}
* communication to fail after 2^64 - 1 keys. We do this on the encrypting
* side only.
*/
- if (ctx->encrypt && ++gctx->tls_enc_records == 0) {
+ if (EVP_CIPHER_CTX_is_encrypting(ctx) && ++gctx->tls_enc_records == 0) {
ERR_raise(ERR_LIB_EVP, EVP_R_TOO_MANY_RECORDS);
goto err;
}
* Set IV from start of buffer or generate IV and write to start of
* buffer.
*/
- if (EVP_CIPHER_CTX_ctrl(ctx, ctx->encrypt ? EVP_CTRL_GCM_IV_GEN
- : EVP_CTRL_GCM_SET_IV_INV,
+ if (EVP_CIPHER_CTX_ctrl(ctx,
+ EVP_CIPHER_CTX_is_encrypting(ctx) ?
+ EVP_CTRL_GCM_IV_GEN : EVP_CTRL_GCM_SET_IV_INV,
EVP_GCM_TLS_EXPLICIT_IV_LEN, out) <= 0)
goto err;
/* Use saved AAD */
- if (CRYPTO_gcm128_aad(&gctx->gcm, ctx->buf, gctx->tls_aad_len))
+ if (CRYPTO_gcm128_aad(&gctx->gcm, EVP_CIPHER_CTX_buf_noconst(ctx),
+ gctx->tls_aad_len))
goto err;
/* Fix buffer and length to point to payload */
in += EVP_GCM_TLS_EXPLICIT_IV_LEN;
out += EVP_GCM_TLS_EXPLICIT_IV_LEN;
len -= EVP_GCM_TLS_EXPLICIT_IV_LEN + EVP_GCM_TLS_TAG_LEN;
- if (ctx->encrypt) {
+ if (EVP_CIPHER_CTX_is_encrypting(ctx)) {
/* Encrypt payload */
if (gctx->ctr) {
size_t bulk = 0;
goto err;
}
/* Retrieve tag */
- CRYPTO_gcm128_tag(&gctx->gcm, ctx->buf, EVP_GCM_TLS_TAG_LEN);
+ CRYPTO_gcm128_tag(&gctx->gcm, EVP_CIPHER_CTX_buf_noconst(ctx),
+ EVP_GCM_TLS_TAG_LEN);
/* If tag mismatch wipe buffer */
- if (CRYPTO_memcmp(ctx->buf, in + len, EVP_GCM_TLS_TAG_LEN)) {
+ if (CRYPTO_memcmp(EVP_CIPHER_CTX_buf_noconst(ctx), in + len,
+ EVP_GCM_TLS_TAG_LEN)) {
OPENSSL_cleanse(out, len);
goto err;
}
* where setting the IV externally is the only option available.
*/
if (!gctx->iv_set) {
- if (!ctx->encrypt || !aes_gcm_iv_generate(gctx, 0))
+ if (!EVP_CIPHER_CTX_is_encrypting(ctx) || !aes_gcm_iv_generate(gctx, 0))
return -1;
CRYPTO_gcm128_setiv(&gctx->gcm, gctx->iv, gctx->ivlen);
gctx->iv_set = 1;
if (out == NULL) {
if (CRYPTO_gcm128_aad(&gctx->gcm, in, len))
return -1;
- } else if (ctx->encrypt) {
+ } else if (EVP_CIPHER_CTX_is_encrypting(ctx)) {
if (gctx->ctr) {
size_t bulk = 0;
#if defined(AES_GCM_ASM)
}
return len;
} else {
- if (!ctx->encrypt) {
+ if (!EVP_CIPHER_CTX_is_encrypting(ctx)) {
if (gctx->taglen < 0)
return -1;
- if (CRYPTO_gcm128_finish(&gctx->gcm, ctx->buf, gctx->taglen) != 0)
+ if (CRYPTO_gcm128_finish(&gctx->gcm,
+ EVP_CIPHER_CTX_buf_noconst(ctx),
+ gctx->taglen) != 0)
return -1;
gctx->iv_set = 0;
return 0;
}
- CRYPTO_gcm128_tag(&gctx->gcm, ctx->buf, 16);
+ CRYPTO_gcm128_tag(&gctx->gcm, EVP_CIPHER_CTX_buf_noconst(ctx), 16);
gctx->taglen = 16;
/* Don't reuse the IV */
gctx->iv_set = 0;
actx->len.text = plen;
if (plen) {
- if (ctx->encrypt)
+ if (EVP_CIPHER_CTX_is_encrypting(ctx))
ctr = xor128_encrypt_n_pad(out, in, ctr, plen);
else
ctr = xor128_decrypt_n_pad(out, in, ctr, plen);
actx->len.aad = EVP_AEAD_TLS1_AAD_LEN;
actx->len.text = plen;
- if (ctx->encrypt) {
+ if (EVP_CIPHER_CTX_is_encrypting(ctx)) {
for (i = 0; i < plen; i++) {
out[i] = ctr[i] ^= in[i];
}
actx->len.aad = EVP_AEAD_TLS1_AAD_LEN;
actx->len.text = plen;
- if (ctx->encrypt) {
+ if (EVP_CIPHER_CTX_is_encrypting(ctx)) {
ChaCha20_ctr32(out, in, plen, actx->key.key.d, actx->key.counter);
Poly1305_Update(POLY1305_ctx(actx), out, plen);
} else {
Poly1305_Update(POLY1305_ctx(actx), tohash, tohash_len);
OPENSSL_cleanse(buf, buf_len);
- Poly1305_Final(POLY1305_ctx(actx), ctx->encrypt ? actx->tag
- : tohash);
+ Poly1305_Final(POLY1305_ctx(actx),
+ EVP_CIPHER_CTX_is_encrypting(ctx) ? actx->tag : tohash);
actx->tls_payload_length = NO_TLS_PAYLOAD_LENGTH;
- if (ctx->encrypt) {
+ if (EVP_CIPHER_CTX_is_encrypting(ctx)) {
memcpy(out, actx->tag, POLY1305_BLOCK_SIZE);
} else {
if (CRYPTO_memcmp(tohash, in, POLY1305_BLOCK_SIZE)) {
else if (len != plen + POLY1305_BLOCK_SIZE)
return -1;
- if (ctx->encrypt) { /* plaintext */
+ if (EVP_CIPHER_CTX_is_encrypting(ctx)) { /* plaintext */
chacha_cipher(ctx, out, in, plen);
Poly1305_Update(POLY1305_ctx(actx), out, plen);
in += plen;
Poly1305_Update(POLY1305_ctx(actx), temp, POLY1305_BLOCK_SIZE);
}
- Poly1305_Final(POLY1305_ctx(actx), ctx->encrypt ? actx->tag
- : temp);
+ Poly1305_Final(POLY1305_ctx(actx),
+ EVP_CIPHER_CTX_is_encrypting(ctx) ? actx->tag : temp);
actx->mac_inited = 0;
if (in != NULL && len != plen) { /* tls mode */
- if (ctx->encrypt) {
+ if (EVP_CIPHER_CTX_is_encrypting(ctx)) {
memcpy(out, actx->tag, POLY1305_BLOCK_SIZE);
} else {
if (CRYPTO_memcmp(temp, in, POLY1305_BLOCK_SIZE)) {
}
}
}
- else if (!ctx->encrypt) {
+ else if (!EVP_CIPHER_CTX_is_encrypting(ctx)) {
if (CRYPTO_memcmp(temp, actx->tag, actx->tag_len))
return -1;
}
return 1;
case EVP_CTRL_AEAD_GET_TAG:
- if (arg <= 0 || arg > POLY1305_BLOCK_SIZE || !ctx->encrypt)
+ if (arg <= 0 || arg > POLY1305_BLOCK_SIZE ||
+ !EVP_CIPHER_CTX_is_encrypting(ctx))
return 0;
memcpy(ptr, actx->tag, arg);
return 1;
len = aad[EVP_AEAD_TLS1_AAD_LEN - 2] << 8 |
aad[EVP_AEAD_TLS1_AAD_LEN - 1];
aad = actx->tls_aad;
- if (!ctx->encrypt) {
+ if (!EVP_CIPHER_CTX_is_encrypting(ctx)) {
if (len < POLY1305_BLOCK_SIZE)
return 0;
len -= POLY1305_BLOCK_SIZE; /* discount attached tag */