create-gpg-shadow-key-from-x509-cert-req.py 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. #!/usr/bin/env python3
  2. import cryptography.hazmat.backends
  3. import cryptography.hazmat.primitives.serialization
  4. import cryptography.x509
  5. import math
  6. import sys
  7. backend = cryptography.hazmat.backends.default_backend()
  8. with open('smartcard-app-id.hex', 'r') as f:
  9. appid = int(f.read(), 16)
  10. with open('cert-request.pem', 'rb') as f:
  11. req = cryptography.x509.load_pem_x509_csr(f.read(), backend)
  12. assert req.is_signature_valid
  13. pubnums = req.public_key().public_numbers()
  14. key_data = ['shadowed-private-key', [
  15. 'rsa',
  16. ['n', pubnums.n],
  17. ['e', pubnums.e],
  18. ['shadowed', 't1-v1', [appid, 'OPENPGP.1']],
  19. ]]
  20. def convert(data):
  21. if isinstance(data, int):
  22. return convert(data.to_bytes(
  23. math.ceil(data.bit_length() / 8),
  24. 'big',
  25. ))
  26. elif isinstance(data, str):
  27. return convert(data.encode())
  28. elif isinstance(data, bytes):
  29. return str(len(data)).encode() + b':' + data
  30. else:
  31. return b'(' + b''.join(convert(i) for i in data) + b')'
  32. key = convert(key_data)
  33. with open('gpg-key.sexp', 'wb') as f:
  34. f.write(key)