nsNSSCertTrust.cpp 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. /* This Source Code Form is subject to the terms of the Mozilla Public
  2. * License, v. 2.0. If a copy of the MPL was not distributed with this
  3. * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
  4. #include "nsNSSCertTrust.h"
  5. void
  6. nsNSSCertTrust::AddCATrust(bool ssl, bool email, bool objSign)
  7. {
  8. if (ssl) {
  9. addTrust(&mTrust.sslFlags, CERTDB_TRUSTED_CA);
  10. addTrust(&mTrust.sslFlags, CERTDB_TRUSTED_CLIENT_CA);
  11. }
  12. if (email) {
  13. addTrust(&mTrust.emailFlags, CERTDB_TRUSTED_CA);
  14. addTrust(&mTrust.emailFlags, CERTDB_TRUSTED_CLIENT_CA);
  15. }
  16. if (objSign) {
  17. addTrust(&mTrust.objectSigningFlags, CERTDB_TRUSTED_CA);
  18. addTrust(&mTrust.objectSigningFlags, CERTDB_TRUSTED_CLIENT_CA);
  19. }
  20. }
  21. void
  22. nsNSSCertTrust::AddPeerTrust(bool ssl, bool email, bool objSign)
  23. {
  24. if (ssl)
  25. addTrust(&mTrust.sslFlags, CERTDB_TRUSTED);
  26. if (email)
  27. addTrust(&mTrust.emailFlags, CERTDB_TRUSTED);
  28. if (objSign)
  29. addTrust(&mTrust.objectSigningFlags, CERTDB_TRUSTED);
  30. }
  31. nsNSSCertTrust::nsNSSCertTrust()
  32. {
  33. memset(&mTrust, 0, sizeof(CERTCertTrust));
  34. }
  35. nsNSSCertTrust::nsNSSCertTrust(unsigned int ssl,
  36. unsigned int email,
  37. unsigned int objsign)
  38. {
  39. memset(&mTrust, 0, sizeof(CERTCertTrust));
  40. addTrust(&mTrust.sslFlags, ssl);
  41. addTrust(&mTrust.emailFlags, email);
  42. addTrust(&mTrust.objectSigningFlags, objsign);
  43. }
  44. nsNSSCertTrust::nsNSSCertTrust(CERTCertTrust *t)
  45. {
  46. if (t)
  47. memcpy(&mTrust, t, sizeof(CERTCertTrust));
  48. else
  49. memset(&mTrust, 0, sizeof(CERTCertTrust));
  50. }
  51. nsNSSCertTrust::~nsNSSCertTrust()
  52. {
  53. }
  54. void
  55. nsNSSCertTrust::SetSSLTrust(bool peer, bool tPeer,
  56. bool ca, bool tCA, bool tClientCA,
  57. bool user, bool warn)
  58. {
  59. mTrust.sslFlags = 0;
  60. if (peer || tPeer)
  61. addTrust(&mTrust.sslFlags, CERTDB_TERMINAL_RECORD);
  62. if (tPeer)
  63. addTrust(&mTrust.sslFlags, CERTDB_TRUSTED);
  64. if (ca || tCA)
  65. addTrust(&mTrust.sslFlags, CERTDB_VALID_CA);
  66. if (tClientCA)
  67. addTrust(&mTrust.sslFlags, CERTDB_TRUSTED_CLIENT_CA);
  68. if (tCA)
  69. addTrust(&mTrust.sslFlags, CERTDB_TRUSTED_CA);
  70. if (user)
  71. addTrust(&mTrust.sslFlags, CERTDB_USER);
  72. if (warn)
  73. addTrust(&mTrust.sslFlags, CERTDB_SEND_WARN);
  74. }
  75. void
  76. nsNSSCertTrust::SetEmailTrust(bool peer, bool tPeer,
  77. bool ca, bool tCA, bool tClientCA,
  78. bool user, bool warn)
  79. {
  80. mTrust.emailFlags = 0;
  81. if (peer || tPeer)
  82. addTrust(&mTrust.emailFlags, CERTDB_TERMINAL_RECORD);
  83. if (tPeer)
  84. addTrust(&mTrust.emailFlags, CERTDB_TRUSTED);
  85. if (ca || tCA)
  86. addTrust(&mTrust.emailFlags, CERTDB_VALID_CA);
  87. if (tClientCA)
  88. addTrust(&mTrust.emailFlags, CERTDB_TRUSTED_CLIENT_CA);
  89. if (tCA)
  90. addTrust(&mTrust.emailFlags, CERTDB_TRUSTED_CA);
  91. if (user)
  92. addTrust(&mTrust.emailFlags, CERTDB_USER);
  93. if (warn)
  94. addTrust(&mTrust.emailFlags, CERTDB_SEND_WARN);
  95. }
  96. void
  97. nsNSSCertTrust::SetObjSignTrust(bool peer, bool tPeer,
  98. bool ca, bool tCA, bool tClientCA,
  99. bool user, bool warn)
  100. {
  101. mTrust.objectSigningFlags = 0;
  102. if (peer || tPeer)
  103. addTrust(&mTrust.objectSigningFlags, CERTDB_TERMINAL_RECORD);
  104. if (tPeer)
  105. addTrust(&mTrust.objectSigningFlags, CERTDB_TRUSTED);
  106. if (ca || tCA)
  107. addTrust(&mTrust.objectSigningFlags, CERTDB_VALID_CA);
  108. if (tClientCA)
  109. addTrust(&mTrust.objectSigningFlags, CERTDB_TRUSTED_CLIENT_CA);
  110. if (tCA)
  111. addTrust(&mTrust.objectSigningFlags, CERTDB_TRUSTED_CA);
  112. if (user)
  113. addTrust(&mTrust.objectSigningFlags, CERTDB_USER);
  114. if (warn)
  115. addTrust(&mTrust.objectSigningFlags, CERTDB_SEND_WARN);
  116. }
  117. void
  118. nsNSSCertTrust::SetValidCA()
  119. {
  120. SetSSLTrust(false, false,
  121. true, false, false,
  122. false, false);
  123. SetEmailTrust(false, false,
  124. true, false, false,
  125. false, false);
  126. SetObjSignTrust(false, false,
  127. true, false, false,
  128. false, false);
  129. }
  130. void
  131. nsNSSCertTrust::SetValidPeer()
  132. {
  133. SetSSLTrust(true, false,
  134. false, false, false,
  135. false, false);
  136. SetEmailTrust(true, false,
  137. false, false, false,
  138. false, false);
  139. SetObjSignTrust(true, false,
  140. false, false, false,
  141. false, false);
  142. }
  143. bool
  144. nsNSSCertTrust::HasAnyCA()
  145. {
  146. if (hasTrust(mTrust.sslFlags, CERTDB_VALID_CA) ||
  147. hasTrust(mTrust.emailFlags, CERTDB_VALID_CA) ||
  148. hasTrust(mTrust.objectSigningFlags, CERTDB_VALID_CA))
  149. return true;
  150. return false;
  151. }
  152. bool
  153. nsNSSCertTrust::HasPeer(bool checkSSL,
  154. bool checkEmail,
  155. bool checkObjSign)
  156. {
  157. if (checkSSL && !hasTrust(mTrust.sslFlags, CERTDB_TERMINAL_RECORD))
  158. return false;
  159. if (checkEmail && !hasTrust(mTrust.emailFlags, CERTDB_TERMINAL_RECORD))
  160. return false;
  161. if (checkObjSign && !hasTrust(mTrust.objectSigningFlags, CERTDB_TERMINAL_RECORD))
  162. return false;
  163. return true;
  164. }
  165. bool
  166. nsNSSCertTrust::HasAnyUser()
  167. {
  168. if (hasTrust(mTrust.sslFlags, CERTDB_USER) ||
  169. hasTrust(mTrust.emailFlags, CERTDB_USER) ||
  170. hasTrust(mTrust.objectSigningFlags, CERTDB_USER))
  171. return true;
  172. return false;
  173. }
  174. bool
  175. nsNSSCertTrust::HasTrustedCA(bool checkSSL,
  176. bool checkEmail,
  177. bool checkObjSign)
  178. {
  179. if (checkSSL && !(hasTrust(mTrust.sslFlags, CERTDB_TRUSTED_CA) ||
  180. hasTrust(mTrust.sslFlags, CERTDB_TRUSTED_CLIENT_CA)))
  181. return false;
  182. if (checkEmail && !(hasTrust(mTrust.emailFlags, CERTDB_TRUSTED_CA) ||
  183. hasTrust(mTrust.emailFlags, CERTDB_TRUSTED_CLIENT_CA)))
  184. return false;
  185. if (checkObjSign &&
  186. !(hasTrust(mTrust.objectSigningFlags, CERTDB_TRUSTED_CA) ||
  187. hasTrust(mTrust.objectSigningFlags, CERTDB_TRUSTED_CLIENT_CA)))
  188. return false;
  189. return true;
  190. }
  191. bool
  192. nsNSSCertTrust::HasTrustedPeer(bool checkSSL,
  193. bool checkEmail,
  194. bool checkObjSign)
  195. {
  196. if (checkSSL && !(hasTrust(mTrust.sslFlags, CERTDB_TRUSTED)))
  197. return false;
  198. if (checkEmail && !(hasTrust(mTrust.emailFlags, CERTDB_TRUSTED)))
  199. return false;
  200. if (checkObjSign &&
  201. !(hasTrust(mTrust.objectSigningFlags, CERTDB_TRUSTED)))
  202. return false;
  203. return true;
  204. }
  205. void
  206. nsNSSCertTrust::addTrust(unsigned int *t, unsigned int v)
  207. {
  208. *t |= v;
  209. }
  210. bool
  211. nsNSSCertTrust::hasTrust(unsigned int t, unsigned int v)
  212. {
  213. return !!(t & v);
  214. }