@@ -1271,7 +1271,7 @@ <h2>SubtleCrypto interface</h2>
1271
1271
);
1272
1272
Promise<ArrayBuffer> digest(
1273
1273
AlgorithmIdentifier algorithm,
1274
- BufferSource data
1274
+ ( BufferSource or async_sequence<BufferSource>) data
1275
1275
);
1276
1276
1277
1277
Promise<(CryptoKey or CryptoKeyPair)> generateKey(
@@ -1845,9 +1845,7 @@ <h4>The digest method</h4>
1845
1845
</li>
1846
1846
<li>
1847
1847
<p>
1848
- Let |data| be the result of
1849
- [= get a copy of the buffer source |
1850
- getting a copy of the bytes held by =] the `data` parameter passed to the
1848
+ Let |data| be the `data` parameter passed to the
1851
1849
{{SubtleCrypto/digest()}} method.
1852
1850
</p>
1853
1851
</li>
@@ -1865,6 +1863,133 @@ <h4>The digest method</h4>
1865
1863
|normalizedAlgorithm|.
1866
1864
</p>
1867
1865
</li>
1866
+ <li>
1867
+ <p>
1868
+ Let |bytesPromise| be a new Promise.
1869
+ </p>
1870
+ </li>
1871
+ <li>
1872
+ <dl class="switch">
1873
+ <dt>If |data| is a {{BufferSource}}:</dt>
1874
+ <dd>
1875
+ <ol>
1876
+ <li>
1877
+ <p>
1878
+ Let |bytes| be the result of
1879
+ [= get a copy of the buffer source |
1880
+ getting a copy of the bytes held by =] |data|.
1881
+ </p>
1882
+ </li>
1883
+ <li>
1884
+ <p>
1885
+ Resolve |bytesPromise| with |bytes|.
1886
+ </p>
1887
+ </li>
1888
+ </dd>
1889
+ <dt>
1890
+ Otherwise:
1891
+ </dt>
1892
+ <dd>
1893
+ <div class=note>
1894
+ <p>
1895
+ In this case, |data| is an [= async sequence type | async sequence =] of {{BufferSource}}s.
1896
+ </p>
1897
+ </div>
1898
+ <ol>
1899
+ <li>
1900
+ <p>
1901
+ Let |bytes| be an empty [= byte sequence =].
1902
+ </p>
1903
+ </li>
1904
+ <li>
1905
+ <p>
1906
+ Let |iterator| be the result of [= open an async sequence | opening =] |data|.
1907
+ </p>
1908
+ </li>
1909
+ <li>
1910
+ <p>
1911
+ If an error occurred, reject |bytesPromise| with
1912
+ |iterator| and terminate these steps.
1913
+ </p>
1914
+ </li>
1915
+ <li>
1916
+ <p>
1917
+ Let |getValueSteps| be the following list of steps:
1918
+ </p>
1919
+ <ol>
1920
+ <li>
1921
+ <p>
1922
+ Let |next| be the result of [= get an async iterator next value | getting the next value =] of |iterator|.
1923
+ </p>
1924
+ </li>
1925
+ <li>
1926
+ <p>
1927
+ [= promise/React =] to |next|:
1928
+ </p>
1929
+ <dl class="switch">
1930
+ <dt>If |next| was rejected with |reason|:</dt>
1931
+ <dd>
1932
+ <ol>
1933
+ <li>
1934
+ <p>
1935
+ Reject |bytesPromise| with |reason|.
1936
+ </p>
1937
+ </li>
1938
+ </ol>
1939
+ </dd>
1940
+ <dt>If |next| was fulfilled with |value|:</dt>
1941
+ <dd>
1942
+ <ol>
1943
+ <li>
1944
+ <p>
1945
+ If |value| is [= end of iteration =],
1946
+ resolve |bytesPromise| with |bytes|
1947
+ and terminate these steps.
1948
+ </p>
1949
+ </li>
1950
+ <li>
1951
+ <p>
1952
+ Append the result of [= get a copy of the buffer source |
1953
+ getting a copy of the bytes held by =] |value|
1954
+ to |bytes|.
1955
+ </p>
1956
+ </li>
1957
+ <li>
1958
+ <p>
1959
+ Perform |getValueSteps|.
1960
+ </p>
1961
+ </li>
1962
+ </ol>
1963
+ </dd>
1964
+ </dl>
1965
+ </li>
1966
+ </ol>
1967
+ </li>
1968
+ <li>
1969
+ <p>
1970
+ [= Queue a microtask =] to perform |getValueSteps|.
1971
+ </p>
1972
+ </li>
1973
+ </ol>
1974
+ <div class=note>
1975
+ <p>
1976
+ The implementation may wish to compute the hash digest
1977
+ incrementally, instead of waiting until all data is
1978
+ available, in order to conserve memory.
1979
+ </p>
1980
+ <p>
1981
+ Additionally, if the |iterator| returned by
1982
+ [= open an async sequence | opening =] |data|
1983
+ is the iterator defined by <a data-cite="streams#readablestream">`ReadableStream`</a>,
1984
+ the implementation may wish to optimize the steps
1985
+ above, for example by reading the stream directly,
1986
+ and/or <a data-cite="streams#transferrable-streams">transferring</a>
1987
+ the stream to the [= in parallel | parallel =] steps below.
1988
+ </p>
1989
+ </div>
1990
+ </dd>
1991
+ </dl>
1992
+ </li>
1868
1993
<li>
1869
1994
<p>
1870
1995
Let |realm| be the [= relevant realm =] of [= this =].
@@ -1892,29 +2017,51 @@ <h4>The digest method</h4>
1892
2017
</li>
1893
2018
<li>
1894
2019
<p>
1895
- Let |digest| be the result of performing the digest
1896
- operation specified by |normalizedAlgorithm| using
1897
- |algorithm|, with |data|
1898
- as |message|.
1899
- </p>
1900
- </li>
1901
- <li>
1902
- <p>
1903
- [= Queue a global task =] on the [= crypto task source =],
1904
- given |realm|'s global object, to perform the remaining steps.
1905
- </p>
1906
- </li>
1907
- <li>
1908
- <p>
1909
- Let |result| be the result of [= ArrayBuffer/create | creating =] an {{ArrayBuffer}}
1910
- in |realm|, containing |digest|.
1911
- </p>
1912
- </li>
1913
- <li>
1914
- <p>
1915
- Resolve |promise| with
1916
- |result|.
2020
+ [= promise/React =] to |bytesPromise|:
1917
2021
</p>
2022
+ <dl class="switch">
2023
+ <dt>If |bytesPromise| was rejected with |reason|:</dt>
2024
+ <dd>
2025
+ <ol>
2026
+ <li>
2027
+ <p>
2028
+ [= exception/Throw =] |reason|.
2029
+ </p>
2030
+ </li>
2031
+ </ol>
2032
+ </dd>
2033
+ <dt>If |bytesPromise| was fulfilled with value |bytes|:</dt>
2034
+ <dd>
2035
+ <ol>
2036
+ <li>
2037
+ <p>
2038
+ Let |digest| be the result of performing the digest
2039
+ operation specified by |normalizedAlgorithm| using
2040
+ |algorithm|, with |bytes|
2041
+ as |message|.
2042
+ </p>
2043
+ </li>
2044
+ <li>
2045
+ <p>
2046
+ [= Queue a global task =] on the [= crypto task source =],
2047
+ given |realm|'s global object, to perform the remaining steps.
2048
+ </p>
2049
+ </li>
2050
+ <li>
2051
+ <p>
2052
+ Let |result| be the result of [= ArrayBuffer/create | creating =] an {{ArrayBuffer}}
2053
+ in |realm|, containing |digest|.
2054
+ </p>
2055
+ </li>
2056
+ <li>
2057
+ <p>
2058
+ Resolve |promise| with
2059
+ |result|.
2060
+ </p>
2061
+ </li>
2062
+ </ol>
2063
+ </dd>
2064
+ </dl>
1918
2065
</li>
1919
2066
</ol>
1920
2067
</section>
0 commit comments