Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

/* Any copyright is dedicated to the Public Domain.
"use strict";
const { ArchiveUtils } = ChromeUtils.importESModule(
"resource:///modules/backup/ArchiveUtils.sys.mjs"
);
const { NonceUtils } = ChromeUtils.importESModule(
"resource:///modules/backup/ArchiveEncryption.sys.mjs"
);
/**
* Tests that we can increment a nonce and set the last chunk byte.
*/
add_task(async function test_nonce_arithmetic() {
let nonce = new Uint8Array(16);
NonceUtils.incrementNonce(nonce);
Assert.deepEqual(
nonce,
new Uint8Array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1])
);
NonceUtils.incrementNonce(nonce, 255);
Assert.deepEqual(
nonce,
new Uint8Array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0])
);
NonceUtils.incrementNonce(nonce);
Assert.deepEqual(
nonce,
new Uint8Array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1])
);
NonceUtils.incrementNonce(nonce, 255);
Assert.deepEqual(
nonce,
new Uint8Array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0])
);
NonceUtils.incrementNonce(nonce, 257);
Assert.deepEqual(
nonce,
new Uint8Array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1])
);
Assert.ok(
!NonceUtils.lastChunkSetOnNonce(nonce),
"Last chunk bit hasn't been flipped yet."
);
// When marking the last chunk on the nonce, we set the 12th byte of the
// counter to 0x01.
NonceUtils.setLastChunkOnNonce(nonce);
Assert.deepEqual(
nonce,
new Uint8Array([0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1])
);
Assert.ok(
NonceUtils.lastChunkSetOnNonce(nonce),
"Last chunk bit was flipped."
);
});
/**
* Tests that the nonce counter will throw if it is incremented past a value
* indicating a greater number of bytes in the backup than
* ArchiveUtils.ARCHIVE_MAX_BYTES_SIZE.
*/
add_task(async function test_exceed_size() {
let nonce = new Uint8Array(16);
// Get us right up to the limit. Increasing by one past this value should
// cause us to throw.
NonceUtils.incrementNonce(
nonce,
ArchiveUtils.ARCHIVE_MAX_BYTES_SIZE /
ArchiveUtils.ARCHIVE_CHUNK_MAX_BYTES_SIZE
);
Assert.throws(() => {
NonceUtils.incrementNonce(nonce);
}, /Exceeded/);
});