Source code
Revision control
Copy as Markdown
Other Tools
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');
});
});
}