Пример #1
0
 /// <summary>
 /// Create a new voting procedure.
 /// </summary>
 /// <param name="logger">Logs messages to file.</param>
 /// <param name="DataAccess.DbConnection">Connection to the database.</param>
 /// <param name="parameters">Voting parameters.</param>
 /// <param name="rootCertificate">Certificate storage.</param>
 public VotingServerEntity(
     VotingRpcServer server,
     Signed<VotingParameters> signedParameters,
     ICertificateStorage certificateStorage,
     ServerCertificate serverCertificate)
     : this(server, signedParameters, certificateStorage, serverCertificate, VotingStatus.New)
 {
     this.lastProcessTime = DateTime.Now;
 }
Пример #2
0
        public void MyTestInitialize()
        {
            CACertificate rootCertificate = new CACertificate(null, "Root CA");
              rootCertificate.CreateSelfSignature();
              rootCertificate.Save("root.pi-cert");

              ServerCertificate serverCertificate = new ServerCertificate("Server");
              serverCertificate.CreateSelfSignature();
              serverCertificate.AddSignature(rootCertificate, DateTime.Now.AddDays(1));
              serverCertificate.Save("server.pi-cert");
        }
Пример #3
0
        /// <summary>
        /// Create the voting server.
        /// </summary>
        public VotingRpcServer()
        {
            this.lastProcess = DateTime.Now;

              this.logger = new Logger(Pirate.PiVote.Logger.ServerLogFileName, LogLevel.Info);
              Logger.Log(LogLevel.Info, "Voting RPC server starting...");

              this.serverConfig = new ServerConfig(ServerConfigFileName);
              this.serverConfig.ValidateMail(Logger);
              Logger.Log(LogLevel.Info, "Config file is read.");

              RemoteConfig = new RemoteStoredConfig(RemoteConfigFileName);
              Logger.Log(LogLevel.Info, "Remote config file is read.");

              Mailer = new Mailer(this.serverConfig, this.logger);
              Logger.Log(LogLevel.Info, "Mailer is set up.");

              this.dbConnection = new MySqlConnection(this.serverConfig.MySqlConnectionString);
              this.dbConnection.Open();
              Logger.Log(LogLevel.Info, "Database connection is open.");

              CertificateStorage = new DatabaseCertificateStorage(this.dbConnection);

              if (!CertificateStorage.TryLoadRoot())
              {
            Logger.Log(LogLevel.Error, "Root certificate file not found.");
            this.dbConnection.Close();
            throw new InvalidOperationException("Root certificate file not found.");
              }

              CertificateStorage.ImportStorageIfNeed();
              Logger.Log(LogLevel.Info, "Certificate storage is loaded.");

              this.serverCertificate = CertificateStorage.LoadServerCertificate();
              Logger.Log(LogLevel.Info, "Server certificate is loaded.");

              LoadVotings();
              Logger.Log(LogLevel.Info, "Votings are loaded.");

              ////OutputReport();
        }
Пример #4
0
        /// <summary>
        /// Create a new voting procedure.
        /// </summary>
        /// <param name="logger">Logs messages to file.</param>
        /// <param name="DataAccess.DbConnection">Connection to the database.</param>
        /// <param name="parameters">Voting parameters.</param>
        /// <param name="rootCertificate">Certificate storage.</param>
        /// <param name="status">Voting status.</param>
        public VotingServerEntity(
            VotingRpcServer server,
            Signed<VotingParameters> signedParameters,
            ICertificateStorage certificateStorage,
            ServerCertificate serverCertificate,
            VotingStatus status)
        {
            if (server == null)
            throw new ArgumentNullException("server");
              if (signedParameters == null)
            throw new ArgumentNullException("signedParameters");
              if (serverCertificate == null)
            throw new ArgumentNullException("serverCertificate");

              Server = server;
              this.lastProcessTime = DateTime.Now;
              this.certificateStorage = certificateStorage;
              this.serverCertificate = serverCertificate;
              this.signedParameters = signedParameters;
              this.parameters = this.signedParameters.Value;
              this.status = status;
        }
Пример #5
0
 /// <summary>
 /// Creates a copy of the certificate.
 /// </summary>
 /// <param name="original">Original certificate to copy.</param>
 /// <param name="onlyPublicPart">Leave the private key out?</param>
 protected ServerCertificate(ServerCertificate original, bool onlyPublicPart)
     : base(original, onlyPublicPart)
 {
     this.fullName = original.fullName;
 }
Пример #6
0
        private bool ConnectToServer()
        {
            table.AddHeaderRow(2, "Pi-Vote Server");

              string fileName = Path.Combine(Request.PhysicalApplicationPath, "server.pi-cert");

              if (File.Exists(fileName))
              {
            this.serverCertificate = Serializable.Load<ServerCertificate>(fileName);
              }
              else
              {
            table.AddRow("Connection:", "N/A");
            table.AddRow(string.Empty, "Server certifcate not found.");
            table.AddSpaceRow(2, 32);
            return false;
              }

              try
              {
            this.client = new TcpRpcClient();
            this.client.Connect(new IPEndPoint(IPAddress.Loopback, 4242));
            this.proxy = new VotingRpcProxy(client);
              }
              catch
              {
            table.AddRow("Connection:", "Failed");
            table.AddRow(string.Empty, "Pi-Vote server connection failed.");
            table.AddSpaceRow(2, 32);
            return false;
              }

              try
              {
            var result = proxy.FetchCertificateStorage();
            this.certificateStorage = new CertificateStorage();
            this.certificateStorage.TryLoadRoot(Request.PhysicalApplicationPath);
            this.certificateStorage.Add(result.First);
              }
              catch
              {
            table.AddRow("Connection:", "Failed");
            table.AddRow(string.Empty, "Cannot download certificate storage.");
            table.AddSpaceRow(2, 32);
            return false;
              }

              table.AddRow("Connection:", "Ok");
              table.AddSpaceRow(2, 32);
              return true;
        }
Пример #7
0
        private void createServerCertifiToolStripMenuItem_Click(object sender, EventArgs e)
        {
            CreateServerDialog dialog = new CreateServerDialog();

              if (dialog.ShowDialog() == DialogResult.OK)
              {
            SaveFileDialog saveDialog = new SaveFileDialog();
            saveDialog.Title = "Save Server Certificate";
            saveDialog.CheckPathExists = true;
            saveDialog.Filter = Files.CertificateFileFilter;

            if (saveDialog.ShowDialog() == DialogResult.OK)
            {
              ServerCertificate certificate = new ServerCertificate(dialog.FullName);
              certificate.CreateSelfSignature();

              SignatureRequest request = new SignatureRequest(dialog.FullName, string.Empty, string.Empty);
              Secure<SignatureRequest> signedRequest = new Secure<SignatureRequest>(request, CaCertificate, certificate);

              CertificateAuthorityEntry entry = new CertificateAuthorityEntry(signedRequest);
              entry.Sign(CaCertificate, DateTime.Now, dialog.ValidUntil);
              certificate.AddSignature(entry.Response.Value.Signature);

              string entryFileName = DataPath(entry.Certificate.Id.ToString() + ".pi-ca-entry");
              entry.Save(DataPath(entryFileName));

              ListEntry listEntry = new ListEntry(entryFileName, entry, CaCertificate);
              Entries.Add(listEntry);
              this.entryListView.Items.Add(listEntry.CreateItem(CaCertificate));

              certificate.Save(saveDialog.FileName);
            }
              }
        }
Пример #8
0
        /// <summary>
        /// Voting entity test.
        /// </summary>
        /// <remarks>
        /// Used only during development.
        /// </remarks>
        public void EntityTest()
        {
            IRpcConnection connection = new DummyConnection();

              DateTime validUntil = DateTime.Now.AddDays(1);
              var root = new CACertificate(null, "Root");
              root.CreateSelfSignature();
              var rootCrl = new RevocationList(root.Id, DateTime.Now, validUntil, new List<Guid>());
              var sigRootCrl = new Signed<RevocationList>(rootCrl, root);

              var intermediate = new CACertificate(null, "Intermediate");
              intermediate.CreateSelfSignature();
              intermediate.AddSignature(root, validUntil);
              var intCrl = new RevocationList(intermediate.Id, DateTime.Now, validUntil, new List<Guid>());
              var sigIntCrl = new Signed<RevocationList>(intCrl, intermediate);

              var admin = new AdminCertificate(Language.English, null, "Admin");
              admin.CreateSelfSignature();
              admin.AddSignature(intermediate, DateTime.Now.AddDays(1));

              var serverCert = new ServerCertificate("Server");
              serverCert.CreateSelfSignature();
              serverCert.AddSignature(intermediate, DateTime.Now.AddDays(1));

              VotingParameters parameters =
            new VotingParameters(
              new MultiLanguageString("Zufrieden"),
              new MultiLanguageString("Tada"),
              new MultiLanguageString(string.Empty),
              DateTime.Now,
              DateTime.Now.AddDays(1),
              0);
              parameters.GenerateNumbers(Files.TestDataPath);

              Question question = new Question(new MultiLanguageString("Zufrieden?"), new MultiLanguageString(string.Empty), new MultiLanguageString(string.Empty), 1);
              question.AddOption(new Option(new MultiLanguageString("Nein"), new MultiLanguageString("Dagegen"), new MultiLanguageString(string.Empty)));
              question.AddOption(new Option(new MultiLanguageString("Ja"), new MultiLanguageString("Dafür"), new MultiLanguageString(string.Empty)));
              parameters.AddQuestion(question);

              Signed<VotingParameters> signedParameters = new Signed<VotingParameters>(parameters, admin);

              DateTime start = DateTime.Now;
              Console.WriteLine();
              Console.Write("Voting begins...");

              CertificateStorage serverCertStorage = new CertificateStorage();
              serverCertStorage.AddRoot(root);
              serverCertStorage.Add(intermediate);
              serverCertStorage.AddRevocationList(sigRootCrl);
              serverCertStorage.AddRevocationList(sigIntCrl);

              VotingServerEntity vs = new VotingServerEntity(null, signedParameters, serverCertStorage, serverCert);

              var a1c = new AuthorityCertificate(Language.English, "Authority 1", null);
              a1c.CreateSelfSignature();
              a1c.AddSignature(intermediate, validUntil);
              var a2c = new AuthorityCertificate(Language.English, "Authority 2", null);
              a2c.CreateSelfSignature();
              a2c.AddSignature(intermediate, validUntil);
              var a3c = new AuthorityCertificate(Language.English, "Authority 3", null);
              a3c.CreateSelfSignature();
              a3c.AddSignature(intermediate, validUntil);
              var a4c = new AuthorityCertificate(Language.English, "Authority 4", null);
              a4c.CreateSelfSignature();
              a4c.AddSignature(intermediate, validUntil);
              var a5c = new AuthorityCertificate(Language.English, "Authority 5", null);
              a5c.CreateSelfSignature();
              a5c.AddSignature(intermediate, validUntil);

              var a1 = new AuthorityEntity(serverCertStorage, a1c);
              var a2 = new AuthorityEntity(serverCertStorage, a2c);
              var a3 = new AuthorityEntity(serverCertStorage, a3c);
              var a4 = new AuthorityEntity(serverCertStorage, a4c);
              var a5 = new AuthorityEntity(serverCertStorage, a5c);

              vs.AddAuthority(connection, a1.Certificate);
              vs.AddAuthority(connection, a2.Certificate);
              vs.AddAuthority(connection, a3.Certificate);
              vs.AddAuthority(connection, a4.Certificate);
              vs.AddAuthority(connection, a5.Certificate);

              a1.Prepare(1, vs.SignedParameters);
              a2.Prepare(2, vs.SignedParameters);
              a3.Prepare(3, vs.SignedParameters);
              a4.Prepare(4, vs.SignedParameters);
              a5.Prepare(5, vs.SignedParameters);

              a1.SetAuthorities(vs.AuthorityList);
              a2.SetAuthorities(vs.AuthorityList);
              a3.SetAuthorities(vs.AuthorityList);
              a4.SetAuthorities(vs.AuthorityList);
              a5.SetAuthorities(vs.AuthorityList);

              vs.DepositShares(connection, a1.GetShares());
              vs.DepositShares(connection, a2.GetShares());
              vs.DepositShares(connection, a3.GetShares());
              vs.DepositShares(connection, a4.GetShares());
              vs.DepositShares(connection, a5.GetShares());

              var r1 = a1.VerifyShares(vs.GetAllShares());
              var r2 = a2.VerifyShares(vs.GetAllShares());
              var r3 = a3.VerifyShares(vs.GetAllShares());
              var r4 = a4.VerifyShares(vs.GetAllShares());
              var r5 = a5.VerifyShares(vs.GetAllShares());

              vs.DepositShareResponse(connection, r1);
              vs.DepositShareResponse(connection, r2);
              vs.DepositShareResponse(connection, r3);
              vs.DepositShareResponse(connection, r4);
              vs.DepositShareResponse(connection, r5);

              var v1c = new VoterCertificate(Language.English, null, 0);
              v1c.CreateSelfSignature();
              v1c.AddSignature(intermediate, validUntil);

              var cs = new CertificateStorage();
              cs.AddRoot(root);
              var v1 = new VoterEntity(cs);

              IEnumerable<int> questionVota = new int[] { 0, 1 };

              var vote1 = v1.Vote(vs.GetVotingMaterial(), v1c, new IEnumerable<int>[] { questionVota }, null);

              vs.Vote(connection, vote1);

              int voters = 10;

              for (int i = 1000; i < 1000 + voters; i++)
              {
            var vc = new VoterCertificate(Language.English, null, 0);
            vc.CreateSelfSignature();
            vc.AddSignature(intermediate, validUntil);

            var vx = new VoterEntity(cs);

            IEnumerable<int> questionVota2 = new int[] { 0, 1 };
            var votex = vx.Vote(vs.GetVotingMaterial(), vc, new IEnumerable<int>[] { questionVota2 }, null);

            vs.Vote(connection, votex);
              }

              for (int i = 2000; i < 2000 + voters; i++)
              {
            var vc = new VoterCertificate(Language.English, null, 0);
            vc.CreateSelfSignature();
            vc.AddSignature(intermediate, validUntil);

            var vx = new VoterEntity(cs);

            IEnumerable<int> questionVota3 = new int[] { 1, 0 };
            var votex = vx.Vote(vs.GetVotingMaterial(), vc, new IEnumerable<int>[] { questionVota3 }, null);

            vs.Vote(connection, votex);
              }

              vs.EndVote();

              a1.TallyBegin(vs.GetVotingMaterial());
              a2.TallyBegin(vs.GetVotingMaterial());
              a3.TallyBegin(vs.GetVotingMaterial());
              a4.TallyBegin(vs.GetVotingMaterial());
              a5.TallyBegin(vs.GetVotingMaterial());

              for (int envelopeIndex = 0; envelopeIndex < vs.GetEnvelopeCount(); envelopeIndex++)
              {
            a1.TallyAdd(envelopeIndex, vs.GetEnvelope(envelopeIndex), new Progress(null));
            a2.TallyAdd(envelopeIndex, vs.GetEnvelope(envelopeIndex), new Progress(null));
            a3.TallyAdd(envelopeIndex, vs.GetEnvelope(envelopeIndex), new Progress(null));
            a4.TallyAdd(envelopeIndex, vs.GetEnvelope(envelopeIndex), new Progress(null));
            a5.TallyAdd(envelopeIndex, vs.GetEnvelope(envelopeIndex), new Progress(null));
              }

              var pd1 = a1.PartiallyDecipher();
              var pd2 = a2.PartiallyDecipher();
              var pd3 = a3.PartiallyDecipher();
              var pd4 = a4.PartiallyDecipher();
              var pd5 = a5.PartiallyDecipher();

              vs.DepositPartialDecipher(connection, pd1);
              vs.DepositPartialDecipher(connection, pd2);
              vs.DepositPartialDecipher(connection, pd3);
              vs.DepositPartialDecipher(connection, pd4);
              vs.DepositPartialDecipher(connection, pd5);

              v1.TallyBegin(vs.GetVotingMaterial(), BaseParameters.StandardProofCount);

              for (int envelopeIndex = 0; envelopeIndex < vs.GetEnvelopeCount(); envelopeIndex++)
              {
            v1.TallyAdd(envelopeIndex, vs.GetEnvelope(envelopeIndex), new Progress(null));
              }

              for (int authorityIndex = 1; authorityIndex < vs.Parameters.AuthorityCount + 1; authorityIndex++)
              {
            v1.TallyAddPartialDecipher(vs.GetPartialDecipher(authorityIndex));
              }

              var res1 = v1.TallyResult;

              TimeSpan duration = DateTime.Now.Subtract(start);
              Console.WriteLine("Succeded {0}", duration.ToString());
        }