#!/usr/bin/env python # # Read CMC certificate request with wrappers on stdin, parse each into # plain text, then build substrate from it # import sys from pyasn1.codec.der import decoder from pyasn1.codec.der import encoder from pyasn1_modules import pem from pyasn1_modules import rfc5652 from pyasn1_modules import rfc6402 if len(sys.argv) != 1: print("""Usage: $ cat cmc_request.pem | %s""" % (sys.argv[0],)) sys.exit(-1) reqCnt = 0 substrate = pem.readBase64FromFile(sys.stdin) _, rest = decoder.decode(substrate, asn1Spec=rfc5652.ContentInfo()) assert not rest next_layer = rfc5652.id_ct_contentInfo data = substrate while next_layer: if next_layer == rfc5652.id_ct_contentInfo: layer, rest = decoder.decode(data, asn1Spec=rfc5652.ContentInfo()) assert encoder.encode(layer) == data, 'wrapper recode fails' assert not rest print(" * New layer (wrapper):") print(layer.prettyPrint()) next_layer = layer['contentType'] data = layer['content'] elif next_layer == rfc5652.id_signedData: layer, rest = decoder.decode(data, asn1Spec=rfc5652.SignedData()) assert encoder.encode(layer) == data, 'wrapper recode fails' assert not rest print(" * New layer (wrapper):") print(layer.prettyPrint()) next_layer = layer['encapContentInfo']['eContentType'] data = layer['encapContentInfo']['eContent'] elif next_layer == rfc6402.id_cct_PKIData: layer, rest = decoder.decode(data, asn1Spec=rfc6402.PKIData()) assert encoder.encode(layer) == data, 'pkidata recode fails' assert not rest print(" * New layer (pkidata):") print(layer.prettyPrint()) next_layer = None data = None