Skip to content
File

Blob: src/workerd/api/crypto/digest.h

cpp53 lines
1#pragma once
2 
3#include "impl.h"
4 
5#include <workerd/api/crypto/crypto.h>
6 
7KJ_DECLARE_NON_POLYMORPHIC(HMAC_CTX)
8 
9namespace workerd::api {
10class HmacContext final {
11 public:
12 using KeyData = kj::OneOf<kj::ArrayPtr<kj::byte>, CryptoKey::Impl*>;
13 
14 HmacContext(jsg::Lock& js, kj::StringPtr algorithm, KeyData key);
15 HmacContext(HmacContext&&) = default;
16 HmacContext& operator=(HmacContext&&) = default;
17 KJ_DISALLOW_COPY(HmacContext);
18 
19 void update(kj::ArrayPtr<kj::byte> data);
20 jsg::JsUint8Array digest(jsg::Lock& js);
21 
22 size_t size() const;
23 
24 private:
25 // Will be kj::Own<HMAC_CTX> while the HMAC data is being updated,
26 // and jsg::JsRef<jsg::JsUint8Array> after the digest() has been called.
27 kj::OneOf<kj::Own<HMAC_CTX>, jsg::JsRef<jsg::JsUint8Array>> state;
28};
29 
30class HashContext final {
31 public:
32 HashContext(kj::StringPtr algorithm, kj::Maybe<uint32_t> maybeXof);
33 HashContext(HashContext&&) = default;
34 HashContext& operator=(HashContext&&) = default;
35 KJ_DISALLOW_COPY(HashContext);
36 
37 void update(kj::ArrayPtr<kj::byte> data);
38 jsg::JsUint8Array digest(jsg::Lock& js);
39 HashContext clone(jsg::Lock& js, kj::Maybe<uint32_t> xofLen);
40 
41 size_t size() const;
42 
43 private:
44 HashContext(
45 kj::OneOf<kj::Own<EVP_MD_CTX>, jsg::JsRef<jsg::JsUint8Array>>, kj::Maybe<uint32_t> maybeXof);
46 
47 // Will be kj::Own<EVP_MD_CTX> while the hash data is being updated,
48 // and jsg::JsRef<jsg::JsUint8Array> after the digest() has been called.
49 kj::OneOf<kj::Own<EVP_MD_CTX>, jsg::JsRef<jsg::JsUint8Array>> state;
50 kj::Maybe<uint32_t> maybeXof;
51};
52} // namespace workerd::api