/// <summary>Constructor</summary>
        /// <param name="xmlKey">string</param>
        /// <param name="eaa">EnumDigitalSignAlgorithm</param>
        public DigitalSignXML(string xmlKey, EnumDigitalSignAlgorithm eaa)
        {
            AsymmetricAlgorithm aa = null;
            HashAlgorithm       ha = null;

            AsymmetricAlgorithmCmnFunc.CreateDigitalSignSP(eaa, out aa, out ha);

            this.AsymmetricAlgorithm = aa;
            this.HashAlgorithm       = ha;

            if (aa is RSA)
            {
                RSA rsa = (RSA)aa;
                rsa.FromXmlString(xmlKey);
                this.AsymmetricAlgorithm = rsa;
            }
            else if (aa is DSA)
            {
                DSA dsa = (DSA)aa;
                dsa.FromXmlString(xmlKey);
                this.AsymmetricAlgorithm = dsa;
            }
            else
            {
                throw new NotImplementedException(PublicExceptionMessage.NOT_IMPLEMENTED);
            }
        }
        /// <summary>Constructor</summary>
        /// <param name="eaa">EnumDigitalSignAlgorithm</param>
        public DigitalSignXML(EnumDigitalSignAlgorithm eaa)
        {
            AsymmetricAlgorithm aa = null;
            HashAlgorithm       ha = null;

            AsymmetricAlgorithmCmnFunc.CreateDigitalSignSP(eaa, out aa, out ha);

            this.AsymmetricAlgorithm = aa;
            this.HashAlgorithm       = ha;
        }
Example #3
0
        /// <summary>Constructor</summary>
        /// <param name="eaa">EnumDigitalSignAlgorithm</param>
        public DigitalSignParam(EnumDigitalSignAlgorithm eaa)
        {
            AsymmetricAlgorithm aa = null;
            HashAlgorithm       ha = null;

            RsaAndDsaCmnFunc.CreateDigitalSignServiceProvider(eaa, out aa, out ha);

            this.AsymmetricAlgorithm = aa;
            this.HashAlgorithm       = ha;
        }
Example #4
0
        /// <summary>
        /// Constructor
        /// RFC 3275のXMLからキーペアを設定する。
        /// </summary>
        public DigitalSignXML(EnumDigitalSignAlgorithm eaa)
        {
            this.CreateAsymmetricAlgorithmServiceProvider(eaa, out this._aa, out this._ha);

            if (string.IsNullOrEmpty(this.XMLPrivateKey))
            {
                // 秘密鍵をXML形式で取得
                this.XMLPrivateKey = this._aa.ToXmlString(true);
                // 公開鍵をXML形式で取得
                this.XMLPublicKey = this._aa.ToXmlString(false);
            }
        }
Example #5
0
        /// <summary>署名・検証サービスプロバイダの生成(EnumDigitalSignAlgorithm)</summary>
        /// <param name="eaa">EnumDigitalSignAlgorithm</param>
        /// <param name="aa">
        /// AsymmetricAlgorithm
        /// - RSACryptoServiceProvider
        /// - DSACryptoServiceProvider
        /// </param>
        /// <param name="ha">
        /// HashAlgorithm
        /// </param>
        public static void CreateDigitalSignServiceProvider(
            EnumDigitalSignAlgorithm eaa, out AsymmetricAlgorithm aa, out HashAlgorithm ha)
        {
            aa = null;
            ha = null;

            // 公開鍵・暗号化サービスプロバイダ
            if (eaa == EnumDigitalSignAlgorithm.RSACryptoServiceProvider_MD5)
            {
                // RSACryptoServiceProviderサービスプロバイダ
                aa = new RSACryptoServiceProvider();
                ha = MD5.Create();
            }
            else if (eaa == EnumDigitalSignAlgorithm.RSACryptoServiceProvider_SHA1)
            {
                // RSACryptoServiceProviderサービスプロバイダ
                aa = new RSACryptoServiceProvider();
                ha = SHA1.Create();
            }
            else if (eaa == EnumDigitalSignAlgorithm.RSACryptoServiceProvider_SHA256)
            {
                // RSACryptoServiceProviderサービスプロバイダ
                aa = new RSACryptoServiceProvider();
                ha = SHA256.Create();
            }
            else if (eaa == EnumDigitalSignAlgorithm.RSACryptoServiceProvider_SHA384)
            {
                // RSACryptoServiceProviderサービスプロバイダ
                aa = new RSACryptoServiceProvider();
                ha = SHA384.Create();
            }
            else if (eaa == EnumDigitalSignAlgorithm.RSACryptoServiceProvider_SHA512)
            {
                // RSACryptoServiceProviderサービスプロバイダ
                aa = new RSACryptoServiceProvider();
                ha = SHA512.Create();
            }
            else if (eaa == EnumDigitalSignAlgorithm.DSACryptoServiceProvider_SHA1)
            {
                // DSACryptoServiceProvider
                aa = new DSACryptoServiceProvider();
                ha = SHA1.Create();
            }
            else
            {
                throw new ArgumentException(
                          PublicExceptionMessage.ARGUMENT_INCORRECT,
                          "EnumDigitalSignAlgorithm parameter is incorrect.");
            }
        }
        /// <summary>Constructor</summary>
        /// <param name="eaa">EnumDigitalSignAlgorithm</param>
        /// <param name="hashAlgorithm">HashAlgorithm</param>
        public DigitalSignECDsaOpenSsl(EnumDigitalSignAlgorithm eaa, HashAlgorithm hashAlgorithm)
        {
            AsymmetricAlgorithm aa = null;
            HashAlgorithm       ha = null;

            AsymmetricAlgorithmCmnFunc.CreateDigitalSignSP(eaa, out aa, out ha);

            ECDsaOpenSsl ecdsa = (ECDsaOpenSsl)aa;

            this._privateKey = ecdsa.ExportParameters(true);
            this._publicKey  = ecdsa.ExportParameters(false);

            this.AsymmetricAlgorithm = aa;
            this.HashAlgorithm       = hashAlgorithm;
        }
Example #7
0
        /// <summary>Constructor</summary>
        /// <param name="eaa">EnumDigitalSignAlgorithm</param>
        public DigitalSignECDsaCng(EnumDigitalSignAlgorithm eaa)
        {
            AsymmetricAlgorithm aa = null;
            HashAlgorithm       ha = null;

            AsymmetricAlgorithmCmnFunc.CreateDigitalSignSP(eaa, out aa, out ha);

            ECDsaCng ecdsa = (ECDsaCng)aa;

            this._privateKey = ecdsa.Key;
            this._publicKey  = this._privateKey.Export(CngKeyBlobFormat.EccPublicBlob);

            this.AsymmetricAlgorithm = aa;
            this.HashAlgorithm       = ha;
        }
Example #8
0
        /// <summary>Constructor</summary>
        /// <param name="eaa">EnumDigitalSignAlgorithm</param>
        public DigitalSignXML(EnumDigitalSignAlgorithm eaa)
        {
            AsymmetricAlgorithm aa = null;
            HashAlgorithm       ha = null;

            RsaAndDsaCmnFunc.CreateDigitalSignServiceProvider(eaa, out aa, out ha);

            this.AsymmetricAlgorithm = aa;
            this.HashAlgorithm       = ha;

            // 秘密鍵をXML形式で取得
            this.XMLPrivateKey = this.AsymmetricAlgorithm.ToXmlString(true);
            // 公開鍵をXML形式で取得
            this.XMLPublicKey = this.AsymmetricAlgorithm.ToXmlString(false);
        }
Example #9
0
        /// <summary>公開鍵・暗号化サービスプロバイダの生成</summary>
        /// <returns>公開鍵・暗号化サービスプロバイダ</returns>
        private void CreateAsymmetricAlgorithmServiceProvider(EnumDigitalSignAlgorithm eaa, out AsymmetricAlgorithm aa, out HashAlgorithm ha)
        {
            aa = null;
            ha = null;

            // 公開鍵・暗号化サービスプロバイダ
            if (eaa == EnumDigitalSignAlgorithm.RSACryptoServiceProvider_MD5)
            {
                // RSACryptoServiceProviderサービスプロバイダ
                aa = new RSACryptoServiceProvider();
                ha = MD5.Create();
            }
            else if (eaa == EnumDigitalSignAlgorithm.RSACryptoServiceProvider_SHA1)
            {
                // RSACryptoServiceProviderサービスプロバイダ
                aa = new RSACryptoServiceProvider();
                ha = SHA1.Create();
            }
            else if (eaa == EnumDigitalSignAlgorithm.RSACryptoServiceProvider_SHA256)
            {
                // RSACryptoServiceProviderサービスプロバイダ
                aa = new RSACryptoServiceProvider();
                ha = SHA256.Create();
            }
            else if (eaa == EnumDigitalSignAlgorithm.RSACryptoServiceProvider_SHA384)
            {
                // RSACryptoServiceProviderサービスプロバイダ
                aa = new RSACryptoServiceProvider();
                ha = SHA384.Create();
            }
            else if (eaa == EnumDigitalSignAlgorithm.RSACryptoServiceProvider_SHA512)
            {
                // RSACryptoServiceProviderサービスプロバイダ
                aa = new RSACryptoServiceProvider();
                ha = SHA512.Create();
            }
            else if (eaa == EnumDigitalSignAlgorithm.DSACryptoServiceProvider_SHA1)
            {
                // DSACryptoServiceProvider
                aa = new DSACryptoServiceProvider();
                ha = SHA1.Create();
            }
        }
        /// <summary>Constructor</summary>
        /// <param name="dsaParameters">DSAParameters</param>
        /// <param name="eaa">EnumDigitalSignAlgorithm</param>
        public DigitalSignParam(DSAParameters dsaParameters, EnumDigitalSignAlgorithm eaa)
        {
            AsymmetricAlgorithm aa = null;
            HashAlgorithm       ha = null;

            AsymmetricAlgorithmCmnFunc.CreateDigitalSignSP(eaa, out aa, out ha);

            if (aa is DSA)
            {
                ((DSA)aa).ImportParameters(dsaParameters);
            }
            else
            {
                throw new ArgumentException("unmatched");
            }

            this.AsymmetricAlgorithm = aa;
            this.HashAlgorithm       = ha;
        }
        /// <summary>Constructor</summary>
        /// <param name="rsaParameters">RSAParameters</param>
        /// <param name="eaa">EnumDigitalSignAlgorithm</param>
        public DigitalSignParam(RSAParameters rsaParameters, EnumDigitalSignAlgorithm eaa)
        {
            AsymmetricAlgorithm aa = null;
            HashAlgorithm       ha = null;

            AsymmetricAlgorithmCmnFunc.CreateDigitalSignSP(eaa, out aa, out ha);

            if (aa is RSA)
            {
                RSAParameters temp = new RSAParameters()
                {
                    // Public
                    Modulus  = rsaParameters.Modulus,
                    Exponent = rsaParameters.Exponent,
                };

                if (rsaParameters.D != null &&
                    rsaParameters.D.Length != 0)
                {
                    // Private
                    temp.D        = rsaParameters.D;
                    temp.P        = rsaParameters.P;
                    temp.Q        = rsaParameters.Q;
                    temp.DP       = rsaParameters.DP;
                    temp.DQ       = rsaParameters.DQ;
                    temp.InverseQ = rsaParameters.InverseQ;
                }

                ((RSA)aa).ImportParameters(temp);
            }
            else
            {
                throw new ArgumentException("unmatched");
            }

            this.AsymmetricAlgorithm = aa;
            this.HashAlgorithm       = ha;
        }
Example #12
0
        /// <summary>Constructor</summary>
        /// <param name="eaa">EnumDigitalSignAlgorithm</param>
        /// <param name="xmlKey">string</param>
        public DigitalSignXML(EnumDigitalSignAlgorithm eaa, string xmlKey)
        {
            AsymmetricAlgorithm aa = null;
            HashAlgorithm       ha = null;

            RsaAndDsaCmnFunc.CreateDigitalSignServiceProvider(eaa, out aa, out ha);

            if (aa is RSACryptoServiceProvider)
            {
                RSACryptoServiceProvider rsaCryptoServiceProvider = (RSACryptoServiceProvider)aa;
                rsaCryptoServiceProvider.FromXmlString(xmlKey);
                this.AsymmetricAlgorithm = rsaCryptoServiceProvider;
            }
            else if (aa is DSACryptoServiceProvider)
            {
                DSACryptoServiceProvider dsaCryptoServiceProvider = (DSACryptoServiceProvider)aa;
                dsaCryptoServiceProvider.FromXmlString(xmlKey);
                this.AsymmetricAlgorithm = dsaCryptoServiceProvider;
            }

            this.HashAlgorithm = ha;

            // 秘密鍵をXML形式で取得
            try
            {
                this.XMLPrivateKey = this.AsymmetricAlgorithm.ToXmlString(true);
            }
            catch (CryptographicException cex)
            {
                cex.GetType();
                // 潰す(xmlKeyが公開鍵のケース)
            }

            // 公開鍵をXML形式で取得
            this.XMLPublicKey = this.AsymmetricAlgorithm.ToXmlString(false);
        }
        /// <summary>署名・検証サービスプロバイダの生成</summary>
        /// <param name="eaa">EnumDigitalSignAlgorithm</param>
        /// <param name="aa">
        /// AsymmetricAlgorithm
        /// - RSACryptoServiceProvider
        /// - DSACryptoServiceProvider
        /// </param>
        /// <param name="ha">
        /// HashAlgorithm
        /// </param>
        public static void CreateDigitalSignSP(
            EnumDigitalSignAlgorithm eaa, out AsymmetricAlgorithm aa, out HashAlgorithm ha)
        {
            aa = null;
            ha = null;

            // 公開鍵・暗号化サービスプロバイダ
            if (eaa == EnumDigitalSignAlgorithm.RsaCSP_MD5 ||
                eaa == EnumDigitalSignAlgorithm.RsaCSP_SHA1 ||
                eaa == EnumDigitalSignAlgorithm.RsaCSP_SHA256 ||
                eaa == EnumDigitalSignAlgorithm.RsaCSP_SHA384 ||
                eaa == EnumDigitalSignAlgorithm.RsaCSP_SHA512)
            {
                // RSACryptoServiceProviderサービスプロバイダ
                aa = new RSACryptoServiceProvider();

                switch (eaa)
                {
                case EnumDigitalSignAlgorithm.RsaCSP_MD5:
                    ha = MD5.Create();
                    break;

                case EnumDigitalSignAlgorithm.RsaCSP_SHA1:
                    ha = SHA1.Create();
                    break;

                case EnumDigitalSignAlgorithm.RsaCSP_SHA256:
                    ha = SHA256.Create();
                    break;

                case EnumDigitalSignAlgorithm.RsaCSP_SHA384:
                    ha = SHA384.Create();
                    break;

                case EnumDigitalSignAlgorithm.RsaCSP_SHA512:
                    ha = SHA512.Create();
                    break;
                }
            }
#if NETSTD
            else if (eaa == EnumDigitalSignAlgorithm.RsaOpenSsl_MD5 ||
                     eaa == EnumDigitalSignAlgorithm.RsaOpenSsl_SHA1 ||
                     eaa == EnumDigitalSignAlgorithm.RsaOpenSsl_SHA256 ||
                     eaa == EnumDigitalSignAlgorithm.RsaOpenSsl_SHA384 ||
                     eaa == EnumDigitalSignAlgorithm.RsaOpenSsl_SHA512)
            {
                // RSAOpenSslサービスプロバイダ
                aa = new RSAOpenSsl();

                switch (eaa)
                {
                case EnumDigitalSignAlgorithm.RsaOpenSsl_MD5:
                    ha = MD5.Create();
                    break;

                case EnumDigitalSignAlgorithm.RsaOpenSsl_SHA1:
                    ha = SHA1.Create();
                    break;

                case EnumDigitalSignAlgorithm.RsaOpenSsl_SHA256:
                    ha = SHA256.Create();
                    break;

                case EnumDigitalSignAlgorithm.RsaOpenSsl_SHA384:
                    ha = SHA384.Create();
                    break;

                case EnumDigitalSignAlgorithm.RsaOpenSsl_SHA512:
                    ha = SHA512.Create();
                    break;
                }
            }
#endif
            else if (eaa == EnumDigitalSignAlgorithm.DsaCSP_SHA1)
            {
                // DSACryptoServiceProvider
                aa = new DSACryptoServiceProvider();
                ha = SHA1.Create();
            }
#if NETSTD
            else if (eaa == EnumDigitalSignAlgorithm.DsaOpenSsl_SHA1)
            {
                // DSAOpenSslサービスプロバイダ
                aa = new DSAOpenSsl();
                ha = SHA1.Create();
            }
#endif
            else if (
                eaa == EnumDigitalSignAlgorithm.ECDsaCng_P256 ||
                eaa == EnumDigitalSignAlgorithm.ECDsaCng_P384 ||
                eaa == EnumDigitalSignAlgorithm.ECDsaCng_P521)
            {
                // ECDsaCngはCngKeyが土台で、
                // ECDsaCng生成後にオプションとして設定するのではなく
                // CngKeyの生成時にCngAlgorithmの指定が必要であるもよう。
                CngAlgorithm cngAlgorithm = null;
                switch (eaa)
                {
                case EnumDigitalSignAlgorithm.ECDsaCng_P256:
                    cngAlgorithm = CngAlgorithm.ECDsaP256;
                    break;

                case EnumDigitalSignAlgorithm.ECDsaCng_P384:
                    cngAlgorithm = CngAlgorithm.ECDsaP384;
                    break;

                case EnumDigitalSignAlgorithm.ECDsaCng_P521:
                    cngAlgorithm = CngAlgorithm.ECDsaP521;
                    break;
                }
                aa = new ECDsaCng(CngKey.Create(cngAlgorithm));
                ha = null; // ハッシュ無し
            }
#if NETSTD
            else if (
                eaa == EnumDigitalSignAlgorithm.ECDsaOpenSsl_P256 ||
                eaa == EnumDigitalSignAlgorithm.ECDsaOpenSsl_P384 ||
                eaa == EnumDigitalSignAlgorithm.ECDsaOpenSsl_P521)
            {
                ECCurve      eCCurve = ECCurve.NamedCurves.nistP256;
                ECParameters eCParameters;
                ECDsa        eCDsa        = null;
                ECDsaOpenSsl eCDsaOpenSsl = null;

                switch (eaa)
                {
                case EnumDigitalSignAlgorithm.ECDsaOpenSsl_P256:
                    eCCurve = ECCurve.NamedCurves.nistP256;
                    break;

                case EnumDigitalSignAlgorithm.ECDsaOpenSsl_P384:
                    eCCurve = ECCurve.NamedCurves.nistP384;
                    break;

                case EnumDigitalSignAlgorithm.ECDsaOpenSsl_P521:
                    eCCurve = ECCurve.NamedCurves.nistP521;
                    break;
                }

                // https://qiita.com/yoship1639/items/6dd0cc8623d7f3969d78
                if (Environment.OSVersion.Platform == PlatformID.Unix)
                {
                    eCDsa = ECDsa.Create(); // ECDsaOpenSslと思われる。
                    eCDsa.GenerateKey(eCCurve);
                    eCParameters = eCDsa.ExportParameters(true);
                    eCDsaOpenSsl = new ECDsaOpenSsl(eCParameters.Curve);
                    eCDsaOpenSsl.ImportParameters(eCParameters);
                }

                aa = eCDsaOpenSsl;
                ha = null; // ハッシュ無し
            }
#endif
            else
            {
                throw new ArgumentException(
                          PublicExceptionMessage.ARGUMENT_INCORRECT,
                          "EnumDigitalSignAlgorithm parameter is incorrect.");
            }
        }