| Absolute File Name: | /home/opencoverage/opencoverage/guest-scripts/libressl/src/crypto/gost/gostr341001_ameth.c |
| Switch to Source code | Preprocessed file |
| Line | Source | Count | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | - | |||||||||||||
| 2 | - | |||||||||||||
| 3 | - | |||||||||||||
| 4 | - | |||||||||||||
| 5 | - | |||||||||||||
| 6 | - | |||||||||||||
| 7 | static void | - | ||||||||||||
| 8 | pkey_free_gost01(EVP_PKEY *key) | - | ||||||||||||
| 9 | { | - | ||||||||||||
| 10 | GOST_KEY_free(key->pkey.gost); | - | ||||||||||||
| 11 | } never executed: end of block | 0 | ||||||||||||
| 12 | - | |||||||||||||
| 13 | - | |||||||||||||
| 14 | - | |||||||||||||
| 15 | - | |||||||||||||
| 16 | - | |||||||||||||
| 17 | static int | - | ||||||||||||
| 18 | decode_gost01_algor_params(EVP_PKEY *pkey, const unsigned char **p, int len) | - | ||||||||||||
| 19 | { | - | ||||||||||||
| 20 | int param_nid = 0, digest_nid = 0; | - | ||||||||||||
| 21 | GOST_KEY_PARAMS *gkp = | - | ||||||||||||
| 22 | ((void *)0) | - | ||||||||||||
| 23 | ; | - | ||||||||||||
| 24 | EC_GROUP *group; | - | ||||||||||||
| 25 | GOST_KEY *ec; | - | ||||||||||||
| 26 | - | |||||||||||||
| 27 | gkp = d2i_GOST_KEY_PARAMS( | - | ||||||||||||
| 28 | ((void *)0) | - | ||||||||||||
| 29 | , p, len); | - | ||||||||||||
| 30 | if (gkp ==
| 0 | ||||||||||||
| 31 | ((void *)0)
| 0 | ||||||||||||
| 32 | ) { | - | ||||||||||||
| 33 | ERR_put_error(50,(0xfff),(105),__FILE__,89); | - | ||||||||||||
| 34 | return never executed: 0;return 0;never executed: return 0; | 0 | ||||||||||||
| 35 | } | - | ||||||||||||
| 36 | param_nid = OBJ_obj2nid(gkp->key_params); | - | ||||||||||||
| 37 | digest_nid = OBJ_obj2nid(gkp->hash_params); | - | ||||||||||||
| 38 | GOST_KEY_PARAMS_free(gkp); | - | ||||||||||||
| 39 | - | |||||||||||||
| 40 | ec = pkey->pkey.gost; | - | ||||||||||||
| 41 | if (ec ==
| 0 | ||||||||||||
| 42 | ((void *)0)
| 0 | ||||||||||||
| 43 | ) { | - | ||||||||||||
| 44 | ec = GOST_KEY_new(); | - | ||||||||||||
| 45 | if (ec ==
| 0 | ||||||||||||
| 46 | ((void *)0)
| 0 | ||||||||||||
| 47 | ) | - | ||||||||||||
| 48 | return never executed: 0;return 0;never executed: return 0; | 0 | ||||||||||||
| 49 | if (EVP_PKEY_assign((pkey),811, (char *)(ec)) == 0
| 0 | ||||||||||||
| 50 | return never executed: 0;return 0;never executed: return 0; | 0 | ||||||||||||
| 51 | } never executed: end of block | 0 | ||||||||||||
| 52 | - | |||||||||||||
| 53 | group = EC_GROUP_new_by_curve_name(param_nid); | - | ||||||||||||
| 54 | if (group ==
| 0 | ||||||||||||
| 55 | ((void *)0)
| 0 | ||||||||||||
| 56 | ) | - | ||||||||||||
| 57 | return never executed: 0;return 0;never executed: return 0; | 0 | ||||||||||||
| 58 | EC_GROUP_set_asn1_flag(group, 0x001); | - | ||||||||||||
| 59 | if (GOST_KEY_set_group(ec, group) == 0
| 0 | ||||||||||||
| 60 | EC_GROUP_free(group); | - | ||||||||||||
| 61 | return never executed: 0;return 0;never executed: return 0; | 0 | ||||||||||||
| 62 | } | - | ||||||||||||
| 63 | EC_GROUP_free(group); | - | ||||||||||||
| 64 | if (GOST_KEY_set_digest(ec, digest_nid) == 0
| 0 | ||||||||||||
| 65 | return never executed: 0;return 0;never executed: return 0; | 0 | ||||||||||||
| 66 | return never executed: 1;return 1;never executed: return 1; | 0 | ||||||||||||
| 67 | } | - | ||||||||||||
| 68 | - | |||||||||||||
| 69 | static ASN1_STRING * | - | ||||||||||||
| 70 | encode_gost01_algor_params(const EVP_PKEY *key) | - | ||||||||||||
| 71 | { | - | ||||||||||||
| 72 | ASN1_STRING *params = ASN1_STRING_new(); | - | ||||||||||||
| 73 | GOST_KEY_PARAMS *gkp = GOST_KEY_PARAMS_new(); | - | ||||||||||||
| 74 | int pkey_param_nid = 0; | - | ||||||||||||
| 75 | - | |||||||||||||
| 76 | if (params ==
| 0 | ||||||||||||
| 77 | ((void *)0)
| 0 | ||||||||||||
| 78 | || gkp ==
| 0 | ||||||||||||
| 79 | ((void *)0)
| 0 | ||||||||||||
| 80 | ) { | - | ||||||||||||
| 81 | ERR_put_error(50,(0xfff),((1|64)),__FILE__,127); | - | ||||||||||||
| 82 | ASN1_STRING_free(params); | - | ||||||||||||
| 83 | params = | - | ||||||||||||
| 84 | ((void *)0) | - | ||||||||||||
| 85 | ; | - | ||||||||||||
| 86 | goto never executed: err;goto err;never executed: goto err; | 0 | ||||||||||||
| 87 | } | - | ||||||||||||
| 88 | - | |||||||||||||
| 89 | pkey_param_nid = | - | ||||||||||||
| 90 | EC_GROUP_get_curve_name(GOST_KEY_get0_group(key->pkey.gost)); | - | ||||||||||||
| 91 | gkp->key_params = OBJ_nid2obj(pkey_param_nid); | - | ||||||||||||
| 92 | gkp->hash_params = OBJ_nid2obj(GOST_KEY_get_digest(key->pkey.gost)); | - | ||||||||||||
| 93 | - | |||||||||||||
| 94 | params->length = i2d_GOST_KEY_PARAMS(gkp, ¶ms->data); | - | ||||||||||||
| 95 | if (params->length <= 0
| 0 | ||||||||||||
| 96 | ERR_put_error(50,(0xfff),((1|64)),__FILE__,140); | - | ||||||||||||
| 97 | ASN1_STRING_free(params); | - | ||||||||||||
| 98 | params = | - | ||||||||||||
| 99 | ((void *)0) | - | ||||||||||||
| 100 | ; | - | ||||||||||||
| 101 | goto never executed: err;goto err;never executed: goto err; | 0 | ||||||||||||
| 102 | } | - | ||||||||||||
| 103 | params->type = 16; | - | ||||||||||||
| 104 | err: code before this statement never executed: err: | 0 | ||||||||||||
| 105 | GOST_KEY_PARAMS_free(gkp); | - | ||||||||||||
| 106 | return never executed: params;return params;never executed: return params; | 0 | ||||||||||||
| 107 | } | - | ||||||||||||
| 108 | - | |||||||||||||
| 109 | static int | - | ||||||||||||
| 110 | pub_cmp_gost01(const EVP_PKEY *a, const EVP_PKEY *b) | - | ||||||||||||
| 111 | { | - | ||||||||||||
| 112 | const GOST_KEY *ea = a->pkey.gost; | - | ||||||||||||
| 113 | const GOST_KEY *eb = b->pkey.gost; | - | ||||||||||||
| 114 | const EC_POINT *ka, *kb; | - | ||||||||||||
| 115 | int ret = 0; | - | ||||||||||||
| 116 | - | |||||||||||||
| 117 | if (ea ==
| 0 | ||||||||||||
| 118 | ((void *)0)
| 0 | ||||||||||||
| 119 | || eb ==
| 0 | ||||||||||||
| 120 | ((void *)0)
| 0 | ||||||||||||
| 121 | ) | - | ||||||||||||
| 122 | return never executed: 0;return 0;never executed: return 0; | 0 | ||||||||||||
| 123 | ka = GOST_KEY_get0_public_key(ea); | - | ||||||||||||
| 124 | kb = GOST_KEY_get0_public_key(eb); | - | ||||||||||||
| 125 | if (ka ==
| 0 | ||||||||||||
| 126 | ((void *)0)
| 0 | ||||||||||||
| 127 | || kb ==
| 0 | ||||||||||||
| 128 | ((void *)0)
| 0 | ||||||||||||
| 129 | ) | - | ||||||||||||
| 130 | return never executed: 0;return 0;never executed: return 0; | 0 | ||||||||||||
| 131 | ret = (0 == EC_POINT_cmp(GOST_KEY_get0_group(ea), ka, kb, | - | ||||||||||||
| 132 | ((void *)0) | - | ||||||||||||
| 133 | )); | - | ||||||||||||
| 134 | return never executed: ret;return ret;never executed: return ret; | 0 | ||||||||||||
| 135 | } | - | ||||||||||||
| 136 | - | |||||||||||||
| 137 | static int | - | ||||||||||||
| 138 | pkey_size_gost01(const EVP_PKEY *pk) | - | ||||||||||||
| 139 | { | - | ||||||||||||
| 140 | if (GOST_KEY_get_digest(pk->pkey.gost) == 942
| 0 | ||||||||||||
| 141 | return never executed: 128;return 128;never executed: return 128; | 0 | ||||||||||||
| 142 | return never executed: 64;return 64;never executed: return 64; | 0 | ||||||||||||
| 143 | } | - | ||||||||||||
| 144 | - | |||||||||||||
| 145 | static int | - | ||||||||||||
| 146 | pkey_bits_gost01(const EVP_PKEY *pk) | - | ||||||||||||
| 147 | { | - | ||||||||||||
| 148 | if (GOST_KEY_get_digest(pk->pkey.gost) == 942
| 0 | ||||||||||||
| 149 | return never executed: 512;return 512;never executed: return 512; | 0 | ||||||||||||
| 150 | return never executed: 256;return 256;never executed: return 256; | 0 | ||||||||||||
| 151 | } | - | ||||||||||||
| 152 | - | |||||||||||||
| 153 | static int | - | ||||||||||||
| 154 | pub_decode_gost01(EVP_PKEY *pk, X509_PUBKEY *pub) | - | ||||||||||||
| 155 | { | - | ||||||||||||
| 156 | X509_ALGOR *palg = | - | ||||||||||||
| 157 | ((void *)0) | - | ||||||||||||
| 158 | ; | - | ||||||||||||
| 159 | const unsigned char *pubkey_buf = | - | ||||||||||||
| 160 | ((void *)0) | - | ||||||||||||
| 161 | ; | - | ||||||||||||
| 162 | const unsigned char *p; | - | ||||||||||||
| 163 | ASN1_OBJECT *palgobj = | - | ||||||||||||
| 164 | ((void *)0) | - | ||||||||||||
| 165 | ; | - | ||||||||||||
| 166 | int pub_len; | - | ||||||||||||
| 167 | BIGNUM *X, *Y; | - | ||||||||||||
| 168 | ASN1_OCTET_STRING *octet = | - | ||||||||||||
| 169 | ((void *)0) | - | ||||||||||||
| 170 | ; | - | ||||||||||||
| 171 | int len; | - | ||||||||||||
| 172 | int ret; | - | ||||||||||||
| 173 | int ptype = -1; | - | ||||||||||||
| 174 | ASN1_STRING *pval = | - | ||||||||||||
| 175 | ((void *)0) | - | ||||||||||||
| 176 | ; | - | ||||||||||||
| 177 | - | |||||||||||||
| 178 | if (X509_PUBKEY_get0_param(&palgobj, &pubkey_buf, &pub_len, &palg, pub)
| 0 | ||||||||||||
| 179 | == 0
| 0 | ||||||||||||
| 180 | return never executed: 0;return 0;never executed: return 0; | 0 | ||||||||||||
| 181 | (void)EVP_PKEY_assign((pk),811, (char *)( | - | ||||||||||||
| 182 | ((void *)0) | - | ||||||||||||
| 183 | )); | - | ||||||||||||
| 184 | X509_ALGOR_get0( | - | ||||||||||||
| 185 | ((void *)0) | - | ||||||||||||
| 186 | , &ptype, (const void **)&pval, palg); | - | ||||||||||||
| 187 | if (ptype != 16
| 0 | ||||||||||||
| 188 | ERR_put_error(50,(0xfff),(104),__FILE__,206); | - | ||||||||||||
| 189 | return never executed: 0;return 0;never executed: return 0; | 0 | ||||||||||||
| 190 | } | - | ||||||||||||
| 191 | p = pval->data; | - | ||||||||||||
| 192 | if (decode_gost01_algor_params(pk, &p, pval->length) == 0
| 0 | ||||||||||||
| 193 | return never executed: 0;return 0;never executed: return 0; | 0 | ||||||||||||
| 194 | - | |||||||||||||
| 195 | octet = d2i_ASN1_OCTET_STRING( | - | ||||||||||||
| 196 | ((void *)0) | - | ||||||||||||
| 197 | , &pubkey_buf, pub_len); | - | ||||||||||||
| 198 | if (octet ==
| 0 | ||||||||||||
| 199 | ((void *)0)
| 0 | ||||||||||||
| 200 | ) { | - | ||||||||||||
| 201 | ERR_put_error(50,(0xfff),((1|64)),__FILE__,215); | - | ||||||||||||
| 202 | return never executed: 0;return 0;never executed: return 0; | 0 | ||||||||||||
| 203 | } | - | ||||||||||||
| 204 | len = octet->length / 2; | - | ||||||||||||
| 205 | - | |||||||||||||
| 206 | X = GOST_le2bn(octet->data, len, | - | ||||||||||||
| 207 | ((void *)0) | - | ||||||||||||
| 208 | ); | - | ||||||||||||
| 209 | Y = GOST_le2bn(octet->data + len, len, | - | ||||||||||||
| 210 | ((void *)0) | - | ||||||||||||
| 211 | ); | - | ||||||||||||
| 212 | - | |||||||||||||
| 213 | ASN1_OCTET_STRING_free(octet); | - | ||||||||||||
| 214 | - | |||||||||||||
| 215 | ret = GOST_KEY_set_public_key_affine_coordinates(pk->pkey.gost, X, Y); | - | ||||||||||||
| 216 | if (ret == 0
| 0 | ||||||||||||
| 217 | ERR_put_error(50,(0xfff),(16),__FILE__,227); never executed: ERR_put_error(50,(0xfff),(16),__FILE__,227); | 0 | ||||||||||||
| 218 | - | |||||||||||||
| 219 | BN_free(X); | - | ||||||||||||
| 220 | BN_free(Y); | - | ||||||||||||
| 221 | - | |||||||||||||
| 222 | return never executed: ret;return ret;never executed: return ret; | 0 | ||||||||||||
| 223 | } | - | ||||||||||||
| 224 | - | |||||||||||||
| 225 | static int | - | ||||||||||||
| 226 | pub_encode_gost01(X509_PUBKEY *pub, const EVP_PKEY *pk) | - | ||||||||||||
| 227 | { | - | ||||||||||||
| 228 | ASN1_OBJECT *algobj = | - | ||||||||||||
| 229 | ((void *)0) | - | ||||||||||||
| 230 | ; | - | ||||||||||||
| 231 | ASN1_OCTET_STRING *octet = | - | ||||||||||||
| 232 | ((void *)0) | - | ||||||||||||
| 233 | ; | - | ||||||||||||
| 234 | ASN1_STRING *params = | - | ||||||||||||
| 235 | ((void *)0) | - | ||||||||||||
| 236 | ; | - | ||||||||||||
| 237 | void *pval = | - | ||||||||||||
| 238 | ((void *)0) | - | ||||||||||||
| 239 | ; | - | ||||||||||||
| 240 | unsigned char *buf = | - | ||||||||||||
| 241 | ((void *)0) | - | ||||||||||||
| 242 | , *sptr; | - | ||||||||||||
| 243 | int key_size, ret = 0; | - | ||||||||||||
| 244 | const EC_POINT *pub_key; | - | ||||||||||||
| 245 | BIGNUM *X = | - | ||||||||||||
| 246 | ((void *)0) | - | ||||||||||||
| 247 | , *Y = | - | ||||||||||||
| 248 | ((void *)0) | - | ||||||||||||
| 249 | ; | - | ||||||||||||
| 250 | const GOST_KEY *ec = pk->pkey.gost; | - | ||||||||||||
| 251 | int ptype = -1; | - | ||||||||||||
| 252 | - | |||||||||||||
| 253 | algobj = OBJ_nid2obj(GostR3410_get_pk_digest(GOST_KEY_get_digest(ec))); | - | ||||||||||||
| 254 | if (pk->save_parameters
| 0 | ||||||||||||
| 255 | params = encode_gost01_algor_params(pk); | - | ||||||||||||
| 256 | if (params ==
| 0 | ||||||||||||
| 257 | ((void *)0)
| 0 | ||||||||||||
| 258 | ) | - | ||||||||||||
| 259 | return never executed: 0;return 0;never executed: return 0; | 0 | ||||||||||||
| 260 | pval = params; | - | ||||||||||||
| 261 | ptype = 16; | - | ||||||||||||
| 262 | } never executed: end of block | 0 | ||||||||||||
| 263 | - | |||||||||||||
| 264 | key_size = GOST_KEY_get_size(ec); | - | ||||||||||||
| 265 | - | |||||||||||||
| 266 | pub_key = GOST_KEY_get0_public_key(ec); | - | ||||||||||||
| 267 | if (pub_key ==
| 0 | ||||||||||||
| 268 | ((void *)0)
| 0 | ||||||||||||
| 269 | ) { | - | ||||||||||||
| 270 | ERR_put_error(50,(0xfff),(118),__FILE__,262); | - | ||||||||||||
| 271 | goto never executed: err;goto err;never executed: goto err; | 0 | ||||||||||||
| 272 | } | - | ||||||||||||
| 273 | - | |||||||||||||
| 274 | octet = ASN1_OCTET_STRING_new(); | - | ||||||||||||
| 275 | if (octet ==
| 0 | ||||||||||||
| 276 | ((void *)0)
| 0 | ||||||||||||
| 277 | ) { | - | ||||||||||||
| 278 | ERR_put_error(50,(0xfff),((1|64)),__FILE__,268); | - | ||||||||||||
| 279 | goto never executed: err;goto err;never executed: goto err; | 0 | ||||||||||||
| 280 | } | - | ||||||||||||
| 281 | - | |||||||||||||
| 282 | ret = ASN1_STRING_set(octet, | - | ||||||||||||
| 283 | ((void *)0) | - | ||||||||||||
| 284 | , 2 * key_size); | - | ||||||||||||
| 285 | if (ret == 0
| 0 | ||||||||||||
| 286 | ERR_put_error(50,(0xfff),((4|64)),__FILE__,274); | - | ||||||||||||
| 287 | goto never executed: err;goto err;never executed: goto err; | 0 | ||||||||||||
| 288 | } | - | ||||||||||||
| 289 | - | |||||||||||||
| 290 | sptr = ASN1_STRING_data(octet); | - | ||||||||||||
| 291 | - | |||||||||||||
| 292 | X = BN_new(); | - | ||||||||||||
| 293 | Y = BN_new(); | - | ||||||||||||
| 294 | if (X ==
| 0 | ||||||||||||
| 295 | ((void *)0)
| 0 | ||||||||||||
| 296 | || Y ==
| 0 | ||||||||||||
| 297 | ((void *)0)
| 0 | ||||||||||||
| 298 | ) { | - | ||||||||||||
| 299 | ERR_put_error(50,(0xfff),((1|64)),__FILE__,283); | - | ||||||||||||
| 300 | goto never executed: err;goto err;never executed: goto err; | 0 | ||||||||||||
| 301 | } | - | ||||||||||||
| 302 | - | |||||||||||||
| 303 | if (EC_POINT_get_affine_coordinates_GFp(GOST_KEY_get0_group(ec),
| 0 | ||||||||||||
| 304 | pub_key, X, Y,
| 0 | ||||||||||||
| 305 | ((void *)0)
| 0 | ||||||||||||
| 306 | ) == 0
| 0 | ||||||||||||
| 307 | ERR_put_error(50,(0xfff),(16),__FILE__,289); | - | ||||||||||||
| 308 | goto never executed: err;goto err;never executed: goto err; | 0 | ||||||||||||
| 309 | } | - | ||||||||||||
| 310 | - | |||||||||||||
| 311 | GOST_bn2le(X, sptr, key_size); | - | ||||||||||||
| 312 | GOST_bn2le(Y, sptr + key_size, key_size); | - | ||||||||||||
| 313 | - | |||||||||||||
| 314 | BN_free(Y); | - | ||||||||||||
| 315 | BN_free(X); | - | ||||||||||||
| 316 | - | |||||||||||||
| 317 | ret = i2d_ASN1_OCTET_STRING(octet, &buf); | - | ||||||||||||
| 318 | ASN1_BIT_STRING_free(octet); | - | ||||||||||||
| 319 | if (ret < 0
| 0 | ||||||||||||
| 320 | return never executed: 0;return 0;never executed: return 0; | 0 | ||||||||||||
| 321 | - | |||||||||||||
| 322 | return never executed: X509_PUBKEY_set0_param(pub, algobj, ptype, pval, buf, ret);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 | ||||||||||||
| 323 | - | |||||||||||||
| 324 | err: | - | ||||||||||||
| 325 | BN_free(Y); | - | ||||||||||||
| 326 | BN_free(X); | - | ||||||||||||
| 327 | ASN1_BIT_STRING_free(octet); | - | ||||||||||||
| 328 | ASN1_STRING_free(params); | - | ||||||||||||
| 329 | return never executed: 0;return 0;never executed: return 0; | 0 | ||||||||||||
| 330 | } | - | ||||||||||||
| 331 | - | |||||||||||||
| 332 | static int | - | ||||||||||||
| 333 | param_print_gost01(BIO *out, const EVP_PKEY *pkey, int indent, ASN1_PCTX *pctx) | - | ||||||||||||
| 334 | { | - | ||||||||||||
| 335 | int param_nid = | - | ||||||||||||
| 336 | EC_GROUP_get_curve_name(GOST_KEY_get0_group(pkey->pkey.gost)); | - | ||||||||||||
| 337 | - | |||||||||||||
| 338 | if (BIO_indent(out, indent, 128) == 0
| 0 | ||||||||||||
| 339 | return never executed: 0;return 0;never executed: return 0; | 0 | ||||||||||||
| 340 | BIO_printf(out, "Parameter set: %s\n", OBJ_nid2ln(param_nid)); | - | ||||||||||||
| 341 | if (BIO_indent(out, indent, 128) == 0
| 0 | ||||||||||||
| 342 | return never executed: 0;return 0;never executed: return 0; | 0 | ||||||||||||
| 343 | BIO_printf(out, "Digest Algorithm: %s\n", | - | ||||||||||||
| 344 | OBJ_nid2ln(GOST_KEY_get_digest(pkey->pkey.gost))); | - | ||||||||||||
| 345 | return never executed: 1;return 1;never executed: return 1; | 0 | ||||||||||||
| 346 | } | - | ||||||||||||
| 347 | - | |||||||||||||
| 348 | static int | - | ||||||||||||
| 349 | pub_print_gost01(BIO *out, const EVP_PKEY *pkey, int indent, ASN1_PCTX *pctx) | - | ||||||||||||
| 350 | { | - | ||||||||||||
| 351 | BN_CTX *ctx = BN_CTX_new(); | - | ||||||||||||
| 352 | BIGNUM *X, *Y; | - | ||||||||||||
| 353 | const EC_POINT *pubkey; | - | ||||||||||||
| 354 | const EC_GROUP *group; | - | ||||||||||||
| 355 | - | |||||||||||||
| 356 | if (ctx ==
| 0 | ||||||||||||
| 357 | ((void *)0)
| 0 | ||||||||||||
| 358 | ) { | - | ||||||||||||
| 359 | ERR_put_error(50,(0xfff),((1|64)),__FILE__,339); | - | ||||||||||||
| 360 | return never executed: 0;return 0;never executed: return 0; | 0 | ||||||||||||
| 361 | } | - | ||||||||||||
| 362 | BN_CTX_start(ctx); | - | ||||||||||||
| 363 | if ((
| 0 | ||||||||||||
| 364 | ((void *)0)
| 0 | ||||||||||||
| 365 | ) | - | ||||||||||||
| 366 | goto never executed: err;goto err;never executed: goto err; | 0 | ||||||||||||
| 367 | if ((
| 0 | ||||||||||||
| 368 | ((void *)0)
| 0 | ||||||||||||
| 369 | ) | - | ||||||||||||
| 370 | goto never executed: err;goto err;never executed: goto err; | 0 | ||||||||||||
| 371 | pubkey = GOST_KEY_get0_public_key(pkey->pkey.gost); | - | ||||||||||||
| 372 | group = GOST_KEY_get0_group(pkey->pkey.gost); | - | ||||||||||||
| 373 | if (EC_POINT_get_affine_coordinates_GFp(group, pubkey, X, Y,
| 0 | ||||||||||||
| 374 | ctx) == 0
| 0 | ||||||||||||
| 375 | ERR_put_error(50,(0xfff),(16),__FILE__,351); | - | ||||||||||||
| 376 | goto never executed: err;goto err;never executed: goto err; | 0 | ||||||||||||
| 377 | } | - | ||||||||||||
| 378 | if (BIO_indent(out, indent, 128) == 0
| 0 | ||||||||||||
| 379 | goto never executed: err;goto err;never executed: goto err; | 0 | ||||||||||||
| 380 | BIO_printf(out, "Public key:\n"); | - | ||||||||||||
| 381 | if (BIO_indent(out, indent + 3, 128) == 0
| 0 | ||||||||||||
| 382 | goto never executed: err;goto err;never executed: goto err; | 0 | ||||||||||||
| 383 | BIO_printf(out, "X:"); | - | ||||||||||||
| 384 | BN_print(out, X); | - | ||||||||||||
| 385 | BIO_printf(out, "\n"); | - | ||||||||||||
| 386 | BIO_indent(out, indent + 3, 128); | - | ||||||||||||
| 387 | BIO_printf(out, "Y:"); | - | ||||||||||||
| 388 | BN_print(out, Y); | - | ||||||||||||
| 389 | BIO_printf(out, "\n"); | - | ||||||||||||
| 390 | - | |||||||||||||
| 391 | BN_CTX_end(ctx); | - | ||||||||||||
| 392 | BN_CTX_free(ctx); | - | ||||||||||||
| 393 | - | |||||||||||||
| 394 | return never executed: param_print_gost01(out, pkey, indent, pctx);return param_print_gost01(out, pkey, indent, pctx);never executed: return param_print_gost01(out, pkey, indent, pctx); | 0 | ||||||||||||
| 395 | - | |||||||||||||
| 396 | err: | - | ||||||||||||
| 397 | BN_CTX_end(ctx); | - | ||||||||||||
| 398 | BN_CTX_free(ctx); | - | ||||||||||||
| 399 | return never executed: 0;return 0;never executed: return 0; | 0 | ||||||||||||
| 400 | } | - | ||||||||||||
| 401 | - | |||||||||||||
| 402 | static int | - | ||||||||||||
| 403 | priv_print_gost01(BIO *out, const EVP_PKEY *pkey, int indent, ASN1_PCTX *pctx) | - | ||||||||||||
| 404 | { | - | ||||||||||||
| 405 | const BIGNUM *key; | - | ||||||||||||
| 406 | - | |||||||||||||
| 407 | if (BIO_indent(out, indent, 128) == 0
| 0 | ||||||||||||
| 408 | return never executed: 0;return 0;never executed: return 0; | 0 | ||||||||||||
| 409 | BIO_printf(out, "Private key: "); | - | ||||||||||||
| 410 | key = GOST_KEY_get0_private_key(pkey->pkey.gost); | - | ||||||||||||
| 411 | if (key ==
| 0 | ||||||||||||
| 412 | ((void *)0)
| 0 | ||||||||||||
| 413 | ) | - | ||||||||||||
| 414 | BIO_printf(out, "<undefined)"); never executed: BIO_printf(out, "<undefined)"); | 0 | ||||||||||||
| 415 | else | - | ||||||||||||
| 416 | BN_print(out, key); never executed: BN_print(out, key); | 0 | ||||||||||||
| 417 | BIO_printf(out, "\n"); | - | ||||||||||||
| 418 | - | |||||||||||||
| 419 | return never executed: pub_print_gost01(out, pkey, indent, pctx);return pub_print_gost01(out, pkey, indent, pctx);never executed: return pub_print_gost01(out, pkey, indent, pctx); | 0 | ||||||||||||
| 420 | } | - | ||||||||||||
| 421 | - | |||||||||||||
| 422 | static int | - | ||||||||||||
| 423 | priv_decode_gost01(EVP_PKEY *pk, const PKCS8_PRIV_KEY_INFO *p8inf) | - | ||||||||||||
| 424 | { | - | ||||||||||||
| 425 | const unsigned char *pkey_buf = | - | ||||||||||||
| 426 | ((void *)0) | - | ||||||||||||
| 427 | , *p = | - | ||||||||||||
| 428 | ((void *)0) | - | ||||||||||||
| 429 | ; | - | ||||||||||||
| 430 | int priv_len = 0; | - | ||||||||||||
| 431 | BIGNUM *pk_num = | - | ||||||||||||
| 432 | ((void *)0) | - | ||||||||||||
| 433 | ; | - | ||||||||||||
| 434 | int ret = 0; | - | ||||||||||||
| 435 | const X509_ALGOR *palg = | - | ||||||||||||
| 436 | ((void *)0) | - | ||||||||||||
| 437 | ; | - | ||||||||||||
| 438 | const ASN1_OBJECT *palg_obj = | - | ||||||||||||
| 439 | ((void *)0) | - | ||||||||||||
| 440 | ; | - | ||||||||||||
| 441 | ASN1_INTEGER *priv_key = | - | ||||||||||||
| 442 | ((void *)0) | - | ||||||||||||
| 443 | ; | - | ||||||||||||
| 444 | GOST_KEY *ec; | - | ||||||||||||
| 445 | int ptype = -1; | - | ||||||||||||
| 446 | ASN1_STRING *pval = | - | ||||||||||||
| 447 | ((void *)0) | - | ||||||||||||
| 448 | ; | - | ||||||||||||
| 449 | - | |||||||||||||
| 450 | if (PKCS8_pkey_get0(&palg_obj, &pkey_buf, &priv_len, &palg, p8inf) == 0
| 0 | ||||||||||||
| 451 | return never executed: 0;return 0;never executed: return 0; | 0 | ||||||||||||
| 452 | (void)EVP_PKEY_assign((pk),811, (char *)( | - | ||||||||||||
| 453 | ((void *)0) | - | ||||||||||||
| 454 | )); | - | ||||||||||||
| 455 | X509_ALGOR_get0( | - | ||||||||||||
| 456 | ((void *)0) | - | ||||||||||||
| 457 | , &ptype, (const void **)&pval, palg); | - | ||||||||||||
| 458 | if (ptype != 16
| 0 | ||||||||||||
| 459 | ERR_put_error(50,(0xfff),(104),__FILE__,415); | - | ||||||||||||
| 460 | return never executed: 0;return 0;never executed: return 0; | 0 | ||||||||||||
| 461 | } | - | ||||||||||||
| 462 | p = pval->data; | - | ||||||||||||
| 463 | if (decode_gost01_algor_params(pk, &p, pval->length) == 0
| 0 | ||||||||||||
| 464 | return never executed: 0;return 0;never executed: return 0; | 0 | ||||||||||||
| 465 | p = pkey_buf; | - | ||||||||||||
| 466 | if (4 == *p
| 0 | ||||||||||||
| 467 | - | |||||||||||||
| 468 | ASN1_OCTET_STRING *s = | - | ||||||||||||
| 469 | d2i_ASN1_OCTET_STRING( | - | ||||||||||||
| 470 | ((void *)0) | - | ||||||||||||
| 471 | , &p, priv_len); | - | ||||||||||||
| 472 | - | |||||||||||||
| 473 | if (s ==
| 0 | ||||||||||||
| 474 | ((void *)0)
| 0 | ||||||||||||
| 475 | ) { | - | ||||||||||||
| 476 | ERR_put_error(50,(0xfff),(114),__FILE__,428); | - | ||||||||||||
| 477 | ASN1_STRING_free(s); | - | ||||||||||||
| 478 | return never executed: 0;return 0;never executed: return 0; | 0 | ||||||||||||
| 479 | } | - | ||||||||||||
| 480 | - | |||||||||||||
| 481 | pk_num = GOST_le2bn(s->data, s->length, | - | ||||||||||||
| 482 | ((void *)0) | - | ||||||||||||
| 483 | ); | - | ||||||||||||
| 484 | ASN1_STRING_free(s); | - | ||||||||||||
| 485 | } never executed: else {end of block | 0 | ||||||||||||
| 486 | priv_key = d2i_ASN1_INTEGER( | - | ||||||||||||
| 487 | ((void *)0) | - | ||||||||||||
| 488 | , &p, priv_len); | - | ||||||||||||
| 489 | if (priv_key ==
| 0 | ||||||||||||
| 490 | ((void *)0)
| 0 | ||||||||||||
| 491 | ) | - | ||||||||||||
| 492 | return never executed: 0;return 0;never executed: return 0; | 0 | ||||||||||||
| 493 | ret = ((pk_num = ASN1_INTEGER_to_BN(priv_key, | - | ||||||||||||
| 494 | ((void *)0) | - | ||||||||||||
| 495 | )) != | - | ||||||||||||
| 496 | ((void *)0) | - | ||||||||||||
| 497 | ); | - | ||||||||||||
| 498 | ASN1_INTEGER_free(priv_key); | - | ||||||||||||
| 499 | if (ret == 0
| 0 | ||||||||||||
| 500 | ERR_put_error(50,(0xfff),(114),__FILE__,442); | - | ||||||||||||
| 501 | return never executed: 0;return 0;never executed: return 0; | 0 | ||||||||||||
| 502 | } | - | ||||||||||||
| 503 | } never executed: end of block | 0 | ||||||||||||
| 504 | - | |||||||||||||
| 505 | ec = pk->pkey.gost; | - | ||||||||||||
| 506 | if (ec ==
| 0 | ||||||||||||
| 507 | ((void *)0)
| 0 | ||||||||||||
| 508 | ) { | - | ||||||||||||
| 509 | ec = GOST_KEY_new(); | - | ||||||||||||
| 510 | if (ec ==
| 0 | ||||||||||||
| 511 | ((void *)0)
| 0 | ||||||||||||
| 512 | ) { | - | ||||||||||||
| 513 | BN_free(pk_num); | - | ||||||||||||
| 514 | return never executed: 0;return 0;never executed: return 0; | 0 | ||||||||||||
| 515 | } | - | ||||||||||||
| 516 | if (EVP_PKEY_assign((pk),811, (char *)(ec)) == 0
| 0 | ||||||||||||
| 517 | BN_free(pk_num); | - | ||||||||||||
| 518 | GOST_KEY_free(ec); | - | ||||||||||||
| 519 | return never executed: 0;return 0;never executed: return 0; | 0 | ||||||||||||
| 520 | } | - | ||||||||||||
| 521 | } never executed: end of block | 0 | ||||||||||||
| 522 | if (GOST_KEY_set_private_key(ec, pk_num) == 0
| 0 | ||||||||||||
| 523 | BN_free(pk_num); | - | ||||||||||||
| 524 | return never executed: 0;return 0;never executed: return 0; | 0 | ||||||||||||
| 525 | } | - | ||||||||||||
| 526 | ret = 0; | - | ||||||||||||
| 527 | if (EVP_PKEY_missing_parameters(pk) == 0
| 0 | ||||||||||||
| 528 | ret = gost2001_compute_public(ec) != 0; never executed: ret = gost2001_compute_public(ec) != 0; | 0 | ||||||||||||
| 529 | BN_free(pk_num); | - | ||||||||||||
| 530 | - | |||||||||||||
| 531 | return never executed: ret;return ret;never executed: return ret; | 0 | ||||||||||||
| 532 | } | - | ||||||||||||
| 533 | - | |||||||||||||
| 534 | static int | - | ||||||||||||
| 535 | priv_encode_gost01(PKCS8_PRIV_KEY_INFO *p8, const EVP_PKEY *pk) | - | ||||||||||||
| 536 | { | - | ||||||||||||
| 537 | ASN1_OBJECT *algobj = | - | ||||||||||||
| 538 | OBJ_nid2obj(GostR3410_get_pk_digest(GOST_KEY_get_digest(pk->pkey.gost))); | - | ||||||||||||
| 539 | ASN1_STRING *params = encode_gost01_algor_params(pk); | - | ||||||||||||
| 540 | unsigned char *priv_buf = | - | ||||||||||||
| 541 | ((void *)0) | - | ||||||||||||
| 542 | ; | - | ||||||||||||
| 543 | int priv_len; | - | ||||||||||||
| 544 | ASN1_INTEGER *asn1key = | - | ||||||||||||
| 545 | ((void *)0) | - | ||||||||||||
| 546 | ; | - | ||||||||||||
| 547 | - | |||||||||||||
| 548 | if (params ==
| 0 | ||||||||||||
| 549 | ((void *)0)
| 0 | ||||||||||||
| 550 | ) | - | ||||||||||||
| 551 | return never executed: 0;return 0;never executed: return 0; | 0 | ||||||||||||
| 552 | - | |||||||||||||
| 553 | asn1key = BN_to_ASN1_INTEGER(GOST_KEY_get0_private_key(pk->pkey.gost), | - | ||||||||||||
| 554 | - | |||||||||||||
| 555 | ((void *)0) | - | ||||||||||||
| 556 | ); | - | ||||||||||||
| 557 | if (asn1key ==
| 0 | ||||||||||||
| 558 | ((void *)0)
| 0 | ||||||||||||
| 559 | ) { | - | ||||||||||||
| 560 | ASN1_STRING_free(params); | - | ||||||||||||
| 561 | return never executed: 0;return 0;never executed: return 0; | 0 | ||||||||||||
| 562 | } | - | ||||||||||||
| 563 | priv_len = i2d_ASN1_INTEGER(asn1key, &priv_buf); | - | ||||||||||||
| 564 | ASN1_INTEGER_free(asn1key); | - | ||||||||||||
| 565 | return never executed: PKCS8_pkey_set0(p8, algobj, 0, 16, params, priv_buf,return PKCS8_pkey_set0(p8, algobj, 0, 16, params, priv_buf, priv_len);never executed: return PKCS8_pkey_set0(p8, algobj, 0, 16, params, priv_buf, priv_len); | 0 | ||||||||||||
| 566 | priv_len); never executed: return PKCS8_pkey_set0(p8, algobj, 0, 16, params, priv_buf, priv_len); | 0 | ||||||||||||
| 567 | } | - | ||||||||||||
| 568 | - | |||||||||||||
| 569 | static int | - | ||||||||||||
| 570 | param_encode_gost01(const EVP_PKEY *pkey, unsigned char **pder) | - | ||||||||||||
| 571 | { | - | ||||||||||||
| 572 | ASN1_STRING *params = encode_gost01_algor_params(pkey); | - | ||||||||||||
| 573 | int len; | - | ||||||||||||
| 574 | - | |||||||||||||
| 575 | if (params ==
| 0 | ||||||||||||
| 576 | ((void *)0)
| 0 | ||||||||||||
| 577 | ) | - | ||||||||||||
| 578 | return never executed: 0;return 0;never executed: return 0; | 0 | ||||||||||||
| 579 | len = params->length; | - | ||||||||||||
| 580 | if (pder !=
| 0 | ||||||||||||
| 581 | ((void *)0)
| 0 | ||||||||||||
| 582 | ) | - | ||||||||||||
| 583 | memcpy(*pder, params->data, params->length); never executed: memcpy(*pder, params->data, params->length); | 0 | ||||||||||||
| 584 | ASN1_STRING_free(params); | - | ||||||||||||
| 585 | return never executed: len;return len;never executed: return len; | 0 | ||||||||||||
| 586 | } | - | ||||||||||||
| 587 | - | |||||||||||||
| 588 | static int | - | ||||||||||||
| 589 | param_decode_gost01(EVP_PKEY *pkey, const unsigned char **pder, int derlen) | - | ||||||||||||
| 590 | { | - | ||||||||||||
| 591 | ASN1_OBJECT *obj = | - | ||||||||||||
| 592 | ((void *)0) | - | ||||||||||||
| 593 | ; | - | ||||||||||||
| 594 | int nid; | - | ||||||||||||
| 595 | GOST_KEY *ec; | - | ||||||||||||
| 596 | EC_GROUP *group; | - | ||||||||||||
| 597 | int ret; | - | ||||||||||||
| 598 | - | |||||||||||||
| 599 | - | |||||||||||||
| 600 | if ((
| 0 | ||||||||||||
| 601 | return never executed: decode_gost01_algor_params(pkey, pder, derlen);return decode_gost01_algor_params(pkey, pder, derlen);never executed: return decode_gost01_algor_params(pkey, pder, derlen); | 0 | ||||||||||||
| 602 | - | |||||||||||||
| 603 | - | |||||||||||||
| 604 | if (d2i_ASN1_OBJECT(&obj, pder, derlen) ==
| 0 | ||||||||||||
| 605 | ((void *)0)
| 0 | ||||||||||||
| 606 | ) { | - | ||||||||||||
| 607 | ERR_put_error(50,(0xfff),((1|64)),__FILE__,527); | - | ||||||||||||
| 608 | return never executed: 0;return 0;never executed: return 0; | 0 | ||||||||||||
| 609 | } | - | ||||||||||||
| 610 | nid = OBJ_obj2nid(obj); | - | ||||||||||||
| 611 | ASN1_OBJECT_free(obj); | - | ||||||||||||
| 612 | - | |||||||||||||
| 613 | ec = GOST_KEY_new(); | - | ||||||||||||
| 614 | if (ec ==
| 0 | ||||||||||||
| 615 | ((void *)0)
| 0 | ||||||||||||
| 616 | ) { | - | ||||||||||||
| 617 | ERR_put_error(50,(0xfff),((1|64)),__FILE__,535); | - | ||||||||||||
| 618 | return never executed: 0;return 0;never executed: return 0; | 0 | ||||||||||||
| 619 | } | - | ||||||||||||
| 620 | group = EC_GROUP_new_by_curve_name(nid); | - | ||||||||||||
| 621 | if (group ==
| 0 | ||||||||||||
| 622 | ((void *)0)
| 0 | ||||||||||||
| 623 | ) { | - | ||||||||||||
| 624 | ERR_put_error(50,(0xfff),(119),__FILE__,540); | - | ||||||||||||
| 625 | GOST_KEY_free(ec); | - | ||||||||||||
| 626 | return never executed: 0;return 0;never executed: return 0; | 0 | ||||||||||||
| 627 | } | - | ||||||||||||
| 628 | - | |||||||||||||
| 629 | EC_GROUP_set_asn1_flag(group, 0x001); | - | ||||||||||||
| 630 | if (GOST_KEY_set_group(ec, group) == 0
| 0 | ||||||||||||
| 631 | ERR_put_error(50,(0xfff),(16),__FILE__,547); | - | ||||||||||||
| 632 | EC_GROUP_free(group); | - | ||||||||||||
| 633 | GOST_KEY_free(ec); | - | ||||||||||||
| 634 | return never executed: 0;return 0;never executed: return 0; | 0 | ||||||||||||
| 635 | } | - | ||||||||||||
| 636 | EC_GROUP_free(group); | - | ||||||||||||
| 637 | if (GOST_KEY_set_digest(ec,
| 0 | ||||||||||||
| 638 | 822) == 0
| 0 | ||||||||||||
| 639 | ERR_put_error(50,(0xfff),(100),__FILE__,555); | - | ||||||||||||
| 640 | GOST_KEY_free(ec); | - | ||||||||||||
| 641 | return never executed: 0;return 0;never executed: return 0; | 0 | ||||||||||||
| 642 | } | - | ||||||||||||
| 643 | ret = EVP_PKEY_assign((pkey),811, (char *)(ec)); | - | ||||||||||||
| 644 | if (ret == 0
| 0 | ||||||||||||
| 645 | GOST_KEY_free(ec); never executed: GOST_KEY_free(ec); | 0 | ||||||||||||
| 646 | return never executed: ret;return ret;never executed: return ret; | 0 | ||||||||||||
| 647 | } | - | ||||||||||||
| 648 | - | |||||||||||||
| 649 | static int | - | ||||||||||||
| 650 | param_missing_gost01(const EVP_PKEY *pk) | - | ||||||||||||
| 651 | { | - | ||||||||||||
| 652 | const GOST_KEY *ec = pk->pkey.gost; | - | ||||||||||||
| 653 | - | |||||||||||||
| 654 | if (ec ==
| 0 | ||||||||||||
| 655 | ((void *)0)
| 0 | ||||||||||||
| 656 | ) | - | ||||||||||||
| 657 | return never executed: 1;return 1;never executed: return 1; | 0 | ||||||||||||
| 658 | if (GOST_KEY_get0_group(ec) ==
| 0 | ||||||||||||
| 659 | ((void *)0)
| 0 | ||||||||||||
| 660 | ) | - | ||||||||||||
| 661 | return never executed: 1;return 1;never executed: return 1; | 0 | ||||||||||||
| 662 | if (GOST_KEY_get_digest(ec) == 0
| 0 | ||||||||||||
| 663 | return never executed: 1;return 1;never executed: return 1; | 0 | ||||||||||||
| 664 | return never executed: 0;return 0;never executed: return 0; | 0 | ||||||||||||
| 665 | } | - | ||||||||||||
| 666 | - | |||||||||||||
| 667 | static int | - | ||||||||||||
| 668 | param_copy_gost01(EVP_PKEY *to, const EVP_PKEY *from) | - | ||||||||||||
| 669 | { | - | ||||||||||||
| 670 | GOST_KEY *eto = to->pkey.gost; | - | ||||||||||||
| 671 | const GOST_KEY *efrom = from->pkey.gost; | - | ||||||||||||
| 672 | int ret = 1; | - | ||||||||||||
| 673 | - | |||||||||||||
| 674 | if (EVP_PKEY_base_id(from) != EVP_PKEY_base_id(to)
| 0 | ||||||||||||
| 675 | ERR_put_error(50,(0xfff),(110),__FILE__,587); | - | ||||||||||||
| 676 | return never executed: 0;return 0;never executed: return 0; | 0 | ||||||||||||
| 677 | } | - | ||||||||||||
| 678 | if (efrom ==
| 0 | ||||||||||||
| 679 | ((void *)0)
| 0 | ||||||||||||
| 680 | ) { | - | ||||||||||||
| 681 | ERR_put_error(50,(0xfff),(113),__FILE__,591); | - | ||||||||||||
| 682 | return never executed: 0;return 0;never executed: return 0; | 0 | ||||||||||||
| 683 | } | - | ||||||||||||
| 684 | if (eto ==
| 0 | ||||||||||||
| 685 | ((void *)0)
| 0 | ||||||||||||
| 686 | ) { | - | ||||||||||||
| 687 | eto = GOST_KEY_new(); | - | ||||||||||||
| 688 | if (eto ==
| 0 | ||||||||||||
| 689 | ((void *)0)
| 0 | ||||||||||||
| 690 | ) { | - | ||||||||||||
| 691 | ERR_put_error(50,(0xfff),((1|64)),__FILE__,597); | - | ||||||||||||
| 692 | return never executed: 0;return 0;never executed: return 0; | 0 | ||||||||||||
| 693 | } | - | ||||||||||||
| 694 | if (EVP_PKEY_assign(to, EVP_PKEY_base_id(from), eto) == 0
| 0 | ||||||||||||
| 695 | GOST_KEY_free(eto); | - | ||||||||||||
| 696 | return never executed: 0;return 0;never executed: return 0; | 0 | ||||||||||||
| 697 | } | - | ||||||||||||
| 698 | } never executed: end of block | 0 | ||||||||||||
| 699 | GOST_KEY_set_group(eto, GOST_KEY_get0_group(efrom)); | - | ||||||||||||
| 700 | GOST_KEY_set_digest(eto, GOST_KEY_get_digest(efrom)); | - | ||||||||||||
| 701 | if (GOST_KEY_get0_private_key(eto) !=
| 0 | ||||||||||||
| 702 | ((void *)0)
| 0 | ||||||||||||
| 703 | ) | - | ||||||||||||
| 704 | ret = gost2001_compute_public(eto); never executed: ret = gost2001_compute_public(eto); | 0 | ||||||||||||
| 705 | - | |||||||||||||
| 706 | return never executed: ret;return ret;never executed: return ret; | 0 | ||||||||||||
| 707 | } | - | ||||||||||||
| 708 | - | |||||||||||||
| 709 | static int | - | ||||||||||||
| 710 | param_cmp_gost01(const EVP_PKEY *a, const EVP_PKEY *b) | - | ||||||||||||
| 711 | { | - | ||||||||||||
| 712 | if (EC_GROUP_get_curve_name(GOST_KEY_get0_group(a->pkey.gost)) !=
| 0 | ||||||||||||
| 713 | EC_GROUP_get_curve_name(GOST_KEY_get0_group(b->pkey.gost))
| 0 | ||||||||||||
| 714 | return never executed: 0;return 0;never executed: return 0; | 0 | ||||||||||||
| 715 | - | |||||||||||||
| 716 | if (GOST_KEY_get_digest(a->pkey.gost) !=
| 0 | ||||||||||||
| 717 | GOST_KEY_get_digest(b->pkey.gost)
| 0 | ||||||||||||
| 718 | return never executed: 0;return 0;never executed: return 0; | 0 | ||||||||||||
| 719 | - | |||||||||||||
| 720 | return never executed: 1;return 1;never executed: return 1; | 0 | ||||||||||||
| 721 | } | - | ||||||||||||
| 722 | - | |||||||||||||
| 723 | static int | - | ||||||||||||
| 724 | pkey_ctrl_gost01(EVP_PKEY *pkey, int op, long arg1, void *arg2) | - | ||||||||||||
| 725 | { | - | ||||||||||||
| 726 | X509_ALGOR *alg1 = | - | ||||||||||||
| 727 | ((void *)0) | - | ||||||||||||
| 728 | , *alg2 = | - | ||||||||||||
| 729 | ((void *)0) | - | ||||||||||||
| 730 | , *alg3 = | - | ||||||||||||
| 731 | ((void *)0) | - | ||||||||||||
| 732 | ; | - | ||||||||||||
| 733 | int digest = GOST_KEY_get_digest(pkey->pkey.gost); | - | ||||||||||||
| 734 | - | |||||||||||||
| 735 | switch (op) { | - | ||||||||||||
| 736 | case never executed: 0x1:case 0x1:never executed: case 0x1: | 0 | ||||||||||||
| 737 | if (arg1 == 0
| 0 | ||||||||||||
| 738 | PKCS7_SIGNER_INFO_get0_algs(arg2, never executed: PKCS7_SIGNER_INFO_get0_algs(arg2, ((void *)0) , &alg1, &alg2); | 0 | ||||||||||||
| 739 | ((void *)0) never executed: PKCS7_SIGNER_INFO_get0_algs(arg2, ((void *)0) , &alg1, &alg2); | 0 | ||||||||||||
| 740 | , &alg1, &alg2); never executed: PKCS7_SIGNER_INFO_get0_algs(arg2, ((void *)0) , &alg1, &alg2); | 0 | ||||||||||||
| 741 | break; never executed: break; | 0 | ||||||||||||
| 742 | - | |||||||||||||
| 743 | case never executed: 0x2:case 0x2:never executed: case 0x2: | 0 | ||||||||||||
| 744 | if (arg1 == 0
| 0 | ||||||||||||
| 745 | PKCS7_RECIP_INFO_get0_alg(arg2, &alg3); never executed: PKCS7_RECIP_INFO_get0_alg(arg2, &alg3); | 0 | ||||||||||||
| 746 | break; never executed: break; | 0 | ||||||||||||
| 747 | case never executed: 0x3:case 0x3:never executed: case 0x3: | 0 | ||||||||||||
| 748 | *(int *)arg2 = GostR3410_get_md_digest(digest); | - | ||||||||||||
| 749 | return never executed: 2;return 2;never executed: return 2; | 0 | ||||||||||||
| 750 | - | |||||||||||||
| 751 | default never executed: :default:never executed: default: | 0 | ||||||||||||
| 752 | return never executed: -2;return -2;never executed: return -2; | 0 | ||||||||||||
| 753 | } | - | ||||||||||||
| 754 | - | |||||||||||||
| 755 | if (alg1
| 0 | ||||||||||||
| 756 | X509_ALGOR_set0(alg1, OBJ_nid2obj(GostR3410_get_md_digest(digest)), 5, 0); never executed: X509_ALGOR_set0(alg1, OBJ_nid2obj(GostR3410_get_md_digest(digest)), 5, 0); | 0 | ||||||||||||
| 757 | if (alg2
| 0 | ||||||||||||
| 758 | X509_ALGOR_set0(alg2, OBJ_nid2obj(GostR3410_get_pk_digest(digest)), 5, 0); never executed: X509_ALGOR_set0(alg2, OBJ_nid2obj(GostR3410_get_pk_digest(digest)), 5, 0); | 0 | ||||||||||||
| 759 | if (alg3
| 0 | ||||||||||||
| 760 | ASN1_STRING *params = encode_gost01_algor_params(pkey); | - | ||||||||||||
| 761 | if (params ==
| 0 | ||||||||||||
| 762 | ((void *)0)
| 0 | ||||||||||||
| 763 | ) { | - | ||||||||||||
| 764 | return never executed: -1;return -1;never executed: return -1; | 0 | ||||||||||||
| 765 | } | - | ||||||||||||
| 766 | X509_ALGOR_set0(alg3, | - | ||||||||||||
| 767 | OBJ_nid2obj(GostR3410_get_pk_digest(digest)), | - | ||||||||||||
| 768 | 16, params); | - | ||||||||||||
| 769 | } never executed: end of block | 0 | ||||||||||||
| 770 | - | |||||||||||||
| 771 | return never executed: 1;return 1;never executed: return 1; | 0 | ||||||||||||
| 772 | } | - | ||||||||||||
| 773 | - | |||||||||||||
| 774 | const EVP_PKEY_ASN1_METHOD gostr01_asn1_meths[] = { | - | ||||||||||||
| 775 | { | - | ||||||||||||
| 776 | .pkey_id = 811, | - | ||||||||||||
| 777 | .pkey_base_id = 811, | - | ||||||||||||
| 778 | .pkey_flags = 0x4, | - | ||||||||||||
| 779 | - | |||||||||||||
| 780 | .pem_str = "GOST2001", | - | ||||||||||||
| 781 | .info = "GOST R 34.10-2001", | - | ||||||||||||
| 782 | - | |||||||||||||
| 783 | .pkey_free = pkey_free_gost01, | - | ||||||||||||
| 784 | .pkey_ctrl = pkey_ctrl_gost01, | - | ||||||||||||
| 785 | - | |||||||||||||
| 786 | .priv_decode = priv_decode_gost01, | - | ||||||||||||
| 787 | .priv_encode = priv_encode_gost01, | - | ||||||||||||
| 788 | .priv_print = priv_print_gost01, | - | ||||||||||||
| 789 | - | |||||||||||||
| 790 | .param_decode = param_decode_gost01, | - | ||||||||||||
| 791 | .param_encode = param_encode_gost01, | - | ||||||||||||
| 792 | .param_missing = param_missing_gost01, | - | ||||||||||||
| 793 | .param_copy = param_copy_gost01, | - | ||||||||||||
| 794 | .param_cmp = param_cmp_gost01, | - | ||||||||||||
| 795 | .param_print = param_print_gost01, | - | ||||||||||||
| 796 | - | |||||||||||||
| 797 | .pub_decode = pub_decode_gost01, | - | ||||||||||||
| 798 | .pub_encode = pub_encode_gost01, | - | ||||||||||||
| 799 | .pub_cmp = pub_cmp_gost01, | - | ||||||||||||
| 800 | .pub_print = pub_print_gost01, | - | ||||||||||||
| 801 | .pkey_size = pkey_size_gost01, | - | ||||||||||||
| 802 | .pkey_bits = pkey_bits_gost01, | - | ||||||||||||
| 803 | }, | - | ||||||||||||
| 804 | { | - | ||||||||||||
| 805 | .pkey_id = 946, | - | ||||||||||||
| 806 | .pkey_base_id = 811, | - | ||||||||||||
| 807 | .pkey_flags = 0x1 | - | ||||||||||||
| 808 | }, | - | ||||||||||||
| 809 | { | - | ||||||||||||
| 810 | .pkey_id = 947, | - | ||||||||||||
| 811 | .pkey_base_id = 811, | - | ||||||||||||
| 812 | .pkey_flags = 0x1 | - | ||||||||||||
| 813 | }, | - | ||||||||||||
| 814 | }; | - | ||||||||||||
| Switch to Source code | Preprocessed file |