/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ #include "ResourceHasher.h" #include "WAICTUtils.h" #include "nsComponentManagerUtils.h" #include "nsNetCID.h" static mozilla::LazyLogModule gResourceHasherLog("ResourceHasher"); namespace mozilla::dom { using mozilla::waict::gWaictLog; ResourceHasher::ResourceHasher(nsICryptoHash* aCrypto) : mCrypto(aCrypto), mFinalized(false) {} already_AddRefed ResourceHasher::Init() { nsCOMPtr crypto = do_CreateInstance(NS_CRYPTO_HASH_CONTRACTID); if (!crypto) { MOZ_LOG(gWaictLog, LogLevel::Warning, ("ResourceHasher::Create -- " "Failed to create nsICryptoHash\n")); return nullptr; } nsresult rv = crypto->Init(nsICryptoHash::SHA256); if (NS_FAILED(rv)) { MOZ_LOG(gResourceHasherLog, LogLevel::Warning, ("ResourceHasher::Create -- Init failed: 0x%08x", static_cast(rv))); return nullptr; } RefPtr hasher = new ResourceHasher(crypto); return hasher.forget(); } nsresult ResourceHasher::Update(const uint8_t* aData, uint32_t aLength) { if (mFinalized) { return NS_ERROR_FAILURE; } if (!mCrypto) { return NS_ERROR_NOT_INITIALIZED; } return mCrypto->Update(aData, aLength); } nsresult ResourceHasher::Finish() { if (mFinalized) { return NS_ERROR_FAILURE; } if (!mCrypto) { return NS_ERROR_NOT_INITIALIZED; } mFinalized = true; nsresult rv = mCrypto->Finish(/* aASCII = */ true, mComputedHash); if (NS_SUCCEEDED(rv)) { MOZ_LOG(gWaictLog, LogLevel::Debug, ("[this=%p] ResourceHasher::Finish -- " "Hash computed successfully: %s\n", this, mComputedHash.BeginReading())); } else { MOZ_LOG(gWaictLog, LogLevel::Error, ("[this=%p] ResourceHasher::Finish -- " "Failed to finalize hash rv %" PRIu32 "\n", this, static_cast(rv))); } return rv; } } // namespace mozilla::dom