X-Git-Url: http://wagner.pp.ru/gitweb/?a=blobdiff_plain;f=ctypescrypto%2Fdigest.py;h=30d77c5a57b35f19d2f0aa501f010581ae4740dc;hb=ca6a5055ad8a9ea82e9f42aff3c906903d5e6df7;hp=2963e7034b19eac01bad510ff7ad389e65f0cb1c;hpb=7b9c29e43612629052e0ec875fd9ecbb35b0b02d;p=oss%2Fctypescrypto.git diff --git a/ctypescrypto/digest.py b/ctypescrypto/digest.py index 2963e70..30d77c5 100644 --- a/ctypescrypto/digest.py +++ b/ctypescrypto/digest.py @@ -41,13 +41,29 @@ class DigestType(object): """ def __init__(self, digest_name): """ - Finds digest by its name + Finds digest by its name. You can pass Oid object instead of + name. + + Special case is when None is passed as name. In this case + unitialized digest is created, and can be initalized later + by setting its digest attribute to pointer to EVP_MD """ - self.digest_name = digest_name - self.digest = libcrypto.EVP_get_digestbyname(self.digest_name) + if digest_name is None: + return + if isinstance(digest_name,Oid): + self.digest_name=digest_name.longname() + self.digest=libcrypto.EVP_get_digestbyname(self.digest_name) + else: + self.digest_name = str(digest_name) + self.digest = libcrypto.EVP_get_digestbyname(self.digest_name) if self.digest is None: raise DigestError("Unknown digest: %s" % self.digest_name) + @property + def name(self): + if not hasattr(self,'digest_name'): + self.digest_name=Oid(libcrypto.EVP_MD_type(self.digest)).longname() + return self.digest_name def __del__(self): pass def digest_size(self): @@ -69,7 +85,7 @@ class Digest(object): """ self._clean_ctx() self.ctx = libcrypto.EVP_MD_CTX_create() - if self.ctx == 0: + if self.ctx is None: raise DigestError("Unable to create digest context") result = libcrypto.EVP_DigestInit_ex(self.ctx, digest_type.digest, None) if result == 0: @@ -92,11 +108,11 @@ class Digest(object): """ if self.digest_finalized: raise DigestError("No updates allowed") - if type(data) != type(""): + if not isinstance(data,str): raise TypeError("A string is expected") if length is None: - length=len(data) - elif length> len(data): + length = len(data) + elif length > len(data): raise ValueError("Specified length is greater than length of data") result = libcrypto.EVP_DigestUpdate(self.ctx, c_char_p(data), length) if result != 1: