1#
2# This file is part of pyasn1-modules software.
3#
4# Created by Russ Housley
5# Copyright (c) 2019, Vigil Security, LLC
6# License: http://snmplabs.com/pyasn1/license.html
7#
8
9import sys
10
11from pyasn1.codec.der.decoder import decode as der_decode
12from pyasn1.codec.der.encoder import encode as der_encode
13
14from pyasn1_modules import pem
15from pyasn1_modules import rfc5280
16from pyasn1_modules import rfc5990
17
18try:
19    import unittest2 as unittest
20except ImportError:
21    import unittest
22
23
24class RSAKEMTestCase(unittest.TestCase):
25    pem_text = """\
26MEcGCyqGSIb3DQEJEAMOMDgwKQYHKIGMcQICBDAeMBkGCiuBBRCGSAksAQIwCwYJ
27YIZIAWUDBAIBAgEQMAsGCWCGSAFlAwQBBQ==
28"""
29
30    def setUp(self):
31        self.asn1Spec = rfc5280.AlgorithmIdentifier()
32
33    def testDerCodec(self):
34        substrate = pem.readBase64fromText(self.pem_text)
35        asn1Object, rest = der_decode(substrate, asn1Spec=self.asn1Spec)
36        assert not rest
37        assert asn1Object.prettyPrint()
38        assert der_encode(asn1Object) == substrate
39
40        assert asn1Object['algorithm'] == rfc5990.id_rsa_kem
41        rsa_kem_p, rest = der_decode(asn1Object['parameters'],
42            asn1Spec=rfc5280.algorithmIdentifierMap[rfc5990.id_rsa_kem])
43        assert not rest
44        assert rsa_kem_p.prettyPrint()
45        assert der_encode(rsa_kem_p) == asn1Object['parameters']
46
47        assert rsa_kem_p['kem']['algorithm'] == rfc5990.id_kem_rsa
48        kem_rsa_p, rest = der_decode(rsa_kem_p['kem']['parameters'],
49            asn1Spec=rfc5280.algorithmIdentifierMap[rfc5990.id_kem_rsa])
50        assert not rest
51        assert kem_rsa_p.prettyPrint()
52        assert der_encode(kem_rsa_p) == rsa_kem_p['kem']['parameters']
53
54        assert kem_rsa_p['keyLength'] == 16
55        assert kem_rsa_p['keyDerivationFunction']['algorithm'] == rfc5990.id_kdf_kdf3
56        kdf_p, rest = der_decode(kem_rsa_p['keyDerivationFunction']['parameters'],
57            asn1Spec=rfc5280.algorithmIdentifierMap[rfc5990.id_kdf_kdf3])
58        assert not rest
59        assert kdf_p.prettyPrint()
60        assert der_encode(kdf_p) == kem_rsa_p['keyDerivationFunction']['parameters']
61
62    def testOpenTypes(self):
63        substrate = pem.readBase64fromText(self.pem_text)
64        asn1Object, rest = der_decode(substrate,
65            asn1Spec=self.asn1Spec,
66            decodeOpenTypes=True)
67        assert not rest
68        assert asn1Object.prettyPrint()
69        assert der_encode(asn1Object) == substrate
70
71        assert asn1Object['algorithm'] == rfc5990.id_rsa_kem
72        assert asn1Object['parameters']['kem']['algorithm'] == rfc5990.id_kem_rsa
73        assert asn1Object['parameters']['kem']['parameters']['keyLength'] == 16
74
75
76suite = unittest.TestLoader().loadTestsFromModule(sys.modules[__name__])
77
78if __name__ == '__main__':
79    import sys
80
81    result = unittest.TextTestRunner(verbosity=2).run(suite)
82    sys.exit(not result.wasSuccessful())
83