Advertisement
abhishekr

janus-e2e-encryption

Mar 31st, 2021
196
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.16 KB | None | 0 0
  1. var currentCryptoKey = null;//e2e
  2. var currentKeyIdentifier = 0;//e2e
  3. var mysecretkey = "videoroom";
  4.  
  5. //e2e functions
  6. var senderTransforms = {}, receiverTransforms = {};
  7. for(var m of ["audio", "video"]) {
  8. senderTransforms[m] = new TransformStream({
  9. start() {
  10. // Called on startup.
  11. console.log("[Sender transform)] Startup");
  12. },
  13. transform(chunk, controller) {
  14. // Copy of the above mentioned demo's encodeFunction()
  15. const view = new DataView(chunk.data);
  16. const newData = new ArrayBuffer(chunk.data.byteLength + 5);
  17. const newView = new DataView(newData);
  18. for(let i=0; i<10; ++i) {
  19. newView.setInt8(i, view.getInt8(i));
  20. }
  21. // This is a bitwise xor of the key with the payload. This is not strong encryption, just a demo.
  22. for(let i=10; i<chunk.data.byteLength; ++i) {
  23. const keyByte = currentCryptoKey.charCodeAt(i % currentCryptoKey.length);
  24. newView.setInt8(i, view.getInt8(i) ^ keyByte);
  25. }
  26. newView.setUint8(chunk.data.byteLength, currentKeyIdentifier % 0xff);
  27. newView.setUint32(chunk.data.byteLength + 1, 0xDEADBEEF);
  28. chunk.data = newData;
  29. controller.enqueue(chunk);
  30. },
  31. flush() {
  32. // Called when the stream is about to be closed
  33. console.log("[Sender transform] Closing");
  34. }
  35. });
  36. receiverTransforms[m] = new TransformStream({
  37. start() {
  38. // Called on startup.
  39. console.log("[Receiver transform] Startup");
  40. },
  41. transform(chunk, controller) {
  42. // Copy of the above mentioned demo's decodeFunction()
  43. const view = new DataView(chunk.data);
  44. const checksum = view.getUint32(chunk.data.byteLength - 4);
  45. if(checksum !== 0xDEADBEEF) {
  46. console.log('Corrupted frame received');
  47. console.log(checksum.toString(16));
  48. return;
  49. }
  50. const keyIdentifier = view.getUint8(chunk.data.byteLength - 5);
  51. if(keyIdentifier !== currentKeyIdentifier) {
  52. console.log(`Key identifier mismatch, got ${keyIdentifier} expected ${currentKeyIdentifier}.`);
  53. return;
  54. }
  55. const newData = new ArrayBuffer(chunk.data.byteLength - 5);
  56. const newView = new DataView(newData);
  57. for(let i=0; i<10; ++i) {
  58. newView.setInt8(i, view.getInt8(i));
  59. }
  60. for(let i=10; i<chunk.data.byteLength - 5; ++i) {
  61. const keyByte = currentCryptoKey.charCodeAt(i % currentCryptoKey.length);
  62. newView.setInt8(i, view.getInt8(i) ^ keyByte);
  63. }
  64. chunk.data = newData;
  65. controller.enqueue(chunk);
  66. },
  67. flush() {
  68. // Called when the stream is about to be closed
  69. console.log("[Receiver transform] Closing");
  70. }
  71. });
  72. }
  73.  
  74. function publishLocalFeed(audio, video) {
  75. return function (dispatch, getState) {
  76. .....
  77. // Publish our stream
  78. return new Promise(function (resolve, reject) {
  79.  
  80. // Take note of the secret - e2e
  81. currentCryptoKey = mysecretkey;
  82. //currentKeyIdentifier++;
  83. currentKeyIdentifier=1;
  84.  
  85. videoRoomLocal.createOffer({
  86. media: {
  87. audioRecv: false,
  88. videoRecv: false,
  89. audioSend: !!audio,
  90. videoSend: !!video,
  91. audio: audio,
  92. video: video,
  93. //data: dataSupport,
  94. }, // Publishers are sendonly
  95. senderTransforms: senderTransforms,
  96. receiverTransforms: receiverTransforms,
  97. .....
  98.  
  99.  
  100. // A new feed has been published, create a new plugin handle and attach to it as a listener
  101. function attachRemoteFeed(id, user) {
  102. return function (dispatch, getState) {
  103. .....
  104. janus.attach({
  105. .....
  106. onmessage: function onmessage(msg, jsep) {
  107. var event = msg.videoroom;
  108. if (event) {
  109. .....
  110. }
  111. if (jsep) {
  112.  
  113. // Take note of the secret - e2e
  114. currentCryptoKey = mysecretkey;
  115. //currentKeyIdentifier++;
  116. currentKeyIdentifier=1;
  117.  
  118.  
  119. // Answer and attach
  120. feed.plugin.createAnswer({
  121. jsep: jsep,
  122. // We want recvonly audio/video
  123. media: { audioSend: false, videoSend: false },
  124. // Since we want to use Insertable Streams, - e2e
  125. // we specify the transform functions to use
  126. senderTransforms: senderTransforms,
  127. receiverTransforms: receiverTransforms,
  128. .....
  129.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement