예제 #1
0
        public UserSignedVoteDTO CastVote(Guid voterId, Guid candidateId, byte[] caPublicKey)
        {
            (var key, var iv) = CryptoService.GenerateSymmetricKeys();

            var encryptedVote = CryptoService.EncryptSymmetric(candidateId.ToByteArray(), key, iv);
            var encryptedKey  = CryptoService.EncryptAsymmetric(key, caPublicKey);
            var encryptedIV   = CryptoService.EncryptAsymmetric(iv, caPublicKey);

            var voterHash = CryptoService.HmacItem(voterId.ToByteArray(), _privateKey);

            var vote = new Vote()
            {
                VoterId       = voterHash,
                EncryptedKey  = encryptedKey,
                EncryptedIV   = encryptedIV,
                EncryptedVote = encryptedVote
            };

            var signature = CryptoService.SignItem(Converters.ConvertToByteArray(vote), _privateKey);

            var userSignedVote = new UserSignedVoteDTO()
            {
                Vote      = vote,
                Signature = signature
            };

            return(userSignedVote);
        }
예제 #2
0
        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."
            }));
        }