OpenCoverage

gostr341001_ameth.c

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/libressl/src/crypto/gost/gostr341001_ameth.c
Source codeSwitch to Preprocessed file
LineSourceCount
1/* $OpenBSD: gostr341001_ameth.c,v 1.15 2018/08/24 20:22:15 tb 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/ec.h>-
60#include <openssl/err.h>-
61#include <openssl/x509.h>-
62#include <openssl/gost.h>-
63-
64-
65#include "asn1_locl.h"-
66#include "gost_locl.h"-
67#include "gost_asn1.h"-
68-
69static void-
70pkey_free_gost01(EVP_PKEY *key)-
71{-
72 GOST_KEY_free(key->pkey.gost);-
73}
never executed: end of block
0
74-
75/*-
76 * Parses GOST algorithm parameters from X509_ALGOR and-
77 * modifies pkey setting NID and parameters-
78 */-
79static int-
80decode_gost01_algor_params(EVP_PKEY *pkey, const unsigned char **p, int len)-
81{-
82 int param_nid = NID_undef, digest_nid = NID_undef;-
83 GOST_KEY_PARAMS *gkp = NULL;-
84 EC_GROUP *group;-
85 GOST_KEY *ec;-
86-
87 gkp = d2i_GOST_KEY_PARAMS(NULL, p, len);-
88 if (gkp == NULL) {
gkp == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
89 GOSTerror(GOST_R_BAD_PKEY_PARAMETERS_FORMAT);-
90 return 0;
never executed: return 0;
0
91 }-
92 param_nid = OBJ_obj2nid(gkp->key_params);-
93 digest_nid = OBJ_obj2nid(gkp->hash_params);-
94 GOST_KEY_PARAMS_free(gkp);-
95-
96 ec = pkey->pkey.gost;-
97 if (ec == NULL) {
ec == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
98 ec = GOST_KEY_new();-
99 if (ec == NULL)
ec == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
100 return 0;
never executed: return 0;
0
101 if (EVP_PKEY_assign_GOST(pkey, ec) == 0)
EVP_PKEY_assig...r *)(ec)) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
102 return 0;
never executed: return 0;
0
103 }
never executed: end of block
0
104-
105 group = EC_GROUP_new_by_curve_name(param_nid);-
106 if (group == NULL)
group == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
107 return 0;
never executed: return 0;
0
108 EC_GROUP_set_asn1_flag(group, OPENSSL_EC_NAMED_CURVE);-
109 if (GOST_KEY_set_group(ec, group) == 0) {
GOST_KEY_set_g...c, group) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
110 EC_GROUP_free(group);-
111 return 0;
never executed: return 0;
0
112 }-
113 EC_GROUP_free(group);-
114 if (GOST_KEY_set_digest(ec, digest_nid) == 0)
GOST_KEY_set_d...gest_nid) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
115 return 0;
never executed: return 0;
0
116 return 1;
never executed: return 1;
0
117}-
118-
119static ASN1_STRING *-
120encode_gost01_algor_params(const EVP_PKEY *key)-
121{-
122 ASN1_STRING *params = ASN1_STRING_new();-
123 GOST_KEY_PARAMS *gkp = GOST_KEY_PARAMS_new();-
124 int pkey_param_nid = NID_undef;-
125-
126 if (params == NULL || gkp == NULL) {
params == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
gkp == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
127 GOSTerror(ERR_R_MALLOC_FAILURE);-
128 ASN1_STRING_free(params);-
129 params = NULL;-
130 goto err;
never executed: goto err;
0
131 }-
132-
133 pkey_param_nid =-
134 EC_GROUP_get_curve_name(GOST_KEY_get0_group(key->pkey.gost));-
135 gkp->key_params = OBJ_nid2obj(pkey_param_nid);-
136 gkp->hash_params = OBJ_nid2obj(GOST_KEY_get_digest(key->pkey.gost));-
137 /*gkp->cipher_params = OBJ_nid2obj(cipher_param_nid); */-
138 params->length = i2d_GOST_KEY_PARAMS(gkp, &params->data);-
139 if (params->length <= 0) {
params->length <= 0Description
TRUEnever evaluated
FALSEnever evaluated
0
140 GOSTerror(ERR_R_MALLOC_FAILURE);-
141 ASN1_STRING_free(params);-
142 params = NULL;-
143 goto err;
never executed: goto err;
0
144 }-
145 params->type = V_ASN1_SEQUENCE;-
146err:
code before this statement never executed: err:
0
147 GOST_KEY_PARAMS_free(gkp);-
148 return params;
never executed: return params;
0
149}-
150-
151static int-
152pub_cmp_gost01(const EVP_PKEY *a, const EVP_PKEY *b)-
153{-
154 const GOST_KEY *ea = a->pkey.gost;-
155 const GOST_KEY *eb = b->pkey.gost;-
156 const EC_POINT *ka, *kb;-
157 int ret = 0;-
158-
159 if (ea == NULL || eb == NULL)
ea == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
eb == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
160 return 0;
never executed: return 0;
0
161 ka = GOST_KEY_get0_public_key(ea);-
162 kb = GOST_KEY_get0_public_key(eb);-
163 if (ka == NULL || kb == NULL)
ka == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
kb == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
164 return 0;
never executed: return 0;
0
165 ret = (0 == EC_POINT_cmp(GOST_KEY_get0_group(ea), ka, kb, NULL));-
166 return ret;
never executed: return ret;
0
167}-
168-
169static int-
170pkey_size_gost01(const EVP_PKEY *pk)-
171{-
172 if (GOST_KEY_get_digest(pk->pkey.gost) == NID_id_tc26_gost3411_2012_512)
GOST_KEY_get_d...y.gost) == 942Description
TRUEnever evaluated
FALSEnever evaluated
0
173 return 128;
never executed: return 128;
0
174 return 64;
never executed: return 64;
0
175}-
176-
177static int-
178pkey_bits_gost01(const EVP_PKEY *pk)-
179{-
180 if (GOST_KEY_get_digest(pk->pkey.gost) == NID_id_tc26_gost3411_2012_512)
GOST_KEY_get_d...y.gost) == 942Description
TRUEnever evaluated
FALSEnever evaluated
0
181 return 512;
never executed: return 512;
0
182 return 256;
never executed: return 256;
0
183}-
184-
185static int-
186pub_decode_gost01(EVP_PKEY *pk, X509_PUBKEY *pub)-
187{-
188 X509_ALGOR *palg = NULL;-
189 const unsigned char *pubkey_buf = NULL;-
190 const unsigned char *p;-
191 ASN1_OBJECT *palgobj = NULL;-
192 int pub_len;-
193 BIGNUM *X, *Y;-
194 ASN1_OCTET_STRING *octet = NULL;-
195 int len;-
196 int ret;-
197 int ptype = V_ASN1_UNDEF;-
198 ASN1_STRING *pval = NULL;-
199-
200 if (X509_PUBKEY_get0_param(&palgobj, &pubkey_buf, &pub_len, &palg, pub)
X509_PUBKEY_ge...alg, pub) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
201 == 0)
X509_PUBKEY_ge...alg, pub) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
202 return 0;
never executed: return 0;
0
203 (void)EVP_PKEY_assign_GOST(pk, NULL);-
204 X509_ALGOR_get0(NULL, &ptype, (const void **)&pval, palg);-
205 if (ptype != V_ASN1_SEQUENCE) {
ptype != 16Description
TRUEnever evaluated
FALSEnever evaluated
0
206 GOSTerror(GOST_R_BAD_KEY_PARAMETERS_FORMAT);-
207 return 0;
never executed: return 0;
0
208 }-
209 p = pval->data;-
210 if (decode_gost01_algor_params(pk, &p, pval->length) == 0)
decode_gost01_...->length) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
211 return 0;
never executed: return 0;
0
212-
213 octet = d2i_ASN1_OCTET_STRING(NULL, &pubkey_buf, pub_len);-
214 if (octet == NULL) {
octet == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
215 GOSTerror(ERR_R_MALLOC_FAILURE);-
216 return 0;
never executed: return 0;
0
217 }-
218 len = octet->length / 2;-
219-
220 X = GOST_le2bn(octet->data, len, NULL);-
221 Y = GOST_le2bn(octet->data + len, len, NULL);-
222-
223 ASN1_OCTET_STRING_free(octet);-
224-
225 ret = GOST_KEY_set_public_key_affine_coordinates(pk->pkey.gost, X, Y);-
226 if (ret == 0)
ret == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
227 GOSTerror(ERR_R_EC_LIB);
never executed: ERR_put_error(50,(0xfff),(16),__FILE__,227);
0
228-
229 BN_free(X);-
230 BN_free(Y);-
231-
232 return ret;
never executed: return ret;
0
233}-
234-
235static int-
236pub_encode_gost01(X509_PUBKEY *pub, const EVP_PKEY *pk)-
237{-
238 ASN1_OBJECT *algobj = NULL;-
239 ASN1_OCTET_STRING *octet = NULL;-
240 ASN1_STRING *params = NULL;-
241 void *pval = NULL;-
242 unsigned char *buf = NULL, *sptr;-
243 int key_size, ret = 0;-
244 const EC_POINT *pub_key;-
245 BIGNUM *X = NULL, *Y = NULL;-
246 const GOST_KEY *ec = pk->pkey.gost;-
247 int ptype = V_ASN1_UNDEF;-
248-
249 algobj = OBJ_nid2obj(GostR3410_get_pk_digest(GOST_KEY_get_digest(ec)));-
250 if (pk->save_parameters) {
pk->save_parametersDescription
TRUEnever evaluated
FALSEnever evaluated
0
251 params = encode_gost01_algor_params(pk);-
252 if (params == NULL)
params == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
253 return 0;
never executed: return 0;
0
254 pval = params;-
255 ptype = V_ASN1_SEQUENCE;-
256 }
never executed: end of block
0
257-
258 key_size = GOST_KEY_get_size(ec);-
259-
260 pub_key = GOST_KEY_get0_public_key(ec);-
261 if (pub_key == NULL) {
pub_key == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
262 GOSTerror(GOST_R_PUBLIC_KEY_UNDEFINED);-
263 goto err;
never executed: goto err;
0
264 }-
265-
266 octet = ASN1_OCTET_STRING_new();-
267 if (octet == NULL) {
octet == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
268 GOSTerror(ERR_R_MALLOC_FAILURE);-
269 goto err;
never executed: goto err;
0
270 }-
271-
272 ret = ASN1_STRING_set(octet, NULL, 2 * key_size);-
273 if (ret == 0) {
ret == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
274 GOSTerror(ERR_R_INTERNAL_ERROR);-
275 goto err;
never executed: goto err;
0
276 }-
277-
278 sptr = ASN1_STRING_data(octet);-
279-
280 X = BN_new();-
281 Y = BN_new();-
282 if (X == NULL || Y == NULL) {
X == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
Y == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
283 GOSTerror(ERR_R_MALLOC_FAILURE);-
284 goto err;
never executed: goto err;
0
285 }-
286-
287 if (EC_POINT_get_affine_coordinates_GFp(GOST_KEY_get0_group(ec),
EC_POINT_get_a...id *)0) ) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
288 pub_key, X, Y, NULL) == 0) {
EC_POINT_get_a...id *)0) ) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
289 GOSTerror(ERR_R_EC_LIB);-
290 goto err;
never executed: goto err;
0
291 }-
292-
293 GOST_bn2le(X, sptr, key_size);-
294 GOST_bn2le(Y, sptr + key_size, key_size);-
295-
296 BN_free(Y);-
297 BN_free(X);-
298-
299 ret = i2d_ASN1_OCTET_STRING(octet, &buf);-
300 ASN1_BIT_STRING_free(octet);-
301 if (ret < 0)
ret < 0Description
TRUEnever evaluated
FALSEnever evaluated
0
302 return 0;
never executed: return 0;
0
303-
304 return X509_PUBKEY_set0_param(pub, algobj, ptype, pval, buf, ret);
never executed: return X509_PUBKEY_set0_param(pub, algobj, ptype, pval, buf, ret);
0
305-
306err:-
307 BN_free(Y);-
308 BN_free(X);-
309 ASN1_BIT_STRING_free(octet);-
310 ASN1_STRING_free(params);-
311 return 0;
never executed: return 0;
0
312}-
313-
314static int-
315param_print_gost01(BIO *out, const EVP_PKEY *pkey, int indent, ASN1_PCTX *pctx)-
316{-
317 int param_nid =-
318 EC_GROUP_get_curve_name(GOST_KEY_get0_group(pkey->pkey.gost));-
319-
320 if (BIO_indent(out, indent, 128) == 0)
BIO_indent(out...ent, 128) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
321 return 0;
never executed: return 0;
0
322 BIO_printf(out, "Parameter set: %s\n", OBJ_nid2ln(param_nid));-
323 if (BIO_indent(out, indent, 128) == 0)
BIO_indent(out...ent, 128) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
324 return 0;
never executed: return 0;
0
325 BIO_printf(out, "Digest Algorithm: %s\n",-
326 OBJ_nid2ln(GOST_KEY_get_digest(pkey->pkey.gost)));-
327 return 1;
never executed: return 1;
0
328}-
329-
330static int-
331pub_print_gost01(BIO *out, const EVP_PKEY *pkey, int indent, ASN1_PCTX *pctx)-
332{-
333 BN_CTX *ctx = BN_CTX_new();-
334 BIGNUM *X, *Y;-
335 const EC_POINT *pubkey;-
336 const EC_GROUP *group;-
337-
338 if (ctx == NULL) {
ctx == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
339 GOSTerror(ERR_R_MALLOC_FAILURE);-
340 return 0;
never executed: return 0;
0
341 }-
342 BN_CTX_start(ctx);-
343 if ((X = BN_CTX_get(ctx)) == NULL)
(X = BN_CTX_ge...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
344 goto err;
never executed: goto err;
0
345 if ((Y = BN_CTX_get(ctx)) == NULL)
(Y = BN_CTX_ge...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
346 goto err;
never executed: goto err;
0
347 pubkey = GOST_KEY_get0_public_key(pkey->pkey.gost);-
348 group = GOST_KEY_get0_group(pkey->pkey.gost);-
349 if (EC_POINT_get_affine_coordinates_GFp(group, pubkey, X, Y,
EC_POINT_get_a..., Y, ctx) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
350 ctx) == 0) {
EC_POINT_get_a..., Y, ctx) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
351 GOSTerror(ERR_R_EC_LIB);-
352 goto err;
never executed: goto err;
0
353 }-
354 if (BIO_indent(out, indent, 128) == 0)
BIO_indent(out...ent, 128) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
355 goto err;
never executed: goto err;
0
356 BIO_printf(out, "Public key:\n");-
357 if (BIO_indent(out, indent + 3, 128) == 0)
BIO_indent(out...+ 3, 128) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
358 goto err;
never executed: goto err;
0
359 BIO_printf(out, "X:");-
360 BN_print(out, X);-
361 BIO_printf(out, "\n");-
362 BIO_indent(out, indent + 3, 128);-
363 BIO_printf(out, "Y:");-
364 BN_print(out, Y);-
365 BIO_printf(out, "\n");-
366-
367 BN_CTX_end(ctx);-
368 BN_CTX_free(ctx);-
369-
370 return param_print_gost01(out, pkey, indent, pctx);
never executed: return param_print_gost01(out, pkey, indent, pctx);
0
371-
372err:-
373 BN_CTX_end(ctx);-
374 BN_CTX_free(ctx);-
375 return 0;
never executed: return 0;
0
376}-
377-
378static int-
379priv_print_gost01(BIO *out, const EVP_PKEY *pkey, int indent, ASN1_PCTX *pctx)-
380{-
381 const BIGNUM *key;-
382-
383 if (BIO_indent(out, indent, 128) == 0)
BIO_indent(out...ent, 128) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
384 return 0;
never executed: return 0;
0
385 BIO_printf(out, "Private key: ");-
386 key = GOST_KEY_get0_private_key(pkey->pkey.gost);-
387 if (key == NULL)
key == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
388 BIO_printf(out, "<undefined)");
never executed: BIO_printf(out, "<undefined)");
0
389 else-
390 BN_print(out, key);
never executed: BN_print(out, key);
0
391 BIO_printf(out, "\n");-
392-
393 return pub_print_gost01(out, pkey, indent, pctx);
never executed: return pub_print_gost01(out, pkey, indent, pctx);
0
394}-
395-
396static int-
397priv_decode_gost01(EVP_PKEY *pk, const PKCS8_PRIV_KEY_INFO *p8inf)-
398{-
399 const unsigned char *pkey_buf = NULL, *p = NULL;-
400 int priv_len = 0;-
401 BIGNUM *pk_num = NULL;-
402 int ret = 0;-
403 const X509_ALGOR *palg = NULL;-
404 const ASN1_OBJECT *palg_obj = NULL;-
405 ASN1_INTEGER *priv_key = NULL;-
406 GOST_KEY *ec;-
407 int ptype = V_ASN1_UNDEF;-
408 ASN1_STRING *pval = NULL;-
409-
410 if (PKCS8_pkey_get0(&palg_obj, &pkey_buf, &priv_len, &palg, p8inf) == 0)
PKCS8_pkey_get...g, p8inf) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
411 return 0;
never executed: return 0;
0
412 (void)EVP_PKEY_assign_GOST(pk, NULL);-
413 X509_ALGOR_get0(NULL, &ptype, (const void **)&pval, palg);-
414 if (ptype != V_ASN1_SEQUENCE) {
ptype != 16Description
TRUEnever evaluated
FALSEnever evaluated
0
415 GOSTerror(GOST_R_BAD_KEY_PARAMETERS_FORMAT);-
416 return 0;
never executed: return 0;
0
417 }-
418 p = pval->data;-
419 if (decode_gost01_algor_params(pk, &p, pval->length) == 0)
decode_gost01_...->length) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
420 return 0;
never executed: return 0;
0
421 p = pkey_buf;-
422 if (V_ASN1_OCTET_STRING == *p) {
4 == *pDescription
TRUEnever evaluated
FALSEnever evaluated
0
423 /* New format - Little endian octet string */-
424 ASN1_OCTET_STRING *s =-
425 d2i_ASN1_OCTET_STRING(NULL, &p, priv_len);-
426-
427 if (s == NULL) {
s == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
428 GOSTerror(EVP_R_DECODE_ERROR);-
429 ASN1_STRING_free(s);-
430 return 0;
never executed: return 0;
0
431 }-
432-
433 pk_num = GOST_le2bn(s->data, s->length, NULL);-
434 ASN1_STRING_free(s);-
435 } else {
never executed: end of block
0
436 priv_key = d2i_ASN1_INTEGER(NULL, &p, priv_len);-
437 if (priv_key == NULL)
priv_key == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
438 return 0;
never executed: return 0;
0
439 ret = ((pk_num = ASN1_INTEGER_to_BN(priv_key, NULL)) != NULL);-
440 ASN1_INTEGER_free(priv_key);-
441 if (ret == 0) {
ret == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
442 GOSTerror(EVP_R_DECODE_ERROR);-
443 return 0;
never executed: return 0;
0
444 }-
445 }
never executed: end of block
0
446-
447 ec = pk->pkey.gost;-
448 if (ec == NULL) {
ec == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
449 ec = GOST_KEY_new();-
450 if (ec == NULL) {
ec == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
451 BN_free(pk_num);-
452 return 0;
never executed: return 0;
0
453 }-
454 if (EVP_PKEY_assign_GOST(pk, ec) == 0) {
EVP_PKEY_assig...r *)(ec)) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
455 BN_free(pk_num);-
456 GOST_KEY_free(ec);-
457 return 0;
never executed: return 0;
0
458 }-
459 }
never executed: end of block
0
460 if (GOST_KEY_set_private_key(ec, pk_num) == 0) {
GOST_KEY_set_p..., pk_num) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
461 BN_free(pk_num);-
462 return 0;
never executed: return 0;
0
463 }-
464 ret = 0;-
465 if (EVP_PKEY_missing_parameters(pk) == 0)
EVP_PKEY_missi...eters(pk) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
466 ret = gost2001_compute_public(ec) != 0;
never executed: ret = gost2001_compute_public(ec) != 0;
0
467 BN_free(pk_num);-
468-
469 return ret;
never executed: return ret;
0
470}-
471-
472static int-
473priv_encode_gost01(PKCS8_PRIV_KEY_INFO *p8, const EVP_PKEY *pk)-
474{-
475 ASN1_OBJECT *algobj =-
476 OBJ_nid2obj(GostR3410_get_pk_digest(GOST_KEY_get_digest(pk->pkey.gost)));-
477 ASN1_STRING *params = encode_gost01_algor_params(pk);-
478 unsigned char *priv_buf = NULL;-
479 int priv_len;-
480 ASN1_INTEGER *asn1key = NULL;-
481-
482 if (params == NULL)
params == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
483 return 0;
never executed: return 0;
0
484-
485 asn1key = BN_to_ASN1_INTEGER(GOST_KEY_get0_private_key(pk->pkey.gost),-
486 NULL);-
487 if (asn1key == NULL) {
asn1key == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
488 ASN1_STRING_free(params);-
489 return 0;
never executed: return 0;
0
490 }-
491 priv_len = i2d_ASN1_INTEGER(asn1key, &priv_buf);-
492 ASN1_INTEGER_free(asn1key);-
493 return PKCS8_pkey_set0(p8, algobj, 0, V_ASN1_SEQUENCE, params, priv_buf,
never executed: return PKCS8_pkey_set0(p8, algobj, 0, 16, params, priv_buf, priv_len);
0
494 priv_len);
never executed: return PKCS8_pkey_set0(p8, algobj, 0, 16, params, priv_buf, priv_len);
0
495}-
496-
497static int-
498param_encode_gost01(const EVP_PKEY *pkey, unsigned char **pder)-
499{-
500 ASN1_STRING *params = encode_gost01_algor_params(pkey);-
501 int len;-
502-
503 if (params == NULL)
params == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
504 return 0;
never executed: return 0;
0
505 len = params->length;-
506 if (pder != NULL)
pder != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
507 memcpy(*pder, params->data, params->length);
never executed: memcpy(*pder, params->data, params->length);
0
508 ASN1_STRING_free(params);-
509 return len;
never executed: return len;
0
510}-
511-
512static int-
513param_decode_gost01(EVP_PKEY *pkey, const unsigned char **pder, int derlen)-
514{-
515 ASN1_OBJECT *obj = NULL;-
516 int nid;-
517 GOST_KEY *ec;-
518 EC_GROUP *group;-
519 int ret;-
520-
521 /* New format */-
522 if ((V_ASN1_SEQUENCE | V_ASN1_CONSTRUCTED) == **pder)
(16 | 0x20) == **pderDescription
TRUEnever evaluated
FALSEnever evaluated
0
523 return decode_gost01_algor_params(pkey, pder, derlen);
never executed: return decode_gost01_algor_params(pkey, pder, derlen);
0
524-
525 /* Compatibility */-
526 if (d2i_ASN1_OBJECT(&obj, pder, derlen) == NULL) {
d2i_ASN1_OBJEC...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
527 GOSTerror(ERR_R_MALLOC_FAILURE);-
528 return 0;
never executed: return 0;
0
529 }-
530 nid = OBJ_obj2nid(obj);-
531 ASN1_OBJECT_free(obj);-
532-
533 ec = GOST_KEY_new();-
534 if (ec == NULL) {
ec == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
535 GOSTerror(ERR_R_MALLOC_FAILURE);-
536 return 0;
never executed: return 0;
0
537 }-
538 group = EC_GROUP_new_by_curve_name(nid);-
539 if (group == NULL) {
group == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
540 GOSTerror(EC_R_EC_GROUP_NEW_BY_NAME_FAILURE);-
541 GOST_KEY_free(ec);-
542 return 0;
never executed: return 0;
0
543 }-
544-
545 EC_GROUP_set_asn1_flag(group, OPENSSL_EC_NAMED_CURVE);-
546 if (GOST_KEY_set_group(ec, group) == 0) {
GOST_KEY_set_g...c, group) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
547 GOSTerror(ERR_R_EC_LIB);-
548 EC_GROUP_free(group);-
549 GOST_KEY_free(ec);-
550 return 0;
never executed: return 0;
0
551 }-
552 EC_GROUP_free(group);-
553 if (GOST_KEY_set_digest(ec,
GOST_KEY_set_d...(ec, 822) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
554 NID_id_GostR3411_94_CryptoProParamSet) == 0) {
GOST_KEY_set_d...(ec, 822) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
555 GOSTerror(GOST_R_INVALID_DIGEST_TYPE);-
556 GOST_KEY_free(ec);-
557 return 0;
never executed: return 0;
0
558 }-
559 ret = EVP_PKEY_assign_GOST(pkey, ec);-
560 if (ret == 0)
ret == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
561 GOST_KEY_free(ec);
never executed: GOST_KEY_free(ec);
0
562 return ret;
never executed: return ret;
0
563}-
564-
565static int-
566param_missing_gost01(const EVP_PKEY *pk)-
567{-
568 const GOST_KEY *ec = pk->pkey.gost;-
569-
570 if (ec == NULL)
ec == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
571 return 1;
never executed: return 1;
0
572 if (GOST_KEY_get0_group(ec) == NULL)
GOST_KEY_get0_...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
573 return 1;
never executed: return 1;
0
574 if (GOST_KEY_get_digest(ec) == NID_undef)
GOST_KEY_get_digest(ec) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
575 return 1;
never executed: return 1;
0
576 return 0;
never executed: return 0;
0
577}-
578-
579static int-
580param_copy_gost01(EVP_PKEY *to, const EVP_PKEY *from)-
581{-
582 GOST_KEY *eto = to->pkey.gost;-
583 const GOST_KEY *efrom = from->pkey.gost;-
584 int ret = 1;-
585-
586 if (EVP_PKEY_base_id(from) != EVP_PKEY_base_id(to)) {
EVP_PKEY_base_...EY_base_id(to)Description
TRUEnever evaluated
FALSEnever evaluated
0
587 GOSTerror(GOST_R_INCOMPATIBLE_ALGORITHMS);-
588 return 0;
never executed: return 0;
0
589 }-
590 if (efrom == NULL) {
efrom == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
591 GOSTerror(GOST_R_KEY_PARAMETERS_MISSING);-
592 return 0;
never executed: return 0;
0
593 }-
594 if (eto == NULL) {
eto == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
595 eto = GOST_KEY_new();-
596 if (eto == NULL) {
eto == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
597 GOSTerror(ERR_R_MALLOC_FAILURE);-
598 return 0;
never executed: return 0;
0
599 }-
600 if (EVP_PKEY_assign(to, EVP_PKEY_base_id(from), eto) == 0) {
EVP_PKEY_assig...om), eto) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
601 GOST_KEY_free(eto);-
602 return 0;
never executed: return 0;
0
603 }-
604 }
never executed: end of block
0
605 GOST_KEY_set_group(eto, GOST_KEY_get0_group(efrom));-
606 GOST_KEY_set_digest(eto, GOST_KEY_get_digest(efrom));-
607 if (GOST_KEY_get0_private_key(eto) != NULL)
GOST_KEY_get0_...!= ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
608 ret = gost2001_compute_public(eto);
never executed: ret = gost2001_compute_public(eto);
0
609-
610 return ret;
never executed: return ret;
0
611}-
612-
613static int-
614param_cmp_gost01(const EVP_PKEY *a, const EVP_PKEY *b)-
615{-
616 if (EC_GROUP_get_curve_name(GOST_KEY_get0_group(a->pkey.gost)) !=
EC_GROUP_get_c...b->pkey.gost))Description
TRUEnever evaluated
FALSEnever evaluated
0
617 EC_GROUP_get_curve_name(GOST_KEY_get0_group(b->pkey.gost)))
EC_GROUP_get_c...b->pkey.gost))Description
TRUEnever evaluated
FALSEnever evaluated
0
618 return 0;
never executed: return 0;
0
619-
620 if (GOST_KEY_get_digest(a->pkey.gost) !=
GOST_KEY_get_d...(b->pkey.gost)Description
TRUEnever evaluated
FALSEnever evaluated
0
621 GOST_KEY_get_digest(b->pkey.gost))
GOST_KEY_get_d...(b->pkey.gost)Description
TRUEnever evaluated
FALSEnever evaluated
0
622 return 0;
never executed: return 0;
0
623-
624 return 1;
never executed: return 1;
0
625}-
626-
627static int-
628pkey_ctrl_gost01(EVP_PKEY *pkey, int op, long arg1, void *arg2)-
629{-
630 X509_ALGOR *alg1 = NULL, *alg2 = NULL, *alg3 = NULL;-
631 int digest = GOST_KEY_get_digest(pkey->pkey.gost);-
632-
633 switch (op) {-
634 case ASN1_PKEY_CTRL_PKCS7_SIGN:
never executed: case 0x1:
0
635 if (arg1 == 0)
arg1 == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
636 PKCS7_SIGNER_INFO_get0_algs(arg2, NULL, &alg1, &alg2);
never executed: PKCS7_SIGNER_INFO_get0_algs(arg2, ((void *)0) , &alg1, &alg2);
0
637 break;
never executed: break;
0
638-
639 case ASN1_PKEY_CTRL_PKCS7_ENCRYPT:
never executed: case 0x2:
0
640 if (arg1 == 0)
arg1 == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
641 PKCS7_RECIP_INFO_get0_alg(arg2, &alg3);
never executed: PKCS7_RECIP_INFO_get0_alg(arg2, &alg3);
0
642 break;
never executed: break;
0
643 case ASN1_PKEY_CTRL_DEFAULT_MD_NID:
never executed: case 0x3:
0
644 *(int *)arg2 = GostR3410_get_md_digest(digest);-
645 return 2;
never executed: return 2;
0
646-
647 default:
never executed: default:
0
648 return -2;
never executed: return -2;
0
649 }-
650-
651 if (alg1)
alg1Description
TRUEnever evaluated
FALSEnever evaluated
0
652 X509_ALGOR_set0(alg1, OBJ_nid2obj(GostR3410_get_md_digest(digest)), V_ASN1_NULL, 0);
never executed: X509_ALGOR_set0(alg1, OBJ_nid2obj(GostR3410_get_md_digest(digest)), 5, 0);
0
653 if (alg2)
alg2Description
TRUEnever evaluated
FALSEnever evaluated
0
654 X509_ALGOR_set0(alg2, OBJ_nid2obj(GostR3410_get_pk_digest(digest)), V_ASN1_NULL, 0);
never executed: X509_ALGOR_set0(alg2, OBJ_nid2obj(GostR3410_get_pk_digest(digest)), 5, 0);
0
655 if (alg3) {
alg3Description
TRUEnever evaluated
FALSEnever evaluated
0
656 ASN1_STRING *params = encode_gost01_algor_params(pkey);-
657 if (params == NULL) {
params == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
658 return -1;
never executed: return -1;
0
659 }-
660 X509_ALGOR_set0(alg3,-
661 OBJ_nid2obj(GostR3410_get_pk_digest(digest)),-
662 V_ASN1_SEQUENCE, params);-
663 }
never executed: end of block
0
664-
665 return 1;
never executed: return 1;
0
666}-
667-
668const EVP_PKEY_ASN1_METHOD gostr01_asn1_meths[] = {-
669 {-
670 .pkey_id = EVP_PKEY_GOSTR01,-
671 .pkey_base_id = EVP_PKEY_GOSTR01,-
672 .pkey_flags = ASN1_PKEY_SIGPARAM_NULL,-
673-
674 .pem_str = "GOST2001",-
675 .info = "GOST R 34.10-2001",-
676-
677 .pkey_free = pkey_free_gost01,-
678 .pkey_ctrl = pkey_ctrl_gost01,-
679-
680 .priv_decode = priv_decode_gost01,-
681 .priv_encode = priv_encode_gost01,-
682 .priv_print = priv_print_gost01,-
683-
684 .param_decode = param_decode_gost01,-
685 .param_encode = param_encode_gost01,-
686 .param_missing = param_missing_gost01,-
687 .param_copy = param_copy_gost01,-
688 .param_cmp = param_cmp_gost01,-
689 .param_print = param_print_gost01,-
690-
691 .pub_decode = pub_decode_gost01,-
692 .pub_encode = pub_encode_gost01,-
693 .pub_cmp = pub_cmp_gost01,-
694 .pub_print = pub_print_gost01,-
695 .pkey_size = pkey_size_gost01,-
696 .pkey_bits = pkey_bits_gost01,-
697 },-
698 {-
699 .pkey_id = EVP_PKEY_GOSTR12_256,-
700 .pkey_base_id = EVP_PKEY_GOSTR01,-
701 .pkey_flags = ASN1_PKEY_ALIAS-
702 },-
703 {-
704 .pkey_id = EVP_PKEY_GOSTR12_512,-
705 .pkey_base_id = EVP_PKEY_GOSTR01,-
706 .pkey_flags = ASN1_PKEY_ALIAS-
707 },-
708};-
709-
710#endif-
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.2.2