describe('encrypting and decrypting profile data', function() { var NAME_PADDED_LENGTH = 26; describe('encrypting and decrypting profile names', function() { it('pads, encrypts, decrypts, and unpads a short string', function() { var name = 'Alice'; var buffer = dcodeIO.ByteBuffer.wrap(name).toArrayBuffer(); var key = libsignal.crypto.getRandomBytes(32); return textsecure.crypto .encryptProfileName(buffer, key) .then(function(encrypted) { assert(encrypted.byteLength === NAME_PADDED_LENGTH + 16 + 12); return textsecure.crypto .decryptProfileName(encrypted, key) .then(function(decrypted) { assert.strictEqual( dcodeIO.ByteBuffer.wrap(decrypted).toString('utf8'), 'Alice' ); }); }); }); it('works for empty string', function() { var name = dcodeIO.ByteBuffer.wrap('').toArrayBuffer(); var key = libsignal.crypto.getRandomBytes(32); return textsecure.crypto .encryptProfileName(name.buffer, key) .then(function(encrypted) { assert(encrypted.byteLength === NAME_PADDED_LENGTH + 16 + 12); return textsecure.crypto .decryptProfileName(encrypted, key) .then(function(decrypted) { assert.strictEqual(decrypted.byteLength, 0); assert.strictEqual( dcodeIO.ByteBuffer.wrap(decrypted).toString('utf8'), '' ); }); }); }); }); describe('encrypting and decrypting profile avatars', function() { it('encrypts and decrypts', function() { var buffer = dcodeIO.ByteBuffer.wrap('This is an avatar').toArrayBuffer(); var key = libsignal.crypto.getRandomBytes(32); return textsecure.crypto .encryptProfile(buffer, key) .then(function(encrypted) { assert(encrypted.byteLength === buffer.byteLength + 16 + 12); return textsecure.crypto .decryptProfile(encrypted, key) .then(function(decrypted) { assertEqualArrayBuffers(buffer, decrypted); }); }); }); it('throws when decrypting with the wrong key', function() { var buffer = dcodeIO.ByteBuffer.wrap('This is an avatar').toArrayBuffer(); var key = libsignal.crypto.getRandomBytes(32); var bad_key = libsignal.crypto.getRandomBytes(32); return textsecure.crypto .encryptProfile(buffer, key) .then(function(encrypted) { assert(encrypted.byteLength === buffer.byteLength + 16 + 12); return textsecure.crypto .decryptProfile(encrypted, bad_key) .catch(function(error) { assert.strictEqual(error.name, 'ProfileDecryptError'); }); }); }); }); });