summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZooko O'Whielacronx <zooko@zooko.com>2012-03-10 12:30:52 -0800
committerZooko O'Whielacronx <zooko@zooko.com>2012-03-10 12:30:52 -0800
commitb77b14a544a252b863a53e0eb2fccc4692635ee9 (patch)
tree20d33614d71b12b4dac7cefb7bbb3b72f3144f11
parent9fb706709b6443a005a08ae17148600b817b9e7e (diff)
catch C++ exception from malformed serialized signing key and turn it into Python exception
fixes #83
-rw-r--r--src/pycryptopp/publickey/rsamodule.cpp7
-rw-r--r--src/pycryptopp/test/test_rsa.py2
2 files changed, 7 insertions, 2 deletions
diff --git a/src/pycryptopp/publickey/rsamodule.cpp b/src/pycryptopp/publickey/rsamodule.cpp
index 3e83803..256fd85 100644
--- a/src/pycryptopp/publickey/rsamodule.cpp
+++ b/src/pycryptopp/publickey/rsamodule.cpp
@@ -354,7 +354,12 @@ rsa_create_signing_key_from_string(PyObject *dummy, PyObject *args, PyObject *kw
return NULL;
StringSource ss(reinterpret_cast<const byte*>(serializedsigningkey), serializedsigningkeysize, true);
- signer->k = new RSASS<PSS, SHA256>::Signer(ss);
+ try {
+ signer->k = new RSASS<PSS, SHA256>::Signer(ss);
+ } catch (CryptoPP::BERDecodeErr le) {
+ return PyErr_Format(rsa_error, "Serialized signing key was corrupted. Crypto++ gave this exception: %s", le.what());
+ }
+
if (!signer->k)
return PyErr_NoMemory();
return reinterpret_cast<PyObject*>(signer);
diff --git a/src/pycryptopp/test/test_rsa.py b/src/pycryptopp/test/test_rsa.py
index 5348789..5370f16 100644
--- a/src/pycryptopp/test/test_rsa.py
+++ b/src/pycryptopp/test/test_rsa.py
@@ -54,7 +54,7 @@ class Signer(unittest.TestCase):
def test_create_from_string_invalid(self):
try:
- signer = rsa.create_signing_key_from_string("invalid string")
+ rsa.create_signing_key_from_string("invalid string")
except rsa.Error, le:
self.failUnless("decode error" in str(le), le)
else: