/// <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; }
/// <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; }
/// <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); } }
/// <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; }
/// <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; }
/// <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); }
/// <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; }
/// <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."); } }