diff options
| author | Anton <anton@picapica> | 2019-02-17 21:05:55 +0400 |
|---|---|---|
| committer | Anton <anton@picapica> | 2019-02-17 21:05:55 +0400 |
| commit | 3fa5f1cbb4ceb82eaab8ed1cca64b509b168640c (patch) | |
| tree | d9a8ca12ab10dcac2c66da029ab7a8334dcba52a /PICA_signverify.c | |
| parent | 44dae3d237e282e2ffe5bbe581f9fc3a5e07730a (diff) | |
| download | pica-pica-3fa5f1cbb4ceb82eaab8ed1cca64b509b168640c.tar.gz pica-pica-3fa5f1cbb4ceb82eaab8ed1cca64b509b168640c.zip | |
move do_signature() to PICA_do_signature in PICA_signverify.c, implement PICA_signverify()
Diffstat (limited to 'PICA_signverify.c')
| -rw-r--r-- | PICA_signverify.c | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/PICA_signverify.c b/PICA_signverify.c index 408644e..a5e4972 100644 --- a/PICA_signverify.c +++ b/PICA_signverify.c @@ -21,5 +21,90 @@ int PICA_signverify(EVP_PKEY *pubkey, void **datapointers, int *datalengths, unsigned char *sig, int siglen) { + EVP_MD_CTX *mdctx = NULL; + int ret = 0; + mdctx = EVP_MD_CTX_create(); + + if (!mdctx) + return 0; + + ret = EVP_DigestVerifyInit(mdctx, NULL, EVP_sha224(), NULL, pubkey); + + if (ret != 1) + goto signverify_exit; + + while (*datapointers) + { + ret = EVP_DigestVerifyUpdate(mdctx, *datapointers, *datalengths); + + if (ret != 1) + goto signverify_exit; + + datapointers++; + datalengths++; + } + + ret = EVP_DigestVerifyFinal(mdctx, sig, siglen); + + if (ret != 1) + ret = 0; + +signverify_exit: + EVP_MD_CTX_destroy(mdctx); + return ret; +} + +int PICA_do_signature(EVP_PKEY *privkey, void **datapointers, int *datalengths, unsigned char **sig, int *siglen) +{ + int ret = 0; + EVP_MD_CTX *mdctx = NULL; + + mdctx = EVP_MD_CTX_create(); + + if (!mdctx) + return 0; + + ret = EVP_DigestSignInit(mdctx, NULL, EVP_sha224(), NULL, privkey); + + if (ret != 1) + goto sig_exit; + + while(*datapointers) + { + ret = EVP_DigestSignUpdate(mdctx, *datapointers, *datalengths); + + if (ret != 1) + { + goto sig_exit; + break; + } + + datapointers++; + datalengths++; + } + + ret = EVP_DigestSignFinal(mdctx, NULL, (size_t*) siglen); + + if (ret != 1) + goto sig_exit; + + *sig = (unsigned char*) malloc(*siglen); + + if (!*sig) + { + ret = 0; + goto sig_exit; + } + + ret = EVP_DigestSignFinal(mdctx, *sig, (size_t*) siglen); + + if (ret == 1) + ret = 1; + else + free(*sig); + +sig_exit: + EVP_MD_CTX_destroy(mdctx); + return ret; } |
