|  |  |  | /* global libsignal, libloki, textsecure, StringView */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 'use strict'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | describe('Storage', () => { | 
					
						
							|  |  |  |   let testKey; | 
					
						
							|  |  |  |   const store = textsecure.storage.protocol; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   describe('#getPreKeyBundleForContact', () => { | 
					
						
							|  |  |  |     beforeEach(async () => { | 
					
						
							|  |  |  |       clearDatabase(); | 
					
						
							|  |  |  |       testKey = { | 
					
						
							|  |  |  |         pubKey: libsignal.crypto.getRandomBytes(33), | 
					
						
							|  |  |  |         privKey: libsignal.crypto.getRandomBytes(32), | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |       textsecure.storage.put('signedKeyId', 2); | 
					
						
							|  |  |  |       await store.storeSignedPreKey(1, testKey); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should generate a new prekey bundle for a new contact', async () => { | 
					
						
							|  |  |  |       const pubKey = libsignal.crypto.getRandomBytes(32); | 
					
						
							|  |  |  |       const pubKeyString = StringView.arrayBufferToHex(pubKey); | 
					
						
							|  |  |  |       const preKeyIdBefore = textsecure.storage.get('maxPreKeyId', 1); | 
					
						
							|  |  |  |       const newBundle = await libloki.storage.getPreKeyBundleForContact( | 
					
						
							|  |  |  |         pubKeyString | 
					
						
							|  |  |  |       ); | 
					
						
							|  |  |  |       const preKeyIdAfter = textsecure.storage.get('maxPreKeyId', 1); | 
					
						
							|  |  |  |       assert.strictEqual(preKeyIdAfter, preKeyIdBefore + 1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const testKeyArray = new Uint8Array(testKey.pubKey); | 
					
						
							|  |  |  |       assert.isDefined(newBundle); | 
					
						
							|  |  |  |       assert.isDefined(newBundle.identityKey); | 
					
						
							|  |  |  |       assert.isDefined(newBundle.deviceId); | 
					
						
							|  |  |  |       assert.isDefined(newBundle.preKeyId); | 
					
						
							|  |  |  |       assert.isDefined(newBundle.signedKeyId); | 
					
						
							|  |  |  |       assert.isDefined(newBundle.preKey); | 
					
						
							|  |  |  |       assert.isDefined(newBundle.signedKey); | 
					
						
							|  |  |  |       assert.isDefined(newBundle.signature); | 
					
						
							|  |  |  |       assert.strictEqual( | 
					
						
							|  |  |  |         testKeyArray.byteLength, | 
					
						
							|  |  |  |         newBundle.signedKey.byteLength | 
					
						
							|  |  |  |       ); | 
					
						
							|  |  |  |       for (let i = 0; i !== testKeyArray.byteLength; i += 1) { | 
					
						
							|  |  |  |         assert.strictEqual(testKeyArray[i], newBundle.signedKey[i]); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should return the same prekey bundle after creating a contact', async () => { | 
					
						
							|  |  |  |       const pubKey = libsignal.crypto.getRandomBytes(32); | 
					
						
							|  |  |  |       const pubKeyString = StringView.arrayBufferToHex(pubKey); | 
					
						
							|  |  |  |       const bundle1 = await libloki.storage.getPreKeyBundleForContact( | 
					
						
							|  |  |  |         pubKeyString | 
					
						
							|  |  |  |       ); | 
					
						
							|  |  |  |       const bundle2 = await libloki.storage.getPreKeyBundleForContact( | 
					
						
							|  |  |  |         pubKeyString | 
					
						
							|  |  |  |       ); | 
					
						
							|  |  |  |       assert.isDefined(bundle1); | 
					
						
							|  |  |  |       assert.isDefined(bundle2); | 
					
						
							|  |  |  |       assert.deepEqual(bundle1, bundle2); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should save the signed keys and prekeys from a bundle', async () => { | 
					
						
							|  |  |  |       const pubKey = libsignal.crypto.getRandomBytes(32); | 
					
						
							|  |  |  |       const pubKeyString = StringView.arrayBufferToHex(pubKey); | 
					
						
							|  |  |  |       const preKeyIdBefore = textsecure.storage.get('maxPreKeyId', 1); | 
					
						
							|  |  |  |       const newBundle = await libloki.storage.getPreKeyBundleForContact( | 
					
						
							|  |  |  |         pubKeyString | 
					
						
							|  |  |  |       ); | 
					
						
							|  |  |  |       const preKeyIdAfter = textsecure.storage.get('maxPreKeyId', 1); | 
					
						
							|  |  |  |       assert.strictEqual(preKeyIdAfter, preKeyIdBefore + 1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const testKeyArray = new Uint8Array(testKey.pubKey); | 
					
						
							|  |  |  |       assert.isDefined(newBundle); | 
					
						
							|  |  |  |       assert.isDefined(newBundle.identityKey); | 
					
						
							|  |  |  |       assert.isDefined(newBundle.deviceId); | 
					
						
							|  |  |  |       assert.isDefined(newBundle.preKeyId); | 
					
						
							|  |  |  |       assert.isDefined(newBundle.signedKeyId); | 
					
						
							|  |  |  |       assert.isDefined(newBundle.preKey); | 
					
						
							|  |  |  |       assert.isDefined(newBundle.signedKey); | 
					
						
							|  |  |  |       assert.isDefined(newBundle.signature); | 
					
						
							|  |  |  |       assert.deepEqual(testKeyArray, newBundle.signedKey); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | }); |