Hex Artifact Content
Not logged in

Artifact e66deccb14cf52706db640f7415191410a4f167e:


0000: 27 75 73 65 20 73 74 72 69 63 74 27 0a 0a 63 6f  'use strict'..co
0010: 6e 73 74 20 63 68 61 69 20 3d 20 72 65 71 75 69  nst chai = requi
0020: 72 65 28 27 63 68 61 69 27 29 0a 63 6f 6e 73 74  re('chai').const
0030: 20 63 68 61 69 41 73 50 72 6f 6d 69 73 65 64 20   chaiAsPromised 
0040: 3d 20 72 65 71 75 69 72 65 28 27 63 68 61 69 2d  = require('chai-
0050: 61 73 2d 70 72 6f 6d 69 73 65 64 27 29 0a 63 68  as-promised').ch
0060: 61 69 2e 75 73 65 28 63 68 61 69 41 73 50 72 6f  ai.use(chaiAsPro
0070: 6d 69 73 65 64 29 0a 63 6f 6e 73 74 20 61 73 73  mised).const ass
0080: 65 72 74 20 3d 20 63 68 61 69 2e 61 73 73 65 72  ert = chai.asser
0090: 74 0a 63 6f 6e 73 74 20 65 78 70 65 63 74 20 3d  t.const expect =
00a0: 20 63 68 61 69 2e 65 78 70 65 63 74 0a 63 6f 6e   chai.expect.con
00b0: 73 74 20 73 69 6e 6f 6e 20 3d 20 72 65 71 75 69  st sinon = requi
00c0: 72 65 28 27 73 69 6e 6f 6e 27 29 0a 63 6f 6e 73  re('sinon').cons
00d0: 74 20 6d 6f 6d 65 6e 74 20 3d 20 72 65 71 75 69  t moment = requi
00e0: 72 65 28 27 6d 6f 6d 65 6e 74 27 29 0a 63 6f 6e  re('moment').con
00f0: 73 74 20 49 6c 70 50 61 63 6b 65 74 20 3d 20 72  st IlpPacket = r
0100: 65 71 75 69 72 65 28 27 69 6c 70 2d 70 61 63 6b  equire('ilp-pack
0110: 65 74 27 29 0a 0a 63 6f 6e 73 74 20 49 4c 50 20  et')..const ILP 
0120: 3d 20 72 65 71 75 69 72 65 28 27 2e 2e 27 29 0a  = require('..').
0130: 63 6f 6e 73 74 20 54 72 61 6e 73 70 6f 72 74 20  const Transport 
0140: 3d 20 72 65 71 75 69 72 65 28 27 2e 2e 2f 73 72  = require('../sr
0150: 63 2f 6c 69 62 2f 74 72 61 6e 73 70 6f 72 74 27  c/lib/transport'
0160: 29 0a 63 6f 6e 73 74 20 50 61 63 6b 65 74 20 3d  ).const Packet =
0170: 20 72 65 71 75 69 72 65 28 27 2e 2e 2f 73 72 63   require('../src
0180: 2f 75 74 69 6c 73 2f 70 61 63 6b 65 74 27 29 0a  /utils/packet').
0190: 63 6f 6e 73 74 20 4d 6f 63 6b 50 6c 75 67 69 6e  const MockPlugin
01a0: 20 3d 20 72 65 71 75 69 72 65 28 27 2e 2f 6d 6f   = require('./mo
01b0: 63 6b 73 2f 6d 6f 63 6b 50 6c 75 67 69 6e 27 29  cks/mockPlugin')
01c0: 0a 63 6f 6e 73 74 20 62 61 73 65 36 34 75 72 6c  .const base64url
01d0: 20 3d 20 72 65 71 75 69 72 65 28 27 2e 2e 2f 73   = require('../s
01e0: 72 63 2f 75 74 69 6c 73 2f 62 61 73 65 36 34 75  rc/utils/base64u
01f0: 72 6c 27 29 0a 63 6f 6e 73 74 20 7b 20 70 61 72  rl').const { par
0200: 73 65 50 61 63 6b 65 74 41 6e 64 44 65 74 61 69  sePacketAndDetai
0210: 6c 73 20 7d 20 3d 20 72 65 71 75 69 72 65 28 27  ls } = require('
0220: 2e 2e 2f 73 72 63 2f 75 74 69 6c 73 2f 64 65 74  ../src/utils/det
0230: 61 69 6c 73 27 29 0a 63 6f 6e 73 74 20 63 72 79  ails').const cry
0240: 70 74 6f 48 65 6c 70 65 72 20 3d 20 72 65 71 75  ptoHelper = requ
0250: 69 72 65 28 27 2e 2e 2f 73 72 63 2f 75 74 69 6c  ire('../src/util
0260: 73 2f 63 72 79 70 74 6f 27 29 0a 0a 63 6f 6e 73  s/crypto')..cons
0270: 74 20 53 54 41 52 54 5f 44 41 54 45 20 3d 20 31  t START_DATE = 1
0280: 34 33 34 34 31 32 38 30 30 30 30 30 20 2f 2f 20  434412800000 // 
0290: 4a 75 6e 65 20 31 36 2c 20 32 30 31 35 20 30 30  June 16, 2015 00
02a0: 3a 30 30 3a 30 30 20 47 4d 54 0a 0a 64 65 73 63  :00:00 GMT..desc
02b0: 72 69 62 65 28 27 54 72 61 6e 73 70 6f 72 74 27  ribe('Transport'
02c0: 2c 20 66 75 6e 63 74 69 6f 6e 20 28 29 20 7b 0a  , function () {.
02d0: 20 20 64 65 73 63 72 69 62 65 28 27 50 53 4b 27    describe('PSK'
02e0: 2c 20 66 75 6e 63 74 69 6f 6e 20 28 29 20 7b 0a  , function () {.
02f0: 20 20 20 20 62 65 66 6f 72 65 45 61 63 68 28 66      beforeEach(f
0300: 75 6e 63 74 69 6f 6e 20 28 29 20 7b 0a 20 20 20  unction () {.   
0310: 20 20 20 74 68 69 73 2e 70 61 72 61 6d 73 20 3d     this.params =
0320: 20 7b 0a 20 20 20 20 20 20 20 20 64 65 73 74 69   {.        desti
0330: 6e 61 74 69 6f 6e 41 63 63 6f 75 6e 74 3a 20 27  nationAccount: '
0340: 74 65 73 74 2e 65 78 61 6d 70 6c 65 2e 61 6c 69  test.example.ali
0350: 63 65 27 2c 0a 20 20 20 20 20 20 20 20 72 65 63  ce',.        rec
0360: 65 69 76 65 72 53 65 63 72 65 74 3a 20 42 75 66  eiverSecret: Buf
0370: 66 65 72 2e 66 72 6f 6d 28 27 73 65 63 72 65 74  fer.from('secret
0380: 27 29 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ').      }.    }
0390: 29 0a 0a 20 20 20 20 69 74 28 27 73 68 6f 75 6c  )..    it('shoul
03a0: 64 20 67 65 6e 65 72 61 74 65 20 70 73 6b 20 70  d generate psk p
03b0: 61 72 61 6d 73 27 2c 20 66 75 6e 63 74 69 6f 6e  arams', function
03c0: 20 28 29 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73   () {.      cons
03d0: 74 20 70 61 72 61 6d 73 20 3d 20 49 4c 50 2e 50  t params = ILP.P
03e0: 53 4b 2e 67 65 6e 65 72 61 74 65 50 61 72 61 6d  SK.generateParam
03f0: 73 28 74 68 69 73 2e 70 61 72 61 6d 73 29 0a 0a  s(this.params)..
0400: 20 20 20 20 20 20 61 73 73 65 72 74 2e 6d 61 74        assert.mat
0410: 63 68 28 70 61 72 61 6d 73 2e 64 65 73 74 69 6e  ch(params.destin
0420: 61 74 69 6f 6e 41 63 63 6f 75 6e 74 2c 20 2f 5e  ationAccount, /^
0430: 74 65 73 74 5c 2e 65 78 61 6d 70 6c 65 5c 2e 61  test\.example\.a
0440: 6c 69 63 65 2f 29 0a 20 20 20 20 20 20 61 73 73  lice/).      ass
0450: 65 72 74 2e 69 73 53 74 72 69 6e 67 28 70 61 72  ert.isString(par
0460: 61 6d 73 2e 73 68 61 72 65 64 53 65 63 72 65 74  ams.sharedSecret
0470: 29 0a 20 20 20 20 7d 29 0a 20 20 7d 29 0a 0a 20  ).    }).  }).. 
0480: 20 64 65 73 63 72 69 62 65 28 27 49 50 52 27 2c   describe('IPR',
0490: 20 66 75 6e 63 74 69 6f 6e 20 28 29 20 7b 0a 20   function () {. 
04a0: 20 20 20 62 65 66 6f 72 65 45 61 63 68 28 66 75     beforeEach(fu
04b0: 6e 63 74 69 6f 6e 20 28 29 20 7b 0a 20 20 20 20  nction () {.    
04c0: 20 20 74 68 69 73 2e 73 65 63 72 65 74 20 3d 20    this.secret = 
04d0: 42 75 66 66 65 72 2e 66 72 6f 6d 28 27 73 65 63  Buffer.from('sec
04e0: 72 65 74 27 29 0a 20 20 20 20 20 20 74 68 69 73  ret').      this
04f0: 2e 70 61 72 61 6d 73 20 3d 20 54 72 61 6e 73 70  .params = Transp
0500: 6f 72 74 2e 63 72 65 61 74 65 50 61 63 6b 65 74  ort.createPacket
0510: 41 6e 64 43 6f 6e 64 69 74 69 6f 6e 28 7b 0a 20  AndCondition({. 
0520: 20 20 20 20 20 20 20 64 65 73 74 69 6e 61 74 69         destinati
0530: 6f 6e 41 6d 6f 75 6e 74 3a 20 27 31 27 2c 0a 20  onAmount: '1',. 
0540: 20 20 20 20 20 20 20 64 65 73 74 69 6e 61 74 69         destinati
0550: 6f 6e 41 63 63 6f 75 6e 74 3a 20 27 74 65 73 74  onAccount: 'test
0560: 2e 65 78 61 6d 70 6c 65 2e 61 6c 69 63 65 2e 65  .example.alice.e
0570: 62 4b 57 63 41 45 42 39 5f 41 47 6d 65 57 49 58  bKWcAEB9_AGmeWIX
0580: 33 44 31 46 4c 77 49 58 30 43 46 76 66 46 53 51  3D1FLwIX0CFvfFSQ
0590: 27 2c 0a 20 20 20 20 20 20 20 20 73 65 63 72 65  ',.        secre
05a0: 74 3a 20 74 68 69 73 2e 73 65 63 72 65 74 2c 0a  t: this.secret,.
05b0: 20 20 20 20 20 20 20 20 64 61 74 61 3a 20 42 75          data: Bu
05c0: 66 66 65 72 2e 66 72 6f 6d 28 27 74 65 73 74 20  ffer.from('test 
05d0: 64 61 74 61 27 29 2c 0a 20 20 20 20 20 20 20 20  data'),.        
05e0: 69 64 3a 20 27 65 65 33 39 64 31 37 31 2d 63 64  id: 'ee39d171-cd
05f0: 64 35 2d 34 32 36 38 2d 39 65 63 38 2d 61 63 63  d5-4268-9ec8-acc
0600: 33 34 39 36 36 36 30 35 35 27 2c 0a 20 20 20 20  349666055',.    
0610: 20 20 20 20 65 78 70 69 72 65 73 41 74 3a 20 6d      expiresAt: m
0620: 6f 6d 65 6e 74 28 29 2e 74 6f 49 53 4f 53 74 72  oment().toISOStr
0630: 69 6e 67 28 29 0a 20 20 20 20 20 20 7d 29 0a 20  ing().      }). 
0640: 20 20 20 7d 29 0a 0a 20 20 20 20 69 74 28 27 73     })..    it('s
0650: 68 6f 75 6c 64 20 65 6e 63 6f 64 65 20 61 6e 20  hould encode an 
0660: 49 50 52 20 70 72 6f 70 65 72 6c 79 27 2c 20 66  IPR properly', f
0670: 75 6e 63 74 69 6f 6e 20 28 29 20 7b 0a 20 20 20  unction () {.   
0680: 20 20 20 63 6f 6e 73 74 20 69 70 72 20 3d 20 49     const ipr = I
0690: 4c 50 2e 49 50 52 2e 65 6e 63 6f 64 65 49 50 52  LP.IPR.encodeIPR
06a0: 28 74 68 69 73 2e 70 61 72 61 6d 73 29 0a 0a 20  (this.params).. 
06b0: 20 20 20 20 20 2f 2f 20 76 65 72 73 69 6f 6e 20       // version 
06c0: 62 79 74 65 20 61 74 20 74 68 65 20 73 74 61 72  byte at the star
06d0: 74 0a 20 20 20 20 20 20 61 73 73 65 72 74 2e 65  t.      assert.e
06e0: 71 75 61 6c 28 69 70 72 2e 73 6c 69 63 65 28 30  qual(ipr.slice(0
06f0: 2c 20 31 29 2e 74 6f 53 74 72 69 6e 67 28 27 68  , 1).toString('h
0700: 65 78 27 29 2c 20 27 30 32 27 29 0a 20 20 20 20  ex'), '02').    
0710: 20 20 2f 2f 20 63 6f 6e 64 69 74 69 6f 6e 20 73    // condition s
0720: 68 6f 75 6c 64 20 63 6f 6d 65 20 6e 65 78 74 0a  hould come next.
0730: 20 20 20 20 20 20 61 73 73 65 72 74 2e 65 71 75        assert.equ
0740: 61 6c 28 69 70 72 2e 73 6c 69 63 65 28 31 2c 20  al(ipr.slice(1, 
0750: 33 33 29 2e 74 6f 53 74 72 69 6e 67 28 27 68 65  33).toString('he
0760: 78 27 29 2c 20 74 68 69 73 2e 70 61 72 61 6d 73  x'), this.params
0770: 2e 63 6f 6e 64 69 74 69 6f 6e 2e 74 6f 53 74 72  .condition.toStr
0780: 69 6e 67 28 27 68 65 78 27 29 29 0a 20 20 20 20  ing('hex')).    
0790: 20 20 2f 2f 20 69 67 6e 6f 72 65 20 74 68 65 20    // ignore the 
07a0: 74 77 6f 20 6c 65 6e 67 74 68 20 62 79 74 65 73  two length bytes
07b0: 20 62 65 66 6f 72 65 20 74 68 65 20 76 61 72 69   before the vari
07c0: 61 62 6c 65 20 6f 63 74 65 74 20 73 74 72 69 6e  able octet strin
07d0: 67 0a 20 20 20 20 20 20 61 73 73 65 72 74 2e 65  g.      assert.e
07e0: 71 75 61 6c 28 69 70 72 2e 73 6c 69 63 65 28 33  qual(ipr.slice(3
07f0: 35 29 2e 74 6f 53 74 72 69 6e 67 28 27 68 65 78  5).toString('hex
0800: 27 29 2c 20 74 68 69 73 2e 70 61 72 61 6d 73 2e  '), this.params.
0810: 70 61 63 6b 65 74 2e 74 6f 53 74 72 69 6e 67 28  packet.toString(
0820: 27 68 65 78 27 29 29 0a 20 20 20 20 7d 29 0a 0a  'hex')).    })..
0830: 20 20 20 20 69 74 28 27 73 68 6f 75 6c 64 20 6e      it('should n
0840: 6f 74 20 65 6e 63 6f 64 65 20 61 6e 20 49 50 52  ot encode an IPR
0850: 20 77 69 74 68 20 61 6e 20 69 6e 76 61 6c 69 64   with an invalid
0860: 20 63 6f 6e 64 69 74 69 6f 6e 27 2c 20 66 75 6e   condition', fun
0870: 63 74 69 6f 6e 20 28 29 20 7b 0a 20 20 20 20 20  ction () {.     
0880: 20 74 68 69 73 2e 70 61 72 61 6d 73 2e 63 6f 6e   this.params.con
0890: 64 69 74 69 6f 6e 20 2b 3d 20 27 61 61 64 6f 69  dition += 'aadoi
08a0: 6d 61 77 64 61 64 6f 69 61 6d 64 77 61 64 27 0a  mawdadoiamdwad'.
08b0: 20 20 20 20 20 20 61 73 73 65 72 74 2e 74 68 72        assert.thr
08c0: 6f 77 73 28 28 29 20 3d 3e 20 49 4c 50 2e 49 50  ows(() => ILP.IP
08d0: 52 2e 65 6e 63 6f 64 65 49 50 52 28 74 68 69 73  R.encodeIPR(this
08e0: 2e 70 61 72 61 6d 73 29 2c 0a 20 20 20 20 20 20  .params),.      
08f0: 20 20 2f 70 61 72 61 6d 73 2e 63 6f 6e 64 69 74    /params.condit
0900: 69 6f 6e 20 6d 75 73 74 20 65 6e 63 6f 64 65 20  ion must encode 
0910: 33 32 20 62 79 74 65 73 2f 29 0a 20 20 20 20 7d  32 bytes/).    }
0920: 29 0a 0a 20 20 20 20 69 74 28 27 73 68 6f 75 6c  )..    it('shoul
0930: 64 20 64 65 63 6f 64 65 20 61 6e 20 49 50 52 27  d decode an IPR'
0940: 2c 20 66 75 6e 63 74 69 6f 6e 20 28 29 20 7b 0a  , function () {.
0950: 20 20 20 20 20 20 63 6f 6e 73 74 20 69 70 72 20        const ipr 
0960: 3d 20 42 75 66 66 65 72 2e 66 72 6f 6d 28 0a 20  = Buffer.from(. 
0970: 20 20 20 20 20 20 20 27 30 32 38 39 64 36 62 61         '0289d6ba
0980: 34 37 62 37 62 62 38 66 64 37 32 62 65 64 65 36  47b7bb8fd72bede6
0990: 61 65 35 37 64 64 30 61 64 61 61 63 61 35 65 63  ae57dd0adaaca5ec
09a0: 61 37 39 63 38 66 32 35 61 63 39 63 33 33 30 31  a79c8f25ac9c3301
09b0: 39 65 35 34 62 64 63 62 38 66 38 27 20 2b 0a 20  9e54bdcb8f8' +. 
09c0: 20 20 20 20 20 20 20 27 31 63 38 30 31 38 31 63         '1c80181c
09d0: 35 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30  5000000000000000
09e0: 31 33 34 37 34 36 35 37 33 37 34 32 65 36 35 37  134746573742e657
09f0: 38 36 31 36 64 37 30 36 63 36 35 32 65 36 31 36  8616d706c652e616
0a00: 63 36 39 36 33 36 35 32 65 36 35 27 20 2b 0a 20  c6963652e65' +. 
0a10: 20 20 20 20 20 20 20 27 36 32 34 62 35 37 36 33         '624b5763
0a20: 34 31 34 35 34 32 33 39 35 66 34 31 34 37 36 64  414542395f41476d
0a30: 36 35 35 37 34 39 35 38 33 33 34 34 33 31 34 36  6557495833443146
0a40: 34 63 37 37 34 39 35 38 33 30 34 33 34 36 37 36  4c77495830434676
0a50: 36 36 34 36 35 33 35 31 38 31 38 27 20 2b 0a 20  66465351818' +. 
0a60: 20 20 20 20 20 20 20 27 35 35 30 35 33 34 62 32         '550534b2
0a70: 66 33 31 32 65 33 30 30 61 34 65 36 66 36 65 36  f312e300a4e6f6e6
0a80: 33 36 35 33 61 32 30 33 30 34 39 34 39 34 64 37  3653a203049494d7
0a90: 34 32 64 36 64 33 38 37 39 34 63 35 38 35 31 33  42d6d38794c58513
0aa0: 30 34 61 34 66 36 39 33 34 36 39 27 20 2b 0a 20  04a4f693469' +. 
0ab0: 20 20 20 20 20 20 20 27 37 36 36 39 37 32 35 31         '76697251
0ac0: 30 61 34 35 36 65 36 33 37 32 37 39 37 30 37 34  0a456e6372797074
0ad0: 36 39 36 66 36 65 33 61 32 30 36 31 36 35 37 33  696f6e3a20616573
0ae0: 32 64 33 32 33 35 33 36 32 64 36 37 36 33 36 64  2d3235362d67636d
0af0: 32 30 33 30 33 31 33 37 34 33 32 27 20 2b 0a 20  20303137432' +. 
0b00: 20 20 20 20 20 20 20 27 64 33 33 36 37 37 37 33         'd3367773
0b10: 31 37 32 36 61 34 35 35 61 37 61 37 31 37 35 33  1726a455a7a71753
0b20: 33 33 32 36 39 35 36 33 36 36 37 30 61 30 61 35  332695636670a0a5
0b30: 65 32 62 30 64 65 39 39 37 34 65 33 61 65 66 65  e2b0de9974e3aefe
0b40: 64 66 65 38 65 38 35 37 34 30 62 27 20 2b 0a 20  dfe8e85740b' +. 
0b50: 20 20 20 20 20 20 20 27 63 64 38 64 66 66 34 61         'cd8dff4a
0b60: 66 32 61 61 65 64 33 33 31 31 64 30 35 65 38 30  f2aaed3311d05e80
0b70: 38 65 32 65 34 62 33 66 34 65 62 34 39 36 37 30  8e2e4b3f4eb49670
0b80: 65 32 36 30 39 31 35 62 65 66 63 61 37 65 39 61  e260915befca7e9a
0b90: 61 37 64 61 37 63 39 37 30 34 30 30 27 2c 0a 20  a7da7c970400',. 
0ba0: 20 20 20 20 20 20 20 27 68 65 78 27 29 0a 0a 20         'hex').. 
0bb0: 20 20 20 20 20 63 6f 6e 73 74 20 63 6f 6e 64 69       const condi
0bc0: 74 69 6f 6e 46 69 78 74 75 72 65 20 3d 0a 20 20  tionFixture =.  
0bd0: 20 20 20 20 20 20 27 69 64 61 36 52 37 65 37 6a        'ida6R7e7j
0be0: 39 63 72 37 65 61 75 56 39 30 4b 32 71 79 6c 37  9cr7eauV90K2qyl7
0bf0: 4b 65 63 6a 79 57 73 6e 44 4d 42 6e 6c 53 39 79  KecjyWsnDMBnlS9y
0c00: 34 38 27 0a 0a 20 20 20 20 20 20 63 6f 6e 73 74  48'..      const
0c10: 20 70 61 63 6b 65 74 46 69 78 74 75 72 65 20 3d   packetFixture =
0c20: 0a 20 20 20 20 20 20 20 20 27 41 59 48 46 41 41  .        'AYHFAA
0c30: 41 41 41 41 41 41 41 41 45 30 64 47 56 7a 64 43  AAAAAAAAE0dGVzdC
0c40: 35 6c 65 47 46 74 63 47 78 6c 4c 6d 46 73 61 57  5leGFtcGxlLmFsaW
0c50: 4e 6c 4c 6d 56 69 53 31 64 6a 51 55 56 43 4f 56  NlLmViS1djQUVCOV
0c60: 39 42 52 32 31 6c 56 30 6c 59 4d 30 51 27 20 2b  9BR21lV0lYM0Q' +
0c70: 0a 20 20 20 20 20 20 20 20 27 78 52 6b 78 33 53  .        'xRkx3S
0c80: 56 67 77 51 30 5a 32 5a 6b 5a 54 55 59 47 46 55  VgwQ0Z2ZkZTUYGFU
0c90: 46 4e 4c 4c 7a 45 75 4d 41 70 4f 62 32 35 6a 5a  FNLLzEuMApOb25jZ
0ca0: 54 6f 67 4d 45 6c 4a 54 58 51 74 62 54 68 35 54  TogMElJTXQtbTh5T
0cb0: 46 68 52 4d 45 70 50 61 54 52 70 64 6d 27 20 2b  FhRMEpPaTRpdm' +
0cc0: 0a 20 20 20 20 20 20 20 20 27 6c 79 55 51 70 46  .        'lyUQpF
0cd0: 62 6d 4e 79 65 58 42 30 61 57 39 75 4f 69 42 68  bmNyeXB0aW9uOiBh
0ce0: 5a 58 4d 74 4d 6a 55 32 4c 57 64 6a 62 53 41 77  ZXMtMjU2LWdjbSAw
0cf0: 4d 54 64 44 4c 54 4e 6e 64 7a 46 79 61 6b 56 61  MTdDLTNndzFyakVa
0d00: 65 6e 46 31 4d 7a 4a 70 56 6a 5a 6e 43 27 20 2b  enF1MzJpVjZnC' +
0d10: 0a 20 20 20 20 20 20 20 20 27 67 70 65 4b 77 33  .        'gpeKw3
0d20: 70 6c 30 34 36 37 2d 33 2d 6a 6f 56 30 43 38 32  pl0467-3-joV0C82
0d30: 4e 5f 30 72 79 71 75 30 7a 45 64 42 65 67 49 34  N_0ryqu0zEdBegI4
0d40: 75 53 7a 39 4f 74 4a 5a 77 34 6d 43 52 57 2d 5f  uSz9OtJZw4mCRW-_
0d50: 4b 66 70 71 6e 32 6e 79 58 42 41 41 27 0a 0a 20  Kfpqn2nyXBAA'.. 
0d60: 20 20 20 20 20 63 6f 6e 73 74 20 7b 20 70 61 63       const { pac
0d70: 6b 65 74 2c 20 63 6f 6e 64 69 74 69 6f 6e 20 7d  ket, condition }
0d80: 20 3d 20 49 4c 50 2e 49 50 52 2e 64 65 63 6f 64   = ILP.IPR.decod
0d90: 65 49 50 52 28 69 70 72 29 0a 0a 20 20 20 20 20  eIPR(ipr)..     
0da0: 20 61 73 73 65 72 74 2e 65 71 75 61 6c 28 63 6f   assert.equal(co
0db0: 6e 64 69 74 69 6f 6e 2c 20 63 6f 6e 64 69 74 69  ndition, conditi
0dc0: 6f 6e 46 69 78 74 75 72 65 29 0a 20 20 20 20 20  onFixture).     
0dd0: 20 61 73 73 65 72 74 2e 65 71 75 61 6c 28 70 61   assert.equal(pa
0de0: 63 6b 65 74 2c 20 70 61 63 6b 65 74 46 69 78 74  cket, packetFixt
0df0: 75 72 65 29 0a 20 20 20 20 7d 29 0a 20 20 7d 29  ure).    }).  })
0e00: 0a 0a 20 20 64 65 73 63 72 69 62 65 28 27 63 72  ..  describe('cr
0e10: 65 61 74 65 50 61 63 6b 65 74 41 6e 64 43 6f 6e  eatePacketAndCon
0e20: 64 69 74 69 6f 6e 27 2c 20 66 75 6e 63 74 69 6f  dition', functio
0e30: 6e 20 28 29 20 7b 0a 20 20 20 20 62 65 66 6f 72  n () {.    befor
0e40: 65 45 61 63 68 28 66 75 6e 63 74 69 6f 6e 20 28  eEach(function (
0e50: 29 20 7b 0a 20 20 20 20 20 20 74 68 69 73 2e 73  ) {.      this.s
0e60: 65 63 72 65 74 20 3d 20 42 75 66 66 65 72 2e 66  ecret = Buffer.f
0e70: 72 6f 6d 28 27 73 65 63 72 65 74 27 29 0a 20 20  rom('secret').  
0e80: 20 20 20 20 74 68 69 73 2e 70 61 72 61 6d 73 20      this.params 
0e90: 3d 20 7b 0a 20 20 20 20 20 20 20 20 64 65 73 74  = {.        dest
0ea0: 69 6e 61 74 69 6f 6e 41 6d 6f 75 6e 74 3a 20 27  inationAmount: '
0eb0: 31 27 2c 0a 20 20 20 20 20 20 20 20 64 65 73 74  1',.        dest
0ec0: 69 6e 61 74 69 6f 6e 41 63 63 6f 75 6e 74 3a 20  inationAccount: 
0ed0: 27 74 65 73 74 2e 65 78 61 6d 70 6c 65 2e 61 6c  'test.example.al
0ee0: 69 63 65 2e 65 62 4b 57 63 41 45 42 39 5f 41 47  ice.ebKWcAEB9_AG
0ef0: 6d 65 57 49 58 33 44 31 46 4c 77 49 58 30 43 46  meWIX3D1FLwIX0CF
0f00: 76 66 46 53 51 27 2c 0a 20 20 20 20 20 20 20 20  vfFSQ',.        
0f10: 73 65 63 72 65 74 3a 20 74 68 69 73 2e 73 65 63  secret: this.sec
0f20: 72 65 74 2c 0a 20 20 20 20 20 20 20 20 64 61 74  ret,.        dat
0f30: 61 3a 20 42 75 66 66 65 72 2e 66 72 6f 6d 28 27  a: Buffer.from('
0f40: 74 65 73 74 20 64 61 74 61 27 29 2c 0a 20 20 20  test data'),.   
0f50: 20 20 20 20 20 69 64 3a 20 27 65 65 33 39 64 31       id: 'ee39d1
0f60: 37 31 2d 63 64 64 35 2d 34 32 36 38 2d 39 65 63  71-cdd5-4268-9ec
0f70: 38 2d 61 63 63 33 34 39 36 36 36 30 35 35 27 2c  8-acc349666055',
0f80: 0a 20 20 20 20 20 20 20 20 65 78 70 69 72 65 73  .        expires
0f90: 41 74 3a 20 6d 6f 6d 65 6e 74 28 29 2e 74 6f 49  At: moment().toI
0fa0: 53 4f 53 74 72 69 6e 67 28 29 0a 20 20 20 20 20  SOString().     
0fb0: 20 7d 0a 0a 20 20 20 20 20 20 74 68 69 73 2e 76   }..      this.v
0fc0: 61 6c 69 64 61 74 65 20 3d 20 28 72 65 73 75 6c  alidate = (resul
0fd0: 74 29 20 3d 3e 20 7b 0a 20 20 20 20 20 20 20 20  t) => {.        
0fe0: 63 6f 6e 73 74 20 7b 20 61 63 63 6f 75 6e 74 2c  const { account,
0ff0: 20 61 6d 6f 75 6e 74 2c 20 64 61 74 61 20 7d 20   amount, data } 
1000: 3d 20 50 61 63 6b 65 74 2e 70 61 72 73 65 28 72  = Packet.parse(r
1010: 65 73 75 6c 74 2e 70 61 63 6b 65 74 29 0a 20 20  esult.packet).  
1020: 20 20 20 20 20 20 63 6f 6e 73 74 20 72 65 63 65        const rece
1030: 69 76 65 72 49 64 20 3d 20 62 61 73 65 36 34 75  iverId = base64u
1040: 72 6c 28 63 72 79 70 74 6f 48 65 6c 70 65 72 2e  rl(cryptoHelper.
1050: 67 65 74 52 65 63 65 69 76 65 72 49 64 28 74 68  getReceiverId(th
1060: 69 73 2e 73 65 63 72 65 74 29 29 0a 0a 20 20 20  is.secret))..   
1070: 20 20 20 20 20 2f 2f 20 74 68 65 20 64 61 74 61       // the data
1080: 20 69 73 20 73 74 69 6c 6c 20 65 6e 63 72 79 70   is still encryp
1090: 74 65 64 2c 20 73 6f 20 77 65 20 63 61 6e 27 74  ted, so we can't
10a0: 20 63 68 65 63 6b 20 69 74 20 66 72 6f 6d 20 6a   check it from j
10b0: 75 73 74 20 70 61 72 73 69 6e 67 0a 20 20 20 20  ust parsing.    
10c0: 20 20 20 20 61 73 73 65 72 74 28 42 75 66 66 65      assert(Buffe
10d0: 72 2e 69 73 42 75 66 66 65 72 28 64 61 74 61 29  r.isBuffer(data)
10e0: 2c 20 27 64 61 74 61 20 73 68 6f 75 6c 64 20 62  , 'data should b
10f0: 65 20 61 20 62 75 66 66 65 72 27 29 0a 20 20 20  e a buffer').   
1100: 20 20 20 20 20 61 73 73 65 72 74 2e 65 71 75 61       assert.equa
1110: 6c 28 61 6d 6f 75 6e 74 2c 20 27 31 27 29 0a 20  l(amount, '1'). 
1120: 20 20 20 20 20 20 20 61 73 73 65 72 74 2e 65 71         assert.eq
1130: 75 61 6c 28 61 63 63 6f 75 6e 74 2c 20 27 74 65  ual(account, 'te
1140: 73 74 2e 65 78 61 6d 70 6c 65 2e 61 6c 69 63 65  st.example.alice
1150: 2e 65 62 4b 57 63 41 45 42 39 5f 41 47 6d 65 57  .ebKWcAEB9_AGmeW
1160: 49 58 33 44 31 46 4c 77 49 58 30 43 46 76 66 46  IX3D1FLwIX0CFvfF
1170: 53 51 27 29 0a 20 20 20 20 20 20 20 20 61 73 73  SQ').        ass
1180: 65 72 74 2e 65 71 75 61 6c 28 72 65 63 65 69 76  ert.equal(receiv
1190: 65 72 49 64 2c 20 27 65 62 4b 57 63 41 45 42 39  erId, 'ebKWcAEB9
11a0: 5f 41 27 29 0a 20 20 20 20 20 20 7d 0a 20 20 20  _A').      }.   
11b0: 20 7d 29 0a 0a 20 20 20 20 69 74 28 27 73 68 6f   })..    it('sho
11c0: 75 6c 64 20 63 72 65 61 74 65 20 61 20 76 61 6c  uld create a val
11d0: 69 64 20 70 61 63 6b 65 74 20 61 6e 64 20 63 6f  id packet and co
11e0: 6e 64 69 74 69 6f 6e 27 2c 20 66 75 6e 63 74 69  ndition', functi
11f0: 6f 6e 20 28 29 20 7b 0a 20 20 20 20 20 20 63 6f  on () {.      co
1200: 6e 73 74 20 72 65 73 75 6c 74 20 3d 20 54 72 61  nst result = Tra
1210: 6e 73 70 6f 72 74 2e 63 72 65 61 74 65 50 61 63  nsport.createPac
1220: 6b 65 74 41 6e 64 43 6f 6e 64 69 74 69 6f 6e 28  ketAndCondition(
1230: 74 68 69 73 2e 70 61 72 61 6d 73 2c 20 27 70 73  this.params, 'ps
1240: 6b 27 29 0a 20 20 20 20 20 20 74 68 69 73 2e 76  k').      this.v
1250: 61 6c 69 64 61 74 65 28 72 65 73 75 6c 74 29 0a  alidate(result).
1260: 20 20 20 20 7d 29 0a 0a 20 20 20 20 69 74 28 27      })..    it('
1270: 73 68 6f 75 6c 64 20 74 61 6b 65 20 61 64 64 69  should take addi
1280: 74 69 6f 6e 61 6c 20 68 65 61 64 65 72 73 20 66  tional headers f
1290: 6f 72 20 64 65 74 61 69 6c 73 27 2c 20 66 75 6e  or details', fun
12a0: 63 74 69 6f 6e 20 28 29 20 7b 0a 20 20 20 20 20  ction () {.     
12b0: 20 74 68 69 73 2e 70 61 72 61 6d 73 2e 68 65 61   this.params.hea
12c0: 64 65 72 73 20 3d 20 7b 20 68 65 61 64 65 72 3a  ders = { header:
12d0: 20 27 76 61 6c 75 65 27 20 7d 0a 20 20 20 20 20   'value' }.     
12e0: 20 74 68 69 73 2e 70 61 72 61 6d 73 2e 70 75 62   this.params.pub
12f0: 6c 69 63 48 65 61 64 65 72 73 20 3d 20 7b 20 75  licHeaders = { u
1300: 6e 73 61 66 65 48 65 61 64 65 72 3a 20 27 75 6e  nsafeHeader: 'un
1310: 73 61 66 65 56 61 6c 75 65 27 20 7d 0a 0a 20 20  safeValue' }..  
1320: 20 20 20 20 63 6f 6e 73 74 20 72 65 73 75 6c 74      const result
1330: 20 3d 20 54 72 61 6e 73 70 6f 72 74 2e 63 72 65   = Transport.cre
1340: 61 74 65 50 61 63 6b 65 74 41 6e 64 43 6f 6e 64  atePacketAndCond
1350: 69 74 69 6f 6e 28 74 68 69 73 2e 70 61 72 61 6d  ition(this.param
1360: 73 2c 20 27 70 73 6b 27 29 0a 20 20 20 20 20 20  s, 'psk').      
1370: 74 68 69 73 2e 76 61 6c 69 64 61 74 65 28 72 65  this.validate(re
1380: 73 75 6c 74 29 0a 0a 20 20 20 20 20 20 63 6f 6e  sult)..      con
1390: 73 74 20 64 65 74 61 69 6c 73 20 3d 20 70 61 72  st details = par
13a0: 73 65 50 61 63 6b 65 74 41 6e 64 44 65 74 61 69  sePacketAndDetai
13b0: 6c 73 28 7b 0a 20 20 20 20 20 20 20 20 70 61 63  ls({.        pac
13c0: 6b 65 74 3a 20 72 65 73 75 6c 74 2e 70 61 63 6b  ket: result.pack
13d0: 65 74 2c 0a 20 20 20 20 20 20 20 20 73 65 63 72  et,.        secr
13e0: 65 74 3a 20 74 68 69 73 2e 70 61 72 61 6d 73 2e  et: this.params.
13f0: 73 65 63 72 65 74 0a 20 20 20 20 20 20 7d 29 0a  secret.      }).
1400: 0a 20 20 20 20 20 20 61 73 73 65 72 74 2e 6d 61  .      assert.ma
1410: 74 63 68 28 64 65 74 61 69 6c 73 2e 70 75 62 6c  tch(details.publ
1420: 69 63 48 65 61 64 65 72 73 5b 27 65 6e 63 72 79  icHeaders['encry
1430: 70 74 69 6f 6e 27 5d 2c 20 2f 5e 61 65 73 2d 32  ption'], /^aes-2
1440: 35 36 2d 67 63 6d 20 2f 29 0a 20 20 20 20 20 20  56-gcm /).      
1450: 61 73 73 65 72 74 2e 6d 61 74 63 68 28 64 65 74  assert.match(det
1460: 61 69 6c 73 2e 70 75 62 6c 69 63 48 65 61 64 65  ails.publicHeade
1470: 72 73 5b 27 6e 6f 6e 63 65 27 5d 2c 20 2f 5b 41  rs['nonce'], /[A
1480: 2d 5a 61 2d 7a 30 2d 39 5f 2d 5d 7b 32 32 7d 2f  -Za-z0-9_-]{22}/
1490: 29 0a 20 20 20 20 20 20 61 73 73 65 72 74 2e 65  ).      assert.e
14a0: 71 75 61 6c 28 64 65 74 61 69 6c 73 2e 70 75 62  qual(details.pub
14b0: 6c 69 63 48 65 61 64 65 72 73 5b 27 75 6e 73 61  licHeaders['unsa
14c0: 66 65 68 65 61 64 65 72 27 5d 2c 20 27 75 6e 73  feheader'], 'uns
14d0: 61 66 65 56 61 6c 75 65 27 29 0a 20 20 20 20 20  afeValue').     
14e0: 20 61 73 73 65 72 74 2e 65 71 75 61 6c 28 64 65   assert.equal(de
14f0: 74 61 69 6c 73 2e 68 65 61 64 65 72 73 5b 27 65  tails.headers['e
1500: 78 70 69 72 65 73 2d 61 74 27 5d 2c 20 74 68 69  xpires-at'], thi
1510: 73 2e 70 61 72 61 6d 73 2e 65 78 70 69 72 65 73  s.params.expires
1520: 41 74 29 0a 20 20 20 20 20 20 61 73 73 65 72 74  At).      assert
1530: 2e 65 71 75 61 6c 28 64 65 74 61 69 6c 73 2e 68  .equal(details.h
1540: 65 61 64 65 72 73 5b 27 68 65 61 64 65 72 27 5d  eaders['header']
1550: 2c 20 27 76 61 6c 75 65 27 29 0a 20 20 20 20 7d  , 'value').    }
1560: 29 0a 0a 20 20 20 20 69 74 28 27 73 68 6f 75 6c  )..    it('shoul
1570: 64 20 74 68 72 6f 77 20 61 6e 20 65 72 72 6f 72  d throw an error
1580: 20 69 66 20 74 68 65 20 68 65 61 64 65 72 20 6e   if the header n
1590: 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 6c  ame contains a l
15a0: 69 6e 65 20 66 65 65 64 20 6f 72 20 63 6f 6c 6f  ine feed or colo
15b0: 6e 27 2c 20 66 75 6e 63 74 69 6f 6e 20 28 29 20  n', function () 
15c0: 7b 0a 20 20 20 20 20 20 74 68 69 73 2e 70 61 72  {.      this.par
15d0: 61 6d 73 2e 68 65 61 64 65 72 73 20 3d 20 7b 20  ams.headers = { 
15e0: 27 48 65 61 64 65 72 2d 57 69 74 68 2d 5c 6e 4c  'Header-With-\nL
15f0: 69 6e 65 2d 46 65 65 64 27 3a 20 27 76 61 6c 75  ine-Feed': 'valu
1600: 65 27 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65  e' }..      asse
1610: 72 74 2e 74 68 72 6f 77 73 28 54 72 61 6e 73 70  rt.throws(Transp
1620: 6f 72 74 2e 63 72 65 61 74 65 50 61 63 6b 65 74  ort.createPacket
1630: 41 6e 64 43 6f 6e 64 69 74 69 6f 6e 2e 62 69 6e  AndCondition.bin
1640: 64 28 6e 75 6c 6c 2c 20 74 68 69 73 2e 70 61 72  d(null, this.par
1650: 61 6d 73 2c 20 27 70 73 6b 27 29 2c 0a 20 20 20  ams, 'psk'),.   
1660: 20 20 20 20 20 2f 46 6f 75 6e 64 20 66 6f 72 62       /Found forb
1670: 69 64 64 65 6e 20 63 68 61 72 61 63 74 65 72 73  idden characters
1680: 20 69 6e 20 68 65 61 64 65 72 20 6e 61 6d 65 3a   in header name:
1690: 20 22 48 65 61 64 65 72 2d 57 69 74 68 2d 5c 5c   "Header-With-\\
16a0: 6e 4c 69 6e 65 2d 46 65 65 64 22 2f 29 0a 0a 20  nLine-Feed"/).. 
16b0: 20 20 20 20 20 74 68 69 73 2e 70 61 72 61 6d 73       this.params
16c0: 2e 68 65 61 64 65 72 73 20 3d 20 7b 20 27 48 65  .headers = { 'He
16d0: 61 64 65 72 2d 57 69 74 68 2d 3a 43 6f 6c 6f 6e  ader-With-:Colon
16e0: 27 3a 20 27 76 61 6c 75 65 27 20 7d 0a 0a 20 20  ': 'value' }..  
16f0: 20 20 20 20 61 73 73 65 72 74 2e 74 68 72 6f 77      assert.throw
1700: 73 28 54 72 61 6e 73 70 6f 72 74 2e 63 72 65 61  s(Transport.crea
1710: 74 65 50 61 63 6b 65 74 41 6e 64 43 6f 6e 64 69  tePacketAndCondi
1720: 74 69 6f 6e 2e 62 69 6e 64 28 6e 75 6c 6c 2c 20  tion.bind(null, 
1730: 74 68 69 73 2e 70 61 72 61 6d 73 2c 20 27 70 73  this.params, 'ps
1740: 6b 27 29 2c 0a 20 20 20 20 20 20 20 20 2f 46 6f  k'),.        /Fo
1750: 75 6e 64 20 66 6f 72 62 69 64 64 65 6e 20 63 68  und forbidden ch
1760: 61 72 61 63 74 65 72 73 20 69 6e 20 68 65 61 64  aracters in head
1770: 65 72 20 6e 61 6d 65 3a 20 22 48 65 61 64 65 72  er name: "Header
1780: 2d 57 69 74 68 2d 3a 43 6f 6c 6f 6e 22 2f 29 0a  -With-:Colon"/).
1790: 20 20 20 20 7d 29 0a 0a 20 20 20 20 69 74 28 27      })..    it('
17a0: 73 68 6f 75 6c 64 20 74 68 72 6f 77 20 61 6e 20  should throw an 
17b0: 65 72 72 6f 72 20 69 66 20 68 65 61 64 65 72 20  error if header 
17c0: 76 61 6c 75 65 20 63 6f 6e 74 61 69 6e 73 20 61  value contains a
17d0: 20 6c 69 6e 65 20 66 65 65 64 27 2c 20 66 75 6e   line feed', fun
17e0: 63 74 69 6f 6e 20 28 29 20 7b 0a 20 20 20 20 20  ction () {.     
17f0: 20 74 68 69 73 2e 70 61 72 61 6d 73 2e 68 65 61   this.params.hea
1800: 64 65 72 73 20 3d 20 7b 20 27 53 6f 6d 65 2d 48  ders = { 'Some-H
1810: 65 61 64 65 72 27 3a 20 27 76 61 6c 75 65 5c 6e  eader': 'value\n
1820: 58 2d 48 65 61 64 65 72 2d 49 6e 6a 65 63 74 69  X-Header-Injecti
1830: 6f 6e 3a 20 53 6f 6d 65 2d 56 61 6c 75 65 27 20  on: Some-Value' 
1840: 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 2e  }..      assert.
1850: 74 68 72 6f 77 73 28 54 72 61 6e 73 70 6f 72 74  throws(Transport
1860: 2e 63 72 65 61 74 65 50 61 63 6b 65 74 41 6e 64  .createPacketAnd
1870: 43 6f 6e 64 69 74 69 6f 6e 2e 62 69 6e 64 28 6e  Condition.bind(n
1880: 75 6c 6c 2c 20 74 68 69 73 2e 70 61 72 61 6d 73  ull, this.params
1890: 2c 20 27 70 73 6b 27 29 2c 0a 20 20 20 20 20 20  , 'psk'),.      
18a0: 20 20 2f 46 6f 75 6e 64 20 66 6f 72 62 69 64 64    /Found forbidd
18b0: 65 6e 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  en characters in
18c0: 20 68 65 61 64 65 72 20 76 61 6c 75 65 3a 20 22   header value: "
18d0: 76 61 6c 75 65 5c 5c 6e 58 2d 48 65 61 64 65 72  value\\nX-Header
18e0: 2d 49 6e 6a 65 63 74 69 6f 6e 3a 20 53 6f 6d 65  -Injection: Some
18f0: 2d 56 61 6c 75 65 22 2f 29 0a 20 20 20 20 7d 29  -Value"/).    })
1900: 0a 0a 20 20 20 20 69 74 28 27 73 68 6f 75 6c 64  ..    it('should
1910: 20 61 6c 6c 6f 77 20 75 6e 69 63 6f 64 65 20 63   allow unicode c
1920: 68 61 72 61 63 74 65 72 73 2c 20 53 50 53 50 20  haracters, SPSP 
1930: 61 64 64 72 65 73 73 65 73 2c 20 61 6e 64 20 55  addresses, and U
1940: 52 4c 73 20 69 6e 20 68 65 61 64 65 72 20 76 61  RLs in header va
1950: 6c 75 65 73 27 2c 20 66 75 6e 63 74 69 6f 6e 20  lues', function 
1960: 28 29 20 7b 0a 20 20 20 20 20 20 74 68 69 73 2e  () {.      this.
1970: 70 61 72 61 6d 73 2e 68 65 61 64 65 72 73 20 3d  params.headers =
1980: 20 7b 0a 20 20 20 20 20 20 20 20 73 65 6e 64 65   {.        sende
1990: 72 3a 20 27 50 69 c3 a8 72 72 65 27 2c 0a 20 20  r: 'Pi..rre',.  
19a0: 20 20 20 20 20 20 27 73 6f 75 72 63 65 2d 69 6d        'source-im
19b0: 61 67 65 2d 75 72 6c 27 3a 20 27 68 74 74 70 73  age-url': 'https
19c0: 3a 2f 2f 73 65 6e 64 69 6e 67 2d 69 6c 70 6b 69  ://sending-ilpki
19d0: 74 2e 65 78 61 6d 70 6c 65 2f 70 69 63 3f 75 73  t.example/pic?us
19e0: 65 72 3d 70 69 65 72 72 65 27 2c 0a 20 20 20 20  er=pierre',.    
19f0: 20 20 20 20 27 73 6f 75 72 63 65 2d 69 64 65 6e      'source-iden
1a00: 74 69 66 69 65 72 27 3a 20 27 70 69 65 72 72 65  tifier': 'pierre
1a10: 40 73 65 6e 64 69 6e 67 2d 69 6c 70 6b 69 74 2e  @sending-ilpkit.
1a20: 65 78 61 6d 70 6c 65 27 0a 20 20 20 20 20 20 7d  example'.      }
1a30: 0a 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 72 65  ..      const re
1a40: 73 75 6c 74 20 3d 20 54 72 61 6e 73 70 6f 72 74  sult = Transport
1a50: 2e 63 72 65 61 74 65 50 61 63 6b 65 74 41 6e 64  .createPacketAnd
1a60: 43 6f 6e 64 69 74 69 6f 6e 28 74 68 69 73 2e 70  Condition(this.p
1a70: 61 72 61 6d 73 2c 20 27 70 73 6b 27 29 0a 20 20  arams, 'psk').  
1a80: 20 20 20 20 74 68 69 73 2e 76 61 6c 69 64 61 74      this.validat
1a90: 65 28 72 65 73 75 6c 74 29 0a 0a 20 20 20 20 20  e(result)..     
1aa0: 20 63 6f 6e 73 74 20 64 65 74 61 69 6c 73 20 3d   const details =
1ab0: 20 70 61 72 73 65 50 61 63 6b 65 74 41 6e 64 44   parsePacketAndD
1ac0: 65 74 61 69 6c 73 28 7b 0a 20 20 20 20 20 20 20  etails({.       
1ad0: 20 70 61 63 6b 65 74 3a 20 72 65 73 75 6c 74 2e   packet: result.
1ae0: 70 61 63 6b 65 74 2c 0a 20 20 20 20 20 20 20 20  packet,.        
1af0: 73 65 63 72 65 74 3a 20 74 68 69 73 2e 70 61 72  secret: this.par
1b00: 61 6d 73 2e 73 65 63 72 65 74 0a 20 20 20 20 20  ams.secret.     
1b10: 20 7d 29 0a 0a 20 20 20 20 20 20 61 73 73 65 72   })..      asser
1b20: 74 2e 65 71 75 61 6c 28 64 65 74 61 69 6c 73 2e  t.equal(details.
1b30: 68 65 61 64 65 72 73 5b 27 73 65 6e 64 65 72 27  headers['sender'
1b40: 5d 2c 20 27 50 69 c3 a8 72 72 65 27 29 0a 20 20  ], 'Pi..rre').  
1b50: 20 20 20 20 61 73 73 65 72 74 2e 65 71 75 61 6c      assert.equal
1b60: 28 64 65 74 61 69 6c 73 2e 68 65 61 64 65 72 73  (details.headers
1b70: 5b 27 73 6f 75 72 63 65 2d 69 6d 61 67 65 2d 75  ['source-image-u
1b80: 72 6c 27 5d 2c 20 27 68 74 74 70 73 3a 2f 2f 73  rl'], 'https://s
1b90: 65 6e 64 69 6e 67 2d 69 6c 70 6b 69 74 2e 65 78  ending-ilpkit.ex
1ba0: 61 6d 70 6c 65 2f 70 69 63 3f 75 73 65 72 3d 70  ample/pic?user=p
1bb0: 69 65 72 72 65 27 29 0a 20 20 20 20 20 20 61 73  ierre').      as
1bc0: 73 65 72 74 2e 65 71 75 61 6c 28 64 65 74 61 69  sert.equal(detai
1bd0: 6c 73 2e 68 65 61 64 65 72 73 5b 27 73 6f 75 72  ls.headers['sour
1be0: 63 65 2d 69 64 65 6e 74 69 66 69 65 72 27 5d 2c  ce-identifier'],
1bf0: 20 27 70 69 65 72 72 65 40 73 65 6e 64 69 6e 67   'pierre@sending
1c00: 2d 69 6c 70 6b 69 74 2e 65 78 61 6d 70 6c 65 27  -ilpkit.example'
1c10: 29 0a 20 20 20 20 7d 29 0a 0a 20 20 20 20 69 74  ).    })..    it
1c20: 28 27 73 68 6f 75 6c 64 20 61 6c 6c 6f 77 20 65  ('should allow e
1c30: 6e 63 72 79 70 74 69 6f 6e 20 74 6f 20 62 65 20  ncryption to be 
1c40: 64 69 73 61 62 6c 65 64 27 2c 20 66 75 6e 63 74  disabled', funct
1c50: 69 6f 6e 20 28 29 20 7b 0a 20 20 20 20 20 20 74  ion () {.      t
1c60: 68 69 73 2e 70 61 72 61 6d 73 2e 64 69 73 61 62  his.params.disab
1c70: 6c 65 45 6e 63 72 79 70 74 69 6f 6e 20 3d 20 74  leEncryption = t
1c80: 72 75 65 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  rue.      const 
1c90: 72 65 73 75 6c 74 20 3d 20 54 72 61 6e 73 70 6f  result = Transpo
1ca0: 72 74 2e 63 72 65 61 74 65 50 61 63 6b 65 74 41  rt.createPacketA
1cb0: 6e 64 43 6f 6e 64 69 74 69 6f 6e 28 74 68 69 73  ndCondition(this
1cc0: 2e 70 61 72 61 6d 73 2c 20 27 70 73 6b 27 29 0a  .params, 'psk').
1cd0: 20 20 20 20 20 20 74 68 69 73 2e 76 61 6c 69 64        this.valid
1ce0: 61 74 65 28 72 65 73 75 6c 74 29 0a 0a 20 20 20  ate(result)..   
1cf0: 20 20 20 63 6f 6e 73 74 20 64 65 74 61 69 6c 73     const details
1d00: 20 3d 20 70 61 72 73 65 50 61 63 6b 65 74 41 6e   = parsePacketAn
1d10: 64 44 65 74 61 69 6c 73 28 7b 0a 20 20 20 20 20  dDetails({.     
1d20: 20 20 20 2f 2f 20 6e 6f 20 73 65 63 72 65 74 20     // no secret 
1d30: 70 72 6f 76 69 64 65 64 2c 20 62 65 63 61 75 73  provided, becaus
1d40: 65 20 6e 6f 20 65 6e 63 72 79 70 74 69 6f 6e 0a  e no encryption.
1d50: 20 20 20 20 20 20 20 20 70 61 63 6b 65 74 3a 20          packet: 
1d60: 72 65 73 75 6c 74 2e 70 61 63 6b 65 74 0a 20 20  result.packet.  
1d70: 20 20 20 20 7d 29 0a 0a 20 20 20 20 20 20 61 73      })..      as
1d80: 73 65 72 74 2e 65 71 75 61 6c 28 64 65 74 61 69  sert.equal(detai
1d90: 6c 73 2e 70 75 62 6c 69 63 48 65 61 64 65 72 73  ls.publicHeaders
1da0: 5b 27 65 6e 63 72 79 70 74 69 6f 6e 27 5d 2c 20  ['encryption'], 
1db0: 27 6e 6f 6e 65 27 29 0a 20 20 20 20 20 20 61 73  'none').      as
1dc0: 73 65 72 74 2e 65 71 75 61 6c 28 64 65 74 61 69  sert.equal(detai
1dd0: 6c 73 2e 68 65 61 64 65 72 73 5b 27 65 78 70 69  ls.headers['expi
1de0: 72 65 73 2d 61 74 27 5d 2c 20 74 68 69 73 2e 70  res-at'], this.p
1df0: 61 72 61 6d 73 2e 65 78 70 69 72 65 73 41 74 29  arams.expiresAt)
1e00: 0a 20 20 20 20 7d 29 0a 0a 20 20 20 20 64 65 73  .    })..    des
1e10: 63 72 69 62 65 28 27 49 50 52 27 2c 20 66 75 6e  cribe('IPR', fun
1e20: 63 74 69 6f 6e 20 28 29 20 7b 0a 20 20 20 20 20  ction () {.     
1e30: 20 69 74 28 27 73 68 6f 75 6c 64 20 63 72 65 61   it('should crea
1e40: 74 65 20 70 61 63 6b 65 74 20 61 6e 64 20 63 6f  te packet and co
1e50: 6e 64 69 74 69 6f 6e 27 2c 20 66 75 6e 63 74 69  ndition', functi
1e60: 6f 6e 20 28 29 20 7b 0a 20 20 20 20 20 20 20 20  on () {.        
1e70: 74 68 69 73 2e 70 61 72 61 6d 73 2e 72 65 63 65  this.params.rece
1e80: 69 76 65 72 53 65 63 72 65 74 20 3d 20 42 75 66  iverSecret = Buf
1e90: 66 65 72 2e 66 72 6f 6d 28 27 73 65 63 72 65 74  fer.from('secret
1ea0: 27 29 0a 20 20 20 20 20 20 20 20 74 68 69 73 2e  ').        this.
1eb0: 70 61 72 61 6d 73 2e 64 65 73 74 69 6e 61 74 69  params.destinati
1ec0: 6f 6e 41 63 63 6f 75 6e 74 20 3d 20 27 74 65 73  onAccount = 'tes
1ed0: 74 2e 65 78 61 6d 70 6c 65 2e 61 6c 69 63 65 27  t.example.alice'
1ee0: 0a 20 20 20 20 20 20 20 20 64 65 6c 65 74 65 20  .        delete 
1ef0: 74 68 69 73 2e 70 61 72 61 6d 73 2e 73 65 63 72  this.params.secr
1f00: 65 74 0a 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  et..        cons
1f10: 74 20 72 65 73 75 6c 74 20 3d 20 49 4c 50 2e 49  t result = ILP.I
1f20: 50 52 2e 63 72 65 61 74 65 50 61 63 6b 65 74 41  PR.createPacketA
1f30: 6e 64 43 6f 6e 64 69 74 69 6f 6e 28 74 68 69 73  ndCondition(this
1f40: 2e 70 61 72 61 6d 73 29 0a 20 20 20 20 20 20 20  .params).       
1f50: 20 63 6f 6e 73 74 20 7b 20 61 63 63 6f 75 6e 74   const { account
1f60: 20 7d 20 3d 20 50 61 63 6b 65 74 2e 70 61 72 73   } = Packet.pars
1f70: 65 28 72 65 73 75 6c 74 2e 70 61 63 6b 65 74 29  e(result.packet)
1f80: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 2e  .        assert.
1f90: 6d 61 74 63 68 28 61 63 63 6f 75 6e 74 2c 0a 20  match(account,. 
1fa0: 20 20 20 20 20 20 20 20 20 2f 74 65 73 74 5c 2e           /test\.
1fb0: 65 78 61 6d 70 6c 65 5c 2e 61 6c 69 63 65 5c 2e  example\.alice\.
1fc0: 65 62 4b 57 63 41 45 42 39 5f 41 5b 41 2d 5a 61  ebKWcAEB9_A[A-Za
1fd0: 2d 7a 30 2d 39 5f 2d 5d 7b 32 32 7d 2f 29 0a 20  -z0-9_-]{22}/). 
1fe0: 20 20 20 20 20 7d 29 0a 20 20 20 20 7d 29 0a 0a       }).    })..
1ff0: 20 20 20 20 64 65 73 63 72 69 62 65 28 27 50 53      describe('PS
2000: 4b 27 2c 20 66 75 6e 63 74 69 6f 6e 20 28 29 20  K', function () 
2010: 7b 0a 20 20 20 20 20 20 69 74 28 27 73 68 6f 75  {.      it('shou
2020: 6c 64 20 63 72 65 61 74 65 20 70 61 63 6b 65 74  ld create packet
2030: 20 61 6e 64 20 63 6f 6e 64 69 74 69 6f 6e 27 2c   and condition',
2040: 20 66 75 6e 63 74 69 6f 6e 20 28 29 20 7b 0a 20   function () {. 
2050: 20 20 20 20 20 20 20 2f 2f 20 6f 6e 65 20 66 69         // one fi
2060: 65 6c 64 20 6e 61 6d 65 20 69 73 20 64 69 66 66  eld name is diff
2070: 65 72 65 6e 74 2c 20 61 6e 64 20 74 61 6b 65 73  erent, and takes
2080: 20 61 20 73 74 72 69 6e 67 0a 20 20 20 20 20 20   a string.      
2090: 20 20 74 68 69 73 2e 70 61 72 61 6d 73 2e 73 68    this.params.sh
20a0: 61 72 65 64 53 65 63 72 65 74 20 3d 20 27 62 6f  aredSecret = 'bo
20b0: 34 47 68 76 56 4e 57 38 6e 61 63 53 7a 30 50 76  4GhvVNW8nacSz0Pv
20c0: 69 62 4b 41 27 0a 20 20 20 20 20 20 20 20 64 65  ibKA'.        de
20d0: 6c 65 74 65 20 74 68 69 73 2e 70 61 72 61 6d 73  lete this.params
20e0: 2e 73 65 63 72 65 74 0a 0a 20 20 20 20 20 20 20  .secret..       
20f0: 20 63 6f 6e 73 74 20 72 65 73 75 6c 74 20 3d 20   const result = 
2100: 49 4c 50 2e 50 53 4b 2e 63 72 65 61 74 65 50 61  ILP.PSK.createPa
2110: 63 6b 65 74 41 6e 64 43 6f 6e 64 69 74 69 6f 6e  cketAndCondition
2120: 28 74 68 69 73 2e 70 61 72 61 6d 73 29 0a 20 20  (this.params).  
2130: 20 20 20 20 20 20 74 68 69 73 2e 76 61 6c 69 64        this.valid
2140: 61 74 65 28 72 65 73 75 6c 74 29 0a 20 20 20 20  ate(result).    
2150: 20 20 7d 29 0a 20 20 20 20 7d 29 0a 20 20 7d 29    }).    }).  })
2160: 0a 0a 20 20 62 65 66 6f 72 65 45 61 63 68 28 66  ..  beforeEach(f
2170: 75 6e 63 74 69 6f 6e 20 28 29 20 7b 0a 20 20 20  unction () {.   
2180: 20 74 68 69 73 2e 70 6c 75 67 69 6e 20 3d 20 6e   this.plugin = n
2190: 65 77 20 4d 6f 63 6b 50 6c 75 67 69 6e 28 29 0a  ew MockPlugin().
21a0: 20 20 7d 29 0a 0a 20 20 64 65 73 63 72 69 62 65    })..  describe
21b0: 28 27 6c 69 73 74 65 6e 27 2c 20 66 75 6e 63 74  ('listen', funct
21c0: 69 6f 6e 20 28 29 20 7b 0a 20 20 20 20 62 65 66  ion () {.    bef
21d0: 6f 72 65 45 61 63 68 28 66 75 6e 63 74 69 6f 6e  oreEach(function
21e0: 20 28 29 20 7b 0a 20 20 20 20 20 20 74 68 69 73   () {.      this
21f0: 2e 70 61 72 61 6d 73 20 3d 20 7b 0a 20 20 20 20  .params = {.    
2200: 20 20 20 20 69 64 3a 20 27 65 65 33 39 64 31 37      id: 'ee39d17
2210: 31 2d 63 64 64 35 2d 34 32 36 38 2d 39 65 63 38  1-cdd5-4268-9ec8
2220: 2d 61 63 63 33 34 39 36 36 36 30 35 35 27 2c 0a  -acc349666055',.
2230: 20 20 20 20 20 20 20 20 72 65 63 65 69 76 65 72          receiver
2240: 53 65 63 72 65 74 3a 20 42 75 66 66 65 72 2e 66  Secret: Buffer.f
2250: 72 6f 6d 28 27 62 6f 34 47 68 76 56 4e 57 38 6e  rom('bo4GhvVNW8n
2260: 61 63 53 7a 30 50 76 69 62 4b 41 27 2c 20 27 62  acSz0PvibKA', 'b
2270: 61 73 65 36 34 27 29 2c 0a 20 20 20 20 20 20 20  ase64'),.       
2280: 20 63 6f 6e 6e 65 63 74 54 69 6d 65 6f 75 74 3a   connectTimeout:
2290: 20 31 30 30 0a 20 20 20 20 20 20 7d 0a 20 20 20   100.      }.   
22a0: 20 7d 29 0a 0a 20 20 20 20 69 74 28 27 73 68 6f   })..    it('sho
22b0: 75 6c 64 20 6c 69 73 74 65 6e 27 2c 20 61 73 79  uld listen', asy
22c0: 6e 63 20 66 75 6e 63 74 69 6f 6e 20 28 29 20 7b  nc function () {
22d0: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 72 65 73  .      const res
22e0: 20 3d 20 61 77 61 69 74 20 54 72 61 6e 73 70 6f   = await Transpo
22f0: 72 74 2e 6c 69 73 74 65 6e 28 74 68 69 73 2e 70  rt.listen(this.p
2300: 6c 75 67 69 6e 2c 20 74 68 69 73 2e 70 61 72 61  lugin, this.para
2310: 6d 73 2c 20 28 29 20 3d 3e 20 7b 7d 29 0a 20 20  ms, () => {}).  
2320: 20 20 20 20 61 73 73 65 72 74 2e 69 73 46 75 6e      assert.isFun
2330: 63 74 69 6f 6e 28 72 65 73 2c 20 27 73 68 6f 75  ction(res, 'shou
2340: 6c 64 20 72 65 74 75 72 6e 20 61 20 66 75 6e 63  ld return a func
2350: 74 69 6f 6e 27 29 0a 20 20 20 20 7d 29 0a 0a 20  tion').    }).. 
2360: 20 20 20 69 74 28 27 73 68 6f 75 6c 64 20 74 68     it('should th
2370: 72 6f 77 20 69 66 20 63 6f 6e 6e 65 63 74 20 72  row if connect r
2380: 65 6a 65 63 74 73 27 2c 20 61 73 79 6e 63 20 66  ejects', async f
2390: 75 6e 63 74 69 6f 6e 20 28 29 20 7b 0a 20 20 20  unction () {.   
23a0: 20 20 20 74 68 69 73 2e 70 6c 75 67 69 6e 2e 63     this.plugin.c
23b0: 6f 6e 6e 65 63 74 20 3d 20 28 29 20 3d 3e 20 50  onnect = () => P
23c0: 72 6f 6d 69 73 65 2e 72 65 6a 65 63 74 28 6e 65  romise.reject(ne
23d0: 77 20 45 72 72 6f 72 28 27 61 6e 20 65 72 72 6f  w Error('an erro
23e0: 72 21 27 29 29 0a 20 20 20 20 20 20 61 77 61 69  r!')).      awai
23f0: 74 20 65 78 70 65 63 74 28 54 72 61 6e 73 70 6f  t expect(Transpo
2400: 72 74 2e 6c 69 73 74 65 6e 28 74 68 69 73 2e 70  rt.listen(this.p
2410: 6c 75 67 69 6e 2c 20 74 68 69 73 2e 70 61 72 61  lugin, this.para
2420: 6d 73 2c 20 28 29 20 3d 3e 20 7b 7d 29 29 0a 20  ms, () => {})). 
2430: 20 20 20 20 20 20 20 2e 74 6f 2e 65 76 65 6e 74         .to.event
2440: 75 61 6c 6c 79 2e 62 65 2e 72 65 6a 65 63 74 65  ually.be.rejecte
2450: 64 57 69 74 68 28 2f 61 6e 20 65 72 72 6f 72 21  dWith(/an error!
2460: 2f 29 0a 20 20 20 20 7d 29 0a 0a 20 20 20 20 69  /).    })..    i
2470: 74 28 27 73 68 6f 75 6c 64 20 72 65 6d 6f 76 65  t('should remove
2480: 20 6c 69 73 74 65 6e 65 72 73 20 77 69 74 68 20   listeners with 
2490: 69 74 73 20 66 75 6e 63 74 69 6f 6e 27 2c 20 61  its function', a
24a0: 73 79 6e 63 20 66 75 6e 63 74 69 6f 6e 20 28 29  sync function ()
24b0: 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 72   {.      const r
24c0: 65 73 20 3d 20 61 77 61 69 74 20 54 72 61 6e 73  es = await Trans
24d0: 70 6f 72 74 2e 6c 69 73 74 65 6e 28 74 68 69 73  port.listen(this
24e0: 2e 70 6c 75 67 69 6e 2c 20 74 68 69 73 2e 70 61  .plugin, this.pa
24f0: 72 61 6d 73 2c 20 28 29 20 3d 3e 20 7b 7d 29 0a  rams, () => {}).
2500: 20 20 20 20 20 20 61 73 73 65 72 74 28 74 68 69        assert(thi
2510: 73 2e 70 6c 75 67 69 6e 2e 5f 64 61 74 61 48 61  s.plugin._dataHa
2520: 6e 64 6c 65 72 2c 20 27 61 20 68 61 6e 64 6c 65  ndler, 'a handle
2530: 72 20 6d 75 73 74 20 62 65 20 73 65 74 27 29 0a  r must be set').
2540: 20 20 20 20 20 20 72 65 73 28 29 0a 20 20 20 20        res().    
2550: 20 20 61 73 73 65 72 74 28 21 74 68 69 73 2e 70    assert(!this.p
2560: 6c 75 67 69 6e 2e 5f 64 61 74 61 48 61 6e 64 6c  lugin._dataHandl
2570: 65 72 2c 20 27 6e 6f 20 68 61 6e 64 6c 65 72 20  er, 'no handler 
2580: 6d 75 73 74 20 62 65 20 73 65 74 27 29 0a 20 20  must be set').  
2590: 20 20 7d 29 0a 0a 20 20 20 20 64 65 73 63 72 69    })..    descri
25a0: 62 65 28 27 49 50 52 27 2c 20 66 75 6e 63 74 69  be('IPR', functi
25b0: 6f 6e 20 28 29 20 7b 0a 20 20 20 20 20 20 69 74  on () {.      it
25c0: 28 27 73 68 6f 75 6c 64 20 6c 69 73 74 65 6e 20  ('should listen 
25d0: 76 69 61 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20  via function in 
25e0: 49 50 52 27 2c 20 61 73 79 6e 63 20 66 75 6e 63  IPR', async func
25f0: 74 69 6f 6e 20 28 29 20 7b 0a 20 20 20 20 20 20  tion () {.      
2600: 20 20 63 6f 6e 73 74 20 72 65 73 20 3d 20 61 77    const res = aw
2610: 61 69 74 20 49 4c 50 2e 49 50 52 2e 6c 69 73 74  ait ILP.IPR.list
2620: 65 6e 28 74 68 69 73 2e 70 6c 75 67 69 6e 2c 20  en(this.plugin, 
2630: 74 68 69 73 2e 70 61 72 61 6d 73 2c 20 28 29 20  this.params, () 
2640: 3d 3e 20 7b 7d 29 0a 20 20 20 20 20 20 20 20 61  => {}).        a
2650: 73 73 65 72 74 2e 69 73 46 75 6e 63 74 69 6f 6e  ssert.isFunction
2660: 28 72 65 73 2c 20 27 73 68 6f 75 6c 64 20 72 65  (res, 'should re
2670: 74 75 72 6e 20 61 20 66 75 6e 63 74 69 6f 6e 27  turn a function'
2680: 29 0a 20 20 20 20 20 20 7d 29 0a 20 20 20 20 7d  ).      }).    }
2690: 29 0a 0a 20 20 20 20 64 65 73 63 72 69 62 65 28  )..    describe(
26a0: 27 50 53 4b 27 2c 20 66 75 6e 63 74 69 6f 6e 20  'PSK', function 
26b0: 28 29 20 7b 0a 20 20 20 20 20 20 69 74 28 27 73  () {.      it('s
26c0: 68 6f 75 6c 64 20 6c 69 73 74 65 6e 20 76 69 61  hould listen via
26d0: 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 50 53 4b   function in PSK
26e0: 27 2c 20 61 73 79 6e 63 20 66 75 6e 63 74 69 6f  ', async functio
26f0: 6e 20 28 29 20 7b 0a 20 20 20 20 20 20 20 20 74  n () {.        t
2700: 68 69 73 2e 70 61 72 61 6d 73 2e 73 68 61 72 65  his.params.share
2710: 64 53 65 63 72 65 74 20 3d 20 74 68 69 73 2e 70  dSecret = this.p
2720: 61 72 61 6d 73 2e 73 65 63 72 65 74 0a 20 20 20  arams.secret.   
2730: 20 20 20 20 20 64 65 6c 65 74 65 20 74 68 69 73       delete this
2740: 2e 70 61 72 61 6d 73 2e 73 65 63 72 65 74 0a 0a  .params.secret..
2750: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 72 65          const re
2760: 73 20 3d 20 61 77 61 69 74 20 49 4c 50 2e 50 53  s = await ILP.PS
2770: 4b 2e 6c 69 73 74 65 6e 28 74 68 69 73 2e 70 6c  K.listen(this.pl
2780: 75 67 69 6e 2c 20 74 68 69 73 2e 70 61 72 61 6d  ugin, this.param
2790: 73 2c 20 28 29 20 3d 3e 20 7b 7d 29 0a 20 20 20  s, () => {}).   
27a0: 20 20 20 20 20 61 73 73 65 72 74 2e 69 73 4f 62       assert.isOb
27b0: 6a 65 63 74 28 72 65 73 2c 20 27 73 68 6f 75 6c  ject(res, 'shoul
27c0: 64 20 72 65 74 75 72 6e 20 61 6e 20 6f 62 6a 65  d return an obje
27d0: 63 74 27 29 0a 20 20 20 20 20 20 20 20 61 73 73  ct').        ass
27e0: 65 72 74 2e 69 73 46 75 6e 63 74 69 6f 6e 28 72  ert.isFunction(r
27f0: 65 73 2e 63 6c 6f 73 65 2c 20 27 73 68 6f 75 6c  es.close, 'shoul
2800: 64 20 68 61 76 65 20 61 20 63 6c 6f 73 65 20 6d  d have a close m
2810: 65 74 68 6f 64 27 29 0a 20 20 20 20 20 20 20 20  ethod').        
2820: 61 73 73 65 72 74 2e 69 73 46 75 6e 63 74 69 6f  assert.isFunctio
2830: 6e 28 72 65 73 2e 67 65 6e 65 72 61 74 65 50 61  n(res.generatePa
2840: 72 61 6d 73 2c 20 27 73 68 6f 75 6c 64 20 68 61  rams, 'should ha
2850: 76 65 20 61 20 67 65 6e 65 72 61 74 65 50 61 72  ve a generatePar
2860: 61 6d 73 20 6d 65 74 68 6f 64 27 29 0a 0a 20 20  ams method')..  
2870: 20 20 20 20 20 20 63 6f 6e 73 74 20 70 61 72 61        const para
2880: 6d 73 20 3d 20 72 65 73 2e 67 65 6e 65 72 61 74  ms = res.generat
2890: 65 50 61 72 61 6d 73 28 29 0a 20 20 20 20 20 20  eParams().      
28a0: 20 20 61 73 73 65 72 74 2e 69 73 4f 62 6a 65 63    assert.isObjec
28b0: 74 28 70 61 72 61 6d 73 2c 20 27 67 65 6e 65 72  t(params, 'gener
28c0: 61 74 65 50 61 72 61 6d 73 20 73 68 6f 75 6c 64  ateParams should
28d0: 20 72 65 74 75 72 6e 20 61 6e 20 6f 62 6a 65 63   return an objec
28e0: 74 27 29 0a 20 20 20 20 20 20 20 20 61 73 73 65  t').        asse
28f0: 72 74 2e 69 73 53 74 72 69 6e 67 28 70 61 72 61  rt.isString(para
2900: 6d 73 2e 73 68 61 72 65 64 53 65 63 72 65 74 2c  ms.sharedSecret,
2910: 20 27 70 61 72 61 6d 73 20 73 68 6f 75 6c 64 20   'params should 
2920: 68 61 76 65 20 61 20 73 68 61 72 65 64 20 73 65  have a shared se
2930: 63 72 65 74 27 29 0a 20 20 20 20 20 20 20 20 61  cret').        a
2940: 73 73 65 72 74 2e 69 73 53 74 72 69 6e 67 28 70  ssert.isString(p
2950: 61 72 61 6d 73 2e 64 65 73 74 69 6e 61 74 69 6f  arams.destinatio
2960: 6e 41 63 63 6f 75 6e 74 2c 20 27 70 61 72 61 6d  nAccount, 'param
2970: 73 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 20  s should have a 
2980: 64 65 73 74 69 6e 61 74 69 6f 6e 20 61 63 63 6f  destination acco
2990: 75 6e 74 27 29 0a 20 20 20 20 20 20 7d 29 0a 20  unt').      }). 
29a0: 20 20 20 7d 29 0a 20 20 7d 29 0a 0a 20 20 64 65     }).  })..  de
29b0: 73 63 72 69 62 65 28 27 5f 76 61 6c 69 64 61 74  scribe('_validat
29c0: 65 4f 72 52 65 6a 65 63 74 54 72 61 6e 73 66 65  eOrRejectTransfe
29d0: 72 27 2c 20 66 75 6e 63 74 69 6f 6e 20 28 29 20  r', function () 
29e0: 7b 0a 20 20 20 20 62 65 66 6f 72 65 45 61 63 68  {.    beforeEach
29f0: 28 66 75 6e 63 74 69 6f 6e 20 28 29 20 7b 0a 20  (function () {. 
2a00: 20 20 20 20 20 63 6f 6e 73 74 20 7b 20 70 61 63       const { pac
2a10: 6b 65 74 2c 20 63 6f 6e 64 69 74 69 6f 6e 20 7d  ket, condition }
2a20: 20 3d 20 54 72 61 6e 73 70 6f 72 74 2e 63 72 65   = Transport.cre
2a30: 61 74 65 50 61 63 6b 65 74 41 6e 64 43 6f 6e 64  atePacketAndCond
2a40: 69 74 69 6f 6e 28 7b 0a 20 20 20 20 20 20 20 20  ition({.        
2a50: 64 65 73 74 69 6e 61 74 69 6f 6e 41 6d 6f 75 6e  destinationAmoun
2a60: 74 3a 20 27 31 27 2c 0a 20 20 20 20 20 20 20 20  t: '1',.        
2a70: 64 65 73 74 69 6e 61 74 69 6f 6e 41 63 63 6f 75  destinationAccou
2a80: 6e 74 3a 20 27 74 65 73 74 2e 65 78 61 6d 70 6c  nt: 'test.exampl
2a90: 65 2e 61 6c 69 63 65 2e 65 62 4b 57 63 41 45 42  e.alice.ebKWcAEB
2aa0: 39 5f 41 47 6d 65 57 49 58 33 44 31 46 4c 77 49  9_AGmeWIX3D1FLwI
2ab0: 58 30 43 46 76 66 46 53 51 27 2c 0a 20 20 20 20  X0CFvfFSQ',.    
2ac0: 20 20 20 20 73 65 63 72 65 74 3a 20 42 75 66 66      secret: Buff
2ad0: 65 72 2e 66 72 6f 6d 28 27 62 6f 34 47 68 76 56  er.from('bo4GhvV
2ae0: 4e 57 38 6e 61 63 53 7a 30 50 76 69 62 4b 41 27  NW8nacSz0PvibKA'
2af0: 2c 20 27 62 61 73 65 36 34 27 29 2c 0a 20 20 20  , 'base64'),.   
2b00: 20 20 20 20 20 64 61 74 61 3a 20 42 75 66 66 65       data: Buffe
2b10: 72 2e 66 72 6f 6d 28 27 74 65 73 74 20 64 61 74  r.from('test dat
2b20: 61 27 29 2c 0a 20 20 20 20 20 20 20 20 65 78 70  a'),.        exp
2b30: 69 72 65 73 41 74 3a 20 6d 6f 6d 65 6e 74 28 29  iresAt: moment()
2b40: 2e 61 64 64 28 31 2c 20 27 73 65 63 6f 6e 64 73  .add(1, 'seconds
2b50: 27 29 2e 74 6f 49 53 4f 53 74 72 69 6e 67 28 29  ').toISOString()
2b60: 0a 20 20 20 20 20 20 7d 2c 20 27 69 70 72 27 29  .      }, 'ipr')
2b70: 0a 0a 20 20 20 20 20 20 74 68 69 73 2e 70 61 63  ..      this.pac
2b80: 6b 65 74 20 3d 20 70 61 63 6b 65 74 0a 20 20 20  ket = packet.   
2b90: 20 20 20 74 68 69 73 2e 70 61 72 61 6d 73 20 3d     this.params =
2ba0: 20 7b 0a 20 20 20 20 20 20 20 20 70 6c 75 67 69   {.        plugi
2bb0: 6e 3a 20 74 68 69 73 2e 70 6c 75 67 69 6e 2c 0a  n: this.plugin,.
2bc0: 20 20 20 20 20 20 20 20 61 64 64 72 65 73 73 3a          address:
2bd0: 20 27 74 65 73 74 2e 65 78 61 6d 70 6c 65 2e 61   'test.example.a
2be0: 6c 69 63 65 27 2c 0a 20 20 20 20 20 20 20 20 72  lice',.        r
2bf0: 65 63 65 69 76 65 72 53 65 63 72 65 74 3a 20 42  eceiverSecret: B
2c00: 75 66 66 65 72 2e 66 72 6f 6d 28 27 73 65 63 72  uffer.from('secr
2c10: 65 74 27 29 2c 0a 20 20 20 20 20 20 20 20 74 72  et'),.        tr
2c20: 61 6e 73 66 65 72 3a 20 7b 0a 20 20 20 20 20 20  ansfer: {.      
2c30: 20 20 20 20 61 6d 6f 75 6e 74 3a 20 27 31 27 2c      amount: '1',
2c40: 0a 20 20 20 20 20 20 20 20 20 20 65 78 65 63 75  .          execu
2c50: 74 69 6f 6e 43 6f 6e 64 69 74 69 6f 6e 3a 20 63  tionCondition: c
2c60: 6f 6e 64 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20  ondition,.      
2c70: 20 20 20 20 69 6c 70 3a 20 70 61 63 6b 65 74 0a      ilp: packet.
2c80: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
2c90: 20 20 20 70 61 72 73 65 64 50 61 63 6b 65 74 3a     parsedPacket:
2ca0: 20 49 6c 70 50 61 63 6b 65 74 2e 64 65 73 65 72   IlpPacket.deser
2cb0: 69 61 6c 69 7a 65 49 6c 70 50 61 79 6d 65 6e 74  ializeIlpPayment
2cc0: 28 70 61 63 6b 65 74 29 0a 20 20 20 20 20 20 7d  (packet).      }
2cd0: 0a 20 20 20 20 7d 29 0a 0a 20 20 20 20 69 74 28  .    })..    it(
2ce0: 27 73 68 6f 75 6c 64 20 61 63 63 65 70 74 20 61  'should accept a
2cf0: 20 76 61 6c 69 64 20 74 72 61 6e 73 66 65 72 27   valid transfer'
2d00: 2c 20 61 73 79 6e 63 20 66 75 6e 63 74 69 6f 6e  , async function
2d10: 20 28 29 20 7b 0a 20 20 20 20 20 20 61 77 61 69   () {.      awai
2d20: 74 20 54 72 61 6e 73 70 6f 72 74 2e 5f 76 61 6c  t Transport._val
2d30: 69 64 61 74 65 4f 72 52 65 6a 65 63 74 54 72 61  idateOrRejectTra
2d40: 6e 73 66 65 72 28 74 68 69 73 2e 70 61 72 61 6d  nsfer(this.param
2d50: 73 29 0a 20 20 20 20 7d 29 0a 0a 20 20 20 20 69  s).    })..    i
2d60: 74 28 27 73 68 6f 75 6c 64 20 72 65 6a 65 63 74  t('should reject
2d70: 20 74 72 61 6e 73 66 65 72 20 77 69 74 68 6f 75   transfer withou
2d80: 74 20 50 53 4b 20 64 61 74 61 27 2c 20 61 73 79  t PSK data', asy
2d90: 6e 63 20 66 75 6e 63 74 69 6f 6e 20 28 29 20 7b  nc function () {
2da0: 0a 20 20 20 20 20 20 74 68 69 73 2e 70 61 72 61  .      this.para
2db0: 6d 73 2e 70 61 72 73 65 64 50 61 63 6b 65 74 2e  ms.parsedPacket.
2dc0: 64 61 74 61 20 3d 20 42 75 66 66 65 72 2e 66 72  data = Buffer.fr
2dd0: 6f 6d 28 27 67 61 72 62 61 67 65 27 29 0a 0a 20  om('garbage').. 
2de0: 20 20 20 20 20 65 78 70 65 63 74 28 28 29 20 3d       expect(() =
2df0: 3e 20 54 72 61 6e 73 70 6f 72 74 2e 5f 76 61 6c  > Transport._val
2e00: 69 64 61 74 65 4f 72 52 65 6a 65 63 74 54 72 61  idateOrRejectTra
2e10: 6e 73 66 65 72 28 74 68 69 73 2e 70 61 72 61 6d  nsfer(this.param
2e20: 73 29 29 0a 20 20 20 20 20 20 20 20 2e 74 6f 2e  s)).        .to.
2e30: 74 68 72 6f 77 28 27 75 6e 73 70 65 63 69 66 69  throw('unspecifi
2e40: 65 64 20 50 53 4b 20 65 72 72 6f 72 27 29 0a 20  ed PSK error'). 
2e50: 20 20 20 7d 29 0a 0a 20 20 20 20 69 74 28 27 73     })..    it('s
2e60: 68 6f 75 6c 64 20 72 65 6a 65 63 74 20 74 72 61  hould reject tra
2e70: 6e 73 66 65 72 20 77 69 74 68 20 75 6e 73 75 70  nsfer with unsup
2e80: 70 6f 72 74 65 64 20 50 53 4b 20 65 6e 63 72 79  ported PSK encry
2e90: 70 74 69 6f 6e 27 2c 20 61 73 79 6e 63 20 66 75  ption', async fu
2ea0: 6e 63 74 69 6f 6e 20 28 29 20 7b 0a 20 20 20 20  nction () {.    
2eb0: 20 20 74 68 69 73 2e 70 61 72 61 6d 73 2e 70 61    this.params.pa
2ec0: 72 73 65 64 50 61 63 6b 65 74 2e 64 61 74 61 20  rsedPacket.data 
2ed0: 3d 20 42 75 66 66 65 72 2e 66 72 6f 6d 28 60 50  = Buffer.from(`P
2ee0: 53 4b 2f 31 2e 30 0a 4e 6f 6e 63 65 3a 20 4b 78  SK/1.0.Nonce: Kx
2ef0: 6a 72 43 38 67 35 71 47 51 37 6d 6a 5f 4f 44 71  jrC8g5qGQ7mj_ODq
2f00: 42 4d 74 77 0a 45 6e 63 72 79 70 74 69 6f 6e 3a  BMtw.Encryption:
2f10: 20 72 6f 74 31 33 0a 0a 64 61 74 61 60 2c 20 27   rot13..data`, '
2f20: 75 74 66 38 27 29 0a 0a 20 20 20 20 20 20 65 78  utf8')..      ex
2f30: 70 65 63 74 28 28 29 20 3d 3e 20 54 72 61 6e 73  pect(() => Trans
2f40: 70 6f 72 74 2e 5f 76 61 6c 69 64 61 74 65 4f 72  port._validateOr
2f50: 52 65 6a 65 63 74 54 72 61 6e 73 66 65 72 28 74  RejectTransfer(t
2f60: 68 69 73 2e 70 61 72 61 6d 73 29 29 0a 20 20 20  his.params)).   
2f70: 20 20 20 20 20 2e 74 6f 2e 74 68 72 6f 77 28 27       .to.throw('
2f80: 75 6e 73 75 70 70 6f 72 74 65 64 20 50 53 4b 20  unsupported PSK 
2f90: 65 6e 63 72 79 70 74 69 6f 6e 20 6d 65 74 68 6f  encryption metho
2fa0: 64 27 29 0a 20 20 20 20 7d 29 0a 0a 20 20 20 20  d').    })..    
2fb0: 69 74 28 27 73 68 6f 75 6c 64 20 72 65 6a 65 63  it('should rejec
2fc0: 74 20 74 72 61 6e 73 66 65 72 20 77 69 74 68 6f  t transfer witho
2fd0: 75 74 20 50 53 4b 20 6e 6f 6e 63 65 27 2c 20 61  ut PSK nonce', a
2fe0: 73 79 6e 63 20 66 75 6e 63 74 69 6f 6e 20 28 29  sync function ()
2ff0: 20 7b 0a 20 20 20 20 20 20 74 68 69 73 2e 70 61   {.      this.pa
3000: 72 61 6d 73 2e 70 61 72 73 65 64 50 61 63 6b 65  rams.parsedPacke
3010: 74 2e 64 61 74 61 20 3d 20 42 75 66 66 65 72 2e  t.data = Buffer.
3020: 66 72 6f 6d 28 60 50 53 4b 2f 31 2e 30 0a 45 6e  from(`PSK/1.0.En
3030: 63 72 79 70 74 69 6f 6e 3a 20 61 65 73 2d 32 35  cryption: aes-25
3040: 36 2d 67 63 6d 20 50 56 57 64 58 34 69 42 6a 50  6-gcm PVWdX4iBjP
3050: 51 67 31 36 41 4f 6c 69 32 43 42 77 0a 0a 64 61  Qg16AOli2CBw..da
3060: 74 61 60 2c 20 27 75 74 66 38 27 29 0a 0a 20 20  ta`, 'utf8')..  
3070: 20 20 20 20 65 78 70 65 63 74 28 28 29 20 3d 3e      expect(() =>
3080: 20 54 72 61 6e 73 70 6f 72 74 2e 5f 76 61 6c 69   Transport._vali
3090: 64 61 74 65 4f 72 52 65 6a 65 63 74 54 72 61 6e  dateOrRejectTran
30a0: 73 66 65 72 28 74 68 69 73 2e 70 61 72 61 6d 73  sfer(this.params
30b0: 29 29 0a 20 20 20 20 20 20 20 20 2e 74 6f 2e 74  )).        .to.t
30c0: 68 72 6f 77 28 27 6d 69 73 73 69 6e 67 20 50 53  hrow('missing PS
30d0: 4b 20 6e 6f 6e 63 65 27 29 20 2f 2f 20 46 30 36  K nonce') // F06
30e0: 0a 20 20 20 20 7d 29 0a 0a 20 20 20 20 69 74 28  .    })..    it(
30f0: 27 73 68 6f 75 6c 64 20 72 65 6a 65 63 74 20 74  'should reject t
3100: 72 61 6e 73 66 65 72 20 77 69 74 68 20 50 53 4b  ransfer with PSK
3110: 20 6b 65 79 20 68 65 61 64 65 72 27 2c 20 61 73   key header', as
3120: 79 6e 63 20 66 75 6e 63 74 69 6f 6e 20 28 29 20  ync function () 
3130: 7b 0a 20 20 20 20 20 20 74 68 69 73 2e 70 61 72  {.      this.par
3140: 61 6d 73 2e 70 61 72 73 65 64 50 61 63 6b 65 74  ams.parsedPacket
3150: 2e 64 61 74 61 20 3d 20 42 75 66 66 65 72 2e 66  .data = Buffer.f
3160: 72 6f 6d 28 60 50 53 4b 2f 31 2e 30 0a 4e 6f 6e  rom(`PSK/1.0.Non
3170: 63 65 3a 20 4b 78 6a 72 43 38 67 35 71 47 51 37  ce: KxjrC8g5qGQ7
3180: 6d 6a 5f 4f 44 71 42 4d 74 77 0a 45 6e 63 72 79  mj_ODqBMtw.Encry
3190: 70 74 69 6f 6e 3a 20 61 65 73 2d 32 35 36 2d 67  ption: aes-256-g
31a0: 63 6d 20 50 56 57 64 58 34 69 42 6a 50 51 67 31  cm PVWdX4iBjPQg1
31b0: 36 41 4f 6c 69 32 43 42 77 0a 4b 65 79 3a 20 65  6AOli2CBw.Key: e
31c0: 64 32 35 35 31 39 2d 65 63 64 68 0a 0a 64 61 74  d25519-ecdh..dat
31d0: 61 60 2c 20 27 75 74 66 38 27 29 0a 0a 20 20 20  a`, 'utf8')..   
31e0: 20 20 20 65 78 70 65 63 74 28 28 29 20 3d 3e 20     expect(() => 
31f0: 54 72 61 6e 73 70 6f 72 74 2e 5f 76 61 6c 69 64  Transport._valid
3200: 61 74 65 4f 72 52 65 6a 65 63 74 54 72 61 6e 73  ateOrRejectTrans
3210: 66 65 72 28 74 68 69 73 2e 70 61 72 61 6d 73 29  fer(this.params)
3220: 29 0a 20 20 20 20 20 20 20 20 2e 74 6f 2e 74 68  ).        .to.th
3230: 72 6f 77 28 27 75 6e 73 75 70 70 6f 72 74 65 64  row('unsupported
3240: 20 50 53 4b 20 6b 65 79 20 64 65 72 69 76 61 74   PSK key derivat
3250: 69 6f 6e 27 29 20 2f 2f 20 46 30 36 0a 20 20 20  ion') // F06.   
3260: 20 7d 29 0a 0a 20 20 20 20 69 74 28 27 73 68 6f   })..    it('sho
3270: 75 6c 64 20 72 65 6a 65 63 74 20 74 72 61 6e 73  uld reject trans
3280: 66 65 72 20 77 69 74 68 62 61 64 20 50 53 4b 20  fer withbad PSK 
3290: 73 74 61 74 75 73 20 6c 69 6e 65 27 2c 20 61 73  status line', as
32a0: 79 6e 63 20 66 75 6e 63 74 69 6f 6e 20 28 29 20  ync function () 
32b0: 7b 0a 20 20 20 20 20 20 74 68 69 73 2e 70 61 72  {.      this.par
32c0: 61 6d 73 2e 70 61 72 73 65 64 50 61 63 6b 65 74  ams.parsedPacket
32d0: 2e 64 61 74 61 20 3d 20 42 75 66 66 65 72 2e 66  .data = Buffer.f
32e0: 72 6f 6d 28 60 50 53 4b 2f 32 2e 30 0a 0a 64 61  rom(`PSK/2.0..da
32f0: 74 61 60 2c 20 27 75 74 66 38 27 29 0a 0a 20 20  ta`, 'utf8')..  
3300: 20 20 20 20 65 78 70 65 63 74 28 28 29 20 3d 3e      expect(() =>
3310: 20 54 72 61 6e 73 70 6f 72 74 2e 5f 76 61 6c 69   Transport._vali
3320: 64 61 74 65 4f 72 52 65 6a 65 63 74 54 72 61 6e  dateOrRejectTran
3330: 73 66 65 72 28 74 68 69 73 2e 70 61 72 61 6d 73  sfer(this.params
3340: 29 29 0a 20 20 20 20 20 20 20 20 2e 74 6f 2e 74  )).        .to.t
3350: 68 72 6f 77 28 27 75 6e 73 75 70 70 6f 72 74 65  hrow('unsupporte
3360: 64 20 50 53 4b 20 76 65 72 73 69 6f 6e 20 6f 72  d PSK version or
3370: 20 73 74 61 74 75 73 27 29 20 2f 2f 20 46 30 36   status') // F06
3380: 0a 20 20 20 20 7d 29 0a 0a 20 20 20 20 69 74 28  .    })..    it(
3390: 27 73 68 6f 75 6c 64 20 69 67 6e 6f 72 65 20 74  'should ignore t
33a0: 72 61 6e 73 66 65 72 20 66 6f 72 20 6f 74 68 65  ransfer for othe
33b0: 72 20 61 63 63 6f 75 6e 74 27 2c 20 61 73 79 6e  r account', asyn
33c0: 63 20 66 75 6e 63 74 69 6f 6e 20 28 29 20 7b 0a  c function () {.
33d0: 20 20 20 20 20 20 74 68 69 73 2e 70 61 72 61 6d        this.param
33e0: 73 2e 70 61 72 73 65 64 50 61 63 6b 65 74 2e 61  s.parsedPacket.a
33f0: 63 63 6f 75 6e 74 20 3d 20 27 74 65 73 74 2e 65  ccount = 'test.e
3400: 78 61 6d 70 6c 65 2e 67 61 72 62 61 67 65 27 0a  xample.garbage'.
3410: 0a 20 20 20 20 20 20 65 78 70 65 63 74 28 28 29  .      expect(()
3420: 20 3d 3e 20 54 72 61 6e 73 70 6f 72 74 2e 5f 76   => Transport._v
3430: 61 6c 69 64 61 74 65 4f 72 52 65 6a 65 63 74 54  alidateOrRejectT
3440: 72 61 6e 73 66 65 72 28 74 68 69 73 2e 70 61 72  ransfer(this.par
3450: 61 6d 73 29 29 0a 20 20 20 20 20 20 20 20 2e 74  ams)).        .t
3460: 6f 2e 74 68 72 6f 77 28 27 72 65 63 65 69 76 65  o.throw('receive
3470: 64 20 70 61 79 6d 65 6e 74 20 66 6f 72 20 61 6e  d payment for an
3480: 6f 74 68 65 72 20 61 63 63 6f 75 6e 74 27 29 20  other account') 
3490: 2f 2f 20 46 30 36 0a 20 20 20 20 7d 29 0a 0a 20  // F06.    }).. 
34a0: 20 20 20 69 74 28 27 73 68 6f 75 6c 64 20 72 65     it('should re
34b0: 6a 65 63 74 20 74 72 61 6e 73 66 65 72 20 66 6f  ject transfer fo
34c0: 72 20 6f 74 68 65 72 20 72 65 63 65 69 76 65 72  r other receiver
34d0: 27 2c 20 61 73 79 6e 63 20 66 75 6e 63 74 69 6f  ', async functio
34e0: 6e 20 28 29 20 7b 0a 20 20 20 20 20 20 74 68 69  n () {.      thi
34f0: 73 2e 70 61 72 61 6d 73 2e 70 61 72 73 65 64 50  s.params.parsedP
3500: 61 63 6b 65 74 2e 61 63 63 6f 75 6e 74 20 3d 20  acket.account = 
3510: 27 74 65 73 74 2e 65 78 61 6d 70 6c 65 2e 61 6c  'test.example.al
3520: 69 63 65 2e 67 61 72 62 61 67 65 27 0a 0a 20 20  ice.garbage'..  
3530: 20 20 20 20 65 78 70 65 63 74 28 28 29 20 3d 3e      expect(() =>
3540: 20 54 72 61 6e 73 70 6f 72 74 2e 5f 76 61 6c 69   Transport._vali
3550: 64 61 74 65 4f 72 52 65 6a 65 63 74 54 72 61 6e  dateOrRejectTran
3560: 73 66 65 72 28 74 68 69 73 2e 70 61 72 61 6d 73  sfer(this.params
3570: 29 29 0a 20 20 20 20 20 20 20 20 2e 74 6f 2e 74  )).        .to.t
3580: 68 72 6f 77 28 27 72 65 63 65 69 76 65 64 20 70  hrow('received p
3590: 61 79 6d 65 6e 74 20 66 6f 72 20 61 6e 6f 74 68  ayment for anoth
35a0: 65 72 20 72 65 63 65 69 76 65 72 27 29 20 2f 2f  er receiver') //
35b0: 20 46 30 36 0a 20 20 20 20 7d 29 0a 0a 20 20 20   F06.    })..   
35c0: 20 69 74 28 27 73 68 6f 75 6c 64 20 72 65 6a 65   it('should reje
35d0: 63 74 20 74 72 61 6e 73 66 65 72 20 66 6f 72 20  ct transfer for 
35e0: 74 6f 6f 20 6c 69 74 74 6c 65 20 6d 6f 6e 65 79  too little money
35f0: 27 2c 20 61 73 79 6e 63 20 66 75 6e 63 74 69 6f  ', async functio
3600: 6e 20 28 29 20 7b 0a 20 20 20 20 20 20 74 68 69  n () {.      thi
3610: 73 2e 70 61 72 61 6d 73 2e 74 72 61 6e 73 66 65  s.params.transfe
3620: 72 2e 61 6d 6f 75 6e 74 20 3d 20 27 30 2e 31 27  r.amount = '0.1'
3630: 0a 0a 20 20 20 20 20 20 65 78 70 65 63 74 28 28  ..      expect((
3640: 29 20 3d 3e 20 54 72 61 6e 73 70 6f 72 74 2e 5f  ) => Transport._
3650: 76 61 6c 69 64 61 74 65 4f 72 52 65 6a 65 63 74  validateOrReject
3660: 54 72 61 6e 73 66 65 72 28 74 68 69 73 2e 70 61  Transfer(this.pa
3670: 72 61 6d 73 29 29 0a 20 20 20 20 20 20 20 20 2e  rams)).        .
3680: 74 6f 2e 74 68 72 6f 77 28 27 67 6f 74 20 6e 6f  to.throw('got no
3690: 74 69 66 69 63 61 74 69 6f 6e 20 6f 66 20 74 72  tification of tr
36a0: 61 6e 73 66 65 72 20 77 68 65 72 65 20 61 6d 6f  ansfer where amo
36b0: 75 6e 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e  unt is less than
36c0: 20 65 78 70 65 63 74 65 64 27 29 20 2f 2f 20 46   expected') // F
36d0: 30 34 0a 20 20 20 20 7d 29 0a 0a 20 20 20 20 69  04.    })..    i
36e0: 74 28 27 73 68 6f 75 6c 64 20 61 63 63 65 70 74  t('should accept
36f0: 20 65 78 74 72 61 20 6d 6f 6e 65 79 27 2c 20 61   extra money', a
3700: 73 79 6e 63 20 66 75 6e 63 74 69 6f 6e 20 28 29  sync function ()
3710: 20 7b 0a 20 20 20 20 20 20 74 68 69 73 2e 70 61   {.      this.pa
3720: 72 61 6d 73 2e 74 72 61 6e 73 66 65 72 2e 61 6d  rams.transfer.am
3730: 6f 75 6e 74 20 3d 20 27 31 2e 31 27 0a 20 20 20  ount = '1.1'.   
3740: 20 20 20 61 73 73 65 72 74 2e 69 73 4e 6f 74 4f     assert.isNotO
3750: 6b 28 54 72 61 6e 73 70 6f 72 74 2e 5f 76 61 6c  k(Transport._val
3760: 69 64 61 74 65 4f 72 52 65 6a 65 63 74 54 72 61  idateOrRejectTra
3770: 6e 73 66 65 72 28 74 68 69 73 2e 70 61 72 61 6d  nsfer(this.param
3780: 73 29 29 0a 20 20 20 20 7d 29 0a 0a 20 20 20 20  s)).    })..    
3790: 69 74 28 27 73 68 6f 75 6c 64 20 72 65 6a 65 63  it('should rejec
37a0: 74 20 74 72 61 6e 73 66 65 72 20 66 6f 72 20 74  t transfer for t
37b0: 6f 6f 20 6d 75 63 68 20 6d 6f 6e 65 79 20 69 66  oo much money if
37c0: 20 61 6c 6c 6f 77 4f 76 65 72 50 61 79 6d 65 6e   allowOverPaymen
37d0: 74 20 3d 3d 20 66 61 6c 73 65 27 2c 20 61 73 79  t == false', asy
37e0: 6e 63 20 66 75 6e 63 74 69 6f 6e 20 28 29 20 7b  nc function () {
37f0: 0a 20 20 20 20 20 20 74 68 69 73 2e 70 61 72 61  .      this.para
3800: 6d 73 2e 74 72 61 6e 73 66 65 72 2e 61 6d 6f 75  ms.transfer.amou
3810: 6e 74 20 3d 20 27 31 2e 31 27 0a 20 20 20 20 20  nt = '1.1'.     
3820: 20 74 68 69 73 2e 70 61 72 61 6d 73 2e 61 6c 6c   this.params.all
3830: 6f 77 4f 76 65 72 50 61 79 6d 65 6e 74 20 3d 20  owOverPayment = 
3840: 66 61 6c 73 65 0a 0a 20 20 20 20 20 20 65 78 70  false..      exp
3850: 65 63 74 28 28 29 20 3d 3e 20 54 72 61 6e 73 70  ect(() => Transp
3860: 6f 72 74 2e 5f 76 61 6c 69 64 61 74 65 4f 72 52  ort._validateOrR
3870: 65 6a 65 63 74 54 72 61 6e 73 66 65 72 28 74 68  ejectTransfer(th
3880: 69 73 2e 70 61 72 61 6d 73 29 29 0a 20 20 20 20  is.params)).    
3890: 20 20 20 20 2e 74 6f 2e 74 68 72 6f 77 28 27 67      .to.throw('g
38a0: 6f 74 20 6e 6f 74 69 66 69 63 61 74 69 6f 6e 20  ot notification 
38b0: 6f 66 20 74 72 61 6e 73 66 65 72 20 77 68 65 72  of transfer wher
38c0: 65 20 61 6d 6f 75 6e 74 20 69 73 20 6d 6f 72 65  e amount is more
38d0: 20 74 68 61 6e 20 65 78 70 65 63 74 65 64 27 29   than expected')
38e0: 20 2f 2f 20 46 30 33 0a 20 20 20 20 7d 29 0a 0a   // F03.    })..
38f0: 20 20 20 20 69 74 28 27 73 68 6f 75 6c 64 20 6e      it('should n
3900: 6f 74 20 61 63 63 65 70 74 20 6c 61 74 65 20 74  ot accept late t
3910: 72 61 6e 73 66 65 72 27 2c 20 61 73 79 6e 63 20  ransfer', async 
3920: 66 75 6e 63 74 69 6f 6e 20 28 29 20 7b 0a 20 20  function () {.  
3930: 20 20 20 20 63 6f 6e 73 74 20 7b 20 70 61 63 6b      const { pack
3940: 65 74 20 7d 20 3d 20 54 72 61 6e 73 70 6f 72 74  et } = Transport
3950: 2e 63 72 65 61 74 65 50 61 63 6b 65 74 41 6e 64  .createPacketAnd
3960: 43 6f 6e 64 69 74 69 6f 6e 28 7b 0a 20 20 20 20  Condition({.    
3970: 20 20 20 20 64 65 73 74 69 6e 61 74 69 6f 6e 41      destinationA
3980: 6d 6f 75 6e 74 3a 20 27 31 27 2c 0a 20 20 20 20  mount: '1',.    
3990: 20 20 20 20 64 65 73 74 69 6e 61 74 69 6f 6e 41      destinationA
39a0: 63 63 6f 75 6e 74 3a 20 27 74 65 73 74 2e 65 78  ccount: 'test.ex
39b0: 61 6d 70 6c 65 2e 61 6c 69 63 65 2e 65 62 4b 57  ample.alice.ebKW
39c0: 63 41 45 42 39 5f 41 47 6d 65 57 49 58 33 44 31  cAEB9_AGmeWIX3D1
39d0: 46 4c 77 49 58 30 43 46 76 66 46 53 51 27 2c 0a  FLwIX0CFvfFSQ',.
39e0: 20 20 20 20 20 20 20 20 73 65 63 72 65 74 3a 20          secret: 
39f0: 42 75 66 66 65 72 2e 66 72 6f 6d 28 27 62 6f 34  Buffer.from('bo4
3a00: 47 68 76 56 4e 57 38 6e 61 63 53 7a 30 50 76 69  GhvVNW8nacSz0Pvi
3a10: 62 4b 41 27 2c 20 27 62 61 73 65 36 34 27 29 2c  bKA', 'base64'),
3a20: 0a 20 20 20 20 20 20 20 20 64 61 74 61 3a 20 42  .        data: B
3a30: 75 66 66 65 72 2e 66 72 6f 6d 28 27 74 65 73 74  uffer.from('test
3a40: 20 64 61 74 61 27 29 2c 0a 20 20 20 20 20 20 20   data'),.       
3a50: 20 69 64 3a 20 27 65 65 33 39 64 31 37 31 2d 63   id: 'ee39d171-c
3a60: 64 64 35 2d 34 32 36 38 2d 39 65 63 38 2d 61 63  dd5-4268-9ec8-ac
3a70: 63 33 34 39 36 36 36 30 35 35 27 2c 0a 20 20 20  c349666055',.   
3a80: 20 20 20 20 20 65 78 70 69 72 65 73 41 74 3a 20       expiresAt: 
3a90: 6d 6f 6d 65 6e 74 28 29 2e 61 64 64 28 2d 31 2c  moment().add(-1,
3aa0: 20 27 73 65 63 6f 6e 64 73 27 29 2e 74 6f 49 53   'seconds').toIS
3ab0: 4f 53 74 72 69 6e 67 28 29 0a 20 20 20 20 20 20  OString().      
3ac0: 7d 29 0a 0a 20 20 20 20 20 20 74 68 69 73 2e 70  })..      this.p
3ad0: 61 72 61 6d 73 2e 70 61 72 73 65 64 50 61 63 6b  arams.parsedPack
3ae0: 65 74 20 3d 20 49 6c 70 50 61 63 6b 65 74 2e 64  et = IlpPacket.d
3af0: 65 73 65 72 69 61 6c 69 7a 65 49 6c 70 50 61 79  eserializeIlpPay
3b00: 6d 65 6e 74 28 70 61 63 6b 65 74 29 0a 0a 20 20  ment(packet)..  
3b10: 20 20 20 20 65 78 70 65 63 74 28 28 29 20 3d 3e      expect(() =>
3b20: 20 54 72 61 6e 73 70 6f 72 74 2e 5f 76 61 6c 69   Transport._vali
3b30: 64 61 74 65 4f 72 52 65 6a 65 63 74 54 72 61 6e  dateOrRejectTran
3b40: 73 66 65 72 28 74 68 69 73 2e 70 61 72 61 6d 73  sfer(this.params
3b50: 29 29 0a 20 20 20 20 20 20 20 20 2e 74 6f 2e 74  )).        .to.t
3b60: 68 72 6f 77 28 27 67 6f 74 20 6e 6f 74 69 66 69  hrow('got notifi
3b70: 63 61 74 69 6f 6e 20 6f 66 20 74 72 61 6e 73 66  cation of transf
3b80: 65 72 20 77 69 74 68 20 65 78 70 69 72 65 64 20  er with expired 
3b90: 70 61 63 6b 65 74 27 29 20 2f 2f 20 52 30 30 0a  packet') // R00.
3ba0: 20 20 20 20 7d 29 0a 20 20 7d 29 0a 0a 20 20 64      }).  })..  d
3bb0: 65 73 63 72 69 62 65 28 27 68 61 6e 64 6c 65 44  escribe('handleD
3bc0: 61 74 61 27 2c 20 66 75 6e 63 74 69 6f 6e 20 28  ata', function (
3bd0: 29 20 7b 0a 20 20 20 20 62 65 66 6f 72 65 45 61  ) {.    beforeEa
3be0: 63 68 28 66 75 6e 63 74 69 6f 6e 20 28 29 20 7b  ch(function () {
3bf0: 0a 20 20 20 20 20 20 74 68 69 73 2e 63 6c 6f 63  .      this.cloc
3c00: 6b 20 3d 20 73 69 6e 6f 6e 2e 75 73 65 46 61 6b  k = sinon.useFak
3c10: 65 54 69 6d 65 72 73 28 53 54 41 52 54 5f 44 41  eTimers(START_DA
3c20: 54 45 29 0a 0a 20 20 20 20 20 20 63 6f 6e 73 74  TE)..      const
3c30: 20 65 78 70 69 72 65 73 41 74 20 3d 20 6d 6f 6d   expiresAt = mom
3c40: 65 6e 74 28 29 2e 61 64 64 28 31 2c 20 27 73 65  ent().add(1, 'se
3c50: 63 6f 6e 64 73 27 29 2e 74 6f 44 61 74 65 28 29  conds').toDate()
3c60: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 64 65 73  .      const des
3c70: 74 69 6e 61 74 69 6f 6e 20 3d 20 27 74 65 73 74  tination = 'test
3c80: 2e 65 78 61 6d 70 6c 65 2e 61 6c 69 63 65 2e 65  .example.alice.e
3c90: 62 4b 57 63 41 45 42 39 5f 41 47 6d 65 57 49 58  bKWcAEB9_AGmeWIX
3ca0: 33 44 31 46 4c 77 49 58 30 43 46 76 66 46 53 51  3D1FLwIX0CFvfFSQ
3cb0: 27 0a 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 7b  '..      const {
3cc0: 20 70 61 63 6b 65 74 2c 20 63 6f 6e 64 69 74 69   packet, conditi
3cd0: 6f 6e 20 7d 20 3d 20 54 72 61 6e 73 70 6f 72 74  on } = Transport
3ce0: 2e 63 72 65 61 74 65 50 61 63 6b 65 74 41 6e 64  .createPacketAnd
3cf0: 43 6f 6e 64 69 74 69 6f 6e 28 7b 0a 20 20 20 20  Condition({.    
3d00: 20 20 20 20 64 65 73 74 69 6e 61 74 69 6f 6e 41      destinationA
3d10: 6d 6f 75 6e 74 3a 20 27 31 27 2c 0a 20 20 20 20  mount: '1',.    
3d20: 20 20 20 20 64 65 73 74 69 6e 61 74 69 6f 6e 41      destinationA
3d30: 63 63 6f 75 6e 74 3a 20 64 65 73 74 69 6e 61 74  ccount: destinat
3d40: 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 73 65 63  ion,.        sec
3d50: 72 65 74 3a 20 42 75 66 66 65 72 2e 66 72 6f 6d  ret: Buffer.from
3d60: 28 27 62 6f 34 47 68 76 56 4e 57 38 6e 61 63 53  ('bo4GhvVNW8nacS
3d70: 7a 30 50 76 69 62 4b 41 27 2c 20 27 62 61 73 65  z0PvibKA', 'base
3d80: 36 34 27 29 2c 0a 20 20 20 20 20 20 20 20 64 61  64'),.        da
3d90: 74 61 3a 20 42 75 66 66 65 72 2e 66 72 6f 6d 28  ta: Buffer.from(
3da0: 27 74 65 73 74 20 64 61 74 61 27 29 2c 0a 20 20  'test data'),.  
3db0: 20 20 20 20 20 20 69 64 3a 20 27 65 65 33 39 64        id: 'ee39d
3dc0: 31 37 31 2d 63 64 64 35 2d 34 32 36 38 2d 39 65  171-cdd5-4268-9e
3dd0: 63 38 2d 61 63 63 33 34 39 36 36 36 30 35 35 27  c8-acc349666055'
3de0: 2c 0a 20 20 20 20 20 20 20 20 65 78 70 69 72 65  ,.        expire
3df0: 73 41 74 3a 20 65 78 70 69 72 65 73 41 74 2e 74  sAt: expiresAt.t
3e00: 6f 49 53 4f 53 74 72 69 6e 67 28 29 2c 0a 20 20  oISOString(),.  
3e10: 20 20 20 20 20 20 6e 6f 6e 63 65 3a 20 42 75 66        nonce: Buf
3e20: 66 65 72 2e 66 72 6f 6d 28 27 4b 56 77 79 58 73  fer.from('KVwyXs
3e30: 7a 4b 53 6c 33 50 43 5a 64 4f 55 47 6a 50 51 67  zKSl3PCZdOUGjPQg
3e40: 3d 3d 27 2c 20 27 62 61 73 65 36 34 27 29 0a 20  ==', 'base64'). 
3e50: 20 20 20 20 20 7d 29 0a 0a 20 20 20 20 20 20 74       })..      t
3e60: 68 69 73 2e 63 61 6c 6c 62 61 63 6b 20 3d 20 28  his.callback = (
3e70: 64 65 74 61 69 6c 73 29 20 3d 3e 20 7b 0a 20 20  details) => {.  
3e80: 20 20 20 20 20 20 72 65 74 75 72 6e 20 64 65 74        return det
3e90: 61 69 6c 73 2e 66 75 6c 66 69 6c 6c 28 29 0a 20  ails.fulfill(). 
3ea0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 74 68       }..      th
3eb0: 69 73 2e 70 61 72 61 6d 73 20 3d 20 7b 0a 20 20  is.params = {.  
3ec0: 20 20 20 20 20 20 70 6c 75 67 69 6e 3a 20 74 68        plugin: th
3ed0: 69 73 2e 70 6c 75 67 69 6e 2c 0a 20 20 20 20 20  is.plugin,.     
3ee0: 20 20 20 61 64 64 72 65 73 73 3a 20 27 74 65 73     address: 'tes
3ef0: 74 2e 65 78 61 6d 70 6c 65 2e 61 6c 69 63 65 27  t.example.alice'
3f00: 2c 0a 20 20 20 20 20 20 20 20 72 65 63 65 69 76  ,.        receiv
3f10: 65 72 53 65 63 72 65 74 3a 20 42 75 66 66 65 72  erSecret: Buffer
3f20: 2e 66 72 6f 6d 28 27 73 65 63 72 65 74 27 29 2c  .from('secret'),
3f30: 0a 20 20 20 20 20 20 20 20 63 61 6c 6c 62 61 63  .        callbac
3f40: 6b 3a 20 74 68 69 73 2e 63 61 6c 6c 62 61 63 6b  k: this.callback
3f50: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
3f60: 74 68 69 73 2e 74 72 61 6e 73 66 65 72 50 72 6f  this.transferPro
3f70: 70 73 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 61  ps = {.        a
3f80: 6d 6f 75 6e 74 3a 20 27 31 27 2c 0a 20 20 20 20  mount: '1',.    
3f90: 20 20 20 20 65 78 65 63 75 74 69 6f 6e 43 6f 6e      executionCon
3fa0: 64 69 74 69 6f 6e 3a 20 63 6f 6e 64 69 74 69 6f  dition: conditio
3fb0: 6e 2c 0a 20 20 20 20 20 20 20 20 65 78 70 69 72  n,.        expir
3fc0: 65 73 41 74 2c 0a 20 20 20 20 20 20 20 20 64 65  esAt,.        de
3fd0: 73 74 69 6e 61 74 69 6f 6e 2c 0a 20 20 20 20 20  stination,.     
3fe0: 20 20 20 64 61 74 61 3a 20 70 61 63 6b 65 74 0a     data: packet.
3ff0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 68        }.      th
4000: 69 73 2e 74 72 61 6e 73 66 65 72 20 3d 20 49 6c  is.transfer = Il
4010: 70 50 61 63 6b 65 74 2e 73 65 72 69 61 6c 69 7a  pPacket.serializ
4020: 65 49 6c 70 50 72 65 70 61 72 65 28 74 68 69 73  eIlpPrepare(this
4030: 2e 74 72 61 6e 73 66 65 72 50 72 6f 70 73 29 0a  .transferProps).
4040: 20 20 20 20 7d 29 0a 0a 20 20 20 20 69 74 28 27      })..    it('
4050: 73 68 6f 75 6c 64 20 66 75 6c 66 69 6c 6c 20 6f  should fulfill o
4060: 6e 20 61 20 76 61 6c 69 64 20 69 6e 63 6f 6d 69  n a valid incomi
4070: 6e 67 20 74 72 61 6e 73 66 65 72 27 2c 20 61 73  ng transfer', as
4080: 79 6e 63 20 66 75 6e 63 74 69 6f 6e 20 28 29 20  ync function () 
4090: 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 72 65  {.      const re
40a0: 73 75 6c 74 20 3d 20 61 77 61 69 74 20 54 72 61  sult = await Tra
40b0: 6e 73 70 6f 72 74 2e 68 61 6e 64 6c 65 44 61 74  nsport.handleDat
40c0: 61 28 74 68 69 73 2e 70 61 72 61 6d 73 2c 20 74  a(this.params, t
40d0: 68 69 73 2e 74 72 61 6e 73 66 65 72 29 0a 0a 20  his.transfer).. 
40e0: 20 20 20 20 20 61 73 73 65 72 74 2e 64 65 65 70       assert.deep
40f0: 45 71 75 61 6c 28 49 6c 70 50 61 63 6b 65 74 2e  Equal(IlpPacket.
4100: 64 65 73 65 72 69 61 6c 69 7a 65 49 6c 70 46 75  deserializeIlpFu
4110: 6c 66 69 6c 6c 28 72 65 73 75 6c 74 29 2c 20 7b  lfill(result), {
4120: 0a 20 20 20 20 20 20 20 20 66 75 6c 66 69 6c 6c  .        fulfill
4130: 6d 65 6e 74 3a 20 42 75 66 66 65 72 2e 66 72 6f  ment: Buffer.fro
4140: 6d 28 27 41 58 37 45 59 50 71 50 65 47 35 4a 49  m('AX7EYPqPeG5JI
4150: 33 72 76 36 62 2b 52 66 47 5a 33 44 31 59 31 70  3rv6b+RfGZ3D1Y1p
4160: 53 6a 6a 2f 51 4a 46 4a 35 35 36 44 70 67 3d 27  Sjj/QJFJ556Dpg='
4170: 2c 20 27 62 61 73 65 36 34 27 29 2c 0a 20 20 20  , 'base64'),.   
4180: 20 20 20 20 20 64 61 74 61 3a 20 42 75 66 66 65       data: Buffe
4190: 72 2e 61 6c 6c 6f 63 28 30 29 0a 20 20 20 20 20  r.alloc(0).     
41a0: 20 7d 29 0a 20 20 20 20 7d 29 0a 0a 20 20 20 20   }).    })..    
41b0: 69 74 28 27 73 68 6f 75 6c 64 20 66 75 6c 66 69  it('should fulfi
41c0: 6c 6c 20 6f 6e 20 61 6e 20 6f 76 65 72 70 61 69  ll on an overpai
41d0: 64 20 76 61 6c 69 64 20 69 6e 63 6f 6d 69 6e 67  d valid incoming
41e0: 20 74 72 61 6e 73 66 65 72 27 2c 20 61 73 79 6e   transfer', asyn
41f0: 63 20 66 75 6e 63 74 69 6f 6e 20 28 29 20 7b 0a  c function () {.
4200: 20 20 20 20 20 20 74 68 69 73 2e 74 72 61 6e 73        this.trans
4210: 66 65 72 50 72 6f 70 73 2e 61 6d 6f 75 6e 74 20  ferProps.amount 
4220: 3d 20 27 31 30 31 27 0a 20 20 20 20 20 20 74 68  = '101'.      th
4230: 69 73 2e 74 72 61 6e 73 66 65 72 20 3d 20 49 6c  is.transfer = Il
4240: 70 50 61 63 6b 65 74 2e 73 65 72 69 61 6c 69 7a  pPacket.serializ
4250: 65 49 6c 70 50 72 65 70 61 72 65 28 74 68 69 73  eIlpPrepare(this
4260: 2e 74 72 61 6e 73 66 65 72 50 72 6f 70 73 29 0a  .transferProps).
4270: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 72 65 73  .      const res
4280: 75 6c 74 20 3d 20 61 77 61 69 74 20 54 72 61 6e  ult = await Tran
4290: 73 70 6f 72 74 2e 68 61 6e 64 6c 65 44 61 74 61  sport.handleData
42a0: 28 74 68 69 73 2e 70 61 72 61 6d 73 2c 20 74 68  (this.params, th
42b0: 69 73 2e 74 72 61 6e 73 66 65 72 29 0a 0a 20 20  is.transfer)..  
42c0: 20 20 20 20 61 73 73 65 72 74 2e 64 65 65 70 45      assert.deepE
42d0: 71 75 61 6c 28 49 6c 70 50 61 63 6b 65 74 2e 64  qual(IlpPacket.d
42e0: 65 73 65 72 69 61 6c 69 7a 65 49 6c 70 46 75 6c  eserializeIlpFul
42f0: 66 69 6c 6c 28 72 65 73 75 6c 74 29 2c 20 7b 0a  fill(result), {.
4300: 20 20 20 20 20 20 20 20 66 75 6c 66 69 6c 6c 6d          fulfillm
4310: 65 6e 74 3a 20 42 75 66 66 65 72 2e 66 72 6f 6d  ent: Buffer.from
4320: 28 27 41 58 37 45 59 50 71 50 65 47 35 4a 49 33  ('AX7EYPqPeG5JI3
4330: 72 76 36 62 2b 52 66 47 5a 33 44 31 59 31 70 53  rv6b+RfGZ3D1Y1pS
4340: 6a 6a 2f 51 4a 46 4a 35 35 36 44 70 67 3d 27 2c  jj/QJFJ556Dpg=',
4350: 20 27 62 61 73 65 36 34 27 29 2c 0a 20 20 20 20   'base64'),.    
4360: 20 20 20 20 64 61 74 61 3a 20 42 75 66 66 65 72      data: Buffer
4370: 2e 61 6c 6c 6f 63 28 30 29 0a 20 20 20 20 20 20  .alloc(0).      
4380: 7d 29 0a 20 20 20 20 7d 29 0a 0a 20 20 20 20 69  }).    })..    i
4390: 74 28 27 73 68 6f 75 6c 64 20 72 65 6a 65 63 74  t('should reject
43a0: 20 77 68 65 6e 20 69 74 20 67 65 6e 65 72 61 74   when it generat
43b0: 65 73 20 74 68 65 20 77 72 6f 6e 67 20 66 75 6c  es the wrong ful
43c0: 66 69 6c 6c 6d 65 6e 74 27 2c 20 61 73 79 6e 63  fillment', async
43d0: 20 66 75 6e 63 74 69 6f 6e 20 28 29 20 7b 0a 20   function () {. 
43e0: 20 20 20 20 20 74 68 69 73 2e 74 72 61 6e 73 66       this.transf
43f0: 65 72 50 72 6f 70 73 2e 65 78 65 63 75 74 69 6f  erProps.executio
4400: 6e 43 6f 6e 64 69 74 69 6f 6e 20 3d 20 42 75 66  nCondition = Buf
4410: 66 65 72 2e 61 6c 6c 6f 63 28 33 32 29 0a 20 20  fer.alloc(32).  
4420: 20 20 20 20 74 68 69 73 2e 74 72 61 6e 73 66 65      this.transfe
4430: 72 20 3d 20 49 6c 70 50 61 63 6b 65 74 2e 73 65  r = IlpPacket.se
4440: 72 69 61 6c 69 7a 65 49 6c 70 50 72 65 70 61 72  rializeIlpPrepar
4450: 65 28 74 68 69 73 2e 74 72 61 6e 73 66 65 72 50  e(this.transferP
4460: 72 6f 70 73 29 0a 0a 20 20 20 20 20 20 63 6f 6e  rops)..      con
4470: 73 74 20 72 65 73 75 6c 74 20 3d 20 61 77 61 69  st result = awai
4480: 74 20 54 72 61 6e 73 70 6f 72 74 2e 68 61 6e 64  t Transport.hand
4490: 6c 65 44 61 74 61 28 74 68 69 73 2e 70 61 72 61  leData(this.para
44a0: 6d 73 2c 20 74 68 69 73 2e 74 72 61 6e 73 66 65  ms, this.transfe
44b0: 72 29 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  r)..      assert
44c0: 2e 64 65 65 70 45 71 75 61 6c 28 49 6c 70 50 61  .deepEqual(IlpPa
44d0: 63 6b 65 74 2e 64 65 73 65 72 69 61 6c 69 7a 65  cket.deserialize
44e0: 49 6c 70 52 65 6a 65 63 74 28 72 65 73 75 6c 74  IlpReject(result
44f0: 29 2c 20 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  ), {.        cod
4500: 65 3a 20 27 46 30 35 27 2c 0a 20 20 20 20 20 20  e: 'F05',.      
4510: 20 20 6d 65 73 73 61 67 65 3a 20 27 72 65 63 65    message: 'rece
4520: 69 76 65 72 20 67 65 6e 65 72 61 74 65 64 20 61  iver generated a
4530: 20 64 69 66 66 65 72 65 6e 74 20 63 6f 6e 64 69   different condi
4540: 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 74 72  tion from the tr
4550: 61 6e 73 66 65 72 27 2c 0a 20 20 20 20 20 20 20  ansfer',.       
4560: 20 74 72 69 67 67 65 72 65 64 42 79 3a 20 27 74   triggeredBy: 't
4570: 65 73 74 2e 65 78 61 6d 70 6c 65 2e 61 6c 69 63  est.example.alic
4580: 65 27 2c 0a 20 20 20 20 20 20 20 20 64 61 74 61  e',.        data
4590: 3a 20 42 75 66 66 65 72 2e 61 6c 6c 6f 63 28 30  : Buffer.alloc(0
45a0: 29 0a 20 20 20 20 20 20 7d 29 0a 20 20 20 20 7d  ).      }).    }
45b0: 29 0a 0a 20 20 20 20 69 74 28 27 73 68 6f 75 6c  )..    it('shoul
45c0: 64 20 72 65 6a 65 63 74 20 6f 6e 20 61 6e 20 6f  d reject on an o
45d0: 76 65 72 70 61 69 64 20 69 6e 63 6f 6d 69 6e 67  verpaid incoming
45e0: 20 74 72 61 6e 73 66 65 72 20 69 66 20 61 6c 6c   transfer if all
45f0: 6f 77 4f 76 65 72 50 61 79 6d 65 6e 74 20 69 73  owOverPayment is
4600: 20 6f 66 66 27 2c 20 61 73 79 6e 63 20 66 75 6e   off', async fun
4610: 63 74 69 6f 6e 20 28 29 20 7b 0a 20 20 20 20 20  ction () {.     
4620: 20 74 68 69 73 2e 70 61 72 61 6d 73 2e 61 6c 6c   this.params.all
4630: 6f 77 4f 76 65 72 50 61 79 6d 65 6e 74 20 3d 20  owOverPayment = 
4640: 66 61 6c 73 65 0a 20 20 20 20 20 20 74 68 69 73  false.      this
4650: 2e 74 72 61 6e 73 66 65 72 50 72 6f 70 73 2e 61  .transferProps.a
4660: 6d 6f 75 6e 74 20 3d 20 27 31 30 31 27 0a 20 20  mount = '101'.  
4670: 20 20 20 20 74 68 69 73 2e 74 72 61 6e 73 66 65      this.transfe
4680: 72 20 3d 20 49 6c 70 50 61 63 6b 65 74 2e 73 65  r = IlpPacket.se
4690: 72 69 61 6c 69 7a 65 49 6c 70 50 72 65 70 61 72  rializeIlpPrepar
46a0: 65 28 74 68 69 73 2e 74 72 61 6e 73 66 65 72 50  e(this.transferP
46b0: 72 6f 70 73 29 0a 0a 20 20 20 20 20 20 63 6f 6e  rops)..      con
46c0: 73 74 20 72 65 73 75 6c 74 20 3d 20 61 77 61 69  st result = awai
46d0: 74 20 54 72 61 6e 73 70 6f 72 74 2e 68 61 6e 64  t Transport.hand
46e0: 6c 65 44 61 74 61 28 74 68 69 73 2e 70 61 72 61  leData(this.para
46f0: 6d 73 2c 20 74 68 69 73 2e 74 72 61 6e 73 66 65  ms, this.transfe
4700: 72 29 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  r)..      assert
4710: 2e 64 65 65 70 45 71 75 61 6c 28 49 6c 70 50 61  .deepEqual(IlpPa
4720: 63 6b 65 74 2e 64 65 73 65 72 69 61 6c 69 7a 65  cket.deserialize
4730: 49 6c 70 52 65 6a 65 63 74 28 72 65 73 75 6c 74  IlpReject(result
4740: 29 2c 20 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  ), {.        cod
4750: 65 3a 20 27 46 30 33 27 2c 0a 20 20 20 20 20 20  e: 'F03',.      
4760: 20 20 6d 65 73 73 61 67 65 3a 20 27 67 6f 74 20    message: 'got 
4770: 6e 6f 74 69 66 69 63 61 74 69 6f 6e 20 6f 66 20  notification of 
4780: 74 72 61 6e 73 66 65 72 20 77 68 65 72 65 20 61  transfer where a
4790: 6d 6f 75 6e 74 20 69 73 20 6d 6f 72 65 20 74 68  mount is more th
47a0: 61 6e 20 65 78 70 65 63 74 65 64 27 2c 0a 20 20  an expected',.  
47b0: 20 20 20 20 20 20 74 72 69 67 67 65 72 65 64 42        triggeredB
47c0: 79 3a 20 27 74 65 73 74 2e 65 78 61 6d 70 6c 65  y: 'test.example
47d0: 2e 61 6c 69 63 65 27 2c 0a 20 20 20 20 20 20 20  .alice',.       
47e0: 20 64 61 74 61 3a 20 42 75 66 66 65 72 2e 61 6c   data: Buffer.al
47f0: 6c 6f 63 28 30 29 0a 20 20 20 20 20 20 7d 29 0a  loc(0).      }).
4800: 20 20 20 20 7d 29 0a 0a 20 20 20 20 69 74 28 27      })..    it('
4810: 73 68 6f 75 6c 64 20 72 65 6a 65 63 74 20 77 68  should reject wh
4820: 65 6e 20 70 61 63 6b 65 74 20 64 65 74 61 69 6c  en packet detail
4830: 73 20 68 61 76 65 20 62 65 65 6e 20 63 68 61 6e  s have been chan
4840: 67 65 64 27 2c 20 61 73 79 6e 63 20 66 75 6e 63  ged', async func
4850: 74 69 6f 6e 20 28 29 20 7b 0a 20 20 20 20 20 20  tion () {.      
4860: 74 68 69 73 2e 74 72 61 6e 73 66 65 72 50 72 6f  this.transferPro
4870: 70 73 2e 64 61 74 61 20 3d 20 42 75 66 66 65 72  ps.data = Buffer
4880: 2e 63 6f 6e 63 61 74 28 5b 74 68 69 73 2e 74 72  .concat([this.tr
4890: 61 6e 73 66 65 72 50 72 6f 70 73 2e 64 61 74 61  ansferProps.data
48a0: 2c 20 42 75 66 66 65 72 2e 66 72 6f 6d 28 27 67  , Buffer.from('g
48b0: 61 72 62 61 67 65 27 29 5d 29 0a 20 20 20 20 20  arbage')]).     
48c0: 20 74 68 69 73 2e 74 72 61 6e 73 66 65 72 20 3d   this.transfer =
48d0: 20 49 6c 70 50 61 63 6b 65 74 2e 73 65 72 69 61   IlpPacket.seria
48e0: 6c 69 7a 65 49 6c 70 50 72 65 70 61 72 65 28 74  lizeIlpPrepare(t
48f0: 68 69 73 2e 74 72 61 6e 73 66 65 72 50 72 6f 70  his.transferProp
4900: 73 29 0a 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  s)..      const 
4910: 72 65 73 75 6c 74 20 3d 20 61 77 61 69 74 20 54  result = await T
4920: 72 61 6e 73 70 6f 72 74 2e 68 61 6e 64 6c 65 44  ransport.handleD
4930: 61 74 61 28 74 68 69 73 2e 70 61 72 61 6d 73 2c  ata(this.params,
4940: 20 74 68 69 73 2e 74 72 61 6e 73 66 65 72 29 0a   this.transfer).
4950: 0a 20 20 20 20 20 20 61 73 73 65 72 74 2e 64 65  .      assert.de
4960: 65 70 45 71 75 61 6c 28 49 6c 70 50 61 63 6b 65  epEqual(IlpPacke
4970: 74 2e 64 65 73 65 72 69 61 6c 69 7a 65 49 6c 70  t.deserializeIlp
4980: 52 65 6a 65 63 74 28 72 65 73 75 6c 74 29 2c 20  Reject(result), 
4990: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 3a 20  {.        code: 
49a0: 27 46 30 35 27 2c 0a 20 20 20 20 20 20 20 20 6d  'F05',.        m
49b0: 65 73 73 61 67 65 3a 20 27 72 65 63 65 69 76 65  essage: 'receive
49c0: 72 20 67 65 6e 65 72 61 74 65 64 20 61 20 64 69  r generated a di
49d0: 66 66 65 72 65 6e 74 20 63 6f 6e 64 69 74 69 6f  fferent conditio
49e0: 6e 20 66 72 6f 6d 20 74 68 65 20 74 72 61 6e 73  n from the trans
49f0: 66 65 72 27 2c 0a 20 20 20 20 20 20 20 20 74 72  fer',.        tr
4a00: 69 67 67 65 72 65 64 42 79 3a 20 27 74 65 73 74  iggeredBy: 'test
4a10: 2e 65 78 61 6d 70 6c 65 2e 61 6c 69 63 65 27 2c  .example.alice',
4a20: 0a 20 20 20 20 20 20 20 20 64 61 74 61 3a 20 42  .        data: B
4a30: 75 66 66 65 72 2e 61 6c 6c 6f 63 28 30 29 0a 20  uffer.alloc(0). 
4a40: 20 20 20 20 20 7d 29 0a 20 20 20 20 7d 29 0a 0a       }).    })..
4a50: 20 20 20 20 69 74 28 27 73 68 6f 75 6c 64 20 70      it('should p
4a60: 61 73 73 20 74 68 65 20 66 75 6c 66 69 6c 6c 20  ass the fulfill 
4a70: 66 75 6e 63 74 69 6f 6e 2c 20 74 72 61 6e 73 66  function, transf
4a80: 65 72 2c 20 64 65 63 72 79 70 74 65 64 20 64 61  er, decrypted da
4a90: 74 61 2c 20 64 65 73 74 69 6e 61 74 69 6f 6e 41  ta, destinationA
4aa0: 6d 6f 75 6e 74 2c 20 61 6e 64 20 64 65 73 74 69  mount, and desti
4ab0: 6e 61 74 69 6f 6e 41 63 63 6f 75 6e 74 20 74 6f  nationAccount to
4ac0: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 27 2c 20   the callback', 
4ad0: 61 73 79 6e 63 20 66 75 6e 63 74 69 6f 6e 20 28  async function (
4ae0: 29 20 7b 0a 20 20 20 20 20 20 74 68 69 73 2e 70  ) {.      this.p
4af0: 61 72 61 6d 73 2e 63 61 6c 6c 62 61 63 6b 20 3d  arams.callback =
4b00: 20 73 69 6e 6f 6e 2e 73 70 79 28 28 64 65 74 61   sinon.spy((deta
4b10: 69 6c 73 29 20 3d 3e 20 7b 0a 20 20 20 20 20 20  ils) => {.      
4b20: 20 20 61 73 73 65 72 74 2e 69 73 4f 62 6a 65 63    assert.isObjec
4b30: 74 28 64 65 74 61 69 6c 73 2e 74 72 61 6e 73 66  t(details.transf
4b40: 65 72 2c 20 27 6d 75 73 74 20 70 61 73 73 20 69  er, 'must pass i
4b50: 6e 20 74 72 61 6e 73 66 65 72 27 29 0a 20 20 20  n transfer').   
4b60: 20 20 20 20 20 61 73 73 65 72 74 2e 69 73 4f 62       assert.isOb
4b70: 6a 65 63 74 28 64 65 74 61 69 6c 73 2e 68 65 61  ject(details.hea
4b80: 64 65 72 73 2c 20 27 6d 75 73 74 20 70 61 73 73  ders, 'must pass
4b90: 20 69 6e 20 68 65 61 64 65 72 73 27 29 0a 20 20   in headers').  
4ba0: 20 20 20 20 20 20 61 73 73 65 72 74 2e 69 73 53        assert.isS
4bb0: 74 72 69 6e 67 28 64 65 74 61 69 6c 73 2e 68 65  tring(details.he
4bc0: 61 64 65 72 73 5b 27 65 78 70 69 72 65 73 2d 61  aders['expires-a
4bd0: 74 27 5d 2c 20 27 6d 75 73 74 20 70 61 73 73 20  t'], 'must pass 
4be0: 69 6e 20 45 78 70 69 72 65 73 2d 41 74 20 68 65  in Expires-At he
4bf0: 61 64 65 72 27 29 0a 20 20 20 20 20 20 20 20 61  ader').        a
4c00: 73 73 65 72 74 2e 69 73 4f 62 6a 65 63 74 28 64  ssert.isObject(d
4c10: 65 74 61 69 6c 73 2e 70 75 62 6c 69 63 48 65 61  etails.publicHea
4c20: 64 65 72 73 2c 20 27 6d 75 73 74 20 70 61 73 73  ders, 'must pass
4c30: 20 69 6e 20 70 75 62 6c 69 63 48 65 61 64 65 72   in publicHeader
4c40: 73 27 29 0a 20 20 20 20 20 20 20 20 61 73 73 65  s').        asse
4c50: 72 74 2e 65 71 75 61 6c 28 64 65 74 61 69 6c 73  rt.equal(details
4c60: 2e 64 61 74 61 2e 74 6f 53 74 72 69 6e 67 28 27  .data.toString('
4c70: 75 74 66 38 27 29 2c 20 27 74 65 73 74 20 64 61  utf8'), 'test da
4c80: 74 61 27 2c 20 27 6d 75 73 74 20 70 61 73 73 20  ta', 'must pass 
4c90: 69 6e 20 64 65 63 72 79 70 74 65 64 20 64 61 74  in decrypted dat
4ca0: 61 27 29 0a 20 20 20 20 20 20 20 20 61 73 73 65  a').        asse
4cb0: 72 74 2e 69 73 53 74 72 69 6e 67 28 64 65 74 61  rt.isString(deta
4cc0: 69 6c 73 2e 64 65 73 74 69 6e 61 74 69 6f 6e 41  ils.destinationA
4cd0: 63 63 6f 75 6e 74 2c 20 27 6d 75 73 74 20 70 61  ccount, 'must pa
4ce0: 73 73 20 69 6e 20 61 63 63 6f 75 6e 74 27 29 0a  ss in account').
4cf0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 2e 69          assert.i
4d00: 73 53 74 72 69 6e 67 28 64 65 74 61 69 6c 73 2e  sString(details.
4d10: 64 65 73 74 69 6e 61 74 69 6f 6e 41 6d 6f 75 6e  destinationAmoun
4d20: 74 2c 20 27 6d 75 73 74 20 70 61 73 73 20 69 6e  t, 'must pass in
4d30: 20 61 6d 6f 75 6e 74 27 29 0a 20 20 20 20 20 20   amount').      
4d40: 20 20 61 73 73 65 72 74 28 42 75 66 66 65 72 2e    assert(Buffer.
4d50: 69 73 42 75 66 66 65 72 28 64 65 74 61 69 6c 73  isBuffer(details
4d60: 2e 66 75 6c 66 69 6c 6c 6d 65 6e 74 29 2c 20 27  .fulfillment), '
4d70: 6d 75 73 74 20 70 61 73 73 20 69 6e 20 66 75 6c  must pass in ful
4d80: 66 69 6c 6c 6d 65 6e 74 27 29 0a 20 20 20 20 20  fillment').     
4d90: 20 20 20 61 73 73 65 72 74 2e 65 71 75 61 6c 28     assert.equal(
4da0: 64 65 74 61 69 6c 73 2e 66 75 6c 66 69 6c 6c 6d  details.fulfillm
4db0: 65 6e 74 2e 74 6f 53 74 72 69 6e 67 28 27 62 61  ent.toString('ba
4dc0: 73 65 36 34 27 29 2c 20 27 41 58 37 45 59 50 71  se64'), 'AX7EYPq
4dd0: 50 65 47 35 4a 49 33 72 76 36 62 2b 52 66 47 5a  PeG5JI3rv6b+RfGZ
4de0: 33 44 31 59 31 70 53 6a 6a 2f 51 4a 46 4a 35 35  3D1Y1pSjj/QJFJ55
4df0: 36 44 70 67 3d 27 29 0a 20 20 20 20 20 20 20 20  6Dpg=').        
4e00: 61 73 73 65 72 74 2e 69 73 46 75 6e 63 74 69 6f  assert.isFunctio
4e10: 6e 28 64 65 74 61 69 6c 73 2e 66 75 6c 66 69 6c  n(details.fulfil
4e20: 6c 2c 20 27 66 75 6c 66 69 6c 6c 20 63 61 6c 6c  l, 'fulfill call
4e30: 62 61 63 6b 20 6d 75 73 74 20 62 65 20 61 20 66  back must be a f
4e40: 75 6e 63 74 69 6f 6e 27 29 0a 20 20 20 20 20 20  unction').      
4e50: 20 20 72 65 74 75 72 6e 20 64 65 74 61 69 6c 73    return details
4e60: 2e 66 75 6c 66 69 6c 6c 28 29 0a 20 20 20 20 20  .fulfill().     
4e70: 20 7d 29 0a 0a 20 20 20 20 20 20 63 6f 6e 73 74   })..      const
4e80: 20 72 65 73 75 6c 74 20 3d 20 61 77 61 69 74 20   result = await 
4e90: 54 72 61 6e 73 70 6f 72 74 2e 68 61 6e 64 6c 65  Transport.handle
4ea0: 44 61 74 61 28 74 68 69 73 2e 70 61 72 61 6d 73  Data(this.params
4eb0: 2c 20 74 68 69 73 2e 74 72 61 6e 73 66 65 72 29  , this.transfer)
4ec0: 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 2e 64  ..      assert.d
4ed0: 65 65 70 45 71 75 61 6c 28 49 6c 70 50 61 63 6b  eepEqual(IlpPack
4ee0: 65 74 2e 64 65 73 65 72 69 61 6c 69 7a 65 49 6c  et.deserializeIl
4ef0: 70 46 75 6c 66 69 6c 6c 28 72 65 73 75 6c 74 29  pFulfill(result)
4f00: 2c 20 7b 0a 20 20 20 20 20 20 20 20 66 75 6c 66  , {.        fulf
4f10: 69 6c 6c 6d 65 6e 74 3a 20 42 75 66 66 65 72 2e  illment: Buffer.
4f20: 66 72 6f 6d 28 27 41 58 37 45 59 50 71 50 65 47  from('AX7EYPqPeG
4f30: 35 4a 49 33 72 76 36 62 2b 52 66 47 5a 33 44 31  5JI3rv6b+RfGZ3D1
4f40: 59 31 70 53 6a 6a 2f 51 4a 46 4a 35 35 36 44 70  Y1pSjj/QJFJ556Dp
4f50: 67 3d 27 2c 20 27 62 61 73 65 36 34 27 29 2c 0a  g=', 'base64'),.
4f60: 20 20 20 20 20 20 20 20 64 61 74 61 3a 20 42 75          data: Bu
4f70: 66 66 65 72 2e 61 6c 6c 6f 63 28 30 29 0a 20 20  ffer.alloc(0).  
4f80: 20 20 20 20 7d 29 0a 20 20 20 20 20 20 61 73 73      }).      ass
4f90: 65 72 74 28 74 68 69 73 2e 70 61 72 61 6d 73 2e  ert(this.params.
4fa0: 63 61 6c 6c 62 61 63 6b 2e 63 61 6c 6c 65 64 4f  callback.calledO
4fb0: 6e 63 65 29 0a 20 20 20 20 7d 29 0a 0a 20 20 20  nce).    })..   
4fc0: 20 69 74 28 27 73 68 6f 75 6c 64 20 72 65 6a 65   it('should reje
4fd0: 63 74 20 69 66 20 74 68 65 20 6c 69 73 74 65 6e  ct if the listen
4fe0: 20 63 61 6c 6c 62 61 63 6b 20 74 68 72 6f 77 73   callback throws
4ff0: 27 2c 20 61 73 79 6e 63 20 66 75 6e 63 74 69 6f  ', async functio
5000: 6e 20 28 29 20 7b 0a 20 20 20 20 20 20 74 68 69  n () {.      thi
5010: 73 2e 70 61 72 61 6d 73 2e 63 61 6c 6c 62 61 63  s.params.callbac
5020: 6b 20 3d 20 28 64 65 74 61 69 6c 73 29 20 3d 3e  k = (details) =>
5030: 20 7b 0a 20 20 20 20 20 20 20 20 74 68 72 6f 77   {.        throw
5040: 20 6e 65 77 20 45 72 72 6f 72 28 27 49 20 64 6f   new Error('I do
5050: 6e 5c 27 74 20 77 61 6e 74 20 74 68 61 74 20 74  n\'t want that t
5060: 72 61 6e 73 66 65 72 27 29 0a 20 20 20 20 20 20  ransfer').      
5070: 7d 0a 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 72  }..      const r
5080: 65 73 75 6c 74 20 3d 20 61 77 61 69 74 20 54 72  esult = await Tr
5090: 61 6e 73 70 6f 72 74 2e 68 61 6e 64 6c 65 44 61  ansport.handleDa
50a0: 74 61 28 74 68 69 73 2e 70 61 72 61 6d 73 2c 20  ta(this.params, 
50b0: 74 68 69 73 2e 74 72 61 6e 73 66 65 72 29 0a 0a  this.transfer)..
50c0: 20 20 20 20 20 20 61 73 73 65 72 74 2e 64 65 65        assert.dee
50d0: 70 45 71 75 61 6c 28 49 6c 70 50 61 63 6b 65 74  pEqual(IlpPacket
50e0: 2e 64 65 73 65 72 69 61 6c 69 7a 65 49 6c 70 52  .deserializeIlpR
50f0: 65 6a 65 63 74 28 72 65 73 75 6c 74 29 2c 20 7b  eject(result), {
5100: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 3a 20 27  .        code: '
5110: 46 39 39 27 2c 0a 20 20 20 20 20 20 20 20 6d 65  F99',.        me
5120: 73 73 61 67 65 3a 20 27 72 65 6a 65 63 74 65 64  ssage: 'rejected
5130: 2d 62 79 2d 72 65 63 65 69 76 65 72 3a 20 49 20  -by-receiver: I 
5140: 64 6f 6e 5c 27 74 20 77 61 6e 74 20 74 68 61 74  don\'t want that
5150: 20 74 72 61 6e 73 66 65 72 27 2c 0a 20 20 20 20   transfer',.    
5160: 20 20 20 20 74 72 69 67 67 65 72 65 64 42 79 3a      triggeredBy:
5170: 20 27 74 65 73 74 2e 65 78 61 6d 70 6c 65 2e 61   'test.example.a
5180: 6c 69 63 65 27 2c 0a 20 20 20 20 20 20 20 20 64  lice',.        d
5190: 61 74 61 3a 20 42 75 66 66 65 72 2e 61 6c 6c 6f  ata: Buffer.allo
51a0: 63 28 30 29 0a 20 20 20 20 20 20 7d 29 0a 20 20  c(0).      }).  
51b0: 20 20 7d 29 0a 0a 20 20 20 20 69 74 28 27 73 68    })..    it('sh
51c0: 6f 75 6c 64 20 72 65 6a 65 63 74 20 69 66 20 74  ould reject if t
51d0: 68 65 20 6c 69 73 74 65 6e 20 63 61 6c 6c 62 61  he listen callba
51e0: 63 6b 20 72 65 6a 65 63 74 73 27 2c 20 61 73 79  ck rejects', asy
51f0: 6e 63 20 66 75 6e 63 74 69 6f 6e 20 28 29 20 7b  nc function () {
5200: 0a 20 20 20 20 20 20 74 68 69 73 2e 70 61 72 61  .      this.para
5210: 6d 73 2e 63 61 6c 6c 62 61 63 6b 20 3d 20 28 64  ms.callback = (d
5220: 65 74 61 69 6c 73 29 20 3d 3e 20 7b 0a 20 20 20  etails) => {.   
5230: 20 20 20 20 20 72 65 74 75 72 6e 20 50 72 6f 6d       return Prom
5240: 69 73 65 2e 72 65 6a 65 63 74 28 6e 65 77 20 45  ise.reject(new E
5250: 72 72 6f 72 28 27 49 20 64 6f 6e 5c 27 74 20 77  rror('I don\'t w
5260: 61 6e 74 20 74 68 61 74 20 74 72 61 6e 73 66 65  ant that transfe
5270: 72 27 29 29 0a 20 20 20 20 20 20 7d 0a 0a 20 20  r')).      }..  
5280: 20 20 20 20 63 6f 6e 73 74 20 72 65 73 75 6c 74      const result
5290: 20 3d 20 61 77 61 69 74 20 54 72 61 6e 73 70 6f   = await Transpo
52a0: 72 74 2e 68 61 6e 64 6c 65 44 61 74 61 28 74 68  rt.handleData(th
52b0: 69 73 2e 70 61 72 61 6d 73 2c 20 74 68 69 73 2e  is.params, this.
52c0: 74 72 61 6e 73 66 65 72 29 0a 0a 20 20 20 20 20  transfer)..     
52d0: 20 61 73 73 65 72 74 2e 64 65 65 70 45 71 75 61   assert.deepEqua
52e0: 6c 28 49 6c 70 50 61 63 6b 65 74 2e 64 65 73 65  l(IlpPacket.dese
52f0: 72 69 61 6c 69 7a 65 49 6c 70 52 65 6a 65 63 74  rializeIlpReject
5300: 28 72 65 73 75 6c 74 29 2c 20 7b 0a 20 20 20 20  (result), {.    
5310: 20 20 20 20 63 6f 64 65 3a 20 27 46 39 39 27 2c      code: 'F99',
5320: 0a 20 20 20 20 20 20 20 20 6d 65 73 73 61 67 65  .        message
5330: 3a 20 27 72 65 6a 65 63 74 65 64 2d 62 79 2d 72  : 'rejected-by-r
5340: 65 63 65 69 76 65 72 3a 20 49 20 64 6f 6e 5c 27  eceiver: I don\'
5350: 74 20 77 61 6e 74 20 74 68 61 74 20 74 72 61 6e  t want that tran
5360: 73 66 65 72 27 2c 0a 20 20 20 20 20 20 20 20 74  sfer',.        t
5370: 72 69 67 67 65 72 65 64 42 79 3a 20 27 74 65 73  riggeredBy: 'tes
5380: 74 2e 65 78 61 6d 70 6c 65 2e 61 6c 69 63 65 27  t.example.alice'
5390: 2c 0a 20 20 20 20 20 20 20 20 64 61 74 61 3a 20  ,.        data: 
53a0: 42 75 66 66 65 72 2e 61 6c 6c 6f 63 28 30 29 0a  Buffer.alloc(0).
53b0: 20 20 20 20 20 20 7d 29 0a 20 20 20 20 7d 29 0a        }).    }).
53c0: 0a 20 20 20 20 69 74 28 27 73 68 6f 75 6c 64 20  .    it('should 
53d0: 72 65 6a 65 63 74 20 69 66 20 74 68 65 20 6c 69  reject if the li
53e0: 73 74 65 6e 20 63 61 6c 6c 62 61 63 6b 20 72 65  sten callback re
53f0: 74 75 72 6e 73 20 61 6e 20 69 6e 76 61 6c 69 64  turns an invalid
5400: 20 66 75 6c 66 69 6c 6c 6d 65 6e 74 27 2c 20 61   fulfillment', a
5410: 73 79 6e 63 20 66 75 6e 63 74 69 6f 6e 20 28 29  sync function ()
5420: 20 7b 0a 20 20 20 20 20 20 74 68 69 73 2e 70 61   {.      this.pa
5430: 72 61 6d 73 2e 63 61 6c 6c 62 61 63 6b 20 3d 20  rams.callback = 
5440: 28 64 65 74 61 69 6c 73 29 20 3d 3e 20 7b 0a 20  (details) => {. 
5450: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 50 72         return Pr
5460: 6f 6d 69 73 65 2e 72 65 73 6f 6c 76 65 28 42 75  omise.resolve(Bu
5470: 66 66 65 72 2e 61 6c 6c 6f 63 28 33 32 29 29 0a  ffer.alloc(32)).
5480: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63        }..      c
5490: 6f 6e 73 74 20 72 65 73 75 6c 74 20 3d 20 61 77  onst result = aw
54a0: 61 69 74 20 54 72 61 6e 73 70 6f 72 74 2e 68 61  ait Transport.ha
54b0: 6e 64 6c 65 44 61 74 61 28 74 68 69 73 2e 70 61  ndleData(this.pa
54c0: 72 61 6d 73 2c 20 74 68 69 73 2e 74 72 61 6e 73  rams, this.trans
54d0: 66 65 72 29 0a 0a 20 20 20 20 20 20 61 73 73 65  fer)..      asse
54e0: 72 74 2e 64 65 65 70 45 71 75 61 6c 28 49 6c 70  rt.deepEqual(Ilp
54f0: 50 61 63 6b 65 74 2e 64 65 73 65 72 69 61 6c 69  Packet.deseriali
5500: 7a 65 49 6c 70 52 65 6a 65 63 74 28 72 65 73 75  zeIlpReject(resu
5510: 6c 74 29 2c 20 7b 0a 20 20 20 20 20 20 20 20 63  lt), {.        c
5520: 6f 64 65 3a 20 27 46 39 39 27 2c 0a 20 20 20 20  ode: 'F99',.    
5530: 20 20 20 20 6d 65 73 73 61 67 65 3a 20 27 72 65      message: 're
5540: 6a 65 63 74 65 64 2d 62 79 2d 72 65 63 65 69 76  jected-by-receiv
5550: 65 72 3a 20 72 65 63 65 69 76 65 72 20 63 61 6c  er: receiver cal
5560: 6c 62 61 63 6b 20 72 65 74 75 72 6e 65 64 20 69  lback returned i
5570: 6e 76 61 6c 69 64 20 66 75 6c 66 69 6c 6c 6d 65  nvalid fulfillme
5580: 6e 74 27 2c 0a 20 20 20 20 20 20 20 20 74 72 69  nt',.        tri
5590: 67 67 65 72 65 64 42 79 3a 20 27 74 65 73 74 2e  ggeredBy: 'test.
55a0: 65 78 61 6d 70 6c 65 2e 61 6c 69 63 65 27 2c 0a  example.alice',.
55b0: 20 20 20 20 20 20 20 20 64 61 74 61 3a 20 42 75          data: Bu
55c0: 66 66 65 72 2e 61 6c 6c 6f 63 28 30 29 0a 20 20  ffer.alloc(0).  
55d0: 20 20 20 20 7d 29 0a 20 20 20 20 7d 29 0a 0a 20      }).    }).. 
55e0: 20 20 20 69 74 28 27 73 68 6f 75 6c 64 20 68 61     it('should ha
55f0: 6e 64 6c 65 20 69 6c 71 70 20 6c 69 71 75 69 64  ndle ilqp liquid
5600: 69 74 79 20 63 75 72 76 65 20 72 65 71 75 65 73  ity curve reques
5610: 74 27 2c 20 61 73 79 6e 63 20 66 75 6e 63 74 69  t', async functi
5620: 6f 6e 20 28 29 20 7b 0a 20 20 20 20 20 20 63 6f  on () {.      co
5630: 6e 73 74 20 69 6c 71 70 50 61 63 6b 65 74 20 3d  nst ilqpPacket =
5640: 20 49 6c 70 50 61 63 6b 65 74 2e 73 65 72 69 61   IlpPacket.seria
5650: 6c 69 7a 65 49 6c 71 70 4c 69 71 75 69 64 69 74  lizeIlqpLiquidit
5660: 79 52 65 71 75 65 73 74 28 7b 0a 20 20 20 20 20  yRequest({.     
5670: 20 20 20 64 65 73 74 69 6e 61 74 69 6f 6e 41 63     destinationAc
5680: 63 6f 75 6e 74 3a 20 27 74 65 73 74 2e 65 78 61  count: 'test.exa
5690: 6d 70 6c 65 2e 61 6c 69 63 65 27 2c 0a 20 20 20  mple.alice',.   
56a0: 20 20 20 20 20 64 65 73 74 69 6e 61 74 69 6f 6e       destination
56b0: 48 6f 6c 64 44 75 72 61 74 69 6f 6e 3a 20 31 30  HoldDuration: 10
56c0: 30 30 0a 20 20 20 20 20 20 7d 29 0a 20 20 20 20  00.      }).    
56d0: 20 20 63 6f 6e 73 74 20 72 65 73 75 6c 74 20 3d    const result =
56e0: 20 61 77 61 69 74 20 54 72 61 6e 73 70 6f 72 74   await Transport
56f0: 2e 68 61 6e 64 6c 65 44 61 74 61 28 74 68 69 73  .handleData(this
5700: 2e 70 61 72 61 6d 73 2c 20 69 6c 71 70 50 61 63  .params, ilqpPac
5710: 6b 65 74 29 0a 0a 20 20 20 20 20 20 61 73 73 65  ket)..      asse
5720: 72 74 2e 64 65 65 70 45 71 75 61 6c 28 49 6c 70  rt.deepEqual(Ilp
5730: 50 61 63 6b 65 74 2e 64 65 73 65 72 69 61 6c 69  Packet.deseriali
5740: 7a 65 49 6c 71 70 4c 69 71 75 69 64 69 74 79 52  zeIlqpLiquidityR
5750: 65 73 70 6f 6e 73 65 28 72 65 73 75 6c 74 29 2c  esponse(result),
5760: 20 7b 0a 20 20 20 20 20 20 20 20 61 70 70 6c 69   {.        appli
5770: 65 73 54 6f 50 72 65 66 69 78 3a 20 27 74 65 73  esToPrefix: 'tes
5780: 74 2e 65 78 61 6d 70 6c 65 2e 61 6c 69 63 65 27  t.example.alice'
5790: 2c 0a 20 20 20 20 20 20 20 20 6c 69 71 75 69 64  ,.        liquid
57a0: 69 74 79 43 75 72 76 65 3a 20 42 75 66 66 65 72  ityCurve: Buffer
57b0: 2e 66 72 6f 6d 28 27 41 41 41 41 41 41 41 41 41  .from('AAAAAAAAA
57c0: 41 41 41 41 41 41 41 41 41 41 41 41 50 2f 2f 2f  AAAAAAAAAAAAP///
57d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
57e0: 2f 38 3d 27 2c 20 27 62 61 73 65 36 34 27 29 2c  /8=', 'base64'),
57f0: 0a 20 20 20 20 20 20 20 20 65 78 70 69 72 65 73  .        expires
5800: 41 74 3a 20 6e 65 77 20 44 61 74 65 28 27 32 30  At: new Date('20
5810: 31 36 2d 30 36 2d 31 35 54 30 30 3a 30 30 3a 30  16-06-15T00:00:0
5820: 30 2e 30 30 30 5a 27 29 2c 0a 20 20 20 20 20 20  0.000Z'),.      
5830: 20 20 73 6f 75 72 63 65 48 6f 6c 64 44 75 72 61    sourceHoldDura
5840: 74 69 6f 6e 3a 20 31 30 30 30 0a 20 20 20 20 20  tion: 1000.     
5850: 20 7d 29 0a 20 20 20 20 7d 29 0a 20 20 7d 29 0a   }).    }).  }).
5860: 7d 29 0a                                         }).