Skip to content

Commit 6e5734a

Browse files
committed
Crypto: Fix openssl padding to propery link async padding to hashing configs.
1 parent 7559c06 commit 6e5734a

File tree

10 files changed

+188
-67
lines changed

10 files changed

+188
-67
lines changed

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,9 @@ module KnownOpenSslAlgorithmToAlgorithmValueConsumerFlow =
4949
DataFlow::Global<KnownOpenSslAlgorithmToAlgorithmValueConsumerConfig>;
5050

5151
module RSAPaddingAlgorithmToPaddingAlgorithmValueConsumerConfig implements DataFlow::ConfigSig {
52-
predicate isSource(DataFlow::Node source) { source.asExpr() instanceof OpenSslPaddingLiteral }
52+
predicate isSource(DataFlow::Node source) {
53+
source.asExpr() instanceof OpenSslSpecialPaddingLiteral
54+
}
5355

5456
predicate isSink(DataFlow::Node sink) {
5557
exists(PaddingAlgorithmValueConsumer c | c.getInputNode() = sink)

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

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@ private import KnownAlgorithmConstants
44
private import Crypto::KeyOpAlg as KeyOpAlg
55
private import OpenSSLAlgorithmInstanceBase
66
private import PaddingAlgorithmInstance
7-
private import experimental.quantum.OpenSSL.AlgorithmValueConsumers.OpenSSLAlgorithmValueConsumerBase
8-
private import experimental.quantum.OpenSSL.AlgorithmValueConsumers.DirectAlgorithmValueConsumer
7+
private import experimental.quantum.OpenSSL.Operations.OpenSSLOperationBase
8+
private import experimental.quantum.OpenSSL.AlgorithmValueConsumers.OpenSSLAlgorithmValueConsumers
9+
private import OpenSSLAlgorithmInstances
910
private import AlgToAVCFlow
1011
private import BlockAlgorithmInstance
1112

@@ -97,10 +98,13 @@ class KnownOpenSslCipherConstantAlgorithmInstance extends OpenSslAlgorithmInstan
9798
}
9899

99100
override Crypto::PaddingAlgorithmInstance getPaddingAlgorithm() {
100-
//TODO: the padding is either self, or it flows through getter ctx to a set padding call
101-
// like EVP_PKEY_CTX_set_rsa_padding
102101
result = this
103-
// TODO or trace through getter ctx to set padding
102+
or
103+
exists(OperationStep s |
104+
this.getAvc().(AvcContextCreationStep).flowsToOperationStep(s) and
105+
s.getAlgorithmValueConsumerForInput(PaddingAlgorithmIO()) =
106+
result.(OpenSslAlgorithmInstance).getAvc()
107+
)
104108
}
105109

106110
override string getRawAlgorithmName() {

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

Lines changed: 15 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import cpp
22
private import experimental.quantum.Language
33
private import OpenSSLAlgorithmInstanceBase
4+
private import experimental.quantum.OpenSSL.Operations.OpenSSLOperationBase
45
private import experimental.quantum.OpenSSL.AlgorithmInstances.KnownAlgorithmConstants
56
private import AlgToAVCFlow
67
private import experimental.quantum.OpenSSL.AlgorithmValueConsumers.DirectAlgorithmValueConsumer
@@ -17,13 +18,14 @@ private import experimental.quantum.OpenSSL.AlgorithmValueConsumers.OpenSSLAlgor
1718
* # define RSA_PKCS1_WITH_TLS_PADDING 7
1819
* # define RSA_PKCS1_NO_IMPLICIT_REJECT_PADDING 8
1920
*/
20-
class OpenSslPaddingLiteral extends Literal {
21+
class OpenSslSpecialPaddingLiteral extends Literal {
2122
// TODO: we can be more specific about where the literal is in a larger expression
2223
// to avoid literals that are clealy not representing an algorithm, e.g., array indices.
23-
OpenSslPaddingLiteral() { this.getValue().toInt() in [0, 1, 3, 4, 5, 6, 7, 8] }
24+
OpenSslSpecialPaddingLiteral() { this.getValue().toInt() in [0, 1, 3, 4, 5, 6, 7, 8] }
2425
}
2526

2627
/**
28+
* Holds if `e` has the given `type`.
2729
* Given a `KnownOpenSslPaddingAlgorithmExpr`, converts this to a padding family type.
2830
* Does not bind if there is no mapping (no mapping to 'unknown' or 'other').
2931
*/
@@ -44,9 +46,6 @@ predicate knownOpenSslConstantToPaddingFamilyType(
4446
)
4547
}
4648

47-
//abstract class OpenSslPaddingAlgorithmInstance extends OpenSslAlgorithmInstance, Crypto::PaddingAlgorithmInstance{}
48-
// TODO: need to alter this to include known padding constants which don't have the
49-
// same mechanics as those with known nids
5049
class KnownOpenSslPaddingConstantAlgorithmInstance extends OpenSslAlgorithmInstance,
5150
Crypto::PaddingAlgorithmInstance instanceof Expr
5251
{
@@ -78,7 +77,7 @@ class KnownOpenSslPaddingConstantAlgorithmInstance extends OpenSslAlgorithmInsta
7877
isPaddingSpecificConsumer = false
7978
or
8079
// Possibility 3: padding-specific literal
81-
this instanceof OpenSslPaddingLiteral and
80+
this instanceof OpenSslSpecialPaddingLiteral and
8281
exists(DataFlow::Node src, DataFlow::Node sink |
8382
// Sink is an argument to a CipherGetterCall
8483
sink = getterCall.getInputNode() and
@@ -123,44 +122,6 @@ class KnownOpenSslPaddingConstantAlgorithmInstance extends OpenSslAlgorithmInsta
123122
}
124123
}
125124

126-
// // Values used for EVP_PKEY_CTX_set_rsa_padding, these are
127-
// // not the same as 'typical' constants found in the set of known algorithm constants
128-
// // they do not have an NID
129-
// // TODO: what about setting the padding directly?
130-
// class KnownRSAPaddingConstant extends OpenSslPaddingAlgorithmInstance, Crypto::PaddingAlgorithmInstance instanceof Literal
131-
// {
132-
// KnownRSAPaddingConstant() {
133-
// // from rsa.h in openssl:
134-
// // # define RSA_PKCS1_PADDING 1
135-
// // # define RSA_NO_PADDING 3
136-
// // # define RSA_PKCS1_OAEP_PADDING 4
137-
// // # define RSA_X931_PADDING 5
138-
// // /* EVP_PKEY_ only */
139-
// // # define RSA_PKCS1_PSS_PADDING 6
140-
// // # define RSA_PKCS1_WITH_TLS_PADDING 7
141-
// // /* internal RSA_ only */
142-
// // # define RSA_PKCS1_NO_IMPLICIT_REJECT_PADDING 8
143-
// this instanceof Literal and
144-
// this.getValue().toInt() in [0, 1, 3, 4, 5, 6, 7, 8]
145-
// // TODO: trace to padding-specific consumers
146-
// RSAPaddingAlgorithmToPaddingAlgorithmValueConsumerFlow
147-
// }
148-
// override string getRawPaddingAlgorithmName() { result = this.(Literal).getValue().toString() }
149-
// override Crypto::TPaddingType getPaddingType() {
150-
// if this.(Literal).getValue().toInt() in [1, 6, 7, 8]
151-
// then result = Crypto::PKCS1_v1_5()
152-
// else
153-
// if this.(Literal).getValue().toInt() = 3
154-
// then result = Crypto::NoPadding()
155-
// else
156-
// if this.(Literal).getValue().toInt() = 4
157-
// then result = Crypto::OAEP()
158-
// else
159-
// if this.(Literal).getValue().toInt() = 5
160-
// then result = Crypto::ANSI_X9_23()
161-
// else result = Crypto::OtherPadding()
162-
// }
163-
// }
164125
class OAEPPaddingAlgorithmInstance extends Crypto::OAEPPaddingAlgorithmInstance,
165126
KnownOpenSslPaddingConstantAlgorithmInstance
166127
{
@@ -169,10 +130,18 @@ class OAEPPaddingAlgorithmInstance extends Crypto::OAEPPaddingAlgorithmInstance,
169130
}
170131

171132
override Crypto::HashAlgorithmInstance getOAEPEncodingHashAlgorithm() {
172-
none() //TODO
133+
exists(OperationStep s |
134+
this.getAvc().(AvcContextCreationStep).flowsToOperationStep(s) and
135+
s.getAlgorithmValueConsumerForInput(HashAlgorithmOaepIO()) =
136+
result.(OpenSslAlgorithmInstance).getAvc()
137+
)
173138
}
174139

175140
override Crypto::HashAlgorithmInstance getMGF1HashAlgorithm() {
176-
none() //TODO
141+
exists(OperationStep s |
142+
this.getAvc().(AvcContextCreationStep).flowsToOperationStep(s) and
143+
s.getAlgorithmValueConsumerForInput(HashAlgorithmMgf1IO()) =
144+
result.(OpenSslAlgorithmInstance).getAvc()
145+
)
177146
}
178147
}

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

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,14 @@ class EvpCipherFinalCall extends EvpCipherOperationFinalStep {
214214
*/
215215
class EvpPKeyCipherOperation extends EvpCipherOperationFinalStep {
216216
EvpPKeyCipherOperation() {
217-
this.getTarget().getName() in ["EVP_PKEY_encrypt", "EVP_PKEY_decrypt"]
217+
this.getTarget().getName() in ["EVP_PKEY_encrypt", "EVP_PKEY_decrypt"] and
218+
// TODO: for now ignore this operation entirely if it is setting the cipher text to null
219+
// this needs to be re-evalauted if this scenario sets other values worth tracking
220+
(
221+
exists(this.(Call).getArgument(1).getValue())
222+
implies
223+
this.(Call).getArgument(1).getValue().toInt() != 0
224+
)
218225
}
219226

220227
override DataFlow::Node getInput(IOType type) {
@@ -226,9 +233,24 @@ class EvpPKeyCipherOperation extends EvpCipherOperationFinalStep {
226233
override DataFlow::Node getOutput(IOType type) {
227234
super.getOutput(type) = result
228235
or
229-
result.asExpr() = this.getArgument(1) and type = CiphertextIO()
236+
result.asExpr() = this.getArgument(1) and
237+
type = CiphertextIO() and
238+
this.getStepType() = FinalStep()
230239
// TODO: could indicate text lengths here, as well
231240
}
241+
242+
override OperationStepType getStepType() {
243+
// When the output buffer is null, the step is not a final step
244+
// it is used to get the buffer size, if 0 consider it an initialization step
245+
// NOTE/TODO: not tracing 0 to the arg, just looking for 0 directly in param
246+
// the assumption is this is the common case, but we may want to make this more
247+
// robust and support a dataflow.
248+
result = FinalStep() and
249+
(exists(super.getArgument(1).getValue()) implies super.getArgument(1).getValue().toInt() != 0)
250+
or
251+
result = InitializerStep() and
252+
super.getArgument(1).getValue().toInt() = 0
253+
}
232254
}
233255

234256
/**

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

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -71,19 +71,42 @@ class EvpCtxSetEcParamgenCurveNidInitializer extends OperationStep {
7171
* - `EVP_PKEY_CTX_set_ecdh_kdf_md`
7272
*/
7373
class EvpCtxSetHashInitializer extends OperationStep {
74+
boolean isOaep;
75+
boolean isMgf1;
76+
7477
EvpCtxSetHashInitializer() {
7578
this.getTarget().getName() in [
76-
"EVP_PKEY_CTX_set_signature_md", "EVP_PKEY_CTX_set_rsa_mgf1_md_name",
77-
"EVP_PKEY_CTX_set_rsa_mgf1_md", "EVP_PKEY_CTX_set_rsa_oaep_md_name",
78-
"EVP_PKEY_CTX_set_rsa_oaep_md", "EVP_PKEY_CTX_set_dsa_paramgen_md",
79+
"EVP_PKEY_CTX_set_signature_md", "EVP_PKEY_CTX_set_dsa_paramgen_md",
7980
"EVP_PKEY_CTX_set_dh_kdf_md", "EVP_PKEY_CTX_set_ecdh_kdf_md"
80-
]
81+
] and
82+
isOaep = false and
83+
isMgf1 = false
84+
or
85+
this.getTarget().getName() in [
86+
"EVP_PKEY_CTX_set_rsa_mgf1_md_name", "EVP_PKEY_CTX_set_rsa_mgf1_md"
87+
] and
88+
isOaep = false and
89+
isMgf1 = true
90+
or
91+
this.getTarget().getName() in [
92+
"EVP_PKEY_CTX_set_rsa_oaep_md_name",
93+
"EVP_PKEY_CTX_set_rsa_oaep_md"
94+
] and
95+
isOaep = true and
96+
isMgf1 = false
8197
}
8298

8399
override DataFlow::Node getInput(IOType type) {
84100
result.asExpr() = this.getArgument(0) and type = ContextIO()
85101
or
86-
result.asExpr() = this.getArgument(1) and type = HashAlgorithmIO()
102+
result.asExpr() = this.getArgument(1) and
103+
type = HashAlgorithmIO() and
104+
isOaep = false and
105+
isMgf1 = false
106+
or
107+
result.asExpr() = this.getArgument(1) and type = HashAlgorithmOaepIO() and isOaep = true
108+
or
109+
result.asExpr() = this.getArgument(1) and type = HashAlgorithmMgf1IO() and isMgf1 = true
87110
}
88111

89112
override DataFlow::Node getOutput(IOType type) {

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

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,11 @@ newtype TIOType =
5858
// For OSSL_PARAM and OSSL_LIB_CTX use of OsslParamIO and OsslLibContextIO
5959
ContextIO() or
6060
DigestIO() or
61+
// For OAEP and MGF1 hashes, there is a special IO type for these hashes
62+
// it is recommended to set the most explicit type known, not both
6163
HashAlgorithmIO() or
64+
HashAlgorithmOaepIO() or
65+
HashAlgorithmMgf1IO() or
6266
IVorNonceIO() or
6367
KeyIO() or
6468
KeyOperationSubtypeIO() or
@@ -254,18 +258,18 @@ abstract class OperationStep extends Call {
254258
* operation step (dominating operation step, see `getDominatingInitializersToStep`).
255259
*/
256260
Crypto::AlgorithmValueConsumer getPrimaryAlgorithmValueConsumer() {
257-
exists(DataFlow::Node src, DataFlow::Node sink, IOType t, OperationStep avcSucc |
261+
exists(DataFlow::Node src, DataFlow::Node sink, IOType t, OperationStep avcConsumingPred |
258262
(t = PrimaryAlgorithmIO() or t = ContextIO()) and
259-
avcSucc.flowsToOperationStep(this) and
263+
avcConsumingPred.flowsToOperationStep(this) and
260264
src.asExpr() = result and
261-
sink = avcSucc.getInput(t) and
265+
sink = avcConsumingPred.getInput(t) and
262266
AvcToOperationStepFlow::flow(src, sink) and
263267
(
264-
// Case 1: the avcSucc step is a dominating initialization step
268+
// Case 1: the avcConsumingPred step is a dominating initialization step
265269
t = PrimaryAlgorithmIO() and
266-
avcSucc = this.getDominatingInitializersToStep(PrimaryAlgorithmIO())
270+
avcConsumingPred = this.getDominatingInitializersToStep(PrimaryAlgorithmIO())
267271
or
268-
// Case 2: the succ is a context input (any avcSucc is valid)
272+
// Case 2: the pred is a context input
269273
t = ContextIO()
270274
)
271275
)
@@ -277,6 +281,8 @@ abstract class OperationStep extends Call {
277281
* TODO: generalize to use this for `getPrimaryAlgorithmValueConsumer`
278282
*/
279283
Crypto::AlgorithmValueConsumer getAlgorithmValueConsumerForInput(IOType type) {
284+
result = this and this.setsValue(type)
285+
or
280286
exists(DataFlow::Node src, DataFlow::Node sink |
281287
AvcToOperationStepFlow::flow(src, sink) and
282288
src.asExpr() = result and

cpp/ql/test/experimental/library-tests/quantum/node_edges.expected

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,20 @@
4141
| openssl_basic.c:167:9:167:27 | SignOperation | Input | openssl_basic.c:163:35:163:41 | Message |
4242
| openssl_basic.c:167:9:167:27 | SignOperation | Key | openssl_basic.c:160:59:160:62 | Key |
4343
| openssl_basic.c:167:9:167:27 | SignOperation | Output | openssl_basic.c:167:34:167:36 | SignatureOutput |
44+
| openssl_basic.c:235:51:235:55 | KeyOperationAlgorithm | Mode | openssl_basic.c:235:51:235:55 | KeyOperationAlgorithm |
45+
| openssl_basic.c:235:51:235:55 | KeyOperationAlgorithm | Padding | openssl_basic.c:249:51:249:72 | PaddingAlgorithm |
46+
| openssl_basic.c:238:9:238:25 | KeyGeneration | Algorithm | openssl_basic.c:235:51:235:55 | KeyOperationAlgorithm |
47+
| openssl_basic.c:238:9:238:25 | KeyGeneration | Output | openssl_basic.c:238:39:238:43 | Key |
48+
| openssl_basic.c:238:39:238:43 | Key | Algorithm | openssl_basic.c:235:51:235:55 | KeyOperationAlgorithm |
49+
| openssl_basic.c:243:52:243:55 | Key | Source | openssl_basic.c:238:39:238:43 | Key |
50+
| openssl_basic.c:249:51:249:72 | PaddingAlgorithm | MD | openssl_basic.c:250:51:250:60 | HashAlgorithm |
51+
| openssl_basic.c:249:51:249:72 | PaddingAlgorithm | MGF1Hash | openssl_basic.c:251:51:251:60 | HashAlgorithm |
52+
| openssl_basic.c:262:24:262:39 | EncryptOperation | Algorithm | openssl_basic.c:235:51:235:55 | KeyOperationAlgorithm |
53+
| openssl_basic.c:262:24:262:39 | EncryptOperation | Input | openssl_basic.c:263:64:263:70 | Message |
54+
| openssl_basic.c:262:24:262:39 | EncryptOperation | Key | openssl_basic.c:243:52:243:55 | Key |
55+
| openssl_basic.c:262:24:262:39 | EncryptOperation | Nonce | openssl_basic.c:262:24:262:39 | EncryptOperation |
56+
| openssl_basic.c:262:24:262:39 | EncryptOperation | Output | openssl_basic.c:262:54:262:63 | KeyOperationOutput |
57+
| openssl_basic.c:263:64:263:70 | Message | Source | openssl_basic.c:231:27:231:49 | Constant |
4458
| openssl_pkey.c:21:10:21:28 | KeyGeneration | Algorithm | openssl_pkey.c:21:10:21:28 | KeyGeneration |
4559
| openssl_pkey.c:21:10:21:28 | KeyGeneration | Output | openssl_pkey.c:21:30:21:32 | Key |
4660
| openssl_pkey.c:21:10:21:28 | KeyOperationAlgorithm | Mode | openssl_pkey.c:21:10:21:28 | KeyOperationAlgorithm |

cpp/ql/test/experimental/library-tests/quantum/node_properties.expected

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,21 @@
3232
| openssl_basic.c:180:42:180:59 | Constant | Description | 0123456789012345 | openssl_basic.c:180:42:180:59 | openssl_basic.c:180:42:180:59 |
3333
| openssl_basic.c:181:49:181:87 | Constant | Description | This is a test message for encryption | openssl_basic.c:181:49:181:87 | openssl_basic.c:181:49:181:87 |
3434
| openssl_basic.c:218:32:218:33 | Constant | Description | 32 | openssl_basic.c:218:32:218:33 | openssl_basic.c:218:32:218:33 |
35+
| openssl_basic.c:231:27:231:49 | Constant | Description | Encrypt me with OAEP! | openssl_basic.c:231:27:231:49 | openssl_basic.c:231:27:231:49 |
36+
| openssl_basic.c:235:51:235:55 | KeyOperationAlgorithm | Name | RSA | openssl_basic.c:235:51:235:55 | openssl_basic.c:235:51:235:55 |
37+
| openssl_basic.c:235:51:235:55 | KeyOperationAlgorithm | RawName | RSA | openssl_basic.c:235:51:235:55 | openssl_basic.c:235:51:235:55 |
38+
| openssl_basic.c:237:54:237:57 | Constant | Description | 2048 | openssl_basic.c:237:54:237:57 | openssl_basic.c:237:54:237:57 |
39+
| openssl_basic.c:238:39:238:43 | Key | KeyType | Asymmetric | openssl_basic.c:238:39:238:43 | openssl_basic.c:238:39:238:43 |
40+
| openssl_basic.c:243:52:243:55 | Key | KeyType | Unknown | openssl_basic.c:243:52:243:55 | openssl_basic.c:243:52:243:55 |
41+
| openssl_basic.c:249:51:249:72 | PaddingAlgorithm | Name | OAEP | openssl_basic.c:249:51:249:72 | openssl_basic.c:249:51:249:72 |
42+
| openssl_basic.c:249:51:249:72 | PaddingAlgorithm | RawName | 4 | openssl_basic.c:249:51:249:72 | openssl_basic.c:249:51:249:72 |
43+
| openssl_basic.c:250:51:250:60 | HashAlgorithm | DigestSize | 256 | openssl_basic.c:250:51:250:60 | openssl_basic.c:250:51:250:60 |
44+
| openssl_basic.c:250:51:250:60 | HashAlgorithm | Name | SHA2 | openssl_basic.c:250:51:250:60 | openssl_basic.c:250:51:250:60 |
45+
| openssl_basic.c:250:51:250:60 | HashAlgorithm | RawName | EVP_sha256 | openssl_basic.c:250:51:250:60 | openssl_basic.c:250:51:250:60 |
46+
| openssl_basic.c:251:51:251:60 | HashAlgorithm | DigestSize | 256 | openssl_basic.c:251:51:251:60 | openssl_basic.c:251:51:251:60 |
47+
| openssl_basic.c:251:51:251:60 | HashAlgorithm | Name | SHA2 | openssl_basic.c:251:51:251:60 | openssl_basic.c:251:51:251:60 |
48+
| openssl_basic.c:251:51:251:60 | HashAlgorithm | RawName | EVP_sha256 | openssl_basic.c:251:51:251:60 | openssl_basic.c:251:51:251:60 |
49+
| openssl_basic.c:262:24:262:39 | EncryptOperation | KeyOperationSubtype | Encrypt | openssl_basic.c:262:24:262:39 | openssl_basic.c:262:24:262:39 |
3550
| openssl_pkey.c:21:10:21:28 | KeyOperationAlgorithm | Name | RSA | openssl_pkey.c:21:10:21:28 | openssl_pkey.c:21:10:21:28 |
3651
| openssl_pkey.c:21:10:21:28 | KeyOperationAlgorithm | RawName | RSA_generate_key_ex | openssl_pkey.c:21:10:21:28 | openssl_pkey.c:21:10:21:28 |
3752
| openssl_pkey.c:21:30:21:32 | Key | KeyType | Asymmetric | openssl_pkey.c:21:30:21:32 | openssl_pkey.c:21:30:21:32 |

cpp/ql/test/experimental/library-tests/quantum/nodes.expected

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,18 @@
3434
| openssl_basic.c:180:42:180:59 | Constant |
3535
| openssl_basic.c:181:49:181:87 | Constant |
3636
| openssl_basic.c:218:32:218:33 | Constant |
37+
| openssl_basic.c:231:27:231:49 | Constant |
38+
| openssl_basic.c:235:51:235:55 | KeyOperationAlgorithm |
39+
| openssl_basic.c:237:54:237:57 | Constant |
40+
| openssl_basic.c:238:9:238:25 | KeyGeneration |
41+
| openssl_basic.c:238:39:238:43 | Key |
42+
| openssl_basic.c:243:52:243:55 | Key |
43+
| openssl_basic.c:249:51:249:72 | PaddingAlgorithm |
44+
| openssl_basic.c:250:51:250:60 | HashAlgorithm |
45+
| openssl_basic.c:251:51:251:60 | HashAlgorithm |
46+
| openssl_basic.c:262:24:262:39 | EncryptOperation |
47+
| openssl_basic.c:262:54:262:63 | KeyOperationOutput |
48+
| openssl_basic.c:263:64:263:70 | Message |
3749
| openssl_pkey.c:21:10:21:28 | KeyGeneration |
3850
| openssl_pkey.c:21:10:21:28 | KeyOperationAlgorithm |
3951
| openssl_pkey.c:21:30:21:32 | Key |

0 commit comments

Comments
 (0)