Skip to content

Commit 4ab61bb

Browse files
committed
Python: Add a few tests for crypto frameworks
Tests working can be verified by running ``` ls ql/python/ql/test/experimental/library-tests/frameworks/crypto*/*.py | xargs -L1 sh -c 'python $0 || exit 255' ```
1 parent c4cca83 commit 4ab61bb

15 files changed

Lines changed: 464 additions & 0 deletions

File tree

python/ql/test/experimental/library-tests/frameworks/crypto/ConceptsTest.expected

Whitespace-only changes.
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
import python
2+
import experimental.meta.ConceptsTest
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
# DSA is a public-key algorithm for signing messages.
2+
# Following example at https://pycryptodome.readthedocs.io/en/latest/src/signature/dsa.html
3+
4+
from Crypto.PublicKey import DSA
5+
from Crypto.Signature import DSS
6+
from Crypto.Hash import SHA256
7+
8+
9+
private_key = DSA.generate(2048)
10+
public_key = private_key.publickey()
11+
12+
# ------------------------------------------------------------------------------
13+
# sign/verify
14+
# ------------------------------------------------------------------------------
15+
16+
print("sign/verify")
17+
18+
19+
message = b"message"
20+
21+
signer = DSS.new(private_key, mode='fips-186-3')
22+
23+
hasher = SHA256.new(message)
24+
signature = signer.sign(hasher)
25+
26+
print("signature={}".format(signature))
27+
28+
print()
29+
30+
verifier = DSS.new(public_key, mode='fips-186-3')
31+
32+
hasher = SHA256.new(message)
33+
verifier.verify(hasher, signature)
34+
print("Signature verified (as expected)")
35+
36+
try:
37+
hasher = SHA256.new(b"other message")
38+
verifier.verify(hasher, signature)
39+
raise Exception("Signature verified (unexpected)")
40+
except ValueError:
41+
print("Signature mismatch (as expected)")
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
from Crypto.PublicKey import ECC
2+
from Crypto.Signature import DSS
3+
from Crypto.Hash import SHA256
4+
5+
6+
private_key = ECC.generate(curve="P-256")
7+
public_key = private_key.public_key()
8+
9+
# ------------------------------------------------------------------------------
10+
# sign/verify
11+
# ------------------------------------------------------------------------------
12+
13+
print("sign/verify")
14+
15+
16+
message = b"message"
17+
18+
signer = DSS.new(private_key, mode='fips-186-3')
19+
20+
hasher = SHA256.new(message)
21+
signature = signer.sign(hasher)
22+
23+
print("signature={}".format(signature))
24+
25+
print()
26+
27+
verifier = DSS.new(public_key, mode='fips-186-3')
28+
29+
hasher = SHA256.new(message)
30+
verifier.verify(hasher, signature)
31+
print("Signature verified (as expected)")
32+
33+
try:
34+
hasher = SHA256.new(b"other message")
35+
verifier.verify(hasher, signature)
36+
raise Exception("Signature verified (unexpected)")
37+
except ValueError:
38+
print("Signature mismatch (as expected)")
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
# RSA is a public-key algorithm for encrypting and signing messages.
2+
3+
from Crypto.PublicKey import RSA
4+
from Crypto.Cipher import PKCS1_OAEP
5+
from Crypto.Signature import pss
6+
from Crypto.Hash import SHA256
7+
8+
private_key = RSA.generate(2048)
9+
public_key = private_key.publickey()
10+
11+
# ------------------------------------------------------------------------------
12+
# encrypt/decrypt
13+
# ------------------------------------------------------------------------------
14+
15+
print("encrypt/decrypt")
16+
17+
secret_message = b"secret message"
18+
19+
# Following example at https://pycryptodome.readthedocs.io/en/latest/src/examples.html#encrypt-data-with-rsa
20+
21+
encrypt_cipher = PKCS1_OAEP.new(public_key)
22+
23+
encrypted = encrypt_cipher.encrypt(secret_message)
24+
25+
print("encrypted={}".format(encrypted))
26+
27+
print()
28+
29+
decrypt_cipher = PKCS1_OAEP.new(private_key)
30+
31+
decrypted = decrypt_cipher.decrypt(
32+
encrypted,
33+
)
34+
35+
print("decrypted={}".format(decrypted))
36+
assert decrypted == secret_message
37+
38+
print("\n---\n")
39+
40+
# ------------------------------------------------------------------------------
41+
# sign/verify
42+
# ------------------------------------------------------------------------------
43+
44+
print("sign/verify")
45+
46+
47+
message = b"message"
48+
49+
signer = pss.new(private_key)
50+
51+
hasher = SHA256.new(message)
52+
signature = signer.sign(hasher)
53+
54+
print("signature={}".format(signature))
55+
56+
print()
57+
58+
59+
verifier = pss.new(public_key)
60+
hasher = SHA256.new(message)
61+
verifier.verify(hasher, signature)
62+
print("Signature verified (as expected)")
63+
64+
try:
65+
verifier = pss.new(public_key)
66+
hasher = SHA256.new(b"other message")
67+
verifier.verify(hasher, signature)
68+
raise Exception("Signature verified (unexpected)")
69+
except ValueError:
70+
print("Signature mismatch (as expected)")

python/ql/test/experimental/library-tests/frameworks/cryptodome/ConceptsTest.expected

Whitespace-only changes.
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
import python
2+
import experimental.meta.ConceptsTest
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
# DSA is a public-key algorithm for signing messages.
2+
# Following example at https://pycryptodome.readthedocs.io/en/latest/src/signature/dsa.html
3+
4+
from Cryptodome.PublicKey import DSA
5+
from Cryptodome.Signature import DSS
6+
from Cryptodome.Hash import SHA256
7+
8+
9+
private_key = DSA.generate(2048)
10+
public_key = private_key.publickey()
11+
12+
# ------------------------------------------------------------------------------
13+
# sign/verify
14+
# ------------------------------------------------------------------------------
15+
16+
print("sign/verify")
17+
18+
19+
message = b"message"
20+
21+
signer = DSS.new(private_key, mode='fips-186-3')
22+
23+
hasher = SHA256.new(message)
24+
signature = signer.sign(hasher)
25+
26+
print("signature={}".format(signature))
27+
28+
print()
29+
30+
verifier = DSS.new(public_key, mode='fips-186-3')
31+
32+
hasher = SHA256.new(message)
33+
verifier.verify(hasher, signature)
34+
print("Signature verified (as expected)")
35+
36+
try:
37+
hasher = SHA256.new(b"other message")
38+
verifier.verify(hasher, signature)
39+
raise Exception("Signature verified (unexpected)")
40+
except ValueError:
41+
print("Signature mismatch (as expected)")
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
from Cryptodome.PublicKey import ECC
2+
from Cryptodome.Signature import DSS
3+
from Cryptodome.Hash import SHA256
4+
5+
6+
private_key = ECC.generate(curve="P-256")
7+
public_key = private_key.public_key()
8+
9+
# ------------------------------------------------------------------------------
10+
# sign/verify
11+
# ------------------------------------------------------------------------------
12+
13+
print("sign/verify")
14+
15+
16+
message = b"message"
17+
18+
signer = DSS.new(private_key, mode='fips-186-3')
19+
20+
hasher = SHA256.new(message)
21+
signature = signer.sign(hasher)
22+
23+
print("signature={}".format(signature))
24+
25+
print()
26+
27+
verifier = DSS.new(public_key, mode='fips-186-3')
28+
29+
hasher = SHA256.new(message)
30+
verifier.verify(hasher, signature)
31+
print("Signature verified (as expected)")
32+
33+
try:
34+
hasher = SHA256.new(b"other message")
35+
verifier.verify(hasher, signature)
36+
raise Exception("Signature verified (unexpected)")
37+
except ValueError:
38+
print("Signature mismatch (as expected)")
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
# RSA is a public-key algorithm for encrypting and signing messages.
2+
3+
from Cryptodome.PublicKey import RSA
4+
from Cryptodome.Cipher import PKCS1_OAEP
5+
from Cryptodome.Signature import pss
6+
from Cryptodome.Hash import SHA256
7+
8+
private_key = RSA.generate(2048)
9+
public_key = private_key.publickey()
10+
11+
# ------------------------------------------------------------------------------
12+
# encrypt/decrypt
13+
# ------------------------------------------------------------------------------
14+
15+
print("encrypt/decrypt")
16+
17+
secret_message = b"secret message"
18+
19+
# Following example at https://pycryptodome.readthedocs.io/en/latest/src/examples.html#encrypt-data-with-rsa
20+
21+
encrypt_cipher = PKCS1_OAEP.new(public_key)
22+
23+
encrypted = encrypt_cipher.encrypt(secret_message)
24+
25+
print("encrypted={}".format(encrypted))
26+
27+
print()
28+
29+
decrypt_cipher = PKCS1_OAEP.new(private_key)
30+
31+
decrypted = decrypt_cipher.decrypt(
32+
encrypted,
33+
)
34+
35+
print("decrypted={}".format(decrypted))
36+
assert decrypted == secret_message
37+
38+
print("\n---\n")
39+
40+
# ------------------------------------------------------------------------------
41+
# sign/verify
42+
# ------------------------------------------------------------------------------
43+
44+
print("sign/verify")
45+
46+
47+
message = b"message"
48+
49+
signer = pss.new(private_key)
50+
51+
hasher = SHA256.new(message)
52+
signature = signer.sign(hasher)
53+
54+
print("signature={}".format(signature))
55+
56+
print()
57+
58+
verifier = pss.new(public_key)
59+
60+
hasher = SHA256.new(message)
61+
verifier.verify(hasher, signature)
62+
print("Signature verified (as expected)")
63+
64+
try:
65+
verifier = pss.new(public_key)
66+
hasher = SHA256.new(b"other message")
67+
verifier.verify(hasher, signature)
68+
raise Exception("Signature verified (unexpected)")
69+
except ValueError:
70+
print("Signature mismatch (as expected)")

0 commit comments

Comments
 (0)