cmcdump.py 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. #!/usr/bin/env python
  2. #
  3. # Read CMC certificate request with wrappers on stdin, parse each into
  4. # plain text, then build substrate from it
  5. #
  6. import sys
  7. from pyasn1.codec.der import decoder
  8. from pyasn1.codec.der import encoder
  9. from pyasn1_modules import pem
  10. from pyasn1_modules import rfc5652
  11. from pyasn1_modules import rfc6402
  12. if len(sys.argv) != 1:
  13. print("""Usage:
  14. $ cat cmc_request.pem | %s""" % (sys.argv[0],))
  15. sys.exit(-1)
  16. reqCnt = 0
  17. substrate = pem.readBase64FromFile(sys.stdin)
  18. _, rest = decoder.decode(substrate, asn1Spec=rfc5652.ContentInfo())
  19. assert not rest
  20. next_layer = rfc5652.id_ct_contentInfo
  21. data = substrate
  22. while next_layer:
  23. if next_layer == rfc5652.id_ct_contentInfo:
  24. layer, rest = decoder.decode(data, asn1Spec=rfc5652.ContentInfo())
  25. assert encoder.encode(layer) == data, 'wrapper recode fails'
  26. assert not rest
  27. print(" * New layer (wrapper):")
  28. print(layer.prettyPrint())
  29. next_layer = layer['contentType']
  30. data = layer['content']
  31. elif next_layer == rfc5652.id_signedData:
  32. layer, rest = decoder.decode(data, asn1Spec=rfc5652.SignedData())
  33. assert encoder.encode(layer) == data, 'wrapper recode fails'
  34. assert not rest
  35. print(" * New layer (wrapper):")
  36. print(layer.prettyPrint())
  37. next_layer = layer['encapContentInfo']['eContentType']
  38. data = layer['encapContentInfo']['eContent']
  39. elif next_layer == rfc6402.id_cct_PKIData:
  40. layer, rest = decoder.decode(data, asn1Spec=rfc6402.PKIData())
  41. assert encoder.encode(layer) == data, 'pkidata recode fails'
  42. assert not rest
  43. print(" * New layer (pkidata):")
  44. print(layer.prettyPrint())
  45. next_layer = None
  46. data = None