public IActionResult EditProfile(PatientCredMetadata patientCredMetadata) { Assets <PatientCredAssetData> userAsset = _bigChainDbService.GetPatientAssetFromID(HttpContext.Session.GetString(Globals.currentUserID)); var patientSignPublicKey = HttpContext.Session.GetString(Globals.currentPSPubK); var patientSignPrivateKey = HttpContext.Session.GetString(Globals.currentPSPriK); var transaction = _bigChainDbService.GetMetadataIDFromAssetPublicKey <PatientCredMetadata>(userAsset.id, patientSignPublicKey); var transID = transaction.Id ?? userAsset.id; patientCredMetadata.hashedPassword = transaction.Metadata.data.hashedPassword; var newMetadata = new MetaDataSaved <PatientCredMetadata> { data = patientCredMetadata }; _bigChainDbService.SendTransferTransactionToDataBase(userAsset.id, newMetadata, patientSignPrivateKey, patientSignPublicKey, transID); return(RedirectToAction("PatientOverview")); }
public IActionResult RequestAccess(RequestAccessViewModel requestAccessViewModel) { // Description: Authenticates a patient's identity when a Doctor requests access to their medical information // Get's the Doctor's information for current session ViewBag.DoctorName = HttpContext.Session.GetString(Globals.currentUserName); if (!ModelState.IsValid) { return(View(requestAccessViewModel)); } string PHN = HttpContext.Session.GetString(Globals.currentPPHN); string patientSignPublicKey = HttpContext.Session.GetString(Globals.currentPSPubK); string doctorSignPrivatekey = HttpContext.Session.GetString(Globals.currentDSPriK); string doctorSignPublicKey = EncryptionService.getSignPublicKeyStringFromPrivate(doctorSignPrivatekey); string doctorAgreePrivatekey = HttpContext.Session.GetString(Globals.currentDAPriK); string doctorAgreePublicKey = EncryptionService.getAgreePublicKeyStringFromPrivate(doctorAgreePrivatekey); string keyword = requestAccessViewModel.keyword; // Searches for a patient with the specified PHN Assets <UserCredAssetData> userAsset = _bigChainDbService.GetUserAssetFromTypeID(AssetType.Patient, PHN); if (userAsset == null) { ModelState.AddModelError("", "Could not find a patient profile with PHN: " + PHN); return(View(requestAccessViewModel)); } // Decrypt the patient's fingerprint data stored in the Blockchain byte[] dbFpData = null; string patientSignPrivateKey, patientAgreePrivateKey; List <string> dbList = userAsset.data.Data.FingerprintData; List <Image> dbfpList = new List <Image>(); try { foreach (string db in dbList) { EncryptionService.decryptFingerprintData(PHN, keyword, db, out dbFpData); dbfpList.Add(FingerprintService.byteToImg(dbFpData)); } EncryptionService.getPrivateKeyFromIDKeyword(PHN, keyword, userAsset.data.Data.PrivateKeys, out patientSignPrivateKey, out patientAgreePrivateKey); } catch { ModelState.AddModelError("", "Keyword may be incorrect"); return(View(requestAccessViewModel)); } // Send request to the Client Computer to authenticate with fingerprint int numScans = 1; List <Image> fpList = FingerprintService.authenticateFP("24.84.225.22", numScans); // DEBUG: Jacob's Computer // Check if fingerprint data is valid if (fpList.Count < numScans) { ModelState.AddModelError("", "Something went wrong with the fingerprint scan, try again."); return(View(requestAccessViewModel)); } Image fpImg = fpList[0]; // Compare the scanned fingerprint with the one saved in the database if (!FingerprintService.compareFP(fpImg, dbfpList)) { ModelState.AddModelError("", "The fingerprint did not match, try again."); return(View(requestAccessViewModel)); } // Choose the types of records we want to get AssetType[] typeList = { AssetType.TestRequisition }; var recordList = _bigChainDbService.GetAllTypeRecordsFromPPublicKey <string> (typeList, patientSignPublicKey); foreach (var record in recordList) { MetaDataSaved <object> metadata = record.metadata; if (!metadata.AccessList.Keys.Contains(doctorSignPublicKey)) { var hashedKey = metadata.AccessList[patientSignPublicKey]; var dataDecryptionKey = EncryptionService.getDecryptedEncryptionKey(hashedKey, patientAgreePrivateKey); var newHash = EncryptionService.getEncryptedEncryptionKey(dataDecryptionKey, patientAgreePrivateKey, doctorAgreePublicKey); metadata.AccessList[doctorSignPublicKey] = newHash; _bigChainDbService.SendTransferTransactionToDataBase(record.id, metadata, patientSignPrivateKey, patientSignPublicKey, record.transID); } } return(RedirectToAction("PatientRecords")); }