nsresult NSSToken::Init() { MOZ_ASSERT(!mInitialized); if (mInitialized) { return NS_OK; } nsNSSShutDownPreventionLock locker; if (isAlreadyShutDown()) { return NS_ERROR_NOT_AVAILABLE; } MutexAutoLock lock(mMutex); if (!EnsureNSSInitializedChromeOrContent()) { return NS_ERROR_FAILURE; } mSlot = PK11_GetInternalSlot(); if (!mSlot.get()) { return NS_ERROR_FAILURE; } mInitialized = true; return NS_OK; }
bool CryptoKey::ReadStructuredClone(JSStructuredCloneReader* aReader) { nsNSSShutDownPreventionLock locker; if (isAlreadyShutDown()) { return false; } // Ensure that NSS is initialized. if (!EnsureNSSInitializedChromeOrContent()) { return false; } uint32_t version; CryptoBuffer sym, priv, pub; bool read = JS_ReadUint32Pair(aReader, &mAttributes, &version) && (version == CRYPTOKEY_SC_VERSION) && ReadBuffer(aReader, sym) && ReadBuffer(aReader, priv) && ReadBuffer(aReader, pub) && mAlgorithm.ReadStructuredClone(aReader); if (!read) { return false; } if (sym.Length() > 0 && !mSymKey.Assign(sym)) { return false; } if (priv.Length() > 0) { mPrivateKey = CryptoKey::PrivateKeyFromPkcs8(priv, locker); } if (pub.Length() > 0) { mPublicKey = CryptoKey::PublicKeyFromSpki(pub, locker); } // Ensure that what we've read is consistent // If the attributes indicate a key type, should have a key of that type if (!((GetKeyType() == SECRET && mSymKey.Length() > 0) || (GetKeyType() == PRIVATE && mPrivateKey) || (GetKeyType() == PUBLIC && mPublicKey))) { return false; } return true; }