Exemplo n.º 1
0
 /// <summary>
 /// Constructor
 /// X.509証明書(*.pfx, *.cer)からキーを設定する。
 /// *.cer証明書の場合は、証明書チェーンが繋がっている必要がある。
 /// 自己証明書の場合「信頼されたルート証明機関」にInstallするなどする。
 /// </summary>
 /// <param name="certificateFilePath">X.509証明書(*.pfx, *.cer)へのパス</param>
 /// <param name="password">パスワード</param>
 /// <param name="hashAlgorithmName">HashAlgorithmName</param>
 /// <param name="flag">X509KeyStorageFlags</param>
 public DigitalSignX509(string certificateFilePath, string password, HashAlgorithmName hashAlgorithmName, X509KeyStorageFlags flag)
 {
     flag = flag | X509KeyStorageFlags.Exportable; // PrepareでExportParametersする可能性があるので足す。
     this.X509Certificate = new X509Certificate2(certificateFilePath, password, flag);
     this.HashAlgorithm   = HashAlgorithmCmnFunc.GetHashAlgorithmFromNameString(hashAlgorithmName.Name);
     this.Prepare();
 }
Exemplo n.º 2
0
        /// <summary>デジタル署名を作成する</summary>
        /// <param name="data">デジタル署名を行なう対象データ</param>
        /// <returns>対象データに対してデジタル署名したデジタル署名部分のデータ</returns>
        public virtual byte[] SignByFormatter(byte[] data)
        {
            // ハッシュ
            byte[] hash = this.HashAlgorithm.ComputeHash(data);

            // デジタル署名
            byte[] signedByte = null;

            if (this.AsymmetricAlgorithm is RSA)
            {
                // RSAPKCS1SignatureFormatterオブジェクトを作成
                RSAPKCS1SignatureFormatter rsaFormatter = new RSAPKCS1SignatureFormatter(this.AsymmetricAlgorithm);
                rsaFormatter.SetHashAlgorithm(HashAlgorithmCmnFunc.GetHashAlgorithmName(this.HashAlgorithm));
                signedByte = rsaFormatter.CreateSignature(hash);
            }
            else if (this.AsymmetricAlgorithm is DSA)
            {
                // DSASignatureFormatterオブジェクトを作成
                DSASignatureFormatter dsaFormatter = new DSASignatureFormatter(this.AsymmetricAlgorithm);
                dsaFormatter.SetHashAlgorithm(HashNameConst.SHA1);
                signedByte = dsaFormatter.CreateSignature(hash);
            }
            else
            {
                throw new NotImplementedException(PublicExceptionMessage.NOT_IMPLEMENTED);
            }

            return(signedByte);
        }
Exemplo n.º 3
0
        /// <summary>バイト配列のハッシュ値を計算して返す。</summary>
        /// <param name="asb">バイト配列</param>
        /// <param name="eha">ハッシュ・アルゴリズム列挙型</param>
        /// <param name="stretchCount">ストレッチ回数</param>
        /// <returns>ハッシュ値(バイト配列)</returns>
        public static byte[] GetHashBytes(byte[] asb, EnumHashAlgorithm eha, int stretchCount)
        {
            byte[] temp = null;

#if NETSTD
            // NETSTDの場合の実装
            if (eha == EnumHashAlgorithm.RIPEMD160_M)
            {
                // ハッシュ値を計算して返す。
                temp = GetHash.GetDigestBytesByBC(asb, new RipeMD160Digest());

                for (int i = 0; i < stretchCount; i++)
                {
                    // stretchCountが1以上なら繰り返す。
                    temp = GetHash.GetDigestBytesByBC(temp, new RipeMD160Digest());
                }

                return(temp);
            }
#endif
            // ハッシュ(キー無し)サービスプロバイダを生成
            HashAlgorithm ha = HashAlgorithmCmnFunc.CreateHashAlgorithmSP(eha);

            // ハッシュ値を計算して返す。
            temp = ha.ComputeHash(asb);

            for (int i = 0; i < stretchCount; i++)
            {
                // stretchCountが1以上なら繰り返す。
                temp = ha.ComputeHash(temp);
            }

            ha.Clear(); // devps(1725)
            return(temp);
        }
Exemplo n.º 4
0
 /// <summary>GetHashAlgorithmFromNameString</summary>
 /// <returns>HashAlgorithm</returns>
 public static HashAlgorithm GetHashAlgorithmFromNameString()
 {
     // 既定は何なのか?という話
     // - HashAlgorithm.Create throws PNSE on .NET Core 2
     //   https://github.com/dotnet/corefx/issues/22626#issuecomment-319141782
     //     HashAlgorithm.CreateはSHA1の実装を作成します。
     //     これは、最近の進歩のために推奨されていません。
     return(HashAlgorithmCmnFunc.GetHashAlgorithmFromNameString(HashNameConst.SHA256));
 }
Exemplo n.º 5
0
        /// <summary>バイト配列のハッシュ値を計算して返す。</summary>
        /// <param name="data">データ(バイト配列)</param>
        /// <param name="ekha">ハッシュ(キー付き)アルゴリズム列挙型</param>
        /// <param name="key">キー(バイト配列)</param>
        /// <returns>ハッシュ値(バイト配列)</returns>
        public static byte[] GetKeyedHashBytes(byte[] data, EnumKeyedHashAlgorithm ekha, byte[] key)
        {
            // HMACMD5      :どのサイズのキーでも受け入れる ◯
            // HMACRIPEMD160:どのサイズのキーでも受け入れる ◯
            // HMACSHA1     :どのサイズのキーでも受け入れる ◯
            // HMACSHA256   :どのサイズのキーでも受け入れる ◯
            // HMACSHA384   :どのサイズのキーでも受け入れる ◯
            // HMACSHA512   :どのサイズのキーでも受け入れる ◯
            // MACTripleDES :長さが 16 または 24 バイトのキーを受け入れる
            if (ekha == EnumKeyedHashAlgorithm.MACTripleDES)
            {
                if (24 <= key.Length)
                {
                    key = ArrayOperator.ShortenByteArray(key, 24);
                }
                else if (16 <= key.Length)
                {
                    key = ArrayOperator.ShortenByteArray(key, 16);
                }
                else
                {
                    throw new ArgumentException(
                              PublicExceptionMessage.ARGUMENT_INCORRECT, "byte[] key");
                }
            }

#if NETSTD
            // NETSTDの場合の実装
            if (ekha == EnumKeyedHashAlgorithm.HMACRIPEMD160)
            {
                return(GetKeyedHash.GetMacBytesByBC(
                           data, key, new HMac(new RipeMD160Digest())));
            }
            else if (ekha == EnumKeyedHashAlgorithm.MACTripleDES)
            {
                return(GetKeyedHash.GetMacBytesByBC(
                           data, key, new CbcBlockCipherMac(new DesEdeEngine(), 64)));
            }
#endif

            // ハッシュ(キー付き)サービスプロバイダを生成
            KeyedHashAlgorithm kha = HashAlgorithmCmnFunc.
                                     CreateKeyedHashAlgorithmSP(ekha, key);

            // ハッシュ(キー付き)を生成して返す。
            byte[] temp = kha.ComputeHash(data);

            kha.Clear(); // devps(1725)

            return(temp);
        }
        /// <summary>
        /// Constructor
        /// X.509証明書(*.pfx, *.cer)からキーを設定する。
        /// *.cer証明書の場合は、証明書チェーンが繋がっている必要がある。
        /// 自己証明書の場合「信頼されたルート証明機関」にInstallするなどする。
        /// </summary>
        /// <param name="certificateFilePath">X.509証明書(*.pfx, *.cer)へのパス</param>
        /// <param name="password">パスワード</param>
        /// <param name="hashAlgorithmName">HashAlgorithmName</param>
        /// <param name="flag">X509KeyStorageFlags</param>
        public DigitalSignECDsaX509(string certificateFilePath, string password, HashAlgorithmName hashAlgorithmName, X509KeyStorageFlags flag)
        {
            flag = flag | X509KeyStorageFlags.Exportable; // PrepareでGetECDsaPrivateKeyする可能性があるので足す。
            this.X509Certificate = new X509Certificate2(certificateFilePath, password, flag);

            if (this.X509Certificate.HasPrivateKey)
            {
                this.AsymmetricAlgorithm = this.PrivateKey;
            }
            else
            {
                this.AsymmetricAlgorithm = this.PublicKey;
            }

            this.HashAlgorithm = HashAlgorithmCmnFunc.GetHashAlgorithmFromNameString(hashAlgorithmName.Name);
        }
        /// <summary>
        /// Constructor
        /// X.509証明書(*.pfx, *.cer)からキーを設定する。
        /// *.cer証明書の場合は、証明書チェーンが繋がっている必要がある。
        /// 自己証明書の場合「信頼されたルート証明機関」にInstallするなどする。
        /// </summary>
        /// <param name="certificateFilePath">X.509証明書(*.pfx, *.cer)へのパス</param>
        /// <param name="password">パスワード</param>
        /// <param name="hashAlgorithmName">HashAlgorithmName</param>
        /// <param name="flag">X509KeyStorageFlags</param>
        public DigitalSignECDsaX509(string certificateFilePath, string password, HashAlgorithmName hashAlgorithmName,
                                    X509KeyStorageFlags flag = X509KeyStorageFlags.Exportable)
        {
            // X509KeyStorageFlags
            // - MachineKeySet : ECDsaは、インストールできない模様。
            // - Exportable : PrepareでGetECDsaPrivateKeyするので。
            this.X509Certificate = new X509Certificate2(certificateFilePath, password, flag);

            if (this.X509Certificate.HasPrivateKey)
            {
                this.AsymmetricAlgorithm = this.PrivateKey;
            }
            else
            {
                this.AsymmetricAlgorithm = this.PublicKey;
            }

            this.HashAlgorithm = HashAlgorithmCmnFunc.GetHashAlgorithmFromNameString(hashAlgorithmName.Name);
        }
Exemplo n.º 8
0
        /// <summary>ハッシュ(キー無し)サービスプロバイダの生成</summary>
        /// <param name="eha">ハッシュ(キー無し)サービスプロバイダの列挙型</param>
        /// <returns>ハッシュ(キー無し)サービスプロバイダ</returns>
        /// <remarks>
        /// EnumHashAlgorithmから、HashAlgorithmを生成するために追加。
        /// HashAlgorithm.Create(HashNameConst.SHA256) は .NET Core 2 で動作せず。
        /// - KeyedHashAlgorithm.Create("HMACSHA1") throw PNSE (on .NET Core 2
        ///   https://github.com/dotnet/standard/issues/530#issuecomment-375043416
        /// </remarks>
        public static HashAlgorithm CreateHashAlgorithmSP(EnumHashAlgorithm eha)
        {
            // ハッシュ(キー無し)サービスプロバイダ
            HashAlgorithm ha = null;

            if (eha == EnumHashAlgorithm.Default)
            {
                // 既定の暗号化サービスプロバイダ
                ha = HashAlgorithmCmnFunc.GetHashAlgorithmFromNameString(); // devps(1703)
            }

            #region MD5
            else if (eha == EnumHashAlgorithm.MD5_CSP)
            {
                // MD5CryptoServiceProviderサービスプロバイダ
                ha = MD5CryptoServiceProvider.Create(); // devps(1703)
            }
#if NETSTD
#else
            else if (eha == EnumHashAlgorithm.MD5_CNG)
            {
                // MD5Cngサービスプロバイダ
                ha = MD5Cng.Create(); // devps(1703)
            }
#endif
            #endregion

            #region RIPEMD160
            else if (eha == EnumHashAlgorithm.RIPEMD160_M)
            {
#if NETSTD
                ha = null; // BouncyCastleを使用する。
#else
                // RIPEMD160Managedサービスプロバイダ
                ha = RIPEMD160Managed.Create(); // devps(1703)
#endif
            }
            #endregion

            #region SHA1
            else if (eha == EnumHashAlgorithm.SHA1_CSP)
            {
                // SHA1CryptoServiceProviderサービスプロバイダ
                ha = SHA1CryptoServiceProvider.Create(); // devps(1703)
            }
#if NETSTD
#else
            else if (eha == EnumHashAlgorithm.SHA1_CNG)
            {
                // SHA1Cngサービスプロバイダ
                ha = SHA1Cng.Create(); // devps(1703)
            }
#endif
            else if (eha == EnumHashAlgorithm.SHA1_M)
            {
                // SHA1Managedサービスプロバイダ
                ha = SHA1Managed.Create(); // devps(1703)
            }
            #endregion

            #region SHA256
            else if (eha == EnumHashAlgorithm.SHA256_CSP)
            {
                // SHA256CryptoServiceProviderサービスプロバイダ
                ha = SHA256CryptoServiceProvider.Create(); // devps(1703)
            }
#if NETSTD
#else
            else if (eha == EnumHashAlgorithm.SHA256_CNG)
            {
                // SHA256Cngサービスプロバイダ
                ha = SHA256Cng.Create(); // devps(1703)
            }
#endif
            else if (eha == EnumHashAlgorithm.SHA256_M)
            {
                // SHA256Managedサービスプロバイダ
                ha = SHA256Managed.Create(); // devps(1703)
            }
            #endregion

            #region SHA384
            else if (eha == EnumHashAlgorithm.SHA384_CSP)
            {
                // SHA384CryptoServiceProviderサービスプロバイダ
                ha = SHA384CryptoServiceProvider.Create(); // devps(1703)
            }
#if NETSTD
#else
            else if (eha == EnumHashAlgorithm.SHA384_CNG)
            {
                // SHA384Cngサービスプロバイダ
                ha = SHA384Cng.Create(); // devps(1703)
            }
#endif
            else if (eha == EnumHashAlgorithm.SHA384_M)
            {
                // SHA384Managedサービスプロバイダ
                ha = SHA384Managed.Create(); // devps(1703)
            }
            #endregion

            #region SHA512
            else if (eha == EnumHashAlgorithm.SHA512_CSP)
            {
                // SHA512CryptoServiceProviderサービスプロバイダ
                ha = SHA512CryptoServiceProvider.Create(); // devps(1703)
            }
#if NETSTD
#else
            else if (eha == EnumHashAlgorithm.SHA512_CNG)
            {
                // SHA512Cngサービスプロバイダ
                ha = SHA512Cng.Create(); // devps(1703)
            }
#endif
            else if (eha == EnumHashAlgorithm.SHA512_M)
            {
                // SHA512Managedサービスプロバイダ
                ha = SHA512Managed.Create(); // devps(1703)
            }
            #endregion

            else
            {
                // 既定の暗号化サービスプロバイダ
                ha = HashAlgorithmCmnFunc.GetHashAlgorithmFromNameString(); // devps(1703)
            }

            return(ha);
        }