]> 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
 """\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
        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
 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
 \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
                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
 \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
                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
                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
                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 __del__(self):\r
                self._clean_ctx()\r
 \r
-       def update(self, data):\r
+       def update(self, data, length=None):\r
                """\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
                """\r
                if self.digest_finalized:\r
-                       raise DigestError, "No updates allowed"\r
+                       raise DigestError("No updates allowed")\r
                if type(data) != type(""):\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
                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
                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
                self.digest_finalized = True\r
                return self.digest_out.raw[:self.digest_size]\r
        def copy(self):\r