summaryrefslogtreecommitdiffstats
path: root/PICA_signverify.c
diff options
context:
space:
mode:
authorAnton <anton@picapica>2019-02-17 21:05:55 +0400
committerAnton <anton@picapica>2019-02-17 21:05:55 +0400
commit3fa5f1cbb4ceb82eaab8ed1cca64b509b168640c (patch)
treed9a8ca12ab10dcac2c66da029ab7a8334dcba52a /PICA_signverify.c
parent44dae3d237e282e2ffe5bbe581f9fc3a5e07730a (diff)
downloadpica-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.c85
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;
}