@interop/http-digest-header 3.0.0 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -85,6 +85,11 @@ const verifyResult = await httpDigest.verifyHeaderValue({
85
85
  // -> { verified: false }
86
86
  ```
87
87
 
88
+ `data` may be a string, a JSON-serializable object, a `Uint8Array`, a `Blob`, or
89
+ a `ReadableStream<Uint8Array>`. A `Blob` or stream is hashed incrementally, one
90
+ chunk at a time, so a large file upload is never held in memory in full. A
91
+ stream is consumed by hashing it.
92
+
88
93
  ### Usage in React Native
89
94
 
90
95
  In React Native, this library's `react-native` export resolves the digest
@@ -1,9 +1,11 @@
1
- type DigestData = string | object | Blob | Uint8Array;
1
+ type DigestData = string | object | Blob | Uint8Array | ReadableStream<Uint8Array>;
2
2
  /**
3
3
  * Creates a value suitable for the HTTP `Digest` header.
4
4
  *
5
5
  * @param options - The options to use.
6
6
  * @param options.data - The data to be hashed (a request or response body).
7
+ * A `Blob` or `ReadableStream` is hashed incrementally, one chunk at a time,
8
+ * so memory use does not grow with its size. A stream is consumed.
7
9
  * @param options.algorithm - Hash algorithm to use (e.g. 'sha256').
8
10
  * @param options.useMultihash - Whether to encode via multihash; if false, the
9
11
  * hash will be base64-encoded (non-url).
@@ -32,5 +34,27 @@ export declare function verifyHeaderValue({ data, headerValue }: {
32
34
  verified: boolean;
33
35
  error?: Error;
34
36
  }>;
37
+ /**
38
+ * Verifies an already-computed body digest against an HTTP `Digest` header
39
+ * value. For callers that hash a body incrementally (e.g. while streaming it)
40
+ * and hold only the resulting raw digest bytes rather than the body itself --
41
+ * `verifyHeaderValue` covers the have-the-body case. Supports the same header
42
+ * forms as the rest of this library: the multihash form (`mh=u...`) and the
43
+ * base64 `SHA-256=...` form (optionally colon-wrapped per RFC 9651).
44
+ *
45
+ * @param options - The options to use.
46
+ * @param options.digest - The raw digest bytes (a 32-byte SHA-256 digest).
47
+ * @param options.headerValue - The digest header value to verify against.
48
+ *
49
+ * @returns The verification result; `error` is set when the header is
50
+ * malformed or uses an unsupported algorithm.
51
+ */
52
+ export declare function verifyDigest({ digest, headerValue }: {
53
+ digest: Uint8Array;
54
+ headerValue: string;
55
+ }): {
56
+ verified: boolean;
57
+ error?: Error;
58
+ };
35
59
  export {};
36
60
  //# sourceMappingURL=httpDigest.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"httpDigest.d.ts","sourceRoot":"","sources":["../src/httpDigest.ts"],"names":[],"mappings":"AAMA,KAAK,UAAU,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,UAAU,CAAA;AAErD;;;;;;;;;;GAUG;AACH,wBAAsB,iBAAiB,CAAC,EACtC,IAAI,EACJ,SAAoB,EACpB,YAAmB,EACpB,GAAE;IACD,IAAI,CAAC,EAAE,UAAU,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,YAAY,CAAC,EAAE,OAAO,CAAA;CAClB,GAAG,OAAO,CAAC,MAAM,CAAC,CAOvB;AAED;;;;;;;;;GASG;AACH,wBAAsB,iBAAiB,CAAC,EACtC,IAAI,EACJ,WAAW,EACZ,EAAE;IACD,IAAI,EAAE,UAAU,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;CACpB,GAAG,OAAO,CAAC;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC,CAahD"}
1
+ {"version":3,"file":"httpDigest.d.ts","sourceRoot":"","sources":["../src/httpDigest.ts"],"names":[],"mappings":"AAMA,KAAK,UAAU,GACX,MAAM,GACN,MAAM,GACN,IAAI,GACJ,UAAU,GACV,cAAc,CAAC,UAAU,CAAC,CAAA;AAE9B;;;;;;;;;;;;GAYG;AACH,wBAAsB,iBAAiB,CAAC,EACtC,IAAI,EACJ,SAAoB,EACpB,YAAmB,EACpB,GAAE;IACD,IAAI,CAAC,EAAE,UAAU,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,YAAY,CAAC,EAAE,OAAO,CAAA;CAClB,GAAG,OAAO,CAAC,MAAM,CAAC,CAOvB;AAED;;;;;;;;;GASG;AACH,wBAAsB,iBAAiB,CAAC,EACtC,IAAI,EACJ,WAAW,EACZ,EAAE;IACD,IAAI,EAAE,UAAU,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;CACpB,GAAG,OAAO,CAAC;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC,CAahD;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,YAAY,CAAC,EAC3B,MAAM,EACN,WAAW,EACZ,EAAE;IACD,MAAM,EAAE,UAAU,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;CACpB,GAAG;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,KAAK,CAAA;CAAE,CASvC"}
@@ -1,13 +1,15 @@
1
1
  /*!
2
2
  * Copyright (c) 2019-2025 Digital Bazaar, Inc. All rights reserved.
3
3
  */
4
- import { base64Encode, base64urlEncode } from './util.js';
4
+ import { base64Encode, base64urlEncode, createSha256 } from './util.js';
5
5
  import { sha256 } from './digest.js';
6
6
  /**
7
7
  * Creates a value suitable for the HTTP `Digest` header.
8
8
  *
9
9
  * @param options - The options to use.
10
10
  * @param options.data - The data to be hashed (a request or response body).
11
+ * A `Blob` or `ReadableStream` is hashed incrementally, one chunk at a time,
12
+ * so memory use does not grow with its size. A stream is consumed.
11
13
  * @param options.algorithm - Hash algorithm to use (e.g. 'sha256').
12
14
  * @param options.useMultihash - Whether to encode via multihash; if false, the
13
15
  * hash will be base64-encoded (non-url).
@@ -46,6 +48,31 @@ export async function verifyHeaderValue({ data, headerValue }) {
46
48
  return { verified: false, error: error };
47
49
  }
48
50
  }
51
+ /**
52
+ * Verifies an already-computed body digest against an HTTP `Digest` header
53
+ * value. For callers that hash a body incrementally (e.g. while streaming it)
54
+ * and hold only the resulting raw digest bytes rather than the body itself --
55
+ * `verifyHeaderValue` covers the have-the-body case. Supports the same header
56
+ * forms as the rest of this library: the multihash form (`mh=u...`) and the
57
+ * base64 `SHA-256=...` form (optionally colon-wrapped per RFC 9651).
58
+ *
59
+ * @param options - The options to use.
60
+ * @param options.digest - The raw digest bytes (a 32-byte SHA-256 digest).
61
+ * @param options.headerValue - The digest header value to verify against.
62
+ *
63
+ * @returns The verification result; `error` is set when the header is
64
+ * malformed or uses an unsupported algorithm.
65
+ */
66
+ export function verifyDigest({ digest, headerValue }) {
67
+ try {
68
+ const { key, encodedDigest } = _parseHeaderValue(headerValue);
69
+ const expectedDigest = key === 'mh' ? _createMultihash({ digest }) : base64Encode(digest);
70
+ return { verified: encodedDigest === expectedDigest };
71
+ }
72
+ catch (error) {
73
+ return { verified: false, error: error };
74
+ }
75
+ }
49
76
  async function _createHeaderValueComponents({ data, algorithm = 'sha256', useMultihash = true }) {
50
77
  if (algorithm !== 'sha256') {
51
78
  throw new Error(`Algorithm "${algorithm}" is not supported.`);
@@ -59,6 +86,15 @@ async function _createHeaderValueComponents({ data, algorithm = 'sha256', useMul
59
86
  function _createMultihash({ digest }) {
60
87
  // format as multihash digest
61
88
  // sha2-256: 0x12, length: 32 (0x20), digest value
89
+ //
90
+ // The ecosystem's general multihash byte codec lives in
91
+ // `@interop/data-integrity-core/multihash`; this site deliberately keeps
92
+ // its local bytes instead of adopting it. The `mh=` header form is a
93
+ // preexisting wire convention frozen at sha2-256, so the encode side is
94
+ // this fixed two-byte prefix, and the verify paths compare encoded
95
+ // strings rather than decoding -- the codec's strict decoder would never
96
+ // run. Adopting it would also give this generic HTTP utility a dependency
97
+ // on the SSI-ecosystem types package below which it sits.
62
98
  const mh = new Uint8Array(34);
63
99
  mh[0] = 0x12;
64
100
  mh[1] = 0x20;
@@ -98,13 +134,49 @@ function _parseHeaderValue(headerValue) {
98
134
  return { key, algorithm, encodedDigest };
99
135
  }
100
136
  async function _getDigest({ data, algorithm }) {
101
- const normalized = await _normalizeData(data);
102
- if (algorithm === 'sha256') {
103
- return sha256(normalized);
137
+ if (algorithm !== 'sha256') {
138
+ throw new Error(`Algorithm "${algorithm}" is not unsupported.`);
139
+ }
140
+ // React Native's `Blob` has no `stream()`; it takes the buffered path below.
141
+ if (data instanceof Blob && typeof data.stream === 'function') {
142
+ return _sha256Stream(data.stream());
143
+ }
144
+ if (typeof ReadableStream !== 'undefined' && data instanceof ReadableStream) {
145
+ return _sha256Stream(data);
146
+ }
147
+ return sha256(await _normalizeData(data));
148
+ }
149
+ /**
150
+ * Hashes a byte stream incrementally, so only one chunk is held at a time.
151
+ *
152
+ * @param stream - The byte stream to hash; it is read to the end, or
153
+ * cancelled if hashing fails.
154
+ *
155
+ * @returns Resolves to the raw SHA-256 digest.
156
+ */
157
+ async function _sha256Stream(stream) {
158
+ const hash = createSha256();
159
+ const reader = stream.getReader();
160
+ try {
161
+ for (;;) {
162
+ const { done, value } = await reader.read();
163
+ if (done) {
164
+ return hash.digest();
165
+ }
166
+ hash.update(value);
167
+ }
168
+ }
169
+ catch (error) {
170
+ // release the source (e.g. a fetch body) instead of leaving it half-read;
171
+ // an already-errored stream rejects `cancel()`, which is not of interest
172
+ await reader.cancel(error).catch(() => { });
173
+ throw error;
174
+ }
175
+ finally {
176
+ reader.releaseLock();
104
177
  }
105
- throw new Error(`Algorithm "${algorithm}" is not unsupported.`);
106
178
  }
107
- // normalize all inputs to a `Uint8Array` for hashing
179
+ // normalize all in-memory inputs to a `Uint8Array` for hashing
108
180
  async function _normalizeData(data) {
109
181
  if (data instanceof Uint8Array) {
110
182
  return data;
@@ -1 +1 @@
1
- {"version":3,"file":"httpDigest.js","sourceRoot":"","sources":["../src/httpDigest.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"httpDigest.js","sourceRoot":"","sources":["../src/httpDigest.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
2
  * Copyright (c) 2019-2020 Digital Bazaar, Inc. All rights reserved.
3
3
  */
4
- export { createHeaderValue, verifyHeaderValue } from './httpDigest.js';
4
+ export { createHeaderValue, verifyDigest, verifyHeaderValue } from './httpDigest.js';
5
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,iBAAiB,EAClB,MAAM,iBAAiB,CAAA"}
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
2
  * Copyright (c) 2019-2020 Digital Bazaar, Inc. All rights reserved.
3
3
  */
4
- export { createHeaderValue, verifyHeaderValue } from './httpDigest.js';
4
+ export { createHeaderValue, verifyDigest, verifyHeaderValue } from './httpDigest.js';
5
5
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,iBAAiB,EAClB,MAAM,iBAAiB,CAAA"}
@@ -1,6 +1,13 @@
1
- /*!
2
- * Copyright (c) 2021-2025 Digital Bazaar, Inc. All rights reserved.
1
+ /**
2
+ * Starts an incremental SHA-256 hash. WebCrypto has no incremental digest,
3
+ * so this uses `@noble/hashes`.
4
+ *
5
+ * @returns A hasher to feed chunks to with `update()`, then `digest()` once.
3
6
  */
7
+ export declare function createSha256(): {
8
+ update(chunk: Uint8Array): void;
9
+ digest(): Uint8Array;
10
+ };
4
11
  export declare function base64Encode(bytes: Uint8Array): string;
5
12
  export declare function base64urlEncode(bytes: Uint8Array): string;
6
13
  //# sourceMappingURL=util-browser.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"util-browser.d.ts","sourceRoot":"","sources":["../src/util-browser.ts"],"names":[],"mappings":"AAAA;;GAEG;AAWH,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAMtD;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CASzD"}
1
+ {"version":3,"file":"util-browser.d.ts","sourceRoot":"","sources":["../src/util-browser.ts"],"names":[],"mappings":"AAKA;;;;;GAKG;AACH,wBAAgB,YAAY,IAAI;IAC9B,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAAA;IAC/B,MAAM,IAAI,UAAU,CAAA;CACrB,CAEA;AAWD,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAMtD;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CASzD"}
@@ -1,6 +1,16 @@
1
1
  /*!
2
2
  * Copyright (c) 2021-2025 Digital Bazaar, Inc. All rights reserved.
3
3
  */
4
+ import { sha256 } from '@noble/hashes/sha2.js';
5
+ /**
6
+ * Starts an incremental SHA-256 hash. WebCrypto has no incremental digest,
7
+ * so this uses `@noble/hashes`.
8
+ *
9
+ * @returns A hasher to feed chunks to with `update()`, then `digest()` once.
10
+ */
11
+ export function createSha256() {
12
+ return sha256.create();
13
+ }
4
14
  export function base64Encode(bytes) {
5
15
  const maybe = bytes;
6
16
  if (maybe.toBase64) {
@@ -1 +1 @@
1
- {"version":3,"file":"util-browser.js","sourceRoot":"","sources":["../src/util-browser.ts"],"names":[],"mappings":"AAAA;;GAEG;AAWH,MAAM,UAAU,YAAY,CAAC,KAAiB;IAC5C,MAAM,KAAK,GAAG,KAAsB,CAAA;IACpC,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACnB,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAA;IACzB,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAA;AACvE,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAiB;IAC/C,MAAM,KAAK,GAAG,KAAsB,CAAA;IACpC,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACnB,OAAO,KAAK,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAA;IACrE,CAAC;IACD,OAAO,YAAY,CAAC,KAAK,CAAC;SACvB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;AACxB,CAAC"}
1
+ {"version":3,"file":"util-browser.js","sourceRoot":"","sources":["../src/util-browser.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AAE9C;;;;;GAKG;AACH,MAAM,UAAU,YAAY;IAI1B,OAAO,MAAM,CAAC,MAAM,EAAE,CAAA;AACxB,CAAC;AAWD,MAAM,UAAU,YAAY,CAAC,KAAiB;IAC5C,MAAM,KAAK,GAAG,KAAsB,CAAA;IACpC,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACnB,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAA;IACzB,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAA;AACvE,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAiB;IAC/C,MAAM,KAAK,GAAG,KAAsB,CAAA;IACpC,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACnB,OAAO,KAAK,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAA;IACrE,CAAC;IACD,OAAO,YAAY,CAAC,KAAK,CAAC;SACvB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;AACxB,CAAC"}
package/dist/util.d.ts CHANGED
@@ -1,6 +1,12 @@
1
- /*!
2
- * Copyright (c) 2021-2025 Digital Bazaar, Inc. All rights reserved.
1
+ /**
2
+ * Starts an incremental SHA-256 hash, backed by native `node:crypto`.
3
+ *
4
+ * @returns A hasher to feed chunks to with `update()`, then `digest()` once.
3
5
  */
6
+ export declare function createSha256(): {
7
+ update(chunk: Uint8Array): void;
8
+ digest(): Uint8Array;
9
+ };
4
10
  export declare function base64Encode(bytes: Uint8Array): string;
5
11
  export declare function base64urlEncode(bytes: Uint8Array): string;
6
12
  //# sourceMappingURL=util.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAItD;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAIzD"}
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAKA;;;;GAIG;AACH,wBAAgB,YAAY,IAAI;IAC9B,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAAA;IAC/B,MAAM,IAAI,UAAU,CAAA;CACrB,CAQA;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAItD;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAIzD"}
package/dist/util.js CHANGED
@@ -1,6 +1,21 @@
1
1
  /*!
2
2
  * Copyright (c) 2021-2025 Digital Bazaar, Inc. All rights reserved.
3
3
  */
4
+ import { createHash } from 'node:crypto';
5
+ /**
6
+ * Starts an incremental SHA-256 hash, backed by native `node:crypto`.
7
+ *
8
+ * @returns A hasher to feed chunks to with `update()`, then `digest()` once.
9
+ */
10
+ export function createSha256() {
11
+ const hash = createHash('sha256');
12
+ return {
13
+ update: chunk => {
14
+ hash.update(chunk);
15
+ },
16
+ digest: () => new Uint8Array(hash.digest())
17
+ };
18
+ }
4
19
  export function base64Encode(bytes) {
5
20
  return Buffer.from(bytes.buffer, bytes.byteOffset, bytes.byteLength).toString('base64');
6
21
  }
package/dist/util.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,KAAiB;IAC5C,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,QAAQ,CAC3E,QAAQ,CACT,CAAA;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAiB;IAC/C,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,QAAQ,CAC3E,WAAW,CACZ,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAExC;;;;GAIG;AACH,MAAM,UAAU,YAAY;IAI1B,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAA;IACjC,OAAO;QACL,MAAM,EAAE,KAAK,CAAC,EAAE;YACd,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QACpB,CAAC;QACD,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;KAC5C,CAAA;AACH,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAiB;IAC5C,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,QAAQ,CAC3E,QAAQ,CACT,CAAA;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAiB;IAC/C,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,QAAQ,CAC3E,WAAW,CACZ,CAAA;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@interop/http-digest-header",
3
- "version": "3.0.0",
3
+ "version": "3.2.0",
4
4
  "description": "Minimal isomorphic library (Node.js and browser) for creating and verifying Digest headers for HTTP Signatures",
5
5
  "license": "BSD-3-Clause",
6
6
  "scripts": {
@@ -88,5 +88,8 @@
88
88
  "engines": {
89
89
  "node": ">=24.0"
90
90
  },
91
- "packageManager": "pnpm@11.5.0"
91
+ "packageManager": "pnpm@11.5.0",
92
+ "dependencies": {
93
+ "@noble/hashes": "^2.4.0"
94
+ }
92
95
  }