Statistics
| Branch: | Revision:

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
}