Skip to content

Commit 2d4af33

Browse files
committed
quantum-c#: add tests for signatures
1 parent 601d5d1 commit 2d4af33

File tree

10 files changed

+210
-0
lines changed

10 files changed

+210
-0
lines changed
Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
using System;
2+
using System.Security.Cryptography;
3+
using System.Text;
4+
5+
namespace QuantumExamples.Cryptography
6+
{
7+
public class SignatureExample
8+
{
9+
public static void RunExample()
10+
{
11+
const string originalMessage = "This is a message to sign!";
12+
13+
// Demonstrate ECDSA signing and verification
14+
DemonstrateECDSAExample(originalMessage);
15+
16+
// Demonstrate RSA signing and verification
17+
DemonstrateRSAExample(originalMessage);
18+
19+
// Demonstrate RSA with formatters
20+
DemonstrateRSAFormatterExample(originalMessage);
21+
}
22+
23+
private static void DemonstrateECDSAExample(string message)
24+
{
25+
Console.WriteLine("=== ECDSA Example ===");
26+
27+
// Create ECDSA instance with P-256 curve
28+
var nistP256 = ECCurve.NamedCurves.nistP256;
29+
using var ecdsa = ECDsa.Create(ECCurve.NamedCurves.nistP256);
30+
31+
// Message to sign
32+
var messageBytes = Encoding.UTF8.GetBytes(message);
33+
34+
Console.WriteLine($"Original message: {message}");
35+
36+
// Sign the message
37+
var signature = ecdsa.SignData(messageBytes, HashAlgorithmName.SHA256);
38+
39+
Console.WriteLine($"Signature: {Convert.ToBase64String(signature)}");
40+
41+
// Verify the signature
42+
var isValid = ecdsa.VerifyData(messageBytes, signature, HashAlgorithmName.SHA256);
43+
Console.WriteLine($"Signature valid: {isValid}");
44+
45+
// Export public key for verification by others
46+
var publicKey = ecdsa.ExportParameters(false);
47+
Console.WriteLine($"Public key X: {Convert.ToBase64String(publicKey.Q.X)}");
48+
Console.WriteLine($"Public key Y: {Convert.ToBase64String(publicKey.Q.Y)}");
49+
50+
// Demonstrate verification with tampered data
51+
var tamperedMessage = Encoding.UTF8.GetBytes("Hello, ECDSA Modified!");
52+
var isValidTampered = ecdsa.VerifyData(tamperedMessage, signature, HashAlgorithmName.SHA256);
53+
Console.WriteLine($"Tampered signature valid: {isValidTampered}");
54+
55+
// Test with different instance
56+
using var ecdsaNew = ECDsa.Create();
57+
byte[] newMessageBytes = Encoding.UTF8.GetBytes("Hello, ECDSA!");
58+
var newSignature = ecdsaNew.SignData(newMessageBytes, HashAlgorithmName.SHA256);
59+
60+
// Verify the signature
61+
var isNewValid = ecdsaNew.VerifyData(newMessageBytes, newSignature, HashAlgorithmName.SHA256);
62+
Console.WriteLine($"New signature valid: {isNewValid}");
63+
64+
var parameters = ecdsaNew.ExportParameters(false);
65+
66+
var ecdsaFromParams = ECDsa.Create(parameters);
67+
var signatureFromParams = ecdsaFromParams.SignData(newMessageBytes, HashAlgorithmName.SHA256);
68+
var isValidFromParams = ecdsaFromParams.VerifyData(newMessageBytes, signatureFromParams, HashAlgorithmName.SHA256);
69+
Console.WriteLine($"Signature valid with parameters: {isValidFromParams}");
70+
}
71+
72+
private static void DemonstrateRSAExample(string message)
73+
{
74+
Console.WriteLine("=== RSA Example ===");
75+
76+
using RSA rsa = RSA.Create();
77+
byte[] data = Encoding.UTF8.GetBytes(message);
78+
byte[] sig = rsa.SignData(data, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
79+
bool isValid = rsa.VerifyData(data, sig, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
80+
Console.WriteLine($"Signature valid: {isValid}");
81+
82+
// Create with parameters
83+
RSAParameters parameters = rsa.ExportParameters(true);
84+
using RSA rsaWithParams = RSA.Create(parameters);
85+
byte[] sigWithParams = rsaWithParams.SignData(data, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
86+
bool isValidWithParams = rsaWithParams.VerifyData(data, sigWithParams, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
87+
Console.WriteLine($"Signature valid with parameters: {isValidWithParams}");
88+
89+
// Create with specific key size
90+
using RSA rsaWithKeySize = RSA.Create(2048);
91+
byte[] sigWithKeySize = rsaWithKeySize.SignData(data, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
92+
bool isValidWithKeySize = rsaWithKeySize.VerifyData(data, sigWithKeySize, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
93+
Console.WriteLine($"Signature valid with key size: {isValidWithKeySize}");
94+
}
95+
96+
private static void DemonstrateRSAFormatterExample(string message)
97+
{
98+
Console.WriteLine("=== RSA Formatter Example ===");
99+
100+
using SHA256 alg = SHA256.Create();
101+
102+
byte[] data = Encoding.UTF8.GetBytes(message);
103+
byte[] hash = alg.ComputeHash(data);
104+
105+
RSAParameters sharedParameters;
106+
byte[] signedHash;
107+
108+
// Generate signature
109+
using (RSA rsa = RSA.Create())
110+
{
111+
sharedParameters = rsa.ExportParameters(false);
112+
113+
RSAPKCS1SignatureFormatter rsaFormatter = new(rsa);
114+
rsaFormatter.SetHashAlgorithm(nameof(SHA256));
115+
116+
signedHash = rsaFormatter.CreateSignature(hash);
117+
}
118+
119+
// Verify signature
120+
using (RSA rsa = RSA.Create())
121+
{
122+
rsa.ImportParameters(sharedParameters);
123+
124+
RSAPKCS1SignatureDeformatter rsaDeformatter = new(rsa);
125+
rsaDeformatter.SetHashAlgorithm(nameof(SHA256));
126+
127+
if (rsaDeformatter.VerifySignature(hash, signedHash))
128+
{
129+
Console.WriteLine("The signature is valid.");
130+
}
131+
else
132+
{
133+
Console.WriteLine("The signature is not valid.");
134+
}
135+
}
136+
}
137+
}
138+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
semmle-extractor-options: /nostdlib /noconfig
2+
semmle-extractor-options: --load-sources-from-project:${testdir}/../../../../../resources/stubs/_frameworks/Microsoft.NETCore.App/Microsoft.NETCore.App.csproj
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
| SignatureExample.cs:37:29:37:82 | SignOperation | SignatureExample.cs:37:44:37:55 | Message |
2+
| SignatureExample.cs:42:27:42:93 | VerifyOperation | SignatureExample.cs:42:44:42:55 | Message |
3+
| SignatureExample.cs:52:35:52:104 | VerifyOperation | SignatureExample.cs:52:52:52:66 | Message |
4+
| SignatureExample.cs:58:32:58:91 | SignOperation | SignatureExample.cs:58:50:58:64 | Message |
5+
| SignatureExample.cs:61:30:61:105 | VerifyOperation | SignatureExample.cs:61:50:61:64 | Message |
6+
| SignatureExample.cs:67:39:67:105 | SignOperation | SignatureExample.cs:67:64:67:78 | Message |
7+
| SignatureExample.cs:68:37:68:126 | VerifyOperation | SignatureExample.cs:68:64:68:78 | Message |
8+
| SignatureExample.cs:78:26:78:96 | SignOperation | SignatureExample.cs:78:39:78:42 | Message |
9+
| SignatureExample.cs:79:28:79:105 | VerifyOperation | SignatureExample.cs:79:43:79:46 | Message |
10+
| SignatureExample.cs:85:36:85:116 | SignOperation | SignatureExample.cs:85:59:85:62 | Message |
11+
| SignatureExample.cs:86:38:86:135 | VerifyOperation | SignatureExample.cs:86:63:86:66 | Message |
12+
| SignatureExample.cs:91:37:91:118 | SignOperation | SignatureExample.cs:91:61:91:64 | Message |
13+
| SignatureExample.cs:92:39:92:138 | VerifyOperation | SignatureExample.cs:92:65:92:68 | Message |
14+
| SignatureExample.cs:116:30:116:63 | SignOperation | SignatureExample.cs:116:59:116:62 | Message |
15+
| SignatureExample.cs:127:21:127:68 | VerifyOperation | SignatureExample.cs:127:52:127:55 | Message |
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import csharp
2+
import experimental.quantum.Language
3+
4+
from Crypto::SignatureOperationNode n
5+
select n, n.getAnInputArtifact()
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
| SignatureExample.cs:37:29:37:82 | SignOperation | ECDSA | ECDsa |
2+
| SignatureExample.cs:42:27:42:93 | VerifyOperation | ECDSA | ECDsa |
3+
| SignatureExample.cs:52:35:52:104 | VerifyOperation | ECDSA | ECDsa |
4+
| SignatureExample.cs:58:32:58:91 | SignOperation | ECDSA | ECDsa |
5+
| SignatureExample.cs:61:30:61:105 | VerifyOperation | ECDSA | ECDsa |
6+
| SignatureExample.cs:67:39:67:105 | SignOperation | ECDSA | ECDsa |
7+
| SignatureExample.cs:68:37:68:126 | VerifyOperation | ECDSA | ECDsa |
8+
| SignatureExample.cs:78:26:78:96 | SignOperation | UnknownSignature | RSA |
9+
| SignatureExample.cs:79:28:79:105 | VerifyOperation | UnknownSignature | RSA |
10+
| SignatureExample.cs:85:36:85:116 | SignOperation | UnknownSignature | RSA |
11+
| SignatureExample.cs:86:38:86:135 | VerifyOperation | UnknownSignature | RSA |
12+
| SignatureExample.cs:91:37:91:118 | SignOperation | UnknownSignature | RSA |
13+
| SignatureExample.cs:92:39:92:138 | VerifyOperation | UnknownSignature | RSA |
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import csharp
2+
import experimental.quantum.Language
3+
4+
from Crypto::SignatureOperationNode signature, Crypto::AlgorithmNode algorithm
5+
where algorithm = signature.getAKnownAlgorithm()
6+
select signature, algorithm.getAlgorithmName(), algorithm.getRawAlgorithmName()
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
| SignatureExample.cs:37:29:37:82 | SignOperation | SignatureExample.cs:29:31:29:72 | Key |
2+
| SignatureExample.cs:42:27:42:93 | VerifyOperation | SignatureExample.cs:29:31:29:72 | Key |
3+
| SignatureExample.cs:52:35:52:104 | VerifyOperation | SignatureExample.cs:29:31:29:72 | Key |
4+
| SignatureExample.cs:58:32:58:91 | SignOperation | SignatureExample.cs:56:34:56:47 | Key |
5+
| SignatureExample.cs:61:30:61:105 | VerifyOperation | SignatureExample.cs:56:34:56:47 | Key |
6+
| SignatureExample.cs:67:39:67:105 | SignOperation | SignatureExample.cs:66:48:66:57 | Key |
7+
| SignatureExample.cs:68:37:68:126 | VerifyOperation | SignatureExample.cs:66:48:66:57 | Key |
8+
| SignatureExample.cs:78:26:78:96 | SignOperation | SignatureExample.cs:76:29:76:40 | Key |
9+
| SignatureExample.cs:79:28:79:105 | VerifyOperation | SignatureExample.cs:76:29:76:40 | Key |
10+
| SignatureExample.cs:85:36:85:116 | SignOperation | SignatureExample.cs:84:50:84:59 | Key |
11+
| SignatureExample.cs:86:38:86:135 | VerifyOperation | SignatureExample.cs:84:50:84:59 | Key |
12+
| SignatureExample.cs:91:37:91:118 | SignOperation | SignatureExample.cs:90:40:90:55 | Key |
13+
| SignatureExample.cs:92:39:92:138 | VerifyOperation | SignatureExample.cs:90:40:90:55 | Key |
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import csharp
2+
import experimental.quantum.Language
3+
4+
from Crypto::SignatureOperationNode n
5+
select n, n.getAKey()
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
| SignatureExample.cs:42:27:42:93 | VerifyOperation | SignatureExample.cs:42:44:42:55 | Message | SignatureExample.cs:42:58:42:66 | SignatureInput |
2+
| SignatureExample.cs:52:35:52:104 | VerifyOperation | SignatureExample.cs:52:52:52:66 | Message | SignatureExample.cs:52:69:52:77 | SignatureInput |
3+
| SignatureExample.cs:61:30:61:105 | VerifyOperation | SignatureExample.cs:61:50:61:64 | Message | SignatureExample.cs:61:67:61:78 | SignatureInput |
4+
| SignatureExample.cs:68:37:68:126 | VerifyOperation | SignatureExample.cs:68:64:68:78 | Message | SignatureExample.cs:68:81:68:99 | SignatureInput |
5+
| SignatureExample.cs:79:28:79:105 | VerifyOperation | SignatureExample.cs:79:43:79:46 | Message | SignatureExample.cs:79:49:79:51 | SignatureInput |
6+
| SignatureExample.cs:86:38:86:135 | VerifyOperation | SignatureExample.cs:86:63:86:66 | Message | SignatureExample.cs:86:69:86:81 | SignatureInput |
7+
| SignatureExample.cs:92:39:92:138 | VerifyOperation | SignatureExample.cs:92:65:92:68 | Message | SignatureExample.cs:92:71:92:84 | SignatureInput |
8+
| SignatureExample.cs:127:21:127:68 | VerifyOperation | SignatureExample.cs:127:52:127:55 | Message | SignatureExample.cs:127:58:127:67 | SignatureInput |
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import csharp
2+
import experimental.quantum.Language
3+
4+
from Crypto::SignatureOperationNode n
5+
select n, n.getAnInputArtifact(), n.getASignatureArtifact()

0 commit comments

Comments
 (0)