create-gpg-shadow-key-from-pub-key.py 1.0 KB

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