55 lines
		
	
	
	
		
			2.5 KiB
			
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			55 lines
		
	
	
	
		
			2.5 KiB
			
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 
								 | 
							
								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');
							 | 
						||
| 
								 | 
							
								        });
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								});
							 |