/// <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; }
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"); }
/// <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(); }
/// <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; }
/// <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; }
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; }
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); } } }
/// <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()); }