aboutsummaryrefslogtreecommitdiff
path: root/tools/cmcdump.py
diff options
context:
space:
mode:
authorStanisław Pitucha <stanislaw.pitucha@hp.com>2016-03-16 11:36:49 +1100
committerStanisław Pitucha <stanislaw.pitucha@hp.com>2016-03-16 13:50:38 +1100
commitb1d990293ca2e5de59ccefd14b2827e580849ce1 (patch)
tree24c46dc2228e5704e82e059a6da5b5437b827893 /tools/cmcdump.py
parent09f18c67eaff6f4e7f28dd7b37ecc15b7b6b94fb (diff)
downloadpyasn1-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-xtools/cmcdump.py56
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