diff options
author | jsing <> | 2022-11-10 15:17:30 +0000 |
---|---|---|
committer | jsing <> | 2022-11-10 15:17:30 +0000 |
commit | 6c2e8d35e6420143135582b6d9c17cdef89fcfde (patch) | |
tree | 68f3eb652b8c2de8493a896f4224c61a7d0ba2bb /src/lib/libcrypto/evp/m_sigver.c | |
parent | 9e517a7080ced5cb4fbcab5fa72fa8568a60ea2a (diff) | |
download | openbsd-6c2e8d35e6420143135582b6d9c17cdef89fcfde.tar.gz openbsd-6c2e8d35e6420143135582b6d9c17cdef89fcfde.tar.bz2 openbsd-6c2e8d35e6420143135582b6d9c17cdef89fcfde.zip |
Provide digestsign/digestverify hooks for EVP_PKEY_METHOD.
These are needed for EVP implementations of Ed25519 and X25519.
ok beck@ tb@
Diffstat (limited to 'src/lib/libcrypto/evp/m_sigver.c')
-rw-r--r-- | src/lib/libcrypto/evp/m_sigver.c | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/src/lib/libcrypto/evp/m_sigver.c b/src/lib/libcrypto/evp/m_sigver.c index bd9374651a..5be924bed5 100644 --- a/src/lib/libcrypto/evp/m_sigver.c +++ b/src/lib/libcrypto/evp/m_sigver.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: m_sigver.c,v 1.9 2021/05/09 14:25:40 tb Exp $ */ | 1 | /* $OpenBSD: m_sigver.c,v 1.10 2022/11/10 15:17:30 jsing Exp $ */ |
2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
3 | * project 2006. | 3 | * project 2006. |
4 | */ | 4 | */ |
@@ -66,6 +66,13 @@ | |||
66 | #include "evp_locl.h" | 66 | #include "evp_locl.h" |
67 | 67 | ||
68 | static int | 68 | static int |
69 | update_oneshot_only(EVP_MD_CTX *ctx, const void *data, size_t datalen) | ||
70 | { | ||
71 | EVPerror(EVP_R_ONLY_ONESHOT_SUPPORTED); | ||
72 | return 0; | ||
73 | } | ||
74 | |||
75 | static int | ||
69 | do_sigver_init(EVP_MD_CTX *ctx, EVP_PKEY_CTX **pctx, const EVP_MD *type, | 76 | do_sigver_init(EVP_MD_CTX *ctx, EVP_PKEY_CTX **pctx, const EVP_MD *type, |
70 | ENGINE *e, EVP_PKEY *pkey, int ver) | 77 | ENGINE *e, EVP_PKEY *pkey, int ver) |
71 | { | 78 | { |
@@ -93,6 +100,9 @@ do_sigver_init(EVP_MD_CTX *ctx, EVP_PKEY_CTX **pctx, const EVP_MD *type, | |||
93 | ctx) <=0) | 100 | ctx) <=0) |
94 | return 0; | 101 | return 0; |
95 | ctx->pctx->operation = EVP_PKEY_OP_VERIFYCTX; | 102 | ctx->pctx->operation = EVP_PKEY_OP_VERIFYCTX; |
103 | } else if (ctx->pctx->pmeth->digestverify != NULL) { | ||
104 | ctx->pctx->operation = EVP_PKEY_OP_VERIFY; | ||
105 | ctx->update = update_oneshot_only; | ||
96 | } else if (EVP_PKEY_verify_init(ctx->pctx) <= 0) | 106 | } else if (EVP_PKEY_verify_init(ctx->pctx) <= 0) |
97 | return 0; | 107 | return 0; |
98 | } else { | 108 | } else { |
@@ -100,6 +110,9 @@ do_sigver_init(EVP_MD_CTX *ctx, EVP_PKEY_CTX **pctx, const EVP_MD *type, | |||
100 | if (ctx->pctx->pmeth->signctx_init(ctx->pctx, ctx) <= 0) | 110 | if (ctx->pctx->pmeth->signctx_init(ctx->pctx, ctx) <= 0) |
101 | return 0; | 111 | return 0; |
102 | ctx->pctx->operation = EVP_PKEY_OP_SIGNCTX; | 112 | ctx->pctx->operation = EVP_PKEY_OP_SIGNCTX; |
113 | } else if (ctx->pctx->pmeth->digestsign != NULL) { | ||
114 | ctx->pctx->operation = EVP_PKEY_OP_SIGN; | ||
115 | ctx->update = update_oneshot_only; | ||
103 | } else if (EVP_PKEY_sign_init(ctx->pctx) <= 0) | 116 | } else if (EVP_PKEY_sign_init(ctx->pctx) <= 0) |
104 | return 0; | 117 | return 0; |
105 | } | 118 | } |
@@ -190,6 +203,10 @@ int | |||
190 | EVP_DigestSign(EVP_MD_CTX *ctx, unsigned char *sigret, size_t *siglen, | 203 | EVP_DigestSign(EVP_MD_CTX *ctx, unsigned char *sigret, size_t *siglen, |
191 | const unsigned char *tbs, size_t tbslen) | 204 | const unsigned char *tbs, size_t tbslen) |
192 | { | 205 | { |
206 | if (ctx->pctx->pmeth->digestsign != NULL) | ||
207 | return ctx->pctx->pmeth->digestsign(ctx, sigret, siglen, | ||
208 | tbs, tbslen); | ||
209 | |||
193 | if (sigret != NULL) { | 210 | if (sigret != NULL) { |
194 | if (EVP_DigestSignUpdate(ctx, tbs, tbslen) <= 0) | 211 | if (EVP_DigestSignUpdate(ctx, tbs, tbslen) <= 0) |
195 | return 0; | 212 | return 0; |
@@ -229,6 +246,10 @@ int | |||
229 | EVP_DigestVerify(EVP_MD_CTX *ctx, const unsigned char *sigret, size_t siglen, | 246 | EVP_DigestVerify(EVP_MD_CTX *ctx, const unsigned char *sigret, size_t siglen, |
230 | const unsigned char *tbs, size_t tbslen) | 247 | const unsigned char *tbs, size_t tbslen) |
231 | { | 248 | { |
249 | if (ctx->pctx->pmeth->digestverify != NULL) | ||
250 | return ctx->pctx->pmeth->digestverify(ctx, sigret, siglen, | ||
251 | tbs, tbslen); | ||
252 | |||
232 | if (EVP_DigestVerifyUpdate(ctx, tbs, tbslen) <= 0) | 253 | if (EVP_DigestVerifyUpdate(ctx, tbs, tbslen) <= 0) |
233 | return -1; | 254 | return -1; |
234 | 255 | ||