Example #1
0
		public void LoadCertificatesFromStore() {
			int lastSelectedCertItem = CertificateItem;
			List<X509Certificate2> certs = SignatureProcessor.GetAllCertificatesFromStore(CertificateStore);
			Certificates.Clear();
			foreach(X509Certificate2 c in certs.Where((cert) => cert.HasPrivateKey)) {
				Certificates.Add(c);
			}
			CertificateItem = lastSelectedCertItem;
		}
Example #2
0
		public string SignWithSelectedCert(X509Certificate2 cert) {
			//use SignInfo from Session

			SignatureInfo si = Session.SignInfo;
			XmlDocument docToSign = new XmlDocument();
			docToSign.LoadXml(Session.DataToSign);
			string signedData = string.Empty;
			try {
				signedData = SignatureProcessor.Sign(Session.SignInfo.SigType, cert, docToSign, false, Session.SignInfo.NodeId);
			} catch (Exception e) {
				SetErrorMessage(e.Message);
			}

			return signedData;
		}
Example #3
0
		public bool SelectInteropCertificate() {

			X509Certificate2 selectedCert = new X509Certificate2();
			StoreLocation certificateStore = StoreLocation.CurrentUser;
			if ((selectedCert = SignatureProcessor.SelectCertificateUI(StoreLocation.CurrentUser)) == null) {
				certificateStore = StoreLocation.LocalMachine;
				selectedCert = SignatureProcessor.SelectCertificateUI(StoreLocation.LocalMachine);
			}
			/*
			selectedCert = SignatureProcessor.SelectCertificateUI(StoreLocation.CurrentUser) ??
											SignatureProcessor.SelectCertificateUI(StoreLocation.LocalMachine);
			*/
			if (selectedCert != null) {
				SetConfigField("InteropCertificateThumbprint", selectedCert.Thumbprint);
				SetConfigField("InteropCertificateStore", certificateStore.ToString());
				saveChangesToConfig();
				//LoadConfig();
				return true;
			}
			return false;
		}
Example #4
0
		private bool checkConfig(XDocument cfg) {
			string binConfigPath = cfg.Root?.Element("CfgBinPath")?.Value;
			string certFilePath = cfg.Root?.Element("CertificateFilePath")?.Value;

			StoreLocation storeLocation;
			StoreLocation.TryParse(cfg.Root?.Element("CertificateStore")?.Value, true, out storeLocation);
			if(storeLocation != 0) {
				CertificateStore = storeLocation;
			} else {
				CertificateStore = StoreLocation.CurrentUser;
				SetConfigField("CertificateStore", CertificateStore.ToString());
			}

			#region [set window position and size]

			string lastHeightStr = cfg.Root?.Element("WindowHeight")?.Value;
			string lastWidthStr = cfg.Root?.Element("WindowWidth")?.Value;
			string lastLeftStr = cfg.Root?.Element("WindowLeft")?.Value;
			string lastTopStr = cfg.Root?.Element("WindowTop")?.Value;

			if(!string.IsNullOrEmpty(lastHeightStr)) {
				WindowHeight = Int32.Parse(lastHeightStr);
			} else {
				WindowHeight = 780;
				SetConfigField("WindowHeight", WindowHeight.ToString());
			}

			if(!string.IsNullOrEmpty(lastWidthStr)) {
				WindowWidth = Int32.Parse(lastWidthStr);
			} else {
				WindowWidth = 590;
				SetConfigField("WindowWidth", WindowWidth.ToString());
			}

			if(!string.IsNullOrEmpty(lastLeftStr)) {
				WindowLeft = Int32.Parse(lastLeftStr);
			} else {
				WindowLeft = 100;
				SetConfigField("WindowLeft", WindowLeft.ToString());
			}

			if(!string.IsNullOrEmpty(lastTopStr)) {
				WindowTop = Int32.Parse(lastTopStr);
			} else {
				WindowTop = 20;
				SetConfigField("WindowTop", WindowTop.ToString());
			}
			#endregion

			string lastCertificateStr = cfg.Root?.Element("CertificateItem")?.Value;
			if(!string.IsNullOrEmpty(lastCertificateStr)) {
				CertificateItem = Int32.Parse(lastCertificateStr);
			} else {
				CertificateItem = 0;
				SetConfigField("CertificateItem", CertificateItem.ToString());
			}

			string interopCertificateThumb = cfg.Root?.Element("InteropCertificateThumbprint")?.Value;
			if (string.IsNullOrEmpty(interopCertificateThumb)) {
//				Thread.Sleep(1000);
				SetErrorMessage("Не указан сертификат подписи для взаимодействия");
					bool certSelected = SelectInteropCertificate();
					if (!certSelected) {

						MessageBox.Show(
							"Не указан сертификат подписи для взаимодействия.\nУкажите сертификат подписи, используя соответствующий пункт меню «Настройка» программы.",
							"Ошибка загрузки начальной конфигурации.", MessageBoxButton.OK,
							MessageBoxImage.Error);

						return false;
					} else {
						StoreLocation.TryParse(cfg.Root?.Element("InteropCertificateStore")?.Value,
												true,
												out _interopCertificateStoreLocation);
					}
			} else {
				_interopCertificateThumbprint = interopCertificateThumb;
				StoreLocation.TryParse(cfg.Root?.Element("InteropCertificateStore")?.Value, true, out _interopCertificateStoreLocation);
			}

			saveChangesToConfig();

			//signed (and siphered) binary config
			if(string.IsNullOrEmpty(binConfigPath)) {
				SetErrorMessage("Личный конфигурационный файл не найден");
				bool privateConfigSelected = LoadPrivateConfig();
				if (!privateConfigSelected) {

					MessageBox.Show("Личный конфигурационный файл не найден.\nСкачайте новый личный конфигурационный файл с корпоративного портала.",
									"Ошибка загрузки начальной конфигурации.", MessageBoxButton.OK, MessageBoxImage.Error);

					return false;
				}
			} else {
				//means htere is a config
				//check it's signature, but first load our certificate
				if(string.IsNullOrEmpty(certFilePath)) {
					MessageBox.Show("Файл сертификата сервера не найден.\nСкачайте файл сертификата сервера с корпоративного портала.",
								"Ошибка загрузки начальной конфигурации.", MessageBoxButton.OK, MessageBoxImage.Error);
					SetErrorMessage("Файл сертификата сервера не найден");
					bool serverCertifcateSelected = LoadServerCertificate();
					if (!serverCertifcateSelected) {
						return false;
					}
				} else {
					//means certificate && config present
					//check cert expiration date
					X509Certificate2 cert = new X509Certificate2();
					try {
						cert.Import(certFilePath);
						if (cert.NotAfter > DateTime.Now) {
							//cert ok
							//check config signature
							string configContents = Util.DecryptConfig(binConfigPath,ProgramFolder);
							if (string.IsNullOrEmpty(configContents)) {
								MessageBox.Show("Личный конфигурационный файл поврежден.\nСкачайте новый личный конфигурационный файл с корпоративного портала.",
									"Ошибка загрузки начальной конфигурации.", MessageBoxButton.OK, MessageBoxImage.Error);
								SetErrorMessage("Личный конфигурационный файл поврежден");
								return false;
							}
							XmlDocument xdocConfig = new XmlDocument();     // this stuff is for

							try {
								xdocConfig.LoadXml(configContents); // check signature further
							} catch (Exception e) {
								MessageBox.Show(
									$"Личный конфигурационный файл поврежден.\nСкачайте новый личный конфигурационный файл с корпоративного портала.\n\n{e.Message}",
									"Ошибка загрузки начальной конфигурации.", MessageBoxButton.OK, MessageBoxImage.Error);
								SetErrorMessage("Личный конфигурационный файл поврежден");
								return false;
							}

							XDocument privateConfig = XDocument.Parse(configContents);
							try {
								#if !DEBUG
								if (SignatureProcessor.VerifySignature(SignatureProcessor.SignatureType.Smev3SidebysideDetached, xdocConfig, cert)) {
								#endif
								#if DEBUG
								if(SignatureProcessor.VerifySignature(SignatureProcessor.SignatureType.Smev3SidebysideDetached, xdocConfig)) {
								#endif
									//config signature OK - loading contents
									if (privateConfig.Root?.Attribute("version").Value == ProgramVersion) {
										//means config version corresponds to a program version

										_ourCertificate = cert;
										_serverUri = new Uri(privateConfig.Root?.Element("Server").Element("GetFileUri")?.Value ?? "");
										_serverSignatureCertificateThumbprint = privateConfig.Root?.Element("Server").Element("CertificateThumbprint")?.Value ?? "";
										_serverHttpsCertificateThumbprint =
											privateConfig.Root?.Element("Server").Element("SSLCertificateThumbprint")?.Value ?? "";
										ClearError("Конфигурационный файл успешно загружен");
									} else {
										//means version in config is not right one
										MessageBox.Show(
											$"Текущая версия программы <{ProgramVersion}> устарела.\nСкачайте новую версию с корпоративного портала.",
											"Программа устарела.", MessageBoxButton.OK, MessageBoxImage.Error);
										SetErrorMessage($"Установленная версия программы <{ProgramVersion}> устарела");
										return false;
									}
								} else {
									//signature incorrect
									Debug.WriteLine("Invalid Signature");
									MessageBox.Show(
										"Личный конфигурационный файл поврежден.\nСкачайте новый личный конфигурационный файл с корпоративного портала.",
										"Ошибка загрузки начальной конфигурации.", MessageBoxButton.OK, MessageBoxImage.Error);
									SetErrorMessage("Личный конфигурационный файл поврежден");
									return false;
								}
							} catch (Exception e) {
								MessageBox.Show(
										$"Личный конфигурационный файл поврежден.\nСкачайте новый личный конфигурационный файл с корпоративного портала.\n\n{e.Message}",
										"Ошибка загрузки начальной конфигурации.", MessageBoxButton.OK, MessageBoxImage.Error);
								SetErrorMessage("Личный конфигурационный файл поврежден");
								return false;
							}

						} else {
							//cert expired
							MessageBox.Show("Файл сертификата сервера просрочен.\nСкачайте новый файл сертификата сервера с корпоративного портала.",
								"Ошибка загрузки начальной конфигурации.", MessageBoxButton.OK, MessageBoxImage.Error);
							SetErrorMessage("Файл сертификата сервера просрочен");
							return false;
						}
					} catch (Exception e) {
						//certificate corrupted
						MessageBox.Show($"Ошибка загрузки сертификата сервера. Файл поврежден.\nСкачайте новый файл сертификата сервера с корпоративного портала.\n\n{e.Message}",
								"Ошибка загрузки начальной конфигурации.", MessageBoxButton.OK, MessageBoxImage.Error);
						SetErrorMessage("Ошибка загрузки сертификата сервера");
						return false;
					}
				}
			}
			return true;
		}
Example #5
0
        public SigningSession(string sessionMessage)
        {
            /*
             * <SessionResponse version='1.1'>
             *              <SigningInfo id="SIGNED_BY_SERVER" session_id="..." vsrsion="...">
             *                              <DocumentToSign>PE1haW4+Cgk8YXBwX2lkPtCg0YPRgdGB0LrQuNC1INCx0YPQutCy0Ys8L2FwcF9pZD4KCTxzZW5kZXJfaWQ+0KHQvdC+0LLQsCDQsdGD0LrQstGLPC9zZW5kZXJfaWQ+Cgk8c2VydmljZV9pZD4xMDAwMTAwNTQ4NTwvc2VydmljZV9pZD4KPC9NYWluPg==</DocumentToSign>
             *                              <DocumentXsl>PHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iPgoJPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iL01haW4iPgoJCTxwPjxzdHJvbmc+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii8vYXBwX2lkIi8+PC9zdHJvbmc+PC9wPgoJCTxwPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvL3NlbmRlcl9pZCIvPjwvcD4KCQk8cD48dT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iLy9zZXJ2aWNlX2lkIi8+PC91PjwvcD4KCTwveHNsOnRlbXBsYXRlPgo8L3hzbDpzdHlsZXNoZWV0Pg==</DocumentXsl>
             *                              <SignatureInfo>
             *                                              <Type>enveloped</Type>
             *                                              <NodeId> *
             *                                                              SIGNED_1
             *                                              </NodeId>
             *                              </SignatureInfo>
             *              </SigningInfo>
             *              <Signature/>
             *      </SessionResponse>
             */

            Success            = false;
            SignatureIsCorrect = false;
            VersionIsCorrect   = false;

            ServerSessionMessage = XDocument.Parse(sessionMessage);
            if ((RequestedProgramVersion = ServerSessionMessage.Root.Attribute("version").Value) != MainViewModel.ProgramVersion)
            {
                return;
            }
            SessionId        = ServerSessionMessage.Root?.Element("SigningInfo").Attribute("session_id").Value ?? string.Empty;
            VersionIsCorrect = true;

            XmlDocument signedDoc = new XmlDocument();

            signedDoc.LoadXml(sessionMessage);
                        #if !DEBUG
            if (!SignatureProcessor.VerifySignature(SignatureProcessor.SignatureType.Smev2SidebysideDetached, signedDoc))
            {
                return;
            }
                        #endif
            SignatureIsCorrect = true;

            DataToSign =
                Encoding.UTF8.GetString(
                    Convert.FromBase64String(
                        ServerSessionMessage.Root.Descendants("DocumentToSign").First().Value
                        )
                    );

            DocToSign = XDocument.Parse(DataToSign);
            try {
                XslStylesheet =
                    XDocument.Parse(
                        Encoding.UTF8.GetString(
                            Convert.FromBase64String(
                                ServerSessionMessage.Root.Descendants("DocumentXsl").First().Value
                                )
                            )
                        );
                HumanReadableHtml = _transformDoc();
            } catch (Exception) {
                HumanReadableHtml = DocToSign.Root.ToString();
            }
            SignInfo = new SignatureInfo(ServerSessionMessage.Root.Descendants("SignatureInfo").First());
            Success  = VersionIsCorrect || SignatureIsCorrect;
        }