@@ -255,11 +255,22 @@ def sha_final(sha_info):
255255 dig .extend ([ ((i >> 56 ) & 0xff ), ((i >> 48 ) & 0xff ), ((i >> 40 ) & 0xff ), ((i >> 32 ) & 0xff ), ((i >> 24 ) & 0xff ), ((i >> 16 ) & 0xff ), ((i >> 8 ) & 0xff ), (i & 0xff ) ])
256256 return bytes (dig )
257257
258- class sha512 (object ):
258+ class Immutable (type ):
259+ def __init__ (cls , name , bases , dct ):
260+ type .__setattr__ (cls ,"attr" ,set (dct .keys ()))
261+ type .__init__ (cls , name , bases , dct )
262+
263+ def __setattr__ (cls , name , value ):
264+ # Mock Py_TPFLAGS_IMMUTABLETYPE
265+ qualname = '.' .join ([cls .__module__ , cls .__name__ ])
266+ raise TypeError (f"cannot set '{ name } ' attribute of immutable type '{ qualname } '" )
267+
268+
269+ class sha512 (object , metaclass = Immutable ):
259270 digest_size = digestsize = SHA_DIGESTSIZE
260271 block_size = SHA_BLOCKSIZE
261272
262- def __init__ (self , s = None , * , usedforsecurity = True ):
273+ def __init__ (self , s = None , usedforsecurity = True ):
263274 self .name = 'sha512'
264275 self ._sha = sha_init ()
265276 if s :
@@ -282,7 +293,7 @@ def copy(self):
282293class sha384 (sha512 ):
283294 digest_size = digestsize = 48
284295
285- def __init__ (self , s = None , * , usedforsecurity = True ):
296+ def __init__ (self , s = None , usedforsecurity = True ):
286297 self .name = 'sha384'
287298 self ._sha = sha384_init ()
288299 if s :
0 commit comments