• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/usr/bin/env python
2#
3# Read CMC certificate request with wrappers on stdin, parse each into
4# plain text, then build substrate from it
5#
6import sys
7
8from pyasn1.codec.der import decoder
9from pyasn1.codec.der import encoder
10
11from pyasn1_modules import pem
12from pyasn1_modules import rfc5652
13from pyasn1_modules import rfc6402
14
15if len(sys.argv) != 1:
16    print("""Usage:
17$ cat cmc_request.pem | %s""" % (sys.argv[0],))
18    sys.exit(-1)
19
20reqCnt = 0
21
22substrate = pem.readBase64FromFile(sys.stdin)
23
24_, rest = decoder.decode(substrate, asn1Spec=rfc5652.ContentInfo())
25assert not rest
26
27next_layer = rfc5652.id_ct_contentInfo
28data = substrate
29while next_layer:
30    if next_layer == rfc5652.id_ct_contentInfo:
31        layer, rest = decoder.decode(data, asn1Spec=rfc5652.ContentInfo())
32        assert encoder.encode(layer) == data, 'wrapper recode fails'
33        assert not rest
34
35        print(" * New layer (wrapper):")
36        print(layer.prettyPrint())
37
38        next_layer = layer['contentType']
39        data = layer['content']
40
41    elif next_layer == rfc5652.id_signedData:
42        layer, rest = decoder.decode(data, asn1Spec=rfc5652.SignedData())
43        assert encoder.encode(layer) == data, 'wrapper recode fails'
44        assert not rest
45
46        print(" * New layer (wrapper):")
47        print(layer.prettyPrint())
48
49        next_layer = layer['encapContentInfo']['eContentType']
50        data = layer['encapContentInfo']['eContent']
51
52    elif next_layer == rfc6402.id_cct_PKIData:
53        layer, rest = decoder.decode(data, asn1Spec=rfc6402.PKIData())
54        assert encoder.encode(layer) == data, 'pkidata recode fails'
55        assert not rest
56
57        print(" * New layer (pkidata):")
58        print(layer.prettyPrint())
59
60        next_layer = None
61        data = None
62