src/pqc_lint/patterns/python.py
1.9 KB · 44 lines · python Raw
1 """Python-specific crypto patterns."""
2
3 from __future__ import annotations
4
5 from pqc_lint.patterns.base import PatternMatcher, compile_patterns
6
7
8 class PythonMatcher(PatternMatcher):
9 language = "python"
10 file_extensions = (".py",)
11 patterns = compile_patterns([
12 # cryptography library
13 ("PQC001", r"\brsa\.generate_private_key\s*\("),
14 ("PQC001", r"from\s+cryptography\.hazmat\.primitives\.asymmetric\s+import\s+rsa\b"),
15 ("PQC001", r"\bpadding\.PSS\s*\("),
16 ("PQC001", r"\bpadding\.PKCS1v15\s*\("),
17 ("PQC002", r"\bec\.generate_private_key\s*\("),
18 ("PQC002", r"from\s+cryptography\.hazmat\.primitives\.asymmetric\s+import\s+ec\b"),
19 ("PQC002", r"\bec\.ECDSA\s*\("),
20 ("PQC003", r"\bed25519\.Ed25519PrivateKey\b"),
21 ("PQC003", r"from\s+cryptography\.hazmat\.primitives\.asymmetric\s+import\s+ed25519\b"),
22 ("PQC004", r"\bdsa\.generate_private_key\s*\("),
23 ("PQC004", r"from\s+cryptography\.hazmat\.primitives\.asymmetric\s+import\s+dsa\b"),
24 ("PQC101", r"\bec\.ECDH\s*\("),
25 ("PQC102", r"\bdh\.generate_parameters\s*\("),
26 ("PQC102", r"from\s+cryptography\.hazmat\.primitives\.asymmetric\s+import\s+dh\b"),
27 ("PQC103", r"\bx25519\.X25519PrivateKey\b"),
28 ("PQC201", r"\bpadding\.OAEP\s*\("),
29 ("PQC202", r"\bPKCS1_v1_5\b"),
30 # pycryptodome
31 ("PQC001", r"\bfrom\s+Crypto\.PublicKey\s+import\s+RSA\b"),
32 ("PQC001", r"\bRSA\.generate\s*\("),
33 ("PQC002", r"\bfrom\s+Crypto\.PublicKey\s+import\s+ECC\b"),
34 ("PQC002", r"\bECC\.generate\s*\("),
35 # ecdsa library
36 ("PQC002", r"\bimport\s+ecdsa\b"),
37 ("PQC002", r"\bfrom\s+ecdsa\s+import\b"),
38 # hashes
39 ("PQC301", r"\bhashlib\.md5\s*\("),
40 ("PQC301", r"\bhashes\.MD5\s*\("),
41 ("PQC302", r"\bhashlib\.sha1\s*\("),
42 ("PQC302", r"\bhashes\.SHA1\s*\("),
43 ])
44