Digital Rights Management für elektronische Patientenakten
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

App.js 14KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406
  1. import React from 'react';
  2. import ReactDOM from 'react-dom';
  3. import crypto from 'crypto';
  4. import "core-js/stable";
  5. import "regenerator-runtime/runtime";
  6. import * as cryptojs from 'crypto-js';
  7. import $ from 'jquery';
  8. var Buffer = require('buffer').Buffer;
  9. var folderparts = 0;
  10. var permissions = "0";
  11. var patient = 0;
  12. var justified = "0";
  13. class Generate_Sign_Butn extends React.Component {
  14. RSASign(string_sign) {
  15. console.log(string_sign)
  16. var signerObject = crypto.createSign("RSA-SHA256");
  17. var PrivateKey = sessionStorage.getItem('privkey')
  18. signerObject.update(string_sign);
  19. var signature = signerObject.sign(PrivateKey, false);
  20. console.log(signature);
  21. var b64encoded = btoa(String.fromCharCode.apply(null, signature))
  22. return(b64encoded)
  23. }
  24. get_license_signed(){
  25. var patient_id = document.getElementById('id_patient').value;
  26. var user = document.getElementById('username').innerHTML;
  27. var justified_id = document.getElementById('id_justified').value;
  28. var expdate_id = document.getElementById('id_exp_date').value;
  29. var permissions_object = document.getElementById('id_permissions')
  30. var folder_parts_object = document.getElementById('id_folder_parts')
  31. var patient_object = document.getElementById('id_patient')
  32. var justified_object = document.getElementById('id_justified')
  33. var buttsn = new Generate_Sign_Butn();
  34. patient_id = buttsn.return_string_fromObject(patient, patient_object)
  35. justified_id = buttsn.return_string_fromObject(justified, justified_object)
  36. permissions = buttsn.return_string_fromObject(permissions, permissions_object)
  37. folderparts = buttsn.return_string_fromObject(folderparts, folder_parts_object)
  38. var signature_string = patient_id + "&" + justified_id + "&" + user + "&" + expdate_id.replace(" ", ",") + "&" + permissions + "&" + folderparts
  39. var signatured = buttsn.RSASign(signature_string)
  40. document.getElementById('id_signature').value = signatured
  41. return signatured;
  42. }
  43. return_string_fromObject(ids, element){
  44. var object_string = "";
  45. for (var i = 0; i < ids.length; i++){
  46. object_string += element.options[ids[i]].text
  47. object_string += ","
  48. }
  49. object_string = object_string.substring(0, object_string.length-1)
  50. return object_string
  51. }
  52. render() {
  53. return (
  54. <button onClick={this.get_license_signed}>Generate Signature</button>
  55. );
  56. }
  57. }
  58. function get_Params(){
  59. var patient_id = document.getElementById('id_patient').textContent;
  60. var justified_id = document.getElementById('id_justified').textContent;
  61. var expdate_id = document.getElementById('id_exp_date').textContent;
  62. var permissions = document.getElementById('id_permission').textContent
  63. var folderparts = document.getElementById('id_folder_parts').textContent
  64. var creator = document.getElementById('id_license_creator').textContent
  65. var signature = document.getElementById('id_signature').textContent
  66. signature = signature.replaceAll("\n", "")
  67. signature = signature.replaceAll(" ", "")
  68. var content_key = document.getElementById('id_content_key').textContent
  69. content_key = content_key.replaceAll("\n", "")
  70. content_key = content_key.replaceAll(" ", "")
  71. var serversign = document.getElementById('licenseserver_sign').textContent
  72. if (serversign){
  73. serversign = serversign.replaceAll("\n", "")
  74. serversign = serversign.replaceAll(" ", "")
  75. var sig_array = [patient_id, creator, justified_id, expdate_id, permissions, folderparts, signature, content_key, serversign]}
  76. else {
  77. var sig_array = [patient_id, creator, justified_id, expdate_id, permissions, folderparts, signature, content_key]
  78. }
  79. return sig_array;
  80. }
  81. function getPrivKey(){
  82. var privkey = document.getElementById('privkey').value;
  83. var pubkey = document.getElementById('pubkey').value;
  84. sessionStorage.setItem("privkey", privkey);
  85. sessionStorage.setItem("pubkey", pubkey);
  86. }
  87. var submitLogin = document.getElementById('submit_login');
  88. if(submitLogin){
  89. if (submitLogin.attachEvent) { submitLogin.attachEvent("submit", getPrivKey)} else {
  90. submitLogin.addEventListener("submit", getPrivKey)}}
  91. var check_submit = document.getElementById('submit_button_license');
  92. if(check_submit){
  93. document.getElementById("id_patient").onclick = function() {
  94. patient = Array.from(this.selectedOptions).map(option => option.index)
  95. }
  96. document.getElementById("id_justified").onclick = function() {
  97. justified = Array.from(this.selectedOptions).map(option => option.index)
  98. }
  99. document.getElementById("id_folder_parts").onclick = function() {
  100. folderparts = Array.from(this.selectedOptions).map(option => option.index)
  101. }
  102. document.getElementById("id_permissions").onclick = function() {
  103. permissions = Array.from(this.selectedOptions).map(option => option.index)
  104. }
  105. }
  106. async function display_folderpart(id){
  107. var jsonArr = []
  108. var params = get_Params()
  109. var license = new License(params)
  110. license.serversign = params[8]
  111. jsonArr.push(license)
  112. jsonArr.push(id)
  113. var response_create = await fetch('http://192.168.192.75:8000/folder/read/', {
  114. method: 'POST',
  115. body: JSON.stringify(jsonArr), // string or object
  116. headers: {
  117. 'Content-Type': 'application/json'
  118. }
  119. })
  120. var myJason = await response_create.json()
  121. console.log(response_create)
  122. console.log(myJason.key)
  123. console.log(base64ToArrayBuffer(myJason.key))
  124. var key = decrypt_key(base64ToArrayBuffer(myJason.key))
  125. var enc_content = myJason.content.replace(id, "")
  126. var content = aes_decrypt(key, enc_content)
  127. console.log(content)
  128. if (license.permissions.includes("Write")) {
  129. ReactDOM.render(<div><div>{id}</div>
  130. <textarea id="check_in_data" cols="40" rows="5"></textarea>
  131. <div><button onClick={() => check_in_data(id, key, jsonArr)}>Check In</button></div></div>, document.getElementById('content_parts'))
  132. } else {
  133. ReactDOM.render(<div>{content}</div>, document.getElementById('license_cfaesontent'))
  134. }
  135. document.getElementById("check_in_data").value = content
  136. }
  137. async function check_in_data(id, key, jsonArr){
  138. var content = document.getElementById("check_in_data").value
  139. console.log(content)
  140. var butin = new Generate_Sign_Butn()
  141. var privkey = get_priv_key()
  142. var encrypted_content = aes_encrypt(key, content)
  143. var today = new Date()
  144. var date = today.getFullYear()+'-'+(today.getMonth()+1)+'-'+today.getDate()
  145. var time = today.getHours() + ":" + today.getMinutes() + ":" + today.getSeconds()
  146. var date_time = date + "|" + time
  147. var change_signature = butin.RSASign(date_time + "|" + encrypted_content)
  148. console.log(encrypted_content)
  149. jsonArr.push(encrypted_content)
  150. jsonArr.push(date_time)
  151. jsonArr.push(change_signature)
  152. var response_create = await fetch('http://192.168.192.75:8000/folder/write/', {
  153. method: 'POST',
  154. body: JSON.stringify(jsonArr), // string or object
  155. headers: {
  156. 'Content-Type': 'application/json'
  157. }
  158. })
  159. var myJason = await response_create.json()
  160. console.log("jo")
  161. }
  162. class Buaton_API extends React.Component {
  163. async call_api (){
  164. var jsonArr = []
  165. var license = new License(get_Params())
  166. folderparts = license.folderparts
  167. folderparts = folderparts.split(", ")
  168. document.getElementById("license_content").style.visibility = "visible"
  169. var i = folderparts.map((part) => {
  170. return <button id={part} onClick={() => display_folderpart(part)}>{part}</button>})
  171. ReactDOM.render(i, document.getElementById('part_buttons'))
  172. }
  173. render() {
  174. return (
  175. <button onClick={this.call_api}>Use License</button>
  176. );
  177. }
  178. }
  179. var readAPI = document.getElementById('use_license');
  180. if (readAPI) {
  181. ReactDOM.render(<Buaton_API />, document.getElementById('use_license'))
  182. }
  183. var check_if_creating = document.getElementById('create_available');
  184. if (check_if_creating) {
  185. ReactDOM.render(<Generate_Sign_Butn />, document.getElementById('create_available'))
  186. }
  187. function get_pub_key(){
  188. var pubkey = sessionStorage.getItem('pubkey')
  189. return pubkey
  190. }
  191. function get_priv_key(){
  192. var privkey = sessionStorage.getItem('privkey')
  193. return privkey
  194. }
  195. function get_random_key(){
  196. var key = crypto.randomBytes(32)
  197. return key
  198. }
  199. function encrypt_key(key){
  200. var pubkey = get_pub_key()
  201. var encryptkey = btoa(String.fromCharCode.apply(null, crypto.publicEncrypt(pubkey, key)))
  202. return encryptkey
  203. }
  204. function encrypt_key_public(key, pubkey){
  205. var encryptkey = btoa(String.fromCharCode.apply(null, crypto.publicEncrypt(pubkey, key)))
  206. return encryptkey
  207. }
  208. function decrypt_key(key){
  209. var priv_key = get_priv_key()
  210. var decrypted_key = btoa(String.fromCharCode.apply(null, crypto.privateDecrypt(priv_key, key)))
  211. return decrypted_key
  212. }
  213. var base64Matcher = new RegExp("^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{4})$");
  214. function aes_encrypt(key, message){
  215. let cfg = {
  216. mode: cryptojs.mode.ECB
  217. };
  218. if(!base64Matcher.test(key)){
  219. key = btoa(String.fromCharCode.apply(null, key))}
  220. var encrypted = cryptojs.AES.encrypt(message, key, cfg).toString()
  221. console.log(encrypted)
  222. return encrypted
  223. }
  224. function base64ToArrayBuffer(base64) {
  225. var binary_string = atob(base64);
  226. var len = binary_string.length;
  227. var bytes = new Uint8Array(len);
  228. for (var i = 0; i < len; i++) {
  229. bytes[i] = binary_string.charCodeAt(i);
  230. }
  231. return bytes;
  232. }
  233. function aes_decrypt(key, message){
  234. let cfg = {
  235. mode: cryptojs.mode.ECB
  236. };
  237. var decryptedkey = cryptojs.AES.decrypt(message, key, cfg).toString(cryptojs.enc.Utf8)
  238. return decryptedkey
  239. }
  240. class newFolder_part {
  241. constructor(part_class, encrypt_key, content){
  242. this.part_class = part_class
  243. this.encrypted_key = encrypt_key
  244. this.content = content
  245. }
  246. }
  247. class License{
  248. constructor(licensearr){
  249. this.patient = licensearr[0]
  250. this.creator = licensearr[1]
  251. this.justified = licensearr[2]
  252. this.expdate = licensearr[3]
  253. this.permissions = licensearr[4]
  254. this.folderparts = licensearr[5]
  255. this.signature = licensearr[6]
  256. this.content_key = licensearr[7]
  257. }
  258. }
  259. class CreatePatientFolderButton extends React.Component {
  260. async call_api (){
  261. const response = await fetch('http://192.168.192.75:8000/folderpartnames/')
  262. const myJason = await response.json()
  263. var data = {
  264. "part_class": "Röntgenbilder",
  265. "folder_id": "1",
  266. "part_context": "descht"
  267. }
  268. console.log(myJason)
  269. var jsonArr = []
  270. var testkeys = []
  271. console.log(myJason.part_name)
  272. var params = get_Params()
  273. var license = new License(params)
  274. license.serversign = params[8]
  275. jsonArr.push(license)
  276. for (var i = 0; i < myJason.results.length; i++){
  277. var key = get_random_key()
  278. var content = aes_encrypt(key, myJason.results[i].part_name)
  279. var part = new newFolder_part(myJason.results[i].part_name, encrypt_key(key), content)
  280. jsonArr.push(part)
  281. testkeys.push(part)
  282. }
  283. var response_create = await fetch('http://192.168.192.75:8000/folder/create/', {
  284. method: 'POST',
  285. body: JSON.stringify(jsonArr), // string or object
  286. headers: {
  287. 'Content-Type': 'application/json'
  288. }
  289. })}
  290. render() {
  291. return (
  292. <button onClick={this.call_api}>CreateFolder</button>
  293. )
  294. }
  295. }
  296. var is_creating_folder = document.getElementById('create_patientfolder');
  297. if (is_creating_folder) {
  298. ReactDOM.render(<CreatePatientFolderButton />, document.getElementById('create_patientfolder'))
  299. }
  300. class UseLicenseButton extends React.Component {
  301. async call_api (){
  302. var jsonArr = []
  303. var testkeys = []
  304. var license = new License(get_Params())
  305. folderparts = license.folderparts
  306. folderparts = folderparts.split(", ")
  307. print(folderparts)
  308. render_info = folderparts.map((part) => {
  309. return <button>{part}</button>})
  310. ReactDOM.render(render_info, document.getElementById('call_api'))
  311. jsonArr.push(license)
  312. var response_create = await fetch('http://192.168.192.75:8000/folder/create/', {
  313. method: 'POST',
  314. body: JSON.stringify(jsonArr), // string or object
  315. headers: {
  316. 'Content-Type': 'application/json'
  317. }
  318. })
  319. }
  320. render() {
  321. return (
  322. <button onClick={this.call_api}>UseLicense</button>
  323. )
  324. }
  325. }
  326. var needs_call_api = document.getElementById('call_api');
  327. if (needs_call_api) {
  328. ReactDOM.render(<UseLicenseButton />, document.getElementById('call_api'))
  329. }
  330. class CreateLicenseButton extends React.Component {
  331. async call_api (){
  332. var jsonArr = []
  333. var params = get_Params()
  334. var license = new License(params)
  335. license.serversign = params[8]
  336. jsonArr.push(license)
  337. console.log(license.folderparts)
  338. var folderparts = license.folderparts.split(",")
  339. for (var i = 0; i < folderparts.length; i++){
  340. var part = folderparts[i]
  341. jsonArr[1] = part
  342. jsonArr[2] = "get"
  343. var response_create = await fetch('http://192.168.192.75:8000/folder/read/', {
  344. method: 'POST',
  345. body: JSON.stringify(jsonArr), // string or object
  346. headers: {
  347. 'Content-Type': 'application/json'
  348. }
  349. })
  350. var myJason = await response_create.json()
  351. var key = decrypt_key(base64ToArrayBuffer(myJason.key))
  352. var pubkey = myJason.pubkey
  353. pubkey = pubkey.replace("-----BEGIN PUBLIC KEY-----", "-----BEGINPUBLICKEY-----")
  354. pubkey = pubkey.replace("-----END PUBLIC KEY-----", "-----ENDPUBLICKEY-----")
  355. pubkey = pubkey.replaceAll(" ", "\n")
  356. pubkey = pubkey.replace("-----BEGINPUBLICKEY-----", "-----BEGIN PUBLIC KEY-----")
  357. pubkey = pubkey.replace("-----ENDPUBLICKEY-----", "-----END PUBLIC KEY-----")
  358. jsonArr[2] = encrypt_key_public(base64ToArrayBuffer(key), pubkey)
  359. var response_create = await fetch('http://192.168.192.75:8000/create/key/', {
  360. method: 'POST',
  361. body: JSON.stringify(jsonArr), // string or object
  362. headers: {
  363. 'Content-Type': 'application/json'
  364. }
  365. })
  366. }
  367. }
  368. render() {
  369. return (
  370. <button onClick={this.call_api}>Create License</button>
  371. )
  372. }
  373. }
  374. var want_create_license = document.getElementById('call_api_button');
  375. if (want_create_license) {
  376. ReactDOM.render(<CreateLicenseButton />, document.getElementById('call_api_button'))
  377. }