|
@@ -21,19 +21,12 @@ struct dh_ctx {
|
|
|
MPI xa;
|
|
|
};
|
|
|
|
|
|
-static inline void dh_clear_params(struct dh_ctx *ctx)
|
|
|
+static void dh_clear_ctx(struct dh_ctx *ctx)
|
|
|
{
|
|
|
mpi_free(ctx->p);
|
|
|
mpi_free(ctx->g);
|
|
|
- ctx->p = NULL;
|
|
|
- ctx->g = NULL;
|
|
|
-}
|
|
|
-
|
|
|
-static void dh_free_ctx(struct dh_ctx *ctx)
|
|
|
-{
|
|
|
- dh_clear_params(ctx);
|
|
|
mpi_free(ctx->xa);
|
|
|
- ctx->xa = NULL;
|
|
|
+ memset(ctx, 0, sizeof(*ctx));
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -71,10 +64,8 @@ static int dh_set_params(struct dh_ctx *ctx, struct dh *params)
|
|
|
return -EINVAL;
|
|
|
|
|
|
ctx->g = mpi_read_raw_data(params->g, params->g_size);
|
|
|
- if (!ctx->g) {
|
|
|
- mpi_free(ctx->p);
|
|
|
+ if (!ctx->g)
|
|
|
return -EINVAL;
|
|
|
- }
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
@@ -86,21 +77,23 @@ static int dh_set_secret(struct crypto_kpp *tfm, const void *buf,
|
|
|
struct dh params;
|
|
|
|
|
|
/* Free the old MPI key if any */
|
|
|
- dh_free_ctx(ctx);
|
|
|
+ dh_clear_ctx(ctx);
|
|
|
|
|
|
if (crypto_dh_decode_key(buf, len, ¶ms) < 0)
|
|
|
- return -EINVAL;
|
|
|
+ goto err_clear_ctx;
|
|
|
|
|
|
if (dh_set_params(ctx, ¶ms) < 0)
|
|
|
- return -EINVAL;
|
|
|
+ goto err_clear_ctx;
|
|
|
|
|
|
ctx->xa = mpi_read_raw_data(params.key, params.key_size);
|
|
|
- if (!ctx->xa) {
|
|
|
- dh_clear_params(ctx);
|
|
|
- return -EINVAL;
|
|
|
- }
|
|
|
+ if (!ctx->xa)
|
|
|
+ goto err_clear_ctx;
|
|
|
|
|
|
return 0;
|
|
|
+
|
|
|
+err_clear_ctx:
|
|
|
+ dh_clear_ctx(ctx);
|
|
|
+ return -EINVAL;
|
|
|
}
|
|
|
|
|
|
static int dh_compute_value(struct kpp_request *req)
|
|
@@ -158,7 +151,7 @@ static void dh_exit_tfm(struct crypto_kpp *tfm)
|
|
|
{
|
|
|
struct dh_ctx *ctx = dh_get_ctx(tfm);
|
|
|
|
|
|
- dh_free_ctx(ctx);
|
|
|
+ dh_clear_ctx(ctx);
|
|
|
}
|
|
|
|
|
|
static struct kpp_alg dh = {
|