#pragma once #include "impl.h" #include KJ_DECLARE_NON_POLYMORPHIC(HMAC_CTX) namespace workerd::api { class HmacContext final { public: using KeyData = kj::OneOf, CryptoKey::Impl*>; HmacContext(jsg::Lock& js, kj::StringPtr algorithm, KeyData key); HmacContext(HmacContext&&) = default; HmacContext& operator=(HmacContext&&) = default; KJ_DISALLOW_COPY(HmacContext); void update(kj::ArrayPtr data); jsg::JsUint8Array digest(jsg::Lock& js); size_t size() const; private: // Will be kj::Own while the HMAC data is being updated, // and jsg::JsRef after the digest() has been called. kj::OneOf, jsg::JsRef> state; }; class HashContext final { public: HashContext(kj::StringPtr algorithm, kj::Maybe maybeXof); HashContext(HashContext&&) = default; HashContext& operator=(HashContext&&) = default; KJ_DISALLOW_COPY(HashContext); void update(kj::ArrayPtr data); jsg::JsUint8Array digest(jsg::Lock& js); HashContext clone(jsg::Lock& js, kj::Maybe xofLen); size_t size() const; private: HashContext( kj::OneOf, jsg::JsRef>, kj::Maybe maybeXof); // Will be kj::Own while the hash data is being updated, // and jsg::JsRef after the digest() has been called. kj::OneOf, jsg::JsRef> state; kj::Maybe maybeXof; }; } // namespace workerd::api