]> Cypherpunks.ru repositories - pygost.git/commitdiff
cert-selfsigned-example.py creates more correct CA
authorSergey Matveev <stargrave@stargrave.org>
Wed, 15 Sep 2021 15:17:37 +0000 (18:17 +0300)
committerSergey Matveev <stargrave@stargrave.org>
Wed, 15 Sep 2021 15:17:37 +0000 (18:17 +0300)
pygost/asn1schemas/cert-selfsigned-example.py
pygost/asn1schemas/oids.py
pygost/asn1schemas/x509.py

index 1f505aae09e9e327fa9a2ea407690715634b6224..df832ba4fe07fd408d47dde12584efeb00d68340 100755 (executable)
@@ -22,6 +22,7 @@ from pyderasn import UTCTime
 from pygost.asn1schemas.oids import id_at_commonName
 from pygost.asn1schemas.oids import id_ce_authorityKeyIdentifier
 from pygost.asn1schemas.oids import id_ce_basicConstraints
+from pygost.asn1schemas.oids import id_ce_keyUsage
 from pygost.asn1schemas.oids import id_ce_subjectAltName
 from pygost.asn1schemas.oids import id_ce_subjectKeyIdentifier
 from pygost.asn1schemas.oids import id_tc26_gost3410_2012_256
@@ -51,6 +52,7 @@ from pygost.asn1schemas.x509 import Extensions
 from pygost.asn1schemas.x509 import GeneralName
 from pygost.asn1schemas.x509 import GostR34102012PublicKeyParameters
 from pygost.asn1schemas.x509 import KeyIdentifier
+from pygost.asn1schemas.x509 import KeyUsage
 from pygost.asn1schemas.x509 import Name
 from pygost.asn1schemas.x509 import RDNSequence
 from pygost.asn1schemas.x509 import RelativeDistinguishedName
@@ -211,7 +213,7 @@ subj = Name(("rdnSequence", RDNSequence([
     ))
 ])))
 not_before = datetime.utcnow()
-not_after = not_before + timedelta(days=365)
+not_after = not_before + timedelta(days=365 * (10 if args.ca else 1))
 ai_sign = AlgorithmIdentifier((
     ("algorithm", (ai if ca_ai is None else ca_ai)["sign_algorithm"]),
 ))
@@ -237,6 +239,10 @@ if args.ca:
         ("extnID", id_ce_basicConstraints),
         ("extnValue", OctetString(BasicConstraints((("cA", Boolean(True)),)).encode())),
     )))
+    exts.append(Extension((
+        ("extnID", id_ce_keyUsage),
+        ("extnValue", OctetString(KeyUsage(("keyCertSign",)).encode())),
+    )))
 if ca_ai is not None:
     caKeyId = [
         bytes(SubjectKeyIdentifier().decod(bytes(ext["extnValue"])))
index b1a178f7e36cd32e5ad18320d003e2cabcec26d7..46389007a297b63bc0608b7344d6c4f6a7c17eba 100644 (file)
@@ -55,5 +55,6 @@ id_pbkdf2 = ObjectIdentifier("1.2.840.113549.1.5.12")
 id_at_commonName = ObjectIdentifier("2.5.4.3")
 id_ce_basicConstraints = ObjectIdentifier("2.5.29.19")
 id_ce_subjectKeyIdentifier = ObjectIdentifier("2.5.29.14")
+id_ce_keyUsage = ObjectIdentifier("2.5.29.15")
 id_ce_subjectAltName = ObjectIdentifier("2.5.29.17")
 id_ce_authorityKeyIdentifier = ObjectIdentifier("2.5.29.35")
index cda11da42dcb4d1a8daff65bb054b9c6d02108f4..f434fbb84d61e4f77b513119ed10f095c13a43f2 100644 (file)
@@ -246,3 +246,17 @@ class AuthorityKeyIdentifier(Sequence):
         #     CertificateSerialNumber(impl=tag_ctxp(2), optional=True),
         # ),
     )
+
+
+class KeyUsage(BitString):
+    schema = (
+        ("digitalSignature", 0),
+        ("nonRepudiation", 1),
+        ("keyEncipherment", 2),
+        ("dataEncipherment", 3),
+        ("keyAgreement", 4),
+        ("keyCertSign", 5),
+        ("cRLSign", 6),
+        ("encipherOnly", 7),
+        ("decipherOnly", 8),
+    )