Yann Leboulanger pushed to branch master at gajim / python-nbxmpp
Commits: f3e5659c by Emmanuel Gil Peyrot at 2017-06-14T20:20:39+01:00 Fix the namespace of the XEP-0300 hashes
It was taken from a wrong example instead of from the registry.
- - - - - 997b3516 by Emmanuel Gil Peyrot at 2017-06-14T20:22:03+01:00 Update JingleFT and Hashes to their latest experimental version
- - - - - cbc2bae8 by Emmanuel Gil Peyrot at 2017-06-14T20:22:03+01:00 Update hash calculation to the latest recommendation
- - - - - ce015edb by Yann Leboulanger at 2017-06-14T21:27:19+02:00 Merge branch 'jingleft' into 'master'
Update JingleFT and Hashes to their latest experimental version
See merge request !7 - - - - -
1 changed file:
- nbxmpp/protocol.py
Changes:
===================================== nbxmpp/protocol.py ===================================== --- a/nbxmpp/protocol.py +++ b/nbxmpp/protocol.py @@ -24,6 +24,7 @@ from .simplexml import Node, NodeBuilder import time import string import hashlib +from base64 import b64encode
def ascii_upper(s): return s.upper() @@ -95,7 +96,8 @@ NS_JINGLE_ERRORS = 'urn:xmpp:jingle:errors:1' # XEP-0166 NS_JINGLE_RTP = 'urn:xmpp:jingle:apps:rtp:1' # XEP-0167 NS_JINGLE_RTP_AUDIO = 'urn:xmpp:jingle:apps:rtp:audio' # XEP-0167 NS_JINGLE_RTP_VIDEO = 'urn:xmpp:jingle:apps:rtp:video' # XEP-0167 -NS_JINGLE_FILE_TRANSFER ='urn:xmpp:jingle:apps:file-transfer:3' # XEP-0234 +NS_JINGLE_FILE_TRANSFER = 'urn:xmpp:jingle:apps:file-transfer:3' # XEP-0234 +NS_JINGLE_FILE_TRANSFER_5 = 'urn:xmpp:jingle:apps:file-transfer:5' # XEP-0234 NS_JINGLE_XTLS='urn:xmpp:jingle:security:xtls:0' # XTLS: EXPERIMENTAL security layer of jingle NS_JINGLE_RAW_UDP = 'urn:xmpp:jingle:transports:raw-udp:1' # XEP-0177 NS_JINGLE_ICE_UDP = 'urn:xmpp:jingle:transports:ice-udp:1' # XEP-0176 @@ -173,10 +175,15 @@ NS_PUBKEY_REVOKE = 'urn:xmpp:revoke:2' NS_PUBKEY_ATTEST = 'urn:xmpp:attest:2' NS_STREAM_MGMT = 'urn:xmpp:sm:3' # XEP-198 NS_HASHES = 'urn:xmpp:hashes:1' # XEP-300 -NS_HASHES_MD5 = 'urn:xmpp:hash-function-textual-names:md5' -NS_HASHES_SHA1 = 'urn:xmpp:hash-function-textual-names:sha-1' -NS_HASHES_SHA256 = 'urn:xmpp:hash-function-textual-names:sha-256' -NS_HASHES_SHA512 = 'urn:xmpp:hash-function-textual-names:sha-512' +NS_HASHES_2 = 'urn:xmpp:hashes:2' # XEP-300 +NS_HASHES_MD5 = 'urn:xmpp:hash-function-text-names:md5' +NS_HASHES_SHA1 = 'urn:xmpp:hash-function-text-names:sha-1' +NS_HASHES_SHA256 = 'urn:xmpp:hash-function-text-names:sha-256' +NS_HASHES_SHA512 = 'urn:xmpp:hash-function-text-names:sha-512' +NS_HASHES_SHA3_256 = 'urn:xmpp:hash-function-text-names:sha3-256' +NS_HASHES_SHA3_512 = 'urn:xmpp:hash-function-text-names:sha3-512' +NS_HASHES_BLAKE2B_256 = 'urn:xmpp:hash-function-text-names:id-blake2b256' +NS_HASHES_BLAKE2B_512 = 'urn:xmpp:hash-function-text-names:id-blake2b512'
#xmpp_stream_error_conditions = ''' #bad-format -- -- -- The entity has sent XML that cannot be processed. @@ -1347,6 +1354,62 @@ class Hashes(Node): hash_ = hl.hexdigest() return hash_
+class Hashes2(Node): + """ + Hash elements for various XEPs as defined in XEP-300 + """ + + """ + RECOMENDED HASH USE: + Algorithm Support + MD2 MUST NOT + MD4 MUST NOT + MD5 MUST NOT + SHA-1 SHOULD NOT + SHA-256 MUST + SHA-512 SHOULD + SHA3-256 MUST + SHA3-512 SHOULD + BLAKE2b256 MUST + BLAKE2b512 SHOULD + """ + + supported = ('sha-256', 'sha-512', 'sha3-256', 'sha3-512', 'blake2b-256', 'blake2b-512') + + def __init__(self, nsp=NS_HASHES): + Node.__init__(self, None, {}, [], None, None, False, None) + self.setNamespace(nsp) + self.setName('hash') + + def calculateHash(self, algo, file_string): + """ + Calculate the hash and add it. It is preferable doing it here + instead of doing it all over the place in Gajim. + """ + hl = None + hash_ = None + if algo == 'sha-256': + hl = hashlib.sha256() + elif algo == 'sha-512': + hl = hashlib.sha512() + elif algo == 'sha3-256': + hl = hashlib.sha3_256() + elif algo == 'sha3-512': + hl = hashlib.sha3_512() + elif algo == 'blake2b-256': + hl = hashlib.blake2b(digest_size=32) + elif algo == 'blake2b-512': + hl = hashlib.blake2b(digest_size=64) + # file_string can be a string or a file + if hl is not None: + if isinstance(file_string, bytes): + hl.update(file_string) + else: # if it is a file + for line in file_string: + hl.update(line) + hash_ = b64encode(hl.digest()).decode('ascii') + return hash_ + def addHash(self, hash_, algo): self.setAttr('algo', algo) self.setData(hash_)
View it on GitLab: https://dev.gajim.org/gajim/python-nbxmpp/compare/5300788382de00698213167ad8...