Skip to content
This repository was archived by the owner on Jun 27, 2019. It is now read-only.

Commit e877bff

Browse files
author
Gustavo Lima Chaves
committed
digest/openssl: adapt to new OpenSSL API
Signed-off-by: Gustavo Lima Chaves <[email protected]>
1 parent 52fdde0 commit e877bff

3 files changed

+59
-17
lines changed

src/lib/crypto/sol-message-digest-common.c

+28-5
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ struct sol_message_digest_pending_dispatch {
7777
struct sol_message_digest {
7878
void (*on_digest_ready)(void *data, struct sol_message_digest *handle, struct sol_blob *output);
7979
void (*on_feed_done)(void *data, struct sol_message_digest *handle, struct sol_blob *input, int status);
80+
void (*context_free)(void *context_handle);
8081
const void *data;
8182
const struct sol_message_digest_common_ops *ops;
8283
#ifdef MESSAGE_DIGEST_USE_THREAD
@@ -249,11 +250,18 @@ void *
249250
sol_message_digest_common_get_context(const struct sol_message_digest *handle)
250251
{
251252
size_t padding = sizeof(struct sol_message_digest) % sizeof(void *);
253+
void *ctx, **pctx;
252254

253255
if (padding > 0)
254256
padding = sizeof(void *) - padding;
255257

256-
return (char *)handle + sizeof(struct sol_message_digest) + padding;
258+
ctx = (char *)handle + sizeof(struct sol_message_digest) + padding;
259+
pctx = ctx;
260+
261+
if (!handle->context_free)
262+
return ctx;
263+
else
264+
return *pctx;
257265
}
258266

259267
struct sol_message_digest *
@@ -263,6 +271,7 @@ sol_message_digest_common_new(const struct sol_message_digest_common_new_params
263271
struct sol_message_digest *handle;
264272
size_t padding;
265273
int errno_bkp;
274+
void *context;
266275

267276
SOL_NULL_CHECK(params.ops, NULL);
268277
SOL_NULL_CHECK(params.ops->feed, NULL);
@@ -274,13 +283,24 @@ sol_message_digest_common_new(const struct sol_message_digest_common_new_params
274283
if (padding > 0)
275284
padding = sizeof(void *) - padding;
276285

277-
handle = calloc(1, sizeof(struct sol_message_digest) + padding + params.context_size);
286+
if (params.context_handle && !params.context_free) {
287+
SOL_WRN("a handle freeing function has to be set for external handlers");
288+
errno = EINVAL;
289+
return NULL;
290+
}
291+
292+
handle = calloc(1, sizeof(struct sol_message_digest) + padding +
293+
(params.context_handle ? sizeof(void *) : params.context_size));
278294
SOL_NULL_CHECK(handle, NULL);
279295

280-
if (params.context_template) {
281-
void *context = (char *)handle + sizeof(struct sol_message_digest) + padding;
296+
context = (char *)handle + sizeof(struct sol_message_digest) + padding;
297+
298+
if (params.context_handle) {
299+
void **pctx = context;
300+
*pctx = (void *)params.context_handle;
301+
handle->context_free = params.context_free;
302+
} else if (params.context_template)
282303
memcpy(context, params.context_template, params.context_size);
283-
}
284304

285305
handle->ops = params.ops;
286306

@@ -333,6 +353,9 @@ _sol_message_digest_free(struct sol_message_digest *handle)
333353

334354
handle->ops->cleanup(handle);
335355

356+
if (handle->context_free)
357+
handle->context_free(sol_message_digest_common_get_context(handle));
358+
336359
free(handle);
337360
}
338361

src/lib/crypto/sol-message-digest-common.h

+17
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,23 @@ struct sol_message_digest_common_new_params {
130130
* sol_message_digest_common_get_context().
131131
*/
132132
const void *context_template;
133+
/**
134+
* The algorithm-specific context as an external handle (i.e. life
135+
* cycle not managed by Soletta). If set, context_template will be
136+
* ignored and context_size will be set to sizeof(void *) forcibly
137+
* in order to accomodate this pointer exactly. context_free()
138+
* must be set when this one is non-NULL.
139+
*
140+
* The actual context may be retrieved with
141+
* sol_message_digest_common_get_context().
142+
*/
143+
const void *context_handle;
144+
/**
145+
* Free external context handle at exit.
146+
*
147+
* This function is called from the main thread.
148+
*/
149+
void (*context_free)(void *context_handle);
133150
/**
134151
* Size in bytes of @c context_template, to copy with @c memcpy().
135152
*/

src/lib/crypto/sol-message-digest-impl-openssl.c

+14-12
Original file line numberDiff line numberDiff line change
@@ -43,19 +43,18 @@ _sol_message_digest_evp_init(struct sol_message_digest *handle, const EVP_MD *md
4343
{
4444
EVP_MD_CTX *ctx = sol_message_digest_common_get_context(handle);
4545

46-
EVP_MD_CTX_init(ctx);
4746
if (EVP_DigestInit_ex(ctx, md, NULL))
4847
return 0;
4948

5049
return -EINVAL;
5150
}
5251

5352
static void
54-
_sol_message_digest_evp_cleanup(struct sol_message_digest *handle)
53+
_sol_message_digest_evp_reset(struct sol_message_digest *handle)
5554
{
5655
EVP_MD_CTX *ctx = sol_message_digest_common_get_context(handle);
5756

58-
EVP_MD_CTX_cleanup(ctx);
57+
EVP_MD_CTX_reset(ctx);
5958
}
6059

6160
static ssize_t
@@ -87,27 +86,29 @@ _sol_message_digest_evp_read_digest(struct sol_message_digest *handle, void *mem
8786
static const struct sol_message_digest_common_ops _sol_message_digest_evp_ops = {
8887
.feed = _sol_message_digest_evp_feed,
8988
.read_digest = _sol_message_digest_evp_read_digest,
90-
.cleanup = _sol_message_digest_evp_cleanup
89+
.cleanup = _sol_message_digest_evp_reset
9190
};
9291

9392
static int
9493
_sol_message_digest_hmac_init(struct sol_message_digest *handle, const EVP_MD *md, const struct sol_str_slice key)
9594
{
96-
HMAC_CTX *ctx = sol_message_digest_common_get_context(handle);
95+
HMAC_CTX *ctx = HMAC_CTX_new();
96+
97+
if (!ctx)
98+
return -ENOMEM;
9799

98-
HMAC_CTX_init(ctx);
99100
if (HMAC_Init_ex(ctx, key.data, key.len, md, NULL))
100101
return 0;
101102

102103
return -EINVAL;
103104
}
104105

105106
static void
106-
_sol_message_digest_hmac_cleanup(struct sol_message_digest *handle)
107+
_sol_message_digest_hmac_reset(struct sol_message_digest *handle)
107108
{
108109
HMAC_CTX *ctx = sol_message_digest_common_get_context(handle);
109110

110-
HMAC_CTX_cleanup(ctx);
111+
HMAC_CTX_reset(ctx);
111112
}
112113

113114
static ssize_t
@@ -139,7 +140,7 @@ _sol_message_digest_hmac_read_digest(struct sol_message_digest *handle, void *me
139140
static const struct sol_message_digest_common_ops _sol_message_digest_hmac_ops = {
140141
.feed = _sol_message_digest_hmac_feed,
141142
.read_digest = _sol_message_digest_hmac_read_digest,
142-
.cleanup = _sol_message_digest_hmac_cleanup
143+
.cleanup = _sol_message_digest_hmac_reset
143144
};
144145

145146
SOL_API struct sol_message_digest *
@@ -172,17 +173,19 @@ sol_message_digest_new(const struct sol_message_digest_config *config)
172173

173174
params.config = config;
174175
params.ops = NULL;
175-
params.context_template = NULL;
176176

177177
md = EVP_get_digestbyname(config->algorithm);
178178
if (md) {
179+
params.context_handle = EVP_MD_CTX_new();
180+
params.context_free = (void (*)(void *))EVP_MD_CTX_free;
179181
init_fn = _sol_message_digest_evp_init;
180182
params.ops = &_sol_message_digest_evp_ops;
181-
params.context_size = sizeof(EVP_MD_CTX);
182183
SOL_DBG("using evp, md=%p, algorithm=\"%s\"", md, config->algorithm);
183184
} else if (streqn(config->algorithm, "hmac(", strlen("hmac("))) {
184185
const char *p = config->algorithm + strlen("hmac(");
185186
size_t len = strlen(p);
187+
params.context_handle = HMAC_CTX_new();
188+
params.context_free = (void (*)(void *))HMAC_CTX_free;
186189
if (len > 1 && p[len - 1] == ')') {
187190
char *mdname = strndupa(p, len - 1);
188191
md = EVP_get_digestbyname(mdname);
@@ -193,7 +196,6 @@ sol_message_digest_new(const struct sol_message_digest_config *config)
193196
}
194197
init_fn = _sol_message_digest_hmac_init;
195198
params.ops = &_sol_message_digest_hmac_ops;
196-
params.context_size = sizeof(HMAC_CTX);
197199
SOL_DBG("using hmac, md=%p, algorithm=\"%s\"", md, mdname);
198200
}
199201
}

0 commit comments

Comments
 (0)