Skip to content

Commit 39581e2

Browse files
committed
quantum-c#: add support for RSAPKC1Signature formatters
1 parent 7d7b8b2 commit 39581e2

File tree

7 files changed

+99
-55
lines changed

7 files changed

+99
-55
lines changed

csharp/ql/lib/experimental/quantum/dotnet/Cryptography.qll

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,12 @@ class RsaType extends CryptographyType {
6262
RsaType() { this.hasName("RSA") }
6363
}
6464

65+
class RsaPkcs1Type extends CryptographyType {
66+
RsaPkcs1Type() { this.getName().matches("RSAPKCS1Signature%") }
67+
}
68+
6569
class EcdsaCreateCall extends CryptographyCreateCall {
66-
EcdsaCreateCall() { this.getQualifier().getType().hasName("ECDsa") }
70+
EcdsaCreateCall() { this.getQualifier().getType() instanceof EcdsaType }
6771
}
6872

6973
// This class is used to model the `ECDsa.Create(ECParameters)` call
@@ -305,9 +309,11 @@ class EcdsaSignerQualifier extends SignerQualifier instanceof Expr {
305309
}
306310

307311
class RsaSignerQualifier extends SignerQualifier instanceof Expr {
308-
RsaSignerQualifier() { super.getType() instanceof RsaType }
312+
RsaSignerQualifier() {
313+
super.getType() instanceof RsaType or super.getType() instanceof RsaPkcs1Type
314+
}
309315

310-
override string getRawAlgorithmName() { result = "RSA" }
316+
override string getRawAlgorithmName() { result = super.getType().getName() }
311317

312318
override Crypto::KeyOpAlg::Algorithm getAlgorithmType() {
313319
result = Crypto::KeyOpAlg::TSignature(Crypto::KeyOpAlg::OtherSignatureAlgorithmType())

csharp/ql/lib/experimental/quantum/dotnet/FlowAnalysis.qll

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,6 @@ module HashAlgorithmNameToUseConfig implements DataFlow::ConfigSig {
6464

6565
module HashAlgorithmNameToUse = DataFlow::Global<HashAlgorithmNameToUseConfig>;
6666

67-
module SigningCreateToUseFlow = CreationToUseFlow<SigningCreateCall, SignerUse>;
68-
6967
module HashCreateToUseFlow = CreationToUseFlow<HashAlgorithmCreateCall, HashUse>;
7068

7169
module CryptoStreamFlow = CreationToUseFlow<CryptoStreamCreation, CryptoStreamUse>;
@@ -254,3 +252,40 @@ class PropertyWriteFlowStep extends AdditionalFlowInputStep {
254252

255253
override DataFlow::Node getOutput() { result.asExpr() = assignment.getLValue() }
256254
}
255+
256+
module SigningCreateToUseFlow {
257+
private module SigningCreateToUseFlow implements DataFlow::ConfigSig {
258+
predicate isSource(DataFlow::Node source) { source.asExpr() instanceof SigningCreateCall }
259+
260+
predicate isSink(DataFlow::Node sink) {
261+
sink.asExpr() = any(SignerUse use).(QualifiableExpr).getQualifier()
262+
}
263+
264+
/**
265+
* An additional flow step across new object creations that use the original objects.
266+
*
267+
* Example:
268+
* ```
269+
* RSA rsa = RSA.Create()
270+
* RSAPKCS1SignatureFormatter rsaFormatter = new(rsa);
271+
* rsaFormatter.SetHashAlgorithm(nameof(SHA256));
272+
* signedHash = rsaFormatter.CreateSignature(hash);
273+
* ```
274+
*/
275+
predicate isAdditionalFlowStep(DataFlow::Node node1, DataFlow::Node node2) {
276+
exists(ObjectCreation create |
277+
node2.asExpr() = create and node1.asExpr() = create.getAnArgument()
278+
)
279+
}
280+
}
281+
282+
private module CreationToUseFlow = DataFlow::Global<SigningCreateToUseFlow>;
283+
284+
SigningCreateCall getCreationFromUse(
285+
SignerUse use, CreationToUseFlow::PathNode source, CreationToUseFlow::PathNode sink
286+
) {
287+
source.getNode().asExpr() = result and
288+
sink.getNode().asExpr() = use.(QualifiableExpr).getQualifier() and
289+
CreationToUseFlow::flowPath(source, sink)
290+
}
291+
}

csharp/ql/test/experimental/library-tests/quantum/dotnet/signatures/SignatureExample.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ private static void DemonstrateECDSAExample(string message)
2525
Console.WriteLine("=== ECDSA Example ===");
2626

2727
// Create ECDSA instance with P-256 curve
28-
var nistP256 = ECCurve.NamedCurves.nistP256;
2928
using var ecdsa = ECDsa.Create(ECCurve.NamedCurves.nistP256);
3029

3130
// Message to sign
Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +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 |
1+
| SignatureExample.cs:36:29:36:82 | SignOperation | SignatureExample.cs:36:44:36:55 | Message |
2+
| SignatureExample.cs:41:27:41:93 | VerifyOperation | SignatureExample.cs:41:44:41:55 | Message |
3+
| SignatureExample.cs:51:35:51:104 | VerifyOperation | SignatureExample.cs:51:52:51:66 | Message |
4+
| SignatureExample.cs:57:32:57:91 | SignOperation | SignatureExample.cs:57:50:57:64 | Message |
5+
| SignatureExample.cs:60:30:60:105 | VerifyOperation | SignatureExample.cs:60:50:60:64 | Message |
6+
| SignatureExample.cs:66:39:66:105 | SignOperation | SignatureExample.cs:66:64:66:78 | Message |
7+
| SignatureExample.cs:67:37:67:126 | VerifyOperation | SignatureExample.cs:67:64:67:78 | Message |
8+
| SignatureExample.cs:77:26:77:96 | SignOperation | SignatureExample.cs:77:39:77:42 | Message |
9+
| SignatureExample.cs:78:28:78:105 | VerifyOperation | SignatureExample.cs:78:43:78:46 | Message |
10+
| SignatureExample.cs:84:36:84:116 | SignOperation | SignatureExample.cs:84:59:84:62 | Message |
11+
| SignatureExample.cs:85:38:85:135 | VerifyOperation | SignatureExample.cs:85:63:85:66 | Message |
12+
| SignatureExample.cs:90:37:90:118 | SignOperation | SignatureExample.cs:90:61:90:64 | Message |
13+
| SignatureExample.cs:91:39:91:138 | VerifyOperation | SignatureExample.cs:91:65:91:68 | Message |
14+
| SignatureExample.cs:115:30:115:63 | SignOperation | SignatureExample.cs:115:59:115:62 | Message |
15+
| SignatureExample.cs:126:21:126:68 | VerifyOperation | SignatureExample.cs:126:52:126:55 | Message |
Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
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 |
1+
| SignatureExample.cs:36:29:36:82 | SignOperation | ECDSA | ECDsa |
2+
| SignatureExample.cs:41:27:41:93 | VerifyOperation | ECDSA | ECDsa |
3+
| SignatureExample.cs:51:35:51:104 | VerifyOperation | ECDSA | ECDsa |
4+
| SignatureExample.cs:57:32:57:91 | SignOperation | ECDSA | ECDsa |
5+
| SignatureExample.cs:60:30:60:105 | VerifyOperation | ECDSA | ECDsa |
6+
| SignatureExample.cs:66:39:66:105 | SignOperation | ECDSA | ECDsa |
7+
| SignatureExample.cs:67:37:67:126 | VerifyOperation | ECDSA | ECDsa |
8+
| SignatureExample.cs:77:26:77:96 | SignOperation | UnknownSignature | RSA |
9+
| SignatureExample.cs:78:28:78:105 | VerifyOperation | UnknownSignature | RSA |
10+
| SignatureExample.cs:84:36:84:116 | SignOperation | UnknownSignature | RSA |
11+
| SignatureExample.cs:85:38:85:135 | VerifyOperation | UnknownSignature | RSA |
12+
| SignatureExample.cs:90:37:90:118 | SignOperation | UnknownSignature | RSA |
13+
| SignatureExample.cs:91:39:91:138 | VerifyOperation | UnknownSignature | RSA |
14+
| SignatureExample.cs:115:30:115:63 | SignOperation | UnknownSignature | RSAPKCS1SignatureFormatter |
15+
| SignatureExample.cs:126:21:126:68 | VerifyOperation | UnknownSignature | RSAPKCS1SignatureDeformatter |
Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
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 |
1+
| SignatureExample.cs:36:29:36:82 | SignOperation | SignatureExample.cs:28:31:28:72 | Key |
2+
| SignatureExample.cs:41:27:41:93 | VerifyOperation | SignatureExample.cs:28:31:28:72 | Key |
3+
| SignatureExample.cs:51:35:51:104 | VerifyOperation | SignatureExample.cs:28:31:28:72 | Key |
4+
| SignatureExample.cs:57:32:57:91 | SignOperation | SignatureExample.cs:55:34:55:47 | Key |
5+
| SignatureExample.cs:60:30:60:105 | VerifyOperation | SignatureExample.cs:55:34:55:47 | Key |
6+
| SignatureExample.cs:66:39:66:105 | SignOperation | SignatureExample.cs:65:48:65:57 | Key |
7+
| SignatureExample.cs:67:37:67:126 | VerifyOperation | SignatureExample.cs:65:48:65:57 | Key |
8+
| SignatureExample.cs:77:26:77:96 | SignOperation | SignatureExample.cs:75:29:75:40 | Key |
9+
| SignatureExample.cs:78:28:78:105 | VerifyOperation | SignatureExample.cs:75:29:75:40 | Key |
10+
| SignatureExample.cs:84:36:84:116 | SignOperation | SignatureExample.cs:83:50:83:59 | Key |
11+
| SignatureExample.cs:85:38:85:135 | VerifyOperation | SignatureExample.cs:83:50:83:59 | Key |
12+
| SignatureExample.cs:90:37:90:118 | SignOperation | SignatureExample.cs:89:40:89:55 | Key |
13+
| SignatureExample.cs:91:39:91:138 | VerifyOperation | SignatureExample.cs:89:40:89:55 | Key |
14+
| SignatureExample.cs:115:30:115:63 | SignOperation | SignatureExample.cs:108:30:108:41 | Key |
15+
| SignatureExample.cs:126:21:126:68 | VerifyOperation | SignatureExample.cs:119:30:119:41 | Key |
Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +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 |
1+
| SignatureExample.cs:41:27:41:93 | VerifyOperation | SignatureExample.cs:41:44:41:55 | Message | SignatureExample.cs:41:58:41:66 | SignatureInput |
2+
| SignatureExample.cs:51:35:51:104 | VerifyOperation | SignatureExample.cs:51:52:51:66 | Message | SignatureExample.cs:51:69:51:77 | SignatureInput |
3+
| SignatureExample.cs:60:30:60:105 | VerifyOperation | SignatureExample.cs:60:50:60:64 | Message | SignatureExample.cs:60:67:60:78 | SignatureInput |
4+
| SignatureExample.cs:67:37:67:126 | VerifyOperation | SignatureExample.cs:67:64:67:78 | Message | SignatureExample.cs:67:81:67:99 | SignatureInput |
5+
| SignatureExample.cs:78:28:78:105 | VerifyOperation | SignatureExample.cs:78:43:78:46 | Message | SignatureExample.cs:78:49:78:51 | SignatureInput |
6+
| SignatureExample.cs:85:38:85:135 | VerifyOperation | SignatureExample.cs:85:63:85:66 | Message | SignatureExample.cs:85:69:85:81 | SignatureInput |
7+
| SignatureExample.cs:91:39:91:138 | VerifyOperation | SignatureExample.cs:91:65:91:68 | Message | SignatureExample.cs:91:71:91:84 | SignatureInput |
8+
| SignatureExample.cs:126:21:126:68 | VerifyOperation | SignatureExample.cs:126:52:126:55 | Message | SignatureExample.cs:126:58:126:67 | SignatureInput |

0 commit comments

Comments
 (0)