| import ssl | |
| import urllib.request | |
| import json | |
| import os | |
| import oqs | |
| # Example code testing oqs signature functionality. See more example code at | |
| # https://github.com/open-quantum-safe/liboqs-python/tree/main/examples | |
| message = "This is the message to sign".encode() | |
| # create signer and verifier with sample signature mechanisms | |
| sigalg = "Dilithium2" | |
| with oqs.Signature(sigalg) as signer: | |
| with oqs.Signature(sigalg) as verifier: | |
| signer_public_key = signer.generate_keypair() | |
| signature = signer.sign(message) | |
| is_valid = verifier.verify(message, signature, signer_public_key) | |
| if (not is_valid): | |
| print("Failed to validate signature. Exiting.") | |
| exit(1) | |
| else: | |
| print("Validated signature for OQS algorithm %s" % (sigalg)) | |
| # Example code iterating over all supported OQS algorithms integrated into TLS | |
| sslContext= ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) | |
| sslContext.verify_mode = ssl.CERT_REQUIRED | |
| # Trust LetsEncrypt root CA: | |
| sslContext.load_verify_locations(cafile="isrgrootx1.pem") | |
| # Retrieve interop test server root CA | |
| with urllib.request.urlopen('https://test.openquantumsafe.org/CA.crt', context=sslContext) as response: | |
| data=response.read() | |
| with open("CA.crt", "w+b") as f: | |
| f.write(data) | |
| # Retrieve JSON structure of all alg/port combinations: | |
| with urllib.request.urlopen('https://test.openquantumsafe.org/assignments.json', context=sslContext) as response: | |
| assignments=json.loads(response.read()) | |
| # Trust test.openquantumsafe.org root CA: | |
| sslContext.load_verify_locations(cafile="CA.crt") | |
| # Iterate over all algorithm/port combinations: | |
| for sigs, kexs in assignments.items(): | |
| for kex, port in kexs.items(): | |
| if (kex != "*"): # '*' denoting any classic KEX alg | |
| # Enable use of the specific QSC KEX algorithm | |
| os.environ["TLS_DEFAULT_GROUPS"]=kex | |
| try: | |
| with urllib.request.urlopen('https://test.openquantumsafe.org:'+str(port), context=sslContext) as response: | |
| if response.getcode() != 200: | |
| print("Failed to test %s successfully" % (kex)) | |
| else: | |
| print("Success testing %s at port %d" % (kex, port)) | |
| except: | |
| print("Test of algorithm combination SIG %s/KEX %s failed. Are all algorithms supported by current OQS library?" % (sigs, kex)) | |
| if "SHORT_TEST" in os.environ: | |
| exit(0) |