/* * Copyright (c) 2024, Andrew Kaster * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include #include #include #include namespace Web::Crypto { using KeyDataType = Variant, Bindings::JsonWebKey>; using AlgorithmIdentifier = Variant, String>; using HashAlgorithmIdentifier = AlgorithmIdentifier; // https://w3c.github.io/webcrypto/#algorithm-overview struct AlgorithmParams { String name; static JS::ThrowCompletionOr> from_value(JS::VM&, JS::Value); }; // https://w3c.github.io/webcrypto/#pbkdf2-params struct PBKDF2Params : public AlgorithmParams { JS::Handle salt; u32 iterations; HashAlgorithmIdentifier hash; static JS::ThrowCompletionOr> from_value(JS::VM&, JS::Value); }; class AlgorithmMethods { public: virtual ~AlgorithmMethods(); virtual WebIDL::ExceptionOr> digest(AlgorithmParams const&, ByteBuffer const&) { return WebIDL::NotSupportedError::create(m_realm, "digest is not supported"_fly_string); } virtual WebIDL::ExceptionOr> import_key(AlgorithmParams const&, Bindings::KeyFormat, CryptoKey::InternalKeyData, bool, Vector const&) { return WebIDL::NotSupportedError::create(m_realm, "importKey is not supported"_fly_string); } virtual WebIDL::ExceptionOr, JS::NonnullGCPtr>> generate_key(AlgorithmParams const&, bool, Vector const&) { return WebIDL::NotSupportedError::create(m_realm, "generateKey is not supported"_fly_string); } static NonnullOwnPtr create(JS::Realm& realm) { return adopt_own(*new AlgorithmMethods(realm)); } protected: explicit AlgorithmMethods(JS::Realm& realm) : m_realm(realm) { } JS::Realm& m_realm; }; class PBKDF2 : public AlgorithmMethods { public: virtual WebIDL::ExceptionOr> import_key(AlgorithmParams const&, Bindings::KeyFormat, CryptoKey::InternalKeyData, bool, Vector const&) override; static NonnullOwnPtr create(JS::Realm& realm) { return adopt_own(*new PBKDF2(realm)); } private: explicit PBKDF2(JS::Realm& realm) : AlgorithmMethods(realm) { } }; class SHA : public AlgorithmMethods { public: virtual WebIDL::ExceptionOr> digest(AlgorithmParams const&, ByteBuffer const&) override; static NonnullOwnPtr create(JS::Realm& realm) { return adopt_own(*new SHA(realm)); } private: explicit SHA(JS::Realm& realm) : AlgorithmMethods(realm) { } }; }