コード例 #1
0
        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);
        }
コード例 #2
0
    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));
    }
コード例 #3
0
        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));
            }
        }
コード例 #4
0
        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);
        }
コード例 #5
0
    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());
        }
    }
コード例 #6
0
 private string RemovePEMHeader(string pem)
 {
     return(string.IsNullOrEmpty(pem) ? string.Empty : PemUtilities.DERToPEM(PemUtilities.PEMToDER(pem), PemUtilities.PemObjectType.NoHeaders));
 }