tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

SubtleCrypto.cpp (6333B)


      1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
      2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
      3 /* This Source Code Form is subject to the terms of the Mozilla Public
      4 * License, v. 2.0. If a copy of the MPL was not distributed with this
      5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      6 
      7 #include "mozilla/dom/SubtleCrypto.h"
      8 
      9 #include "mozilla/dom/Promise.h"
     10 #include "mozilla/dom/SubtleCryptoBinding.h"
     11 #include "mozilla/dom/WebCryptoTask.h"
     12 
     13 namespace mozilla::dom {
     14 
     15 NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(SubtleCrypto, mParent)
     16 NS_IMPL_CYCLE_COLLECTING_ADDREF(SubtleCrypto)
     17 NS_IMPL_CYCLE_COLLECTING_RELEASE(SubtleCrypto)
     18 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(SubtleCrypto)
     19  NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
     20  NS_INTERFACE_MAP_ENTRY(nsISupports)
     21 NS_INTERFACE_MAP_END
     22 
     23 SubtleCrypto::SubtleCrypto(nsIGlobalObject* aParent) : mParent(aParent) {}
     24 
     25 JSObject* SubtleCrypto::WrapObject(JSContext* aCx,
     26                                   JS::Handle<JSObject*> aGivenProto) {
     27  return SubtleCrypto_Binding::Wrap(aCx, this, aGivenProto);
     28 }
     29 
     30 #define SUBTLECRYPTO_METHOD_BODY(Operation, aRv, ...)      \
     31  MOZ_ASSERT(mParent);                                     \
     32  RefPtr<Promise> p = Promise::Create(mParent, aRv);       \
     33  if (aRv.Failed()) {                                      \
     34    return nullptr;                                        \
     35  }                                                        \
     36  RefPtr<WebCryptoTask> task =                             \
     37      WebCryptoTask::Create##Operation##Task(__VA_ARGS__); \
     38  if (!task) {                                             \
     39    aRv.Throw(NS_ERROR_NULL_POINTER);                      \
     40    return nullptr;                                        \
     41  }                                                        \
     42  task->DispatchWithPromise(p);                            \
     43  return p.forget();
     44 
     45 already_AddRefed<Promise> SubtleCrypto::Encrypt(JSContext* cx,
     46                                                const ObjectOrString& algorithm,
     47                                                CryptoKey& key,
     48                                                const CryptoOperationData& data,
     49                                                ErrorResult& aRv){
     50    SUBTLECRYPTO_METHOD_BODY(Encrypt, aRv, cx, algorithm, key, data)}
     51 
     52 already_AddRefed<Promise> SubtleCrypto::Decrypt(JSContext* cx,
     53                                                const ObjectOrString& algorithm,
     54                                                CryptoKey& key,
     55                                                const CryptoOperationData& data,
     56                                                ErrorResult& aRv){
     57    SUBTLECRYPTO_METHOD_BODY(Decrypt, aRv, cx, algorithm, key, data)}
     58 
     59 already_AddRefed<Promise> SubtleCrypto::Sign(JSContext* cx,
     60                                             const ObjectOrString& algorithm,
     61                                             CryptoKey& key,
     62                                             const CryptoOperationData& data,
     63                                             ErrorResult& aRv){
     64    SUBTLECRYPTO_METHOD_BODY(Sign, aRv, cx, algorithm, key, data)}
     65 
     66 already_AddRefed<Promise> SubtleCrypto::Verify(
     67    JSContext* cx, const ObjectOrString& algorithm, CryptoKey& key,
     68    const CryptoOperationData& signature, const CryptoOperationData& data,
     69    ErrorResult& aRv){
     70    SUBTLECRYPTO_METHOD_BODY(Verify, aRv, cx, algorithm, key, signature, data)}
     71 
     72 already_AddRefed<Promise> SubtleCrypto::Digest(JSContext* cx,
     73                                               const ObjectOrString& algorithm,
     74                                               const CryptoOperationData& data,
     75                                               ErrorResult& aRv){
     76    SUBTLECRYPTO_METHOD_BODY(Digest, aRv, cx, algorithm, data)}
     77 
     78 already_AddRefed<Promise> SubtleCrypto::ImportKey(
     79    JSContext* cx, const nsAString& format, JS::Handle<JSObject*> keyData,
     80    const ObjectOrString& algorithm, bool extractable,
     81    const Sequence<nsString>& keyUsages, ErrorResult& aRv){
     82    SUBTLECRYPTO_METHOD_BODY(ImportKey, aRv, mParent, cx, format, keyData,
     83                             algorithm, extractable, keyUsages)}
     84 
     85 already_AddRefed<Promise> SubtleCrypto::ExportKey(const nsAString& format,
     86                                                  CryptoKey& key,
     87                                                  ErrorResult& aRv){
     88    SUBTLECRYPTO_METHOD_BODY(ExportKey, aRv, format, key)}
     89 
     90 already_AddRefed<Promise> SubtleCrypto::GenerateKey(
     91    JSContext* cx, const ObjectOrString& algorithm, bool extractable,
     92    const Sequence<nsString>& keyUsages, ErrorResult& aRv){
     93    SUBTLECRYPTO_METHOD_BODY(GenerateKey, aRv, mParent, cx, algorithm,
     94                             extractable, keyUsages)}
     95 
     96 already_AddRefed<Promise> SubtleCrypto::DeriveKey(
     97    JSContext* cx, const ObjectOrString& algorithm, CryptoKey& baseKey,
     98    const ObjectOrString& derivedKeyType, bool extractable,
     99    const Sequence<nsString>& keyUsages, ErrorResult& aRv){
    100    SUBTLECRYPTO_METHOD_BODY(DeriveKey, aRv, mParent, cx, algorithm, baseKey,
    101                             derivedKeyType, extractable, keyUsages)}
    102 
    103 already_AddRefed<Promise> SubtleCrypto::DeriveBits(
    104    JSContext* cx, const ObjectOrString& algorithm, CryptoKey& baseKey,
    105    const Nullable<uint32_t>& length, ErrorResult& aRv){
    106    SUBTLECRYPTO_METHOD_BODY(DeriveBits, aRv, cx, algorithm, baseKey, length)}
    107 
    108 already_AddRefed<Promise> SubtleCrypto::WrapKey(
    109    JSContext* cx, const nsAString& format, CryptoKey& key,
    110    CryptoKey& wrappingKey, const ObjectOrString& wrapAlgorithm,
    111    ErrorResult& aRv){SUBTLECRYPTO_METHOD_BODY(WrapKey, aRv, cx, format, key,
    112                                               wrappingKey, wrapAlgorithm)}
    113 
    114 already_AddRefed<Promise> SubtleCrypto::UnwrapKey(
    115    JSContext* cx, const nsAString& format,
    116    const ArrayBufferViewOrArrayBuffer& wrappedKey, CryptoKey& unwrappingKey,
    117    const ObjectOrString& unwrapAlgorithm,
    118    const ObjectOrString& unwrappedKeyAlgorithm, bool extractable,
    119    const Sequence<nsString>& keyUsages, ErrorResult& aRv) {
    120  SUBTLECRYPTO_METHOD_BODY(UnwrapKey, aRv, mParent, cx, format, wrappedKey,
    121                           unwrappingKey, unwrapAlgorithm,
    122                           unwrappedKeyAlgorithm, extractable, keyUsages)
    123 }
    124 
    125 }  // namespace mozilla::dom