CryptTool.js 5.2 KB

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