p_lib.c 22.0 KB
Newer Older
R
Rich Salz 已提交
1
/*
M
Matt Caswell 已提交
2
 * Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved.
3
 *
4
 * Licensed under the Apache License 2.0 (the "License").  You may not use
R
Rich Salz 已提交
5 6 7
 * this file except in compliance with the License.  You can obtain a copy
 * in the file LICENSE in the source distribution or at
 * https://www.openssl.org/source/license.html
8 9 10
 */

#include <stdio.h>
11
#include "internal/cryptlib.h"
12
#include "internal/refcount.h"
B
Bodo Möller 已提交
13 14
#include <openssl/bn.h>
#include <openssl/err.h>
15 16 17
#include <openssl/objects.h>
#include <openssl/evp.h>
#include <openssl/x509.h>
R
Rich Salz 已提交
18 19 20
#include <openssl/rsa.h>
#include <openssl/dsa.h>
#include <openssl/dh.h>
21
#include <openssl/cmac.h>
R
Rich Salz 已提交
22
#include <openssl/engine.h>
23
#include <openssl/params.h>
24
#include <openssl/serializer.h>
25
#include <openssl/core_names.h>
26

27 28
#include "crypto/asn1.h"
#include "crypto/evp.h"
29
#include "internal/provider.h"
30
#include "evp_local.h"
31

32 33 34
static void evp_pkey_free_it(EVP_PKEY *key);

#ifndef FIPS_MODE
35

36
int EVP_PKEY_bits(const EVP_PKEY *pkey)
37
{
38 39 40 41 42 43
    if (pkey != NULL) {
        if (pkey->ameth == NULL)
            return pkey->cache.bits;
        else if (pkey->ameth->pkey_bits)
            return pkey->ameth->pkey_bits(pkey);
    }
44 45
    return 0;
}
46

47
int EVP_PKEY_security_bits(const EVP_PKEY *pkey)
48 49 50
{
    if (pkey == NULL)
        return 0;
51 52 53
    if (pkey->ameth == NULL)
        return pkey->cache.security_bits;
    if (pkey->ameth->pkey_security_bits == NULL)
54 55 56
        return -2;
    return pkey->ameth->pkey_security_bits(pkey);
}
57

U
Ulf Möller 已提交
58
int EVP_PKEY_save_parameters(EVP_PKEY *pkey, int mode)
59
{
60
# ifndef OPENSSL_NO_DSA
61 62 63 64 65
    if (pkey->type == EVP_PKEY_DSA) {
        int ret = pkey->save_parameters;

        if (mode >= 0)
            pkey->save_parameters = mode;
K
KaoruToda 已提交
66
        return ret;
67
    }
68 69
# endif
# ifndef OPENSSL_NO_EC
70 71 72 73 74
    if (pkey->type == EVP_PKEY_EC) {
        int ret = pkey->save_parameters;

        if (mode >= 0)
            pkey->save_parameters = mode;
K
KaoruToda 已提交
75
        return ret;
76
    }
77
# endif
K
KaoruToda 已提交
78
    return 0;
79
}
80

R
Richard Levitte 已提交
81
int EVP_PKEY_copy_parameters(EVP_PKEY *to, const EVP_PKEY *from)
82
{
83 84 85 86
    if (to->type == EVP_PKEY_NONE) {
        if (EVP_PKEY_set_type(to, from->type) == 0)
            return 0;
    } else if (to->type != from->type) {
87 88 89 90 91 92 93 94
        EVPerr(EVP_F_EVP_PKEY_COPY_PARAMETERS, EVP_R_DIFFERENT_KEY_TYPES);
        goto err;
    }

    if (EVP_PKEY_missing_parameters(from)) {
        EVPerr(EVP_F_EVP_PKEY_COPY_PARAMETERS, EVP_R_MISSING_PARAMETERS);
        goto err;
    }
95 96 97 98 99 100 101 102

    if (!EVP_PKEY_missing_parameters(to)) {
        if (EVP_PKEY_cmp_parameters(to, from) == 1)
            return 1;
        EVPerr(EVP_F_EVP_PKEY_COPY_PARAMETERS, EVP_R_DIFFERENT_PARAMETERS);
        return 0;
    }

103 104 105 106 107
    if (from->ameth && from->ameth->param_copy)
        return from->ameth->param_copy(to, from);
 err:
    return 0;
}
108

R
Richard Levitte 已提交
109
int EVP_PKEY_missing_parameters(const EVP_PKEY *pkey)
110
{
111
    if (pkey != NULL && pkey->ameth && pkey->ameth->param_missing)
112 113 114
        return pkey->ameth->param_missing(pkey);
    return 0;
}
115

R
Richard Levitte 已提交
116
int EVP_PKEY_cmp_parameters(const EVP_PKEY *a, const EVP_PKEY *b)
117 118 119 120 121 122 123
{
    if (a->type != b->type)
        return -1;
    if (a->ameth && a->ameth->param_cmp)
        return a->ameth->param_cmp(a, b);
    return -2;
}
124

R
Richard Levitte 已提交
125
int EVP_PKEY_cmp(const EVP_PKEY *a, const EVP_PKEY *b)
126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
{
    if (a->type != b->type)
        return -1;

    if (a->ameth) {
        int ret;
        /* Compare parameters if the algorithm has them */
        if (a->ameth->param_cmp) {
            ret = a->ameth->param_cmp(a, b);
            if (ret <= 0)
                return ret;
        }

        if (a->ameth->pub_cmp)
            return a->ameth->pub_cmp(a, b);
    }

    return -2;
}
145

146

147 148 149
/*
 * Setup a public key ASN1 method and ENGINE from a NID or a string. If pkey
 * is NULL just return 1 or 0 if the algorithm exists.
150 151
 */

152 153
static int pkey_set_type(EVP_PKEY *pkey, ENGINE *e, int type, const char *str,
                         int len)
154 155
{
    const EVP_PKEY_ASN1_METHOD *ameth;
156 157
    ENGINE **eptr = (e == NULL) ? &e :  NULL;

158 159
    if (pkey) {
        if (pkey->pkey.ptr)
160
            evp_pkey_free_it(pkey);
161 162 163 164 165 166
        /*
         * If key type matches and a method exists then this lookup has
         * succeeded once so just indicate success.
         */
        if ((type == pkey->save_type) && pkey->ameth)
            return 1;
167
# ifndef OPENSSL_NO_ENGINE
168
        /* If we have ENGINEs release them */
R
Rich Salz 已提交
169 170
        ENGINE_finish(pkey->engine);
        pkey->engine = NULL;
171 172
        ENGINE_finish(pkey->pmeth_engine);
        pkey->pmeth_engine = NULL;
173
# endif
174 175
    }
    if (str)
176
        ameth = EVP_PKEY_asn1_find_str(eptr, str, len);
177
    else
178
        ameth = EVP_PKEY_asn1_find(eptr, type);
179
# ifndef OPENSSL_NO_ENGINE
180
    if (pkey == NULL && eptr != NULL)
181
        ENGINE_finish(e);
182
# endif
R
Rich Salz 已提交
183
    if (ameth == NULL) {
184 185 186 187 188 189 190 191 192 193 194 195
        EVPerr(EVP_F_PKEY_SET_TYPE, EVP_R_UNSUPPORTED_ALGORITHM);
        return 0;
    }
    if (pkey) {
        pkey->ameth = ameth;
        pkey->engine = e;

        pkey->type = pkey->ameth->pkey_id;
        pkey->save_type = type;
    }
    return 1;
}
196

197 198 199
EVP_PKEY *EVP_PKEY_new_raw_private_key(int type, ENGINE *e,
                                       const unsigned char *priv,
                                       size_t len)
200 201 202 203 204 205 206 207 208 209
{
    EVP_PKEY *ret = EVP_PKEY_new();

    if (ret == NULL
            || !pkey_set_type(ret, e, type, NULL, -1)) {
        /* EVPerr already called */
        goto err;
    }

    if (ret->ameth->set_priv_key == NULL) {
210
        EVPerr(EVP_F_EVP_PKEY_NEW_RAW_PRIVATE_KEY,
211 212 213 214 215
               EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
        goto err;
    }

    if (!ret->ameth->set_priv_key(ret, priv, len)) {
216
        EVPerr(EVP_F_EVP_PKEY_NEW_RAW_PRIVATE_KEY, EVP_R_KEY_SETUP_FAILED);
217 218 219 220 221 222 223 224 225 226
        goto err;
    }

    return ret;

 err:
    EVP_PKEY_free(ret);
    return NULL;
}

227 228 229
EVP_PKEY *EVP_PKEY_new_raw_public_key(int type, ENGINE *e,
                                      const unsigned char *pub,
                                      size_t len)
230 231 232 233 234 235 236 237 238 239
{
    EVP_PKEY *ret = EVP_PKEY_new();

    if (ret == NULL
            || !pkey_set_type(ret, e, type, NULL, -1)) {
        /* EVPerr already called */
        goto err;
    }

    if (ret->ameth->set_pub_key == NULL) {
240
        EVPerr(EVP_F_EVP_PKEY_NEW_RAW_PUBLIC_KEY,
241 242 243 244 245
               EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
        goto err;
    }

    if (!ret->ameth->set_pub_key(ret, pub, len)) {
246
        EVPerr(EVP_F_EVP_PKEY_NEW_RAW_PUBLIC_KEY, EVP_R_KEY_SETUP_FAILED);
247 248 249 250 251 252 253 254 255 256
        goto err;
    }

    return ret;

 err:
    EVP_PKEY_free(ret);
    return NULL;
}

257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290
int EVP_PKEY_get_raw_private_key(const EVP_PKEY *pkey, unsigned char *priv,
                                 size_t *len)
{
     if (pkey->ameth->get_priv_key == NULL) {
        EVPerr(EVP_F_EVP_PKEY_GET_RAW_PRIVATE_KEY,
               EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
        return 0;
    }

    if (!pkey->ameth->get_priv_key(pkey, priv, len)) {
        EVPerr(EVP_F_EVP_PKEY_GET_RAW_PRIVATE_KEY, EVP_R_GET_RAW_KEY_FAILED);
        return 0;
    }

    return 1;
}

int EVP_PKEY_get_raw_public_key(const EVP_PKEY *pkey, unsigned char *pub,
                                size_t *len)
{
     if (pkey->ameth->get_pub_key == NULL) {
        EVPerr(EVP_F_EVP_PKEY_GET_RAW_PUBLIC_KEY,
               EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
        return 0;
    }

    if (!pkey->ameth->get_pub_key(pkey, pub, len)) {
        EVPerr(EVP_F_EVP_PKEY_GET_RAW_PUBLIC_KEY, EVP_R_GET_RAW_KEY_FAILED);
        return 0;
    }

    return 1;
}

291 292 293
EVP_PKEY *EVP_PKEY_new_CMAC_key(ENGINE *e, const unsigned char *priv,
                                size_t len, const EVP_CIPHER *cipher)
{
294 295
# ifndef OPENSSL_NO_CMAC
#  ifndef OPENSSL_NO_ENGINE
296
    const char *engine_id = e != NULL ? ENGINE_get_id(e) : NULL;
297
#  endif
298 299 300 301
    const char *cipher_name = EVP_CIPHER_name(cipher);
    const OSSL_PROVIDER *prov = EVP_CIPHER_provider(cipher);
    OPENSSL_CTX *libctx =
        prov == NULL ? NULL : ossl_provider_library_context(prov);
302
    EVP_PKEY *ret = EVP_PKEY_new();
303
    EVP_MAC *cmac = EVP_MAC_fetch(libctx, OSSL_MAC_NAME_CMAC, NULL);
304 305 306
    EVP_MAC_CTX *cmctx = cmac != NULL ? EVP_MAC_CTX_new(cmac) : NULL;
    OSSL_PARAM params[4];
    size_t paramsn = 0;
307 308 309 310 311 312 313 314

    if (ret == NULL
            || cmctx == NULL
            || !pkey_set_type(ret, e, EVP_PKEY_CMAC, NULL, -1)) {
        /* EVPerr already called */
        goto err;
    }

315
#  ifndef OPENSSL_NO_ENGINE
316
    if (engine_id != NULL)
317
        params[paramsn++] =
318
            OSSL_PARAM_construct_utf8_string("engine", (char *)engine_id, 0);
319
#  endif
M
Matt Caswell 已提交
320

321
    params[paramsn++] =
322
        OSSL_PARAM_construct_utf8_string(OSSL_MAC_PARAM_CIPHER,
323
                                         (char *)cipher_name, 0);
324 325 326 327 328 329
    params[paramsn++] =
        OSSL_PARAM_construct_octet_string(OSSL_MAC_PARAM_KEY,
                                          (char *)priv, len);
    params[paramsn] = OSSL_PARAM_construct_end();

    if (!EVP_MAC_CTX_set_params(cmctx, params)) {
330 331 332 333 334 335 336 337 338
        EVPerr(EVP_F_EVP_PKEY_NEW_CMAC_KEY, EVP_R_KEY_SETUP_FAILED);
        goto err;
    }

    ret->pkey.ptr = cmctx;
    return ret;

 err:
    EVP_PKEY_free(ret);
339
    EVP_MAC_CTX_free(cmctx);
340
    EVP_MAC_free(cmac);
341
    return NULL;
342
# else
M
Matt Caswell 已提交
343 344 345
    EVPerr(EVP_F_EVP_PKEY_NEW_CMAC_KEY,
           EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
    return NULL;
346
# endif
347
}
348

349
int EVP_PKEY_set_type(EVP_PKEY *pkey, int type)
350
{
351
    return pkey_set_type(pkey, NULL, type, NULL, -1);
352
}
353 354

int EVP_PKEY_set_type_str(EVP_PKEY *pkey, const char *str, int len)
355
{
356
    return pkey_set_type(pkey, NULL, EVP_PKEY_NONE, str, len);
357
}
J
Jack Lloyd 已提交
358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377

int EVP_PKEY_set_alias_type(EVP_PKEY *pkey, int type)
{
    if (pkey->type == type) {
        return 1; /* it already is that type */
    }

    /*
     * The application is requesting to alias this to a different pkey type,
     * but not one that resolves to the base type.
     */
    if (EVP_PKEY_type(type) != EVP_PKEY_base_id(pkey)) {
        EVPerr(EVP_F_EVP_PKEY_SET_ALIAS_TYPE, EVP_R_UNSUPPORTED_ALGORITHM);
        return 0;
    }

    pkey->type = type;
    return 1;
}

378
# ifndef OPENSSL_NO_ENGINE
379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395
int EVP_PKEY_set1_engine(EVP_PKEY *pkey, ENGINE *e)
{
    if (e != NULL) {
        if (!ENGINE_init(e)) {
            EVPerr(EVP_F_EVP_PKEY_SET1_ENGINE, ERR_R_ENGINE_LIB);
            return 0;
        }
        if (ENGINE_get_pkey_meth(e, pkey->type) == NULL) {
            ENGINE_finish(e);
            EVPerr(EVP_F_EVP_PKEY_SET1_ENGINE, EVP_R_UNSUPPORTED_ALGORITHM);
            return 0;
        }
    }
    ENGINE_finish(pkey->pmeth_engine);
    pkey->pmeth_engine = e;
    return 1;
}
396 397 398 399 400

ENGINE *EVP_PKEY_get0_engine(const EVP_PKEY *pkey)
{
    return pkey->engine;
}
401
# endif
402
int EVP_PKEY_assign(EVP_PKEY *pkey, int type, void *key)
403
{
E
Emilia Kasper 已提交
404
    if (pkey == NULL || !EVP_PKEY_set_type(pkey, type))
405 406 407 408
        return 0;
    pkey->pkey.ptr = key;
    return (key != NULL);
}
409

D
Dr. Stephen Henson 已提交
410
void *EVP_PKEY_get0(const EVP_PKEY *pkey)
411 412 413
{
    return pkey->pkey.ptr;
}
414

415 416 417 418 419 420 421 422 423 424 425 426
const unsigned char *EVP_PKEY_get0_hmac(const EVP_PKEY *pkey, size_t *len)
{
    ASN1_OCTET_STRING *os = NULL;
    if (pkey->type != EVP_PKEY_HMAC) {
        EVPerr(EVP_F_EVP_PKEY_GET0_HMAC, EVP_R_EXPECTING_AN_HMAC_KEY);
        return NULL;
    }
    os = EVP_PKEY_get0(pkey);
    *len = os->length;
    return os->data;
}

427
# ifndef OPENSSL_NO_POLY1305
428 429 430 431 432 433 434 435 436 437 438
const unsigned char *EVP_PKEY_get0_poly1305(const EVP_PKEY *pkey, size_t *len)
{
    ASN1_OCTET_STRING *os = NULL;
    if (pkey->type != EVP_PKEY_POLY1305) {
        EVPerr(EVP_F_EVP_PKEY_GET0_POLY1305, EVP_R_EXPECTING_A_POLY1305_KEY);
        return NULL;
    }
    os = EVP_PKEY_get0(pkey);
    *len = os->length;
    return os->data;
}
439
# endif
440

441
# ifndef OPENSSL_NO_SIPHASH
442 443 444 445 446 447 448 449 450 451 452 453
const unsigned char *EVP_PKEY_get0_siphash(const EVP_PKEY *pkey, size_t *len)
{
    ASN1_OCTET_STRING *os = NULL;

    if (pkey->type != EVP_PKEY_SIPHASH) {
        EVPerr(EVP_F_EVP_PKEY_GET0_SIPHASH, EVP_R_EXPECTING_A_SIPHASH_KEY);
        return NULL;
    }
    os = EVP_PKEY_get0(pkey);
    *len = os->length;
    return os->data;
}
454
# endif
455

456
# ifndef OPENSSL_NO_RSA
457
int EVP_PKEY_set1_RSA(EVP_PKEY *pkey, RSA *key)
458
{
459 460 461 462
    int ret = EVP_PKEY_assign_RSA(pkey, key);
    if (ret)
        RSA_up_ref(key);
    return ret;
463 464
}

465
RSA *EVP_PKEY_get0_RSA(const EVP_PKEY *pkey)
466
{
467
    if (pkey->type != EVP_PKEY_RSA && pkey->type != EVP_PKEY_RSA_PSS) {
468
        EVPerr(EVP_F_EVP_PKEY_GET0_RSA, EVP_R_EXPECTING_AN_RSA_KEY);
469 470 471
        return NULL;
    }
    return pkey->pkey.rsa;
472
}
473 474 475 476 477 478 479 480

RSA *EVP_PKEY_get1_RSA(EVP_PKEY *pkey)
{
    RSA *ret = EVP_PKEY_get0_RSA(pkey);
    if (ret != NULL)
        RSA_up_ref(ret);
    return ret;
}
481
# endif
482

483
# ifndef OPENSSL_NO_DSA
484
int EVP_PKEY_set1_DSA(EVP_PKEY *pkey, DSA *key)
485
{
486 487 488 489
    int ret = EVP_PKEY_assign_DSA(pkey, key);
    if (ret)
        DSA_up_ref(key);
    return ret;
490 491
}

492
DSA *EVP_PKEY_get0_DSA(const EVP_PKEY *pkey)
493 494
{
    if (pkey->type != EVP_PKEY_DSA) {
495
        EVPerr(EVP_F_EVP_PKEY_GET0_DSA, EVP_R_EXPECTING_A_DSA_KEY);
496 497 498
        return NULL;
    }
    return pkey->pkey.dsa;
499
}
500 501 502 503 504 505 506 507

DSA *EVP_PKEY_get1_DSA(EVP_PKEY *pkey)
{
    DSA *ret = EVP_PKEY_get0_DSA(pkey);
    if (ret != NULL)
        DSA_up_ref(ret);
    return ret;
}
508
# endif
509

510
# ifndef OPENSSL_NO_EC
B
Bodo Möller 已提交
511

512
int EVP_PKEY_set1_EC_KEY(EVP_PKEY *pkey, EC_KEY *key)
B
Bodo Möller 已提交
513
{
514 515 516 517
    int ret = EVP_PKEY_assign_EC_KEY(pkey, key);
    if (ret)
        EC_KEY_up_ref(key);
    return ret;
B
Bodo Möller 已提交
518 519
}

520
EC_KEY *EVP_PKEY_get0_EC_KEY(const EVP_PKEY *pkey)
B
Bodo Möller 已提交
521
{
522
    if (pkey->type != EVP_PKEY_EC) {
523
        EVPerr(EVP_F_EVP_PKEY_GET0_EC_KEY, EVP_R_EXPECTING_A_EC_KEY);
524 525 526
        return NULL;
    }
    return pkey->pkey.ec;
B
Bodo Möller 已提交
527
}
528 529 530 531 532 533 534 535

EC_KEY *EVP_PKEY_get1_EC_KEY(EVP_PKEY *pkey)
{
    EC_KEY *ret = EVP_PKEY_get0_EC_KEY(pkey);
    if (ret != NULL)
        EC_KEY_up_ref(ret);
    return ret;
}
536
# endif
B
Bodo Möller 已提交
537

538
# ifndef OPENSSL_NO_DH
539

540
int EVP_PKEY_set1_DH(EVP_PKEY *pkey, DH *key)
541
{
542 543 544
    int type = DH_get0_q(key) == NULL ? EVP_PKEY_DH : EVP_PKEY_DHX;
    int ret = EVP_PKEY_assign(pkey, type, key);

545 546 547
    if (ret)
        DH_up_ref(key);
    return ret;
548 549
}

550
DH *EVP_PKEY_get0_DH(const EVP_PKEY *pkey)
551 552
{
    if (pkey->type != EVP_PKEY_DH && pkey->type != EVP_PKEY_DHX) {
553
        EVPerr(EVP_F_EVP_PKEY_GET0_DH, EVP_R_EXPECTING_A_DH_KEY);
554 555 556
        return NULL;
    }
    return pkey->pkey.dh;
557
}
558 559 560 561 562 563 564 565

DH *EVP_PKEY_get1_DH(EVP_PKEY *pkey)
{
    DH *ret = EVP_PKEY_get0_DH(pkey);
    if (ret != NULL)
        DH_up_ref(ret);
    return ret;
}
566
# endif
567

U
Ulf Möller 已提交
568
int EVP_PKEY_type(int type)
569 570 571 572 573 574 575 576 577
{
    int ret;
    const EVP_PKEY_ASN1_METHOD *ameth;
    ENGINE *e;
    ameth = EVP_PKEY_asn1_find(&e, type);
    if (ameth)
        ret = ameth->pkey_id;
    else
        ret = NID_undef;
578
# ifndef OPENSSL_NO_ENGINE
R
Rich Salz 已提交
579
    ENGINE_finish(e);
580
# endif
581 582
    return ret;
}
583

584
int EVP_PKEY_id(const EVP_PKEY *pkey)
585 586 587
{
    return pkey->type;
}
588 589

int EVP_PKEY_base_id(const EVP_PKEY *pkey)
590 591 592
{
    return EVP_PKEY_type(pkey->type);
}
593

594

595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628
static int print_reset_indent(BIO **out, int pop_f_prefix, long saved_indent)
{
    BIO_set_indent(*out, saved_indent);
    if (pop_f_prefix) {
        BIO *next = BIO_pop(*out);

        BIO_free(*out);
        *out = next;
    }
    return 1;
}

static int print_set_indent(BIO **out, int *pop_f_prefix, long *saved_indent,
                            long indent)
{
    *pop_f_prefix = 0;
    *saved_indent = 0;
    if (indent > 0) {
        long i = BIO_get_indent(*out);

        *saved_indent =  (i < 0 ? 0 : i);
        if (BIO_set_indent(*out, indent) <= 0) {
            if ((*out = BIO_push(BIO_new(BIO_f_prefix()), *out)) == NULL)
                return 0;
            *pop_f_prefix = 1;
        }
        if (BIO_set_indent(*out, indent) <= 0) {
            print_reset_indent(out, *pop_f_prefix, *saved_indent);
            return 0;
        }
    }
    return 1;
}

629
static int unsup_alg(BIO *out, const EVP_PKEY *pkey, int indent,
630 631
                     const char *kstr)
{
P
Pauli 已提交
632 633 634
    return BIO_indent(out, indent, 128)
        && BIO_printf(out, "%s algorithm \"%s\" unsupported\n",
                      kstr, OBJ_nid2ln(pkey->type)) > 0;
635
}
636

637 638 639 640 641
static int print_pkey(const EVP_PKEY *pkey, BIO *out, int indent,
                      const char *propquery /* For provided serialization */,
                      int (*legacy_print)(BIO *out, const EVP_PKEY *pkey,
                                          int indent, ASN1_PCTX *pctx),
                      ASN1_PCTX *legacy_pctx /* For legacy print */)
642
{
643 644 645 646 647 648 649
    int pop_f_prefix;
    long saved_indent;
    OSSL_SERIALIZER_CTX *ctx = NULL;
    int ret = -2;                /* default to unsupported */

    if (!print_set_indent(&out, &pop_f_prefix, &saved_indent, indent))
        return 0;
650

651
    ctx = OSSL_SERIALIZER_CTX_new_by_EVP_PKEY(pkey, propquery);
652 653 654 655 656
    if (OSSL_SERIALIZER_CTX_get_serializer(ctx) != NULL)
        ret = OSSL_SERIALIZER_to_bio(ctx, out);
    OSSL_SERIALIZER_CTX_free(ctx);

    if (ret != -2)
657
        goto end;
658 659

    /* legacy fallback */
660 661 662 663
    if (legacy_print != NULL)
        ret = legacy_print(out, pkey, 0, legacy_pctx);
    else
        ret = unsup_alg(out, pkey, 0, "Public Key");
664

665 666 667 668 669 670 671 672 673 674 675
 end:
    print_reset_indent(&out, pop_f_prefix, saved_indent);
    return ret;
}

int EVP_PKEY_print_public(BIO *out, const EVP_PKEY *pkey,
                          int indent, ASN1_PCTX *pctx)
{
    return print_pkey(pkey, out, indent, OSSL_SERIALIZER_PUBKEY_TO_TEXT_PQ,
                      (pkey->ameth != NULL ? pkey->ameth->pub_print : NULL),
                      pctx);
676
}
677 678

int EVP_PKEY_print_private(BIO *out, const EVP_PKEY *pkey,
679 680
                           int indent, ASN1_PCTX *pctx)
{
681 682 683
    return print_pkey(pkey, out, indent, OSSL_SERIALIZER_PrivateKey_TO_TEXT_PQ,
                      (pkey->ameth != NULL ? pkey->ameth->priv_print : NULL),
                      pctx);
684
}
685 686

int EVP_PKEY_print_params(BIO *out, const EVP_PKEY *pkey,
687 688
                          int indent, ASN1_PCTX *pctx)
{
689 690 691
    return print_pkey(pkey, out, indent, OSSL_SERIALIZER_Parameters_TO_TEXT_PQ,
                      (pkey->ameth != NULL ? pkey->ameth->param_print : NULL),
                      pctx);
692
}
693

D
Dr. Stephen Henson 已提交
694
static int evp_pkey_asn1_ctrl(EVP_PKEY *pkey, int op, int arg1, void *arg2)
695
{
D
Dr. Stephen Henson 已提交
696
    if (pkey->ameth == NULL || pkey->ameth->pkey_ctrl == NULL)
697
        return -2;
D
Dr. Stephen Henson 已提交
698 699 700 701 702 703 704 705
    return pkey->ameth->pkey_ctrl(pkey, op, arg1, arg2);
}

int EVP_PKEY_get_default_digest_nid(EVP_PKEY *pkey, int *pnid)
{
    return evp_pkey_asn1_ctrl(pkey, ASN1_PKEY_CTRL_DEFAULT_MD_NID, 0, pnid);
}

706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725
int EVP_PKEY_supports_digest_nid(EVP_PKEY *pkey, int nid)
{
    int rv, default_nid;

    rv = evp_pkey_asn1_ctrl(pkey, ASN1_PKEY_CTRL_SUPPORTS_MD_NID, nid, NULL);
    if (rv == -2) {
        /*
         * If there is a mandatory default digest and this isn't it, then
         * the answer is 'no'.
         */
        rv = EVP_PKEY_get_default_digest_nid(pkey, &default_nid);
        if (rv == 2)
            return (nid == default_nid);
        /* zero is an error from EVP_PKEY_get_default_digest_nid() */
        if (rv == 0)
            return -1;
    }
    return rv;
}

D
Dr. Stephen Henson 已提交
726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743
int EVP_PKEY_set1_tls_encodedpoint(EVP_PKEY *pkey,
                               const unsigned char *pt, size_t ptlen)
{
    if (ptlen > INT_MAX)
        return 0;
    if (evp_pkey_asn1_ctrl(pkey, ASN1_PKEY_CTRL_SET1_TLS_ENCPT, ptlen,
                           (void *)pt) <= 0)
        return 0;
    return 1;
}

size_t EVP_PKEY_get1_tls_encodedpoint(EVP_PKEY *pkey, unsigned char **ppt)
{
    int rv;
    rv = evp_pkey_asn1_ctrl(pkey, ASN1_PKEY_CTRL_GET1_TLS_ENCPT, 0, ppt);
    if (rv <= 0)
        return 0;
    return rv;
744
}
745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822

#endif /* FIPS_MODE */

/*- All methods below can also be used in FIPS_MODE */

EVP_PKEY *EVP_PKEY_new(void)
{
    EVP_PKEY *ret = OPENSSL_zalloc(sizeof(*ret));

    if (ret == NULL) {
        EVPerr(EVP_F_EVP_PKEY_NEW, ERR_R_MALLOC_FAILURE);
        return NULL;
    }
    ret->type = EVP_PKEY_NONE;
    ret->save_type = EVP_PKEY_NONE;
    ret->references = 1;
    ret->save_parameters = 1;
    ret->lock = CRYPTO_THREAD_lock_new();
    if (ret->lock == NULL) {
        EVPerr(EVP_F_EVP_PKEY_NEW, ERR_R_MALLOC_FAILURE);
        OPENSSL_free(ret);
        return NULL;
    }
    return ret;
}

int EVP_PKEY_up_ref(EVP_PKEY *pkey)
{
    int i;

    if (CRYPTO_UP_REF(&pkey->references, &i, pkey->lock) <= 0)
        return 0;

    REF_PRINT_COUNT("EVP_PKEY", pkey);
    REF_ASSERT_ISNT(i < 2);
    return ((i > 1) ? 1 : 0);
}

static void evp_pkey_free_it(EVP_PKEY *x)
{
    /* internal function; x is never NULL */

    evp_keymgmt_clear_pkey_cache(x);

    if (x->ameth && x->ameth->pkey_free) {
        x->ameth->pkey_free(x);
        x->pkey.ptr = NULL;
    }
#if !defined(OPENSSL_NO_ENGINE) && !defined(FIPS_MODE)
    ENGINE_finish(x->engine);
    x->engine = NULL;
    ENGINE_finish(x->pmeth_engine);
    x->pmeth_engine = NULL;
#endif
}

void EVP_PKEY_free(EVP_PKEY *x)
{
    int i;

    if (x == NULL)
        return;

    CRYPTO_DOWN_REF(&x->references, &i, x->lock);
    REF_PRINT_COUNT("EVP_PKEY", x);
    if (i > 0)
        return;
    REF_ASSERT_ISNT(i < 0);
    evp_pkey_free_it(x);
    CRYPTO_THREAD_lock_free(x->lock);
#ifndef FIPS_MODE
    sk_X509_ATTRIBUTE_pop_free(x->attributes, X509_ATTRIBUTE_free);
#endif
    OPENSSL_free(x);
}

int EVP_PKEY_size(const EVP_PKEY *pkey)
{
823 824 825 826 827 828
    if (pkey != NULL) {
        if (pkey->ameth == NULL)
            return pkey->cache.size;
        else if (pkey->ameth->pkey_size != NULL)
            return pkey->ameth->pkey_size(pkey);
    }
829 830
    return 0;
}
831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874

void *evp_pkey_make_provided(EVP_PKEY *pk, OPENSSL_CTX *libctx,
                             EVP_KEYMGMT **keymgmt, const char *propquery,
                             int domainparams)
{
    EVP_KEYMGMT *allocated_keymgmt = NULL;
    EVP_KEYMGMT *tmp_keymgmt = NULL;
    void *provdata = NULL;

    if (pk == NULL)
        return NULL;

    if (keymgmt != NULL) {
        tmp_keymgmt = *keymgmt;
        *keymgmt = NULL;
    }

    if (tmp_keymgmt == NULL) {
        EVP_PKEY_CTX *ctx = EVP_PKEY_CTX_new_from_pkey(libctx, pk);

        if (ctx != NULL && ctx->keytype != NULL)
            tmp_keymgmt = allocated_keymgmt =
                EVP_KEYMGMT_fetch(ctx->libctx, ctx->keytype, propquery);
        EVP_PKEY_CTX_free(ctx);
    }

    if (tmp_keymgmt != NULL)
        provdata =
            evp_keymgmt_export_to_provider(pk, tmp_keymgmt, domainparams);

    /*
     * If nothing was exported, |tmp_keymgmt| might point at a freed
     * EVP_KEYMGMT, so we clear it to be safe.  It shouldn't be useful for
     * the caller either way in that case.
     */
    if (provdata == NULL)
        tmp_keymgmt = NULL;

    if (keymgmt != NULL)
        *keymgmt = tmp_keymgmt;

    EVP_KEYMGMT_free(allocated_keymgmt);
    return provdata;
}