OpenCoverage

gost89imit_pmeth.c

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/libressl/src/crypto/gost/gost89imit_pmeth.c
Source codeSwitch to Preprocessed file
LineSourceCount
1/* $OpenBSD: gost89imit_pmeth.c,v 1.4 2017/01/29 17:49:23 beck Exp $ */-
2/*-
3 * Copyright (c) 2014 Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>-
4 * Copyright (c) 2005-2006 Cryptocom LTD-
5 *-
6 * Redistribution and use in source and binary forms, with or without-
7 * modification, are permitted provided that the following conditions-
8 * are met:-
9 *-
10 * 1. Redistributions of source code must retain the above copyright-
11 * notice, this list of conditions and the following disclaimer.-
12 *-
13 * 2. Redistributions in binary form must reproduce the above copyright-
14 * notice, this list of conditions and the following disclaimer in-
15 * the documentation and/or other materials provided with the-
16 * distribution.-
17 *-
18 * 3. All advertising materials mentioning features or use of this-
19 * software must display the following acknowledgment:-
20 * "This product includes software developed by the OpenSSL Project-
21 * for use in the OpenSSL Toolkit. (http://www.openssl.org/)"-
22 *-
23 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to-
24 * endorse or promote products derived from this software without-
25 * prior written permission. For written permission, please contact-
26 * openssl-core@openssl.org.-
27 *-
28 * 5. Products derived from this software may not be called "OpenSSL"-
29 * nor may "OpenSSL" appear in their names without prior written-
30 * permission of the OpenSSL Project.-
31 *-
32 * 6. Redistributions of any form whatsoever must retain the following-
33 * acknowledgment:-
34 * "This product includes software developed by the OpenSSL Project-
35 * for use in the OpenSSL Toolkit (http://www.openssl.org/)"-
36 *-
37 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY-
38 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE-
39 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR-
40 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR-
41 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,-
42 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT-
43 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;-
44 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)-
45 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,-
46 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)-
47 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED-
48 * OF THE POSSIBILITY OF SUCH DAMAGE.-
49 * ====================================================================-
50 */-
51-
52#include <string.h>-
53-
54#include <openssl/opensslconf.h>-
55-
56#ifndef OPENSSL_NO_GOST-
57#include <openssl/evp.h>-
58#include <openssl/err.h>-
59#include <openssl/gost.h>-
60#include <openssl/x509v3.h> /* For string_to_hex */-
61-
62#include "evp_locl.h"-
63#include "gost_locl.h"-
64-
65struct gost_mac_pmeth_data {-
66 EVP_MD *md;-
67 unsigned char key[32];-
68 unsigned key_set :1;-
69};-
70-
71static int-
72pkey_gost_mac_init(EVP_PKEY_CTX *ctx)-
73{-
74 struct gost_mac_pmeth_data *data;-
75-
76 data = calloc(1, sizeof(struct gost_mac_pmeth_data));-
77 if (data == NULL)
data == ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 24 times by 1 test
Evaluated by:
  • gost2814789t
0-24
78 return 0;
never executed: return 0;
0
79 EVP_PKEY_CTX_set_data(ctx, data);-
80 return 1;
executed 24 times by 1 test: return 1;
Executed by:
  • gost2814789t
24
81}-
82-
83static void-
84pkey_gost_mac_cleanup(EVP_PKEY_CTX *ctx)-
85{-
86 struct gost_mac_pmeth_data *data = EVP_PKEY_CTX_get_data(ctx);-
87 free(data);-
88}
executed 24 times by 1 test: end of block
Executed by:
  • gost2814789t
24
89-
90static int-
91pkey_gost_mac_copy(EVP_PKEY_CTX *dst, EVP_PKEY_CTX *src)-
92{-
93 struct gost_mac_pmeth_data *dst_data, *src_data;-
94-
95 if (pkey_gost_mac_init(dst) == 0)
pkey_gost_mac_init(dst) == 0Description
TRUEnever evaluated
FALSEevaluated 8 times by 1 test
Evaluated by:
  • gost2814789t
0-8
96 return 0;
never executed: return 0;
0
97-
98 src_data = EVP_PKEY_CTX_get_data(src);-
99 dst_data = EVP_PKEY_CTX_get_data(dst);-
100-
101 *dst_data = *src_data;-
102-
103 return 1;
executed 8 times by 1 test: return 1;
Executed by:
  • gost2814789t
8
104}-
105-
106static int-
107pkey_gost_mac_keygen(EVP_PKEY_CTX *ctx, EVP_PKEY *pkey)-
108{-
109 struct gost_mac_pmeth_data *data = EVP_PKEY_CTX_get_data(ctx);-
110 unsigned char *keydata;-
111-
112 if (!data->key_set) {
!data->key_setDescription
TRUEnever evaluated
FALSEevaluated 8 times by 1 test
Evaluated by:
  • gost2814789t
0-8
113 GOSTerror(GOST_R_MAC_KEY_NOT_SET);-
114 return 0;
never executed: return 0;
0
115 }-
116-
117 keydata = malloc(32);-
118 if (keydata == NULL) {
keydata == ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 8 times by 1 test
Evaluated by:
  • gost2814789t
0-8
119 GOSTerror(ERR_R_MALLOC_FAILURE);-
120 return 0;
never executed: return 0;
0
121 }-
122 memcpy(keydata, data->key, 32);-
123 EVP_PKEY_assign(pkey, NID_id_Gost28147_89_MAC, keydata);-
124-
125 return 1;
executed 8 times by 1 test: return 1;
Executed by:
  • gost2814789t
8
126}-
127-
128static int-
129pkey_gost_mac_ctrl(EVP_PKEY_CTX *ctx, int type, int p1, void *p2)-
130{-
131 struct gost_mac_pmeth_data *data = EVP_PKEY_CTX_get_data(ctx);-
132-
133 switch (type) {-
134 case EVP_PKEY_CTRL_MD:
executed 8 times by 1 test: case 1:
Executed by:
  • gost2814789t
8
135 if (EVP_MD_type(p2) != NID_id_Gost28147_89_MAC) {
EVP_MD_type(p2) != 815Description
TRUEnever evaluated
FALSEevaluated 8 times by 1 test
Evaluated by:
  • gost2814789t
0-8
136 GOSTerror(GOST_R_INVALID_DIGEST_TYPE);-
137 return 0;
never executed: return 0;
0
138 }-
139 data->md = p2;-
140 return 1;
executed 8 times by 1 test: return 1;
Executed by:
  • gost2814789t
8
141-
142 case EVP_PKEY_CTRL_SET_MAC_KEY:
executed 8 times by 1 test: case 6:
Executed by:
  • gost2814789t
8
143 if (p1 != 32) {
p1 != 32Description
TRUEnever evaluated
FALSEevaluated 8 times by 1 test
Evaluated by:
  • gost2814789t
0-8
144 GOSTerror(GOST_R_INVALID_MAC_KEY_LENGTH);-
145 return 0;
never executed: return 0;
0
146 }-
147-
148 memcpy(data->key, p2, 32);-
149 data->key_set = 1;-
150 return 1;
executed 8 times by 1 test: return 1;
Executed by:
  • gost2814789t
8
151-
152 case EVP_PKEY_CTRL_DIGESTINIT:
executed 8 times by 1 test: case 7:
Executed by:
  • gost2814789t
8
153 {-
154 EVP_MD_CTX *mctx = p2;-
155 void *key;-
156-
157 if (!data->key_set) {
!data->key_setDescription
TRUEevaluated 8 times by 1 test
Evaluated by:
  • gost2814789t
FALSEnever evaluated
0-8
158 EVP_PKEY *pkey = EVP_PKEY_CTX_get0_pkey(ctx);-
159 if (pkey == NULL) {
pkey == ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 8 times by 1 test
Evaluated by:
  • gost2814789t
0-8
160 GOSTerror(GOST_R_MAC_KEY_NOT_SET);-
161 return 0;
never executed: return 0;
0
162 }-
163 key = EVP_PKEY_get0(pkey);-
164 if (key == NULL) {
key == ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 8 times by 1 test
Evaluated by:
  • gost2814789t
0-8
165 GOSTerror(GOST_R_MAC_KEY_NOT_SET);-
166 return 0;
never executed: return 0;
0
167 }-
168 } else {
executed 8 times by 1 test: end of block
Executed by:
  • gost2814789t
8
169 key = &(data->key);-
170 }
never executed: end of block
0
171 if (mctx->digest->md_ctrl == NULL)
mctx->digest->...== ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 8 times by 1 test
Evaluated by:
  • gost2814789t
0-8
172 return 0;
never executed: return 0;
0
173 return mctx->digest->md_ctrl(mctx, EVP_MD_CTRL_SET_KEY, 32 * 8,
executed 8 times by 1 test: return mctx->digest->md_ctrl(mctx, 0x3, 32 * 8, key);
Executed by:
  • gost2814789t
8
174 key);
executed 8 times by 1 test: return mctx->digest->md_ctrl(mctx, 0x3, 32 * 8, key);
Executed by:
  • gost2814789t
8
175 }-
176-
177 }-
178-
179 return -2;
never executed: return -2;
0
180}-
181-
182static int-
183pkey_gost_mac_ctrl_str(EVP_PKEY_CTX *ctx, const char *type, const char *value)-
184{-
185 if (value == NULL)
value == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
186 return 0;
never executed: return 0;
0
187 if (strcmp(type, "key") == 0) {
never executed: __result = (((const unsigned char *) (const char *) ( type ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( "key" ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
__extension__ ... )))); }) == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
188 void *p = (void *)value;-
189 return pkey_gost_mac_ctrl(ctx, EVP_PKEY_CTRL_SET_MAC_KEY,
never executed: return pkey_gost_mac_ctrl(ctx, 6, strlen(value), p);
0
190 strlen(value), p);
never executed: return pkey_gost_mac_ctrl(ctx, 6, strlen(value), p);
0
191 }-
192 if (strcmp(type, "hexkey") == 0) {
never executed: __result = (((const unsigned char *) (const char *) ( type ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( "hexkey" ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
__extension__ ... )))); }) == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
193 unsigned char *key;-
194 int r;-
195 long keylen;-
196-
197 key = string_to_hex(value, &keylen);-
198 if (key == NULL)
key == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
199 return 0;
never executed: return 0;
0
200 r = pkey_gost_mac_ctrl(ctx, EVP_PKEY_CTRL_SET_MAC_KEY, keylen,-
201 key);-
202 free(key);-
203 return r;
never executed: return r;
0
204 }-
205 return -2;
never executed: return -2;
0
206}-
207-
208static int-
209pkey_gost_mac_signctx_init(EVP_PKEY_CTX *ctx, EVP_MD_CTX *mctx)-
210{-
211 return 1;
executed 8 times by 1 test: return 1;
Executed by:
  • gost2814789t
8
212}-
213-
214static int-
215pkey_gost_mac_signctx(EVP_PKEY_CTX *ctx, unsigned char *sig, size_t *siglen,-
216 EVP_MD_CTX *mctx)-
217{-
218 /* for platforms where sizeof(int) != sizeof(size_t)*/-
219 unsigned int tmpsiglen = *siglen;-
220 int ret;-
221-
222 if (sig == NULL) {
sig == ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 8 times by 1 test
Evaluated by:
  • gost2814789t
0-8
223 *siglen = 4;-
224 return 1;
never executed: return 1;
0
225 }-
226-
227 ret = EVP_DigestFinal_ex(mctx, sig, &tmpsiglen);-
228 *siglen = tmpsiglen;-
229 return ret;
executed 8 times by 1 test: return ret;
Executed by:
  • gost2814789t
8
230}-
231-
232const EVP_PKEY_METHOD gostimit_pkey_meth = {-
233 .pkey_id = EVP_PKEY_GOSTIMIT,-
234-
235 .init = pkey_gost_mac_init,-
236 .cleanup = pkey_gost_mac_cleanup,-
237 .copy = pkey_gost_mac_copy,-
238-
239 .keygen = pkey_gost_mac_keygen,-
240-
241 .signctx_init = pkey_gost_mac_signctx_init,-
242 .signctx = pkey_gost_mac_signctx,-
243-
244 .ctrl = pkey_gost_mac_ctrl,-
245 .ctrl_str = pkey_gost_mac_ctrl_str,-
246};-
247-
248#endif-
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.2.2