summaryrefslogtreecommitdiff
path: root/SWIG/_evp.i
diff options
context:
space:
mode:
Diffstat (limited to 'SWIG/_evp.i')
-rw-r--r--SWIG/_evp.i128
1 files changed, 127 insertions, 1 deletions
diff --git a/SWIG/_evp.i b/SWIG/_evp.i
index 9a3b67b..61f0f23 100644
--- a/SWIG/_evp.i
+++ b/SWIG/_evp.i
@@ -184,6 +184,10 @@ extern int EVP_PKEY_set1_RSA(EVP_PKEY *, RSA *);
extern int EVP_SignInit(EVP_MD_CTX *, const EVP_MD *);
%rename(verify_init) EVP_VerifyInit;
extern int EVP_VerifyInit(EVP_MD_CTX *, const EVP_MD *);
+%rename(digest_sign_init) EVP_DigestSignInit;
+extern int EVP_DigestSignInit(EVP_MD_CTX *, EVP_PKEY_CTX **, const EVP_MD *, ENGINE *, EVP_PKEY *);
+%rename(digest_verify_init) EVP_DigestVerifyInit;
+extern int EVP_DigestVerifyInit(EVP_MD_CTX *, EVP_PKEY_CTX **, const EVP_MD *, ENGINE *, EVP_PKEY *);
%rename(pkey_size) EVP_PKEY_size;
extern int EVP_PKEY_size(EVP_PKEY *);
@@ -546,7 +550,6 @@ int verify_update(EVP_MD_CTX *ctx, PyObject *blob) {
return EVP_VerifyUpdate(ctx, buf, len);
}
-
int verify_final(EVP_MD_CTX *ctx, PyObject *blob, EVP_PKEY *pkey) {
unsigned char *kbuf;
int len = 0;
@@ -556,6 +559,129 @@ int verify_final(EVP_MD_CTX *ctx, PyObject *blob, EVP_PKEY *pkey) {
return EVP_VerifyFinal(ctx, kbuf, len, pkey);
}
+
+int digest_sign_init(EVP_MD_CTX *ctx, EVP_PKEY *pkey) {
+ return EVP_DigestSignInit(ctx, NULL, NULL, NULL, pkey);
+}
+
+PyObject *digest_sign_update(EVP_MD_CTX *ctx, PyObject *blob) {
+ const void *buf;
+ int len = 0;
+
+ if (m2_PyObject_AsReadBufferInt(blob, (const void **)&buf, &len) == -1)
+ return NULL;
+
+ if (!EVP_DigestSignUpdate(ctx, buf, len)) {
+ m2_PyErr_Msg(_evp_err);
+ return NULL;
+ }
+ Py_RETURN_NONE;
+}
+
+PyObject *digest_sign_final(EVP_MD_CTX *ctx) {
+ PyObject *ret;
+ unsigned char *sigbuf;
+ size_t siglen;
+
+ if (!EVP_DigestSignFinal(ctx, NULL, &siglen)) {
+ m2_PyErr_Msg(_evp_err);
+ return NULL;
+ }
+
+ sigbuf = (unsigned char*)OPENSSL_malloc(siglen);
+ if (!sigbuf) {
+ PyErr_SetString(PyExc_MemoryError, "digest_sign_final");
+ return NULL;
+ }
+
+ if (!EVP_DigestSignFinal(ctx, sigbuf, &siglen)) {
+ m2_PyErr_Msg(_evp_err);
+ OPENSSL_cleanse(sigbuf, siglen);
+ OPENSSL_free(sigbuf);
+ return NULL;
+ }
+
+ ret = PyBytes_FromStringAndSize((char*)sigbuf, siglen);
+
+ OPENSSL_cleanse(sigbuf, siglen);
+ OPENSSL_free(sigbuf);
+ return ret;
+}
+
+PyObject *digest_sign(EVP_MD_CTX *ctx, PyObject *msg) {
+ PyObject *ret;
+ const void *msgbuf;
+ unsigned char *sigbuf;
+ int msglen = 0;
+ size_t siglen = 0;
+
+ if (m2_PyObject_AsReadBufferInt(msg, (const void **)&msgbuf, &msglen) == -1)
+ return NULL;
+
+ if (!EVP_DigestSign(ctx, NULL, &siglen, msgbuf, msglen)) {
+ m2_PyErr_Msg(_evp_err);
+ return NULL;
+ }
+
+ sigbuf = (unsigned char*)OPENSSL_malloc(siglen);
+ if (!sigbuf) {
+ PyErr_SetString(PyExc_MemoryError, "digest_sign");
+ return NULL;
+ }
+
+ if (!EVP_DigestSign(ctx, sigbuf, &siglen, msgbuf, msglen)) {
+ m2_PyErr_Msg(_evp_err);
+ OPENSSL_cleanse(sigbuf, siglen);
+ OPENSSL_free(sigbuf);
+ return NULL;
+ }
+
+ ret = PyBytes_FromStringAndSize((char*)sigbuf, siglen);
+
+ OPENSSL_cleanse(sigbuf, siglen);
+ OPENSSL_free(sigbuf);
+ return ret;
+
+}
+
+int digest_verify_init(EVP_MD_CTX *ctx, EVP_PKEY *pkey) {
+ return EVP_DigestVerifyInit(ctx, NULL, NULL, NULL, pkey);
+}
+
+int digest_verify_update(EVP_MD_CTX *ctx, PyObject *blob) {
+ const void *buf;
+ int len = 0;
+
+ if (m2_PyObject_AsReadBufferInt(blob, (const void **)&buf, &len) == -1)
+ return -1;
+
+ return EVP_DigestVerifyUpdate(ctx, buf, len);
+}
+
+int digest_verify_final(EVP_MD_CTX *ctx, PyObject *blob) {
+ unsigned char *sigbuf;
+ int len = 0;
+
+ if (m2_PyObject_AsReadBufferInt(blob, (const void **)&sigbuf, &len) == -1)
+ return -1;
+
+ return EVP_DigestVerifyFinal(ctx, sigbuf, len);
+}
+
+int digest_verify(EVP_MD_CTX *ctx, PyObject *sig, PyObject *msg) {
+ unsigned char *sigbuf;
+ unsigned char *msgbuf;
+ int siglen = 0;
+ int msglen = 0;
+
+ if (m2_PyObject_AsReadBufferInt(sig, (const void **)&sigbuf, &siglen) == -1)
+ return -1;
+
+ if (m2_PyObject_AsReadBufferInt(msg, (const void **)&msgbuf, &msglen) == -1)
+ return -1;
+
+ return EVP_DigestVerify(ctx, sigbuf, siglen, msgbuf, msglen);
+}
%}
%typemap(out) EVP_MD * {