fix(app): the short reading's nits on the device
- Deleting an identified account whose security can't be read (the instance out of reach) says so and deletes nothing; it went on to a deletion by the session alone, refused for an account with a password, and the person saw a spinner, then nothing. A refusal still leaves the session's own deletion. - InstanceChoice's sharesStorage is required, so no app leaves it out and removes a folder another instance uses. - A PasswordUnlock forgotten is spent: its secrets read again fail (StateError) rather than make a proof or a wrapping of zeros. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
parent
7ac6eb75b4
commit
012f2375a5
2 changed files with 106 additions and 21 deletions
|
|
@ -53,9 +53,8 @@ void main() {
|
|||
finished: finished,
|
||||
);
|
||||
|
||||
bool wiped(PasswordUnlock unlock) =>
|
||||
unlock.srpSecret.every((byte) => byte == 0) &&
|
||||
unlock.keyEncryptionKey.every((byte) => byte == 0);
|
||||
/// Whether [unlock] was wiped, and so spent (the short reading).
|
||||
bool wiped(PasswordUnlock unlock) => unlock.isForgotten;
|
||||
|
||||
test(
|
||||
'wipes what the password unlocked once signed in, once another '
|
||||
|
|
|
|||
|
|
@ -16,9 +16,34 @@ void main() {
|
|||
),
|
||||
srpSecret: Uint8List.fromList(List.filled(32, 7)),
|
||||
keyEncryptionKey: Uint8List.fromList(List.filled(32, 9)),
|
||||
)..forget();
|
||||
);
|
||||
final x = unlock.srpSecret;
|
||||
final key = unlock.keyEncryptionKey;
|
||||
|
||||
expect(unlock.srpSecret, everyElement(0));
|
||||
expect(unlock.keyEncryptionKey, everyElement(0));
|
||||
unlock.forget();
|
||||
|
||||
expect(x, everyElement(0));
|
||||
expect(key, everyElement(0));
|
||||
});
|
||||
|
||||
test('a forgotten unlock is spent: its secrets are read no more, so no '
|
||||
'proof is made of zeros (the short reading)', () {
|
||||
final unlock = PasswordUnlock(
|
||||
salt: Uint8List(16),
|
||||
costs: protocol.PasswordCosts(
|
||||
algorithm: 'argon2id13',
|
||||
opsLimit: 3,
|
||||
memLimit: 64 * 1024 * 1024,
|
||||
),
|
||||
srpSecret: Uint8List.fromList(List.filled(32, 7)),
|
||||
keyEncryptionKey: Uint8List.fromList(List.filled(32, 9)),
|
||||
);
|
||||
expect(unlock.isForgotten, isFalse);
|
||||
|
||||
unlock.forget();
|
||||
|
||||
expect(unlock.isForgotten, isTrue);
|
||||
expect(() => unlock.srpSecret, throwsStateError);
|
||||
expect(() => unlock.keyEncryptionKey, throwsStateError);
|
||||
});
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue