選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。
 
 
 

105 行
3.3 KiB

  1. function load_script(o_script, callback) {
  2. let script = document.createElement('script');
  3. script.type = o_script.type || 'text/javascript';
  4. if(o_script.hasAttribute('src')) {
  5. script.src = o_script.src;
  6. script.onload = callback
  7. }
  8. script.innerHTML = o_script.innerHTML;
  9. document.head.appendChild(script);
  10. if (o_script.src === "") {
  11. // NOTE(Felix): it seems the onload is not called on script nodes that
  12. // define the js inline instead of through a src attribute, so for
  13. // them we call the callback manually and hope for the best.
  14. callback();
  15. }
  16. }
  17. var next_script_index = 0
  18. var deferred_scripts = []
  19. function load_next_deferred_script() {
  20. if (next_script_index >= deferred_scripts.length)
  21. return
  22. load_script(deferred_scripts[next_script_index++], () => load_next_deferred_script())
  23. }
  24. function decrypt_page() {
  25. var key_str = ""
  26. var html_name = window.location.pathname;
  27. var allcookies = document.cookie;
  28. cookiearray = allcookies.split(';');
  29. for(var i=0; i<cookiearray.length; i++) {
  30. name = cookiearray[i].split('=')[0].trim();
  31. value = cookiearray[i].split('=')[1];
  32. if (name == html_name)
  33. key_str = value;
  34. if (name == "__master__") {
  35. key_str = value;
  36. break;
  37. }
  38. }
  39. if (key_str.length == 0)
  40. key_str = document.querySelector('input[name=pwd]').value
  41. // check key length
  42. if (key_str.length != 16 &&
  43. key_str.length != 24 &&
  44. key_str.length != 32)
  45. {
  46. return;
  47. }
  48. var entered_key = aesjs.utils.utf8.toBytes(key_str);
  49. var enc_bytes = aesjs.utils.hex.toBytes(enc_hex_body)
  50. // check if the user input / loaded cookie is the master key
  51. var aesCtr = new aesjs.ModeOfOperation.ctr(entered_key, new aesjs.Counter(initial_counter))
  52. var master_key_dec_real_key = aesCtr.decrypt(aesjs.utils.hex.toBytes(master_key_enc_real_key))
  53. aesCtr = new aesjs.ModeOfOperation.ctr(master_key_dec_real_key, new aesjs.Counter(initial_counter))
  54. var dec_bytes = aesCtr.decrypt(enc_bytes)
  55. // Convert our bytes back into text
  56. var dec_text = aesjs.utils.utf8.fromBytes(dec_bytes)
  57. if (!dec_text.endsWith(correct_key_marker)) {
  58. // check if it is a regular password
  59. aesCtr = new aesjs.ModeOfOperation.ctr(entered_key, new aesjs.Counter(initial_counter))
  60. var org_key_dec_real_key = aesCtr.decrypt(aesjs.utils.hex.toBytes(org_key_enc_real_key))
  61. aesCtr = new aesjs.ModeOfOperation.ctr(org_key_dec_real_key, new aesjs.Counter(initial_counter))
  62. dec_bytes = aesCtr.decrypt(enc_bytes)
  63. dec_text = aesjs.utils.utf8.fromBytes(dec_bytes)
  64. if (!dec_text.endsWith(correct_key_marker)) {
  65. key_str = "";
  66. return
  67. } else {
  68. // entered correct file key
  69. document.cookie = html_name + "=" + key_str;
  70. }
  71. } else {
  72. // entered correct master key
  73. document.cookie = "__master__=" + key_str;
  74. }
  75. // Convert our bytes back into text
  76. // var dec_text = aesjs.utils.utf8.fromBytes(dec_bytes)
  77. var dec_text = new TextDecoder().decode(dec_bytes)
  78. document.body.outerHTML = "<body" + dec_text + "</body>"
  79. deferred_scripts = document.body.querySelectorAll('script');
  80. load_next_deferred_script()
  81. }
  82. window.onload = decrypt_page