Skip to content

Commit e9f0059

Browse files
committed
bpo-43908: Mark ssl, hash, and hmac types as immutable
Signed-off-by: Christian Heimes <[email protected]>
1 parent a5669b3 commit e9f0059

13 files changed

+49
-18
lines changed

Lib/test/test_hashlib.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -944,6 +944,15 @@ def test_hash_disallow_instanciation(self):
944944
):
945945
HASHXOF()
946946

947+
def test_readonly_types(self):
948+
for algorithm, constructors in self.constructors_to_test.items():
949+
# all other types have DISALLOW_INSTANTIATION
950+
for constructor in constructors:
951+
hash_type = type(constructor())
952+
with self.subTest(hash_type=hash_type):
953+
with self.assertRaisesRegex(TypeError, "immutable type"):
954+
hash_type.value = False
955+
947956

948957
class KDFTests(unittest.TestCase):
949958

Lib/test/test_hmac.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -444,6 +444,9 @@ def test_internal_types(self):
444444
):
445445
C_HMAC()
446446

447+
with self.assertRaisesRegex(TypeError, "immutable type"):
448+
C_HMAC.value = None
449+
447450
@unittest.skipUnless(sha256_module is not None, 'need _sha256')
448451
def test_with_sha256_module(self):
449452
h = hmac.HMAC(b"key", b"hash this!", digestmod=sha256_module.sha256)

Lib/test/test_ssl.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,25 @@ def test_constants(self):
345345
ssl.OP_NO_TLSv1_2
346346
self.assertEqual(ssl.PROTOCOL_TLS, ssl.PROTOCOL_SSLv23)
347347

348+
def test_ssl_types(self):
349+
ssl_types = [
350+
_ssl._SSLContext,
351+
_ssl._SSLSocket,
352+
_ssl.MemoryBIO,
353+
_ssl.Certificate,
354+
_ssl.SSLSession,
355+
_ssl.SSLError,
356+
]
357+
for ssl_type in ssl_types:
358+
with self.subTest(ssl_type=ssl_type):
359+
with self.assertRaisesRegex(TypeError, "immutable type"):
360+
ssl_type.value = None
361+
with self.assertRaisesRegex(
362+
TypeError,
363+
"cannot create '_ssl.Certificate' instances"
364+
):
365+
_ssl.Certificate()
366+
348367
def test_private_init(self):
349368
with self.assertRaisesRegex(TypeError, "public constructor"):
350369
with socket.socket() as s:

Modules/_blake2/blake2b_impl.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -409,6 +409,6 @@ static PyType_Slot blake2b_type_slots[] = {
409409
PyType_Spec blake2b_type_spec = {
410410
.name = "_blake2.blake2b",
411411
.basicsize = sizeof(BLAKE2bObject),
412-
.flags = Py_TPFLAGS_DEFAULT,
412+
.flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE,
413413
.slots = blake2b_type_slots
414414
};

Modules/_blake2/blake2s_impl.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -408,6 +408,6 @@ static PyType_Slot blake2s_type_slots[] = {
408408
PyType_Spec blake2s_type_spec = {
409409
.name = "_blake2.blake2s",
410410
.basicsize = sizeof(BLAKE2sObject),
411-
.flags = Py_TPFLAGS_DEFAULT,
411+
.flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE,
412412
.slots = blake2s_type_slots
413413
};

Modules/_hashopenssl.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -588,7 +588,7 @@ static PyType_Spec EVPtype_spec = {
588588
"_hashlib.HASH", /*tp_name*/
589589
sizeof(EVPobject), /*tp_basicsize*/
590590
0, /*tp_itemsize*/
591-
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_DISALLOW_INSTANTIATION,
591+
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_DISALLOW_INSTANTIATION | Py_TPFLAGS_IMMUTABLETYPE,
592592
EVPtype_slots
593593
};
594594

@@ -737,7 +737,7 @@ static PyType_Spec EVPXOFtype_spec = {
737737
"_hashlib.HASHXOF", /*tp_name*/
738738
sizeof(EVPobject), /*tp_basicsize*/
739739
0, /*tp_itemsize*/
740-
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_DISALLOW_INSTANTIATION,
740+
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_DISALLOW_INSTANTIATION | Py_TPFLAGS_IMMUTABLETYPE,
741741
EVPXOFtype_slots
742742
};
743743

@@ -1729,7 +1729,7 @@ static PyType_Slot HMACtype_slots[] = {
17291729
PyType_Spec HMACtype_spec = {
17301730
"_hashlib.HMAC", /* name */
17311731
sizeof(HMACobject), /* basicsize */
1732-
.flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION,
1732+
.flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION | Py_TPFLAGS_IMMUTABLETYPE,
17331733
.slots = HMACtype_slots,
17341734
};
17351735

Modules/_sha3/sha3module.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -525,7 +525,7 @@ static PyGetSetDef SHA3_getseters[] = {
525525
static PyType_Spec type_spec_obj = { \
526526
.name = "_sha3." type_name, \
527527
.basicsize = sizeof(SHA3object), \
528-
.flags = Py_TPFLAGS_DEFAULT, \
528+
.flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE, \
529529
.slots = type_slots \
530530
}
531531

Modules/_ssl.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -437,7 +437,7 @@ static PyType_Spec sslerror_type_spec = {
437437
"ssl.SSLError",
438438
sizeof(PyOSErrorObject),
439439
0,
440-
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
440+
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_IMMUTABLETYPE,
441441
sslerror_type_slots
442442
};
443443

@@ -2906,7 +2906,7 @@ static PyType_Spec PySSLSocket_spec = {
29062906
"_ssl._SSLSocket",
29072907
sizeof(PySSLSocket),
29082908
0,
2909-
Py_TPFLAGS_DEFAULT,
2909+
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE,
29102910
PySSLSocket_slots,
29112911
};
29122912

@@ -4644,7 +4644,7 @@ static PyType_Spec PySSLContext_spec = {
46444644
"_ssl._SSLContext",
46454645
sizeof(PySSLContext),
46464646
0,
4647-
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
4647+
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_IMMUTABLETYPE,
46484648
PySSLContext_slots,
46494649
};
46504650

@@ -4850,7 +4850,7 @@ static PyType_Spec PySSLMemoryBIO_spec = {
48504850
"_ssl.MemoryBIO",
48514851
sizeof(PySSLMemoryBIO),
48524852
0,
4853-
Py_TPFLAGS_DEFAULT,
4853+
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE,
48544854
PySSLMemoryBIO_slots,
48554855
};
48564856

@@ -5025,7 +5025,7 @@ static PyType_Spec PySSLSession_spec = {
50255025
"_ssl.SSLSession",
50265026
sizeof(PySSLSession),
50275027
0,
5028-
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,
5028+
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_IMMUTABLETYPE,
50295029
PySSLSession_slots,
50305030
};
50315031

Modules/_ssl/cert.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,6 @@ static PyType_Spec PySSLCertificate_spec = {
240240
"_ssl.Certificate",
241241
sizeof(PySSLCertificate),
242242
0,
243-
Py_TPFLAGS_DEFAULT,
243+
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION | Py_TPFLAGS_IMMUTABLETYPE,
244244
PySSLCertificate_slots,
245245
};

Modules/md5module.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -484,7 +484,7 @@ static PyType_Slot md5_type_slots[] = {
484484
static PyType_Spec md5_type_spec = {
485485
.name = "_md5.md5",
486486
.basicsize = sizeof(MD5object),
487-
.flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION,
487+
.flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION | Py_TPFLAGS_IMMUTABLETYPE,
488488
.slots = md5_type_slots
489489
};
490490

Modules/sha1module.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -462,7 +462,7 @@ static PyType_Slot sha1_type_slots[] = {
462462
static PyType_Spec sha1_type_spec = {
463463
.name = "_sha1.sha1",
464464
.basicsize = sizeof(SHA1object),
465-
.flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION,
465+
.flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION | Py_TPFLAGS_IMMUTABLETYPE,
466466
.slots = sha1_type_slots
467467
};
468468

Modules/sha256module.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -544,14 +544,14 @@ static PyType_Slot sha256_types_slots[] = {
544544
static PyType_Spec sha224_type_spec = {
545545
.name = "_sha256.sha224",
546546
.basicsize = sizeof(SHAobject),
547-
.flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION,
547+
.flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION | Py_TPFLAGS_IMMUTABLETYPE,
548548
.slots = sha256_types_slots
549549
};
550550

551551
static PyType_Spec sha256_type_spec = {
552552
.name = "_sha256.sha256",
553553
.basicsize = sizeof(SHAobject),
554-
.flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION,
554+
.flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION | Py_TPFLAGS_IMMUTABLETYPE,
555555
.slots = sha256_types_slots
556556
};
557557

Modules/sha512module.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -602,7 +602,7 @@ static PyType_Slot sha512_sha384_type_slots[] = {
602602
static PyType_Spec sha512_sha384_type_spec = {
603603
.name = "_sha512.sha384",
604604
.basicsize = sizeof(SHAobject),
605-
.flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION,
605+
.flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION | Py_TPFLAGS_IMMUTABLETYPE,
606606
.slots = sha512_sha384_type_slots
607607
};
608608

@@ -619,7 +619,7 @@ static PyType_Slot sha512_sha512_type_slots[] = {
619619
static PyType_Spec sha512_sha512_type_spec = {
620620
.name = "_sha512.sha512",
621621
.basicsize = sizeof(SHAobject),
622-
.flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION,
622+
.flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION | Py_TPFLAGS_IMMUTABLETYPE,
623623
.slots = sha512_sha512_type_slots
624624
};
625625

0 commit comments

Comments
 (0)