@@ -44,8 +44,6 @@ auth_token_kt(void)
return (struct key_type) { 0 };
}
- kt.hmac_length = md_kt_size(kt.digest);
-
return kt;
}
@@ -693,7 +693,7 @@ crypto_adjust_frame_parameters(struct frame *frame,
crypto_overhead += cipher_kt_block_size(kt->cipher);
}
- crypto_overhead += kt->hmac_length;
+ crypto_overhead += md_kt_size(kt->digest);
frame_add_to_extra_frame(frame, crypto_overhead);
@@ -780,9 +780,9 @@ init_key_type(struct key_type *kt, const char *ciphername,
if (!aead_cipher) /* Ignore auth for AEAD ciphers */
{
kt->digest = md_kt_get(authname);
- kt->hmac_length = md_kt_size(kt->digest);
+ int hmac_length = md_kt_size(kt->digest);
- if (OPENVPN_MAX_HMAC_SIZE < kt->hmac_length)
+ if (OPENVPN_MAX_HMAC_SIZE < hmac_length)
{
msg(M_FATAL, "HMAC '%s' not allowed: digest size too big.", authname);
}
@@ -828,17 +828,17 @@ init_key_ctx(struct key_ctx *ctx, const struct key *key,
cipher_kt_iv_size(kt->cipher));
warn_insecure_key_type(ciphername, kt->cipher);
}
- if (kt->digest && kt->hmac_length > 0)
+ if (kt->digest)
{
ctx->hmac = hmac_ctx_new();
- hmac_ctx_init(ctx->hmac, key->hmac, kt->hmac_length, kt->digest);
+ hmac_ctx_init(ctx->hmac, key->hmac, kt->digest);
msg(D_HANDSHAKE,
"%s: Using %d bit message hash '%s' for HMAC authentication",
prefix, md_kt_size(kt->digest) * 8, md_kt_name(kt->digest));
dmsg(D_SHOW_KEYS, "%s: HMAC KEY: %s", prefix,
- format_hex(key->hmac, kt->hmac_length, 0, &gc));
+ format_hex(key->hmac, md_kt_size(kt->digest), 0, &gc));
dmsg(D_CRYPTO_DEBUG, "%s: HMAC size=%d block_size=%d",
prefix,
@@ -958,9 +958,11 @@ generate_key_random(struct key *key, const struct key_type *kt)
{
cipher_len = cipher_kt_key_size(kt->cipher);
- if (kt->digest && kt->hmac_length > 0 && kt->hmac_length <= hmac_len)
+ int kt_hmac_length = md_kt_size(kt->digest);
+
+ if (kt->digest && kt_hmac_length > 0 && kt_hmac_length <= hmac_len)
{
- hmac_len = kt->hmac_length;
+ hmac_len = kt_hmac_length;
}
}
if (!rand_bytes(key->cipher, cipher_len)
@@ -993,13 +995,13 @@ key2_print(const struct key2 *k,
format_hex(k->keys[0].cipher, cipher_kt_key_size(kt->cipher), 0, &gc));
dmsg(D_SHOW_KEY_SOURCE, "%s (hmac): %s",
prefix0,
- format_hex(k->keys[0].hmac, kt->hmac_length, 0, &gc));
+ format_hex(k->keys[0].hmac, md_kt_size(kt->digest), 0, &gc));
dmsg(D_SHOW_KEY_SOURCE, "%s (cipher): %s",
prefix1,
format_hex(k->keys[1].cipher, cipher_kt_key_size(kt->cipher), 0, &gc));
dmsg(D_SHOW_KEY_SOURCE, "%s (hmac): %s",
prefix1,
- format_hex(k->keys[1].hmac, kt->hmac_length, 0, &gc));
+ format_hex(k->keys[1].hmac, md_kt_size(kt->digest), 0, &gc));
gc_free(&gc);
}
@@ -1527,14 +1529,17 @@ write_key(const struct key *key, const struct key_type *kt,
struct buffer *buf)
{
ASSERT(cipher_kt_key_size(kt->cipher) <= MAX_CIPHER_KEY_LENGTH
- && kt->hmac_length <= MAX_HMAC_KEY_LENGTH);
+ && md_kt_size(kt->digest) <= MAX_HMAC_KEY_LENGTH);
const uint8_t cipher_length = cipher_kt_key_size(kt->cipher);
if (!buf_write(buf, &cipher_length, 1))
{
return false;
}
- if (!buf_write(buf, &kt->hmac_length, 1))
+
+ uint8_t hmac_length = md_kt_size(kt->digest);
+
+ if (!buf_write(buf, &hmac_length, 1))
{
return false;
}
@@ -1542,7 +1547,7 @@ write_key(const struct key *key, const struct key_type *kt,
{
return false;
}
- if (!buf_write(buf, key->hmac, kt->hmac_length))
+ if (!buf_write(buf, key->hmac, hmac_length))
{
return false;
}
@@ -1572,7 +1577,7 @@ read_key(struct key *key, const struct key_type *kt, struct buffer *buf)
goto read_err;
}
- if (cipher_length != cipher_kt_key_size(kt->cipher) || hmac_length != kt->hmac_length)
+ if (cipher_length != cipher_kt_key_size(kt->cipher) || hmac_length != md_kt_size(kt->digest))
{
goto key_len_err;
}
@@ -1595,7 +1600,7 @@ read_err:
key_len_err:
msg(D_TLS_ERRORS,
"TLS Error: key length mismatch, local cipher/hmac %d/%d, remote cipher/hmac %d/%d",
- cipher_kt_key_size(kt->cipher), kt->hmac_length, cipher_length, hmac_length);
+ cipher_kt_key_size(kt->cipher), md_kt_size(kt->digest), cipher_length, hmac_length);
return 0;
}
@@ -138,7 +138,6 @@ struct sha256_digest {
*/
struct key_type
{
- uint8_t hmac_length; /**< HMAC length, in bytes */
const cipher_kt_t *cipher; /**< Cipher static parameters */
const md_kt_t *digest; /**< Message digest static parameters */
};
@@ -616,12 +616,10 @@ void hmac_ctx_free(hmac_ctx_t *ctx);
*
* @param ctx HMAC context to initialise
* @param key The key to use for the HMAC
- * @param key_len The key length to use
* @param kt Static message digest parameters
*
*/
-void hmac_ctx_init(hmac_ctx_t *ctx, const uint8_t *key, int key_length,
- const md_kt_t *kt);
+void hmac_ctx_init(hmac_ctx_t *ctx, const uint8_t *key, const md_kt_t *kt);
/*
* Free the given HMAC context.
@@ -867,12 +867,13 @@ hmac_ctx_free(mbedtls_md_context_t *ctx)
}
void
-hmac_ctx_init(mbedtls_md_context_t *ctx, const uint8_t *key, int key_len,
+hmac_ctx_init(mbedtls_md_context_t *ctx, const uint8_t *key,
const mbedtls_md_info_t *kt)
{
ASSERT(NULL != kt && NULL != ctx);
mbedtls_md_init(ctx);
+ int key_len = mbedtls_md_get_size(kt);
ASSERT(0 == mbedtls_md_setup(ctx, kt, 1));
ASSERT(0 == mbedtls_md_hmac_starts(ctx, key, key_len));
@@ -978,8 +979,15 @@ tls1_P_hash(const md_kt_t *md_kt, const uint8_t *sec, int sec_len,
int chunk = md_kt_size(md_kt);
unsigned int A1_len = md_kt_size(md_kt);
- hmac_ctx_init(ctx, sec, sec_len, md_kt);
- hmac_ctx_init(ctx_tmp, sec, sec_len, md_kt);
+ /* This is the only place where we init an HMAC with a key that is not
+ * equal to its size, therefore we init the hmac ctx manually here */
+ mbedtls_md_init(ctx);
+ ASSERT(0 == mbedtls_md_setup(ctx, md_kt, 1));
+ ASSERT(0 == mbedtls_md_hmac_starts(ctx, sec, sec_len));
+
+ mbedtls_md_init(ctx_tmp);
+ ASSERT(0 == mbedtls_md_setup(ctx_tmp, md_kt, 1));
+ ASSERT(0 == mbedtls_md_hmac_starts(ctx_tmp, sec, sec_len));
hmac_ctx_update(ctx,seed,seed_len);
hmac_ctx_final(ctx, A1);
@@ -1079,11 +1079,11 @@ hmac_ctx_free(HMAC_CTX *ctx)
}
void
-hmac_ctx_init(HMAC_CTX *ctx, const uint8_t *key, int key_len,
- const EVP_MD *kt)
+hmac_ctx_init(HMAC_CTX *ctx, const uint8_t *key, const EVP_MD *kt)
{
ASSERT(NULL != kt && NULL != ctx);
+ int key_len = EVP_MD_size(kt);
HMAC_CTX_reset(ctx);
if (!HMAC_Init_ex(ctx, key, key_len, kt, NULL))
{
@@ -1152,10 +1152,10 @@ hmac_ctx_free(hmac_ctx_t *ctx)
}
void
-hmac_ctx_init(hmac_ctx_t *ctx, const uint8_t *key, int key_len,
- const EVP_MD *kt)
+hmac_ctx_init(hmac_ctx_t *ctx, const uint8_t *key, const EVP_MD *kt)
{
ASSERT(NULL != kt && NULL != ctx && ctx->ctx != NULL);
+ int key_len = EVP_MD_size(kt);
ASSERT(key_len <= EVP_MAX_KEY_LENGTH);
/* We need to make a copy of the key since the OSSL parameters
@@ -2661,8 +2661,6 @@ do_init_tls_wrap_key(struct context *c)
if (!streq(options->authname, "none"))
{
c->c1.ks.tls_auth_key_type.digest = md_kt_get(options->authname);
- c->c1.ks.tls_auth_key_type.hmac_length =
- md_kt_size(c->c1.ks.tls_auth_key_type.digest);
}
else
{
@@ -81,13 +81,13 @@ gen_md4_hash(const uint8_t *data, int data_len, uint8_t *result)
}
static void
-gen_hmac_md5(const uint8_t *data, int data_len, const uint8_t *key, int key_len,
+gen_hmac_md5(const uint8_t *data, int data_len, const uint8_t *key,
uint8_t *result)
{
const md_kt_t *md5_kt = md_kt_get("MD5");
hmac_ctx_t *hmac_ctx = hmac_ctx_new();
- hmac_ctx_init(hmac_ctx, key, key_len, md5_kt);
+ hmac_ctx_init(hmac_ctx, key, md5_kt);
hmac_ctx_update(hmac_ctx, data, data_len);
hmac_ctx_final(hmac_ctx, result);
hmac_ctx_cleanup(hmac_ctx);
@@ -287,7 +287,7 @@ ntlm_phase_3(const struct http_proxy_info *p, const char *phase_2,
}
unicodize(userdomain_u, userdomain);
gen_hmac_md5((uint8_t *)userdomain_u, 2 * strlen(userdomain), md4_hash,
- MD5_DIGEST_LENGTH, ntlmv2_hash);
+ ntlmv2_hash);
/* NTLMv2 Blob */
memset(ntlmv2_blob, 0, 128); /* Clear blob buffer */
@@ -352,7 +352,7 @@ ntlm_phase_3(const struct http_proxy_info *p, const char *phase_2,
/* hmac-md5 */
gen_hmac_md5(&ntlmv2_response[8], ntlmv2_blob_size + 8, ntlmv2_hash,
- MD5_DIGEST_LENGTH, ntlmv2_hmacmd5);
+ ntlmv2_hmacmd5);
/* Add hmac-md5 result to the blob.
* Note: This overwrites challenge previously written at
@@ -526,7 +526,7 @@ struct context
#define PROTO_DUMP(buf, gc) protocol_dump((buf), \
PROTO_DUMP_FLAGS \
|(c->c2.tls_multi ? PD_TLS : 0) \
- |(c->options.tls_auth_file ? c->c1.ks.key_type.hmac_length : 0), \
+ |(c->options.tls_auth_file ? md_kt_size(c->c1.ks.key_type.digest) : 0), \
gc)
#define CIPHER_ENABLED(c) (c->c1.ks.key_type.cipher != NULL)
@@ -65,8 +65,6 @@ tls_crypt_kt(void)
return (struct key_type) { 0 };
}
- kt.hmac_length = md_kt_size(kt.digest);
-
return kt;
}
@@ -181,7 +181,7 @@ crypto_test_hmac(void **state)
uint8_t key[20];
memcpy(key, testkey, sizeof(key));
- hmac_ctx_init(hmac, key, 20, sha1);
+ hmac_ctx_init(hmac, key, sha1);
hmac_ctx_update(hmac, (const uint8_t *)ipsumlorem, (int) strlen(ipsumlorem));
hmac_ctx_update(hmac, (const uint8_t *)ipsumlorem, (int) strlen(ipsumlorem));
This field is only set once with md_kt_size and then only read. Remove this field and replace the read accesses with md_kt_size. Signed-off-by: Arne Schwabe <arne@rfc2549.org> --- src/openvpn/auth_token.c | 2 -- src/openvpn/crypto.c | 35 +++++++++++++++----------- src/openvpn/crypto.h | 1 - src/openvpn/crypto_backend.h | 4 +-- src/openvpn/crypto_mbedtls.c | 14 ++++++++--- src/openvpn/crypto_openssl.c | 8 +++--- src/openvpn/init.c | 2 -- src/openvpn/ntlm.c | 8 +++--- src/openvpn/openvpn.h | 2 +- src/openvpn/tls_crypt.c | 2 -- tests/unit_tests/openvpn/test_crypto.c | 2 +- 11 files changed, 42 insertions(+), 38 deletions(-)