@@ -86,6 +86,12 @@ def modify(self, header_codec=None, **attributes):
8686 rdev (int | Tuple[int, int]): device number, if the file is a device
8787 rdevmajor (int): major part of the device number
8888 rdevminor (int): minor part of the device number
89+ md5Digest (bytes): MD5 digest
90+ rmd160Digest (bytes): RMD160 digest
91+ sha1Digest (bytes): SHA1 digest
92+ sha256Digest (bytes): SHA256 digest
93+ sha384Digest (bytes): SHA384 digest
94+ sha512Digest (bytes): SHA512 digest
8995 """
9096 if header_codec :
9197 self .header_codec = header_codec
@@ -433,6 +439,81 @@ def rdevminor(self):
433439 def rdevminor (self , value ):
434440 ffi .entry_set_rdevminor (self ._entry_p , value )
435441
442+ @property
443+ def md5Digest (self ):
444+ return self ._digest (ffi .ARCHIVE_ENTRY_DIGEST_MD5 )
445+
446+ @md5Digest .setter
447+ def md5Digest (self , value ):
448+ self ._set_digest (ffi .ARCHIVE_ENTRY_DIGEST_MD5 , value )
449+
450+ @property
451+ def rmd160Digest (self ):
452+ return self ._digest (ffi .ARCHIVE_ENTRY_DIGEST_RMD160 )
453+
454+ @rmd160Digest .setter
455+ def rmd160Digest (self , value ):
456+ self ._set_digest (ffi .ARCHIVE_ENTRY_DIGEST_RMD160 , value )
457+
458+ @property
459+ def sha1Digest (self ):
460+ return self ._digest (ffi .ARCHIVE_ENTRY_DIGEST_SHA1 )
461+
462+ @sha1Digest .setter
463+ def sha1Digest (self , value ):
464+ self ._set_digest (ffi .ARCHIVE_ENTRY_DIGEST_SHA1 , value )
465+
466+ @property
467+ def sha256Digest (self ):
468+ return self ._digest (ffi .ARCHIVE_ENTRY_DIGEST_SHA256 )
469+
470+ @sha256Digest .setter
471+ def sha256Digest (self , value ):
472+ self ._set_digest (ffi .ARCHIVE_ENTRY_DIGEST_SHA256 , value )
473+
474+ @property
475+ def sha384Digest (self ):
476+ return self ._digest (ffi .ARCHIVE_ENTRY_DIGEST_SHA384 )
477+
478+ @sha384Digest .setter
479+ def sha384Digest (self , value ):
480+ self ._set_digest (ffi .ARCHIVE_ENTRY_DIGEST_SHA384 , value )
481+
482+ @property
483+ def sha512Digest (self ):
484+ return self ._digest (ffi .ARCHIVE_ENTRY_DIGEST_SHA512 )
485+
486+ @sha512Digest .setter
487+ def sha512Digest (self , value ):
488+ self ._set_digest (ffi .ARCHIVE_ENTRY_DIGEST_SHA512 , value )
489+
490+ def _digest (self , digestType ):
491+ try :
492+ ptr = ffi .entry_digest (self ._entry_p , digestType )
493+ if ptr :
494+ return bytes (ptr [:ffi ._DIGEST_LENGTHS [digestType - 1 ]])
495+ except AttributeError :
496+ raise NotImplementedError (f"the libarchive being used (version "
497+ f"{ ffi .version_number ()} path "
498+ f"{ ffi .libarchive_path } ) doesn't "
499+ f"support read-only digest APIs" )
500+ return None
501+
502+ def _set_digest (self , digestType , value ):
503+ try :
504+ digestLen = ffi ._DIGEST_LENGTHS [digestType - 1 ]
505+ if len (value ) != digestLen :
506+ raise ValueError (f"Invalid input digest Expected { digestLen } "
507+ f"bytes. Got { len (value )} ." )
508+ buffer = (digestLen * ffi .c_ubyte )(* value )
509+ ffi .entry_set_digest (self ._entry_p , digestType , buffer )
510+ except AttributeError :
511+ raise NotImplementedError (f"the libarchive being used (version "
512+ f"{ ffi .version_number ()} path "
513+ f"{ ffi .libarchive_path } ) doesn't support "
514+ f"writable digest APIs" )
515+ return None
516+
436517
437518class ConsumedArchiveEntry (ArchiveEntry ):
438519
0 commit comments