VERSION | 2 +- doc/examples.rst | 35 +++++++++++++++++++++-------------- doc/news.rst | 6 ++++++ pyderasn.py | 29 ++++++++++++++++++++--------- tests/test_crts.py | 71 +++++++++++++++++++++++++++++++---------------------- tests/test_pyderasn.py | 2 +- diff --git a/VERSION b/VERSION index 911db21d002ff795b7c879bf619be6833791e72924fb2fb1ac760262834f6ebd..6f2431622c88102eb38af31e02bdf38000f0444187ad116e6304d46da033e011 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -3.5 +3.6 diff --git a/doc/examples.rst b/doc/examples.rst index 9bb32009a5db2ab232fea7451e422b443ee23823b8f7cf1090031dad7b04d5d9..65f196da2b15c696b3cb809f3919e37ad62d54efa2aabb5626b262c05f5bb35f 100644 --- a/doc/examples.rst +++ b/doc/examples.rst @@ -364,9 +364,10 @@ tbs = TBSCertificate() tbs["serialNumber"] = CertificateSerialNumber(10143011886257155224) - sign_algo_id = AlgorithmIdentifier() - sign_algo_id["algorithm"] = ObjectIdentifier("1.2.840.113549.1.1.5") - sign_algo_id["parameters"] = Any(Null()) + sign_algo_id = AlgorithmIdentifier(( + ("algorithm", ObjectIdentifier("1.2.840.113549.1.1.5")), + ("parameters", Any(Null())), + )) tbs["signature"] = sign_algo_id rdnSeq = RDNSequence() @@ -378,20 +379,26 @@ ("2.5.4.10", PrintableString, "Internet Widgits Pty Ltd"), ("2.5.4.3", PrintableString, "false.example.com"), ("1.2.840.113549.1.9.1", IA5String, "false@example.com"), ): - attr = AttributeTypeAndValue() - attr["type"] = AttributeType(oid) - attr["value"] = AttributeValue(klass(text)) - rdn = RelativeDistinguishedName() - rdn.append(attr) - rdnSeq.append(rdn) - issuer = Name() - issuer["rdnSequence"] = rdnSeq + rdnSeq.append( + RelativeDistinguishedName(( + AttributeTypeAndValue(( + ("type", AttributeType(oid)), + ("value", AttributeValue(klass(text))), + )), + )) + ) + issuer = Name(("rdnSequence", rdnSeq)) tbs["issuer"] = issuer tbs["subject"] = issuer - validity = Validity() - validity["notBefore"] = Time(("utcTime", UTCTime(datetime(2009, 10, 8, 0, 25, 53)))) - validity["notAfter"] = Time(("utcTime", UTCTime(datetime(2010, 10, 8, 0, 25, 53)))) + validity = Validity(( + ("notBefore", Time( + ("utcTime", UTCTime(datetime(2009, 10, 8, 0, 25, 53))), + )), + ("notAfter", Time( + ("utcTime", UTCTime(datetime(2010, 10, 8, 0, 25, 53))), + )), + )) tbs["validity"] = validity spki = SubjectPublicKeyInfo() diff --git a/doc/news.rst b/doc/news.rst index 481d14a9cfe3618382d7868b190322210eef6b22f6d7c65b0680b53251ca5d2d..2996b2b6fd79247b51c6b605411b947bfc17a15c7051afb805303258f92cd2bf 100644 --- a/doc/news.rst +++ b/doc/news.rst @@ -1,6 +1,12 @@ News ==== +.. _release3.6: + +3.6 +--- +* Ability to set values during Sequence initialization. + .. _release3.5: 3.5 diff --git a/pyderasn.py b/pyderasn.py index a27c61c3060fb7879cbd6e3fe3e8a950357cc77881908bfdfe6de00aaf9bb305..5b22eef5b53f1630896a03ca8409a44e2a9b995e40202377bc6cf1f98320bd71 100755 --- a/pyderasn.py +++ b/pyderasn.py @@ -3740,7 +3740,7 @@ Traceback (most recent call last): pyderasn.InvalidValueType: invalid value type, expected: >>> ext["extnID"] = ObjectIdentifier("1.2.3") - You can know if sequence is ready to be encoded: + You can determine if sequence is ready to be encoded: >>> ext.ready False @@ -3766,7 +3766,15 @@ >>> tbs["version"] = Version("v2") # no need to explicitly add ``expl`` Assign ``None`` to remove value from sequence. - You can know if value exists/set in the sequence and take its value: + You can set values in Sequence during its initialization: + + >>> AlgorithmIdentifier(( + ("algorithm", ObjectIdentifier("1.2.3")), + ("parameters", Any(Null())) + )) + AlgorithmIdentifier SEQUENCE[OBJECT IDENTIFIER 1.2.3, ANY 0500 OPTIONAL] + + You can determine if value exists/set in the sequence and take its value: >>> "extnID" in ext, "extnValue" in ext, "critical" in ext (True, True, False) @@ -3823,20 +3831,23 @@ schema if isinstance(schema, OrderedDict) else OrderedDict(schema) ) self._value = {} if value is not None: - self._value = self._value_sanitize(value) + if issubclass(value.__class__, Sequence): + self._value = value._value + elif hasattr(value, "__iter__"): + for seq_key, seq_value in value: + self[seq_key] = seq_value + else: + raise InvalidValueType((Sequence,)) if default is not None: - default_value = self._value_sanitize(default) + if not issubclass(default.__class__, Sequence): + raise InvalidValueType((Sequence,)) + default_value = default._value default_obj = self.__class__(impl=self.tag, expl=self._expl) default_obj.specs = self.specs default_obj._value = default_value self.default = default_obj if value is None: self._value = default_obj.copy()._value - - def _value_sanitize(self, value): - if not issubclass(value.__class__, Sequence): - raise InvalidValueType((Sequence,)) - return value._value @property def ready(self): diff --git a/tests/test_crts.py b/tests/test_crts.py index d7e0a44acf34b6821b37a69deab97cdb5eaffcf343a9af7742f8bcf13c2a7eaf..f14126114fccaa3528dc539afe67f878485b10c9259057a560dafc68bcf633b0 100644 --- a/tests/test_crts.py +++ b/tests/test_crts.py @@ -221,12 +221,12 @@ raw[obj.offset:obj.offset + obj.tlvlen], expect.encode(), ) assert_raw_equals(tbs["serialNumber"], Integer(10143011886257155224)) - algo_id = AlgorithmIdentifier() - algo_id["algorithm"] = ObjectIdentifier("1.2.840.113549.1.1.5") - algo_id["parameters"] = Any(Null()) + algo_id = AlgorithmIdentifier(( + ("algorithm", ObjectIdentifier("1.2.840.113549.1.1.5")), + ("parameters", Any(Null())), + )) self.assertEqual(tbs["signature"], algo_id) assert_raw_equals(tbs["signature"], algo_id) - issuer = Name() rdnSeq = RDNSequence() for oid, klass, text in ( ("2.5.4.6", PrintableString, "XX"), @@ -236,22 +236,25 @@ ("2.5.4.10", PrintableString, "Internet Widgits Pty Ltd"), ("2.5.4.3", PrintableString, "false.example.com"), ("1.2.840.113549.1.9.1", IA5String, "false@example.com"), ): - attr = AttributeTypeAndValue() - attr["type"] = AttributeType(oid) - attr["value"] = AttributeValue(klass(text)) - rdn = RelativeDistinguishedName() - rdn.append(attr) - rdnSeq.append(rdn) - issuer["rdnSequence"] = rdnSeq + rdnSeq.append( + RelativeDistinguishedName(( + AttributeTypeAndValue(( + ("type", AttributeType(oid)), + ("value", AttributeValue(klass(text))), + )), + )) + ) + issuer = Name(("rdnSequence", rdnSeq)) self.assertEqual(tbs["issuer"], issuer) assert_raw_equals(tbs["issuer"], issuer) - validity = Validity() - validity["notBefore"] = Time( - ("utcTime", UTCTime(datetime(2009, 10, 8, 0, 25, 53))) - ) - validity["notAfter"] = Time( - ("utcTime", UTCTime(datetime(2010, 10, 8, 0, 25, 53))) - ) + validity = Validity(( + ("notBefore", Time( + ("utcTime", UTCTime(datetime(2009, 10, 8, 0, 25, 53))) + )), + ("notAfter", Time( + ("utcTime", UTCTime(datetime(2010, 10, 8, 0, 25, 53))) + )), + )) self.assertEqual(tbs["validity"], validity) assert_raw_equals(tbs["validity"], validity) self.assertEqual(tbs["subject"], issuer) @@ -282,9 +285,10 @@ tbs = TBSCertificate() tbs["serialNumber"] = CertificateSerialNumber(10143011886257155224) - sign_algo_id = AlgorithmIdentifier() - sign_algo_id["algorithm"] = ObjectIdentifier("1.2.840.113549.1.1.5") - sign_algo_id["parameters"] = Any(Null()) + sign_algo_id = AlgorithmIdentifier(( + ("algorithm", ObjectIdentifier("1.2.840.113549.1.1.5")), + ("parameters", Any(Null())), + )) tbs["signature"] = sign_algo_id rdnSeq = RDNSequence() @@ -296,20 +300,27 @@ ("2.5.4.10", PrintableString, "Internet Widgits Pty Ltd"), ("2.5.4.3", PrintableString, "false.example.com"), ("1.2.840.113549.1.9.1", IA5String, "false@example.com"), ): - attr = AttributeTypeAndValue() - attr["type"] = AttributeType(oid) - attr["value"] = AttributeValue(klass(text)) - rdn = RelativeDistinguishedName() - rdn.append(attr) - rdnSeq.append(rdn) + rdnSeq.append( + RelativeDistinguishedName(( + AttributeTypeAndValue(( + ("type", AttributeType(oid)), + ("value", AttributeValue(klass(text))), + )), + )) + ) issuer = Name() issuer["rdnSequence"] = rdnSeq tbs["issuer"] = issuer tbs["subject"] = issuer - validity = Validity() - validity["notBefore"] = Time(("utcTime", UTCTime(datetime(2009, 10, 8, 0, 25, 53)))) - validity["notAfter"] = Time(("utcTime", UTCTime(datetime(2010, 10, 8, 0, 25, 53)))) + validity = Validity(( + ("notBefore", Time( + ("utcTime", UTCTime(datetime(2009, 10, 8, 0, 25, 53)),), + )), + ("notAfter", Time( + ("utcTime", UTCTime(datetime(2010, 10, 8, 0, 25, 53)),), + )), + )) tbs["validity"] = validity spki = SubjectPublicKeyInfo() diff --git a/tests/test_pyderasn.py b/tests/test_pyderasn.py index 1e666bcede324272a06db8258cc49bd560ce5494cfe5cfadf58a10050c1d05c6..1b8aace835435b5e0444d8c4dea4989baf0c363e613e121e20ff17a068beaf0d 100644 --- a/tests/test_pyderasn.py +++ b/tests/test_pyderasn.py @@ -3967,7 +3967,7 @@ class SeqMixing(object): def test_invalid_value_type(self): with self.assertRaises(InvalidValueType) as err: - self.base_klass((1, 2, 3)) + self.base_klass(123) repr(err.exception) def test_invalid_value_type_set(self):