CRL.C
上传用户:zbbssh
上传日期:2007-01-08
资源大小:196k
文件大小:8k
源码类别:

CA认证

开发平台:

C/C++

  1. /*
  2. ------------------------------------------------------------------
  3.   Copyright
  4.   Sun Microsystems, Inc.
  5.   Copyright (C) 1994, 1995, 1996 Sun Microsystems, Inc.  All Rights
  6.   Reserved.
  7.   Permission is hereby granted, free of charge, to any person
  8.   obtaining a copy of this software and associated documentation
  9.   files (the "Software"), to deal in the Software without
  10.   restriction, including without limitation the rights to use,
  11.   copy, modify, merge, publish, distribute, sublicense, and/or sell
  12.   copies of the Software or derivatives of the Software, and to 
  13.   permit persons to whom the Software or its derivatives is furnished 
  14.   to do so, subject to the following conditions:
  15.   The above copyright notice and this permission notice shall be
  16.   included in all copies or substantial portions of the Software.
  17.   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  18.   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
  19.   OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  20.   NONINFRINGEMENT.  IN NO EVENT SHALL SUN MICROSYSTEMS, INC., BE LIABLE
  21.   FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
  22.   OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  23.   CONNECTION WITH THE SOFTWARE OR DERIVATES OF THIS SOFTWARE OR 
  24.   THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  25.   Except as contained in this notice, the name of Sun Microsystems, Inc.
  26.   shall not be used in advertising or otherwise to promote
  27.   the sale, use or other dealings in this Software or its derivatives 
  28.   without prior written authorization from Sun Microsystems, Inc.
  29. */
  30. #pragma ident "@(#)CRL.C 1.10 96/01/29 Sun Microsystems"
  31. #include <sys/types.h>
  32. #include <stdarg.h>
  33. #include <stdio.h>
  34. #ifdef RW
  35. #include <rw/slistcol.h>
  36. #else
  37. #ifdef GLIB
  38. #include <SLList.h>
  39. #include <Pix.h>
  40. #endif
  41. #endif
  42. #include "Time.h"
  43. #include "Bigint.h"
  44. #include "Bstream.h"
  45. #include "asn1_der.h"
  46. #include "ObjId.h"
  47. #include "Name.h"
  48. #include "X509Cert.h"
  49. #include "Sig.h"
  50. #include "CRL.h"
  51. #ifdef RW
  52. // XXX Convert the following to use CRL objects
  53. Bstream
  54. initial_CRL(const Bstream& privkey, const char *issuername, int months)
  55. {
  56. Bstream tmpstr, tobesigned, signature, algid, nullbstr;
  57. Name nullname;
  58. Name issuer(issuername);
  59. if (issuer == nullname) {
  60. fprintf(stderr, "Issuer name '%s' syntax incorrect.n");
  61. return (nullbstr);
  62. }
  63. tmpstr = asn1_der_encode_null();
  64. // XXX - need to add support for different signature algs 
  65. // tmpstr = md2WithRSAEncryption.encode() + tmpstr;
  66. tmpstr = dsaWithSHA.encode() + tmpstr;
  67. tmpstr = algid = asn1_der_encode_sequence(tmpstr); // Alg ID
  68. tmpstr = tmpstr + issuer.encode();
  69. PCTime lastUpdate = timenow();
  70. GMtime gtime = lastUpdate.get();
  71. {
  72. gtime.year += months / 12;
  73. gtime.month += months % 12; // 0 - 11 months
  74. if (gtime.month > 12) {
  75. gtime.year += gtime.month / 12;
  76. gtime.month = gtime.month % 12; // 1 - 11 months
  77. }
  78. }
  79. PCTime nextUpdate(gtime);
  80. tmpstr = tmpstr + asn1_der_encode_utctime(lastUpdate);
  81. tmpstr = tmpstr + asn1_der_encode_utctime(nextUpdate);
  82. // Initially there are no revoked certificates, so we
  83. // leave out the optional CRLEntry list.
  84. tobesigned = asn1_der_encode_sequence(tmpstr);
  85. // XXX - need to add support for different signature algs 
  86. // tmpstr = sign(tobesigned, privkey, md2WithRSAEncryption);
  87. tmpstr = sign(tobesigned, privkey, dsaWithSHA);
  88. signature = asn1_der_encode_bit_string(tmpstr);
  89. tmpstr = tobesigned + algid + signature;
  90. return (asn1_der_encode_sequence(tmpstr));
  91. }
  92. int
  93. asn1_der_decode_CRL(Bstream& der_stream, CRL& crl)
  94. {
  95. byte tmp = 0;
  96. int  seqlen, seqoflen, retval;
  97. crl.decode(der_stream); // Decode a generic SIGNED object
  98. der_stream = crl.getinput(); // Get ToBeSigned
  99. // Decode CRL specific data (ToBeSigned)
  100. SEQUENCE {
  101. int begin, end, used;
  102. MARK_LEN(begin);
  103. ALGID(crl.sigalg);
  104. NAME(crl.issuer);
  105. UTCTime(crl.lastUpdate);
  106. UTCTime(crl.nextUpdate);
  107. // walk down sequence-of
  108. // sequence-of is optional
  109. // check for presence
  110. MARK_LEN(end);
  111. used = begin - end;
  112. if (used < seqlen) { // we have revoked certificates
  113. int seqlenwhdr, consumed;
  114. CRLentry *crlentry;
  115. Bigint serialNumber;
  116. PCTime   revocationDate;
  117. BEGIN_SEQUENCE_OF
  118. SEQUENCE {
  119. INTEGER(serialNumber);
  120. UTCTime(revocationDate);
  121. }
  122. crlentry = new CRLentry;
  123. crlentry->serialnum = serialNumber;
  124. crlentry->revocationdate = revocationDate;
  125. crl.revokedlist.insert(crlentry);
  126. END_SEQUENCE_OF
  127. }
  128. }
  129. return (SUCCESS);
  130. }
  131. // CRLentry friend function
  132. Boolean
  133. operator ==(const CRLentry& a, const CRLentry& b)
  134. {
  135. if (a.serialnum == b.serialnum)
  136. return (TRUE);
  137. else
  138. return (FALSE);
  139. }
  140. /*
  141.  * CRL class implementation.
  142.  */
  143. CRL::CRL()
  144. {
  145. // Private member constructors
  146. }
  147. CRL::~CRL()
  148. {
  149. // Private member destructors
  150. }
  151. CRL::CRL(const CRL &a)
  152. {
  153. sigalg = a.sigalg;
  154. issuer = a.issuer;
  155. lastUpdate = a.lastUpdate;
  156. nextUpdate = a.nextUpdate;
  157. revokedlist = a.revokedlist;
  158. return;
  159. }
  160. CRL&
  161. CRL:: operator =(const CRL &a)
  162. {
  163. sigalg = a.sigalg;
  164. issuer = a.issuer;
  165. lastUpdate = a.lastUpdate;
  166. nextUpdate = a.nextUpdate;
  167. revokedlist = a.revokedlist;
  168. return (*this);
  169. }
  170. // Supply encoded CRL object. This will decode it into
  171. // constituent parts.
  172. CRL::CRL(const Bstream& ainput)
  173. {
  174. Bstream der_stream = ainput;
  175. // Decode to get the rest of the fields
  176. (void)asn1_der_decode_CRL(der_stream, *this);
  177. return;
  178. }
  179. // Initialize a CRL from its input parts.
  180. // Still need to do a sign on the base object
  181. // in order to get an encoded CRL.
  182. CRL::CRL(const AlgId& algid, const Name& aissuername, const PCTime& alast,
  183.  const PCTime& anext, const Slist& arevokedlist)
  184. {
  185. sigalg = algid;
  186. issuer = aissuername;
  187. lastUpdate = alast;
  188. nextUpdate = anext;
  189. revokedlist = arevokedlist;
  190. return;
  191. }
  192. // Each derived class of Signed:: contains a routine to
  193. // encode the derived class specific information. This
  194. // routine does this for a CRL.
  195. Bstream
  196. CRL::encode()
  197. {
  198. Bstream tmpstr;
  199. tmpstr = asn1_der_encode_null(); // XXX Assume NULL params
  200. tmpstr = sigalg.algid.encode() + tmpstr;
  201. tmpstr = asn1_der_encode_sequence(tmpstr); // Alg ID
  202. tmpstr = tmpstr + issuer.encode();
  203. tmpstr = tmpstr + asn1_der_encode_utctime(lastUpdate);
  204. tmpstr = tmpstr + asn1_der_encode_utctime(nextUpdate);
  205. // Encode the CRL entries
  206. CRLentry *next;
  207. SlistIterator iter(revokedlist);
  208. Bstream seq, seqof;
  209. while (next = (CRLentry *)iter()) {
  210. seq = asn1_der_encode_integer(next->serialnum);
  211. seq = seq + asn1_der_encode_utctime(next->revocationdate);
  212. seq = asn1_der_encode_sequence(seq);
  213. seqof = seqof + seq;
  214. }
  215. if (seqof.getlength() > 0) {
  216. seqof = asn1_der_encode_sequence_of(seqof);
  217. tmpstr = tmpstr + seqof;
  218. }
  219. return (asn1_der_encode_sequence(tmpstr));
  220. }
  221. void
  222. CRL::setRevokedList(const PCTime& last, const PCTime& next, const Slist& arl)
  223. {
  224. lastUpdate = last;
  225. nextUpdate = next;
  226. revokedlist = arl;
  227. }
  228. AlgId
  229. CRL::getSigAlg() const
  230. {
  231. return (sigalg);
  232. }
  233. PCTime
  234. CRL::getLastUpdate() const
  235. {
  236. return (lastUpdate);
  237. }
  238. PCTime
  239. CRL::getNextUpdate() const
  240. {
  241. return (nextUpdate);
  242. }
  243. Name
  244. CRL::getIssuer() const
  245. {
  246. return (issuer);
  247. }
  248. Slist
  249. CRL::getAllRevoked() const
  250. {
  251. return (revokedlist);
  252. }
  253. Boolean
  254. CRL::isRevoked(const Bigint& aserialnumber) const
  255. {
  256. CRLentry dummy;
  257. dummy.serialnum = aserialnumber;
  258. CRLentry *found = (CRLentry *)revokedlist.find(&dummy);
  259. if (found == NULL)
  260. return (BOOL_FALSE);
  261. else 
  262. return (BOOL_TRUE);
  263. }
  264. // print the contents of the CRL
  265. void
  266. CRL::print() const
  267. {
  268. printf("Issuer = "); issuer.print(); printf("n");
  269. printf("Last Update = "); lastUpdate.print(); printf("n");
  270. printf("Next Update = "); nextUpdate.print(); printf("n");
  271. printf("CRL Signature Algorithm Identifier = n"); 
  272. sigalg.algid.print();
  273. if (sigalg.algid == md2WithRSAEncryption)
  274. printf(" == MD2-WITH-RSA-ENCRYPTION");
  275. else if (sigalg.algid == dsaWithSHA)
  276. printf(" == SHA-WITH-DSA-SIGNATURE");
  277. printf("n");
  278. printf("Revoked Certificates =n");
  279. CRLentry *next;
  280. #ifdef RW
  281. Slist list = revokedlist;
  282. SlistIterator iter(list);
  283. while (next = (CRLentry *)iter()) {
  284. printf("Serial # "); next->serialnum.print(); printf(" ");
  285. printf("Revocation Date = "); next->revocationdate.print(); 
  286. printf("n");
  287. }
  288. #endif
  289. }
  290. // Encode a CRL which has been supplied its input 
  291. // parts. First use member function to get encoding 
  292. // of ToBeSigned, and then sign and compute SIGNED
  293. // encoding of object. Supply tobesigned, to base
  294. // class Signed::sign() member function.
  295. Bstream
  296. asn1_der_encode_CRL(CRL& crl, const AlgId& sigalg, const Bstream& privkey)
  297. {
  298. Bstream tobesigned = crl.encode();
  299. return (crl.sign(tobesigned, privkey, sigalg));
  300. }
  301. #endif