mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-10 03:45:46 +00:00
9c614370ec
Bug 1034856 added support for DH algorithms to WebCrypto, however the final specification did not choose to include them, making Firefox the only browser with support. Bug 1539578 added telemetry to show usage, and it is extremely low (not appearing on the graphs), which could be expected as Firefox is the only supporting browser. Since DH is an ongoing maintenance burden -- and overall cryptanalysis of DH is progressing -- let's remove it. Notice to unship went to dev-platform on 29 March 2019 with no objections. [0] [0] https://groups.google.com/d/msg/mozilla.dev.platform/Ut3-eQmUdWg/O9w1et1aBgAJ Differential Revision: https://phabricator.services.mozilla.com/D50865 --HG-- extra : moz-landing-system : lando
117 lines
3.4 KiB
C++
117 lines
3.4 KiB
C++
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
|
/* 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 http://mozilla.org/MPL/2.0/. */
|
|
|
|
#ifndef mozilla_dom_KeyAlgorithmProxy_h
|
|
#define mozilla_dom_KeyAlgorithmProxy_h
|
|
|
|
#include "pk11pub.h"
|
|
#include "js/StructuredClone.h"
|
|
#include "mozilla/dom/KeyAlgorithmBinding.h"
|
|
#include "mozilla/dom/WebCryptoCommon.h"
|
|
|
|
#define KEY_ALGORITHM_SC_VERSION 0x00000001
|
|
|
|
namespace mozilla {
|
|
namespace dom {
|
|
|
|
// A heap-safe variant of RsaHashedKeyAlgorithm
|
|
// The only difference is that it uses CryptoBuffer instead of Uint8Array
|
|
struct RsaHashedKeyAlgorithmStorage {
|
|
nsString mName;
|
|
KeyAlgorithm mHash;
|
|
uint16_t mModulusLength;
|
|
CryptoBuffer mPublicExponent;
|
|
|
|
bool ToKeyAlgorithm(JSContext* aCx, RsaHashedKeyAlgorithm& aRsa) const {
|
|
JS::Rooted<JSObject*> exponent(aCx, mPublicExponent.ToUint8Array(aCx));
|
|
if (!exponent) {
|
|
return false;
|
|
}
|
|
|
|
aRsa.mName = mName;
|
|
aRsa.mModulusLength = mModulusLength;
|
|
aRsa.mHash.mName = mHash.mName;
|
|
aRsa.mPublicExponent.Init(exponent);
|
|
aRsa.mPublicExponent.ComputeLengthAndData();
|
|
|
|
return true;
|
|
}
|
|
};
|
|
|
|
// This class encapuslates a KeyAlgorithm object, and adds several
|
|
// methods that make WebCrypto operations simpler.
|
|
struct KeyAlgorithmProxy {
|
|
enum KeyAlgorithmType {
|
|
AES,
|
|
HMAC,
|
|
RSA,
|
|
EC,
|
|
};
|
|
KeyAlgorithmType mType;
|
|
|
|
// Plain is always populated with the algorithm name
|
|
// Others are only populated for the corresponding key type
|
|
nsString mName;
|
|
AesKeyAlgorithm mAes;
|
|
HmacKeyAlgorithm mHmac;
|
|
RsaHashedKeyAlgorithmStorage mRsa;
|
|
EcKeyAlgorithm mEc;
|
|
|
|
// Structured clone
|
|
bool WriteStructuredClone(JSStructuredCloneWriter* aWriter) const;
|
|
bool ReadStructuredClone(JSStructuredCloneReader* aReader);
|
|
|
|
// Extract various forms of derived information
|
|
CK_MECHANISM_TYPE Mechanism() const;
|
|
nsString JwkAlg() const;
|
|
|
|
// And in static form for calling on raw KeyAlgorithm dictionaries
|
|
static CK_MECHANISM_TYPE GetMechanism(const KeyAlgorithm& aAlgorithm);
|
|
static CK_MECHANISM_TYPE GetMechanism(const HmacKeyAlgorithm& aAlgorithm);
|
|
static nsString GetJwkAlg(const KeyAlgorithm& aAlgorithm);
|
|
|
|
// Construction of the various algorithm types
|
|
void MakeAes(const nsString& aName, uint32_t aLength) {
|
|
mType = AES;
|
|
mName = aName;
|
|
mAes.mName = aName;
|
|
mAes.mLength = aLength;
|
|
}
|
|
|
|
void MakeHmac(uint32_t aLength, const nsString& aHashName) {
|
|
mType = HMAC;
|
|
mName = NS_LITERAL_STRING(WEBCRYPTO_ALG_HMAC);
|
|
mHmac.mName = NS_LITERAL_STRING(WEBCRYPTO_ALG_HMAC);
|
|
mHmac.mLength = aLength;
|
|
mHmac.mHash.mName = aHashName;
|
|
}
|
|
|
|
bool MakeRsa(const nsString& aName, uint32_t aModulusLength,
|
|
const CryptoBuffer& aPublicExponent, const nsString& aHashName) {
|
|
mType = RSA;
|
|
mName = aName;
|
|
mRsa.mName = aName;
|
|
mRsa.mModulusLength = aModulusLength;
|
|
mRsa.mHash.mName = aHashName;
|
|
if (!mRsa.mPublicExponent.Assign(aPublicExponent)) {
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
void MakeEc(const nsString& aName, const nsString& aNamedCurve) {
|
|
mType = EC;
|
|
mName = aName;
|
|
mEc.mName = aName;
|
|
mEc.mNamedCurve = aNamedCurve;
|
|
}
|
|
};
|
|
|
|
} // namespace dom
|
|
} // namespace mozilla
|
|
|
|
#endif // mozilla_dom_KeyAlgorithmProxy_h
|