diff options
author | Stanisław Pitucha <stanislaw.pitucha@hp.com> | 2016-03-16 11:36:49 +1100 |
---|---|---|
committer | Stanisław Pitucha <stanislaw.pitucha@hp.com> | 2016-03-16 13:50:38 +1100 |
commit | b1d990293ca2e5de59ccefd14b2827e580849ce1 (patch) | |
tree | 24c46dc2228e5704e82e059a6da5b5437b827893 /tools/cmcdump.py | |
parent | 09f18c67eaff6f4e7f28dd7b37ecc15b7b6b94fb (diff) | |
download | pyasn1-modules-b1d990293ca2e5de59ccefd14b2827e580849ce1.tar.gz |
Add CMC-related modules
Modules have been generated using asn1ate, with manual fixes to link up
different RFCs.
Diffstat (limited to 'tools/cmcdump.py')
-rwxr-xr-x | tools/cmcdump.py | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/tools/cmcdump.py b/tools/cmcdump.py new file mode 100755 index 0000000..bce48b1 --- /dev/null +++ b/tools/cmcdump.py @@ -0,0 +1,56 @@ +#!/usr/bin/env python +# +# Read CMC certificate request with wrappers on stdin, parse each into +# plain text, then build substrate from it +# +from pyasn1.codec.der import decoder, encoder +from pyasn1_modules import rfc5652, rfc6402, pem +import sys + +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 |