]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-43908: Mark ssl, hash, and hmac types as immutable (GH-25792)
authorChristian Heimes <christian@python.org>
Sun, 2 May 2021 07:47:45 +0000 (09:47 +0200)
committerGitHub <noreply@github.com>
Sun, 2 May 2021 07:47:45 +0000 (09:47 +0200)
Signed-off-by: Christian Heimes <christian@python.org>
13 files changed:
Lib/test/test_hashlib.py
Lib/test/test_hmac.py
Lib/test/test_ssl.py
Modules/_blake2/blake2b_impl.c
Modules/_blake2/blake2s_impl.c
Modules/_hashopenssl.c
Modules/_sha3/sha3module.c
Modules/_ssl.c
Modules/_ssl/cert.c
Modules/md5module.c
Modules/sha1module.c
Modules/sha256module.c
Modules/sha512module.c

index a515d3a3469330c0b9f70f8f5387666a92be9736..ad2ed69e24b2c4fc0de5e85935dee6a30aa73102 100644 (file)
@@ -926,6 +926,15 @@ class HashLibTestCase(unittest.TestCase):
         ):
             HASHXOF()
 
+    def test_readonly_types(self):
+        for algorithm, constructors in self.constructors_to_test.items():
+            # all other types have DISALLOW_INSTANTIATION
+            for constructor in constructors:
+                hash_type = type(constructor())
+                with self.subTest(hash_type=hash_type):
+                    with self.assertRaisesRegex(TypeError, "immutable type"):
+                        hash_type.value = False
+
 
 class KDFTests(unittest.TestCase):
 
index 22d74e9a1138a1218a237474a24a648fb7bc9e5b..964acd0361e3429f1e47b91c6c6c485826c9275a 100644 (file)
@@ -444,6 +444,9 @@ class ConstructorTestCase(unittest.TestCase):
         ):
             C_HMAC()
 
+        with self.assertRaisesRegex(TypeError, "immutable type"):
+            C_HMAC.value = None
+
     @unittest.skipUnless(sha256_module is not None, 'need _sha256')
     def test_with_sha256_module(self):
         h = hmac.HMAC(b"key", b"hash this!", digestmod=sha256_module.sha256)
index f2b26c4b1405ef6d3874b04735cd80e547cf313a..acb64f15fa0d391dd1557efb08da697a88f7c0a3 100644 (file)
@@ -345,6 +345,25 @@ class BasicSocketTests(unittest.TestCase):
         ssl.OP_NO_TLSv1_2
         self.assertEqual(ssl.PROTOCOL_TLS, ssl.PROTOCOL_SSLv23)
 
+    def test_ssl_types(self):
+        ssl_types = [
+            _ssl._SSLContext,
+            _ssl._SSLSocket,
+            _ssl.MemoryBIO,
+            _ssl.Certificate,
+            _ssl.SSLSession,
+            _ssl.SSLError,
+        ]
+        for ssl_type in ssl_types:
+            with self.subTest(ssl_type=ssl_type):
+                with self.assertRaisesRegex(TypeError, "immutable type"):
+                    ssl_type.value = None
+        with self.assertRaisesRegex(
+            TypeError,
+            "cannot create '_ssl.Certificate' instances"
+        ):
+            _ssl.Certificate()
+
     def test_private_init(self):
         with self.assertRaisesRegex(TypeError, "public constructor"):
             with socket.socket() as s:
index 5d108ed008a8a193d414ed7f86056ba67eaf1cb4..8b0d60d02ac7c8e5991b12d475ea569dde252e13 100644 (file)
@@ -409,6 +409,6 @@ static PyType_Slot blake2b_type_slots[] = {
 PyType_Spec blake2b_type_spec = {
     .name = "_blake2.blake2b",
     .basicsize =  sizeof(BLAKE2bObject),
-    .flags = Py_TPFLAGS_DEFAULT,
+    .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE,
     .slots = blake2b_type_slots
 };
index 85c2d4edad7eeef565193f7c98311506135a04d4..7ab3917aa1a65598ee221ddf0cce2d9e2ef2fe8b 100644 (file)
@@ -408,6 +408,6 @@ static PyType_Slot blake2s_type_slots[] = {
 PyType_Spec blake2s_type_spec = {
     .name = "_blake2.blake2s",
     .basicsize =  sizeof(BLAKE2sObject),
-    .flags = Py_TPFLAGS_DEFAULT,
+    .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE,
     .slots = blake2s_type_slots
 };
index de9bdd4f3062d592cb68cdcf02f2f95cdd004723..b2c67759e95ea30804f58b634a563b46987735b6 100644 (file)
@@ -588,7 +588,7 @@ static PyType_Spec EVPtype_spec = {
     "_hashlib.HASH",    /*tp_name*/
     sizeof(EVPobject),  /*tp_basicsize*/
     0,                  /*tp_itemsize*/
-    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_DISALLOW_INSTANTIATION,
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_DISALLOW_INSTANTIATION | Py_TPFLAGS_IMMUTABLETYPE,
     EVPtype_slots
 };
 
@@ -737,7 +737,7 @@ static PyType_Spec EVPXOFtype_spec = {
     "_hashlib.HASHXOF",    /*tp_name*/
     sizeof(EVPobject),  /*tp_basicsize*/
     0,                  /*tp_itemsize*/
-    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_DISALLOW_INSTANTIATION,
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_DISALLOW_INSTANTIATION | Py_TPFLAGS_IMMUTABLETYPE,
     EVPXOFtype_slots
 };
 
@@ -1729,7 +1729,7 @@ static PyType_Slot HMACtype_slots[] = {
 PyType_Spec HMACtype_spec = {
     "_hashlib.HMAC",    /* name */
     sizeof(HMACobject),     /* basicsize */
-    .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION,
+    .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION | Py_TPFLAGS_IMMUTABLETYPE,
     .slots = HMACtype_slots,
 };
 
index 27f69385cc3eb0f8f387e7578d9dd3deebb3b84a..aba7f6d4b45c22dd555d1c1160c31ba0159b611d 100644 (file)
@@ -525,7 +525,7 @@ static PyGetSetDef SHA3_getseters[] = {
     static PyType_Spec type_spec_obj = { \
         .name = "_sha3." type_name, \
         .basicsize = sizeof(SHA3object), \
-        .flags = Py_TPFLAGS_DEFAULT, \
+        .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE, \
         .slots = type_slots \
     }
 
index 91639277a8302731f716728eef08d719679cf7cb..5f03214ea3eedce141395439329c1d3dbb8b567b 100644 (file)
@@ -437,7 +437,7 @@ static PyType_Spec sslerror_type_spec = {
     "ssl.SSLError",
     sizeof(PyOSErrorObject),
     0,
-    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_IMMUTABLETYPE,
     sslerror_type_slots
 };
 
@@ -2906,7 +2906,7 @@ static PyType_Spec PySSLSocket_spec = {
     "_ssl._SSLSocket",
     sizeof(PySSLSocket),
     0,
-    Py_TPFLAGS_DEFAULT,
+    Py_TPFLAGS_DEFAULT  | Py_TPFLAGS_IMMUTABLETYPE,
     PySSLSocket_slots,
 };
 
@@ -4644,7 +4644,7 @@ static PyType_Spec PySSLContext_spec = {
     "_ssl._SSLContext",
     sizeof(PySSLContext),
     0,
-    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_IMMUTABLETYPE,
     PySSLContext_slots,
 };
 
@@ -4850,7 +4850,7 @@ static PyType_Spec PySSLMemoryBIO_spec = {
     "_ssl.MemoryBIO",
     sizeof(PySSLMemoryBIO),
     0,
-    Py_TPFLAGS_DEFAULT,
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE,
     PySSLMemoryBIO_slots,
 };
 
@@ -5025,7 +5025,7 @@ static PyType_Spec PySSLSession_spec = {
     "_ssl.SSLSession",
     sizeof(PySSLSession),
     0,
-    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_IMMUTABLETYPE,
     PySSLSession_slots,
 };
 
index d2c268008811559f7d8616d3b5417770c6ee1369..bda66dc4d94ae638a50774637aec92c08ba8eb71 100644 (file)
@@ -240,6 +240,6 @@ static PyType_Spec PySSLCertificate_spec = {
     "_ssl.Certificate",
     sizeof(PySSLCertificate),
     0,
-    Py_TPFLAGS_DEFAULT,
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION | Py_TPFLAGS_IMMUTABLETYPE,
     PySSLCertificate_slots,
 };
index 2ae94a456fdb35fda01bab3554e8994cf66d3076..9067c27a1181ea33ec022ee5186b0c34734951a4 100644 (file)
@@ -484,7 +484,7 @@ static PyType_Slot md5_type_slots[] = {
 static PyType_Spec md5_type_spec = {
     .name = "_md5.md5",
     .basicsize =  sizeof(MD5object),
-    .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION,
+    .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION | Py_TPFLAGS_IMMUTABLETYPE,
     .slots = md5_type_slots
 };
 
index 9ac46c58a7f348273641cce28c3028bc949ada18..1d4bde2d3b67bbc03fb733026e2291f6d4ba4e67 100644 (file)
@@ -462,7 +462,7 @@ static PyType_Slot sha1_type_slots[] = {
 static PyType_Spec sha1_type_spec = {
     .name = "_sha1.sha1",
     .basicsize =  sizeof(SHA1object),
-    .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION,
+    .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION | Py_TPFLAGS_IMMUTABLETYPE,
     .slots = sha1_type_slots
 };
 
index ccb1862a99f198bcae5dce84ab104bbe9b2ee22b..1edb9dc0500298c78c771d52ccfc0d79839bc8c7 100644 (file)
@@ -544,14 +544,14 @@ static PyType_Slot sha256_types_slots[] = {
 static PyType_Spec sha224_type_spec = {
     .name = "_sha256.sha224",
     .basicsize = sizeof(SHAobject),
-    .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION,
+    .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION | Py_TPFLAGS_IMMUTABLETYPE,
     .slots = sha256_types_slots
 };
 
 static PyType_Spec sha256_type_spec = {
     .name = "_sha256.sha256",
     .basicsize = sizeof(SHAobject),
-    .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION,
+    .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION | Py_TPFLAGS_IMMUTABLETYPE,
     .slots = sha256_types_slots
 };
 
index 5e8572caf551847909f71c89ff17cabfddd6d351..2bae0ce78774c19dc0cecababd5f9e685172c280 100644 (file)
@@ -602,7 +602,7 @@ static PyType_Slot sha512_sha384_type_slots[] = {
 static PyType_Spec sha512_sha384_type_spec = {
     .name = "_sha512.sha384",
     .basicsize =  sizeof(SHAobject),
-    .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION,
+    .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION | Py_TPFLAGS_IMMUTABLETYPE,
     .slots = sha512_sha384_type_slots
 };
 
@@ -619,7 +619,7 @@ static PyType_Slot sha512_sha512_type_slots[] = {
 static PyType_Spec sha512_sha512_type_spec = {
     .name = "_sha512.sha512",
     .basicsize =  sizeof(SHAobject),
-    .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION,
+    .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION | Py_TPFLAGS_IMMUTABLETYPE,
     .slots = sha512_sha512_type_slots
 };