# Slixmpp: The Slick XMPP Library# Copyright (C) 2017 Emmanuel Gil Peyrot# This file is part of Slixmpp.# See the file LICENSE for copying permission.frombase64importb64encodeimporthashlibimportloggingfromslixmpp.pluginsimportBasePluginfromslixmpp.plugins.xep_0300importstanza,Hashlog=logging.getLogger(__name__)
[docs]classXEP_0300(BasePlugin):""" XEP-0300: Use of Cryptographic Hash Functions in XMPP """name='xep_0300'description='XEP-0300: Use of Cryptographic Hash Functions in XMPP'dependencies={'xep_0030'}stanza=stanzadefault_config={'block_size':1024*1024,# One MiB'preferred':'sha-256','enable_sha-1':False,'enable_sha-256':True,'enable_sha-512':True,'enable_sha3-256':True,'enable_sha3-512':True,'enable_BLAKE2b256':True,'enable_BLAKE2b512':True,}_hashlib_function={'sha-1':hashlib.sha1,'sha-256':hashlib.sha256,'sha-512':hashlib.sha512,'sha3-256':hashlib.sha3_256,'sha3-512':hashlib.sha3_512,'BLAKE2b256':lambda:hashlib.blake2b(digest_size=32),'BLAKE2b512':lambda:hashlib.blake2b(digest_size=64),}def__init__(self,*args,**kwargs):super().__init__(*args,**kwargs)self.enabled_hashes=[]defplugin_init(self):namespace='urn:xmpp:hash-function-text-names:%s'self.enabled_hashes.clear()foralgoinself._hashlib_function:ifgetattr(self,'enable_'+algo,False):self.enabled_hashes.append(namespace%algo)defsession_bind(self,jid):self.xmpp['xep_0030'].add_feature(Hash.namespace)fornamespaceinself.enabled_hashes:self.xmpp['xep_0030'].add_feature(namespace)defplugin_end(self):fornamespaceinself.enabled_hashes:self.xmpp['xep_0030'].del_feature(feature=namespace)self.enabled_hashes.clear()self.xmpp['xep_0030'].del_feature(feature=Hash.namespace)defcompute_hash(self,filename,function=None):iffunctionisNone:function=self.preferredh=self._hashlib_function[function]()withopen(filename,'rb')asf:whileTrue:block=f.read(self.block_size)ifnotblock:breakh.update(block)hash_elem=Hash()hash_elem['algo']=functionhash_elem['value']=b64encode(h.digest())returnhash_elem