summaryrefslogtreecommitdiffstats
path: root/dom/crypto/KeyAlgorithmProxy.h
diff options
context:
space:
mode:
Diffstat (limited to 'dom/crypto/KeyAlgorithmProxy.h')
-rw-r--r--dom/crypto/KeyAlgorithmProxy.h175
1 files changed, 175 insertions, 0 deletions
diff --git a/dom/crypto/KeyAlgorithmProxy.h b/dom/crypto/KeyAlgorithmProxy.h
new file mode 100644
index 000000000..2c4c302b4
--- /dev/null
+++ b/dom/crypto/KeyAlgorithmProxy.h
@@ -0,0 +1,175 @@
+/* -*- 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;
+ }
+};
+
+// A heap-safe variant of DhKeyAlgorithm
+// The only difference is that it uses CryptoBuffers instead of Uint8Arrays
+struct DhKeyAlgorithmStorage {
+ nsString mName;
+ CryptoBuffer mPrime;
+ CryptoBuffer mGenerator;
+
+ bool
+ ToKeyAlgorithm(JSContext* aCx, DhKeyAlgorithm& aDh) const
+ {
+ JS::Rooted<JSObject*> prime(aCx, mPrime.ToUint8Array(aCx));
+ if (!prime) {
+ return false;
+ }
+
+ JS::Rooted<JSObject*> generator(aCx, mGenerator.ToUint8Array(aCx));
+ if (!generator) {
+ return false;
+ }
+
+ aDh.mName = mName;
+ aDh.mPrime.Init(prime);
+ aDh.mPrime.ComputeLengthAndData();
+ aDh.mGenerator.Init(generator);
+ aDh.mGenerator.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,
+ DH,
+ };
+ 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;
+ DhKeyAlgorithmStorage mDh;
+
+ // 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;
+ }
+
+ bool
+ MakeDh(const nsString& aName, const CryptoBuffer& aPrime,
+ const CryptoBuffer& aGenerator)
+ {
+ mType = DH;
+ mName = aName;
+ mDh.mName = aName;
+ if (!mDh.mPrime.Assign(aPrime)) {
+ return false;
+ }
+ if (!mDh.mGenerator.Assign(aGenerator)) {
+ return false;
+ }
+ return true;
+ }
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif // mozilla_dom_KeyAlgorithmProxy_h