You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
62 lines
1.7 KiB
62 lines
1.7 KiB
#!/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
|