root / trunk / NetSparkle / NetSparkleDSAVerificator.cs @ 049333d2
History | View | Annotate | Download (2.9 kB)
1 | 46426dbd | Panagiotis Kanavos | using System; |
---|---|---|---|
2 | 46426dbd | Panagiotis Kanavos | using System.Collections.Generic; |
3 | 46426dbd | Panagiotis Kanavos | using System.Linq; |
4 | 46426dbd | Panagiotis Kanavos | using System.Text; |
5 | 46426dbd | Panagiotis Kanavos | using System.IO; |
6 | 46426dbd | Panagiotis Kanavos | using System.Reflection; |
7 | 46426dbd | Panagiotis Kanavos | using System.Security.Cryptography; |
8 | 46426dbd | Panagiotis Kanavos | |
9 | 46426dbd | Panagiotis Kanavos | namespace AppLimit.NetSparkle |
10 | 46426dbd | Panagiotis Kanavos | { |
11 | 46426dbd | Panagiotis Kanavos | public class NetSparkleDSAVerificator |
12 | 46426dbd | Panagiotis Kanavos | { |
13 | 46426dbd | Panagiotis Kanavos | private DSACryptoServiceProvider _provider; |
14 | 46426dbd | Panagiotis Kanavos | |
15 | 46426dbd | Panagiotis Kanavos | public static Boolean ExistsPublicKey(String publicKey) |
16 | 46426dbd | Panagiotis Kanavos | { |
17 | 46426dbd | Panagiotis Kanavos | // 1. try to load this from resource |
18 | 46426dbd | Panagiotis Kanavos | Stream data = TryGetResourceStream(publicKey); |
19 | 46426dbd | Panagiotis Kanavos | if (data == null ) |
20 | 46426dbd | Panagiotis Kanavos | data = TryGetFileResource(publicKey, data); |
21 | 46426dbd | Panagiotis Kanavos | |
22 | 46426dbd | Panagiotis Kanavos | // 2. check the resource |
23 | 46426dbd | Panagiotis Kanavos | if (data == null) |
24 | 46426dbd | Panagiotis Kanavos | return false; |
25 | 46426dbd | Panagiotis Kanavos | else |
26 | 46426dbd | Panagiotis Kanavos | return true; |
27 | 46426dbd | Panagiotis Kanavos | } |
28 | 46426dbd | Panagiotis Kanavos | |
29 | 46426dbd | Panagiotis Kanavos | public NetSparkleDSAVerificator(String publicKey) |
30 | 46426dbd | Panagiotis Kanavos | { |
31 | 46426dbd | Panagiotis Kanavos | // 1. try to load this from resource |
32 | 46426dbd | Panagiotis Kanavos | Stream data = TryGetResourceStream(publicKey); |
33 | 46426dbd | Panagiotis Kanavos | if (data == null ) |
34 | 46426dbd | Panagiotis Kanavos | data = TryGetFileResource(publicKey, data); |
35 | 46426dbd | Panagiotis Kanavos | |
36 | 46426dbd | Panagiotis Kanavos | // 2. check the resource |
37 | 46426dbd | Panagiotis Kanavos | if ( data == null ) |
38 | 46426dbd | Panagiotis Kanavos | throw new Exception("Couldn't find public key for verification"); |
39 | 46426dbd | Panagiotis Kanavos | |
40 | 46426dbd | Panagiotis Kanavos | // 3. read out the key value |
41 | 46426dbd | Panagiotis Kanavos | using (StreamReader reader = new StreamReader(data)) |
42 | 46426dbd | Panagiotis Kanavos | { |
43 | 46426dbd | Panagiotis Kanavos | String key = reader.ReadToEnd(); |
44 | 46426dbd | Panagiotis Kanavos | _provider = new DSACryptoServiceProvider(); |
45 | 46426dbd | Panagiotis Kanavos | _provider.FromXmlString(key); |
46 | 46426dbd | Panagiotis Kanavos | } |
47 | 46426dbd | Panagiotis Kanavos | } |
48 | 46426dbd | Panagiotis Kanavos | |
49 | 46426dbd | Panagiotis Kanavos | public Boolean VerifyDSASignature(String signature, String binaryPath) |
50 | 46426dbd | Panagiotis Kanavos | { |
51 | 46426dbd | Panagiotis Kanavos | if (_provider == null) |
52 | 46426dbd | Panagiotis Kanavos | return false; |
53 | 46426dbd | Panagiotis Kanavos | |
54 | 46426dbd | Panagiotis Kanavos | // convert signature |
55 | 46426dbd | Panagiotis Kanavos | Byte[] bHash = Convert.FromBase64String(signature); |
56 | 46426dbd | Panagiotis Kanavos | |
57 | 46426dbd | Panagiotis Kanavos | // read the data |
58 | 46426dbd | Panagiotis Kanavos | byte[] bData = null; |
59 | 46426dbd | Panagiotis Kanavos | using (Stream inputStream = File.OpenRead(binaryPath)) |
60 | 46426dbd | Panagiotis Kanavos | { |
61 | 46426dbd | Panagiotis Kanavos | bData = new Byte[inputStream.Length]; |
62 | 46426dbd | Panagiotis Kanavos | inputStream.Read(bData, 0, bData.Length); |
63 | 46426dbd | Panagiotis Kanavos | } |
64 | 46426dbd | Panagiotis Kanavos | |
65 | 46426dbd | Panagiotis Kanavos | // verify |
66 | 46426dbd | Panagiotis Kanavos | return _provider.VerifyData(bData, bHash); |
67 | 46426dbd | Panagiotis Kanavos | } |
68 | 46426dbd | Panagiotis Kanavos | |
69 | 46426dbd | Panagiotis Kanavos | private static Stream TryGetFileResource(String publicKey, Stream data) |
70 | 46426dbd | Panagiotis Kanavos | { |
71 | 46426dbd | Panagiotis Kanavos | if (File.Exists(publicKey)) |
72 | 46426dbd | Panagiotis Kanavos | { |
73 | 46426dbd | Panagiotis Kanavos | data = File.OpenRead(publicKey); |
74 | 46426dbd | Panagiotis Kanavos | } |
75 | 46426dbd | Panagiotis Kanavos | return data; |
76 | 46426dbd | Panagiotis Kanavos | } |
77 | 46426dbd | Panagiotis Kanavos | |
78 | 46426dbd | Panagiotis Kanavos | private static Stream TryGetResourceStream(String publicKey) |
79 | 46426dbd | Panagiotis Kanavos | { |
80 | 46426dbd | Panagiotis Kanavos | Stream data = null; |
81 | 46426dbd | Panagiotis Kanavos | |
82 | 46426dbd | Panagiotis Kanavos | foreach (Assembly asm in AppDomain.CurrentDomain.GetAssemblies()) |
83 | 46426dbd | Panagiotis Kanavos | { |
84 | 46426dbd | Panagiotis Kanavos | var resourceName = asm.GetManifestResourceNames().FirstOrDefault(s => s.IndexOf(publicKey, StringComparison.OrdinalIgnoreCase) > -1); |
85 | 46426dbd | Panagiotis Kanavos | if (!string.IsNullOrEmpty(resourceName)) |
86 | 46426dbd | Panagiotis Kanavos | { |
87 | 46426dbd | Panagiotis Kanavos | data = asm.GetManifestResourceStream(resourceName); |
88 | 46426dbd | Panagiotis Kanavos | if (data != null) |
89 | 46426dbd | Panagiotis Kanavos | break; |
90 | 46426dbd | Panagiotis Kanavos | } |
91 | 46426dbd | Panagiotis Kanavos | } |
92 | 46426dbd | Panagiotis Kanavos | return data; |
93 | 46426dbd | Panagiotis Kanavos | } |
94 | 46426dbd | Panagiotis Kanavos | } |
95 | 46426dbd | Panagiotis Kanavos | } |