@@ -43,19 +43,18 @@ _sol_message_digest_evp_init(struct sol_message_digest *handle, const EVP_MD *md
43
43
{
44
44
EVP_MD_CTX * ctx = sol_message_digest_common_get_context (handle );
45
45
46
- EVP_MD_CTX_init (ctx );
47
46
if (EVP_DigestInit_ex (ctx , md , NULL ))
48
47
return 0 ;
49
48
50
49
return - EINVAL ;
51
50
}
52
51
53
52
static void
54
- _sol_message_digest_evp_cleanup (struct sol_message_digest * handle )
53
+ _sol_message_digest_evp_reset (struct sol_message_digest * handle )
55
54
{
56
55
EVP_MD_CTX * ctx = sol_message_digest_common_get_context (handle );
57
56
58
- EVP_MD_CTX_cleanup (ctx );
57
+ EVP_MD_CTX_reset (ctx );
59
58
}
60
59
61
60
static ssize_t
@@ -87,27 +86,29 @@ _sol_message_digest_evp_read_digest(struct sol_message_digest *handle, void *mem
87
86
static const struct sol_message_digest_common_ops _sol_message_digest_evp_ops = {
88
87
.feed = _sol_message_digest_evp_feed ,
89
88
.read_digest = _sol_message_digest_evp_read_digest ,
90
- .cleanup = _sol_message_digest_evp_cleanup
89
+ .cleanup = _sol_message_digest_evp_reset
91
90
};
92
91
93
92
static int
94
93
_sol_message_digest_hmac_init (struct sol_message_digest * handle , const EVP_MD * md , const struct sol_str_slice key )
95
94
{
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 ;
97
99
98
- HMAC_CTX_init (ctx );
99
100
if (HMAC_Init_ex (ctx , key .data , key .len , md , NULL ))
100
101
return 0 ;
101
102
102
103
return - EINVAL ;
103
104
}
104
105
105
106
static void
106
- _sol_message_digest_hmac_cleanup (struct sol_message_digest * handle )
107
+ _sol_message_digest_hmac_reset (struct sol_message_digest * handle )
107
108
{
108
109
HMAC_CTX * ctx = sol_message_digest_common_get_context (handle );
109
110
110
- HMAC_CTX_cleanup (ctx );
111
+ HMAC_CTX_reset (ctx );
111
112
}
112
113
113
114
static ssize_t
@@ -139,7 +140,7 @@ _sol_message_digest_hmac_read_digest(struct sol_message_digest *handle, void *me
139
140
static const struct sol_message_digest_common_ops _sol_message_digest_hmac_ops = {
140
141
.feed = _sol_message_digest_hmac_feed ,
141
142
.read_digest = _sol_message_digest_hmac_read_digest ,
142
- .cleanup = _sol_message_digest_hmac_cleanup
143
+ .cleanup = _sol_message_digest_hmac_reset
143
144
};
144
145
145
146
SOL_API struct sol_message_digest *
@@ -172,17 +173,19 @@ sol_message_digest_new(const struct sol_message_digest_config *config)
172
173
173
174
params .config = config ;
174
175
params .ops = NULL ;
175
- params .context_template = NULL ;
176
176
177
177
md = EVP_get_digestbyname (config -> algorithm );
178
178
if (md ) {
179
+ params .context_handle = EVP_MD_CTX_new ();
180
+ params .context_free = (void (* )(void * ))EVP_MD_CTX_free ;
179
181
init_fn = _sol_message_digest_evp_init ;
180
182
params .ops = & _sol_message_digest_evp_ops ;
181
- params .context_size = sizeof (EVP_MD_CTX );
182
183
SOL_DBG ("using evp, md=%p, algorithm=\"%s\"" , md , config -> algorithm );
183
184
} else if (streqn (config -> algorithm , "hmac(" , strlen ("hmac(" ))) {
184
185
const char * p = config -> algorithm + strlen ("hmac(" );
185
186
size_t len = strlen (p );
187
+ params .context_handle = HMAC_CTX_new ();
188
+ params .context_free = (void (* )(void * ))HMAC_CTX_free ;
186
189
if (len > 1 && p [len - 1 ] == ')' ) {
187
190
char * mdname = strndupa (p , len - 1 );
188
191
md = EVP_get_digestbyname (mdname );
@@ -193,7 +196,6 @@ sol_message_digest_new(const struct sol_message_digest_config *config)
193
196
}
194
197
init_fn = _sol_message_digest_hmac_init ;
195
198
params .ops = & _sol_message_digest_hmac_ops ;
196
- params .context_size = sizeof (HMAC_CTX );
197
199
SOL_DBG ("using hmac, md=%p, algorithm=\"%s\"" , md , mdname );
198
200
}
199
201
}
0 commit comments