| function runDigestTests(subtle, sourceData, getVectors) { |
| function algorithmName(algorithm) { |
| return typeof algorithm === 'string' ? algorithm : algorithm.name; |
| } |
| |
| function withNameGetter(algorithm, getter) { |
| var result = typeof algorithm === 'string' ? {} : { ...algorithm }; |
| Object.defineProperty(result, 'name', { |
| enumerable: true, |
| get: getter, |
| }); |
| return result; |
| } |
| |
| Object.keys(sourceData).forEach(function (size) { |
| getVectors(size).forEach(function (vector) { |
| promise_test(function () { |
| return subtle.digest(vector.algorithm, sourceData[size]) |
| .then(function (result) { |
| assert_true( |
| equalBuffers(result, vector.expected), |
| 'digest matches expected' |
| ); |
| }); |
| }, vector.label); |
| |
| if (!vector.mutations || sourceData[size].length === 0) { |
| return; |
| } |
| |
| promise_test(function () { |
| var buffer = new Uint8Array(sourceData[size]); |
| buffer[0] = ~buffer[0]; |
| var algorithm = withNameGetter(vector.algorithm, function () { |
| buffer[0] = sourceData[size][0]; |
| return algorithmName(vector.algorithm); |
| }); |
| return subtle.digest(algorithm, buffer).then(function (result) { |
| assert_true( |
| equalBuffers(result, vector.expected), |
| 'digest matches expected' |
| ); |
| }); |
| }, vector.label + ' and altered buffer during call'); |
| |
| promise_test(function () { |
| var buffer = new Uint8Array(sourceData[size]); |
| var promise = subtle.digest(vector.algorithm, buffer) |
| .then(function (result) { |
| assert_true( |
| equalBuffers(result, vector.expected), |
| 'digest matches expected' |
| ); |
| }); |
| buffer[0] = ~buffer[0]; |
| return promise; |
| }, vector.label + ' and altered buffer after call'); |
| |
| promise_test(function () { |
| var buffer = new Uint8Array(sourceData[size]); |
| var algorithm = vector.transferBeforeCall |
| ? vector.algorithm |
| : withNameGetter(vector.algorithm, function () { |
| buffer.buffer.transfer(); |
| return algorithmName(vector.algorithm); |
| }); |
| if (vector.transferBeforeCall) { |
| buffer.buffer.transfer(); |
| } |
| return subtle.digest(algorithm, buffer).then(function (result) { |
| assert_true( |
| equalBuffers(result, vector.emptyExpected), |
| 'digest on transferred buffer should match result for empty buffer' |
| ); |
| }); |
| }, vector.label + ' and transferred buffer during call'); |
| |
| promise_test(function () { |
| var buffer = new Uint8Array(sourceData[size]); |
| var promise = subtle.digest(vector.algorithm, buffer) |
| .then(function (result) { |
| assert_true( |
| equalBuffers(result, vector.expected), |
| 'digest matches expected' |
| ); |
| }); |
| buffer.buffer.transfer(); |
| return promise; |
| }, vector.label + ' and transferred buffer after call'); |
| }); |
| }); |
| } |