majuna/scripts/generate_test_onion_tls.py

70 lines
3 KiB
Python
Raw Normal View History

import os
import shutil
import subprocess
import base64
import json
from cryptography import x509
from cryptography.x509.oid import NameOID
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives.hashes import SHA256
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.backends import default_backend
from datetime import datetime, timedelta, timezone
2024-12-06 13:34:44 +00:00
from tests.api.test_onion import generate_onion_keys_with_mkp224o, generate_self_signed_tls_certificate
2024-12-06 13:34:44 +00:00
def generate_create_rest_payload(parent_folder: str, folder_name: str):
"""
Generate REST payload for a specific Onion service and append it to a shared .rest file.
"""
rest_file_path = os.path.join(parent_folder, "new_onion.rest")
with open(os.path.join(folder_name, "hs_ed25519_secret_key"), "rb") as f:
onion_private_key = base64.b64encode(f.read()).decode("utf-8")
with open(os.path.join(folder_name, "hs_ed25519_public_key"), "rb") as f:
onion_public_key = base64.b64encode(f.read()).decode("utf-8")
with open(os.path.join(folder_name, "tls_private_key.pem"), "r") as f:
tls_private_key = f.read()
with open(os.path.join(folder_name, "tls_certificate.pem"), "r") as f:
tls_public_key = f.read()
payload = {
2024-12-06 13:34:44 +00:00
"DomainName": "example.com",
"Description": f"Generated Onion Service for {folder_name}",
"OnionPrivateKey": onion_private_key,
"OnionPublicKey": onion_public_key,
"TlsPrivateKey": tls_private_key,
"TlsCertificate": tls_public_key,
"SkipChainVerification": True,
"GroupId": 1,
}
with open(rest_file_path, "a") as f:
f.write(f"### Create Onion Service ({folder_name})\n")
f.write("POST http://localhost:5000/api/web/onion\n")
f.write("Content-Type: application/json\n\n")
json.dump(payload, f, indent=4)
f.write("\n\n")
if __name__ == "__main__":
parent_folder = "."
scenarios = [
("self_signed_onion_service", datetime.now(timezone.utc), datetime.now(timezone.utc) + timedelta(days=365), None),
("expired_onion_service", datetime.now(timezone.utc) - timedelta(days=730), datetime.now(timezone.utc) - timedelta(days=365), None),
("future_onion_service", datetime.now(timezone.utc) + timedelta(days=365), datetime.now(timezone.utc) + timedelta(days=730), None),
("wrong_name_onion_service", datetime.now(timezone.utc), datetime.now(timezone.utc) + timedelta(days=365), ["wrong-name.example.com"]),
]
if os.path.exists("new_onion.rest"):
os.remove("new_onion.rest")
for folder_name, valid_from, valid_to, dns_names in scenarios:
print(f"Generating {folder_name}...")
onion_address = generate_onion_keys_with_mkp224o(folder_name, "test")
generate_self_signed_tls_certificate(folder_name, onion_address, valid_from, valid_to, dns_names)
2024-12-06 13:34:44 +00:00
generate_create_rest_payload(parent_folder, folder_name)
print("All Onion services and REST requests generated successfully.")