| 67 | |
| 68 | |
| 69 | int EVP_DigestSignAlgorithm(EVP_MD_CTX *ctx, X509_ALGOR *algor) { |
| 70 | const EVP_MD *digest; |
| 71 | EVP_PKEY *pkey; |
| 72 | int sign_nid, paramtype; |
| 73 | |
| 74 | digest = EVP_MD_CTX_md(ctx); |
| 75 | pkey = EVP_PKEY_CTX_get0_pkey(ctx->pctx); |
| 76 | if (!digest || !pkey) { |
| 77 | OPENSSL_PUT_ERROR(EVP, EVP_R_CONTEXT_NOT_INITIALISED); |
| 78 | return 0; |
| 79 | } |
| 80 | |
| 81 | if (pkey->ameth->digest_sign_algorithm) { |
| 82 | switch (pkey->ameth->digest_sign_algorithm(ctx, algor)) { |
| 83 | case EVP_DIGEST_SIGN_ALGORITHM_ERROR: |
| 84 | return 0; |
| 85 | case EVP_DIGEST_SIGN_ALGORITHM_SUCCESS: |
| 86 | return 1; |
| 87 | case EVP_DIGEST_SIGN_ALGORITHM_DEFAULT: |
| 88 | /* Use default behavior. */ |
| 89 | break; |
| 90 | default: |
| 91 | assert(0); |
| 92 | } |
| 93 | } |
| 94 | |
| 95 | /* Default behavior: look up the OID for the algorithm/hash pair and encode |
| 96 | * that. */ |
| 97 | if (!OBJ_find_sigid_by_algs(&sign_nid, EVP_MD_type(digest), |
| 98 | pkey->ameth->pkey_id)) { |
| 99 | OPENSSL_PUT_ERROR(EVP, EVP_R_DIGEST_AND_KEY_TYPE_NOT_SUPPORTED); |
| 100 | return 0; |
| 101 | } |
| 102 | |
| 103 | if (pkey->ameth->pkey_flags & ASN1_PKEY_SIGPARAM_NULL) { |
| 104 | paramtype = V_ASN1_NULL; |
| 105 | } else { |
| 106 | paramtype = V_ASN1_UNDEF; |
| 107 | } |
| 108 | |
| 109 | X509_ALGOR_set0(algor, OBJ_nid2obj(sign_nid), paramtype, NULL); |
| 110 | return 1; |
| 111 | } |
| 112 | |
| 113 | int EVP_DigestVerifyInitFromAlgorithm(EVP_MD_CTX *ctx, |
| 114 | X509_ALGOR *algor, |