From 6eec770808892c90dfe86e2a3b2f9260543a8e70 Mon Sep 17 00:00:00 2001 From: Tim Taubert Date: Tue, 8 Mar 2016 11:14:37 +0100 Subject: [PATCH] Bug 1250930 - Use SubtleCrypto's global when creating keys for an ImportKeyTask r=bz --- dom/base/SubtleCrypto.cpp | 12 ++-- dom/crypto/WebCryptoTask.cpp | 122 +++++++++++++++++------------------ dom/crypto/WebCryptoTask.h | 9 ++- 3 files changed, 70 insertions(+), 73 deletions(-) diff --git a/dom/base/SubtleCrypto.cpp b/dom/base/SubtleCrypto.cpp index debce4ce6544..55b7bd867642 100644 --- a/dom/base/SubtleCrypto.cpp +++ b/dom/base/SubtleCrypto.cpp @@ -104,8 +104,8 @@ SubtleCrypto::ImportKey(JSContext* cx, const Sequence& keyUsages, ErrorResult& aRv) { - SUBTLECRYPTO_METHOD_BODY(ImportKey, aRv, cx, format, keyData, algorithm, - extractable, keyUsages) + SUBTLECRYPTO_METHOD_BODY(ImportKey, aRv, mParent, cx, format, keyData, + algorithm, extractable, keyUsages) } already_AddRefed @@ -132,7 +132,7 @@ SubtleCrypto::DeriveKey(JSContext* cx, bool extractable, const Sequence& keyUsages, ErrorResult& aRv) { - SUBTLECRYPTO_METHOD_BODY(DeriveKey, aRv, cx, algorithm, baseKey, + SUBTLECRYPTO_METHOD_BODY(DeriveKey, aRv, mParent, cx, algorithm, baseKey, derivedKeyType, extractable, keyUsages) } @@ -168,9 +168,9 @@ SubtleCrypto::UnwrapKey(JSContext* cx, const Sequence& keyUsages, ErrorResult& aRv) { - SUBTLECRYPTO_METHOD_BODY(UnwrapKey, aRv, cx, format, wrappedKey, unwrappingKey, - unwrapAlgorithm, unwrappedKeyAlgorithm, - extractable, keyUsages) + SUBTLECRYPTO_METHOD_BODY(UnwrapKey, aRv, mParent, cx, format, wrappedKey, + unwrappingKey, unwrapAlgorithm, + unwrappedKeyAlgorithm, extractable, keyUsages) } } // namespace dom diff --git a/dom/crypto/WebCryptoTask.cpp b/dom/crypto/WebCryptoTask.cpp index 6514a4c1502e..e8aeec6140b6 100644 --- a/dom/crypto/WebCryptoTask.cpp +++ b/dom/crypto/WebCryptoTask.cpp @@ -1332,24 +1332,16 @@ private: class ImportKeyTask : public WebCryptoTask { public: - void Init(JSContext* aCx, - const nsAString& aFormat, - const ObjectOrString& aAlgorithm, bool aExtractable, - const Sequence& aKeyUsages) + void Init(nsIGlobalObject* aGlobal, JSContext* aCx, + const nsAString& aFormat, const ObjectOrString& aAlgorithm, + bool aExtractable, const Sequence& aKeyUsages) { mFormat = aFormat; mDataIsSet = false; mDataIsJwk = false; - // Get the current global object from the context - nsIGlobalObject *global = xpc::NativeGlobal(JS::CurrentGlobalOrNull(aCx)); - if (!global) { - mEarlyRv = NS_ERROR_DOM_UNKNOWN_ERR; - return; - } - // This stuff pretty much always happens, so we'll do it here - mKey = new CryptoKey(global); + mKey = new CryptoKey(aGlobal); mKey->SetExtractable(aExtractable); mKey->ClearUsages(); for (uint32_t i = 0; i < aKeyUsages.Length(); ++i) { @@ -1472,20 +1464,20 @@ private: class ImportSymmetricKeyTask : public ImportKeyTask { public: - ImportSymmetricKeyTask(JSContext* aCx, + ImportSymmetricKeyTask(nsIGlobalObject* aGlobal, JSContext* aCx, const nsAString& aFormat, const ObjectOrString& aAlgorithm, bool aExtractable, const Sequence& aKeyUsages) { - Init(aCx, aFormat, aAlgorithm, aExtractable, aKeyUsages); + Init(aGlobal, aCx, aFormat, aAlgorithm, aExtractable, aKeyUsages); } - ImportSymmetricKeyTask(JSContext* aCx, + ImportSymmetricKeyTask(nsIGlobalObject* aGlobal, JSContext* aCx, const nsAString& aFormat, const JS::Handle aKeyData, const ObjectOrString& aAlgorithm, bool aExtractable, const Sequence& aKeyUsages) { - Init(aCx, aFormat, aAlgorithm, aExtractable, aKeyUsages); + Init(aGlobal, aCx, aFormat, aAlgorithm, aExtractable, aKeyUsages); if (NS_FAILED(mEarlyRv)) { return; } @@ -1498,12 +1490,11 @@ public: } } - void Init(JSContext* aCx, - const nsAString& aFormat, + void Init(nsIGlobalObject* aGlobal, JSContext* aCx, const nsAString& aFormat, const ObjectOrString& aAlgorithm, bool aExtractable, const Sequence& aKeyUsages) { - ImportKeyTask::Init(aCx, aFormat, aAlgorithm, aExtractable, aKeyUsages); + ImportKeyTask::Init(aGlobal, aCx, aFormat, aAlgorithm, aExtractable, aKeyUsages); if (NS_FAILED(mEarlyRv)) { return; } @@ -1630,20 +1621,20 @@ private: class ImportRsaKeyTask : public ImportKeyTask { public: - ImportRsaKeyTask(JSContext* aCx, + ImportRsaKeyTask(nsIGlobalObject* aGlobal, JSContext* aCx, const nsAString& aFormat, const ObjectOrString& aAlgorithm, bool aExtractable, const Sequence& aKeyUsages) { - Init(aCx, aFormat, aAlgorithm, aExtractable, aKeyUsages); + Init(aGlobal, aCx, aFormat, aAlgorithm, aExtractable, aKeyUsages); } - ImportRsaKeyTask(JSContext* aCx, + ImportRsaKeyTask(nsIGlobalObject* aGlobal, JSContext* aCx, const nsAString& aFormat, JS::Handle aKeyData, const ObjectOrString& aAlgorithm, bool aExtractable, const Sequence& aKeyUsages) { - Init(aCx, aFormat, aAlgorithm, aExtractable, aKeyUsages); + Init(aGlobal, aCx, aFormat, aAlgorithm, aExtractable, aKeyUsages); if (NS_FAILED(mEarlyRv)) { return; } @@ -1656,12 +1647,12 @@ public: } } - void Init(JSContext* aCx, + void Init(nsIGlobalObject* aGlobal, JSContext* aCx, const nsAString& aFormat, const ObjectOrString& aAlgorithm, bool aExtractable, const Sequence& aKeyUsages) { - ImportKeyTask::Init(aCx, aFormat, aAlgorithm, aExtractable, aKeyUsages); + ImportKeyTask::Init(aGlobal, aCx, aFormat, aAlgorithm, aExtractable, aKeyUsages); if (NS_FAILED(mEarlyRv)) { return; } @@ -1798,19 +1789,19 @@ private: class ImportEcKeyTask : public ImportKeyTask { public: - ImportEcKeyTask(JSContext* aCx, const nsAString& aFormat, - const ObjectOrString& aAlgorithm, bool aExtractable, - const Sequence& aKeyUsages) + ImportEcKeyTask(nsIGlobalObject* aGlobal, JSContext* aCx, + const nsAString& aFormat, const ObjectOrString& aAlgorithm, + bool aExtractable, const Sequence& aKeyUsages) { - Init(aCx, aFormat, aAlgorithm, aExtractable, aKeyUsages); + Init(aGlobal, aCx, aFormat, aAlgorithm, aExtractable, aKeyUsages); } - ImportEcKeyTask(JSContext* aCx, const nsAString& aFormat, - JS::Handle aKeyData, + ImportEcKeyTask(nsIGlobalObject* aGlobal, JSContext* aCx, + const nsAString& aFormat, JS::Handle aKeyData, const ObjectOrString& aAlgorithm, bool aExtractable, const Sequence& aKeyUsages) { - Init(aCx, aFormat, aAlgorithm, aExtractable, aKeyUsages); + Init(aGlobal, aCx, aFormat, aAlgorithm, aExtractable, aKeyUsages); if (NS_FAILED(mEarlyRv)) { return; } @@ -1819,11 +1810,11 @@ public: NS_ENSURE_SUCCESS_VOID(mEarlyRv); } - void Init(JSContext* aCx, const nsAString& aFormat, + void Init(nsIGlobalObject* aGlobal, JSContext* aCx, const nsAString& aFormat, const ObjectOrString& aAlgorithm, bool aExtractable, const Sequence& aKeyUsages) { - ImportKeyTask::Init(aCx, aFormat, aAlgorithm, aExtractable, aKeyUsages); + ImportKeyTask::Init(aGlobal, aCx, aFormat, aAlgorithm, aExtractable, aKeyUsages); if (NS_FAILED(mEarlyRv)) { return; } @@ -1951,30 +1942,30 @@ private: class ImportDhKeyTask : public ImportKeyTask { public: - ImportDhKeyTask(JSContext* aCx, const nsAString& aFormat, - const ObjectOrString& aAlgorithm, bool aExtractable, - const Sequence& aKeyUsages) + ImportDhKeyTask(nsIGlobalObject* aGlobal, JSContext* aCx, + const nsAString& aFormat, const ObjectOrString& aAlgorithm, + bool aExtractable, const Sequence& aKeyUsages) { - Init(aCx, aFormat, aAlgorithm, aExtractable, aKeyUsages); + Init(aGlobal, aCx, aFormat, aAlgorithm, aExtractable, aKeyUsages); } - ImportDhKeyTask(JSContext* aCx, const nsAString& aFormat, - JS::Handle aKeyData, + ImportDhKeyTask(nsIGlobalObject* aGlobal, JSContext* aCx, + const nsAString& aFormat, JS::Handle aKeyData, const ObjectOrString& aAlgorithm, bool aExtractable, const Sequence& aKeyUsages) { - Init(aCx, aFormat, aAlgorithm, aExtractable, aKeyUsages); + Init(aGlobal, aCx, aFormat, aAlgorithm, aExtractable, aKeyUsages); if (NS_SUCCEEDED(mEarlyRv)) { SetKeyData(aCx, aKeyData); NS_ENSURE_SUCCESS_VOID(mEarlyRv); } } - void Init(JSContext* aCx, const nsAString& aFormat, + void Init(nsIGlobalObject* aGlobal, JSContext* aCx, const nsAString& aFormat, const ObjectOrString& aAlgorithm, bool aExtractable, const Sequence& aKeyUsages) { - ImportKeyTask::Init(aCx, aFormat, aAlgorithm, aExtractable, aKeyUsages); + ImportKeyTask::Init(aGlobal, aCx, aFormat, aAlgorithm, aExtractable, aKeyUsages); if (NS_FAILED(mEarlyRv)) { return; } @@ -2853,7 +2844,7 @@ template class DeriveKeyTask : public DeriveBitsTask { public: - DeriveKeyTask(JSContext* aCx, + DeriveKeyTask(nsIGlobalObject* aGlobal, JSContext* aCx, const ObjectOrString& aAlgorithm, CryptoKey& aBaseKey, const ObjectOrString& aDerivedKeyType, bool aExtractable, const Sequence& aKeyUsages) @@ -2865,7 +2856,7 @@ public: } NS_NAMED_LITERAL_STRING(format, WEBCRYPTO_KEY_FORMAT_RAW); - mTask = new ImportSymmetricKeyTask(aCx, format, aDerivedKeyType, + mTask = new ImportSymmetricKeyTask(aGlobal, aCx, format, aDerivedKeyType, aExtractable, aKeyUsages); } @@ -3295,7 +3286,8 @@ WebCryptoTask::CreateDigestTask(JSContext* aCx, } WebCryptoTask* -WebCryptoTask::CreateImportKeyTask(JSContext* aCx, +WebCryptoTask::CreateImportKeyTask(nsIGlobalObject* aGlobal, + JSContext* aCx, const nsAString& aFormat, JS::Handle aKeyData, const ObjectOrString& aAlgorithm, @@ -3333,19 +3325,19 @@ WebCryptoTask::CreateImportKeyTask(JSContext* aCx, algName.EqualsLiteral(WEBCRYPTO_ALG_PBKDF2) || algName.EqualsLiteral(WEBCRYPTO_ALG_HKDF) || algName.EqualsLiteral(WEBCRYPTO_ALG_HMAC)) { - return new ImportSymmetricKeyTask(aCx, aFormat, aKeyData, aAlgorithm, - aExtractable, aKeyUsages); + return new ImportSymmetricKeyTask(aGlobal, aCx, aFormat, aKeyData, + aAlgorithm, aExtractable, aKeyUsages); } else if (algName.EqualsLiteral(WEBCRYPTO_ALG_RSASSA_PKCS1) || algName.EqualsLiteral(WEBCRYPTO_ALG_RSA_OAEP) || algName.EqualsLiteral(WEBCRYPTO_ALG_RSA_PSS)) { - return new ImportRsaKeyTask(aCx, aFormat, aKeyData, aAlgorithm, + return new ImportRsaKeyTask(aGlobal, aCx, aFormat, aKeyData, aAlgorithm, aExtractable, aKeyUsages); } else if (algName.EqualsLiteral(WEBCRYPTO_ALG_ECDH) || algName.EqualsLiteral(WEBCRYPTO_ALG_ECDSA)) { - return new ImportEcKeyTask(aCx, aFormat, aKeyData, aAlgorithm, + return new ImportEcKeyTask(aGlobal, aCx, aFormat, aKeyData, aAlgorithm, aExtractable, aKeyUsages); } else if (algName.EqualsLiteral(WEBCRYPTO_ALG_DH)) { - return new ImportDhKeyTask(aCx, aFormat, aKeyData, aAlgorithm, + return new ImportDhKeyTask(aGlobal, aCx, aFormat, aKeyData, aAlgorithm, aExtractable, aKeyUsages); } else { return new FailureTask(NS_ERROR_DOM_NOT_SUPPORTED_ERR); @@ -3434,7 +3426,8 @@ WebCryptoTask::CreateGenerateKeyTask(JSContext* aCx, } WebCryptoTask* -WebCryptoTask::CreateDeriveKeyTask(JSContext* aCx, +WebCryptoTask::CreateDeriveKeyTask(nsIGlobalObject* aGlobal, + JSContext* aCx, const ObjectOrString& aAlgorithm, CryptoKey& aBaseKey, const ObjectOrString& aDerivedKeyType, @@ -3460,21 +3453,21 @@ WebCryptoTask::CreateDeriveKeyTask(JSContext* aCx, } if (algName.EqualsASCII(WEBCRYPTO_ALG_HKDF)) { - return new DeriveKeyTask(aCx, aAlgorithm, aBaseKey, - aDerivedKeyType, aExtractable, - aKeyUsages); + return new DeriveKeyTask(aGlobal, aCx, aAlgorithm, + aBaseKey, aDerivedKeyType, + aExtractable, aKeyUsages); } if (algName.EqualsASCII(WEBCRYPTO_ALG_PBKDF2)) { - return new DeriveKeyTask(aCx, aAlgorithm, aBaseKey, - aDerivedKeyType, aExtractable, - aKeyUsages); + return new DeriveKeyTask(aGlobal, aCx, aAlgorithm, + aBaseKey, aDerivedKeyType, + aExtractable, aKeyUsages); } if (algName.EqualsASCII(WEBCRYPTO_ALG_ECDH)) { - return new DeriveKeyTask(aCx, aAlgorithm, aBaseKey, - aDerivedKeyType, aExtractable, - aKeyUsages); + return new DeriveKeyTask(aGlobal, aCx, aAlgorithm, + aBaseKey, aDerivedKeyType, + aExtractable, aKeyUsages); } return new FailureTask(NS_ERROR_DOM_NOT_SUPPORTED_ERR); @@ -3568,7 +3561,8 @@ WebCryptoTask::CreateWrapKeyTask(JSContext* aCx, } WebCryptoTask* -WebCryptoTask::CreateUnwrapKeyTask(JSContext* aCx, +WebCryptoTask::CreateUnwrapKeyTask(nsIGlobalObject* aGlobal, + JSContext* aCx, const nsAString& aFormat, const ArrayBufferViewOrArrayBuffer& aWrappedKey, CryptoKey& aUnwrappingKey, @@ -3602,13 +3596,13 @@ WebCryptoTask::CreateUnwrapKeyTask(JSContext* aCx, keyAlgName.EqualsASCII(WEBCRYPTO_ALG_AES_GCM) || keyAlgName.EqualsASCII(WEBCRYPTO_ALG_HKDF) || keyAlgName.EqualsASCII(WEBCRYPTO_ALG_HMAC)) { - importTask = new ImportSymmetricKeyTask(aCx, aFormat, + importTask = new ImportSymmetricKeyTask(aGlobal, aCx, aFormat, aUnwrappedKeyAlgorithm, aExtractable, aKeyUsages); } else if (keyAlgName.EqualsASCII(WEBCRYPTO_ALG_RSASSA_PKCS1) || keyAlgName.EqualsASCII(WEBCRYPTO_ALG_RSA_OAEP) || keyAlgName.EqualsASCII(WEBCRYPTO_ALG_RSA_PSS)) { - importTask = new ImportRsaKeyTask(aCx, aFormat, + importTask = new ImportRsaKeyTask(aGlobal, aCx, aFormat, aUnwrappedKeyAlgorithm, aExtractable, aKeyUsages); } else { diff --git a/dom/crypto/WebCryptoTask.h b/dom/crypto/WebCryptoTask.h index adb98ae985f4..b5cafb2bf5bf 100644 --- a/dom/crypto/WebCryptoTask.h +++ b/dom/crypto/WebCryptoTask.h @@ -122,7 +122,8 @@ public: const ObjectOrString& aAlgorithm, const CryptoOperationData& aData); - static WebCryptoTask* CreateImportKeyTask(JSContext* aCx, + static WebCryptoTask* CreateImportKeyTask(nsIGlobalObject* aGlobal, + JSContext* aCx, const nsAString& aFormat, JS::Handle aKeyData, const ObjectOrString& aAlgorithm, @@ -135,7 +136,8 @@ public: bool aExtractable, const Sequence& aKeyUsages); - static WebCryptoTask* CreateDeriveKeyTask(JSContext* aCx, + static WebCryptoTask* CreateDeriveKeyTask(nsIGlobalObject* aGlobal, + JSContext* aCx, const ObjectOrString& aAlgorithm, CryptoKey& aBaseKey, const ObjectOrString& aDerivedKeyType, @@ -151,7 +153,8 @@ public: CryptoKey& aKey, CryptoKey& aWrappingKey, const ObjectOrString& aWrapAlgorithm); - static WebCryptoTask* CreateUnwrapKeyTask(JSContext* aCx, + static WebCryptoTask* CreateUnwrapKeyTask(nsIGlobalObject* aGlobal, + JSContext* aCx, const nsAString& aFormat, const ArrayBufferViewOrArrayBuffer& aWrappedKey, CryptoKey& aUnwrappingKey,