Skip to content

Commit

Permalink
Improve data channel crypto error messages
Browse files Browse the repository at this point in the history
 * Make decryption error messages better understandable.
 * Increase verbosity level for authentication errors, because those can
   be expected on bad connections.

Change-Id: I0fd48191babe4fe5c56f10eb3ba88182ffb075d1
Signed-off-by: Steffan Karger <[email protected]>
Acked-by: MaxF <[email protected]>
Message-Id: <[email protected]>
URL: https://www.mail-archive.com/[email protected]/msg29569.html
Signed-off-by: Gert Doering <[email protected]>
  • Loading branch information
syzzer authored and cron2 committed Oct 17, 2024
1 parent 33a700d commit bacdbbe
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 9 deletions.
14 changes: 7 additions & 7 deletions src/openvpn/crypto.c
Original file line number Diff line number Diff line change
Expand Up @@ -459,14 +459,14 @@ openvpn_decrypt_aead(struct buffer *buf, struct buffer work,
if (!cipher_ctx_update(ctx->cipher, BPTR(&work), &outlen, BPTR(buf),
data_len))
{
CRYPT_ERROR("cipher update failed");
CRYPT_ERROR("packet decryption failed");
}

ASSERT(buf_inc_len(&work, outlen));
if (!cipher_ctx_final_check_tag(ctx->cipher, BPTR(&work) + outlen,
&outlen, tag_ptr, tag_size))
{
CRYPT_ERROR("cipher final failed");
CRYPT_DROP("packet tag authentication failed");
}
ASSERT(buf_inc_len(&work, outlen));

Expand Down Expand Up @@ -538,7 +538,7 @@ openvpn_decrypt_v1(struct buffer *buf, struct buffer work,
/* Compare locally computed HMAC with packet HMAC */
if (memcmp_constant_time(local_hmac, BPTR(buf), hmac_len))
{
CRYPT_ERROR("packet HMAC authentication failed");
CRYPT_DROP("packet HMAC authentication failed");
}

ASSERT(buf_advance(buf, hmac_len));
Expand Down Expand Up @@ -572,26 +572,26 @@ openvpn_decrypt_v1(struct buffer *buf, struct buffer work,
/* ctx->cipher was already initialized with key & keylen */
if (!cipher_ctx_reset(ctx->cipher, iv_buf))
{
CRYPT_ERROR("cipher init failed");
CRYPT_ERROR("decrypt initialization failed");
}

/* Buffer overflow check (should never happen) */
if (!buf_safe(&work, buf->len + cipher_ctx_block_size(ctx->cipher)))
{
CRYPT_ERROR("potential buffer overflow");
CRYPT_ERROR("packet too big to decrypt");
}

/* Decrypt packet ID, payload */
if (!cipher_ctx_update(ctx->cipher, BPTR(&work), &outlen, BPTR(buf), BLEN(buf)))
{
CRYPT_ERROR("cipher update failed");
CRYPT_ERROR("packet decryption failed");
}
ASSERT(buf_inc_len(&work, outlen));

/* Flush the decryption buffer */
if (!cipher_ctx_final(ctx->cipher, BPTR(&work) + outlen, &outlen))
{
CRYPT_ERROR("cipher final failed");
CRYPT_DROP("packet authentication failed, dropping.");
}
ASSERT(buf_inc_len(&work, outlen));

Expand Down
7 changes: 5 additions & 2 deletions src/openvpn/crypto.h
Original file line number Diff line number Diff line change
Expand Up @@ -288,8 +288,11 @@ struct crypto_options
* security operation functions. */
};

#define CRYPT_ERROR(format) \
do { msg(D_CRYPT_ERRORS, "%s: " format, error_prefix); goto error_exit; } while (false)
#define CRYPT_ERROR_EXIT(flags, format) \
do { msg(flags, "%s: " format, error_prefix); goto error_exit; } while (false)

#define CRYPT_ERROR(format) CRYPT_ERROR_EXIT(D_CRYPT_ERRORS, format)
#define CRYPT_DROP(format) CRYPT_ERROR_EXIT(D_MULTI_DROPPED, format)

/**
* Minimal IV length for AEAD mode ciphers (in bytes):
Expand Down

0 comments on commit bacdbbe

Please sign in to comment.