"""\r
def __init__(self, digest_name):\r
"""\r
- Finds digest by its name\r
+ Finds digest by its name. You can pass Oid object instead of\r
+ name.\r
+\r
+ Special case is when None is passed as name. In this case\r
+ unitialized digest is created, and can be initalized later\r
+ by setting its digest attribute to pointer to EVP_MD\r
"""\r
- self.digest_name = digest_name\r
- self.digest = libcrypto.EVP_get_digestbyname(self.digest_name)\r
+ if digest_name is None:\r
+ return \r
+ if isinstance(digest_name,Oid):\r
+ self.digest_name=digest_name.longname()\r
+ self.digest=libcrypto.EVP_get_digestbyname(self.digest_name)\r
+ else:\r
+ self.digest_name = str(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
\r
+ @property\r
+ def name(self):\r
+ if not hasattr(self,'digest_name'):\r
+ self.digest_name=Oid(libcrypto.EVP_MD_type(self.digest)).longname()\r
+ return self.digest_name\r
def __del__(self):\r
pass\r
def digest_size(self):\r
"""\r
self._clean_ctx()\r
self.ctx = libcrypto.EVP_MD_CTX_create()\r
- if self.ctx == 0:\r
+ if self.ctx is None:\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
"""\r
if self.digest_finalized:\r
raise DigestError("No updates allowed")\r
- if type(data) != type(""):\r
+ if not isinstance(data,str):\r
raise TypeError("A string is expected")\r
if length is None:\r
- length=len(data)\r
- elif length> len(data):\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