using System; using System.Windows.Forms; using nsoftware.SecureBlackbox; /// /// Summary description for SignForm. /// public class DecryptPropsForm : System.Windows.Forms.Form { private System.Windows.Forms.Button btnCancel; private System.Windows.Forms.Button btnOK; private System.Windows.Forms.OpenFileDialog dlgOpen; /// /// Required designer variable. /// private System.ComponentModel.Container components = null; private GroupBox gbGeneralEnc; private GroupBox gbKeyInfo; private Label lbCertificate; private Button btnBrowseCert; private TextBox edCertPassword; private TextBox edCert; private Label lbCertPassword; private TextBox edPassphrase; private Label lbPassphrase; private Label label1; private TextBox textInfo; private XMLDecryptor decryptor = null; public DecryptPropsForm(XMLDecryptor _decryptor) { // // Required for Windows Form Designer support // InitializeComponent(); // // TODO: Add any constructor code after InitializeComponent call // decryptor = _decryptor; String t = ""; if (_decryptor.UseGCM) t = "-GCM"; String s = "Encryption method: " + _decryptor.EncryptionMethod + t + Environment.NewLine; if (_decryptor.EncryptedDataType == XMLDecryptorEncryptedDataTypes.cxedtElement) t = "Element"; else if (_decryptor.EncryptedDataType == XMLDecryptorEncryptedDataTypes.cxedtContent) t = "Content"; else t = "External"; s = s + "Encrypted data type: " + t + Environment.NewLine; bool certRequired = false; if (_decryptor.EncryptKey) { s = s + "EncryptKey: true" + Environment.NewLine; if (_decryptor.KeyEncryptionType == XMLDecryptorKeyEncryptionTypes.cxetKeyTransport) { s = s + "Key encryption type: transport" + Environment.NewLine; if (_decryptor.KeyTransportMethod == XMLDecryptorKeyTransportMethods.cxktRSA15) t = "RSA v1.5"; else t = "RSA-OAEP"; s = s + "Key transport method: " + t + Environment.NewLine; certRequired = true; } else { s = s + "Key encryption type: wrap" + Environment.NewLine; s = s + "Key wrap method: " + _decryptor.KeyWrapMethod + Environment.NewLine; } } else s = s + "EncryptKey: false" + Environment.NewLine; t = _decryptor.Config("KeyName"); if (t.Length > 0) s = s + "Key name: " + t + Environment.NewLine; t = _decryptor.Config("MimeType"); if (t.Length > 0) s = s + "Mime type: " + t + Environment.NewLine; textInfo.Text = s; edPassphrase.Enabled = !certRequired; lbPassphrase.Enabled = !certRequired; edCert.Enabled = certRequired; lbCertificate.Enabled = certRequired; edCertPassword.Enabled = certRequired; lbCertPassword.Enabled = certRequired; btnBrowseCert.Enabled = certRequired; } /// /// Clean up any resources being used. /// protected override void Dispose(bool disposing) { if (disposing) { if (components != null) { components.Dispose(); } } base.Dispose(disposing); } #region Windows Form Designer generated code /// /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// private void InitializeComponent() { this.btnCancel = new System.Windows.Forms.Button(); this.btnOK = new System.Windows.Forms.Button(); this.dlgOpen = new System.Windows.Forms.OpenFileDialog(); this.gbGeneralEnc = new System.Windows.Forms.GroupBox(); this.textInfo = new System.Windows.Forms.TextBox(); this.gbKeyInfo = new System.Windows.Forms.GroupBox(); this.lbCertificate = new System.Windows.Forms.Label(); this.btnBrowseCert = new System.Windows.Forms.Button(); this.edCertPassword = new System.Windows.Forms.TextBox(); this.edCert = new System.Windows.Forms.TextBox(); this.lbCertPassword = new System.Windows.Forms.Label(); this.edPassphrase = new System.Windows.Forms.TextBox(); this.lbPassphrase = new System.Windows.Forms.Label(); this.label1 = new System.Windows.Forms.Label(); this.gbGeneralEnc.SuspendLayout(); this.gbKeyInfo.SuspendLayout(); this.SuspendLayout(); // // btnCancel // this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; this.btnCancel.Location = new System.Drawing.Point(272, 329); this.btnCancel.Name = "btnCancel"; this.btnCancel.Size = new System.Drawing.Size(75, 25); this.btnCancel.TabIndex = 7; this.btnCancel.Text = "Cancel"; // // btnOK // this.btnOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.btnOK.Location = new System.Drawing.Point(185, 329); this.btnOK.Name = "btnOK"; this.btnOK.Size = new System.Drawing.Size(75, 25); this.btnOK.TabIndex = 6; this.btnOK.Text = "OK"; this.btnOK.Click += new System.EventHandler(this.btnOK_Click); // // gbGeneralEnc // this.gbGeneralEnc.Controls.Add(this.textInfo); this.gbGeneralEnc.Controls.Add(this.gbKeyInfo); this.gbGeneralEnc.Location = new System.Drawing.Point(7, 55); this.gbGeneralEnc.Name = "gbGeneralEnc"; this.gbGeneralEnc.Size = new System.Drawing.Size(340, 265); this.gbGeneralEnc.TabIndex = 18; this.gbGeneralEnc.TabStop = false; this.gbGeneralEnc.Text = "General"; // // textInfo // this.textInfo.Location = new System.Drawing.Point(8, 16); this.textInfo.Multiline = true; this.textInfo.Name = "textInfo"; this.textInfo.ScrollBars = System.Windows.Forms.ScrollBars.Both; this.textInfo.Size = new System.Drawing.Size(325, 83); this.textInfo.TabIndex = 19; // // gbKeyInfo // this.gbKeyInfo.Controls.Add(this.lbCertificate); this.gbKeyInfo.Controls.Add(this.btnBrowseCert); this.gbKeyInfo.Controls.Add(this.edCertPassword); this.gbKeyInfo.Controls.Add(this.edCert); this.gbKeyInfo.Controls.Add(this.lbCertPassword); this.gbKeyInfo.Controls.Add(this.edPassphrase); this.gbKeyInfo.Controls.Add(this.lbPassphrase); this.gbKeyInfo.Location = new System.Drawing.Point(8, 105); this.gbKeyInfo.Name = "gbKeyInfo"; this.gbKeyInfo.Size = new System.Drawing.Size(325, 150); this.gbKeyInfo.TabIndex = 16; this.gbKeyInfo.TabStop = false; this.gbKeyInfo.Text = "Key/certificate properties "; // // lbCertificate // this.lbCertificate.AutoSize = true; this.lbCertificate.Location = new System.Drawing.Point(7, 75); this.lbCertificate.Name = "lbCertificate"; this.lbCertificate.Size = new System.Drawing.Size(109, 13); this.lbCertificate.TabIndex = 65; this.lbCertificate.Text = "Encryption certificate:"; // // btnBrowseCert // this.btnBrowseCert.Location = new System.Drawing.Point(244, 89); this.btnBrowseCert.Name = "btnBrowseCert"; this.btnBrowseCert.Size = new System.Drawing.Size(75, 25); this.btnBrowseCert.TabIndex = 64; this.btnBrowseCert.Text = "Browse ..."; this.btnBrowseCert.Click += new System.EventHandler(this.btnBrowseCert_Click); // // edCertPassword // this.edCertPassword.Location = new System.Drawing.Point(118, 123); this.edCertPassword.Name = "edCertPassword"; this.edCertPassword.PasswordChar = '*'; this.edCertPassword.Size = new System.Drawing.Size(201, 20); this.edCertPassword.TabIndex = 63; // // edCert // this.edCert.Location = new System.Drawing.Point(10, 92); this.edCert.Name = "edCert"; this.edCert.Size = new System.Drawing.Size(228, 20); this.edCert.TabIndex = 62; // // lbCertPassword // this.lbCertPassword.AutoSize = true; this.lbCertPassword.Location = new System.Drawing.Point(7, 126); this.lbCertPassword.Name = "lbCertPassword"; this.lbCertPassword.Size = new System.Drawing.Size(105, 13); this.lbCertPassword.TabIndex = 61; this.lbCertPassword.Text = "Certificate password:"; // // edPassphrase // this.edPassphrase.Location = new System.Drawing.Point(10, 41); this.edPassphrase.Name = "edPassphrase"; this.edPassphrase.Size = new System.Drawing.Size(309, 20); this.edPassphrase.TabIndex = 1; // // lbPassphrase // this.lbPassphrase.AutoSize = true; this.lbPassphrase.Location = new System.Drawing.Point(7, 25); this.lbPassphrase.Name = "lbPassphrase"; this.lbPassphrase.Size = new System.Drawing.Size(79, 13); this.lbPassphrase.TabIndex = 0; this.lbPassphrase.Text = "Key/Password:"; // // label1 // this.label1.AutoSize = true; this.label1.ForeColor = System.Drawing.SystemColors.Highlight; this.label1.Location = new System.Drawing.Point(4, 9); this.label1.Name = "label1"; this.label1.Size = new System.Drawing.Size(319, 39); this.label1.TabIndex = 22; this.label1.Text = "The XML document is encrypted. Depending on the document\'s \r\nencryption type you " + "would need to provide a decryption password \r\nor decryption certificate."; // // DecryptPropsForm // this.AcceptButton = this.btnOK; this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); this.CancelButton = this.btnCancel; this.ClientSize = new System.Drawing.Size(354, 361); this.Controls.Add(this.label1); this.Controls.Add(this.gbGeneralEnc); this.Controls.Add(this.btnCancel); this.Controls.Add(this.btnOK); this.Cursor = System.Windows.Forms.Cursors.Default; this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; this.MaximizeBox = false; this.Name = "DecryptPropsForm"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; this.Text = "Encryption properties"; this.gbGeneralEnc.ResumeLayout(false); this.gbGeneralEnc.PerformLayout(); this.gbKeyInfo.ResumeLayout(false); this.gbKeyInfo.PerformLayout(); this.ResumeLayout(false); this.PerformLayout(); } #endregion public Certificate LoadCertificate(string file, string password) { Certificate cert = null; if (file.Length > 0) { try { CertificateManager certmanager = new CertificateManager(); certmanager.ImportFromFile(file, password); cert = certmanager.Certificate; } catch (Exception e) { MessageBox.Show("Cannot load certificate!"); } } return cert; } private byte[] getKey(string algorithm) { int len = 0; if (algorithm.Equals("AES128", StringComparison.OrdinalIgnoreCase)) len = 16; else if (algorithm.Equals("AES192", StringComparison.OrdinalIgnoreCase)) len = 24; else if (algorithm.Equals("AES256", StringComparison.OrdinalIgnoreCase)) len = 32; else if (algorithm.Equals("Camellia128", StringComparison.OrdinalIgnoreCase)) len = 16; else if (algorithm.Equals("Camellia192", StringComparison.OrdinalIgnoreCase)) len = 24; else if (algorithm.Equals("Camellia256", StringComparison.OrdinalIgnoreCase)) len = 32; else if (algorithm.Equals("DES", StringComparison.OrdinalIgnoreCase)) len = 8; else if (algorithm.Equals("3DES", StringComparison.OrdinalIgnoreCase)) len = 24; else if (algorithm.Equals("RC4", StringComparison.OrdinalIgnoreCase)) len = 16; else if (algorithm.Equals("SEED", StringComparison.OrdinalIgnoreCase)) len = 16; // simple key derivation function from a Passphrase // TODO: replace with SHA256 hash or KDF string s = edPassphrase.Text; while (s.Length < len) s = s + "/" + edPassphrase.Text; byte[] res = new byte[len]; for (int i = 0; i < len; i++) res[i] = (byte)s[i]; return res; } private void btnBrowseCert_Click(object sender, EventArgs e) { dlgOpen.Title = "Select certificate file"; dlgOpen.Filter = "PEM-encoded certificate (*.pem)|*.PEM|DER-encoded certificate (*.cer)|*.CER|PFX-encoded certificate (*.pfx)|*.PFX"; if (dlgOpen.ShowDialog() == DialogResult.OK) edCert.Text = dlgOpen.FileName; } private void btnOK_Click(object sender, EventArgs e) { if (decryptor.EncryptKey) { if (decryptor.KeyEncryptionType == XMLDecryptorKeyEncryptionTypes.cxetKeyTransport) { try { decryptor.KeyDecryptionCertificate = LoadCertificate(edCert.Text, edCertPassword.Text); } catch (Exception ex) { MessageBox.Show(ex.Message); } } else { decryptor.KeyDecryptionKey = getKey(decryptor.KeyWrapMethod); } } else { decryptor.DecryptionKey = getKey(decryptor.EncryptionMethod); } this.DialogResult = DialogResult.OK; } }