summaryrefslogtreecommitdiff
path: root/rsa/pkcs1.py
diff options
context:
space:
mode:
authorSybren A. Stüvel <sybren@stuvel.eu>2017-04-10 12:12:29 +0200
committerSybren A. Stüvel <sybren@stuvel.eu>2017-04-10 12:12:29 +0200
commit395b8d661566f15632b0fb0e36fb8ea453ad9bf3 (patch)
treec200069ad7eeca8868244fbea2f5a979c0f98ed8 /rsa/pkcs1.py
parenta478d4c23a75c76f1e5587b3c08b1f3a1f2cbf8e (diff)
downloadrsa-git-395b8d661566f15632b0fb0e36fb8ea453ad9bf3.tar.gz
Feature request #78: Expose function to find the hash method of a signature
I've not used the name "find_method_hash" suggested in #78, as it's a bit vague. It's ok-ish for a private function `_find_method_hash`, but I thought `find_signature_hash` would be more descriptive.
Diffstat (limited to 'rsa/pkcs1.py')
-rw-r--r--rsa/pkcs1.py22
1 files changed, 21 insertions, 1 deletions
diff --git a/rsa/pkcs1.py b/rsa/pkcs1.py
index bb08f4d..41f543c 100644
--- a/rsa/pkcs1.py
+++ b/rsa/pkcs1.py
@@ -294,6 +294,7 @@ def verify(message, signature, pub_key):
:param signature: the signature block, as created with :py:func:`rsa.sign`.
:param pub_key: the :py:class:`rsa.PublicKey` of the person signing the message.
:raise VerificationError: when the signature doesn't match the message.
+ :returns: the name of the used hash.
"""
@@ -314,7 +315,26 @@ def verify(message, signature, pub_key):
if expected != clearsig:
raise VerificationError('Verification failed')
- return True
+ return method_name
+
+
+def find_signature_hash(signature, pub_key):
+ """Returns the hash name detected from the signature.
+
+ If you also want to verify the message, use :py:func:`rsa.verify()` instead.
+ It also returns the name of the used hash.
+
+ :param signature: the signature block, as created with :py:func:`rsa.sign`.
+ :param pub_key: the :py:class:`rsa.PublicKey` of the person signing the message.
+ :returns: the name of the used hash.
+ """
+
+ keylength = common.byte_size(pub_key.n)
+ encrypted = transform.bytes2int(signature)
+ decrypted = core.decrypt_int(encrypted, pub_key.e, pub_key.n)
+ clearsig = transform.int2bytes(decrypted, keylength)
+
+ return _find_method_hash(clearsig)
def yield_fixedblocks(infile, blocksize):