86 lines
2.2 KiB
JavaScript
86 lines
2.2 KiB
JavaScript
/* Any copyright is dedicated to the Public Domain.
|
|
https://creativecommons.org/publicdomain/zero/1.0/ */
|
|
|
|
"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/);
|
|
});
|