1  using System;
  2  using System.Diagnostics;
  3  using System.Globalization;
  4  using System.IO;
  5  using System.Security;
  6  
  7  namespace MS.StrongName
  8  {
  9      /// <summary>
10      ///     KeyFile I/O methods
11      /// </summary>
12      public static class KeyFile
13      {
14          /// <summary>
15          ///     Read a key out of a .snk file and into a byte array
16          /// </summary>
17          /// <exception cref="ArgumentNullException">
18          ///     If <paramref name="fileName"/> is null
19          /// </exception>
20          /// <exception cref="InvalidOperationException">
21          ///     If the file could not be read
22          /// </exception>
23          /// <param name="fileName">Name of the file to read out of</param>
24          /// <returns>true on success, false on error</returns>
25          public static byte[] ReadKeyFile(string fileName)
26          {
27              if(fileName == null)
28                  throw new ArgumentNullException("fileName");
29              
30              byte[] keyBlob = null;
31  
32              try
33              {
34                  using(FileStream snkStream = new FileStream(fileName, FileMode.Open, FileAccess.Read))
35                  {
36                      // make sure the file isn't too big to read
37                      if(snkStream.Length > Int32.MaxValue)
38                          throw new InvalidOperationException(String.Format(
39                                      CultureInfo.CurrentCulture,
40                                      Resources.BadFile,
41                                      fileName));
42  
43                      using(BinaryReader snkReader = new BinaryReader(snkStream))
44                          keyBlob = snkReader.ReadBytes((int)snkStream.Length); // safe cast due to check above
45                  }
46              }
47              catch(FileNotFoundException e)
48              {
49                  throw new InvalidOperationException(String.Format(
50                      CultureInfo.CurrentCulture,
51                      Resources.BadFile,
52                      fileName), e);
53              }
54              catch(DirectoryNotFoundException e)
55              {
56                  throw new InvalidOperationException(String.Format(
57                      CultureInfo.CurrentCulture,
58                      Resources.BadFile,
59                      fileName), e);
60              }
61              catch(IOException e)
62              {
63                  throw new InvalidOperationException(String.Format(
64                      CultureInfo.CurrentCulture,
65                      Resources.BadFile,
66                      fileName), e);
67              }
68              catch(ArgumentException e)
69              {
70                  throw new InvalidOperationException(String.Format(
71                      CultureInfo.CurrentCulture,
72                      Resources.BadOperation,
73                      e.Message), e);
74              }
75              catch(SecurityException e)
76              {
77                  throw new InvalidOperationException(String.Format(
78                      CultureInfo.CurrentCulture,
79                      Resources.BadOperation,
80                      e.Message), e);
81              }
82              catch(UnauthorizedAccessException e)
83              {
84                  throw new InvalidOperationException(String.Format(
85                      CultureInfo.CurrentCulture,
86                      Resources.BadOperation,
87                      e.Message), e);
88              }
89  
90              Debug.Assert(keyBlob != null);
91              return keyBlob;
92          }
93          
94          /// <summary>
95          ///     Write a key to a file
96          /// </summary>
97          /// <exception cref="ArgumentNullException">
98          ///     If <paramref name="keyBlob"/> or <paramref name="fileName"/> are null
99          /// </exception>
100          /// <exception cref="InvalidOperationException">
101          ///     If the file could not be written
102          /// </exception>
103          /// <param name="keyBlob">Key to write to the file</param>
104          /// <param name="fileName">File to write into</param>
105          public static void WriteKeyFile(byte[] keyBlob, string fileName)
106          {
107              if(keyBlob == null)
108                  throw new ArgumentNullException("keyBlob");
109              if(fileName == null)
110                  throw new ArgumentNullException("fileName");
111              
112              try
113              {
114                  // write the key to the specified file
115                  using(FileStream snkStream = new FileStream(fileName, FileMode.Create, FileAccess.Write))
116                  using(BinaryWriter snkWriter = new BinaryWriter(snkStream))
117                      snkWriter.Write(keyBlob);
118              }
119              catch(PathTooLongException e)
120              {
121                  throw new InvalidOperationException(String.Format(
122                      CultureInfo.CurrentCulture,
123                      Resources.BadOperation,
124                      e.Message), e);
125              }
126              catch(UnauthorizedAccessException e)
127              {
128                  throw new InvalidOperationException(String.Format(
129                      CultureInfo.CurrentCulture,
130                      Resources.BadOperation,
131                      e.Message), e);
132              }
133              catch(ArgumentException e)
134              {
135                  throw new InvalidOperationException(String.Format(
136                      CultureInfo.CurrentCulture,
137                      Resources.BadOperation,
138                      e.Message), e);
139              }
140              catch(IOException e)
141              {
142                  throw new InvalidOperationException(String.Format(
143                      CultureInfo.CurrentCulture,
144                      Resources.BadOperation,
145                      e.Message), e);
146              }
147  
148              return;
149          }
150      }
151  }