|
| 1 | +/** |
| 2 | + * Provides classes for modeling OpenSSL's EVP signature operations |
| 3 | + */ |
| 4 | + |
| 5 | +private import experimental.quantum.Language |
| 6 | +private import OpenSSLOperationBase |
| 7 | +private import experimental.quantum.OpenSSL.CtxFlow as CTXFlow |
| 8 | + |
| 9 | +// TODO: verification |
| 10 | +class EVP_Cipher_Initializer extends EVPInitialize { |
| 11 | + EVP_Cipher_Initializer() { |
| 12 | + this.(Call).getTarget().getName() in [ |
| 13 | + "EVP_DigestSignInit", "EVP_DigestSignInit_ex", "EVP_SignInit", "EVP_SignInit_ex", |
| 14 | + "EVP_PKEY_sign_init", "EVP_PKEY_sign_init_ex", "EVP_PKEY_sign_init_ex2", |
| 15 | + "EVP_PKEY_sign_message_init" |
| 16 | + ] |
| 17 | + } |
| 18 | + |
| 19 | + override Expr getAlgorithmArg() { |
| 20 | + this.(Call).getTarget().getName() = "EVP_DigestSignInit" and |
| 21 | + result = this.(Call).getArgument(1) |
| 22 | + or |
| 23 | + this.(Call).getTarget().getName() = "EVP_DigestSignInit_ex" and |
| 24 | + result = this.(Call).getArgument(1) |
| 25 | + or |
| 26 | + this.(Call).getTarget().getName() = "EVP_PKEY_sign_init_ex2" and |
| 27 | + result = this.(Call).getArgument(1) |
| 28 | + or |
| 29 | + this.(Call).getTarget().getName() = "EVP_PKEY_sign_message_init" and |
| 30 | + result = this.(Call).getArgument(1) |
| 31 | + } |
| 32 | + |
| 33 | + override Expr getKeyArg() { |
| 34 | + this.(Call).getTarget().getName() = "EVP_DigestSignInit" and |
| 35 | + result = this.(Call).getArgument(4) |
| 36 | + or |
| 37 | + this.(Call).getTarget().getName() = "EVP_DigestSignInit_ex" and |
| 38 | + result = this.(Call).getArgument(5) |
| 39 | + } |
| 40 | + |
| 41 | + override Expr getIVArg() { none() } |
| 42 | + |
| 43 | + override Crypto::KeyOperationSubtype getKeyOperationSubtype() { |
| 44 | + if this.(Call).getTarget().getName().toLowerCase().matches("%sign%") |
| 45 | + then result instanceof Crypto::TSignMode |
| 46 | + else |
| 47 | + if this.(Call).getTarget().getName().toLowerCase().matches("%verify%") |
| 48 | + then result instanceof Crypto::TVerifyMode |
| 49 | + else result instanceof Crypto::TUnknownKeyOperationMode |
| 50 | + } |
| 51 | +} |
| 52 | + |
| 53 | +class EVP_Signature_Update_Call extends EVPUpdate { |
| 54 | + EVP_Signature_Update_Call() { |
| 55 | + this.(Call).getTarget().getName() in [ |
| 56 | + "EVP_DigestSignUpdate", "EVP_SignUpdate", "EVP_PKEY_sign_message_update" |
| 57 | + ] |
| 58 | + } |
| 59 | + |
| 60 | + override Expr getInputArg() { result = this.(Call).getArgument(1) } |
| 61 | +} |
| 62 | + |
| 63 | +abstract class EVP_Signature_Operation extends EVPOperation, Crypto::KeyOperationInstance { |
| 64 | + EVP_Signature_Operation() { this.(Call).getTarget().getName().matches("EVP_%") } |
| 65 | + |
| 66 | + override Crypto::KeyOperationSubtype getKeyOperationSubtype() { |
| 67 | + if this.(Call).getTarget().getName().toLowerCase().matches("%sign%") |
| 68 | + then result instanceof Crypto::TSignMode |
| 69 | + else |
| 70 | + if this.(Call).getTarget().getName().toLowerCase().matches("%verify%") |
| 71 | + then result instanceof Crypto::TVerifyMode |
| 72 | + else result instanceof Crypto::TUnknownKeyOperationMode |
| 73 | + } |
| 74 | + |
| 75 | + override Expr getOutputArg() { result = this.(Call).getArgument(1) } |
| 76 | + |
| 77 | + override Crypto::ConsumerInputDataFlowNode getNonceConsumer() { |
| 78 | + // this.getInitCall().getIVArg() = result.asExpr() |
| 79 | + none() |
| 80 | + } |
| 81 | + |
| 82 | + override Crypto::ConsumerInputDataFlowNode getKeyConsumer() { |
| 83 | + this.getInitCall().getKeyArg() = result.asExpr() |
| 84 | + // todo: or track to the EVP_PKEY_CTX_new |
| 85 | + } |
| 86 | + |
| 87 | + override Crypto::ArtifactOutputDataFlowNode getOutputArtifact() { |
| 88 | + result = this.(EVPOperation).getOutputArtifact() |
| 89 | + } |
| 90 | + |
| 91 | + override Crypto::ConsumerInputDataFlowNode getInputConsumer() { |
| 92 | + result = this.(EVPOperation).getInputConsumer() |
| 93 | + } |
| 94 | +} |
| 95 | + |
| 96 | +class EVP_Signature_Call extends EVPOneShot, EVP_Signature_Operation { |
| 97 | + EVP_Signature_Call() { this.(Call).getTarget().getName() in ["EVP_DigestSign", "EVP_PKEY_sign"] } |
| 98 | + |
| 99 | + override Expr getInputArg() { result = this.(Call).getArgument(3) } |
| 100 | +} |
| 101 | + |
| 102 | +class EVP_Signature_Final_Call extends EVPFinal, EVP_Signature_Operation { |
| 103 | + EVP_Signature_Final_Call() { |
| 104 | + this.(Call).getTarget().getName() in [ |
| 105 | + "EVP_DigestSignFinal", "EVP_SignFinal_ex", "EVP_SignFinal", "EVP_PKEY_sign_message_final" |
| 106 | + ] |
| 107 | + } |
| 108 | +} |
0 commit comments