# coding: utf-8
-# PyDERASN -- Python ASN.1 DER codec with abstract structures
-# Copyright (C) 2017-2020 Sergey Matveev <stargrave@stargrave.org>
+# PyDERASN -- Python ASN.1 DER/CER/BER codec with abstract structures
+# Copyright (C) 2017-2021 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 copy import copy
from datetime import datetime
+from pickle import dumps as pickle_dumps
+from pickle import HIGHEST_PROTOCOL as pickle_proto
+from pickle import loads as pickle_loads
from unittest import TestCase
-from six.moves.cPickle import dumps as pickle_dumps
-from six.moves.cPickle import HIGHEST_PROTOCOL as pickle_proto
-from six.moves.cPickle import loads as pickle_loads
-
from pyderasn import Any
from pyderasn import BitString
from pyderasn import Boolean
from pyderasn import Choice
+from pyderasn import DecodeError
+from pyderasn import encode_cer
from pyderasn import GeneralizedTime
from pyderasn import hexdec
from pyderasn import IA5String
from pyderasn import tag_ctxp
from pyderasn import TeletexString
from pyderasn import UTCTime
+from pyderasn import UTF8String
name2oid = {
)
+class CommonName(Choice):
+ schema = (
+ ("printableString", PrintableString()),
+ ("utf8String", UTF8String()),
+ )
+
+
class AttributeTypeAndValue(Sequence):
schema = (
- ("type", AttributeType(defines=(((".", "value"), {
+ ("type", AttributeType(defines=((("value",), {
name2oid["id-at-countryName"]: PrintableString(),
name2oid["id-at-localityName"]: PrintableString(),
name2oid["id-at-stateOrProvinceName"]: PrintableString(),
name2oid["id-at-organizationName"]: OrganizationName(),
- name2oid["id-at-commonName"]: PrintableString(),
+ name2oid["id-at-commonName"]: CommonName(),
}),))),
("value", AttributeValue()),
)
pass
+class KeyIdentifier(OctetString):
+ pass
+
+
+class SubjectKeyIdentifier(KeyIdentifier):
+ pass
+
+
class Extension(Sequence):
schema = (
("extnID", ObjectIdentifier()),
("signatureAlgorithm", AlgorithmIdentifier()),
("signatureValue", BitString()),
)
+ der_forced = True
class TestGoSelfSignedVector(TestCase):
"998bb9a4a8cbeb34c0f0a78cf8d91ede14a5ed76bf116fe360aafa8821490435",
))))
self.assertSequenceEqual(crt.encode(), raw)
+ self.assertEqual(
+ Certificate().decod(encode_cer(crt), ctx={"bered": True}),
+ crt,
+ )
class TestGoPayPalVector(TestCase):
+ """PayPal certificate with "www.paypal.com\x00ssl.secureconnection.cc" name
+ """
def runTest(self):
raw = hexdec("".join((
"30820644308205ada003020102020300f09b300d06092a864886f70d010105050",
"07ba44cce54a2d723f9847f626dc054605076321ab469b9c78d5545b3d0c1ec86",
"48cb55023826fdbb8221c439607a8bb",
)))
- crt = Certificate().decod(raw)
- self.assertSequenceEqual(crt.encode(), raw)
- pprint(crt)
- repr(crt)
- pickle_loads(pickle_dumps(crt, pickle_proto))
+ with self.assertRaisesRegex(DecodeError, "alphabet value"):
+ crt = Certificate().decod(raw)