| Absolute File Name: | /home/opencoverage/opencoverage/guest-scripts/libressl/src/crypto/gost/gostr341001_ameth.c |
| Source code | Switch to Preprocessed file |
| Line | Source | Count | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 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 | - | |||||||||||||
| 69 | static void | - | ||||||||||||
| 70 | pkey_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 | */ | - | ||||||||||||
| 79 | static int | - | ||||||||||||
| 80 | decode_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) {
| 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) {
| 0 | ||||||||||||
| 98 | ec = GOST_KEY_new(); | - | ||||||||||||
| 99 | if (ec == NULL)
| 0 | ||||||||||||
| 100 | return 0; never executed: return 0; | 0 | ||||||||||||
| 101 | if (EVP_PKEY_assign_GOST(pkey, ec) == 0)
| 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)
| 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) {
| 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)
| 0 | ||||||||||||
| 115 | return 0; never executed: return 0; | 0 | ||||||||||||
| 116 | return 1; never executed: return 1; | 0 | ||||||||||||
| 117 | } | - | ||||||||||||
| 118 | - | |||||||||||||
| 119 | static ASN1_STRING * | - | ||||||||||||
| 120 | encode_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) {
| 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, ¶ms->data); | - | ||||||||||||
| 139 | if (params->length <= 0) {
| 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; | - | ||||||||||||
| 146 | err: code before this statement never executed: err: | 0 | ||||||||||||
| 147 | GOST_KEY_PARAMS_free(gkp); | - | ||||||||||||
| 148 | return params; never executed: return params; | 0 | ||||||||||||
| 149 | } | - | ||||||||||||
| 150 | - | |||||||||||||
| 151 | static int | - | ||||||||||||
| 152 | pub_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)
| 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)
| 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 | - | |||||||||||||
| 169 | static int | - | ||||||||||||
| 170 | pkey_size_gost01(const EVP_PKEY *pk) | - | ||||||||||||
| 171 | { | - | ||||||||||||
| 172 | if (GOST_KEY_get_digest(pk->pkey.gost) == NID_id_tc26_gost3411_2012_512)
| 0 | ||||||||||||
| 173 | return 128; never executed: return 128; | 0 | ||||||||||||
| 174 | return 64; never executed: return 64; | 0 | ||||||||||||
| 175 | } | - | ||||||||||||
| 176 | - | |||||||||||||
| 177 | static int | - | ||||||||||||
| 178 | pkey_bits_gost01(const EVP_PKEY *pk) | - | ||||||||||||
| 179 | { | - | ||||||||||||
| 180 | if (GOST_KEY_get_digest(pk->pkey.gost) == NID_id_tc26_gost3411_2012_512)
| 0 | ||||||||||||
| 181 | return 512; never executed: return 512; | 0 | ||||||||||||
| 182 | return 256; never executed: return 256; | 0 | ||||||||||||
| 183 | } | - | ||||||||||||
| 184 | - | |||||||||||||
| 185 | static int | - | ||||||||||||
| 186 | pub_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)
| 0 | ||||||||||||
| 201 | == 0)
| 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) {
| 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)
| 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) {
| 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)
| 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 | - | |||||||||||||
| 235 | static int | - | ||||||||||||
| 236 | pub_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) {
| 0 | ||||||||||||
| 251 | params = encode_gost01_algor_params(pk); | - | ||||||||||||
| 252 | if (params == NULL)
| 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) {
| 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) {
| 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) {
| 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) {
| 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),
| 0 | ||||||||||||
| 288 | pub_key, X, Y, NULL) == 0) {
| 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)
| 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 | - | |||||||||||||
| 306 | err: | - | ||||||||||||
| 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 | - | |||||||||||||
| 314 | static int | - | ||||||||||||
| 315 | param_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)
| 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)
| 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 | - | |||||||||||||
| 330 | static int | - | ||||||||||||
| 331 | pub_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) {
| 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)
| 0 | ||||||||||||
| 344 | goto err; never executed: goto err; | 0 | ||||||||||||
| 345 | if ((Y = BN_CTX_get(ctx)) == NULL)
| 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,
| 0 | ||||||||||||
| 350 | ctx) == 0) {
| 0 | ||||||||||||
| 351 | GOSTerror(ERR_R_EC_LIB); | - | ||||||||||||
| 352 | goto err; never executed: goto err; | 0 | ||||||||||||
| 353 | } | - | ||||||||||||
| 354 | if (BIO_indent(out, indent, 128) == 0)
| 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)
| 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 | - | |||||||||||||
| 372 | err: | - | ||||||||||||
| 373 | BN_CTX_end(ctx); | - | ||||||||||||
| 374 | BN_CTX_free(ctx); | - | ||||||||||||
| 375 | return 0; never executed: return 0; | 0 | ||||||||||||
| 376 | } | - | ||||||||||||
| 377 | - | |||||||||||||
| 378 | static int | - | ||||||||||||
| 379 | priv_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)
| 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)
| 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 | - | |||||||||||||
| 396 | static int | - | ||||||||||||
| 397 | priv_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)
| 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) {
| 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)
| 0 | ||||||||||||
| 420 | return 0; never executed: return 0; | 0 | ||||||||||||
| 421 | p = pkey_buf; | - | ||||||||||||
| 422 | if (V_ASN1_OCTET_STRING == *p) {
| 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) {
| 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)
| 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) {
| 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) {
| 0 | ||||||||||||
| 449 | ec = GOST_KEY_new(); | - | ||||||||||||
| 450 | if (ec == NULL) {
| 0 | ||||||||||||
| 451 | BN_free(pk_num); | - | ||||||||||||
| 452 | return 0; never executed: return 0; | 0 | ||||||||||||
| 453 | } | - | ||||||||||||
| 454 | if (EVP_PKEY_assign_GOST(pk, ec) == 0) {
| 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) {
| 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)
| 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 | - | |||||||||||||
| 472 | static int | - | ||||||||||||
| 473 | priv_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)
| 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) {
| 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 | - | |||||||||||||
| 497 | static int | - | ||||||||||||
| 498 | param_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)
| 0 | ||||||||||||
| 504 | return 0; never executed: return 0; | 0 | ||||||||||||
| 505 | len = params->length; | - | ||||||||||||
| 506 | if (pder != NULL)
| 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 | - | |||||||||||||
| 512 | static int | - | ||||||||||||
| 513 | param_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)
| 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) {
| 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) {
| 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) {
| 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) {
| 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,
| 0 | ||||||||||||
| 554 | NID_id_GostR3411_94_CryptoProParamSet) == 0) {
| 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)
| 0 | ||||||||||||
| 561 | GOST_KEY_free(ec); never executed: GOST_KEY_free(ec); | 0 | ||||||||||||
| 562 | return ret; never executed: return ret; | 0 | ||||||||||||
| 563 | } | - | ||||||||||||
| 564 | - | |||||||||||||
| 565 | static int | - | ||||||||||||
| 566 | param_missing_gost01(const EVP_PKEY *pk) | - | ||||||||||||
| 567 | { | - | ||||||||||||
| 568 | const GOST_KEY *ec = pk->pkey.gost; | - | ||||||||||||
| 569 | - | |||||||||||||
| 570 | if (ec == NULL)
| 0 | ||||||||||||
| 571 | return 1; never executed: return 1; | 0 | ||||||||||||
| 572 | if (GOST_KEY_get0_group(ec) == NULL)
| 0 | ||||||||||||
| 573 | return 1; never executed: return 1; | 0 | ||||||||||||
| 574 | if (GOST_KEY_get_digest(ec) == NID_undef)
| 0 | ||||||||||||
| 575 | return 1; never executed: return 1; | 0 | ||||||||||||
| 576 | return 0; never executed: return 0; | 0 | ||||||||||||
| 577 | } | - | ||||||||||||
| 578 | - | |||||||||||||
| 579 | static int | - | ||||||||||||
| 580 | param_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)) {
| 0 | ||||||||||||
| 587 | GOSTerror(GOST_R_INCOMPATIBLE_ALGORITHMS); | - | ||||||||||||
| 588 | return 0; never executed: return 0; | 0 | ||||||||||||
| 589 | } | - | ||||||||||||
| 590 | if (efrom == NULL) {
| 0 | ||||||||||||
| 591 | GOSTerror(GOST_R_KEY_PARAMETERS_MISSING); | - | ||||||||||||
| 592 | return 0; never executed: return 0; | 0 | ||||||||||||
| 593 | } | - | ||||||||||||
| 594 | if (eto == NULL) {
| 0 | ||||||||||||
| 595 | eto = GOST_KEY_new(); | - | ||||||||||||
| 596 | if (eto == NULL) {
| 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) {
| 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)
| 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 | - | |||||||||||||
| 613 | static int | - | ||||||||||||
| 614 | param_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)) !=
| 0 | ||||||||||||
| 617 | EC_GROUP_get_curve_name(GOST_KEY_get0_group(b->pkey.gost)))
| 0 | ||||||||||||
| 618 | return 0; never executed: return 0; | 0 | ||||||||||||
| 619 | - | |||||||||||||
| 620 | if (GOST_KEY_get_digest(a->pkey.gost) !=
| 0 | ||||||||||||
| 621 | GOST_KEY_get_digest(b->pkey.gost))
| 0 | ||||||||||||
| 622 | return 0; never executed: return 0; | 0 | ||||||||||||
| 623 | - | |||||||||||||
| 624 | return 1; never executed: return 1; | 0 | ||||||||||||
| 625 | } | - | ||||||||||||
| 626 | - | |||||||||||||
| 627 | static int | - | ||||||||||||
| 628 | pkey_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)
| 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)
| 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)
| 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)
| 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) {
| 0 | ||||||||||||
| 656 | ASN1_STRING *params = encode_gost01_algor_params(pkey); | - | ||||||||||||
| 657 | if (params == NULL) {
| 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 | - | |||||||||||||
| 668 | const 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 code | Switch to Preprocessed file |