549
static char crypto_sign_doc[] = "\n\
550
Sign data with a digest\n\
552
@param pkey: Pkey to sign with\n\
553
@param data: data to be signed\n\
554
@param digest: message digest to use\n\
555
@return: signature\n\
559
crypto_sign(PyObject *spam, PyObject *args)
562
crypto_PKeyObj *pkey;
566
unsigned int sig_len;
567
const EVP_MD *digest;
569
unsigned char sig_buf[512];
571
if (!PyArg_ParseTuple(args, "O!ss:sign", &crypto_PKey_Type,
572
&pkey, &data, &digest_name))
575
if ((digest = EVP_get_digestbyname(digest_name)) == NULL)
577
PyErr_SetString(PyExc_ValueError, "No such digest method");
581
EVP_SignInit (&md_ctx, digest);
582
EVP_SignUpdate (&md_ctx, data, strlen(data));
583
sig_len = sizeof(sig_buf);
584
err = EVP_SignFinal (&md_ctx, sig_buf, &sig_len, pkey->pkey);
587
exception_from_error_queue(crypto_Error);
591
buffer = PyString_FromStringAndSize(sig_buf, sig_len);
595
static char crypto_verify_doc[] = "\n\
596
Verify a signature\n\
598
@param cert: signing certificate (X509 object)\n\
599
@param signature: signature returned by sign function\n\
600
@param data: data to be verified\n\
601
@param digest: message digest to use\n\
602
@return: None if the signature is correct, raise exception otherwise\n\
606
crypto_verify(PyObject *spam, PyObject *args)
608
crypto_X509Obj *cert;
609
unsigned char *signature;
611
char *data, *digest_name;
613
const EVP_MD *digest;
617
if (!PyArg_ParseTuple(args, "O!t#ss:verify", &crypto_X509_Type, &cert, &signature, &sig_len,
618
&data, &digest_name))
621
if ((digest = EVP_get_digestbyname(digest_name)) == NULL){
622
PyErr_SetString(PyExc_ValueError, "No such digest method");
625
pkey=X509_get_pubkey(cert->x509);
627
PyErr_SetString(PyExc_ValueError, "No public key");
631
EVP_VerifyInit (&md_ctx, digest);
632
EVP_VerifyUpdate (&md_ctx, data, strlen((char*)data));
633
err = EVP_VerifyFinal (&md_ctx, signature, sig_len, pkey);
634
EVP_PKEY_free (pkey);
637
exception_from_error_queue(crypto_Error);
549
645
/* Methods in the OpenSSL.crypto module (i.e. none) */
550
646
static PyMethodDef crypto_methods[] = {
557
653
{ "dump_certificate_request", (PyCFunction)crypto_dump_certificate_request, METH_VARARGS, crypto_dump_certificate_request_doc },
558
654
{ "load_pkcs7_data", (PyCFunction)crypto_load_pkcs7_data, METH_VARARGS, crypto_load_pkcs7_data_doc },
559
655
{ "load_pkcs12", (PyCFunction)crypto_load_pkcs12, METH_VARARGS, crypto_load_pkcs12_doc },
656
{ "sign", (PyCFunction)crypto_sign, METH_VARARGS, crypto_sign_doc },
657
{ "verify", (PyCFunction)crypto_verify, METH_VARARGS, crypto_verify_doc },
560
658
{ "X509_verify_cert_error_string", (PyCFunction)crypto_X509_verify_cert_error_string, METH_VARARGS, crypto_X509_verify_cert_error_string_doc },
561
659
{ "_exception_from_error_queue", (PyCFunction)crypto_exception_from_error_queue, METH_NOARGS, crypto_exception_from_error_queue_doc },