CryptTool.js 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. 'use strict';
  2. const common = require('../common');
  3. const fs = require('fs');
  4. describe('CryptTool', function () {
  5. describe('cipher & decipher', function () {
  6. afterEach(async function () {
  7. // pause to let async functions conclude
  8. await new Promise(resolve => setTimeout(resolve, 1900));
  9. });
  10. this.timeout(30000);
  11. it('can en- and decrypt any message', function () {
  12. jsc.assert(jsc.forall(
  13. 'string',
  14. 'string',
  15. 'string',
  16. async function (key, password, message) {
  17. const clean = globalThis.cleanup();
  18. // ensure zlib is getting loaded
  19. PrivateBin.Controller.initZ();
  20. Object.defineProperty(window, 'crypto', {
  21. value: new WebCrypto(),
  22. writeable: false
  23. });
  24. global.atob = common.atob;
  25. global.btoa = common.btoa;
  26. message = message.trim();
  27. const cipherMessage = await PrivateBin.CryptTool.cipher(
  28. key, password, message, []
  29. ),
  30. plaintext = await PrivateBin.CryptTool.decipher(
  31. key, password, cipherMessage
  32. );
  33. clean();
  34. const result = (message === plaintext);
  35. if (!result) console.log(plaintext, cipherMessage);
  36. return result;
  37. }
  38. ),
  39. {tests: 3});
  40. });
  41. it('does not truncate messages', async function () {
  42. const message = fs.readFileSync('test/compression-sample.txt', 'ascii').trim(),
  43. clean = globalThis.cleanup();
  44. Object.defineProperty(window, 'crypto', {
  45. value: new WebCrypto(),
  46. writeable: false
  47. });
  48. // ensure zlib is getting loaded
  49. PrivateBin.Controller.initZ();
  50. global.atob = common.atob;
  51. global.btoa = common.btoa;
  52. const cipherMessage = await PrivateBin.CryptTool.cipher(
  53. 'foo', 'bar', message, []
  54. ),
  55. plaintext = await PrivateBin.CryptTool.decipher(
  56. 'foo', 'bar', cipherMessage
  57. );
  58. clean();
  59. if (message !== plaintext) {
  60. console.log(plaintext, cipherMessage);
  61. }
  62. assert.strictEqual(message, plaintext);
  63. });
  64. it('can en- and decrypt a particular message (#260)', function () {
  65. jsc.assert(jsc.forall(
  66. 'string',
  67. 'string',
  68. async function (key, password) {
  69. const message = `
  70. 1 subgoal
  71. inv : Assert
  72. expr : Expr
  73. sBody : Instr
  74. deduction : (|- [|inv /\ assertOfExpr expr|] sBody [|inv|])%assert
  75. IHdeduction : (|= [|inv /\ assertOfExpr expr |] sBody [|inv|])%assert
  76. mem : Mem
  77. preInMem : inv mem
  78. m : Mem
  79. n : nat
  80. interpRel : interp (nth_iterate sBody n) (MemElem mem) = CpoElem Mem m
  81. lastIter : interp (nth_iterate sBody n) (MemElem mem) |=e expr_neg expr
  82. notLastIter : forall p : nat,
  83. p < n -> interp (nth_iterate sBody p) (MemElem mem) |=e expr
  84. isWhile : interp (while expr sBody) (MemElem mem) =
  85. interp (nth_iterate sBody n) (MemElem mem)
  86. ======================== ( 1 / 1 )
  87. conseq_or_bottom inv (interp (nth_iterate sBody n) (MemElem mem))
  88. `;
  89. const clean = globalThis.cleanup();
  90. // ensure zlib is getting loaded
  91. PrivateBin.Controller.initZ();
  92. Object.defineProperty(window, 'crypto', {
  93. value: new WebCrypto(),
  94. writeable: false
  95. });
  96. const cipherMessage = await PrivateBin.CryptTool.cipher(
  97. key, password, message, []
  98. ),
  99. plaintext = await PrivateBin.CryptTool.decipher(
  100. key, password, cipherMessage
  101. );
  102. clean();
  103. const result = (message === plaintext);
  104. if (!result) console.log(plaintext, cipherMessage);
  105. return result;
  106. }
  107. ),
  108. {tests: 3});
  109. });
  110. });
  111. describe('getSymmetricKey', function () {
  112. this.timeout(10000);
  113. let keys = [];
  114. // the parameter is used to ensure the test is run more then one time
  115. it('returns random, non-empty keys', function () {
  116. jsc.assert(jsc.forall(
  117. 'integer',
  118. function(counter) {
  119. const clean = globalThis.cleanup();
  120. Object.defineProperty(window, 'crypto', {
  121. value: new WebCrypto(),
  122. writeable: false
  123. });
  124. const key = PrivateBin.CryptTool.getSymmetricKey(),
  125. result = (key !== '' && keys.indexOf(key) === -1);
  126. keys.push(key);
  127. clean();
  128. return result;
  129. }
  130. ),
  131. {tests: 10});
  132. });
  133. });
  134. });