nsNSSCertificateFakeTransport.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479
  1. /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
  2. /* This Source Code Form is subject to the terms of the Mozilla Public
  3. * License, v. 2.0. If a copy of the MPL was not distributed with this
  4. * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
  5. #include "nsNSSCertificateFakeTransport.h"
  6. #include "mozilla/Assertions.h"
  7. #include "nsIClassInfoImpl.h"
  8. #include "nsIObjectInputStream.h"
  9. #include "nsIObjectOutputStream.h"
  10. #include "nsISupportsPrimitives.h"
  11. #include "nsNSSCertificate.h"
  12. #include "nsString.h"
  13. NS_IMPL_ISUPPORTS(nsNSSCertificateFakeTransport,
  14. nsIX509Cert,
  15. nsISerializable,
  16. nsIClassInfo)
  17. nsNSSCertificateFakeTransport::nsNSSCertificateFakeTransport()
  18. : mCertSerialization(nullptr)
  19. {
  20. }
  21. nsNSSCertificateFakeTransport::~nsNSSCertificateFakeTransport()
  22. {
  23. mCertSerialization = nullptr;
  24. }
  25. NS_IMETHODIMP
  26. nsNSSCertificateFakeTransport::GetDbKey(nsACString&)
  27. {
  28. NS_NOTREACHED("Unimplemented on content process");
  29. return NS_ERROR_NOT_IMPLEMENTED;
  30. }
  31. NS_IMETHODIMP
  32. nsNSSCertificateFakeTransport::GetWindowTitle(nsAString&)
  33. {
  34. NS_NOTREACHED("Unimplemented on content process");
  35. return NS_ERROR_NOT_IMPLEMENTED;
  36. }
  37. NS_IMETHODIMP
  38. nsNSSCertificateFakeTransport::GetNickname(nsAString&)
  39. {
  40. NS_NOTREACHED("Unimplemented on content process");
  41. return NS_ERROR_NOT_IMPLEMENTED;
  42. }
  43. NS_IMETHODIMP
  44. nsNSSCertificateFakeTransport::GetEmailAddress(nsAString&)
  45. {
  46. NS_NOTREACHED("Unimplemented on content process");
  47. return NS_ERROR_NOT_IMPLEMENTED;
  48. }
  49. NS_IMETHODIMP
  50. nsNSSCertificateFakeTransport::GetEmailAddresses(uint32_t*, char16_t***)
  51. {
  52. NS_NOTREACHED("Unimplemented on content process");
  53. return NS_ERROR_NOT_IMPLEMENTED;
  54. }
  55. NS_IMETHODIMP
  56. nsNSSCertificateFakeTransport::ContainsEmailAddress(const nsAString&, bool*)
  57. {
  58. NS_NOTREACHED("Unimplemented on content process");
  59. return NS_ERROR_NOT_IMPLEMENTED;
  60. }
  61. NS_IMETHODIMP
  62. nsNSSCertificateFakeTransport::GetCommonName(nsAString&)
  63. {
  64. NS_NOTREACHED("Unimplemented on content process");
  65. return NS_ERROR_NOT_IMPLEMENTED;
  66. }
  67. NS_IMETHODIMP
  68. nsNSSCertificateFakeTransport::GetOrganization(nsAString&)
  69. {
  70. NS_NOTREACHED("Unimplemented on content process");
  71. return NS_ERROR_NOT_IMPLEMENTED;
  72. }
  73. NS_IMETHODIMP
  74. nsNSSCertificateFakeTransport::GetIssuerCommonName(nsAString&)
  75. {
  76. NS_NOTREACHED("Unimplemented on content process");
  77. return NS_ERROR_NOT_IMPLEMENTED;
  78. }
  79. NS_IMETHODIMP
  80. nsNSSCertificateFakeTransport::GetIssuerOrganization(nsAString&)
  81. {
  82. NS_NOTREACHED("Unimplemented on content process");
  83. return NS_ERROR_NOT_IMPLEMENTED;
  84. }
  85. NS_IMETHODIMP
  86. nsNSSCertificateFakeTransport::GetIssuerOrganizationUnit(nsAString&)
  87. {
  88. NS_NOTREACHED("Unimplemented on content process");
  89. return NS_ERROR_NOT_IMPLEMENTED;
  90. }
  91. NS_IMETHODIMP
  92. nsNSSCertificateFakeTransport::GetIssuer(nsIX509Cert**)
  93. {
  94. NS_NOTREACHED("Unimplemented on content process");
  95. return NS_ERROR_NOT_IMPLEMENTED;
  96. }
  97. NS_IMETHODIMP
  98. nsNSSCertificateFakeTransport::GetOrganizationalUnit(nsAString&)
  99. {
  100. NS_NOTREACHED("Unimplemented on content process");
  101. return NS_ERROR_NOT_IMPLEMENTED;
  102. }
  103. NS_IMETHODIMP
  104. nsNSSCertificateFakeTransport::GetChain(nsIArray**)
  105. {
  106. NS_NOTREACHED("Unimplemented on content process");
  107. return NS_ERROR_NOT_IMPLEMENTED;
  108. }
  109. NS_IMETHODIMP
  110. nsNSSCertificateFakeTransport::GetSubjectName(nsAString&)
  111. {
  112. NS_NOTREACHED("Unimplemented on content process");
  113. return NS_ERROR_NOT_IMPLEMENTED;
  114. }
  115. NS_IMETHODIMP
  116. nsNSSCertificateFakeTransport::GetIssuerName(nsAString&)
  117. {
  118. NS_NOTREACHED("Unimplemented on content process");
  119. return NS_ERROR_NOT_IMPLEMENTED;
  120. }
  121. NS_IMETHODIMP
  122. nsNSSCertificateFakeTransport::GetSerialNumber(nsAString&)
  123. {
  124. NS_NOTREACHED("Unimplemented on content process");
  125. return NS_ERROR_NOT_IMPLEMENTED;
  126. }
  127. NS_IMETHODIMP
  128. nsNSSCertificateFakeTransport::GetSha256Fingerprint(nsAString&)
  129. {
  130. NS_NOTREACHED("Unimplemented on content process");
  131. return NS_ERROR_NOT_IMPLEMENTED;
  132. }
  133. NS_IMETHODIMP
  134. nsNSSCertificateFakeTransport::GetSha1Fingerprint(nsAString&)
  135. {
  136. NS_NOTREACHED("Unimplemented on content process");
  137. return NS_ERROR_NOT_IMPLEMENTED;
  138. }
  139. NS_IMETHODIMP
  140. nsNSSCertificateFakeTransport::GetTokenName(nsAString&)
  141. {
  142. NS_NOTREACHED("Unimplemented on content process");
  143. return NS_ERROR_NOT_IMPLEMENTED;
  144. }
  145. NS_IMETHODIMP
  146. nsNSSCertificateFakeTransport::GetRawDER(uint32_t*, uint8_t**)
  147. {
  148. NS_NOTREACHED("Unimplemented on content process");
  149. return NS_ERROR_NOT_IMPLEMENTED;
  150. }
  151. NS_IMETHODIMP
  152. nsNSSCertificateFakeTransport::GetValidity(nsIX509CertValidity**)
  153. {
  154. NS_NOTREACHED("Unimplemented on content process");
  155. return NS_ERROR_NOT_IMPLEMENTED;
  156. }
  157. NS_IMETHODIMP
  158. nsNSSCertificateFakeTransport::GetKeyUsages(nsAString&)
  159. {
  160. MOZ_ASSERT_UNREACHABLE("Unimplemented on content process");
  161. return NS_ERROR_NOT_IMPLEMENTED;
  162. }
  163. NS_IMETHODIMP
  164. nsNSSCertificateFakeTransport::GetASN1Structure(nsIASN1Object**)
  165. {
  166. NS_NOTREACHED("Unimplemented on content process");
  167. return NS_ERROR_NOT_IMPLEMENTED;
  168. }
  169. NS_IMETHODIMP
  170. nsNSSCertificateFakeTransport::Equals(nsIX509Cert*, bool*)
  171. {
  172. NS_NOTREACHED("Unimplemented on content process");
  173. return NS_ERROR_NOT_IMPLEMENTED;
  174. }
  175. NS_IMETHODIMP
  176. nsNSSCertificateFakeTransport::GetSha256SubjectPublicKeyInfoDigest(nsACString&)
  177. {
  178. NS_NOTREACHED("Unimplemented on content process");
  179. return NS_ERROR_NOT_IMPLEMENTED;
  180. }
  181. // NB: This serialization must match that of nsNSSCertificate.
  182. NS_IMETHODIMP
  183. nsNSSCertificateFakeTransport::Write(nsIObjectOutputStream* aStream)
  184. {
  185. // On a non-chrome process we don't have mCert because we lack
  186. // nsNSSComponent. nsNSSCertificateFakeTransport object is used only to
  187. // carry the certificate serialization.
  188. // This serialization has to match that of nsNSSCertificate, so include this
  189. // now-unused field.
  190. nsresult rv = aStream->Write32(0);
  191. if (NS_FAILED(rv)) {
  192. return rv;
  193. }
  194. rv = aStream->Write32(mCertSerialization->len);
  195. if (NS_FAILED(rv)) {
  196. return rv;
  197. }
  198. return aStream->WriteByteArray(mCertSerialization->data,
  199. mCertSerialization->len);
  200. }
  201. NS_IMETHODIMP
  202. nsNSSCertificateFakeTransport::Read(nsIObjectInputStream* aStream)
  203. {
  204. // This serialization has to match that of nsNSSCertificate, so read the (now
  205. // unused) cachedEVStatus.
  206. uint32_t unusedCachedEVStatus;
  207. nsresult rv = aStream->Read32(&unusedCachedEVStatus);
  208. if (NS_FAILED(rv)) {
  209. return rv;
  210. }
  211. uint32_t len;
  212. rv = aStream->Read32(&len);
  213. if (NS_FAILED(rv)) {
  214. return rv;
  215. }
  216. nsXPIDLCString str;
  217. rv = aStream->ReadBytes(len, getter_Copies(str));
  218. if (NS_FAILED(rv)) {
  219. return rv;
  220. }
  221. // On a non-chrome process we cannot instatiate mCert because we lack
  222. // nsNSSComponent. nsNSSCertificateFakeTransport object is used only to
  223. // carry the certificate serialization.
  224. mCertSerialization =
  225. mozilla::UniqueSECItem(SECITEM_AllocItem(nullptr, nullptr, len));
  226. if (!mCertSerialization) {
  227. return NS_ERROR_OUT_OF_MEMORY;
  228. }
  229. PORT_Memcpy(mCertSerialization->data, str.Data(), len);
  230. return NS_OK;
  231. }
  232. NS_IMETHODIMP
  233. nsNSSCertificateFakeTransport::GetInterfaces(uint32_t* count, nsIID*** array)
  234. {
  235. *count = 0;
  236. *array = nullptr;
  237. return NS_OK;
  238. }
  239. NS_IMETHODIMP
  240. nsNSSCertificateFakeTransport::GetScriptableHelper(nsIXPCScriptable** _retval)
  241. {
  242. *_retval = nullptr;
  243. return NS_OK;
  244. }
  245. NS_IMETHODIMP
  246. nsNSSCertificateFakeTransport::GetContractID(char** aContractID)
  247. {
  248. *aContractID = nullptr;
  249. return NS_OK;
  250. }
  251. NS_IMETHODIMP
  252. nsNSSCertificateFakeTransport::GetClassDescription(char** aClassDescription)
  253. {
  254. *aClassDescription = nullptr;
  255. return NS_OK;
  256. }
  257. NS_IMETHODIMP
  258. nsNSSCertificateFakeTransport::GetClassID(nsCID** aClassID)
  259. {
  260. *aClassID = (nsCID*) moz_xmalloc(sizeof(nsCID));
  261. if (!*aClassID)
  262. return NS_ERROR_OUT_OF_MEMORY;
  263. return GetClassIDNoAlloc(*aClassID);
  264. }
  265. NS_IMETHODIMP
  266. nsNSSCertificateFakeTransport::GetFlags(uint32_t* aFlags)
  267. {
  268. *aFlags = nsIClassInfo::THREADSAFE;
  269. return NS_OK;
  270. }
  271. NS_IMETHODIMP
  272. nsNSSCertificateFakeTransport::GetClassIDNoAlloc(nsCID* aClassIDNoAlloc)
  273. {
  274. static NS_DEFINE_CID(kNSSCertificateCID, NS_X509CERT_CID);
  275. *aClassIDNoAlloc = kNSSCertificateCID;
  276. return NS_OK;
  277. }
  278. NS_IMETHODIMP
  279. nsNSSCertificateFakeTransport::GetCertType(unsigned int*)
  280. {
  281. NS_NOTREACHED("Unimplemented on content process");
  282. return NS_ERROR_NOT_IMPLEMENTED;
  283. }
  284. NS_IMETHODIMP
  285. nsNSSCertificateFakeTransport::GetIsSelfSigned(bool*)
  286. {
  287. NS_NOTREACHED("Unimplemented on content process");
  288. return NS_ERROR_NOT_IMPLEMENTED;
  289. }
  290. NS_IMETHODIMP
  291. nsNSSCertificateFakeTransport::GetIsBuiltInRoot(bool* aIsBuiltInRoot)
  292. {
  293. NS_NOTREACHED("Unimplemented on content process");
  294. return NS_ERROR_NOT_IMPLEMENTED;
  295. }
  296. NS_IMETHODIMP
  297. nsNSSCertificateFakeTransport::GetAllTokenNames(unsigned int*, char16_t***)
  298. {
  299. NS_NOTREACHED("Unimplemented on content process");
  300. return NS_ERROR_NOT_IMPLEMENTED;
  301. }
  302. CERTCertificate*
  303. nsNSSCertificateFakeTransport::GetCert()
  304. {
  305. NS_NOTREACHED("Unimplemented on content process");
  306. return nullptr;
  307. }
  308. NS_IMETHODIMP
  309. nsNSSCertificateFakeTransport::ExportAsCMS(unsigned int,
  310. unsigned int*,
  311. unsigned char**)
  312. {
  313. NS_NOTREACHED("Unimplemented on content process");
  314. return NS_ERROR_NOT_IMPLEMENTED;
  315. }
  316. NS_IMETHODIMP
  317. nsNSSCertificateFakeTransport::MarkForPermDeletion()
  318. {
  319. NS_NOTREACHED("Unimplemented on content process");
  320. return NS_ERROR_NOT_IMPLEMENTED;
  321. }
  322. NS_IMPL_CLASSINFO(nsNSSCertListFakeTransport,
  323. nullptr,
  324. // inferred from nsIX509Cert
  325. nsIClassInfo::THREADSAFE,
  326. NS_X509CERTLIST_CID)
  327. NS_IMPL_ISUPPORTS_CI(nsNSSCertListFakeTransport,
  328. nsIX509CertList,
  329. nsISerializable)
  330. nsNSSCertListFakeTransport::nsNSSCertListFakeTransport()
  331. {
  332. }
  333. nsNSSCertListFakeTransport::~nsNSSCertListFakeTransport()
  334. {
  335. }
  336. NS_IMETHODIMP
  337. nsNSSCertListFakeTransport::AddCert(nsIX509Cert* aCert)
  338. {
  339. NS_NOTREACHED("Unimplemented on content process");
  340. return NS_ERROR_NOT_IMPLEMENTED;
  341. }
  342. NS_IMETHODIMP
  343. nsNSSCertListFakeTransport::DeleteCert(nsIX509Cert* aCert)
  344. {
  345. NS_NOTREACHED("Unimplemented on content process");
  346. return NS_ERROR_NOT_IMPLEMENTED;
  347. }
  348. CERTCertList*
  349. nsNSSCertListFakeTransport::GetRawCertList()
  350. {
  351. NS_NOTREACHED("Unimplemented on content process");
  352. return nullptr;
  353. }
  354. NS_IMETHODIMP
  355. nsNSSCertListFakeTransport::GetEnumerator(nsISimpleEnumerator**)
  356. {
  357. NS_NOTREACHED("Unimplemented on content process");
  358. return NS_ERROR_NOT_IMPLEMENTED;
  359. }
  360. NS_IMETHODIMP
  361. nsNSSCertListFakeTransport::Equals(nsIX509CertList*, bool*)
  362. {
  363. NS_NOTREACHED("Unimplemented on content process");
  364. return NS_ERROR_NOT_IMPLEMENTED;
  365. }
  366. // NB: This serialization must match that of nsNSSCertList.
  367. NS_IMETHODIMP
  368. nsNSSCertListFakeTransport::Write(nsIObjectOutputStream* aStream)
  369. {
  370. uint32_t certListLen = mFakeCertList.length();
  371. // Write the length of the list
  372. nsresult rv = aStream->Write32(certListLen);
  373. if (NS_FAILED(rv)) {
  374. return rv;
  375. }
  376. for (size_t i = 0; i < certListLen; i++) {
  377. nsCOMPtr<nsIX509Cert> cert = mFakeCertList[i];
  378. nsCOMPtr<nsISerializable> serializableCert = do_QueryInterface(cert);
  379. rv = aStream->WriteCompoundObject(serializableCert,
  380. NS_GET_IID(nsIX509Cert), true);
  381. if (NS_FAILED(rv)) {
  382. break;
  383. }
  384. }
  385. return rv;
  386. }
  387. NS_IMETHODIMP
  388. nsNSSCertListFakeTransport::Read(nsIObjectInputStream* aStream)
  389. {
  390. uint32_t certListLen;
  391. nsresult rv = aStream->Read32(&certListLen);
  392. if (NS_FAILED(rv)) {
  393. return rv;
  394. }
  395. for (uint32_t i = 0; i < certListLen; i++) {
  396. nsCOMPtr<nsISupports> certSupports;
  397. rv = aStream->ReadObject(true, getter_AddRefs(certSupports));
  398. if (NS_FAILED(rv)) {
  399. break;
  400. }
  401. nsCOMPtr<nsIX509Cert> cert = do_QueryInterface(certSupports);
  402. if (!mFakeCertList.append(cert)) {
  403. return NS_ERROR_OUT_OF_MEMORY;
  404. }
  405. }
  406. return rv;
  407. }