1
1
using Microsoft . VisualStudio . TestTools . UnitTesting ;
2
+ using Org . Security . Cryptography ;
2
3
using System ;
3
4
using System . Collections . Generic ;
4
5
using System . Security . Cryptography ;
6
+ using System . Security . Cryptography . X509Certificates ;
7
+
5
8
using System . Text ;
6
9
7
10
namespace UnitTests . POCs
@@ -11,6 +14,16 @@ namespace UnitTests.POCs
11
14
[ TestClass ]
12
15
public class SignatureSamples
13
16
{
17
+ // Sender
18
+ // Message Or payload - The substance
19
+ // Message Digest - A compact representation of the message
20
+ // Encrypt the message digest with private key to create signature.
21
+ //
22
+ // Receiver:
23
+ // Decrypt the signature using sender's public key
24
+ // Hash the message or payload to recreate the message digest
25
+ // Compare the hashses
26
+
14
27
// To verify that data was signed by a particular party, you must have the following information:
15
28
// a) The public key of the party that signed the data.
16
29
// b) The digital signature.
@@ -40,6 +53,67 @@ public void HelloSignature()
40
53
41
54
}
42
55
56
+ [ TestMethod ]
57
+ public void TestSignature ( )
58
+ {
59
+ const string CertThumbPrint = "2E3257EE8FC8A72DB3778DFB3F9EDC7D0A9D66C7" ;
60
+ const string TEST = "Hello world" ;
61
+
62
+ var payload = Encoding . UTF8 . GetBytes ( TEST ) ;
63
+
64
+ var signature = X509RsaSha1Signature . Sign ( payload , CertThumbPrint ) ;
65
+ var good = X509RsaSha1Signature . Verify ( payload , signature , CertThumbPrint ) ;
66
+ Assert . IsTrue ( good ) ;
67
+
68
+ signature = X509RsaSha1Signature . Sign ( payload , CertThumbPrint ) ;
69
+ good = X509RsaSha1Signature . Verify ( payload , signature , CertThumbPrint ) ;
70
+ Assert . IsTrue ( good ) ;
71
+
72
+ }
73
+
74
+ }
75
+
76
+
77
+ static class X509RsaSha1Signature
78
+ {
79
+ const string SHA1 = "SHA1" ;
80
+
81
+ public static byte [ ] Sign ( byte [ ] payload , string thumbprint )
82
+ {
83
+ X509Certificate2 cert = X509CertificateCache . GetCertificate ( thumbprint ) ;
84
+
85
+ var rsa = cert . PrivateKey ;
86
+
87
+ using ( var sha = HashAlgorithm . Create ( SHA1 ) )
88
+ {
89
+ byte [ ] digest = sha . ComputeHash ( payload ) ;
90
+
91
+ var signatureFormatter = new RSAPKCS1SignatureFormatter ( rsa ) ;
92
+ signatureFormatter . SetHashAlgorithm ( SHA1 ) ;
93
+
94
+ byte [ ] signature = signatureFormatter . CreateSignature ( digest ) ;
95
+ return signature ;
96
+ }
97
+ }
98
+
99
+ public static bool Verify ( byte [ ] payload , byte [ ] signature , string thumbprint )
100
+ {
101
+ X509Certificate2 cert = X509CertificateCache . GetCertificate ( thumbprint ) ;
102
+
103
+ var rsa = cert . PublicKey . Key ;
104
+
105
+ using ( var sha = HashAlgorithm . Create ( SHA1 ) )
106
+ {
107
+ byte [ ] digest = sha . ComputeHash ( payload ) ;
108
+
109
+ var signatureDeformatter = new RSAPKCS1SignatureDeformatter ( rsa ) ;
110
+ signatureDeformatter . SetHashAlgorithm ( SHA1 ) ;
111
+
112
+ return signatureDeformatter . VerifySignature ( digest , signature ) ;
113
+ }
114
+ }
115
+
116
+
43
117
44
118
}
45
119
}
0 commit comments