You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			135 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			JavaScript
		
	
			
		
		
	
	
			135 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			JavaScript
		
	
/* global libsignal, textsecure */
 | 
						|
 | 
						|
describe('SignalProtocolStore', () => {
 | 
						|
  before(() => {
 | 
						|
    localStorage.clear();
 | 
						|
  });
 | 
						|
  const store = textsecure.storage.protocol;
 | 
						|
  const identifier = '+5558675309';
 | 
						|
  const identityKey = {
 | 
						|
    pubKey: libsignal.crypto.getRandomBytes(33),
 | 
						|
    privKey: libsignal.crypto.getRandomBytes(32),
 | 
						|
  };
 | 
						|
  const testKey = {
 | 
						|
    pubKey: libsignal.crypto.getRandomBytes(33),
 | 
						|
    privKey: libsignal.crypto.getRandomBytes(32),
 | 
						|
  };
 | 
						|
  it('retrieves my registration id', async () => {
 | 
						|
    store.put('registrationId', 1337);
 | 
						|
 | 
						|
    const reg = await store.getLocalRegistrationId();
 | 
						|
    assert.strictEqual(reg, 1337);
 | 
						|
  });
 | 
						|
  it('retrieves my identity key', async () => {
 | 
						|
    store.put('identityKey', identityKey);
 | 
						|
    const key = await store.getIdentityKeyPair();
 | 
						|
    assertEqualArrayBuffers(key.pubKey, identityKey.pubKey);
 | 
						|
    assertEqualArrayBuffers(key.privKey, identityKey.privKey);
 | 
						|
  });
 | 
						|
  it('stores identity keys', async () => {
 | 
						|
    await store.saveIdentity(identifier, testKey.pubKey);
 | 
						|
    const key = await store.loadIdentityKey(identifier);
 | 
						|
    assertEqualArrayBuffers(key, testKey.pubKey);
 | 
						|
  });
 | 
						|
  it('returns whether a key is trusted', async () => {
 | 
						|
    const newIdentity = libsignal.crypto.getRandomBytes(33);
 | 
						|
    await store.saveIdentity(identifier, testKey.pubKey);
 | 
						|
 | 
						|
    const trusted = await store.isTrustedIdentity(identifier, newIdentity);
 | 
						|
    if (trusted) {
 | 
						|
      throw new Error('Allowed to overwrite identity key');
 | 
						|
    }
 | 
						|
  });
 | 
						|
  it('returns whether a key is untrusted', async () => {
 | 
						|
    await store.saveIdentity(identifier, testKey.pubKey);
 | 
						|
    const trusted = await store.isTrustedIdentity(identifier, testKey.pubKey);
 | 
						|
 | 
						|
    if (!trusted) {
 | 
						|
      throw new Error('Allowed to overwrite identity key');
 | 
						|
    }
 | 
						|
  });
 | 
						|
  it('stores prekeys', async () => {
 | 
						|
    await store.storePreKey(1, testKey);
 | 
						|
 | 
						|
    const key = await store.loadPreKey(1);
 | 
						|
    assertEqualArrayBuffers(key.pubKey, testKey.pubKey);
 | 
						|
    assertEqualArrayBuffers(key.privKey, testKey.privKey);
 | 
						|
  });
 | 
						|
  it('deletes prekeys', async () => {
 | 
						|
    await store.storePreKey(2, testKey);
 | 
						|
    await store.removePreKey(2, testKey);
 | 
						|
 | 
						|
    const key = await store.loadPreKey(2);
 | 
						|
    assert.isUndefined(key);
 | 
						|
  });
 | 
						|
  it('stores signed prekeys', async () => {
 | 
						|
    await store.storeSignedPreKey(3, testKey);
 | 
						|
 | 
						|
    const key = await store.loadSignedPreKey(3);
 | 
						|
    assertEqualArrayBuffers(key.pubKey, testKey.pubKey);
 | 
						|
    assertEqualArrayBuffers(key.privKey, testKey.privKey);
 | 
						|
  });
 | 
						|
  it('deletes signed prekeys', async () => {
 | 
						|
    await store.storeSignedPreKey(4, testKey);
 | 
						|
    await store.removeSignedPreKey(4, testKey);
 | 
						|
 | 
						|
    const key = await store.loadSignedPreKey(4);
 | 
						|
    assert.isUndefined(key);
 | 
						|
  });
 | 
						|
  it('stores sessions', async () => {
 | 
						|
    const testRecord = 'an opaque string';
 | 
						|
    const devices = [1, 2, 3].map(deviceId => [identifier, deviceId].join('.'));
 | 
						|
 | 
						|
    await Promise.all(
 | 
						|
      devices.map(async encodedNumber => {
 | 
						|
        await store.storeSession(encodedNumber, testRecord + encodedNumber);
 | 
						|
      })
 | 
						|
    );
 | 
						|
 | 
						|
    const records = await Promise.all(
 | 
						|
      devices.map(store.loadSession.bind(store))
 | 
						|
    );
 | 
						|
 | 
						|
    for (let i = 0, max = records.length; i < max; i += 1) {
 | 
						|
      assert.strictEqual(records[i], testRecord + devices[i]);
 | 
						|
    }
 | 
						|
  });
 | 
						|
  it('removes all sessions for a number', async () => {
 | 
						|
    const testRecord = 'an opaque string';
 | 
						|
    const devices = [1, 2, 3].map(deviceId => [identifier, deviceId].join('.'));
 | 
						|
 | 
						|
    await Promise.all(
 | 
						|
      devices.map(async encodedNumber => {
 | 
						|
        await store.storeSession(encodedNumber, testRecord + encodedNumber);
 | 
						|
      })
 | 
						|
    );
 | 
						|
 | 
						|
    await store.removeAllSessions(identifier);
 | 
						|
 | 
						|
    const records = await Promise.all(
 | 
						|
      devices.map(store.loadSession.bind(store))
 | 
						|
    );
 | 
						|
 | 
						|
    for (let i = 0, max = records.length; i < max; i += 1) {
 | 
						|
      assert.isUndefined(records[i]);
 | 
						|
    }
 | 
						|
  });
 | 
						|
  it('returns deviceIds for a number', async () => {
 | 
						|
    const testRecord = 'an opaque string';
 | 
						|
    const devices = [1, 2, 3].map(deviceId => [identifier, deviceId].join('.'));
 | 
						|
 | 
						|
    await Promise.all(
 | 
						|
      devices.map(async encodedNumber => {
 | 
						|
        await store.storeSession(encodedNumber, testRecord + encodedNumber);
 | 
						|
      })
 | 
						|
    );
 | 
						|
 | 
						|
    const deviceIds = await store.getDeviceIds(identifier);
 | 
						|
    assert.sameMembers(deviceIds, [1, 2, 3]);
 | 
						|
  });
 | 
						|
  it('returns empty array for a number with no device ids', async () => {
 | 
						|
    const deviceIds = await store.getDeviceIds('foo');
 | 
						|
    assert.sameMembers(deviceIds, []);
 | 
						|
  });
 | 
						|
});
 |