# coding: utf-8
# PyDERASN -- Python ASN.1 DER codec with abstract structures
-# Copyright (C) 2017 Sergey Matveev <stargrave@stargrave.org>
+# Copyright (C) 2017-2018 Sergey Matveev <stargrave@stargrave.org>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as
from pyderasn import SetOf
from pyderasn import tag_ctxc
from pyderasn import tag_ctxp
+from pyderasn import TeletexString
from pyderasn import UTCTime
class Version(Integer):
- __slots__ = ()
schema = (
("v1", 0),
("v2", 1),
class CertificateSerialNumber(Integer):
- __slots__ = ()
pass
class AlgorithmIdentifier(Sequence):
- __slots__ = ()
schema = (
("algorithm", ObjectIdentifier()),
("parameters", Any(optional=True)),
class AttributeType(ObjectIdentifier):
- __slots__ = ()
pass
class AttributeValue(Any):
- __slots__ = ()
pass
+class OrganizationName(Choice):
+ schema = (
+ ("printableString", PrintableString()),
+ ("teletexString", TeletexString()),
+ )
+
+
class AttributeTypeAndValue(Sequence):
- __slots__ = ()
schema = (
- ("type", AttributeType()),
+ ("type", AttributeType(defines=(((".", "value"), {
+ ObjectIdentifier("2.5.4.6"): PrintableString(),
+ ObjectIdentifier("2.5.4.8"): PrintableString(),
+ ObjectIdentifier("2.5.4.7"): PrintableString(),
+ ObjectIdentifier("2.5.4.10"): OrganizationName(),
+ ObjectIdentifier("2.5.4.3"): PrintableString(),
+ }),))),
("value", AttributeValue()),
)
class RelativeDistinguishedName(SetOf):
- __slots__ = ()
schema = AttributeTypeAndValue()
bounds = (1, float("+inf"))
class RDNSequence(SequenceOf):
- __slots__ = ()
schema = RelativeDistinguishedName()
class Name(Choice):
- __slots__ = ()
schema = (
("rdnSequence", RDNSequence()),
)
class Time(Choice):
- __slots__ = ()
schema = (
("utcTime", UTCTime()),
("generalTime", GeneralizedTime()),
class Validity(Sequence):
- __slots__ = ()
schema = (
("notBefore", Time()),
("notAfter", Time()),
class SubjectPublicKeyInfo(Sequence):
- __slots__ = ()
schema = (
("algorithm", AlgorithmIdentifier()),
("subjectPublicKey", BitString()),
class UniqueIdentifier(BitString):
- __slots__ = ()
pass
class Extension(Sequence):
- __slots__ = ()
schema = (
("extnID", ObjectIdentifier()),
("critical", Boolean(default=False)),
class Extensions(SequenceOf):
- __slots__ = ()
schema = Extension()
bounds = (1, float("+inf"))
class TBSCertificate(Sequence):
- __slots__ = ()
schema = (
("version", Version(expl=tag_ctxc(0), default="v1")),
("serialNumber", CertificateSerialNumber()),
class Certificate(Sequence):
- __slots__ = ()
schema = (
("tbsCertificate", TBSCertificate()),
("signatureAlgorithm", AlgorithmIdentifier()),
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"),
("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)
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()
("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()