Skip to content

Commit a70cd60

Browse files
committed
key sizes basic support
1 parent c6b2165 commit a70cd60

File tree

4 files changed

+64
-11
lines changed

4 files changed

+64
-11
lines changed

cpp/ql/lib/experimental/quantum/OpenSSL/AlgorithmInstances/KnownAlgorithmConstants.qll

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,12 @@ class KnownOpenSSLSignatureAlgorithmConstant extends KnownOpenSSLAlgorithmConsta
8282
predicate resolveAlgorithmFromCall(Call c, string normalized, string algType) {
8383
exists(string name, string parsedTargetName |
8484
parsedTargetName =
85-
c.getTarget().getName().replaceAll("EVP_", "").toLowerCase().replaceAll("_", "-") and
85+
c.getTarget()
86+
.getName()
87+
.replaceAll("EVP_", "")
88+
.replaceAll("_gen", "")
89+
.toLowerCase()
90+
.replaceAll("_", "-") and
8691
name = resolveAlgorithmAlias(parsedTargetName) and
8792
knownOpenSSLAlgorithmLiteral(name, _, normalized, algType)
8893
)

cpp/ql/lib/experimental/quantum/OpenSSL/AlgorithmInstances/SignatureAlgorithmInstance.qll

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,8 @@ class KnownOpenSSLSignatureConstantAlgorithmInstance extends OpenSSLAlgorithmIns
6969
override string getRawAlgorithmName() { result = this.(Literal).getValue().toString() }
7070

7171
override int getKeySizeFixed() {
72-
// this.(KnownOpenSSLSignatureAlgorithmConstant).getExplicitKeySize() = result
72+
// TODO: use ellipticCurveNameToKeySizeAndFamilyMapping or KnownOpenSSLEllipticCurveConstantAlgorithmInstance
73+
// TODO: maybe add getExplicitKeySize to KnownOpenSSLSignatureAlgorithmConstant and use it here
7374
none()
7475
}
7576

@@ -83,11 +84,20 @@ class KnownOpenSSLSignatureConstantAlgorithmInstance extends OpenSSLAlgorithmIns
8384
override OpenSSLAlgorithmValueConsumer getAVC() { result = getterCall }
8485

8586
override Crypto::ConsumerInputDataFlowNode getKeySizeConsumer() {
86-
// TODO: trace to any key size initializer, symmetric and asymmetric
87+
// TODO: trace to any key size initializer
88+
// probably PKeyAlgorithmValueConsumer and SignatureAlgorithmValueConsumer
8789
none()
8890
}
8991

92+
/**
93+
* No mode for signatures.
94+
*/
9095
override predicate shouldHaveModeOfOperation() { none() }
9196

92-
override predicate shouldHavePaddingScheme() { none() }
97+
/**
98+
* Padding only for RSA.
99+
*/
100+
override predicate shouldHavePaddingScheme() {
101+
this.getAlgorithmType() instanceof KeyOpAlg::TAsymmetricCipher
102+
}
93103
}

cpp/ql/lib/experimental/quantum/OpenSSL/Operations/EVPKeyGenOperation.qll

Lines changed: 44 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,18 +15,51 @@ class EVPKeyGenInitialize extends EVPInitialize {
1515
override Expr getAlgorithmArg() { result = getAlgorithmFromCtx(this.getContextArg()) }
1616
}
1717

18-
class EVPKeyGenOperation extends EVPOperation, Crypto::KeyGenerationOperationInstance {
18+
/**
19+
* All calls that can be tracked via ctx.
20+
* For example calls used to set parameters like a key size.
21+
*/
22+
class EVPKeyGenUpdate extends EVPUpdate {
23+
EVPKeyGenUpdate() {
24+
this.(Call).getTarget().getName() in [
25+
"EVP_PKEY_CTX_set_rsa_keygen_bits",
26+
// TODO: "EVP_PKEY_CTX_set_params"
27+
]
28+
}
29+
30+
/**
31+
* No input in our meaning.
32+
*/
33+
override Expr getInputArg() { none() }
34+
35+
/**
36+
* No output in our meaning.
37+
*/
38+
override Expr getOutputArg() { none() }
39+
40+
Expr getKeySizeArg() {
41+
this.(Call).getTarget().getName() = "EVP_PKEY_CTX_set_rsa_keygen_bits" and
42+
result = this.(Call).getArgument(1)
43+
}
44+
}
45+
46+
class EVPKeyGenOperation extends EVPFinal, Crypto::KeyGenerationOperationInstance {
1947
EVPKeyGenOperation() {
2048
this.(Call).getTarget().getName() in [
21-
"EVP_PKEY_generate", "EVP_PKEY_keygen", "EVP_PKEY_Q_keygen", "EVP_PKEY_paramgen"
22-
// TODO: "EVP_PKEY_paramgen"
49+
"EVP_PKEY_generate", "EVP_PKEY_keygen", "EVP_PKEY_Q_keygen", "EVP_PKEY_paramgen",
50+
"EVP_RSA_gen"
51+
// TODO: "EVP_PKEY_paramgen" may need special handling
52+
// TODO: RSA_generate_key, RSA_generate_key_ex, etc
2353
]
2454
}
2555

2656
override Expr getAlgorithmArg() {
2757
if this.(Call).getTarget().getName() = "EVP_PKEY_Q_keygen"
2858
then result = this.(Call).getArgument(0)
29-
else result = EVPOperation.super.getAlgorithmArg()
59+
else
60+
if this.(Call).getTarget().getName() = "EVP_RSA_gen"
61+
then result = this
62+
else result = EVPFinal.super.getAlgorithmArg()
3063
}
3164

3265
override Crypto::KeyArtifactType getOutputKeyType() { result = Crypto::TAsymmetricKeyType() }
@@ -36,11 +69,16 @@ class EVPKeyGenOperation extends EVPOperation, Crypto::KeyGenerationOperationIns
3669
override Expr getOutputArg() { result = this.(Call).getArgument(1) }
3770

3871
override Crypto::ArtifactOutputDataFlowNode getOutputKeyArtifact() {
39-
result = EVPOperation.super.getOutputKeyArtifact()
72+
result = EVPFinal.super.getOutputKeyArtifact()
4073
}
4174

4275
override Crypto::ConsumerInputDataFlowNode getKeySizeConsumer() {
43-
none() // TODO
76+
if this.(Call).getTarget().getName() = "EVP_PKEY_Q_keygen"
77+
then result = DataFlow::exprNode(this.(Call).getArgument(3)) // TODO: may be wrong for EC keys
78+
else
79+
if this.(Call).getTarget().getName() = "EVP_RSA_gen"
80+
then result = DataFlow::exprNode(this.(Call).getArgument(0))
81+
else result = DataFlow::exprNode(this.getUpdateCalls().(EVPKeyGenUpdate).getKeySizeArg())
4482
}
4583

4684
override int getKeySizeFixed() {

cpp/ql/lib/experimental/quantum/OpenSSL/Operations/OpenSSLOperationBase.qll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ abstract class OpenSSLOperation extends Crypto::OperationInstance instanceof Ope
2020

2121
/**
2222
* Algorithm is either an argument and we track it to AlgorithmValueConsumer
23-
* or we have the AlgorithmValueConsumer already and just return it.
23+
* or we have the AlgorithmValueConsumer already tracked down and just return it.
2424
*/
2525
override Crypto::AlgorithmValueConsumer getAnAlgorithmValueConsumer() {
2626
AlgGetterToAlgConsumerFlow::flow(result.(OpenSSLAlgorithmValueConsumer).getResultNode(),

0 commit comments

Comments
 (0)