X-Git-Url: http://wagner.pp.ru/gitweb/?a=blobdiff_plain;f=ctypescrypto%2Foid.py;h=976cd3f8e5b7cf07cc6ab86e93e1400d4acac52d;hb=eeb4a6511bf02295c802a6b55bfad226b01fa126;hp=81bea92a05f59cf583dff60df9607a3cdccf5b39;hpb=1ff9b1899959673512927b6afa317855908b7073;p=oss%2Fctypescrypto.git diff --git a/ctypescrypto/oid.py b/ctypescrypto/oid.py index 81bea92..976cd3f 100644 --- a/ctypescrypto/oid.py +++ b/ctypescrypto/oid.py @@ -1,29 +1,98 @@ """ - Interface to OpenSSL object identifier database + Interface to OpenSSL object identifier database. + + It is primarily intended to deal with OIDs which are compiled into the + database or defined in the openssl configuration files. + + But see create() function + """ from ctypescrypto import libcrypto +from ctypes import c_char_p, c_void_p, c_int, create_string_buffer class Oid: + """ + Represents an OID. It can be consturucted by textual + representation like Oid("commonName") or Oid("CN"), + dotted-decimal Oid("1.2.3.4") or using OpenSSL numeric + identifer (NID), which is typically returned or required by + OpenSSL API functions. If object is consturcted from textual + representation which is not present in the database, it fails + with ValueError + + attribute nid - contains object nid. + + + """ + def __init__(self,value): + " Object constuctor. Accepts string or integer" if type(value) == type(""): self.nid=libcrypto.OBJ_txt2nid(value) if self.nid==0: - raise LibCryptoError("Cannot find object %s in the - database"%(value)) + raise ValueError("Cannot find object %s in the database"%(value)) elif type(value) == type(0): + cn=libcrypto.OBJ_nid2sn(value) + if cn is None: + raise ValueError("No such nid %d in the database"%(value)) self.nid=value else: raise TypeError("Cannot convert this type to object identifier") + def __hash__(self): + " Returns NID " + return self.nid def __cmp__(self,other): + " Compares NIDs of two objects " return self.nid-other.nid def __str__(self): + " Default string representation of Oid is dotted-decimal" return self.dotted() - def shorttname(self): + def __repr__(self): + return "Oid('%s')"%(self.dotted()) + def shortname(self): + " Returns short name if any " return libcrypto.OBJ_nid2sn(self.nid) def longname(self): + " Returns logn name if any " return libcrypto.OBJ_nid2ln(self.nid) - def dotted(self) + def dotted(self): + " Returns dotted-decimal reperesntation " obj=libcrypto.OBJ_nid2obj(self.nid) buf=create_string_buffer(256) libcrypto.OBJ_obj2txt(buf,256,obj,1) return buf.value +def create(dotted,shortname,longname): + """ + Creates new OID in the database + + @param dotted - dotted-decimal representation of new OID + @param shortname - short name for new OID + @param longname - long name for new OID + + @returns Oid object corresponding to new OID + + This function should be used with exreme care. Whenever + possible, it is better to add new OIDs via OpenSSL configuration + file + + Results of calling this function twice for same OIDor for + Oid alredy in database are undefined + """ + nid=libcrypto.OBJ_create(dotted,shortname,longname) + if nid == 0: + raise LibCryptoError("Problem adding new OID to the database") + return Oid(nid) + +def cleanup(): + """ + Removes all the objects, dynamically added by current + application from database. + """ + libcrypto.OBJ_cleanup() + +libcrypto.OBJ_nid2sn.restype=c_char_p +libcrypto.OBJ_nid2ln.restype=c_char_p +libcrypto.OBJ_nid2obj.restype=c_void_p +libcrypto.OBJ_obj2txt.argtypes=(c_char_p,c_int,c_void_p,c_int) +libcrypto.OBJ_txt2nid.argtupes=(c_char_p,) +libcrypto.OBJ_create.argtypes=(c_char_p,c_char_p,c_char_p)