MS.StrongName\KeyFile.cs
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 }