public async Task <IActionResult> CastVote(UserSignedVoteDTO userSignedVoteDto) { var user = await _userManager.FindByNameAsync(userSignedVoteDto.UserName); // var result = await _userManager.VerifyUserTokenAsync(user, "EVoting", "Vote", userSignedVoteDto.Token); // if (!result) return Unauthorized(); var userDetail = await _context.UserDetails.FirstOrDefaultAsync(x => x.UserId == user.Id); var voteToCheck = new Vote() { EncryptedIV = userSignedVoteDto.Vote.EncryptedIV, EncryptedKey = userSignedVoteDto.Vote.EncryptedKey, EncryptedVote = userSignedVoteDto.Vote.EncryptedVote, VoterId = userSignedVoteDto.Vote.VoterId }; var userSignatureCheck = CryptoService.VerifySignature(Converters.ConvertToByteArray(voteToCheck), userSignedVoteDto.Signature, userDetail.PublicKey); if (!userSignatureCheck) { return(Unauthorized()); } var authPrivateKey = _authService.GetPrivateKey(); var authSignedVoteDto = new AuthSignedVoteDTO() { Vote = userSignedVoteDto.Vote, Signature = CryptoService.SignItem(Converters.ConvertToByteArray(userSignedVoteDto.Vote), authPrivateKey) }; //////////////////////// NODE PART TODO: Move to real nodes //////////////////////////////////// var authPublicKey = _authService.GetPublicKey(); var authSignatureCheck = CryptoService.VerifySignature(Converters.ConvertToByteArray(authSignedVoteDto.Vote) , authSignedVoteDto.Signature, authPublicKey); if (!authSignatureCheck) { return(Unauthorized()); } var nodePrivateKey = _nodeService.GetPrivateKey(); var nodeSignature = CryptoService.SignItem(Converters.ConvertToByteArray(authSignedVoteDto.Vote), nodePrivateKey); var transaction = new Transaction() { EncryptedIV = authSignedVoteDto.Vote.EncryptedIV, EncryptedKey = authSignedVoteDto.Vote.EncryptedKey, EncryptedVote = authSignedVoteDto.Vote.EncryptedVote, VoterId = authSignedVoteDto.Vote.VoterId, Signature = nodeSignature }; var nodePublicKey = _nodeService.GetPublicKey(); _blockchain.AddPublicKey("node", nodePublicKey); var transactionAddCheck = _blockchain.AddTransaction(transaction); if (!transactionAddCheck) { return(Unauthorized()); } _blockchain.MineBlock(); return(Ok(new BaseResponseDTO() { Success = true, Message = "Vote registered succesfully." })); }