PageRenderTime 158ms CodeModel.GetById 24ms RepoModel.GetById 3ms app.codeStats 2ms

/security/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_cert.c

https://bitbucket.org/mkato/mozilla-1.9.0-win64
C | 3599 lines | 2283 code | 658 blank | 658 comment | 294 complexity | a2cff297d4276fb777167a69d835656c MD5 | raw file
Possible License(s): LGPL-3.0, MIT, BSD-3-Clause, MPL-2.0-no-copyleft-exception, GPL-2.0, LGPL-2.1

Large files files are truncated, but you can click here to view the full file

  1. /* ***** BEGIN LICENSE BLOCK *****
  2. * Version: MPL 1.1/GPL 2.0/LGPL 2.1
  3. *
  4. * The contents of this file are subject to the Mozilla Public License Version
  5. * 1.1 (the "License"); you may not use this file except in compliance with
  6. * the License. You may obtain a copy of the License at
  7. * http://www.mozilla.org/MPL/
  8. *
  9. * Software distributed under the License is distributed on an "AS IS" basis,
  10. * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  11. * for the specific language governing rights and limitations under the
  12. * License.
  13. *
  14. * The Original Code is the PKIX-C library.
  15. *
  16. * The Initial Developer of the Original Code is
  17. * Sun Microsystems, Inc.
  18. * Portions created by the Initial Developer are
  19. * Copyright 2004-2007 Sun Microsystems, Inc. All Rights Reserved.
  20. *
  21. * Contributor(s):
  22. * Sun Microsystems, Inc.
  23. *
  24. * Alternatively, the contents of this file may be used under the terms of
  25. * either the GNU General Public License Version 2 or later (the "GPL"), or
  26. * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
  27. * in which case the provisions of the GPL or the LGPL are applicable instead
  28. * of those above. If you wish to allow use of your version of this file only
  29. * under the terms of either the GPL or the LGPL, and not to allow others to
  30. * use your version of this file under the terms of the MPL, indicate your
  31. * decision by deleting the provisions above and replace them with the notice
  32. * and other provisions required by the GPL or the LGPL. If you do not delete
  33. * the provisions above, a recipient may use your version of this file under
  34. * the terms of any one of the MPL, the GPL or the LGPL.
  35. *
  36. * ***** END LICENSE BLOCK ***** */
  37. /*
  38. * pkix_pl_cert.c
  39. *
  40. * Certificate Object Functions
  41. *
  42. */
  43. #include "pkix_pl_cert.h"
  44. extern PKIX_PL_HashTable *cachedCertSigTable;
  45. /* --Private-Cert-Functions------------------------------------- */
  46. /*
  47. * FUNCTION: pkix_pl_Cert_IsExtensionCritical
  48. * DESCRIPTION:
  49. *
  50. * Checks the Cert specified by "cert" to determine whether the extension
  51. * whose tag is the UInt32 value given by "tag" is marked as a critical
  52. * extension, and stores the result in "pCritical".
  53. *
  54. * Tags are the index into the table "oids" of SECOidData defined in the
  55. * file secoid.c. Constants, such as SEC_OID_X509_CERTIFICATE_POLICIES, are
  56. * are defined in secoidt.h for most of the table entries.
  57. *
  58. * If the specified tag is invalid (not in the list of tags) or if the
  59. * extension is not found in the certificate, PKIX_FALSE is stored.
  60. *
  61. * PARAMETERS
  62. * "cert"
  63. * Address of Cert whose extensions are to be examined. Must be non-NULL.
  64. * "tag"
  65. * The UInt32 value of the tag for the extension whose criticality is
  66. * to be determined
  67. * "pCritical"
  68. * Address where the Boolean value will be stored. Must be non-NULL.
  69. * "plContext"
  70. * Platform-specific context pointer.
  71. * THREAD SAFETY:
  72. * Thread Safe (see Thread Safety Definitions in Programmer's Guide)
  73. * RETURNS:
  74. * Returns NULL if the function succeeds.
  75. * Returns a Fatal Error if the function fails in an unrecoverable way.
  76. */
  77. static PKIX_Error *
  78. pkix_pl_Cert_IsExtensionCritical(
  79. PKIX_PL_Cert *cert,
  80. PKIX_UInt32 tag,
  81. PKIX_Boolean *pCritical,
  82. void *plContext)
  83. {
  84. PKIX_Boolean criticality = PKIX_FALSE;
  85. CERTCertExtension **extensions = NULL;
  86. SECStatus rv;
  87. PKIX_ENTER(CERT, "pkix_pl_Cert_IsExtensionCritical");
  88. PKIX_NULLCHECK_THREE(cert, cert->nssCert, pCritical);
  89. extensions = cert->nssCert->extensions;
  90. PKIX_NULLCHECK_ONE(extensions);
  91. PKIX_CERT_DEBUG("\t\tCalling CERT_GetExtenCriticality).\n");
  92. rv = CERT_GetExtenCriticality(extensions, tag, &criticality);
  93. if (SECSuccess == rv) {
  94. *pCritical = criticality;
  95. } else {
  96. *pCritical = PKIX_FALSE;
  97. }
  98. PKIX_RETURN(CERT);
  99. }
  100. /*
  101. * FUNCTION: pkix_pl_Cert_DecodePolicyInfo
  102. * DESCRIPTION:
  103. *
  104. * Decodes the contents of the CertificatePolicy extension in the
  105. * CERTCertificate pointed to by "nssCert", to create a List of
  106. * CertPolicyInfos, which is stored at the address "pCertPolicyInfos".
  107. * A CERTCertificate contains the DER representation of the Cert.
  108. * If this certificate does not have a CertificatePolicy extension,
  109. * NULL will be stored. If a List is returned, it will be immutable.
  110. *
  111. * PARAMETERS
  112. * "nssCert"
  113. * Address of the Cert data whose extension is to be examined. Must be
  114. * non-NULL.
  115. * "pCertPolicyInfos"
  116. * Address where the List of CertPolicyInfos will be stored. Must be
  117. * non-NULL.
  118. * "plContext"
  119. * Platform-specific context pointer.
  120. * THREAD SAFETY:
  121. * Thread Safe (see Thread Safety Definitions in Programmer's Guide)
  122. * RETURNS:
  123. * Returns NULL if the function succeeds.
  124. * Returns a Cert Error if the function fails in a non-fatal way.
  125. * Returns a Fatal Error if the function fails in an unrecoverable way.
  126. */
  127. static PKIX_Error *
  128. pkix_pl_Cert_DecodePolicyInfo(
  129. CERTCertificate *nssCert,
  130. PKIX_List **pCertPolicyInfos,
  131. void *plContext)
  132. {
  133. SECStatus rv;
  134. SECItem encodedCertPolicyInfo;
  135. /* Allocated in the arena; freed in CERT_Destroy... */
  136. CERTCertificatePolicies *certPol = NULL;
  137. CERTPolicyInfo **policyInfos = NULL;
  138. CERTPolicyInfo *policyInfo = NULL;
  139. CERTPolicyQualifier **policyQualifiers = NULL;
  140. CERTPolicyQualifier *policyQualifier = NULL;
  141. /* Holder for the return value */
  142. PKIX_List *infos = NULL;
  143. char *oidAscii = NULL;
  144. PKIX_PL_OID *pkixOID = NULL;
  145. PKIX_List *qualifiers = NULL;
  146. PKIX_PL_CertPolicyInfo *certPolicyInfo = NULL;
  147. PKIX_PL_CertPolicyQualifier *certPolicyQualifier = NULL;
  148. PKIX_PL_ByteArray *qualifierArray = NULL;
  149. PKIX_ENTER(CERT, "pkix_pl_Cert_DecodePolicyInfo");
  150. PKIX_NULLCHECK_TWO(nssCert, pCertPolicyInfos);
  151. /* get PolicyInfo as a SECItem */
  152. PKIX_CERT_DEBUG("\t\tCERT_FindCertExtension).\n");
  153. rv = CERT_FindCertExtension
  154. (nssCert,
  155. SEC_OID_X509_CERTIFICATE_POLICIES,
  156. &encodedCertPolicyInfo);
  157. if (SECSuccess != rv) {
  158. *pCertPolicyInfos = NULL;
  159. goto cleanup;
  160. }
  161. /* translate PolicyInfo to CERTCertificatePolicies */
  162. PKIX_CERT_DEBUG("\t\tCERT_DecodeCertificatePoliciesExtension).\n");
  163. certPol = CERT_DecodeCertificatePoliciesExtension
  164. (&encodedCertPolicyInfo);
  165. PORT_Free(encodedCertPolicyInfo.data);
  166. if (NULL == certPol) {
  167. PKIX_ERROR(PKIX_CERTDECODECERTIFICATEPOLICIESEXTENSIONFAILED);
  168. }
  169. /*
  170. * Check whether there are any policyInfos, so we can
  171. * avoid creating an unnecessary List
  172. */
  173. policyInfos = certPol->policyInfos;
  174. if (!policyInfos) {
  175. *pCertPolicyInfos = NULL;
  176. goto cleanup;
  177. }
  178. /* create a List of CertPolicyInfo Objects */
  179. PKIX_CHECK(PKIX_List_Create(&infos, plContext),
  180. PKIX_LISTCREATEFAILED);
  181. /*
  182. * Traverse the CERTCertificatePolicies structure,
  183. * building each PKIX_PL_CertPolicyInfo object in turn
  184. */
  185. while (*policyInfos != NULL) {
  186. policyInfo = *policyInfos;
  187. policyQualifiers = policyInfo->policyQualifiers;
  188. if (policyQualifiers) {
  189. /* create a PKIX_List of PKIX_PL_CertPolicyQualifiers */
  190. PKIX_CHECK(PKIX_List_Create(&qualifiers, plContext),
  191. PKIX_LISTCREATEFAILED);
  192. while (*policyQualifiers != NULL) {
  193. policyQualifier = *policyQualifiers;
  194. /* create the qualifier's OID object */
  195. PKIX_CHECK(pkix_pl_oidBytes2Ascii
  196. (&(policyQualifier->qualifierID),
  197. &oidAscii,
  198. plContext),
  199. PKIX_OIDBYTES2ASCIIFAILED);
  200. PKIX_CHECK(PKIX_PL_OID_Create
  201. (oidAscii, &pkixOID, plContext),
  202. PKIX_OIDCREATEFAILED);
  203. /* create qualifier's ByteArray object */
  204. PKIX_CHECK(PKIX_PL_ByteArray_Create
  205. (policyQualifier->qualifierValue.data,
  206. policyQualifier->qualifierValue.len,
  207. &qualifierArray,
  208. plContext),
  209. PKIX_BYTEARRAYCREATEFAILED);
  210. /* create a CertPolicyQualifier object */
  211. PKIX_CHECK(pkix_pl_CertPolicyQualifier_Create
  212. (pkixOID,
  213. qualifierArray,
  214. &certPolicyQualifier,
  215. plContext),
  216. PKIX_CERTPOLICYQUALIFIERCREATEFAILED);
  217. PKIX_CHECK(PKIX_List_AppendItem
  218. (qualifiers,
  219. (PKIX_PL_Object *)certPolicyQualifier,
  220. plContext),
  221. PKIX_LISTAPPENDITEMFAILED);
  222. PKIX_FREE(oidAscii);
  223. PKIX_DECREF(pkixOID);
  224. PKIX_DECREF(qualifierArray);
  225. PKIX_DECREF(certPolicyQualifier);
  226. policyQualifiers++;
  227. }
  228. PKIX_CHECK(PKIX_List_SetImmutable
  229. (qualifiers, plContext),
  230. PKIX_LISTSETIMMUTABLEFAILED);
  231. }
  232. /*
  233. * Create an OID object pkixOID from policyInfo->policyID.
  234. * (The CERTPolicyInfo structure has an oid field, but it
  235. * is of type SECOidTag. This function wants a SECItem.)
  236. */
  237. PKIX_CHECK(pkix_pl_oidBytes2Ascii
  238. (&(policyInfo->policyID), &oidAscii, plContext),
  239. PKIX_OIDBYTES2ASCIIFAILED);
  240. PKIX_CHECK(PKIX_PL_OID_Create
  241. (oidAscii, &pkixOID, plContext),
  242. PKIX_OIDCREATEFAILED);
  243. /* Create a CertPolicyInfo object */
  244. PKIX_CHECK(pkix_pl_CertPolicyInfo_Create
  245. (pkixOID, qualifiers, &certPolicyInfo, plContext),
  246. PKIX_CERTPOLICYINFOCREATEFAILED);
  247. /* Append the new CertPolicyInfo object to the list */
  248. PKIX_CHECK(PKIX_List_AppendItem
  249. (infos, (PKIX_PL_Object *)certPolicyInfo, plContext),
  250. PKIX_LISTAPPENDITEMFAILED);
  251. PKIX_FREE(oidAscii);
  252. PKIX_DECREF(pkixOID);
  253. PKIX_DECREF(qualifiers);
  254. PKIX_DECREF(certPolicyInfo);
  255. policyInfos++;
  256. }
  257. /*
  258. * If there were no policies, we went straight to
  259. * cleanup, so we don't have to NULLCHECK infos.
  260. */
  261. PKIX_CHECK(PKIX_List_SetImmutable(infos, plContext),
  262. PKIX_LISTSETIMMUTABLEFAILED);
  263. *pCertPolicyInfos = infos;
  264. infos = NULL;
  265. cleanup:
  266. if (certPol) {
  267. PKIX_CERT_DEBUG
  268. ("\t\tCalling CERT_DestroyCertificatePoliciesExtension).\n");
  269. CERT_DestroyCertificatePoliciesExtension(certPol);
  270. }
  271. PKIX_FREE(oidAscii);
  272. PKIX_DECREF(infos);
  273. PKIX_DECREF(pkixOID);
  274. PKIX_DECREF(qualifiers);
  275. PKIX_DECREF(certPolicyInfo);
  276. PKIX_DECREF(certPolicyQualifier);
  277. PKIX_DECREF(qualifierArray);
  278. PKIX_RETURN(CERT);
  279. }
  280. /*
  281. * FUNCTION: pkix_pl_Cert_DecodePolicyMapping
  282. * DESCRIPTION:
  283. *
  284. * Decodes the contents of the PolicyMapping extension of the CERTCertificate
  285. * pointed to by "nssCert", storing the resulting List of CertPolicyMaps at
  286. * the address pointed to by "pCertPolicyMaps". If this certificate does not
  287. * have a PolicyMapping extension, NULL will be stored. If a List is returned,
  288. * it will be immutable.
  289. *
  290. * PARAMETERS
  291. * "nssCert"
  292. * Address of the Cert data whose extension is to be examined. Must be
  293. * non-NULL.
  294. * "pCertPolicyMaps"
  295. * Address where the List of CertPolicyMaps will be stored. Must be
  296. * non-NULL.
  297. * "plContext"
  298. * Platform-specific context pointer.
  299. * THREAD SAFETY:
  300. * Thread Safe (see Thread Safety Definitions in Programmer's Guide)
  301. * RETURNS:
  302. * Returns NULL if the function succeeds.
  303. * Returns a Cert Error if the function fails in a non-fatal way.
  304. * Returns a Fatal Error if the function fails in an unrecoverable way.
  305. */
  306. static PKIX_Error *
  307. pkix_pl_Cert_DecodePolicyMapping(
  308. CERTCertificate *nssCert,
  309. PKIX_List **pCertPolicyMaps,
  310. void *plContext)
  311. {
  312. SECStatus rv;
  313. SECItem encodedCertPolicyMaps;
  314. /* Allocated in the arena; freed in CERT_Destroy... */
  315. CERTCertificatePolicyMappings *certPolMaps = NULL;
  316. CERTPolicyMap **policyMaps = NULL;
  317. CERTPolicyMap *policyMap = NULL;
  318. /* Holder for the return value */
  319. PKIX_List *maps = NULL;
  320. char *issuerPolicyOIDAscii = NULL;
  321. char *subjectPolicyOIDAscii = NULL;
  322. PKIX_PL_OID *issuerDomainOID = NULL;
  323. PKIX_PL_OID *subjectDomainOID = NULL;
  324. PKIX_PL_CertPolicyMap *certPolicyMap = NULL;
  325. PKIX_ENTER(CERT, "pkix_pl_Cert_DecodePolicyMapping");
  326. PKIX_NULLCHECK_TWO(nssCert, pCertPolicyMaps);
  327. /* get PolicyMappings as a SECItem */
  328. PKIX_CERT_DEBUG("\t\tCERT_FindCertExtension).\n");
  329. rv = CERT_FindCertExtension
  330. (nssCert, SEC_OID_X509_POLICY_MAPPINGS, &encodedCertPolicyMaps);
  331. if (SECSuccess != rv) {
  332. *pCertPolicyMaps = NULL;
  333. goto cleanup;
  334. }
  335. /* translate PolicyMaps to CERTCertificatePolicyMappings */
  336. certPolMaps = CERT_DecodePolicyMappingsExtension
  337. (&encodedCertPolicyMaps);
  338. PORT_Free(encodedCertPolicyMaps.data);
  339. if (!certPolMaps) {
  340. PKIX_ERROR(PKIX_CERTDECODEPOLICYMAPPINGSEXTENSIONFAILED);
  341. }
  342. PKIX_NULLCHECK_ONE(certPolMaps->policyMaps);
  343. policyMaps = certPolMaps->policyMaps;
  344. /* create a List of CertPolicyMap Objects */
  345. PKIX_CHECK(PKIX_List_Create(&maps, plContext),
  346. PKIX_LISTCREATEFAILED);
  347. /*
  348. * Traverse the CERTCertificatePolicyMappings structure,
  349. * building each CertPolicyMap object in turn
  350. */
  351. do {
  352. policyMap = *policyMaps;
  353. /* create the OID for the issuer Domain Policy */
  354. PKIX_CHECK(pkix_pl_oidBytes2Ascii
  355. (&(policyMap->issuerDomainPolicy),
  356. &issuerPolicyOIDAscii,
  357. plContext),
  358. PKIX_OIDBYTES2ASCIIFAILED);
  359. PKIX_CHECK(PKIX_PL_OID_Create
  360. (issuerPolicyOIDAscii, &issuerDomainOID, plContext),
  361. PKIX_OIDCREATEFAILED);
  362. /* create the OID for the subject Domain Policy */
  363. PKIX_CHECK(pkix_pl_oidBytes2Ascii
  364. (&(policyMap->subjectDomainPolicy),
  365. &subjectPolicyOIDAscii,
  366. plContext),
  367. PKIX_OIDBYTES2ASCIIFAILED);
  368. PKIX_CHECK(PKIX_PL_OID_Create
  369. (subjectPolicyOIDAscii, &subjectDomainOID, plContext),
  370. PKIX_OIDCREATEFAILED);
  371. /* create the CertPolicyMap */
  372. PKIX_CHECK(pkix_pl_CertPolicyMap_Create
  373. (issuerDomainOID,
  374. subjectDomainOID,
  375. &certPolicyMap,
  376. plContext),
  377. PKIX_CERTPOLICYMAPCREATEFAILED);
  378. PKIX_CHECK(PKIX_List_AppendItem
  379. (maps, (PKIX_PL_Object *)certPolicyMap, plContext),
  380. PKIX_LISTAPPENDITEMFAILED);
  381. PKIX_FREE(issuerPolicyOIDAscii);
  382. PKIX_FREE(subjectPolicyOIDAscii);
  383. PKIX_DECREF(issuerDomainOID);
  384. PKIX_DECREF(subjectDomainOID);
  385. PKIX_DECREF(certPolicyMap);
  386. policyMaps++;
  387. } while (*policyMaps != NULL);
  388. PKIX_CHECK(PKIX_List_SetImmutable(maps, plContext),
  389. PKIX_LISTSETIMMUTABLEFAILED);
  390. *pCertPolicyMaps = maps;
  391. maps = NULL;
  392. cleanup:
  393. if (certPolMaps) {
  394. PKIX_CERT_DEBUG
  395. ("\t\tCalling CERT_DestroyPolicyMappingsExtension).\n");
  396. CERT_DestroyPolicyMappingsExtension(certPolMaps);
  397. }
  398. PKIX_FREE(issuerPolicyOIDAscii);
  399. PKIX_FREE(subjectPolicyOIDAscii);
  400. PKIX_DECREF(maps);
  401. PKIX_DECREF(issuerDomainOID);
  402. PKIX_DECREF(subjectDomainOID);
  403. PKIX_DECREF(certPolicyMap);
  404. PKIX_RETURN(CERT);
  405. }
  406. /*
  407. * FUNCTION: pkix_pl_Cert_DecodePolicyConstraints
  408. * DESCRIPTION:
  409. *
  410. * Decodes the contents of the PolicyConstraints extension in the
  411. * CERTCertificate pointed to by "nssCert", to obtain SkipCerts values
  412. * which are stored at the addresses "pExplicitPolicySkipCerts" and
  413. * "pInhibitMappingSkipCerts", respectively. If this certificate does
  414. * not have an PolicyConstraints extension, or if either of the optional
  415. * components is not supplied, this function stores a value of -1 for any
  416. * missing component.
  417. *
  418. * PARAMETERS
  419. * "nssCert"
  420. * Address of the Cert data whose extension is to be examined. Must be
  421. * non-NULL.
  422. * "pExplicitPolicySkipCerts"
  423. * Address where the SkipCert value for the requireExplicitPolicy
  424. * component will be stored. Must be non-NULL.
  425. * "pInhibitMappingSkipCerts"
  426. * Address where the SkipCert value for the inhibitPolicyMapping
  427. * component will be stored. Must be non-NULL.
  428. * "plContext"
  429. * Platform-specific context pointer.
  430. * THREAD SAFETY:
  431. * Thread Safe (see Thread Safety Definitions in Programmer's Guide)
  432. * RETURNS:
  433. * Returns NULL if the function succeeds.
  434. * Returns a Cert Error if the function fails in a non-fatal way.
  435. * Returns a Fatal Error if the function fails in an unrecoverable way.
  436. */
  437. static PKIX_Error *
  438. pkix_pl_Cert_DecodePolicyConstraints(
  439. CERTCertificate *nssCert,
  440. PKIX_Int32 *pExplicitPolicySkipCerts,
  441. PKIX_Int32 *pInhibitMappingSkipCerts,
  442. void *plContext)
  443. {
  444. CERTCertificatePolicyConstraints policyConstraints;
  445. SECStatus rv;
  446. SECItem encodedCertPolicyConstraints;
  447. PKIX_Int32 explicitPolicySkipCerts = -1;
  448. PKIX_Int32 inhibitMappingSkipCerts = -1;
  449. PKIX_ENTER(CERT, "pkix_pl_Cert_DecodePolicyConstraints");
  450. PKIX_NULLCHECK_THREE
  451. (nssCert, pExplicitPolicySkipCerts, pInhibitMappingSkipCerts);
  452. /* get the two skipCert values as SECItems */
  453. PKIX_CERT_DEBUG("\t\tCalling CERT_FindCertExtension).\n");
  454. rv = CERT_FindCertExtension
  455. (nssCert,
  456. SEC_OID_X509_POLICY_CONSTRAINTS,
  457. &encodedCertPolicyConstraints);
  458. if (rv == SECSuccess) {
  459. policyConstraints.explicitPolicySkipCerts.data =
  460. (unsigned char *)&explicitPolicySkipCerts;
  461. policyConstraints.inhibitMappingSkipCerts.data =
  462. (unsigned char *)&inhibitMappingSkipCerts;
  463. /* translate DER to CERTCertificatePolicyConstraints */
  464. rv = CERT_DecodePolicyConstraintsExtension
  465. (&policyConstraints, &encodedCertPolicyConstraints);
  466. PORT_Free(encodedCertPolicyConstraints.data);
  467. if (rv != SECSuccess) {
  468. PKIX_ERROR
  469. (PKIX_CERTDECODEPOLICYCONSTRAINTSEXTENSIONFAILED);
  470. }
  471. }
  472. *pExplicitPolicySkipCerts = explicitPolicySkipCerts;
  473. *pInhibitMappingSkipCerts = inhibitMappingSkipCerts;
  474. cleanup:
  475. PKIX_RETURN(CERT);
  476. }
  477. /*
  478. * FUNCTION: pkix_pl_Cert_DecodeInhibitAnyPolicy
  479. * DESCRIPTION:
  480. *
  481. * Decodes the contents of the InhibitAnyPolicy extension in the
  482. * CERTCertificate pointed to by "nssCert", to obtain a SkipCerts value,
  483. * which is stored at the address "pSkipCerts". If this certificate does
  484. * not have an InhibitAnyPolicy extension, -1 will be stored.
  485. *
  486. * PARAMETERS
  487. * "nssCert"
  488. * Address of the Cert data whose InhibitAnyPolicy extension is to be
  489. * processed. Must be non-NULL.
  490. * "pSkipCerts"
  491. * Address where the SkipCert value from the InhibitAnyPolicy extension
  492. * will be stored. Must be non-NULL.
  493. * "plContext"
  494. * Platform-specific context pointer.
  495. * THREAD SAFETY:
  496. * Thread Safe (see Thread Safety Definitions in Programmer's Guide)
  497. * RETURNS:
  498. * Returns NULL if the function succeeds.
  499. * Returns a Cert Error if the function fails in a non-fatal way.
  500. * Returns a Fatal Error if the function fails in an unrecoverable way.
  501. */
  502. PKIX_Error *
  503. pkix_pl_Cert_DecodeInhibitAnyPolicy(
  504. CERTCertificate *nssCert,
  505. PKIX_Int32 *pSkipCerts,
  506. void *plContext)
  507. {
  508. CERTCertificateInhibitAny inhibitAny;
  509. SECStatus rv;
  510. SECItem encodedCertInhibitAny;
  511. PKIX_Int32 skipCerts = -1;
  512. PKIX_ENTER(CERT, "pkix_pl_Cert_DecodeInhibitAnyPolicy");
  513. PKIX_NULLCHECK_TWO(nssCert, pSkipCerts);
  514. /* get InhibitAny as a SECItem */
  515. PKIX_CERT_DEBUG("\t\tCalling CERT_FindCertExtension).\n");
  516. rv = CERT_FindCertExtension
  517. (nssCert, SEC_OID_X509_INHIBIT_ANY_POLICY, &encodedCertInhibitAny);
  518. if (rv == SECSuccess) {
  519. inhibitAny.inhibitAnySkipCerts.data =
  520. (unsigned char *)&skipCerts;
  521. /* translate DER to CERTCertificateInhibitAny */
  522. rv = CERT_DecodeInhibitAnyExtension
  523. (&inhibitAny, &encodedCertInhibitAny);
  524. PORT_Free(encodedCertInhibitAny.data);
  525. if (rv != SECSuccess) {
  526. PKIX_ERROR(PKIX_CERTDECODEINHIBITANYEXTENSIONFAILED);
  527. }
  528. }
  529. *pSkipCerts = skipCerts;
  530. cleanup:
  531. PKIX_RETURN(CERT);
  532. }
  533. /*
  534. * FUNCTION: pkix_pl_Cert_GetNssSubjectAltNames
  535. * DESCRIPTION:
  536. *
  537. * Retrieves the Subject Alternative Names of the certificate specified by
  538. * "cert" and stores it at "pNssSubjAltNames". If the Subject Alternative
  539. * Name extension is not present, NULL is returned at "pNssSubjAltNames".
  540. * If the Subject Alternative Names has not been previously decoded, it is
  541. * decoded here with lock on the "cert" unless the flag "hasLock" indicates
  542. * the lock had been obtained at a higher call level.
  543. *
  544. * PARAMETERS
  545. * "cert"
  546. * Address of the certificate whose Subject Alternative Names extensions
  547. * is retrieved. Must be non-NULL.
  548. * "hasLock"
  549. * Boolean indicates caller has acquired a lock.
  550. * Must be non-NULL.
  551. * "pNssSubjAltNames"
  552. * Address where the returned Subject Alternative Names will be stored.
  553. * Must be non-NULL.
  554. * "plContext"
  555. * Platform-specific context pointer.
  556. * THREAD SAFETY:
  557. * Thread Safe (see Thread Safety Definitions in Programmer's Guide)
  558. * RETURNS:
  559. * Returns NULL if the function succeeds.
  560. * Returns a Cert Error if the function fails in a non-fatal way.
  561. * Returns a Fatal Error if the function fails in an unrecoverable way.
  562. */
  563. static PKIX_Error *
  564. pkix_pl_Cert_GetNssSubjectAltNames(
  565. PKIX_PL_Cert *cert,
  566. PKIX_Boolean hasLock,
  567. CERTGeneralName **pNssSubjAltNames,
  568. void *plContext)
  569. {
  570. CERTCertificate *nssCert = NULL;
  571. CERTGeneralName *nssOriginalAltName = NULL;
  572. PLArenaPool *arena = NULL;
  573. SECItem altNameExtension = {siBuffer, NULL, 0};
  574. SECStatus rv = SECFailure;
  575. PKIX_ENTER(CERT, "pkix_pl_Cert_GetNssSubjectAltNames");
  576. PKIX_NULLCHECK_THREE(cert, pNssSubjAltNames, cert->nssCert);
  577. nssCert = cert->nssCert;
  578. if ((cert->nssSubjAltNames == NULL) && (!cert->subjAltNamesAbsent)){
  579. if (!hasLock) {
  580. PKIX_OBJECT_LOCK(cert);
  581. }
  582. if ((cert->nssSubjAltNames == NULL) &&
  583. (!cert->subjAltNamesAbsent)){
  584. PKIX_PL_NSSCALLRV(CERT, rv, CERT_FindCertExtension,
  585. (nssCert,
  586. SEC_OID_X509_SUBJECT_ALT_NAME,
  587. &altNameExtension));
  588. if (rv != SECSuccess) {
  589. *pNssSubjAltNames = NULL;
  590. cert->subjAltNamesAbsent = PKIX_TRUE;
  591. goto cleanup;
  592. }
  593. if (cert->arenaNameConstraints == NULL) {
  594. PKIX_PL_NSSCALLRV(CERT, arena, PORT_NewArena,
  595. (DER_DEFAULT_CHUNKSIZE));
  596. if (arena == NULL) {
  597. PKIX_ERROR(PKIX_OUTOFMEMORY);
  598. }
  599. cert->arenaNameConstraints = arena;
  600. }
  601. PKIX_PL_NSSCALLRV
  602. (CERT,
  603. nssOriginalAltName,
  604. (CERTGeneralName *) CERT_DecodeAltNameExtension,
  605. (cert->arenaNameConstraints, &altNameExtension));
  606. PKIX_PL_NSSCALL(CERT, PORT_Free, (altNameExtension.data));
  607. if (nssOriginalAltName == NULL) {
  608. PKIX_ERROR(PKIX_CERTDECODEALTNAMEEXTENSIONFAILED);
  609. }
  610. cert->nssSubjAltNames = nssOriginalAltName;
  611. }
  612. if (!hasLock) {
  613. PKIX_OBJECT_UNLOCK(cert);
  614. }
  615. }
  616. *pNssSubjAltNames = cert->nssSubjAltNames;
  617. cleanup:
  618. PKIX_OBJECT_UNLOCK(lockedObject);
  619. PKIX_RETURN(CERT);
  620. }
  621. /*
  622. * FUNCTION: pkix_pl_Cert_CheckExtendKeyUsage
  623. * DESCRIPTION:
  624. *
  625. * For each of the ON bit in "requiredExtendedKeyUsages" that represents its
  626. * SECCertUsageEnum type, this function checks "cert"'s certType (extended
  627. * key usage) and key usage with what is required for SECCertUsageEnum type.
  628. *
  629. * PARAMETERS
  630. * "cert"
  631. * Address of the certificate whose Extended Key Usage extensions
  632. * is retrieved. Must be non-NULL.
  633. * "requiredExtendedKeyUsages"
  634. * An unsigned integer, its bit location is ON based on the required key
  635. * usage value representing in SECCertUsageEnum.
  636. * "pPass"
  637. * Address where the return value, indicating key usage check passed, is
  638. * stored. Must be non-NULL.
  639. * "plContext"
  640. * Platform-specific context pointer.
  641. * THREAD SAFETY:
  642. * Thread Safe (see Thread Safety Definitions in Programmer's Guide)
  643. * RETURNS:
  644. * Returns NULL if the function succeeds.
  645. * Returns a Cert Error if the function fails in a non-fatal way.
  646. * Returns a Fatal Error if the function fails in an unrecoverable way.
  647. */
  648. PKIX_Error *
  649. pkix_pl_Cert_CheckExtendedKeyUsage(
  650. PKIX_PL_Cert *cert,
  651. PKIX_UInt32 requiredExtendedKeyUsages,
  652. PKIX_Boolean *pPass,
  653. void *plContext)
  654. {
  655. PKIX_PL_CertBasicConstraints *basicConstraints = NULL;
  656. PKIX_UInt32 certType = 0;
  657. PKIX_UInt32 requiredKeyUsage = 0;
  658. PKIX_UInt32 requiredCertType = 0;
  659. PKIX_UInt32 requiredExtendedKeyUsage = 0;
  660. PKIX_UInt32 i;
  661. PKIX_Boolean isCA = PKIX_FALSE;
  662. SECStatus rv = SECFailure;
  663. PKIX_ENTER(CERT, "pkix_pl_Cert_CheckExtendKeyUsage");
  664. PKIX_NULLCHECK_THREE(cert, pPass, cert->nssCert);
  665. *pPass = PKIX_FALSE;
  666. PKIX_CERT_DEBUG("\t\tCalling cert_GetCertType).\n");
  667. cert_GetCertType(cert->nssCert);
  668. certType = cert->nssCert->nsCertType;
  669. PKIX_CHECK(PKIX_PL_Cert_GetBasicConstraints
  670. (cert,
  671. &basicConstraints,
  672. plContext),
  673. PKIX_CERTGETBASICCONSTRAINTFAILED);
  674. if (basicConstraints != NULL) {
  675. PKIX_CHECK(PKIX_PL_BasicConstraints_GetCAFlag
  676. (basicConstraints, &isCA, plContext),
  677. PKIX_BASICCONSTRAINTSGETCAFLAGFAILED);
  678. }
  679. i = 0;
  680. while (requiredExtendedKeyUsages != 0) {
  681. /* Find the bit location of the right-most non-zero bit */
  682. while (requiredExtendedKeyUsages != 0) {
  683. if (((1 << i) & requiredExtendedKeyUsages) != 0) {
  684. requiredExtendedKeyUsage = 1 << i;
  685. break;
  686. }
  687. i++;
  688. }
  689. requiredExtendedKeyUsages ^= requiredExtendedKeyUsage;
  690. requiredExtendedKeyUsage = i;
  691. PKIX_PL_NSSCALLRV(CERT, rv, CERT_KeyUsageAndTypeForCertUsage,
  692. (requiredExtendedKeyUsage,
  693. isCA,
  694. &requiredKeyUsage,
  695. &requiredCertType));
  696. if (!(certType & requiredCertType)) {
  697. goto cleanup;
  698. }
  699. PKIX_PL_NSSCALLRV(CERT, rv, CERT_CheckKeyUsage,
  700. (cert->nssCert, requiredKeyUsage));
  701. if (rv != SECSuccess) {
  702. goto cleanup;
  703. }
  704. i++;
  705. }
  706. *pPass = PKIX_TRUE;
  707. cleanup:
  708. PKIX_DECREF(basicConstraints);
  709. PKIX_RETURN(CERT);
  710. }
  711. /*
  712. * FUNCTION: pkix_pl_Cert_ToString_Helper
  713. * DESCRIPTION:
  714. *
  715. * Helper function that creates a string representation of the Cert pointed
  716. * to by "cert" and stores it at "pString", where the value of
  717. * "partialString" determines whether a full or partial representation of
  718. * the Cert is stored.
  719. *
  720. * PARAMETERS
  721. * "cert"
  722. * Address of Cert whose string representation is desired.
  723. * Must be non-NULL.
  724. * "partialString"
  725. * Boolean indicating whether a partial Cert representation is desired.
  726. * "pString"
  727. * Address where object pointer will be stored. Must be non-NULL.
  728. * "plContext"
  729. * Platform-specific context pointer.
  730. * THREAD SAFETY:
  731. * Thread Safe (see Thread Safety Definitions in Programmer's Guide)
  732. * RETURNS:
  733. * Returns NULL if the function succeeds.
  734. * Returns a Cert Error if the function fails in a non-fatal way.
  735. * Returns a Fatal Error if the function fails in an unrecoverable way.
  736. */
  737. PKIX_Error *
  738. pkix_pl_Cert_ToString_Helper(
  739. PKIX_PL_Cert *cert,
  740. PKIX_Boolean partialString,
  741. PKIX_PL_String **pString,
  742. void *plContext)
  743. {
  744. PKIX_PL_String *certString = NULL;
  745. char *asciiFormat = NULL;
  746. PKIX_PL_String *formatString = NULL;
  747. PKIX_UInt32 certVersion;
  748. PKIX_PL_BigInt *certSN = NULL;
  749. PKIX_PL_String *certSNString = NULL;
  750. PKIX_PL_X500Name *certIssuer = NULL;
  751. PKIX_PL_String *certIssuerString = NULL;
  752. PKIX_PL_X500Name *certSubject = NULL;
  753. PKIX_PL_String *certSubjectString = NULL;
  754. PKIX_PL_String *notBeforeString = NULL;
  755. PKIX_PL_String *notAfterString = NULL;
  756. PKIX_List *subjAltNames = NULL;
  757. PKIX_PL_String *subjAltNamesString = NULL;
  758. PKIX_PL_ByteArray *authKeyId = NULL;
  759. PKIX_PL_String *authKeyIdString = NULL;
  760. PKIX_PL_ByteArray *subjKeyId = NULL;
  761. PKIX_PL_String *subjKeyIdString = NULL;
  762. PKIX_PL_PublicKey *nssPubKey = NULL;
  763. PKIX_PL_String *nssPubKeyString = NULL;
  764. PKIX_List *critExtOIDs = NULL;
  765. PKIX_PL_String *critExtOIDsString = NULL;
  766. PKIX_List *extKeyUsages = NULL;
  767. PKIX_PL_String *extKeyUsagesString = NULL;
  768. PKIX_PL_CertBasicConstraints *basicConstraint = NULL;
  769. PKIX_PL_String *certBasicConstraintsString = NULL;
  770. PKIX_List *policyInfo = NULL;
  771. PKIX_PL_String *certPolicyInfoString = NULL;
  772. PKIX_List *certPolicyMappings = NULL;
  773. PKIX_PL_String *certPolicyMappingsString = NULL;
  774. PKIX_Int32 certExplicitPolicy = 0;
  775. PKIX_Int32 certInhibitMapping = 0;
  776. PKIX_Int32 certInhibitAnyPolicy = 0;
  777. PKIX_PL_CertNameConstraints *nameConstraints = NULL;
  778. PKIX_PL_String *nameConstraintsString = NULL;
  779. PKIX_List *authorityInfoAccess = NULL;
  780. PKIX_PL_String *authorityInfoAccessString = NULL;
  781. PKIX_List *subjectInfoAccess = NULL;
  782. PKIX_PL_String *subjectInfoAccessString = NULL;
  783. PKIX_ENTER(CERT, "pkix_pl_Cert_ToString_Helper");
  784. PKIX_NULLCHECK_THREE(cert, cert->nssCert, pString);
  785. /*
  786. * XXX Add to this format as certificate components are developed.
  787. */
  788. if (partialString){
  789. asciiFormat =
  790. "\t[Issuer: %s\n"
  791. "\t Subject: %s]";
  792. } else {
  793. asciiFormat =
  794. "[\n"
  795. "\tVersion: v%d\n"
  796. "\tSerialNumber: %s\n"
  797. "\tIssuer: %s\n"
  798. "\tSubject: %s\n"
  799. "\tValidity: [From: %s\n"
  800. "\t To: %s]\n"
  801. "\tSubjectAltNames: %s\n"
  802. "\tAuthorityKeyId: %s\n"
  803. "\tSubjectKeyId: %s\n"
  804. "\tSubjPubKeyAlgId: %s\n"
  805. "\tCritExtOIDs: %s\n"
  806. "\tExtKeyUsages: %s\n"
  807. "\tBasicConstraint: %s\n"
  808. "\tCertPolicyInfo: %s\n"
  809. "\tPolicyMappings: %s\n"
  810. "\tExplicitPolicy: %d\n"
  811. "\tInhibitMapping: %d\n"
  812. "\tInhibitAnyPolicy:%d\n"
  813. "\tNameConstraints: %s\n"
  814. "\tAuthorityInfoAccess: %s\n"
  815. "\tSubjectInfoAccess: %s\n"
  816. "\tCacheFlag: %d\n"
  817. "]\n";
  818. }
  819. PKIX_CHECK(PKIX_PL_String_Create
  820. (PKIX_ESCASCII, asciiFormat, 0, &formatString, plContext),
  821. PKIX_STRINGCREATEFAILED);
  822. /* Issuer */
  823. PKIX_CHECK(PKIX_PL_Cert_GetIssuer
  824. (cert, &certIssuer, plContext),
  825. PKIX_CERTGETISSUERFAILED);
  826. PKIX_CHECK(PKIX_PL_Object_ToString
  827. ((PKIX_PL_Object *)certIssuer, &certIssuerString, plContext),
  828. PKIX_X500NAMETOSTRINGFAILED);
  829. /* Subject */
  830. PKIX_CHECK(PKIX_PL_Cert_GetSubject(cert, &certSubject, plContext),
  831. PKIX_CERTGETSUBJECTFAILED);
  832. PKIX_TOSTRING(certSubject, &certSubjectString, plContext,
  833. PKIX_X500NAMETOSTRINGFAILED);
  834. if (partialString){
  835. PKIX_CHECK(PKIX_PL_Sprintf
  836. (&certString,
  837. plContext,
  838. formatString,
  839. certIssuerString,
  840. certSubjectString),
  841. PKIX_SPRINTFFAILED);
  842. *pString = certString;
  843. goto cleanup;
  844. }
  845. /* Version */
  846. PKIX_CHECK(PKIX_PL_Cert_GetVersion(cert, &certVersion, plContext),
  847. PKIX_CERTGETVERSIONFAILED);
  848. /* SerialNumber */
  849. PKIX_CHECK(PKIX_PL_Cert_GetSerialNumber(cert, &certSN, plContext),
  850. PKIX_CERTGETSERIALNUMBERFAILED);
  851. PKIX_CHECK(PKIX_PL_Object_ToString
  852. ((PKIX_PL_Object *)certSN, &certSNString, plContext),
  853. PKIX_BIGINTTOSTRINGFAILED);
  854. /* Validity: NotBefore */
  855. PKIX_CHECK(pkix_pl_Date_ToString_Helper
  856. (&(cert->nssCert->validity.notBefore),
  857. &notBeforeString,
  858. plContext),
  859. PKIX_DATETOSTRINGHELPERFAILED);
  860. /* Validity: NotAfter */
  861. PKIX_CHECK(pkix_pl_Date_ToString_Helper
  862. (&(cert->nssCert->validity.notAfter),
  863. &notAfterString,
  864. plContext),
  865. PKIX_DATETOSTRINGHELPERFAILED);
  866. /* SubjectAltNames */
  867. PKIX_CHECK(PKIX_PL_Cert_GetSubjectAltNames
  868. (cert, &subjAltNames, plContext),
  869. PKIX_CERTGETSUBJECTALTNAMESFAILED);
  870. PKIX_TOSTRING(subjAltNames, &subjAltNamesString, plContext,
  871. PKIX_LISTTOSTRINGFAILED);
  872. /* AuthorityKeyIdentifier */
  873. PKIX_CHECK(PKIX_PL_Cert_GetAuthorityKeyIdentifier
  874. (cert, &authKeyId, plContext),
  875. PKIX_CERTGETAUTHORITYKEYIDENTIFIERFAILED);
  876. PKIX_TOSTRING(authKeyId, &authKeyIdString, plContext,
  877. PKIX_BYTEARRAYTOSTRINGFAILED);
  878. /* SubjectKeyIdentifier */
  879. PKIX_CHECK(PKIX_PL_Cert_GetSubjectKeyIdentifier
  880. (cert, &subjKeyId, plContext),
  881. PKIX_CERTGETSUBJECTKEYIDENTIFIERFAILED);
  882. PKIX_TOSTRING(subjKeyId, &subjKeyIdString, plContext,
  883. PKIX_BYTEARRAYTOSTRINGFAILED);
  884. /* SubjectPublicKey */
  885. PKIX_CHECK(PKIX_PL_Cert_GetSubjectPublicKey
  886. (cert, &nssPubKey, plContext),
  887. PKIX_CERTGETSUBJECTPUBLICKEYFAILED);
  888. PKIX_CHECK(PKIX_PL_Object_ToString
  889. ((PKIX_PL_Object *)nssPubKey, &nssPubKeyString, plContext),
  890. PKIX_PUBLICKEYTOSTRINGFAILED);
  891. /* CriticalExtensionOIDs */
  892. PKIX_CHECK(PKIX_PL_Cert_GetCriticalExtensionOIDs
  893. (cert, &critExtOIDs, plContext),
  894. PKIX_CERTGETCRITICALEXTENSIONOIDSFAILED);
  895. PKIX_TOSTRING(critExtOIDs, &critExtOIDsString, plContext,
  896. PKIX_LISTTOSTRINGFAILED);
  897. /* ExtendedKeyUsages */
  898. PKIX_CHECK(PKIX_PL_Cert_GetExtendedKeyUsage
  899. (cert, &extKeyUsages, plContext),
  900. PKIX_CERTGETEXTENDEDKEYUSAGEFAILED);
  901. PKIX_TOSTRING(extKeyUsages, &extKeyUsagesString, plContext,
  902. PKIX_LISTTOSTRINGFAILED);
  903. /* CertBasicConstraints */
  904. PKIX_CHECK(PKIX_PL_Cert_GetBasicConstraints
  905. (cert, &basicConstraint, plContext),
  906. PKIX_CERTGETBASICCONSTRAINTSFAILED);
  907. PKIX_TOSTRING(basicConstraint, &certBasicConstraintsString, plContext,
  908. PKIX_CERTBASICCONSTRAINTSTOSTRINGFAILED);
  909. /* CertPolicyInfo */
  910. PKIX_CHECK(PKIX_PL_Cert_GetPolicyInformation
  911. (cert, &policyInfo, plContext),
  912. PKIX_CERTGETPOLICYINFORMATIONFAILED);
  913. PKIX_TOSTRING(policyInfo, &certPolicyInfoString, plContext,
  914. PKIX_LISTTOSTRINGFAILED);
  915. /* Advanced Policies */
  916. PKIX_CHECK(PKIX_PL_Cert_GetPolicyMappings
  917. (cert, &certPolicyMappings, plContext),
  918. PKIX_CERTGETPOLICYMAPPINGSFAILED);
  919. PKIX_TOSTRING(certPolicyMappings, &certPolicyMappingsString, plContext,
  920. PKIX_LISTTOSTRINGFAILED);
  921. PKIX_CHECK(PKIX_PL_Cert_GetRequireExplicitPolicy
  922. (cert, &certExplicitPolicy, plContext),
  923. PKIX_CERTGETREQUIREEXPLICITPOLICYFAILED);
  924. PKIX_CHECK(PKIX_PL_Cert_GetPolicyMappingInhibited
  925. (cert, &certInhibitMapping, plContext),
  926. PKIX_CERTGETPOLICYMAPPINGINHIBITEDFAILED);
  927. PKIX_CHECK(PKIX_PL_Cert_GetInhibitAnyPolicy
  928. (cert, &certInhibitAnyPolicy, plContext),
  929. PKIX_CERTGETINHIBITANYPOLICYFAILED);
  930. /* Name Constraints */
  931. PKIX_CHECK(PKIX_PL_Cert_GetNameConstraints
  932. (cert, &nameConstraints, plContext),
  933. PKIX_CERTGETNAMECONSTRAINTSFAILED);
  934. PKIX_TOSTRING(nameConstraints, &nameConstraintsString, plContext,
  935. PKIX_LISTTOSTRINGFAILED);
  936. /* Authority Information Access */
  937. PKIX_CHECK(PKIX_PL_Cert_GetAuthorityInfoAccess
  938. (cert, &authorityInfoAccess, plContext),
  939. PKIX_CERTGETAUTHORITYINFOACCESSFAILED);
  940. PKIX_TOSTRING(authorityInfoAccess, &authorityInfoAccessString, plContext,
  941. PKIX_LISTTOSTRINGFAILED);
  942. /* Subject Information Access */
  943. PKIX_CHECK(PKIX_PL_Cert_GetSubjectInfoAccess
  944. (cert, &subjectInfoAccess, plContext),
  945. PKIX_CERTGETSUBJECTINFOACCESSFAILED);
  946. PKIX_TOSTRING(subjectInfoAccess, &subjectInfoAccessString, plContext,
  947. PKIX_LISTTOSTRINGFAILED);
  948. PKIX_CHECK(PKIX_PL_Sprintf
  949. (&certString,
  950. plContext,
  951. formatString,
  952. certVersion + 1,
  953. certSNString,
  954. certIssuerString,
  955. certSubjectString,
  956. notBeforeString,
  957. notAfterString,
  958. subjAltNamesString,
  959. authKeyIdString,
  960. subjKeyIdString,
  961. nssPubKeyString,
  962. critExtOIDsString,
  963. extKeyUsagesString,
  964. certBasicConstraintsString,
  965. certPolicyInfoString,
  966. certPolicyMappingsString,
  967. certExplicitPolicy, /* an Int32, not a String */
  968. certInhibitMapping, /* an Int32, not a String */
  969. certInhibitAnyPolicy, /* an Int32, not a String */
  970. nameConstraintsString,
  971. authorityInfoAccessString,
  972. subjectInfoAccessString,
  973. cert->cacheFlag), /* a boolean */
  974. PKIX_SPRINTFFAILED);
  975. *pString = certString;
  976. cleanup:
  977. PKIX_DECREF(certSN);
  978. PKIX_DECREF(certSNString);
  979. PKIX_DECREF(certIssuer);
  980. PKIX_DECREF(certIssuerString);
  981. PKIX_DECREF(certSubject);
  982. PKIX_DECREF(certSubjectString);
  983. PKIX_DECREF(notBeforeString);
  984. PKIX_DECREF(notAfterString);
  985. PKIX_DECREF(subjAltNames);
  986. PKIX_DECREF(subjAltNamesString);
  987. PKIX_DECREF(authKeyId);
  988. PKIX_DECREF(authKeyIdString);
  989. PKIX_DECREF(subjKeyId);
  990. PKIX_DECREF(subjKeyIdString);
  991. PKIX_DECREF(nssPubKey);
  992. PKIX_DECREF(nssPubKeyString);
  993. PKIX_DECREF(critExtOIDs);
  994. PKIX_DECREF(critExtOIDsString);
  995. PKIX_DECREF(extKeyUsages);
  996. PKIX_DECREF(extKeyUsagesString);
  997. PKIX_DECREF(basicConstraint);
  998. PKIX_DECREF(certBasicConstraintsString);
  999. PKIX_DECREF(policyInfo);
  1000. PKIX_DECREF(certPolicyInfoString);
  1001. PKIX_DECREF(certPolicyMappings);
  1002. PKIX_DECREF(certPolicyMappingsString);
  1003. PKIX_DECREF(nameConstraints);
  1004. PKIX_DECREF(nameConstraintsString);
  1005. PKIX_DECREF(authorityInfoAccess);
  1006. PKIX_DECREF(authorityInfoAccessString);
  1007. PKIX_DECREF(subjectInfoAccess);
  1008. PKIX_DECREF(subjectInfoAccessString);
  1009. PKIX_DECREF(formatString);
  1010. PKIX_RETURN(CERT);
  1011. }
  1012. /*
  1013. * FUNCTION: pkix_pl_Cert_Destroy
  1014. * (see comments for PKIX_PL_DestructorCallback in pkix_pl_system.h)
  1015. */
  1016. static PKIX_Error *
  1017. pkix_pl_Cert_Destroy(
  1018. PKIX_PL_Object *object,
  1019. void *plContext)
  1020. {
  1021. PKIX_PL_Cert *cert = NULL;
  1022. PKIX_ENTER(CERT, "pkix_pl_Cert_Destroy");
  1023. PKIX_NULLCHECK_ONE(object);
  1024. PKIX_CHECK(pkix_CheckType(object, PKIX_CERT_TYPE, plContext),
  1025. PKIX_OBJECTNOTCERT);
  1026. cert = (PKIX_PL_Cert*)object;
  1027. PKIX_DECREF(cert->subject);
  1028. PKIX_DECREF(cert->issuer);
  1029. PKIX_DECREF(cert->subjAltNames);
  1030. PKIX_DECREF(cert->publicKeyAlgId);
  1031. PKIX_DECREF(cert->publicKey);
  1032. PKIX_DECREF(cert->serialNumber);
  1033. PKIX_DECREF(cert->critExtOids);
  1034. PKIX_DECREF(cert->authKeyId);
  1035. PKIX_DECREF(cert->subjKeyId);
  1036. PKIX_DECREF(cert->extKeyUsages);
  1037. PKIX_DECREF(cert->certBasicConstraints);
  1038. PKIX_DECREF(cert->certPolicyInfos);
  1039. PKIX_DECREF(cert->certPolicyMappings);
  1040. PKIX_DECREF(cert->nameConstraints);
  1041. PKIX_DECREF(cert->store);
  1042. PKIX_DECREF(cert->authorityInfoAccess);
  1043. PKIX_DECREF(cert->subjectInfoAccess);
  1044. if (cert->arenaNameConstraints){
  1045. /* This arena was allocated for SubjectAltNames */
  1046. PKIX_PL_NSSCALL(CERT, PORT_FreeArena,
  1047. (cert->arenaNameConstraints, PR_FALSE));
  1048. cert->arenaNameConstraints = NULL;
  1049. cert->nssSubjAltNames = NULL;
  1050. }
  1051. CERT_DestroyCertificate(cert->nssCert);
  1052. cert->nssCert = NULL;
  1053. cleanup:
  1054. PKIX_RETURN(CERT);
  1055. }
  1056. /*
  1057. * FUNCTION: pkix_pl_Cert_ToString
  1058. * (see comments for PKIX_PL_ToStringCallback in pkix_pl_system.h)
  1059. */
  1060. static PKIX_Error *
  1061. pkix_pl_Cert_ToString(
  1062. PKIX_PL_Object *object,
  1063. PKIX_PL_String **pString,
  1064. void *plContext)
  1065. {
  1066. PKIX_PL_String *certString = NULL;
  1067. PKIX_PL_Cert *pkixCert = NULL;
  1068. PKIX_ENTER(CERT, "pkix_pl_Cert_toString");
  1069. PKIX_NULLCHECK_TWO(object, pString);
  1070. PKIX_CHECK(pkix_CheckType(object, PKIX_CERT_TYPE, plContext),
  1071. PKIX_OBJECTNOTCERT);
  1072. pkixCert = (PKIX_PL_Cert *)object;
  1073. PKIX_CHECK(pkix_pl_Cert_ToString_Helper
  1074. (pkixCert, PKIX_FALSE, &certString, plContext),
  1075. PKIX_CERTTOSTRINGHELPERFAILED);
  1076. *pString = certString;
  1077. cleanup:
  1078. PKIX_RETURN(CERT);
  1079. }
  1080. /*
  1081. * FUNCTION: pkix_pl_Cert_Hashcode
  1082. * (see comments for PKIX_PL_HashcodeCallback in pkix_pl_system.h)
  1083. */
  1084. static PKIX_Error *
  1085. pkix_pl_Cert_Hashcode(
  1086. PKIX_PL_Object *object,
  1087. PKIX_UInt32 *pHashcode,
  1088. void *plContext)
  1089. {
  1090. PKIX_PL_Cert *pkixCert = NULL;
  1091. CERTCertificate *nssCert = NULL;
  1092. unsigned char *derBytes = NULL;
  1093. PKIX_UInt32 derLength;
  1094. PKIX_UInt32 certHash;
  1095. PKIX_ENTER(CERT, "pkix_pl_Cert_Hashcode");
  1096. PKIX_NULLCHECK_TWO(object, pHashcode);
  1097. PKIX_CHECK(pkix_CheckType(object, PKIX_CERT_TYPE, plContext),
  1098. PKIX_OBJECTNOTCERT);
  1099. pkixCert = (PKIX_PL_Cert *)object;
  1100. nssCert = pkixCert->nssCert;
  1101. derBytes = (nssCert->derCert).data;
  1102. derLength = (nssCert->derCert).len;
  1103. PKIX_CHECK(pkix_hash(derBytes, derLength, &certHash, plContext),
  1104. PKIX_HASHFAILED);
  1105. *pHashcode = certHash;
  1106. cleanup:
  1107. PKIX_RETURN(CERT);
  1108. }
  1109. /*
  1110. * FUNCTION: pkix_pl_Cert_Equals
  1111. * (see comments for PKIX_PL_Equals_Callback in pkix_pl_system.h)
  1112. */
  1113. static PKIX_Error *
  1114. pkix_pl_Cert_Equals(
  1115. PKIX_PL_Object *firstObject,
  1116. PKIX_PL_Object *secondObject,
  1117. PKIX_Boolean *pResult,
  1118. void *plContext)
  1119. {
  1120. CERTCertificate *firstCert = NULL;
  1121. CERTCertificate *secondCert = NULL;
  1122. PKIX_UInt32 secondType;
  1123. PKIX_Boolean cmpResult;
  1124. PKIX_ENTER(CERT, "pkix_pl_Cert_Equals");
  1125. PKIX_NULLCHECK_THREE(firstObject, secondObject, pResult);
  1126. /* test that firstObject is a Cert */
  1127. PKIX_CHECK(pkix_CheckType(firstObject, PKIX_CERT_TYPE, plContext),
  1128. PKIX_FIRSTOBJECTNOTCERT);
  1129. /*
  1130. * Since we know firstObject is a Cert, if both references are
  1131. * identical, they must be equal
  1132. */
  1133. if (firstObject == secondObject){
  1134. *pResult = PKIX_TRUE;
  1135. goto cleanup;
  1136. }
  1137. /*
  1138. * If secondObject isn't a Cert, we don't throw an error.
  1139. * We simply return a Boolean result of FALSE
  1140. */
  1141. *pResult = PKIX_FALSE;
  1142. PKIX_CHECK(PKIX_PL_Object_GetType
  1143. (secondObject, &secondType, plContext),
  1144. PKIX_COULDNOTGETTYPEOFSECONDARGUMENT);
  1145. if (secondType != PKIX_CERT_TYPE) goto cleanup;
  1146. firstCert = ((PKIX_PL_Cert *)firstObject)->nssCert;
  1147. secondCert = ((PKIX_PL_Cert *)secondObject)->nssCert;
  1148. PKIX_NULLCHECK_TWO(firstCert, secondCert);
  1149. /* CERT_CompareCerts does byte comparison on DER encodings of certs */
  1150. PKIX_CERT_DEBUG("\t\tCalling CERT_CompareCerts).\n");
  1151. cmpResult = CERT_CompareCerts(firstCert, secondCert);
  1152. *pResult = cmpResult;
  1153. cleanup:
  1154. PKIX_RETURN(CERT);
  1155. }
  1156. /*
  1157. * FUNCTION: pkix_pl_Cert_RegisterSelf
  1158. * DESCRIPTION:
  1159. * Registers PKIX_CERT_TYPE and its related functions with systemClasses[]
  1160. * THREAD SAFETY:
  1161. * Not Thread Safe - for performance and complexity reasons
  1162. *
  1163. * Since this function is only called by PKIX_PL_Initialize, which should
  1164. * only be called once, it is acceptable that this function is not
  1165. * thread-safe.
  1166. */
  1167. PKIX_Error *
  1168. pkix_pl_Cert_RegisterSelf(void *plContext)
  1169. {
  1170. extern pkix_ClassTable_Entry systemClasses[PKIX_NUMTYPES];
  1171. pkix_ClassTable_Entry entry;
  1172. PKIX_ENTER(CERT, "pkix_pl_Cert_RegisterSelf");
  1173. entry.description = "Cert";
  1174. entry.objCounter = 0;
  1175. entry.typeObjectSize = sizeof(PKIX_PL_Cert);
  1176. entry.destructor = pkix_pl_Cert_Destroy;
  1177. entry.equalsFunction = pkix_pl_Cert_Equals;
  1178. entry.hashcodeFunction = pkix_pl_Cert_Hashcode;
  1179. entry.toStringFunction = pkix_pl_Cert_ToString;
  1180. entry.comparator = NULL;
  1181. entry.duplicateFunction = pkix_duplicateImmutable;
  1182. systemClasses[PKIX_CERT_TYPE] = entry;
  1183. PKIX_RETURN(CERT);
  1184. }
  1185. /*
  1186. * FUNCTION: pkix_pl_Cert_CreateWithNSSCert
  1187. * DESCRIPTION:
  1188. *
  1189. * Creates …

Large files files are truncated, but you can click here to view the full file