public IActionResult UploadResult(UploadResultViewModel uploadResultViewModel) { // Get's the Doctor's information for current session ViewBag.DoctorName = HttpContext.Session.GetString(Globals.currentUserName); var oldViewModel = JsonConvert.DeserializeObject <UploadResultViewModel>(TempData["viewModel"] as string); uploadResultViewModel.TestData = oldViewModel.TestData; uploadResultViewModel.PatientAsset = oldViewModel.PatientAsset; uploadResultViewModel.PatientMetadata = oldViewModel.PatientMetadata; TempData["viewModel"] = JsonConvert.SerializeObject(uploadResultViewModel); if (!ModelState.IsValid) { return(View(uploadResultViewModel)); } var doctorSignPrivateKey = HttpContext.Session.GetString(Globals.currentDSPriK); var doctorAgreePrivateKey = HttpContext.Session.GetString(Globals.currentDAPriK); var doctorSignPublicKey = EncryptionService.getSignPublicKeyStringFromPrivate(doctorSignPrivateKey); var patientSignPublicKey = HttpContext.Session.GetString(Globals.currentPSPubK); var transID = uploadResultViewModel.TestData.transID; var testRequisition = _bigChainDbService.GetMetaDataAndAssetFromTransactionId <string, double>(transID); //Check MLT has access to upload data if (testRequisition.metadata.AccessList.Keys.Contains(doctorSignPublicKey)) { //Get hash key for requisition. We will use the same key for result var hashedKey = testRequisition.metadata.AccessList[doctorSignPublicKey]; var dataDecryptionKey = EncryptionService.getDecryptedEncryptionKey(hashedKey, doctorAgreePrivateKey); if (uploadResultViewModel.ResultFile != null) { var file = uploadResultViewModel.ResultFile; string base64FileString = ""; // Convert "file" into base64 string "base64FileString" to save into database using (var ms = new MemoryStream()) { file.CopyTo(ms); var fileBytes = ms.ToArray(); base64FileString = Convert.ToBase64String(fileBytes); } //encrypt file data and save to ipfs var encryptFileData = EncryptionService.getEncryptedAssetDataKey(base64FileString, dataDecryptionKey); var cid = _bigChainDbService.UploadTextToIPFS(encryptFileData); var resultFile = new FileData() { Data = cid, Type = file.ContentType, Extension = file.ContentType.Split('/').Last(), Name = file.FileName }; //Encrypt the file using the same key var encryptedFile = EncryptionService.getEncryptedAssetDataKey(JsonConvert.SerializeObject(resultFile), dataDecryptionKey); var asset = new AssetSaved <TestResultAsset> { Data = new TestResultAsset { RequisitionAssetID = testRequisition.id, EncryptedResult = encryptedFile }, RandomId = _random.Next(0, 100000), Type = AssetType.TestResult }; //Access is managed by requisition asset var metadata = new MetaDataSaved <double>(); metadata.AccessList = new Dictionary <string, string>(); _bigChainDbService.SendCreateTransferTransactionToDataBase(asset, metadata, doctorSignPrivateKey, patientSignPublicKey); return(RedirectToAction("PatientRecords")); } else { ModelState.AddModelError("", "Missing test result file."); return(View(uploadResultViewModel)); } } else { ModelState.AddModelError("", "You do not have permission to upload test result."); return(View(uploadResultViewModel)); } }
public IActionResult AddNewPatientRecord(AddNewPatientRecordViewModel addNewPatientRecordViewModel) { ViewBag.DoctorName = HttpContext.Session.GetString(Globals.currentUserName); if (!string.IsNullOrEmpty(addNewPatientRecordViewModel.DoctorsNote.PurposeOfVisit)) { var noteViewModel = addNewPatientRecordViewModel.DoctorsNote; var doctorNote = new DoctorNote { PurposeOfVisit = noteViewModel.PurposeOfVisit, Description = noteViewModel.Description, FinalDiagnosis = noteViewModel.FinalDiagnosis, FurtherInstructions = noteViewModel.FurtherInstructions, DoctorName = HttpContext.Session.GetString(Globals.currentUserName), DoctorMinsc = HttpContext.Session.GetString(Globals.currentUserID), DateOfRecord = DateTime.Now }; string encryptionKey; var encryptedData = EncryptionService.getEncryptedAssetData(JsonConvert.SerializeObject(doctorNote), out encryptionKey); var asset = new AssetSaved <string> { Data = encryptedData, RandomId = _random.Next(0, 100000), Type = AssetType.DoctorNote }; var metadata = new MetaDataSaved <double>(); metadata.AccessList = new Dictionary <string, string>(); //store the data encryption key in metadata encrypted with sender and reciever agree key var doctorSignPrivateKey = HttpContext.Session.GetString(Globals.currentDSPriK); var doctorAgreePrivateKey = HttpContext.Session.GetString(Globals.currentDAPriK); var patientAgreePublicKey = HttpContext.Session.GetString(Globals.currentPAPubK); var patientSignPublicKey = HttpContext.Session.GetString(Globals.currentPSPubK); var doctorSignPublicKey = EncryptionService.getSignPublicKeyStringFromPrivate(doctorSignPrivateKey); var doctorAgreePublicKey = EncryptionService.getAgreePublicKeyStringFromPrivate(doctorAgreePrivateKey); metadata.AccessList[doctorSignPublicKey] = EncryptionService.getEncryptedEncryptionKey(encryptionKey, doctorAgreePrivateKey, doctorAgreePublicKey); metadata.AccessList[patientSignPublicKey] = EncryptionService.getEncryptedEncryptionKey(encryptionKey, doctorAgreePrivateKey, patientAgreePublicKey); _bigChainDbService.SendCreateTransferTransactionToDataBase <string, double>(asset, metadata, doctorSignPrivateKey, patientSignPublicKey); } if (!string.IsNullOrEmpty(addNewPatientRecordViewModel.Prescription.DrugName)) { var prescriptionViewModel = addNewPatientRecordViewModel.Prescription; var prescription = new Prescription { PrescribingDate = prescriptionViewModel.PrescribingDate, Superscription = prescriptionViewModel.Superscription, DrugName = prescriptionViewModel.DrugName, Dosage = prescriptionViewModel.Dosage, //StartDate = prescriptionViewModel.StartDate, EndDate = prescriptionViewModel.EndDate, Refill = prescriptionViewModel.Refill, Substitution = prescriptionViewModel.Substitution, DoctorName = HttpContext.Session.GetString(Globals.currentUserName), DoctorMinsc = HttpContext.Session.GetString(Globals.currentUserID), DirectionForUse = prescriptionViewModel.DirectionForUse }; string encryptionKey; var encryptedData = EncryptionService.getEncryptedAssetData(JsonConvert.SerializeObject(prescription), out encryptionKey); var asset = new AssetSaved <string> { Data = encryptedData, RandomId = _random.Next(0, 100000), Type = AssetType.Prescription }; var metadata = new MetaDataSaved <PrescriptionMetadata> { AccessList = new Dictionary <string, string>(), data = new PrescriptionMetadata { RefillRemaining = prescription.Refill, LastIssueQty = -1 } }; //store the data encryption key in metadata encrypted with sender and reciever agree key var doctorSignPrivateKey = HttpContext.Session.GetString(Globals.currentDSPriK); var doctorAgreePrivateKey = HttpContext.Session.GetString(Globals.currentDAPriK); var patientAgreePublicKey = HttpContext.Session.GetString(Globals.currentPAPubK); var patientSignPublicKey = HttpContext.Session.GetString(Globals.currentPSPubK); var doctorSignPublicKey = EncryptionService.getSignPublicKeyStringFromPrivate(doctorSignPrivateKey); var doctorAgreePublicKey = EncryptionService.getAgreePublicKeyStringFromPrivate(doctorAgreePrivateKey); metadata.AccessList[doctorSignPublicKey] = EncryptionService.getEncryptedEncryptionKey(encryptionKey, doctorAgreePrivateKey, doctorAgreePublicKey); metadata.AccessList[patientSignPublicKey] = EncryptionService.getEncryptedEncryptionKey(encryptionKey, doctorAgreePrivateKey, patientAgreePublicKey); _bigChainDbService.SendCreateTransferTransactionToDataBase <string, PrescriptionMetadata>(asset, metadata, doctorSignPrivateKey, patientSignPublicKey); } //There is a test result that exists if (!string.IsNullOrEmpty(addNewPatientRecordViewModel.TestRequisition.ReasonForTest)) { //File exists if (addNewPatientRecordViewModel.TestRequisition.AttachedFile != null) { var file = addNewPatientRecordViewModel.TestRequisition.AttachedFile; string base64FileString = ""; // Convert "file" into base64 string "base64FileString" to save into database using (var ms = new MemoryStream()) { file.CopyTo(ms); var fileBytes = ms.ToArray(); base64FileString = Convert.ToBase64String(fileBytes); } //encrypt file and store in ipfs var encryptionKey = EncryptionService.getNewAESEncryptionKey(); var encryptedFile = EncryptionService.getEncryptedAssetDataKey(base64FileString, encryptionKey); var id = _bigChainDbService.UploadTextToIPFS(encryptedFile); var testRequisition = new TestRequisitionAsset { AttachedFile = new FileData { Data = id, Type = file.ContentType, Extension = file.ContentType.Split('/').Last(), Name = file.FileName }, ReasonForTest = addNewPatientRecordViewModel.TestRequisition.ReasonForTest, TestType = addNewPatientRecordViewModel.TestRequisition.TestType, DateOrdered = DateTime.Now }; var encryptedData = EncryptionService.getEncryptedAssetDataKey(JsonConvert.SerializeObject(testRequisition), encryptionKey); var asset = new AssetSaved <string> { Data = encryptedData, RandomId = _random.Next(0, 100000), Type = AssetType.TestRequisition }; var metadata = new MetaDataSaved <double>(); metadata.AccessList = new Dictionary <string, string>(); //store the data encryption key in metadata encrypted with sender and reciever agree key var doctorSignPrivateKey = HttpContext.Session.GetString(Globals.currentDSPriK); var doctorAgreePrivateKey = HttpContext.Session.GetString(Globals.currentDAPriK); var patientAgreePublicKey = HttpContext.Session.GetString(Globals.currentPAPubK); var patientSignPublicKey = HttpContext.Session.GetString(Globals.currentPSPubK); var doctorSignPublicKey = EncryptionService.getSignPublicKeyStringFromPrivate(doctorSignPrivateKey); var doctorAgreePublicKey = EncryptionService.getAgreePublicKeyStringFromPrivate(doctorAgreePrivateKey); metadata.AccessList[doctorSignPublicKey] = EncryptionService.getEncryptedEncryptionKey(encryptionKey, doctorAgreePrivateKey, doctorAgreePublicKey); metadata.AccessList[patientSignPublicKey] = EncryptionService.getEncryptedEncryptionKey(encryptionKey, doctorAgreePrivateKey, patientAgreePublicKey); _bigChainDbService.SendCreateTransferTransactionToDataBase <string, double>(asset, metadata, doctorSignPrivateKey, patientSignPublicKey); } } return(RedirectToAction("PatientOverview")); }