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