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