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
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
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
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
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