1
0

CryptTool.js 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  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. if (message !== plaintext) {
  59. console.log(plaintext, cipherMessage);
  60. }
  61. assert.strictEqual(message, plaintext);
  62. });
  63. it('can en- and decrypt a particular message (#260)', function () {
  64. jsc.assert(jsc.forall(
  65. 'string',
  66. 'string',
  67. async function (key, password) {
  68. const message = `
  69. 1 subgoal
  70. inv : Assert
  71. expr : Expr
  72. sBody : Instr
  73. deduction : (|- [|inv /\ assertOfExpr expr|] sBody [|inv|])%assert
  74. IHdeduction : (|= [|inv /\ assertOfExpr expr |] sBody [|inv|])%assert
  75. mem : Mem
  76. preInMem : inv mem
  77. m : Mem
  78. n : nat
  79. interpRel : interp (nth_iterate sBody n) (MemElem mem) = CpoElem Mem m
  80. lastIter : interp (nth_iterate sBody n) (MemElem mem) |=e expr_neg expr
  81. notLastIter : forall p : nat,
  82. p < n -> interp (nth_iterate sBody p) (MemElem mem) |=e expr
  83. isWhile : interp (while expr sBody) (MemElem mem) =
  84. interp (nth_iterate sBody n) (MemElem mem)
  85. ======================== ( 1 / 1 )
  86. conseq_or_bottom inv (interp (nth_iterate sBody n) (MemElem mem))
  87. `;
  88. const clean = jsdom();
  89. // ensure zlib is getting loaded
  90. $.PrivateBin.Controller.initZ();
  91. Object.defineProperty(window, 'crypto', {
  92. value: new WebCrypto(),
  93. writeable: false
  94. });
  95. const cipherMessage = await $.PrivateBin.CryptTool.cipher(
  96. key, password, message, []
  97. ),
  98. plaintext = await $.PrivateBin.CryptTool.decipher(
  99. key, password, cipherMessage
  100. );
  101. clean();
  102. const result = (message === plaintext);
  103. if (!result) console.log(plaintext, cipherMessage);
  104. return result;
  105. }
  106. ),
  107. {tests: 3});
  108. });
  109. });
  110. describe('getSymmetricKey', function () {
  111. this.timeout(10000);
  112. let keys = [];
  113. // the parameter is used to ensure the test is run more then one time
  114. it('returns random, non-empty keys', function () {
  115. jsc.assert(jsc.forall(
  116. 'integer',
  117. function(counter) {
  118. const clean = jsdom();
  119. Object.defineProperty(window, 'crypto', {
  120. value: new WebCrypto(),
  121. writeable: false
  122. });
  123. const key = $.PrivateBin.CryptTool.getSymmetricKey(),
  124. result = (key !== '' && keys.indexOf(key) === -1);
  125. keys.push(key);
  126. clean();
  127. return result;
  128. }
  129. ),
  130. {tests: 10});
  131. });
  132. });
  133. });