From 9a3a1dbc0ff6ccfabb56ea27a57a7c287d7b5d8b Mon Sep 17 00:00:00 2001 From: Russ Housley Date: Fri, 8 Nov 2019 14:40:33 -0500 Subject: Add support for RFC 2631 (#101) --- CHANGES.txt | 1 + pyasn1_modules/rfc2631.py | 37 ++++++++++++++++++++++++++++++++++++ tests/__main__.py | 1 + tests/test_rfc2631.py | 48 +++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 87 insertions(+) create mode 100644 pyasn1_modules/rfc2631.py create mode 100644 tests/test_rfc2631.py diff --git a/CHANGES.txt b/CHANGES.txt index a20bcc2..a3660b7 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -26,6 +26,7 @@ Revision 0.2.8, released XX-XX-2019 - Added RFC5916 providing Device Owner Attribute - Update RFC8226 to use ComponentPresentConstraint() instead of the previous work around +- Add RFC2631 providing OtherInfo for Diffie-Hellman Key Agreement Revision 0.2.7, released 09-10-2019 ----------------------------------- diff --git a/pyasn1_modules/rfc2631.py b/pyasn1_modules/rfc2631.py new file mode 100644 index 0000000..44e5371 --- /dev/null +++ b/pyasn1_modules/rfc2631.py @@ -0,0 +1,37 @@ +# +# This file is part of pyasn1-modules software. +# +# Created by Russ Housley with assistance from asn1ate v.0.6.0. +# +# Copyright (c) 2019, Vigil Security, LLC +# License: http://snmplabs.com/pyasn1/license.html +# +# Diffie-Hellman Key Agreement +# +# ASN.1 source from: +# https://www.rfc-editor.org/rfc/rfc2631.txt +# https://www.rfc-editor.org/errata/eid5897 +# + +from pyasn1.type import constraint +from pyasn1.type import namedtype +from pyasn1.type import tag +from pyasn1.type import univ + + +class KeySpecificInfo(univ.Sequence): + componentType = namedtype.NamedTypes( + namedtype.NamedType('algorithm', univ.ObjectIdentifier()), + namedtype.NamedType('counter', univ.OctetString().subtype( + subtypeSpec=constraint.ValueSizeConstraint(4, 4))) + ) + + +class OtherInfo(univ.Sequence): + componentType = namedtype.NamedTypes( + namedtype.NamedType('keyInfo', KeySpecificInfo()), + namedtype.OptionalNamedType('partyAInfo', univ.OctetString().subtype( + explicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 0))), + namedtype.NamedType('suppPubInfo', univ.OctetString().subtype( + explicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 2))) + ) diff --git a/tests/__main__.py b/tests/__main__.py index 9b75c65..0af458c 100644 --- a/tests/__main__.py +++ b/tests/__main__.py @@ -18,6 +18,7 @@ suite = unittest.TestLoader().loadTestsFromNames( 'tests.test_rfc2459.suite', 'tests.test_rfc2511.suite', 'tests.test_rfc2560.suite', + 'tests.test_rfc2631.suite', 'tests.test_rfc2634.suite', 'tests.test_rfc2985.suite', 'tests.test_rfc2986.suite', diff --git a/tests/test_rfc2631.py b/tests/test_rfc2631.py new file mode 100644 index 0000000..7abdcd7 --- /dev/null +++ b/tests/test_rfc2631.py @@ -0,0 +1,48 @@ +# +# This file is part of pyasn1-modules software. +# +# Created by Russ Housley +# Copyright (c) 2019, Vigil Security, LLC +# License: http://snmplabs.com/pyasn1/license.html +# + +import sys + +from pyasn1.codec.der.decoder import decode as der_decode +from pyasn1.codec.der.encoder import encode as der_encode + +from pyasn1.type import univ + +from pyasn1_modules import pem +from pyasn1_modules import rfc2631 + +try: + import unittest2 as unittest +except ImportError: + import unittest + + +class OtherInfoTestCase(unittest.TestCase): + pem_text = "MB0wEwYLKoZIhvcNAQkQAwYEBAAAAAGiBgQEAAAAwA==" + + def setUp(self): + self.asn1Spec = rfc2631.OtherInfo() + + def testDerCodec(self): + substrate = pem.readBase64fromText(self.pem_text) + asn1Object, rest = der_decode(substrate, asn1Spec=self.asn1Spec) + assert not rest + assert asn1Object.prettyPrint() + assert der_encode(asn1Object) == substrate + + hex1 = univ.OctetString(hexValue='00000001') + assert asn1Object['keyInfo']['counter'] == hex1 + + +suite = unittest.TestLoader().loadTestsFromModule(sys.modules[__name__]) + +if __name__ == '__main__': + import sys + + result = unittest.TextTestRunner(verbosity=2).run(suite) + sys.exit(not result.wasSuccessful()) -- cgit v1.2.3