]> wagner.pp.ru Git - oss/ctypescrypto.git/blobdiff - ctypescrypto/digest.py
Merge branch 'master' of https://github.com/vbwagner/ctypescrypto
[oss/ctypescrypto.git] / ctypescrypto / digest.py
index 4e33d92bb3e147b28a05fd22dd18ef315078dff2..26b46bd7337e5bbd467a8252ec29514775a5edd9 100644 (file)
@@ -1,5 +1,6 @@
 """\r
-       Implmenets interface to OpenSSL EVP_Digest* functions.\r
+       Implements interface to OpenSSL EVP_Digest* functions.\r
+\r
        Interface  made as close to hashlib as possible.\r
 \r
        This module is really an excess effort. Hashlib allows access to\r
@@ -18,6 +19,7 @@ from ctypescrypto.exception import LibCryptoError
 from ctypescrypto.oid import Oid\r
 DIGEST_ALGORITHMS = ("MD5", "SHA1", "SHA224", "SHA256", "SHA384", "SHA512")\r
 \r
+__all__ = ['DigestError','Digest','DigestType','new']\r
 \r
 class DigestError(LibCryptoError):\r
        pass\r
@@ -44,7 +46,7 @@ class DigestType:
                self.digest_name = digest_name\r
                self.digest = libcrypto.EVP_get_digestbyname(self.digest_name)\r
                if self.digest is None:\r
-                       raise DigestError, "Unknown digest: %s" % self.digest_name\r
+                       raise DigestError("Unknown digest: %s" % self.digest_name)\r
 \r
        def __del__(self):\r
                pass\r
@@ -68,11 +70,11 @@ class Digest:
                self._clean_ctx()\r
                self.ctx = libcrypto.EVP_MD_CTX_create()\r
                if self.ctx == 0:\r
-                       raise DigestError, "Unable to create digest context"\r
+                       raise DigestError("Unable to create digest context")\r
                result = libcrypto.EVP_DigestInit_ex(self.ctx, digest_type.digest, None)\r
                if result == 0:\r
                        self._clean_ctx()\r
-                       raise DigestError, "Unable to initialize digest"\r
+                       raise DigestError("Unable to initialize digest")\r
                self.digest_type = digest_type\r
                self.digest_size = self.digest_type.digest_size()\r
                self.block_size = self.digest_type.block_size()\r
@@ -80,15 +82,23 @@ class Digest:
        def __del__(self):\r
                self._clean_ctx()\r
 \r
-       def update(self, data):\r
+       def update(self, data, length=None):\r
                """\r
-                       Hashes given byte string as data\r
+                       Hashes given byte string \r
+\r
+                       @param data - string to hash\r
+                       @param length - if not specifed, entire string is hashed,\r
+                                       otherwise only first length bytes\r
                """\r
                if self.digest_finalized:\r
-                       raise DigestError, "No updates allowed"\r
+                       raise DigestError("No updates allowed")\r
                if type(data) != type(""):\r
-                       raise TypeError, "A string is expected"\r
-               result = libcrypto.EVP_DigestUpdate(self.ctx, c_char_p(data), len(data))\r
+                       raise TypeError("A string is expected")\r
+               if length is None:\r
+                       length=len(data)\r
+               elif length> len(data):\r
+                       raise ValueError("Specified length is greater than length of data")\r
+               result = libcrypto.EVP_DigestUpdate(self.ctx, c_char_p(data), length)\r
                if result != 1:\r
                        raise DigestError, "Unable to update digest"\r
                \r
@@ -105,7 +115,7 @@ class Digest:
                length = c_long(0)\r
                result = libcrypto.EVP_DigestFinal_ex(self.ctx, self.digest_out, byref(length))\r
                if result != 1 :\r
-                       raise DigestError, "Unable to finalize digest"\r
+                       raise DigestError("Unable to finalize digest")\r
                self.digest_finalized = True\r
                return self.digest_out.raw[:self.digest_size]\r
        def copy(self):\r