X-Git-Url: http://wagner.pp.ru/gitweb/?a=blobdiff_plain;f=ctypescrypto%2Fbio.py;h=b1700b9a869ca80dd1eba7dba1c13117782202b0;hb=92df3e73921ba7b8756bfab1af4189dab7cc610e;hp=92de35c5dd27fe4eba15966b038e6aa24590d732;hpb=e3bfb3cbff37b907742c1a959a1ac44ad2ccda8c;p=oss%2Fctypescrypto.git diff --git a/ctypescrypto/bio.py b/ctypescrypto/bio.py index 92de35c..b1700b9 100644 --- a/ctypescrypto/bio.py +++ b/ctypescrypto/bio.py @@ -1,14 +1,17 @@ +""" +Interface to OpenSSL BIO library +""" from ctypescrypto import libcrypto from ctypes import c_char_p, c_void_p, c_int, string_at, c_long,POINTER,byref, create_string_buffer -class Membio: +class Membio(object): """ Provides interface to OpenSSL memory bios - use str() to get contents of writable bio + use str() or unicode() to get contents of writable bio use bio member to pass to libcrypto function """ def __init__(self,data=None): """ If data is specified, creates read-only BIO. If data is - None, creates writable BIO + None, creates writable BIO, contents of which can be retrieved by str() or unicode() """ if data is None: method=libcrypto.BIO_s_mem() @@ -16,15 +19,30 @@ class Membio: else: self.bio=libcrypto.BIO_new_mem_buf(c_char_p(data),len(data)) def __del__(self): + """ + Cleans up memory used by bio + """ libcrypto.BIO_free(self.bio) del(self.bio) def __str__(self): + """ + Returns current contents of buffer as byte string + """ p=c_char_p(None) l=libcrypto.BIO_ctrl(self.bio,3,0,byref(p)) return string_at(p,l) + def __unicode__(self): + """ + Attempts to interpret current contents of buffer as UTF-8 string and convert it to unicode + """ + return str(self).decode("utf-8") def read(self,length=None): + """ + Reads data from readble BIO. For test purposes. + @param length - if specifed, limits amount of data read. If not BIO is read until end of buffer + """ if not length is None: - if type(length)!=type(0): + if not isinstance(length,(int,long)): raise TypeError("length to read should be number") buf=create_string_buffer(length) readbytes=libcrypto.BIO_read(self.bio,buf,length) @@ -50,13 +68,23 @@ class Membio: return out def write(self,data): + """ + Writes data to writable bio. For test purposes + """ + if isinstance(data,unicode): + data=data.encode("utf-8") r=libcrypto.BIO_write(self.bio,data,len(data)) if r==-2: raise NotImplementedError("Function not supported by this BIO") if r