modified lib-jitsi-meet dev repo
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

Context.spec.js 4.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. import { Context } from './Context';
  2. import { ratchet, importKey } from './crypto-utils';
  3. /*
  4. function hexdump(buffer) {
  5. const a = new Uint8Array(buffer);
  6. let s = '';
  7. for (let i = 0; i < a.byteLength; i++) {
  8. s += '0x';
  9. s += a[i].toString(16);
  10. s += ' ';
  11. }
  12. return s.trim();
  13. }
  14. */
  15. /* TODO: more tests
  16. * - delta frames
  17. * - frame header is not encrypted
  18. * - different sendCounts
  19. * - different key length
  20. * - ratcheting in decodeFunction
  21. * etc
  22. */
  23. const audioBytes = [ 0xde, 0xad, 0xbe, 0xef ];
  24. const videoBytes = [ 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef ];
  25. /**
  26. * generates a dummy audio frame
  27. */
  28. function makeAudioFrame() {
  29. return {
  30. data: new Uint8Array(audioBytes).buffer,
  31. type: undefined // type is undefined for audio frames.
  32. };
  33. }
  34. /**
  35. * generates a dummy video frame
  36. */
  37. function makeVideoFrame() {
  38. return {
  39. data: new Uint8Array(videoBytes).buffer,
  40. type: 'key'
  41. };
  42. }
  43. describe('E2EE Context', () => {
  44. let sender;
  45. let sendController;
  46. let receiver;
  47. let receiveController;
  48. const key = new Uint8Array([
  49. 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  50. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  51. ]);
  52. beforeEach(() => {
  53. sender = new Context('sender');
  54. receiver = new Context('receiver');
  55. });
  56. describe('encode function', () => {
  57. beforeEach(async () => {
  58. await sender.setKey(key, 0);
  59. await receiver.setKey(key, 0);
  60. });
  61. it('with an audio frame', async done => {
  62. sendController = {
  63. enqueue: encodedFrame => {
  64. const data = new Uint8Array(encodedFrame.data);
  65. // An audio frame will have an overhead of 6 bytes with this counter and key size:
  66. // 4 bytes truncated signature, counter (1 byte) and 1 byte trailer.
  67. expect(data.byteLength).toEqual(audioBytes.length + 6);
  68. // TODO: provide test vector.
  69. done();
  70. }
  71. };
  72. await sender.encodeFunction(makeAudioFrame(), sendController);
  73. });
  74. it('with a video frame', async done => {
  75. sendController = {
  76. enqueue: encodedFrame => {
  77. const data = new Uint8Array(encodedFrame.data);
  78. // A video frame will have an overhead of 12 bytes with this counter and key size:
  79. // 10 bytes signature, counter (1 byte) and 1 byte trailer.
  80. expect(data.byteLength).toEqual(videoBytes.length + 12);
  81. // TODO: provide test vector.
  82. done();
  83. }
  84. };
  85. await sender.encodeFunction(makeVideoFrame(), sendController);
  86. });
  87. });
  88. describe('end-to-end test', () => {
  89. beforeEach(async () => {
  90. await sender.setKey(key, 0);
  91. await receiver.setKey(key, 0);
  92. sendController = {
  93. enqueue: async encodedFrame => {
  94. await receiver.decodeFunction(encodedFrame, receiveController);
  95. }
  96. };
  97. });
  98. it('with an audio frame', async done => {
  99. receiveController = {
  100. enqueue: encodedFrame => {
  101. const data = new Uint8Array(encodedFrame.data);
  102. expect(data.byteLength).toEqual(audioBytes.length);
  103. expect(Array.from(data)).toEqual(audioBytes);
  104. done();
  105. }
  106. };
  107. await sender.encodeFunction(makeAudioFrame(), sendController);
  108. });
  109. it('with a video frame', async done => {
  110. receiveController = {
  111. enqueue: encodedFrame => {
  112. const data = new Uint8Array(encodedFrame.data);
  113. expect(data.byteLength).toEqual(videoBytes.length);
  114. expect(Array.from(data)).toEqual(videoBytes);
  115. done();
  116. }
  117. };
  118. await sender.encodeFunction(makeVideoFrame(), sendController);
  119. });
  120. it('the receiver ratchets forward', async done => {
  121. // Ratchet the key. We reimport from the raw bytes.
  122. const material = await importKey(key);
  123. await sender.setKey(await ratchet(material), 0);
  124. receiveController = {
  125. enqueue: encodedFrame => {
  126. const data = new Uint8Array(encodedFrame.data);
  127. expect(data.byteLength).toEqual(audioBytes.length);
  128. expect(Array.from(data)).toEqual(audioBytes);
  129. done();
  130. }
  131. };
  132. await sender.encodeFunction(makeAudioFrame(), sendController);
  133. });
  134. });
  135. });