del self.values['password'] def process(self, challenge): """ """ if challenge is None: return None self.check_values(['username', 'password']) username = bytes(self.values['username']) password = bytes(self.values['password']) mac = hmac.HMAC(key=password, digestmod=self.hash) mac.update(challenge) return username + b' ' + bytes(mac.hexdigest()) def okay(self): """ """ return True def get_user(self): """ """ return self.values['username'] register_mechanism('CRAM-', 20, CRAM_MD5)
""" """ def __init__(self, sasl, name): """ """ super(ANONYMOUS, self).__init__(sasl, name, 0) def get_values(self): """ """ return {} def process(self, challenge=None): """ """ return b'Anonymous, Suelta' def okay(self): """ """ return True def get_user(self): """ """ return 'anonymous' register_mechanism('ANONYMOUS', 0, ANONYMOUS, use_hashes=False)
from suelta.util import bytes from suelta.sasl import Mechanism, register_mechanism class X_MESSENGER_OAUTH2(Mechanism): def __init__(self, sasl, name): super(X_MESSENGER_OAUTH2, self).__init__(sasl, name) self.check_values(['access_token']) def process(self, challenge=None): return bytes(self.values['access_token']) def okay(self): return True register_mechanism('X-MESSENGER-OAUTH2', 10, X_MESSENGER_OAUTH2, use_hashes=False)
d = parse_challenge(challenge) if b'rspauth' in d: self.mutual_auth(d[b'rspauth']) else: if b'realm' not in d: d[b'realm'] = self.sasl.def_realm for key in ['nonce', 'realm']: if bytes(key) in d: self.values[key] = d[bytes(key)] self.values['nc'] = 0 self._qops = [b'auth'] if b'qop' in d: self._qops = [x.strip() for x in d[b'qop'].split(b',')] self.values['qops'] = self._qops if b'maxbuf' in d: self._max_buffer = int(d[b'maxbuf']) return self.response() def okay(self): """ """ if self._rspauth_okay and self._qop == b'auth-int': self._enc_key = self.hash(self._a1 + self.enc_magic).digest() self._dec_key = self.hash(self._a1 + self.dec_magic).digest() self.encoding = True return self._rspauth_okay register_mechanism('DIGEST-', 30, DIGEST_MD5)
self.values['SaltedPassword'] = salted_pass salted_pass = self.values['SaltedPassword'] client_key = self.HMAC(salted_pass, b'Client Key') stored_key = self.H(client_key) client_sig = self.HMAC(stored_key, self._soup) client_proof = XOR(client_key, client_sig) r += b',p=' + b64encode(client_proof).replace(b'\n', b'') server_key = self.HMAC(self.values['SaltedPassword'], b'Server Key') self.server_sig = self.HMAC(server_key, self._soup) return r def process_three(self, challenge=None): """ """ data = parse_challenge(challenge) if b64decode(data[b'v']) == self.server_sig: self._rspauth = True def okay(self): """ """ return self._rspauth def get_user(self): return self.values['username'] register_mechanism('SCRAM-', 60, SCRAM_HMAC) register_mechanism('SCRAM-', 70, SCRAM_HMAC, extra='-PLUS')
class X_FACEBOOK_PLATFORM(Mechanism): def __init__(self, sasl, name): super(X_FACEBOOK_PLATFORM, self).__init__(sasl, name) self.check_values(['access_token', 'api_key']) def process(self, challenge=None): if challenge is not None: values = {} for kv in challenge.split(b'&'): key, value = kv.split(b'=') values[key] = value resp_data = { b'method': values[b'method'], b'v': b'1.0', b'call_id': b'1.0', b'nonce': values[b'nonce'], b'access_token': self.values['access_token'], b'api_key': self.values['api_key'] } resp = '&'.join(['%s=%s' % (k, v) for k, v in resp_data.items()]) return bytes(resp) return b'' def okay(self): return True register_mechanism('X-FACEBOOK-PLATFORM', 40, X_FACEBOOK_PLATFORM, use_hashes=False)
if 'savepass' not in self.values: if self.sasl.sec_query(self, 'CLEAR-PASSWORD'): self.values['savepass'] = True if 'savepass' not in self.values: del self.values['password'] return True def process(self, challenge=None): """ Process a challenge request and return the response. :param challenge: A challenge issued by the server that must be answered for authentication. """ user = bytes(self.values['username']) password = bytes(self.values['password']) return b'\x00' + user + b'\x00' + password def okay(self): """ Mutual authentication is not supported by PLAIN. :returns: ``True`` """ return True register_mechanism('PLAIN', 1, PLAIN, use_hashes=False)