private void ExportKey(ListItemEntry entry, String algorithm, char[] password, String path) { AsymmetricKeyEntry keyentry = _store.GetKey(entry.Alias); string pem = PemUtilities.Encode(keyentry.Key, algorithm, password, Repository.Srand); File.WriteAllText(path, pem); }
private static PemObject CreatePemObject(object obj, string algorithm, char[] password, SecureRandom random) { if (obj == null) { throw new ArgumentNullException("obj"); } if (algorithm == null) { throw new ArgumentNullException("algorithm"); } if (password == null) { throw new ArgumentNullException("password"); } if (random == null) { throw new ArgumentNullException("random"); } if (obj is AsymmetricCipherKeyPair) { return(CreatePemObject(((AsymmetricCipherKeyPair)obj).Private, algorithm, password, random)); } string text = null; byte[] array = null; if (obj is AsymmetricKeyParameter) { AsymmetricKeyParameter asymmetricKeyParameter = (AsymmetricKeyParameter)obj; if (asymmetricKeyParameter.IsPrivate) { array = EncodePrivateKey(asymmetricKeyParameter, out string keyType); text = keyType + " PRIVATE KEY"; } } if (text == null || array == null) { throw new PemGenerationException("Object type not supported: " + Platform.GetTypeName(obj)); } string text2 = Platform.ToUpperInvariant(algorithm); if (text2 == "DESEDE") { text2 = "DES-EDE3-CBC"; } int num = Platform.StartsWith(text2, "AES-") ? 16 : 8; byte[] array2 = new byte[num]; random.NextBytes(array2); byte[] content = PemUtilities.Crypt(encrypt: true, array, password, text2, array2); IList list = Platform.CreateArrayList(2); list.Add(new PemHeader("Proc-Type", "4,ENCRYPTED")); list.Add(new PemHeader("DEK-Info", text2 + "," + Hex.ToHexString(array2))); return(new PemObject(text, list, content)); }
private void ExportCertificate(object param) { var entry = (ListItemEntry)param; String filename; FileUtils.SaveFileUI("Select the path to store certificate", out filename); if (filename != null) { File.WriteAllText(filename, PemUtilities.Encode(entry.Certificate)); } }
void NewKeyStore(object o) { var passwordBoxes = (object[])o; var errors = ValidateInputs(passwordBoxes); if (!errors.ToString().IsNullOrEmpty()) { MessageBoxContent = new MessageBoxViewModel(CloseMessageBox, MessageBoxModel.Error("Errors generating Certificate - " + Environment.NewLine + errors.ToString())); IsMessageBoxVisible = true; return; } var password = ((PasswordBox)passwordBoxes[0]).Password.ToCharArray(); var keygen = KeyPairUtils.CreateGenerator(Repository.Srand, Model.KeyPairGenerator, Model.KeyStrength); var keypair = keygen.GenerateKeyPair(); var repo = Repository.Instance; repo.NewCertificateAuthority(Model.CARepositoryPath, password); repo.KeyPairType = Model.KeyPairType; var cert = X509Utils.GenerateCACertificate(Model.X509Name, Model.Validity, keypair.Public, keypair.Private, Model.SignatureAlgorithm, KeyUsageUtils.GetKeyUsage(Model.KeyUsages), Model.ExtendedKeyUsages == null ? null : new ExtendedKeyUsage(KeyUsageUtils.GetExtendedKeyUsages(Model.ExtendedKeyUsages)), Model.PathLenContraint); X509Utils.ExportPKCS12(Repository.Instance.CAKeyStore, /*Model.CommonName*/ "ca", keypair.Private, password, cert); File.WriteAllText(Repository.CaPfxFilename, PemUtilities.Encode(cert)); _newCaCompletedAction.Invoke(new KeyStoreViewModel(password, Model.CARepositoryPath)); //KeyStoreViewModelEx.Instance.Load(password); }
private object ReadPrivateKey(PemObject pemObject) { string text = pemObject.Type.Substring(0, pemObject.Type.Length - "PRIVATE KEY".Length).Trim(); byte[] array = pemObject.Content; IDictionary dictionary = Platform.CreateHashtable(); foreach (PemHeader header in pemObject.Headers) { dictionary[header.Name] = header.Value; } string a = (string)dictionary["Proc-Type"]; if (a == "4,ENCRYPTED") { if (pFinder == null) { throw new PasswordException("No password finder specified, but a password is required"); } char[] password = pFinder.GetPassword(); if (password == null) { throw new PasswordException("Password is null, but a password is required"); } string text2 = (string)dictionary["DEK-Info"]; string[] array2 = text2.Split(','); string dekAlgName = array2[0].Trim(); byte[] iv = Hex.Decode(array2[1].Trim()); array = PemUtilities.Crypt(encrypt: false, array, password, dekAlgName, iv); } try { Asn1Sequence instance = Asn1Sequence.GetInstance(array); AsymmetricKeyParameter publicParameter; AsymmetricKeyParameter asymmetricKeyParameter; switch (text) { case "RSA": { if (instance.Count != 9) { throw new PemException("malformed sequence in RSA private key"); } RsaPrivateKeyStructure instance2 = RsaPrivateKeyStructure.GetInstance(instance); publicParameter = new RsaKeyParameters(isPrivate: false, instance2.Modulus, instance2.PublicExponent); asymmetricKeyParameter = new RsaPrivateCrtKeyParameters(instance2.Modulus, instance2.PublicExponent, instance2.PrivateExponent, instance2.Prime1, instance2.Prime2, instance2.Exponent1, instance2.Exponent2, instance2.Coefficient); break; } case "DSA": { if (instance.Count != 6) { throw new PemException("malformed sequence in DSA private key"); } DerInteger derInteger = (DerInteger)instance[1]; DerInteger derInteger2 = (DerInteger)instance[2]; DerInteger derInteger3 = (DerInteger)instance[3]; DerInteger derInteger4 = (DerInteger)instance[4]; DerInteger derInteger5 = (DerInteger)instance[5]; DsaParameters parameters = new DsaParameters(derInteger.Value, derInteger2.Value, derInteger3.Value); asymmetricKeyParameter = new DsaPrivateKeyParameters(derInteger5.Value, parameters); publicParameter = new DsaPublicKeyParameters(derInteger4.Value, parameters); break; } case "EC": { ECPrivateKeyStructure instance3 = ECPrivateKeyStructure.GetInstance(instance); AlgorithmIdentifier algID = new AlgorithmIdentifier(X9ObjectIdentifiers.IdECPublicKey, instance3.GetParameters()); PrivateKeyInfo keyInfo = new PrivateKeyInfo(algID, instance3.ToAsn1Object()); asymmetricKeyParameter = PrivateKeyFactory.CreateKey(keyInfo); DerBitString publicKey = instance3.GetPublicKey(); if (publicKey != null) { SubjectPublicKeyInfo keyInfo2 = new SubjectPublicKeyInfo(algID, publicKey.GetBytes()); publicParameter = PublicKeyFactory.CreateKey(keyInfo2); } else { publicParameter = ECKeyPairGenerator.GetCorrespondingPublicKey((ECPrivateKeyParameters)asymmetricKeyParameter); } break; } case "ENCRYPTED": { char[] password2 = pFinder.GetPassword(); if (password2 == null) { throw new PasswordException("Password is null, but a password is required"); } return(PrivateKeyFactory.DecryptKey(password2, EncryptedPrivateKeyInfo.GetInstance(instance))); } case "": return(PrivateKeyFactory.CreateKey(PrivateKeyInfo.GetInstance(instance))); default: throw new ArgumentException("Unknown key type: " + text, "type"); } return(new AsymmetricCipherKeyPair(publicParameter, asymmetricKeyParameter)); } catch (IOException ex) { throw ex; } catch (Exception ex2) { throw new PemException("problem creating " + text + " private key: " + ex2.ToString()); } }
private string RemovePEMHeader(string pem) { return(string.IsNullOrEmpty(pem) ? string.Empty : PemUtilities.DERToPEM(PemUtilities.PEMToDER(pem), PemUtilities.PemObjectType.NoHeaders)); }