OpenCoverage

gostr341001_pmeth.c

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/libressl/src/crypto/gost/gostr341001_pmeth.c
Source codeSwitch to Preprocessed file
LineSourceCount
1/* $OpenBSD: gostr341001_pmeth.c,v 1.14 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/bn.h>-
58#include <openssl/evp.h>-
59#include <openssl/err.h>-
60#include <openssl/gost.h>-
61#include <openssl/ec.h>-
62#include <openssl/ecdsa.h>-
63#include <openssl/x509.h>-
64-
65#include "evp_locl.h"-
66#include "gost_locl.h"-
67#include "gost_asn1.h"-
68-
69static ECDSA_SIG *-
70unpack_signature_cp(const unsigned char *sig, size_t siglen)-
71{-
72 ECDSA_SIG *s;-
73-
74 s = ECDSA_SIG_new();-
75 if (s == NULL) {
s == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
76 GOSTerror(ERR_R_MALLOC_FAILURE);-
77 return NULL;
never executed: return ((void *)0) ;
0
78 }-
79 BN_bin2bn(sig, siglen / 2, s->s);-
80 BN_bin2bn(sig + siglen / 2, siglen / 2, s->r);-
81 return s;
never executed: return s;
0
82}-
83-
84static int-
85pack_signature_cp(ECDSA_SIG *s, int order, unsigned char *sig, size_t *siglen)-
86{-
87 int r_len = BN_num_bytes(s->r);-
88 int s_len = BN_num_bytes(s->s);-
89-
90 if (r_len > order || s_len > order)
r_len > orderDescription
TRUEnever evaluated
FALSEnever evaluated
s_len > orderDescription
TRUEnever evaluated
FALSEnever evaluated
0
91 return 0;
never executed: return 0;
0
92-
93 *siglen = 2 * order;-
94-
95 memset(sig, 0, *siglen);-
96 BN_bn2bin(s->s, sig + order - s_len);-
97 BN_bn2bin(s->r, sig + 2 * order - r_len);-
98 ECDSA_SIG_free(s);-
99 return 1;
never executed: return 1;
0
100}-
101-
102static ECDSA_SIG *-
103unpack_signature_le(const unsigned char *sig, size_t siglen)-
104{-
105 ECDSA_SIG *s;-
106-
107 s = ECDSA_SIG_new();-
108 if (s == NULL) {
s == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
109 GOSTerror(ERR_R_MALLOC_FAILURE);-
110 return NULL;
never executed: return ((void *)0) ;
0
111 }-
112 GOST_le2bn(sig, siglen / 2, s->r);-
113 GOST_le2bn(sig + siglen / 2, siglen / 2, s->s);-
114 return s;
never executed: return s;
0
115}-
116-
117static int-
118pack_signature_le(ECDSA_SIG *s, int order, unsigned char *sig, size_t *siglen)-
119{-
120 *siglen = 2 * order;-
121 memset(sig, 0, *siglen);-
122 GOST_bn2le(s->r, sig, order);-
123 GOST_bn2le(s->s, sig + order, order);-
124 ECDSA_SIG_free(s);-
125 return 1;
never executed: return 1;
0
126}-
127-
128struct gost_pmeth_data {-
129 int sign_param_nid; /* Should be set whenever parameters are filled */-
130 int digest_nid;-
131 EVP_MD *md;-
132 unsigned char *shared_ukm;-
133 int peer_key_used;-
134 int sig_format;-
135};-
136-
137static int-
138pkey_gost01_init(EVP_PKEY_CTX *ctx)-
139{-
140 struct gost_pmeth_data *data;-
141 EVP_PKEY *pkey = EVP_PKEY_CTX_get0_pkey(ctx);-
142-
143 data = calloc(1, sizeof(struct gost_pmeth_data));-
144 if (data == NULL)
data == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
145 return 0;
never executed: return 0;
0
146-
147 if (pkey != NULL && pkey->pkey.gost != NULL) {
pkey != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
pkey->pkey.gost != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
148 data->sign_param_nid =-
149 EC_GROUP_get_curve_name(GOST_KEY_get0_group(pkey->pkey.gost));-
150 data->digest_nid = GOST_KEY_get_digest(pkey->pkey.gost);-
151 }
never executed: end of block
0
152 EVP_PKEY_CTX_set_data(ctx, data);-
153 return 1;
never executed: return 1;
0
154}-
155-
156/* Copies contents of gost_pmeth_data structure */-
157static int-
158pkey_gost01_copy(EVP_PKEY_CTX *dst, EVP_PKEY_CTX *src)-
159{-
160 struct gost_pmeth_data *dst_data, *src_data;-
161-
162 if (pkey_gost01_init(dst) == 0)
pkey_gost01_init(dst) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
163 return 0;
never executed: return 0;
0
164-
165 src_data = EVP_PKEY_CTX_get_data(src);-
166 dst_data = EVP_PKEY_CTX_get_data(dst);-
167 *dst_data = *src_data;-
168 if (src_data->shared_ukm != NULL)
src_data->shar...!= ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
169 dst_data->shared_ukm = NULL;
never executed: dst_data->shared_ukm = ((void *)0) ;
0
170 return 1;
never executed: return 1;
0
171}-
172-
173/* Frees up gost_pmeth_data structure */-
174static void-
175pkey_gost01_cleanup(EVP_PKEY_CTX *ctx)-
176{-
177 struct gost_pmeth_data *data = EVP_PKEY_CTX_get_data(ctx);-
178-
179 free(data->shared_ukm);-
180 free(data);-
181}
never executed: end of block
0
182-
183static int-
184pkey_gost01_paramgen(EVP_PKEY_CTX *ctx, EVP_PKEY *pkey)-
185{-
186 struct gost_pmeth_data *data = EVP_PKEY_CTX_get_data(ctx);-
187 EC_GROUP *group = NULL;-
188 GOST_KEY *gost = NULL;-
189 int ret = 0;-
190-
191 if (data->sign_param_nid == NID_undef ||
data->sign_param_nid == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
192 data->digest_nid == NID_undef) {
data->digest_nid == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
193 GOSTerror(GOST_R_NO_PARAMETERS_SET);-
194 return 0;
never executed: return 0;
0
195 }-
196-
197 group = EC_GROUP_new_by_curve_name(data->sign_param_nid);-
198 if (group == NULL)
group == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
199 goto done;
never executed: goto done;
0
200-
201 EC_GROUP_set_asn1_flag(group, OPENSSL_EC_NAMED_CURVE);-
202-
203 gost = GOST_KEY_new();-
204 if (gost == NULL)
gost == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
205 goto done;
never executed: goto done;
0
206-
207 if (GOST_KEY_set_digest(gost, data->digest_nid) == 0)
GOST_KEY_set_d...gest_nid) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
208 goto done;
never executed: goto done;
0
209-
210 if (GOST_KEY_set_group(gost, group) != 0)
GOST_KEY_set_g...t, group) != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
211 ret = EVP_PKEY_assign_GOST(pkey, gost);
never executed: ret = EVP_PKEY_assign((pkey),811, (char *)(gost));
0
212-
213done:
code before this statement never executed: done:
0
214 if (ret == 0)
ret == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
215 GOST_KEY_free(gost);
never executed: GOST_KEY_free(gost);
0
216 EC_GROUP_free(group);-
217 return ret;
never executed: return ret;
0
218}-
219-
220static int-
221pkey_gost01_keygen(EVP_PKEY_CTX *ctx, EVP_PKEY *pkey)-
222{-
223 if (pkey_gost01_paramgen(ctx, pkey) == 0)
pkey_gost01_pa...tx, pkey) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
224 return 0;
never executed: return 0;
0
225 return gost2001_keygen(pkey->pkey.gost) != 0;
never executed: return gost2001_keygen(pkey->pkey.gost) != 0;
0
226}-
227-
228static int-
229pkey_gost01_sign(EVP_PKEY_CTX *ctx, unsigned char *sig, size_t *siglen,-
230 const unsigned char *tbs, size_t tbs_len)-
231{-
232 ECDSA_SIG *unpacked_sig = NULL;-
233 EVP_PKEY *pkey = EVP_PKEY_CTX_get0_pkey(ctx);-
234 struct gost_pmeth_data *pctx = EVP_PKEY_CTX_get_data(ctx);-
235 BIGNUM *md;-
236 size_t size;-
237 int ret;-
238-
239 if (pkey == NULL || pkey->pkey.gost == NULL)
pkey == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
pkey->pkey.gost == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
240 return 0;
never executed: return 0;
0
241 size = GOST_KEY_get_size(pkey->pkey.gost);-
242-
243 if (siglen == NULL)
siglen == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
244 return 0;
never executed: return 0;
0
245 if (sig == NULL) {
sig == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
246 *siglen = 2 * size;-
247 return 1;
never executed: return 1;
0
248 } else if (*siglen < 2 * size) {
*siglen < 2 * sizeDescription
TRUEnever evaluated
FALSEnever evaluated
0
249 GOSTerror(EC_R_BUFFER_TOO_SMALL);-
250 return 0;
never executed: return 0;
0
251 }-
252 if (tbs_len != 32 && tbs_len != 64) {
tbs_len != 32Description
TRUEnever evaluated
FALSEnever evaluated
tbs_len != 64Description
TRUEnever evaluated
FALSEnever evaluated
0
253 GOSTerror(EVP_R_BAD_BLOCK_LENGTH);-
254 return 0;
never executed: return 0;
0
255 }-
256 md = GOST_le2bn(tbs, tbs_len, NULL);-
257 if (md == NULL)
md == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
258 return 0;
never executed: return 0;
0
259 unpacked_sig = gost2001_do_sign(md, pkey->pkey.gost);-
260 BN_free(md);-
261 if (unpacked_sig == NULL) {
unpacked_sig == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
262 return 0;
never executed: return 0;
0
263 }-
264 switch (pctx->sig_format) {-
265 case GOST_SIG_FORMAT_SR_BE:
never executed: case 0:
0
266 ret = pack_signature_cp(unpacked_sig, size, sig, siglen);-
267 break;
never executed: break;
0
268 case GOST_SIG_FORMAT_RS_LE:
never executed: case 1:
0
269 ret = pack_signature_le(unpacked_sig, size, sig, siglen);-
270 break;
never executed: break;
0
271 default:
never executed: default:
0
272 ret = -1;-
273 break;
never executed: break;
0
274 }-
275 if (ret <= 0)
ret <= 0Description
TRUEnever evaluated
FALSEnever evaluated
0
276 ECDSA_SIG_free(unpacked_sig);
never executed: ECDSA_SIG_free(unpacked_sig);
0
277 return ret;
never executed: return ret;
0
278}-
279-
280static int-
281pkey_gost01_verify(EVP_PKEY_CTX *ctx, const unsigned char *sig, size_t siglen,-
282 const unsigned char *tbs, size_t tbs_len)-
283{-
284 int ok = 0;-
285 EVP_PKEY *pub_key = EVP_PKEY_CTX_get0_pkey(ctx);-
286 struct gost_pmeth_data *pctx = EVP_PKEY_CTX_get_data(ctx);-
287 ECDSA_SIG *s = NULL;-
288 BIGNUM *md;-
289-
290 if (pub_key == NULL)
pub_key == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
291 return 0;
never executed: return 0;
0
292 switch (pctx->sig_format) {-
293 case GOST_SIG_FORMAT_SR_BE:
never executed: case 0:
0
294 s = unpack_signature_cp(sig, siglen);-
295 break;
never executed: break;
0
296 case GOST_SIG_FORMAT_RS_LE:
never executed: case 1:
0
297 s = unpack_signature_le(sig, siglen);-
298 break;
never executed: break;
0
299 }-
300 if (s == NULL)
s == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
301 return 0;
never executed: return 0;
0
302 md = GOST_le2bn(tbs, tbs_len, NULL);-
303 if (md == NULL)
md == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
304 goto err;
never executed: goto err;
0
305 ok = gost2001_do_verify(md, s, pub_key->pkey.gost);-
306-
307err:
code before this statement never executed: err:
0
308 BN_free(md);-
309 ECDSA_SIG_free(s);-
310 return ok;
never executed: return ok;
0
311}-
312-
313static int-
314gost01_VKO_key(EVP_PKEY *pub_key, EVP_PKEY *priv_key, const unsigned char *ukm,-
315 unsigned char *key)-
316{-
317 unsigned char hashbuf[128];-
318 int digest_nid;-
319 int ret = 0;-
320 BN_CTX *ctx = BN_CTX_new();-
321 BIGNUM *UKM, *X, *Y;-
322-
323 if (ctx == NULL)
ctx == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
324 return 0;
never executed: return 0;
0
325-
326 BN_CTX_start(ctx);-
327 if ((UKM = BN_CTX_get(ctx)) == NULL)
(UKM = BN_CTX_...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
328 goto err;
never executed: goto err;
0
329 if ((X = BN_CTX_get(ctx)) == NULL)
(X = BN_CTX_ge...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
330 goto err;
never executed: goto err;
0
331 if ((Y = BN_CTX_get(ctx)) == NULL)
(Y = BN_CTX_ge...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
332 goto err;
never executed: goto err;
0
333-
334 GOST_le2bn(ukm, 8, UKM);-
335-
336 digest_nid = GOST_KEY_get_digest(priv_key->pkey.gost);-
337 if (VKO_compute_key(X, Y, pub_key->pkey.gost, priv_key->pkey.gost,
VKO_compute_ke...ost, UKM) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
338 UKM) == 0)
VKO_compute_ke...ost, UKM) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
339 goto err;
never executed: goto err;
0
340-
341 switch (digest_nid) {-
342 case NID_id_GostR3411_94_CryptoProParamSet:
never executed: case 822:
0
343 GOST_bn2le(X, hashbuf, 32);-
344 GOST_bn2le(Y, hashbuf + 32, 32);-
345 GOSTR341194(hashbuf, 64, key, digest_nid);-
346 ret = 1;-
347 break;
never executed: break;
0
348 case NID_id_tc26_gost3411_2012_256:
never executed: case 941:
0
349 GOST_bn2le(X, hashbuf, 32);-
350 GOST_bn2le(Y, hashbuf + 32, 32);-
351 STREEBOG256(hashbuf, 64, key);-
352 ret = 1;-
353 break;
never executed: break;
0
354 case NID_id_tc26_gost3411_2012_512:
never executed: case 942:
0
355 GOST_bn2le(X, hashbuf, 64);-
356 GOST_bn2le(Y, hashbuf + 64, 64);-
357 STREEBOG256(hashbuf, 128, key);-
358 ret = 1;-
359 break;
never executed: break;
0
360 default:
never executed: default:
0
361 ret = -2;-
362 break;
never executed: break;
0
363 }-
364err:
code before this statement never executed: err:
0
365 BN_CTX_end(ctx);-
366 BN_CTX_free(ctx);-
367 return ret;
never executed: return ret;
0
368}-
369-
370int-
371pkey_gost01_decrypt(EVP_PKEY_CTX *pctx, unsigned char *key, size_t *key_len,-
372 const unsigned char *in, size_t in_len)-
373{-
374 const unsigned char *p = in;-
375 EVP_PKEY *priv = EVP_PKEY_CTX_get0_pkey(pctx);-
376 GOST_KEY_TRANSPORT *gkt = NULL;-
377 int ret = 0;-
378 unsigned char wrappedKey[44];-
379 unsigned char sharedKey[32];-
380 EVP_PKEY *eph_key = NULL, *peerkey = NULL;-
381 int nid;-
382-
383 if (key == NULL) {
key == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
384 *key_len = 32;-
385 return 1;
never executed: return 1;
0
386 }-
387 gkt = d2i_GOST_KEY_TRANSPORT(NULL, (const unsigned char **)&p, in_len);-
388 if (gkt == NULL) {
gkt == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
389 GOSTerror(GOST_R_ERROR_PARSING_KEY_TRANSPORT_INFO);-
390 return -1;
never executed: return -1;
0
391 }-
392-
393 /* If key transport structure contains public key, use it */-
394 eph_key = X509_PUBKEY_get(gkt->key_agreement_info->ephem_key);-
395 if (eph_key != NULL) {
eph_key != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
396 if (EVP_PKEY_derive_set_peer(pctx, eph_key) <= 0) {
EVP_PKEY_deriv... eph_key) <= 0Description
TRUEnever evaluated
FALSEnever evaluated
0
397 GOSTerror(GOST_R_INCOMPATIBLE_PEER_KEY);-
398 goto err;
never executed: goto err;
0
399 }-
400 } else {
never executed: end of block
0
401 /* Set control "public key from client certificate used" */-
402 if (EVP_PKEY_CTX_ctrl(pctx, -1, -1, EVP_PKEY_CTRL_PEER_KEY, 3,
EVP_PKEY_CTX_c...id *)0) ) <= 0Description
TRUEnever evaluated
FALSEnever evaluated
0
403 NULL) <= 0) {
EVP_PKEY_CTX_c...id *)0) ) <= 0Description
TRUEnever evaluated
FALSEnever evaluated
0
404 GOSTerror(GOST_R_CTRL_CALL_FAILED);-
405 goto err;
never executed: goto err;
0
406 }-
407 }
never executed: end of block
0
408 peerkey = EVP_PKEY_CTX_get0_peerkey(pctx);-
409 if (peerkey == NULL) {
peerkey == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
410 GOSTerror(GOST_R_NO_PEER_KEY);-
411 goto err;
never executed: goto err;
0
412 }-
413-
414 nid = OBJ_obj2nid(gkt->key_agreement_info->cipher);-
415-
416 if (gkt->key_agreement_info->eph_iv->length != 8) {
gkt->key_agree...v->length != 8Description
TRUEnever evaluated
FALSEnever evaluated
0
417 GOSTerror(GOST_R_INVALID_IV_LENGTH);-
418 goto err;
never executed: goto err;
0
419 }-
420 memcpy(wrappedKey, gkt->key_agreement_info->eph_iv->data, 8);-
421 if (gkt->key_info->encrypted_key->length != 32) {
gkt->key_info-...->length != 32Description
TRUEnever evaluated
FALSEnever evaluated
0
422 GOSTerror(EVP_R_BAD_KEY_LENGTH);-
423 goto err;
never executed: goto err;
0
424 }-
425 memcpy(wrappedKey + 8, gkt->key_info->encrypted_key->data, 32);-
426 if (gkt->key_info->imit->length != 4) {
gkt->key_info-...t->length != 4Description
TRUEnever evaluated
FALSEnever evaluated
0
427 GOSTerror(ERR_R_INTERNAL_ERROR);-
428 goto err;
never executed: goto err;
0
429 }-
430 memcpy(wrappedKey + 40, gkt->key_info->imit->data, 4);-
431 if (gost01_VKO_key(peerkey, priv, wrappedKey, sharedKey) <= 0)
gost01_VKO_key...haredKey) <= 0Description
TRUEnever evaluated
FALSEnever evaluated
0
432 goto err;
never executed: goto err;
0
433 if (gost_key_unwrap_crypto_pro(nid, sharedKey, wrappedKey, key) == 0) {
gost_key_unwra...Key, key) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
434 GOSTerror(GOST_R_ERROR_COMPUTING_SHARED_KEY);-
435 goto err;
never executed: goto err;
0
436 }-
437-
438 ret = 1;-
439err:
code before this statement never executed: err:
0
440 EVP_PKEY_free(eph_key);-
441 GOST_KEY_TRANSPORT_free(gkt);-
442 return ret;
never executed: return ret;
0
443}-
444-
445int-
446pkey_gost01_derive(EVP_PKEY_CTX *ctx, unsigned char *key, size_t *keylen)-
447{-
448 /*-
449 * Public key of peer in the ctx field peerkey-
450 * Our private key in the ctx pkey-
451 * ukm is in the algorithm specific context data-
452 */-
453 EVP_PKEY *my_key = EVP_PKEY_CTX_get0_pkey(ctx);-
454 EVP_PKEY *peer_key = EVP_PKEY_CTX_get0_peerkey(ctx);-
455 struct gost_pmeth_data *data = EVP_PKEY_CTX_get_data(ctx);-
456-
457 if (data->shared_ukm == NULL) {
data->shared_u...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
458 GOSTerror(GOST_R_UKM_NOT_SET);-
459 return 0;
never executed: return 0;
0
460 }-
461-
462 if (key == NULL) {
key == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
463 *keylen = 32;-
464 return 32;
never executed: return 32;
0
465 }-
466-
467 if (gost01_VKO_key(peer_key, my_key, data->shared_ukm, key) <= 0)
gost01_VKO_key...ukm, key) <= 0Description
TRUEnever evaluated
FALSEnever evaluated
0
468 return 0;
never executed: return 0;
0
469-
470 *keylen = 32;-
471 return 1;
never executed: return 1;
0
472}-
473-
474int-
475pkey_gost01_encrypt(EVP_PKEY_CTX *pctx, unsigned char *out, size_t *out_len,-
476 const unsigned char *key, size_t key_len)-
477{-
478 GOST_KEY_TRANSPORT *gkt = NULL;-
479 EVP_PKEY *pubk = EVP_PKEY_CTX_get0_pkey(pctx);-
480 struct gost_pmeth_data *data = EVP_PKEY_CTX_get_data(pctx);-
481 unsigned char ukm[8], shared_key[32], crypted_key[44];-
482 int ret = 0;-
483 int key_is_ephemeral;-
484 EVP_PKEY *sec_key = EVP_PKEY_CTX_get0_peerkey(pctx);-
485 int nid = NID_id_Gost28147_89_CryptoPro_A_ParamSet;-
486-
487 if (data->shared_ukm != NULL) {
data->shared_u...!= ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
488 memcpy(ukm, data->shared_ukm, 8);-
489 } else /* if (out != NULL) */ {
never executed: end of block
0
490 arc4random_buf(ukm, 8);-
491 }
never executed: end of block
0
492 /* Check for private key in the peer_key of context */-
493 if (sec_key) {
sec_keyDescription
TRUEnever evaluated
FALSEnever evaluated
0
494 key_is_ephemeral = 0;-
495 if (GOST_KEY_get0_private_key(sec_key->pkey.gost) == 0) {
GOST_KEY_get0_...key.gost) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
496 GOSTerror(GOST_R_NO_PRIVATE_PART_OF_NON_EPHEMERAL_KEYPAIR);-
497 goto err;
never executed: goto err;
0
498 }-
499 } else {
never executed: end of block
0
500 key_is_ephemeral = 1;-
501 if (out != NULL) {
out != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
502 GOST_KEY *tmp_key;-
503-
504 sec_key = EVP_PKEY_new();-
505 if (sec_key == NULL)
sec_key == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
506 goto err;
never executed: goto err;
0
507 tmp_key = GOST_KEY_new();-
508 if (tmp_key == NULL)
tmp_key == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
509 goto err;
never executed: goto err;
0
510 if (EVP_PKEY_assign(sec_key, EVP_PKEY_base_id(pubk),
EVP_PKEY_assig... tmp_key) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
511 tmp_key) == 0) {
EVP_PKEY_assig... tmp_key) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
512 GOST_KEY_free(tmp_key);-
513 goto err;
never executed: goto err;
0
514 }-
515 if (EVP_PKEY_copy_parameters(sec_key, pubk) == 0)
EVP_PKEY_copy_...ey, pubk) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
516 goto err;
never executed: goto err;
0
517 if (gost2001_keygen(sec_key->pkey.gost) == 0) {
gost2001_keyge...key.gost) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
518 goto err;
never executed: goto err;
0
519 }-
520 }
never executed: end of block
0
521 }
never executed: end of block
0
522-
523 if (out != NULL) {
out != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
524 if (gost01_VKO_key(pubk, sec_key, ukm, shared_key) <= 0)
gost01_VKO_key...ared_key) <= 0Description
TRUEnever evaluated
FALSEnever evaluated
0
525 goto err;
never executed: goto err;
0
526 gost_key_wrap_crypto_pro(nid, shared_key, ukm, key,-
527 crypted_key);-
528 }
never executed: end of block
0
529 gkt = GOST_KEY_TRANSPORT_new();-
530 if (gkt == NULL)
gkt == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
531 goto err;
never executed: goto err;
0
532 if (ASN1_OCTET_STRING_set(gkt->key_agreement_info->eph_iv, ukm, 8) == 0)
ASN1_OCTET_STR..., ukm, 8) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
533 goto err;
never executed: goto err;
0
534 if (ASN1_OCTET_STRING_set(gkt->key_info->imit, crypted_key + 40,
ASN1_OCTET_STR... + 40, 4) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
535 4) == 0)
ASN1_OCTET_STR... + 40, 4) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
536 goto err;
never executed: goto err;
0
537 if (ASN1_OCTET_STRING_set(gkt->key_info->encrypted_key, crypted_key + 8,
ASN1_OCTET_STR... + 8, 32) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
538 32) == 0)
ASN1_OCTET_STR... + 8, 32) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
539 goto err;
never executed: goto err;
0
540 if (key_is_ephemeral) {
key_is_ephemeralDescription
TRUEnever evaluated
FALSEnever evaluated
0
541 if (X509_PUBKEY_set(&gkt->key_agreement_info->ephem_key,
X509_PUBKEY_se...y : pubk) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
542 out != NULL ? sec_key : pubk) == 0) {
X509_PUBKEY_se...y : pubk) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
543 GOSTerror(GOST_R_CANNOT_PACK_EPHEMERAL_KEY);-
544 goto err;
never executed: goto err;
0
545 }-
546 }
never executed: end of block
0
547 ASN1_OBJECT_free(gkt->key_agreement_info->cipher);-
548 gkt->key_agreement_info->cipher = OBJ_nid2obj(nid);-
549 if (key_is_ephemeral)
key_is_ephemeralDescription
TRUEnever evaluated
FALSEnever evaluated
0
550 EVP_PKEY_free(sec_key);
never executed: EVP_PKEY_free(sec_key);
0
551 else {-
552 /* Set control "public key from client certificate used" */-
553 if (EVP_PKEY_CTX_ctrl(pctx, -1, -1, EVP_PKEY_CTRL_PEER_KEY, 3,
EVP_PKEY_CTX_c...id *)0) ) <= 0Description
TRUEnever evaluated
FALSEnever evaluated
0
554 NULL) <= 0) {
EVP_PKEY_CTX_c...id *)0) ) <= 0Description
TRUEnever evaluated
FALSEnever evaluated
0
555 GOSTerror(GOST_R_CTRL_CALL_FAILED);-
556 goto err;
never executed: goto err;
0
557 }-
558 }
never executed: end of block
0
559 if ((*out_len = i2d_GOST_KEY_TRANSPORT(gkt, out ? &out : NULL)) > 0)
(*out_len = i2...id *)0) )) > 0Description
TRUEnever evaluated
FALSEnever evaluated
0
560 ret = 1;
never executed: ret = 1;
0
561 GOST_KEY_TRANSPORT_free(gkt);-
562 return ret;
never executed: return ret;
0
563-
564err:-
565 if (key_is_ephemeral)
key_is_ephemeralDescription
TRUEnever evaluated
FALSEnever evaluated
0
566 EVP_PKEY_free(sec_key);
never executed: EVP_PKEY_free(sec_key);
0
567 GOST_KEY_TRANSPORT_free(gkt);-
568 return -1;
never executed: return -1;
0
569}-
570-
571-
572static int-
573pkey_gost01_ctrl(EVP_PKEY_CTX *ctx, int type, int p1, void *p2)-
574{-
575 struct gost_pmeth_data *pctx = EVP_PKEY_CTX_get_data(ctx);-
576-
577 switch (type) {-
578 case EVP_PKEY_CTRL_MD:
never executed: case 1:
0
579 if (EVP_MD_type(p2) !=
EVP_MD_type(p2...x->digest_nid)Description
TRUEnever evaluated
FALSEnever evaluated
0
580 GostR3410_get_md_digest(pctx->digest_nid)) {
EVP_MD_type(p2...x->digest_nid)Description
TRUEnever evaluated
FALSEnever evaluated
0
581 GOSTerror(GOST_R_INVALID_DIGEST_TYPE);-
582 return 0;
never executed: return 0;
0
583 }-
584 pctx->md = p2;-
585 return 1;
never executed: return 1;
0
586 case EVP_PKEY_CTRL_PKCS7_ENCRYPT:
never executed: case 3:
0
587 case EVP_PKEY_CTRL_PKCS7_DECRYPT:
never executed: case 4:
0
588 case EVP_PKEY_CTRL_PKCS7_SIGN:
never executed: case 5:
0
589 case EVP_PKEY_CTRL_DIGESTINIT:
never executed: case 7:
0
590 return 1;
never executed: return 1;
0
591-
592 case EVP_PKEY_CTRL_GOST_PARAMSET:
never executed: case (0x1000 +1):
0
593 pctx->sign_param_nid = (int)p1;-
594 return 1;
never executed: return 1;
0
595-
596 case EVP_PKEY_CTRL_SET_IV:
never executed: case 8:
0
597 {-
598 char *ukm = malloc(p1);-
599-
600 if (ukm == NULL) {
ukm == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
601 GOSTerror(ERR_R_MALLOC_FAILURE);-
602 return 0;
never executed: return 0;
0
603 }-
604 memcpy(ukm, p2, p1);-
605 free(pctx->shared_ukm);-
606 pctx->shared_ukm = ukm;-
607 return 1;
never executed: return 1;
0
608 }-
609-
610 case EVP_PKEY_CTRL_PEER_KEY:
never executed: case 2:
0
611 if (p1 == 0 || p1 == 1) /* call from EVP_PKEY_derive_set_peer */
p1 == 0Description
TRUEnever evaluated
FALSEnever evaluated
p1 == 1Description
TRUEnever evaluated
FALSEnever evaluated
0
612 return 1;
never executed: return 1;
0
613 if (p1 == 2) /* TLS: peer key used? */
p1 == 2Description
TRUEnever evaluated
FALSEnever evaluated
0
614 return pctx->peer_key_used;
never executed: return pctx->peer_key_used;
0
615 if (p1 == 3) /* TLS: peer key used! */
p1 == 3Description
TRUEnever evaluated
FALSEnever evaluated
0
616 return (pctx->peer_key_used = 1);
never executed: return (pctx->peer_key_used = 1);
0
617 return -2;
never executed: return -2;
0
618 case EVP_PKEY_CTRL_GOST_SIG_FORMAT:
never executed: case (0x1000 +2):
0
619 switch (p1) {-
620 case GOST_SIG_FORMAT_SR_BE:
never executed: case 0:
0
621 case GOST_SIG_FORMAT_RS_LE:
never executed: case 1:
0
622 pctx->sig_format = p1;-
623 return 1;
never executed: return 1;
0
624 default:
never executed: default:
0
625 return 0;
never executed: return 0;
0
626 }-
627 break;
dead code: break;
-
628 case EVP_PKEY_CTRL_GOST_SET_DIGEST:
never executed: case (0x1000 +3):
0
629 pctx->digest_nid = (int)p1;-
630 return 1;
never executed: return 1;
0
631 case EVP_PKEY_CTRL_GOST_GET_DIGEST:
never executed: case (0x1000 +4):
0
632 *(int *)p2 = pctx->digest_nid;-
633 return 1;
never executed: return 1;
0
634 default:
never executed: default:
0
635 return -2;
never executed: return -2;
0
636 }-
637}-
638-
639static int-
640pkey_gost01_ctrl_str(EVP_PKEY_CTX *ctx, const char *type, const char *value)-
641{-
642 int param_nid = NID_undef;-
643 int digest_nid = NID_undef;-
644-
645 if (strcmp(type, "paramset") == 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 *) ( "paramset" ))[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
646 if (value == NULL)
value == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
647 return 0;
never executed: return 0;
0
648 if (pkey_gost01_ctrl(ctx, EVP_PKEY_CTRL_GOST_GET_DIGEST, 0,
pkey_gost01_ct...gest_nid) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
649 &digest_nid) == 0)
pkey_gost01_ct...gest_nid) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
650 return 0;
never executed: return 0;
0
651 if (digest_nid == NID_id_tc26_gost3411_2012_512)
digest_nid == 942Description
TRUEnever evaluated
FALSEnever evaluated
0
652 param_nid = GostR3410_512_param_id(value);
never executed: param_nid = GostR3410_512_param_id(value);
0
653 else-
654 param_nid = GostR3410_256_param_id(value);
never executed: param_nid = GostR3410_256_param_id(value);
0
655 if (param_nid == NID_undef)
param_nid == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
656 param_nid = OBJ_txt2nid(value);
never executed: param_nid = OBJ_txt2nid(value);
0
657 if (param_nid == NID_undef)
param_nid == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
658 return 0;
never executed: return 0;
0
659-
660 return pkey_gost01_ctrl(ctx, EVP_PKEY_CTRL_GOST_PARAMSET,
never executed: return pkey_gost01_ctrl(ctx, (0x1000 +1), param_nid, ((void *)0) );
0
661 param_nid, NULL);
never executed: return pkey_gost01_ctrl(ctx, (0x1000 +1), param_nid, ((void *)0) );
0
662 }-
663 if (strcmp(type, "dgst") == 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 *) ( "dgst" ))[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
664 if (value == NULL)
value == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
665 return 0;
never executed: return 0;
0
666 else if (strcmp(value, "gost94") == 0 ||
never executed: __result = (((const unsigned char *) (const char *) ( value ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( "gost94" ))[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
667 strcmp(value, "md_gost94") == 0)
never executed: __result = (((const unsigned char *) (const char *) ( value ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( "md_gost94" ))[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
668 digest_nid = NID_id_GostR3411_94_CryptoProParamSet;
never executed: digest_nid = 822;
0
669 else if (strcmp(value, "streebog256") == 0)
never executed: __result = (((const unsigned char *) (const char *) ( value ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( "streebog256" ))[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
670 digest_nid = NID_id_tc26_gost3411_2012_256;
never executed: digest_nid = 941;
0
671 else if (strcmp(value, "streebog512") == 0)
never executed: __result = (((const unsigned char *) (const char *) ( value ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( "streebog512" ))[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
672 digest_nid = NID_id_tc26_gost3411_2012_512;
never executed: digest_nid = 942;
0
673-
674 if (digest_nid == NID_undef)
digest_nid == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
675 return 0;
never executed: return 0;
0
676-
677 return pkey_gost01_ctrl(ctx, EVP_PKEY_CTRL_GOST_SET_DIGEST,
never executed: return pkey_gost01_ctrl(ctx, (0x1000 +3), digest_nid, ((void *)0) );
0
678 digest_nid, NULL);
never executed: return pkey_gost01_ctrl(ctx, (0x1000 +3), digest_nid, ((void *)0) );
0
679 }-
680 return -2;
never executed: return -2;
0
681}-
682-
683const EVP_PKEY_METHOD gostr01_pkey_meth = {-
684 .pkey_id = EVP_PKEY_GOSTR01,-
685-
686 .init = pkey_gost01_init,-
687 .copy = pkey_gost01_copy,-
688 .cleanup = pkey_gost01_cleanup,-
689-
690 .paramgen = pkey_gost01_paramgen,-
691 .keygen = pkey_gost01_keygen,-
692 .sign = pkey_gost01_sign,-
693 .verify = pkey_gost01_verify,-
694-
695 .encrypt = pkey_gost01_encrypt,-
696 .decrypt = pkey_gost01_decrypt,-
697 .derive = pkey_gost01_derive,-
698-
699 .ctrl = pkey_gost01_ctrl,-
700 .ctrl_str = pkey_gost01_ctrl_str,-
701};-
702#endif-
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.2.2