| GCC Code Coverage Report | |||||||||||||||||||||
        
  | 
    |||||||||||||||||||||
| Line | Branch | Exec | Source | 
1  | 
    /* $OpenBSD: digest.c,v 1.28 2017/05/02 03:59:44 deraadt Exp $ */  | 
    ||
2  | 
    /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)  | 
    ||
3  | 
    * All rights reserved.  | 
    ||
4  | 
    *  | 
    ||
5  | 
    * This package is an SSL implementation written  | 
    ||
6  | 
    * by Eric Young (eay@cryptsoft.com).  | 
    ||
7  | 
    * The implementation was written so as to conform with Netscapes SSL.  | 
    ||
8  | 
    *  | 
    ||
9  | 
    * This library is free for commercial and non-commercial use as long as  | 
    ||
10  | 
    * the following conditions are aheared to. The following conditions  | 
    ||
11  | 
    * apply to all code found in this distribution, be it the RC4, RSA,  | 
    ||
12  | 
    * lhash, DES, etc., code; not just the SSL code. The SSL documentation  | 
    ||
13  | 
    * included with this distribution is covered by the same copyright terms  | 
    ||
14  | 
    * except that the holder is Tim Hudson (tjh@cryptsoft.com).  | 
    ||
15  | 
    *  | 
    ||
16  | 
    * Copyright remains Eric Young's, and as such any Copyright notices in  | 
    ||
17  | 
    * the code are not to be removed.  | 
    ||
18  | 
    * If this package is used in a product, Eric Young should be given attribution  | 
    ||
19  | 
    * as the author of the parts of the library used.  | 
    ||
20  | 
    * This can be in the form of a textual message at program startup or  | 
    ||
21  | 
    * in documentation (online or textual) provided with the package.  | 
    ||
22  | 
    *  | 
    ||
23  | 
    * Redistribution and use in source and binary forms, with or without  | 
    ||
24  | 
    * modification, are permitted provided that the following conditions  | 
    ||
25  | 
    * are met:  | 
    ||
26  | 
    * 1. Redistributions of source code must retain the copyright  | 
    ||
27  | 
    * notice, this list of conditions and the following disclaimer.  | 
    ||
28  | 
    * 2. Redistributions in binary form must reproduce the above copyright  | 
    ||
29  | 
    * notice, this list of conditions and the following disclaimer in the  | 
    ||
30  | 
    * documentation and/or other materials provided with the distribution.  | 
    ||
31  | 
    * 3. All advertising materials mentioning features or use of this software  | 
    ||
32  | 
    * must display the following acknowledgement:  | 
    ||
33  | 
    * "This product includes cryptographic software written by  | 
    ||
34  | 
    * Eric Young (eay@cryptsoft.com)"  | 
    ||
35  | 
    * The word 'cryptographic' can be left out if the rouines from the library  | 
    ||
36  | 
    * being used are not cryptographic related :-).  | 
    ||
37  | 
    * 4. If you include any Windows specific code (or a derivative thereof) from  | 
    ||
38  | 
    * the apps directory (application code) you must include an acknowledgement:  | 
    ||
39  | 
    * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"  | 
    ||
40  | 
    *  | 
    ||
41  | 
    * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND  | 
    ||
42  | 
    * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE  | 
    ||
43  | 
    * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE  | 
    ||
44  | 
    * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE  | 
    ||
45  | 
    * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL  | 
    ||
46  | 
    * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS  | 
    ||
47  | 
    * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)  | 
    ||
48  | 
    * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT  | 
    ||
49  | 
    * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY  | 
    ||
50  | 
    * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF  | 
    ||
51  | 
    * SUCH DAMAGE.  | 
    ||
52  | 
    *  | 
    ||
53  | 
    * The licence and distribution terms for any publically available version or  | 
    ||
54  | 
    * derivative of this code cannot be changed. i.e. this code cannot simply be  | 
    ||
55  | 
    * copied and put under another distribution licence  | 
    ||
56  | 
    * [including the GNU Public Licence.]  | 
    ||
57  | 
    */  | 
    ||
58  | 
    /* ====================================================================  | 
    ||
59  | 
    * Copyright (c) 1998-2001 The OpenSSL Project. All rights reserved.  | 
    ||
60  | 
    *  | 
    ||
61  | 
    * Redistribution and use in source and binary forms, with or without  | 
    ||
62  | 
    * modification, are permitted provided that the following conditions  | 
    ||
63  | 
    * are met:  | 
    ||
64  | 
    *  | 
    ||
65  | 
    * 1. Redistributions of source code must retain the above copyright  | 
    ||
66  | 
    * notice, this list of conditions and the following disclaimer.  | 
    ||
67  | 
    *  | 
    ||
68  | 
    * 2. Redistributions in binary form must reproduce the above copyright  | 
    ||
69  | 
    * notice, this list of conditions and the following disclaimer in  | 
    ||
70  | 
    * the documentation and/or other materials provided with the  | 
    ||
71  | 
    * distribution.  | 
    ||
72  | 
    *  | 
    ||
73  | 
    * 3. All advertising materials mentioning features or use of this  | 
    ||
74  | 
    * software must display the following acknowledgment:  | 
    ||
75  | 
    * "This product includes software developed by the OpenSSL Project  | 
    ||
76  | 
    * for use in the OpenSSL Toolkit. (http://www.openssl.org/)"  | 
    ||
77  | 
    *  | 
    ||
78  | 
    * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to  | 
    ||
79  | 
    * endorse or promote products derived from this software without  | 
    ||
80  | 
    * prior written permission. For written permission, please contact  | 
    ||
81  | 
    * openssl-core@openssl.org.  | 
    ||
82  | 
    *  | 
    ||
83  | 
    * 5. Products derived from this software may not be called "OpenSSL"  | 
    ||
84  | 
    * nor may "OpenSSL" appear in their names without prior written  | 
    ||
85  | 
    * permission of the OpenSSL Project.  | 
    ||
86  | 
    *  | 
    ||
87  | 
    * 6. Redistributions of any form whatsoever must retain the following  | 
    ||
88  | 
    * acknowledgment:  | 
    ||
89  | 
    * "This product includes software developed by the OpenSSL Project  | 
    ||
90  | 
    * for use in the OpenSSL Toolkit (http://www.openssl.org/)"  | 
    ||
91  | 
    *  | 
    ||
92  | 
    * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY  | 
    ||
93  | 
    * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE  | 
    ||
94  | 
    * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR  | 
    ||
95  | 
    * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR  | 
    ||
96  | 
    * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,  | 
    ||
97  | 
    * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT  | 
    ||
98  | 
    * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  | 
    ||
99  | 
    * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)  | 
    ||
100  | 
    * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,  | 
    ||
101  | 
    * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)  | 
    ||
102  | 
    * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED  | 
    ||
103  | 
    * OF THE POSSIBILITY OF SUCH DAMAGE.  | 
    ||
104  | 
    * ====================================================================  | 
    ||
105  | 
    *  | 
    ||
106  | 
    * This product includes cryptographic software written by Eric Young  | 
    ||
107  | 
    * (eay@cryptsoft.com). This product includes software written by Tim  | 
    ||
108  | 
    * Hudson (tjh@cryptsoft.com).  | 
    ||
109  | 
    *  | 
    ||
110  | 
    */  | 
    ||
111  | 
    |||
112  | 
    #include <stdio.h>  | 
    ||
113  | 
    #include <string.h>  | 
    ||
114  | 
    |||
115  | 
    #include <openssl/opensslconf.h>  | 
    ||
116  | 
    |||
117  | 
    #include <openssl/err.h>  | 
    ||
118  | 
    #include <openssl/evp.h>  | 
    ||
119  | 
    #include <openssl/objects.h>  | 
    ||
120  | 
    |||
121  | 
    #ifndef OPENSSL_NO_ENGINE  | 
    ||
122  | 
    #include <openssl/engine.h>  | 
    ||
123  | 
    #endif  | 
    ||
124  | 
    |||
125  | 
    void  | 
    ||
126  | 
    EVP_MD_CTX_init(EVP_MD_CTX *ctx)  | 
    ||
127  | 
    { | 
    ||
128  | 
    6693424  | 
    memset(ctx, 0, sizeof *ctx);  | 
    |
129  | 
    3346712  | 
    }  | 
    |
130  | 
    |||
131  | 
    EVP_MD_CTX *  | 
    ||
132  | 
    EVP_MD_CTX_create(void)  | 
    ||
133  | 
    { | 
    ||
134  | 
    130440  | 
    return calloc(1, sizeof(EVP_MD_CTX));  | 
    |
135  | 
    }  | 
    ||
136  | 
    |||
137  | 
    int  | 
    ||
138  | 
    EVP_DigestInit(EVP_MD_CTX *ctx, const EVP_MD *type)  | 
    ||
139  | 
    { | 
    ||
140  | 
    388  | 
    EVP_MD_CTX_init(ctx);  | 
    |
141  | 
    194  | 
    return EVP_DigestInit_ex(ctx, type, NULL);  | 
    |
142  | 
    }  | 
    ||
143  | 
    |||
144  | 
    int  | 
    ||
145  | 
    EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE *impl)  | 
    ||
146  | 
    { | 
    ||
147  | 
    1269634  | 
    EVP_MD_CTX_clear_flags(ctx, EVP_MD_CTX_FLAG_CLEANED);  | 
    |
148  | 
    |||
149  | 
    #ifndef OPENSSL_NO_ENGINE  | 
    ||
150  | 
    /* Whether it's nice or not, "Inits" can be used on "Final"'d contexts  | 
    ||
151  | 
    * so this context may already have an ENGINE! Try to avoid releasing  | 
    ||
152  | 
    * the previous handle, re-querying for an ENGINE, and having a  | 
    ||
153  | 
    * reinitialisation, when it may all be unecessary. */  | 
    ||
154  | 
    ✗✓✗✗ ✗✗✗✗  | 
    634817  | 
    if (ctx->engine && ctx->digest && (!type ||  | 
    
155  | 
    (type && (type->type == ctx->digest->type))))  | 
    ||
156  | 
    goto skip_to_init;  | 
    ||
157  | 
    ✓✗ | 634817  | 
    	if (type) { | 
    
158  | 
    /* Ensure an ENGINE left lying around from last time is cleared  | 
    ||
159  | 
    * (the previous check attempted to avoid this if the same  | 
    ||
160  | 
    * ENGINE and EVP_MD could be used). */  | 
    ||
161  | 
    ✗✓ | 634817  | 
    if (ctx->engine)  | 
    
162  | 
    ENGINE_finish(ctx->engine);  | 
    ||
163  | 
    ✗✓ | 634817  | 
    		if (impl) { | 
    
164  | 
    			if (!ENGINE_init(impl)) { | 
    ||
165  | 
    EVPerror(EVP_R_INITIALIZATION_ERROR);  | 
    ||
166  | 
    return 0;  | 
    ||
167  | 
    }  | 
    ||
168  | 
    } else  | 
    ||
169  | 
    /* Ask if an ENGINE is reserved for this job */  | 
    ||
170  | 
    634817  | 
    impl = ENGINE_get_digest_engine(type->type);  | 
    |
171  | 
    ✗✓ | 634817  | 
    		if (impl) { | 
    
172  | 
    /* There's an ENGINE for this job ... (apparently) */  | 
    ||
173  | 
    const EVP_MD *d = ENGINE_get_digest(impl, type->type);  | 
    ||
174  | 
    			if (!d) { | 
    ||
175  | 
    /* Same comment from evp_enc.c */  | 
    ||
176  | 
    EVPerror(EVP_R_INITIALIZATION_ERROR);  | 
    ||
177  | 
    ENGINE_finish(impl);  | 
    ||
178  | 
    return 0;  | 
    ||
179  | 
    }  | 
    ||
180  | 
    /* We'll use the ENGINE's private digest definition */  | 
    ||
181  | 
    type = d;  | 
    ||
182  | 
    /* Store the ENGINE functional reference so we know  | 
    ||
183  | 
    * 'type' came from an ENGINE and we need to release  | 
    ||
184  | 
    * it when done. */  | 
    ||
185  | 
    ctx->engine = impl;  | 
    ||
186  | 
    } else  | 
    ||
187  | 
    634817  | 
    ctx->engine = NULL;  | 
    |
188  | 
    	} else if (!ctx->digest) { | 
    ||
189  | 
    EVPerror(EVP_R_NO_DIGEST_SET);  | 
    ||
190  | 
    return 0;  | 
    ||
191  | 
    }  | 
    ||
192  | 
    #endif  | 
    ||
193  | 
    ✓✓ | 634817  | 
    	if (ctx->digest != type) { | 
    
194  | 
    ✓✓✓✗ ✓✗✓✗  | 
    251669  | 
    if (ctx->digest && ctx->digest->ctx_size && ctx->md_data &&  | 
    
195  | 
    6  | 
    		    !EVP_MD_CTX_test_flags(ctx, EVP_MD_CTX_FLAG_REUSE)) { | 
    |
196  | 
    6  | 
    freezero(ctx->md_data, ctx->digest->ctx_size);  | 
    |
197  | 
    6  | 
    ctx->md_data = NULL;  | 
    |
198  | 
    6  | 
    }  | 
    |
199  | 
    251651  | 
    ctx->digest = type;  | 
    |
200  | 
    ✓✓✓✗ | 
    434170  | 
    		if (!(ctx->flags & EVP_MD_CTX_FLAG_NO_INIT) && type->ctx_size) { | 
    
201  | 
    182519  | 
    ctx->update = type->update;  | 
    |
202  | 
    182519  | 
    ctx->md_data = malloc(type->ctx_size);  | 
    |
203  | 
    ✗✓ | 182519  | 
    			if (ctx->md_data == NULL) { | 
    
204  | 
    EVP_PKEY_CTX_free(ctx->pctx);  | 
    ||
205  | 
    ctx->pctx = NULL;  | 
    ||
206  | 
    EVPerror(ERR_R_MALLOC_FAILURE);  | 
    ||
207  | 
    return 0;  | 
    ||
208  | 
    }  | 
    ||
209  | 
    }  | 
    ||
210  | 
    }  | 
    ||
211  | 
    #ifndef OPENSSL_NO_ENGINE  | 
    ||
212  | 
    skip_to_init:  | 
    ||
213  | 
    #endif  | 
    ||
214  | 
    ✓✓ | 634817  | 
    	if (ctx->pctx) { | 
    
215  | 
    int r;  | 
    ||
216  | 
    186586  | 
    r = EVP_PKEY_CTX_ctrl(ctx->pctx, -1, EVP_PKEY_OP_TYPE_SIG,  | 
    |
217  | 
    186586  | 
    EVP_PKEY_CTRL_DIGESTINIT, 0, ctx);  | 
    |
218  | 
    ✗✓ | 186586  | 
    if (r <= 0 && (r != -2))  | 
    
219  | 
    return 0;  | 
    ||
220  | 
    ✓✗ | 186586  | 
    }  | 
    
221  | 
    ✓✓ | 634817  | 
    if (ctx->flags & EVP_MD_CTX_FLAG_NO_INIT)  | 
    
222  | 
    185162  | 
    return 1;  | 
    |
223  | 
    449655  | 
    return ctx->digest->init(ctx);  | 
    |
224  | 
    634817  | 
    }  | 
    |
225  | 
    |||
226  | 
    int  | 
    ||
227  | 
    EVP_DigestUpdate(EVP_MD_CTX *ctx, const void *data, size_t count)  | 
    ||
228  | 
    { | 
    ||
229  | 
    5241594  | 
    return ctx->update(ctx, data, count);  | 
    |
230  | 
    }  | 
    ||
231  | 
    |||
232  | 
    /* The caller can assume that this removes any secret data from the context */  | 
    ||
233  | 
    int  | 
    ||
234  | 
    EVP_DigestFinal(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *size)  | 
    ||
235  | 
    { | 
    ||
236  | 
    int ret;  | 
    ||
237  | 
    |||
238  | 
    604  | 
    ret = EVP_DigestFinal_ex(ctx, md, size);  | 
    |
239  | 
    302  | 
    EVP_MD_CTX_cleanup(ctx);  | 
    |
240  | 
    302  | 
    return ret;  | 
    |
241  | 
    }  | 
    ||
242  | 
    |||
243  | 
    /* The caller can assume that this removes any secret data from the context */  | 
    ||
244  | 
    int  | 
    ||
245  | 
    EVP_DigestFinal_ex(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *size)  | 
    ||
246  | 
    { | 
    ||
247  | 
    int ret;  | 
    ||
248  | 
    |||
249  | 
    ✗✓ | 2258290  | 
    	if ((size_t)ctx->digest->md_size > EVP_MAX_MD_SIZE) { | 
    
250  | 
    EVPerror(EVP_R_TOO_LARGE);  | 
    ||
251  | 
    return 0;  | 
    ||
252  | 
    }  | 
    ||
253  | 
    1129145  | 
    ret = ctx->digest->final(ctx, md);  | 
    |
254  | 
    ✓✓ | 1129145  | 
    if (size != NULL)  | 
    
255  | 
    748998  | 
    *size = ctx->digest->md_size;  | 
    |
256  | 
    ✗✓ | 1129145  | 
    	if (ctx->digest->cleanup) { | 
    
257  | 
    ctx->digest->cleanup(ctx);  | 
    ||
258  | 
    EVP_MD_CTX_set_flags(ctx, EVP_MD_CTX_FLAG_CLEANED);  | 
    ||
259  | 
    }  | 
    ||
260  | 
    1129145  | 
    memset(ctx->md_data, 0, ctx->digest->ctx_size);  | 
    |
261  | 
    1129145  | 
    return ret;  | 
    |
262  | 
    1129145  | 
    }  | 
    |
263  | 
    |||
264  | 
    int  | 
    ||
265  | 
    EVP_MD_CTX_copy(EVP_MD_CTX *out, const EVP_MD_CTX *in)  | 
    ||
266  | 
    { | 
    ||
267  | 
    3059016  | 
    EVP_MD_CTX_init(out);  | 
    |
268  | 
    1529508  | 
    return EVP_MD_CTX_copy_ex(out, in);  | 
    |
269  | 
    }  | 
    ||
270  | 
    |||
271  | 
    int  | 
    ||
272  | 
    EVP_MD_CTX_copy_ex(EVP_MD_CTX *out, const EVP_MD_CTX *in)  | 
    ||
273  | 
    { | 
    ||
274  | 
    unsigned char *tmp_buf;  | 
    ||
275  | 
    |||
276  | 
    ✓✗✗✓ | 
    7381992  | 
    	if ((in == NULL) || (in->digest == NULL)) { | 
    
277  | 
    EVPerror(EVP_R_INPUT_NOT_INITIALIZED);  | 
    ||
278  | 
    return 0;  | 
    ||
279  | 
    }  | 
    ||
280  | 
    #ifndef OPENSSL_NO_ENGINE  | 
    ||
281  | 
    /* Make sure it's safe to copy a digest context using an ENGINE */  | 
    ||
282  | 
    ✗✓✗✗ | 
    2460664  | 
    	if (in->engine && !ENGINE_init(in->engine)) { | 
    
283  | 
    EVPerror(ERR_R_ENGINE_LIB);  | 
    ||
284  | 
    return 0;  | 
    ||
285  | 
    }  | 
    ||
286  | 
    #endif  | 
    ||
287  | 
    |||
288  | 
    ✓✓ | 2460664  | 
    	if (out->digest == in->digest) { | 
    
289  | 
    625426  | 
    tmp_buf = out->md_data;  | 
    |
290  | 
    625426  | 
    EVP_MD_CTX_set_flags(out, EVP_MD_CTX_FLAG_REUSE);  | 
    |
291  | 
    625426  | 
    } else  | 
    |
292  | 
    tmp_buf = NULL;  | 
    ||
293  | 
    2460664  | 
    EVP_MD_CTX_cleanup(out);  | 
    |
294  | 
    2460664  | 
    memcpy(out, in, sizeof *out);  | 
    |
295  | 
    |||
296  | 
    ✓✓✓✗ | 
    4735354  | 
    	if (in->md_data && out->digest->ctx_size) { | 
    
297  | 
    ✓✓ | 2274690  | 
    if (tmp_buf)  | 
    
298  | 
    625426  | 
    out->md_data = tmp_buf;  | 
    |
299  | 
    		else { | 
    ||
300  | 
    1649264  | 
    out->md_data = malloc(out->digest->ctx_size);  | 
    |
301  | 
    ✗✓ | 1649264  | 
    			if (!out->md_data) { | 
    
302  | 
    EVPerror(ERR_R_MALLOC_FAILURE);  | 
    ||
303  | 
    return 0;  | 
    ||
304  | 
    }  | 
    ||
305  | 
    }  | 
    ||
306  | 
    2274690  | 
    memcpy(out->md_data, in->md_data, out->digest->ctx_size);  | 
    |
307  | 
    2274690  | 
    }  | 
    |
308  | 
    |||
309  | 
    2460664  | 
    out->update = in->update;  | 
    |
310  | 
    |||
311  | 
    ✓✓ | 2460664  | 
    	if (in->pctx) { | 
    
312  | 
    187398  | 
    out->pctx = EVP_PKEY_CTX_dup(in->pctx);  | 
    |
313  | 
    ✗✓ | 187398  | 
    		if (!out->pctx) { | 
    
314  | 
    EVP_MD_CTX_cleanup(out);  | 
    ||
315  | 
    return 0;  | 
    ||
316  | 
    }  | 
    ||
317  | 
    }  | 
    ||
318  | 
    |||
319  | 
    ✗✓ | 2460664  | 
    if (out->digest->copy)  | 
    
320  | 
    return out->digest->copy(out, in);  | 
    ||
321  | 
    |||
322  | 
    2460664  | 
    return 1;  | 
    |
323  | 
    2460664  | 
    }  | 
    |
324  | 
    |||
325  | 
    int  | 
    ||
326  | 
    EVP_Digest(const void *data, size_t count,  | 
    ||
327  | 
    unsigned char *md, unsigned int *size, const EVP_MD *type, ENGINE *impl)  | 
    ||
328  | 
    { | 
    ||
329  | 
    34854  | 
    EVP_MD_CTX ctx;  | 
    |
330  | 
    int ret;  | 
    ||
331  | 
    |||
332  | 
    17427  | 
    EVP_MD_CTX_init(&ctx);  | 
    |
333  | 
    17427  | 
    EVP_MD_CTX_set_flags(&ctx, EVP_MD_CTX_FLAG_ONESHOT);  | 
    |
334  | 
    ✓✗ | 17427  | 
    ret = EVP_DigestInit_ex(&ctx, type, impl) &&  | 
    
335  | 
    ✓✗ | 52281  | 
    EVP_DigestUpdate(&ctx, data, count) &&  | 
    
336  | 
    17427  | 
    EVP_DigestFinal_ex(&ctx, md, size);  | 
    |
337  | 
    17427  | 
    EVP_MD_CTX_cleanup(&ctx);  | 
    |
338  | 
    |||
339  | 
    17427  | 
    return ret;  | 
    |
340  | 
    17427  | 
    }  | 
    |
341  | 
    |||
342  | 
    void  | 
    ||
343  | 
    EVP_MD_CTX_destroy(EVP_MD_CTX *ctx)  | 
    ||
344  | 
    { | 
    ||
345  | 
    ✓✓ | 176978  | 
    	if (ctx) { | 
    
346  | 
    65088  | 
    EVP_MD_CTX_cleanup(ctx);  | 
    |
347  | 
    65088  | 
    free(ctx);  | 
    |
348  | 
    65088  | 
    }  | 
    |
349  | 
    88489  | 
    }  | 
    |
350  | 
    |||
351  | 
    /* This call frees resources associated with the context */  | 
    ||
352  | 
    int  | 
    ||
353  | 
    EVP_MD_CTX_cleanup(EVP_MD_CTX *ctx)  | 
    ||
354  | 
    { | 
    ||
355  | 
    /* Don't assume ctx->md_data was cleaned in EVP_Digest_Final,  | 
    ||
356  | 
    * because sometimes only copies of the context are ever finalised.  | 
    ||
357  | 
    */  | 
    ||
358  | 
    ✓✓✗✓ ✗✗  | 
    12223398  | 
    if (ctx->digest && ctx->digest->cleanup &&  | 
    
359  | 
    !EVP_MD_CTX_test_flags(ctx, EVP_MD_CTX_FLAG_CLEANED))  | 
    ||
360  | 
    ctx->digest->cleanup(ctx);  | 
    ||
361  | 
    ✓✓✓✗ ✓✓✓✓  | 
    12637013  | 
    if (ctx->digest && ctx->digest->ctx_size && ctx->md_data &&  | 
    
362  | 
    2457062  | 
    !EVP_MD_CTX_test_flags(ctx, EVP_MD_CTX_FLAG_REUSE))  | 
    |
363  | 
    1831636  | 
    freezero(ctx->md_data, ctx->digest->ctx_size);  | 
    |
364  | 
    4755615  | 
    EVP_PKEY_CTX_free(ctx->pctx);  | 
    |
365  | 
    #ifndef OPENSSL_NO_ENGINE  | 
    ||
366  | 
    ✗✓ | 4755615  | 
    if (ctx->engine)  | 
    
367  | 
    /* The EVP_MD we used belongs to an ENGINE, release the  | 
    ||
368  | 
    * functional reference we held for this reason. */  | 
    ||
369  | 
    ENGINE_finish(ctx->engine);  | 
    ||
370  | 
    #endif  | 
    ||
371  | 
    4755615  | 
    memset(ctx, 0, sizeof *ctx);  | 
    |
372  | 
    |||
373  | 
    4755615  | 
    return 1;  | 
    |
374  | 
    }  | 
    ||
375  | 
    |||
376  | 
    int  | 
    ||
377  | 
    EVP_MD_CTX_ctrl(EVP_MD_CTX *ctx, int type, int arg, void *ptr)  | 
    ||
378  | 
    { | 
    ||
379  | 
    int ret;  | 
    ||
380  | 
    |||
381  | 
    ✗✓ | 48  | 
    	if (!ctx->digest) { | 
    
382  | 
    EVPerror(EVP_R_NO_CIPHER_SET);  | 
    ||
383  | 
    return 0;  | 
    ||
384  | 
    }  | 
    ||
385  | 
    |||
386  | 
    ✗✓ | 24  | 
    	if (!ctx->digest->md_ctrl) { | 
    
387  | 
    EVPerror(EVP_R_CTRL_NOT_IMPLEMENTED);  | 
    ||
388  | 
    return 0;  | 
    ||
389  | 
    }  | 
    ||
390  | 
    |||
391  | 
    24  | 
    ret = ctx->digest->md_ctrl(ctx, type, arg, ptr);  | 
    |
392  | 
    ✗✓ | 24  | 
    	if (ret == -1) { | 
    
393  | 
    EVPerror(EVP_R_CTRL_OPERATION_NOT_IMPLEMENTED);  | 
    ||
394  | 
    return 0;  | 
    ||
395  | 
    }  | 
    ||
396  | 
    24  | 
    return ret;  | 
    |
397  | 
    24  | 
    }  | 
    
| Generated by: GCOVR (Version 3.3) |