]> www.wagner.pp.ru Git - oss/ctypescrypto.git/blob - ctypescrypto/oid.py
6941ce4b399b6b353026dfa99aac02238b656e5e
[oss/ctypescrypto.git] / ctypescrypto / oid.py
1 """     
2  Interface to OpenSSL object identifier database.
3
4  It is primarily intended to deal with OIDs which are compiled into the
5  database or defined in the openssl configuration files.
6
7  But see create() function
8
9 """
10 from ctypescrypto import libcrypto
11 from ctypes import c_char_p, c_void_p, c_int, create_string_buffer
12
13 __all__ = ['Oid','create','cleanup']
14
15 class Oid(object):
16         """
17                 Represents an OID. It can be consturucted by textual
18                 representation like Oid("commonName") or Oid("CN"),
19                 dotted-decimal Oid("1.2.3.4") or using OpenSSL numeric
20                 identifer (NID), which is typically returned or required by 
21                 OpenSSL API functions. If object is consturcted from textual
22                 representation which is not present in the database, it fails
23                 with ValueError
24
25                 attribute nid - contains object nid.
26
27
28         """
29
30         def __init__(self,value):
31                 " Object constuctor. Accepts string or integer"
32                 if type(value) == type(""):
33                         self.nid=libcrypto.OBJ_txt2nid(value)
34                         if self.nid==0:
35                                 raise ValueError("Cannot find object %s in the database"%(value))
36                 elif type(value) == type(0):
37                         cn=libcrypto.OBJ_nid2sn(value)
38                         if cn is None:
39                                 raise ValueError("No such nid %d in the database"%(value))
40                         self.nid=value
41                 else:
42                         raise TypeError("Cannot convert this type to object identifier")
43         def __hash__(self):
44                 " Returns NID "
45                 return self.nid
46         def __cmp__(self,other):
47                 " Compares NIDs of two objects "
48                 return self.nid-other.nid
49         def __str__(self):
50                 " Default string representation of Oid is dotted-decimal"
51                 return self.dotted()
52         def __repr__(self):
53                 return "Oid('%s')"%(self.dotted())
54         def shortname(self):
55                 " Returns short name if any "
56                 return libcrypto.OBJ_nid2sn(self.nid)
57         def longname(self):
58                 " Returns logn name if any "
59                 return  libcrypto.OBJ_nid2ln(self.nid)
60         def dotted(self):
61                 " Returns dotted-decimal reperesentation "
62                 obj=libcrypto.OBJ_nid2obj(self.nid)
63                 buf=create_string_buffer(256)
64                 libcrypto.OBJ_obj2txt(buf,256,obj,1)
65                 return buf.value
66         @staticmethod
67         def fromobj(obj):
68                 """
69                 Creates an OID object from the pointer to ASN1_OBJECT c structure.
70                 Strictly for internal use
71                 """
72                 nid=libcrypto.OBJ_obj2nid(obj)
73                 if nid==0:
74                         buf=create_string_buffer(80)
75                         l=libcrypto.OBJ_obj2txt(buf,80,obj,1)
76                         oid=create(buf[0:l],buf[0:l],buf[0:l])
77                 else:
78                         oid=Oid(nid)
79                 return oid
80
81 def create(dotted,shortname,longname):
82         """
83                 Creates new OID in the database
84
85                 @param dotted - dotted-decimal representation of new OID
86                 @param shortname - short name for new OID
87                 @param longname - long name for new OID
88
89                 @returns Oid object corresponding to new OID
90                 
91                 This function should be used with exreme care. Whenever
92                 possible, it is better to add new OIDs via OpenSSL configuration
93                 file
94
95                 Results of calling this function twice for same OIDor for
96                 Oid alredy in database are undefined
97         """
98         nid=libcrypto.OBJ_create(dotted,shortname,longname)
99         if nid == 0:
100                 raise LibCryptoError("Problem adding new OID to the  database")
101         return Oid(nid)
102
103 def cleanup():
104         """
105                 Removes all the objects, dynamically added by current
106                 application from database.
107         """
108         libcrypto.OBJ_cleanup()
109
110 libcrypto.OBJ_nid2sn.restype=c_char_p
111 libcrypto.OBJ_nid2ln.restype=c_char_p
112 libcrypto.OBJ_nid2obj.restype=c_void_p
113 libcrypto.OBJ_obj2txt.argtypes=(c_char_p,c_int,c_void_p,c_int)
114 libcrypto.OBJ_txt2nid.argtupes=(c_char_p,)
115 libcrypto.OBJ_create.argtypes=(c_char_p,c_char_p,c_char_p)