3 using System.Xml.Serialization;
\r
4 using System.Security.Cryptography;
\r
6 namespace NaGet.Packages
\r
9 /// ハッシュ値の種類(計算法)を表す。
\r
11 public enum HashValueType
\r
14 /// ファイルのサイズ(容量)をバイト単位で返す
\r
16 [XmlEnum(Name="size")]
\r
18 [XmlEnum(Name="md5")]
\r
20 [XmlEnum(Name="sha1")]
\r
22 [XmlEnum(Name="sha256")]
\r
24 [XmlEnum(Name="sha512")]
\r
28 public class HashValue
\r
34 public HashValueType Type;
\r
40 public string Value;
\r
50 /// 与えられたファイルのハッシュ値が同一であるか検証する
\r
52 /// <param name="path">ハッシュ計算を行う対象のファイル</param>
\r
53 /// <returns>ファイルのハッシュ値が妥当な場合true。</returns>
\r
54 public bool Validate(string path)
\r
56 return string.Compare(this.Value, HashValueFor(path, this.Type), true) == 0;
\r
62 /// <param name="file">計算対象のファイル</param>
\r
63 /// <param name="type">ハッシュの種類(計算法)</param>
\r
64 /// <returns></returns>
\r
65 public static string HashValueFor(string file, HashValueType type)
\r
67 using (FileStream fs = new FileStream(file, FileMode.Open)) {
\r
68 return HashValue.HashValueFor(fs, type);
\r
73 /// ストリーム入力からハッシュを計算する
\r
75 /// <param name="stream">ストリーム入力</param>
\r
76 /// <param name="type">ハッシュの種類(計算法)</param>
\r
77 /// <returns>ハッシュ値</returns>
\r
78 public static string HashValueFor(Stream stream, HashValueType type)
\r
83 case HashValueType.SIZE:
\r
84 return stream.Length.ToString();
\r
85 case HashValueType.MD5SUM:
\r
86 hash = MD5.Create().ComputeHash(stream);
\r
88 case HashValueType.SHA1SUM:
\r
89 hash = SHA1.Create().ComputeHash(stream);
\r
91 case HashValueType.SHA256SUM:
\r
92 hash = SHA256.Create().ComputeHash(stream);
\r
94 case HashValueType.SHA512SUM:
\r
95 hash = SHA512.Create().ComputeHash(stream);
\r
98 throw new NotSupportedException(string.Format("Hash type {0} does not supported", type));
\r
101 return BitConverter.ToString(hash).Replace("-",string.Empty);
\r