pkcs8dump.py 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. #!/usr/bin/env python
  2. #
  3. # This file is part of pyasn1-modules software.
  4. #
  5. # Copyright (c) 2005-2019, Ilya Etingof <etingof@gmail.com>
  6. # License: http://snmplabs.com/pyasn1/license.html
  7. #
  8. # Read bunch of ASN.1/PEM plain/encrypted private keys in PKCS#8
  9. # format on stdin, parse each into plain text, then build substrate from it
  10. #
  11. import sys
  12. from pyasn1.codec.der import decoder
  13. from pyasn1.codec.der import encoder
  14. from pyasn1_modules import pem
  15. from pyasn1_modules import rfc5208
  16. if len(sys.argv) != 1:
  17. print("""Usage:
  18. $ cat pkcs8key.pem | %s""" % sys.argv[0])
  19. sys.exit(-1)
  20. cnt = 0
  21. while True:
  22. idx, substrate = pem.readPemBlocksFromFile(
  23. sys.stdin,
  24. ('-----BEGIN PRIVATE KEY-----', '-----END PRIVATE KEY-----'),
  25. ('-----BEGIN ENCRYPTED PRIVATE KEY-----', '-----END ENCRYPTED PRIVATE KEY-----')
  26. )
  27. if not substrate:
  28. break
  29. if idx == 0:
  30. asn1Spec = rfc5208.PrivateKeyInfo()
  31. elif idx == 1:
  32. asn1Spec = rfc5208.EncryptedPrivateKeyInfo()
  33. else:
  34. break
  35. key, rest = decoder.decode(substrate, asn1Spec=asn1Spec)
  36. if rest:
  37. substrate = substrate[:-len(rest)]
  38. print(key.prettyPrint())
  39. assert encoder.encode(key) == substrate, 'pkcs8 recode fails'
  40. cnt += 1
  41. print('*** %s PKCS#8 key(s) de/serialized' % cnt)