| #!/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 |