/// <summary>
        /// at_hash, c_hash, s_hashを作成
        /// (SHA256→HS256,RS256,ES256対応可能)
        /// </summary>
        /// <param name="input">string</param>
        /// <returns>hash</returns>
        public static string CreateHash(string input)
        {
            // ID Token の JOSE Header にある
            // alg Header Parameterのアルゴリズムで使用されるハッシュアルゴリズムを用い、
            // input(access_token や code) のASCII オクテット列からハッシュ値を求め、
            byte[] bytes = GetHash.GetHashBytes(
                CustomEncode.StringToByte(input, CustomEncode.us_ascii),
                EnumHashAlgorithm.SHA256_M);

            // 左半分を base64url エンコードした値。
            return(CustomEncode.ToBase64UrlString(
                       ArrayOperator.ShortenByteArray(bytes, (bytes.Length / 2))));
        }
Exemple #2
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);
        }