|  |  |  | 'use strict'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | describe('Crypto', function() { | 
					
						
							|  |  |  |   it('roundtrip symmetric encryption succeeds', async function() { | 
					
						
							|  |  |  |     var message = 'this is my message'; | 
					
						
							|  |  |  |     var plaintext = new dcodeIO.ByteBuffer.wrap( | 
					
						
							|  |  |  |       message, | 
					
						
							|  |  |  |       'binary' | 
					
						
							|  |  |  |     ).toArrayBuffer(); | 
					
						
							|  |  |  |     var key = textsecure.crypto.getRandomBytes(32); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     var encrypted = await Signal.Crypto.encryptSymmetric(key, plaintext); | 
					
						
							|  |  |  |     var decrypted = await Signal.Crypto.decryptSymmetric(key, encrypted); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     var equal = Signal.Crypto.constantTimeEqual(plaintext, decrypted); | 
					
						
							|  |  |  |     if (!equal) { | 
					
						
							|  |  |  |       throw new Error('The output and input did not match!'); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('roundtrip fails if nonce is modified', async function() { | 
					
						
							|  |  |  |     var message = 'this is my message'; | 
					
						
							|  |  |  |     var plaintext = new dcodeIO.ByteBuffer.wrap( | 
					
						
							|  |  |  |       message, | 
					
						
							|  |  |  |       'binary' | 
					
						
							|  |  |  |     ).toArrayBuffer(); | 
					
						
							|  |  |  |     var key = textsecure.crypto.getRandomBytes(32); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     var encrypted = await Signal.Crypto.encryptSymmetric(key, plaintext); | 
					
						
							|  |  |  |     var uintArray = new Uint8Array(encrypted); | 
					
						
							|  |  |  |     uintArray[2] = 9; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     try { | 
					
						
							|  |  |  |       var decrypted = await Signal.Crypto.decryptSymmetric( | 
					
						
							|  |  |  |         key, | 
					
						
							|  |  |  |         uintArray.buffer | 
					
						
							|  |  |  |       ); | 
					
						
							|  |  |  |     } catch (error) { | 
					
						
							|  |  |  |       assert.strictEqual( | 
					
						
							|  |  |  |         error.message, | 
					
						
							|  |  |  |         'decryptSymmetric: Failed to decrypt; MAC verification failed' | 
					
						
							|  |  |  |       ); | 
					
						
							|  |  |  |       return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     throw new Error('Expected error to be thrown'); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('fails if mac is modified', async function() { | 
					
						
							|  |  |  |     var message = 'this is my message'; | 
					
						
							|  |  |  |     var plaintext = new dcodeIO.ByteBuffer.wrap( | 
					
						
							|  |  |  |       message, | 
					
						
							|  |  |  |       'binary' | 
					
						
							|  |  |  |     ).toArrayBuffer(); | 
					
						
							|  |  |  |     var key = textsecure.crypto.getRandomBytes(32); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     var encrypted = await Signal.Crypto.encryptSymmetric(key, plaintext); | 
					
						
							|  |  |  |     var uintArray = new Uint8Array(encrypted); | 
					
						
							|  |  |  |     uintArray[uintArray.length - 3] = 9; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     try { | 
					
						
							|  |  |  |       var decrypted = await Signal.Crypto.decryptSymmetric( | 
					
						
							|  |  |  |         key, | 
					
						
							|  |  |  |         uintArray.buffer | 
					
						
							|  |  |  |       ); | 
					
						
							|  |  |  |     } catch (error) { | 
					
						
							|  |  |  |       assert.strictEqual( | 
					
						
							|  |  |  |         error.message, | 
					
						
							|  |  |  |         'decryptSymmetric: Failed to decrypt; MAC verification failed' | 
					
						
							|  |  |  |       ); | 
					
						
							|  |  |  |       return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     throw new Error('Expected error to be thrown'); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('fails if encrypted contents are modified', async function() { | 
					
						
							|  |  |  |     var message = 'this is my message'; | 
					
						
							|  |  |  |     var plaintext = new dcodeIO.ByteBuffer.wrap( | 
					
						
							|  |  |  |       message, | 
					
						
							|  |  |  |       'binary' | 
					
						
							|  |  |  |     ).toArrayBuffer(); | 
					
						
							|  |  |  |     var key = textsecure.crypto.getRandomBytes(32); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     var encrypted = await Signal.Crypto.encryptSymmetric(key, plaintext); | 
					
						
							|  |  |  |     var uintArray = new Uint8Array(encrypted); | 
					
						
							|  |  |  |     uintArray[35] = 9; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     try { | 
					
						
							|  |  |  |       var decrypted = await Signal.Crypto.decryptSymmetric( | 
					
						
							|  |  |  |         key, | 
					
						
							|  |  |  |         uintArray.buffer | 
					
						
							|  |  |  |       ); | 
					
						
							|  |  |  |     } catch (error) { | 
					
						
							|  |  |  |       assert.strictEqual( | 
					
						
							|  |  |  |         error.message, | 
					
						
							|  |  |  |         'decryptSymmetric: Failed to decrypt; MAC verification failed' | 
					
						
							|  |  |  |       ); | 
					
						
							|  |  |  |       return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     throw new Error('Expected error to be thrown'); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | }); |