def login(self): password_aes = prepare_key(str_to_a32(self.password)) del self.password uh = stringhash(self.email.lower(), password_aes) res = self.api_req({'a': 'us', 'user': self.email, 'uh': uh}) enc_master_key = base64_to_a32(res['k']) self.master_key = decrypt_key(enc_master_key, password_aes) if 'tsid' in res: tsid = base64urldecode(res['tsid']) if a32_to_str(encrypt_key(str_to_a32(tsid[:16]), self.master_key)) == tsid[-16:]: self.sid = res['tsid'] elif 'csid' in res: enc_rsa_priv_key = base64_to_a32(res['privk']) rsa_priv_key = decrypt_key(enc_rsa_priv_key, self.master_key) privk = a32_to_str(rsa_priv_key) self.rsa_priv_key = [0, 0, 0, 0] for i in xrange(4): l = ((ord(privk[0]) * 256 + ord(privk[1]) + 7) / 8) + 2 self.rsa_priv_key[i] = mpi2int(privk[:l]) privk = privk[l:] enc_sid = mpi2int(base64urldecode(res['csid'])) decrypter = RSA.construct((self.rsa_priv_key[0] * self.rsa_priv_key[1], 0L, self.rsa_priv_key[2], self.rsa_priv_key[0], self.rsa_priv_key[1])) sid = '%x' % decrypter.key._decrypt(enc_sid) sid = binascii.unhexlify('0' + sid if len(sid) % 2 else sid) self.sid = base64urlencode(sid[:43])
def login(self): password_aes = prepare_key(str_to_a32(self.password)) del self.password uh = stringhash(self.email.lower(), password_aes) res = self.api_req({'a': 'us', 'user': self.email, 'uh': uh}) enc_master_key = base64_to_a32(res['k']) self.master_key = decrypt_key(enc_master_key, password_aes) if 'tsid' in res: tsid = base64urldecode(res['tsid']) if a32_to_str(encrypt_key(str_to_a32(tsid[:16]), self.master_key)) == tsid[-16:]: self.sid = res['tsid'] elif 'csid' in res: enc_rsa_priv_key = base64_to_a32(res['privk']) rsa_priv_key = decrypt_key(enc_rsa_priv_key, self.master_key) privk = a32_to_str(rsa_priv_key) self.rsa_priv_key = [0, 0, 0, 0] for i in xrange(4): l = ((ord(privk[0]) * 256 + ord(privk[1]) + 7) / 8) + 2 self.rsa_priv_key[i] = mpi2int(privk[:l]) privk = privk[l:] enc_sid = mpi2int(base64urldecode(res['csid'])) decrypter = RSA.construct( (self.rsa_priv_key[0] * self.rsa_priv_key[1], 0L, self.rsa_priv_key[2], self.rsa_priv_key[0], self.rsa_priv_key[1])) sid = '%x' % decrypter.key._decrypt(enc_sid) sid = binascii.unhexlify('0' + sid if len(sid) % 2 else sid) self.sid = base64urlencode(sid[:43])
def processfile(self, file, users_keys): if file['t'] == 0 or file['t'] == 1: keys = dict(keypart.split(':',1) for keypart in file['k'].split('/')) uid = file['u'] key = None if uid in keys : # normal file or folder key = decrypt_key(base64_to_a32( keys[uid] ), self.master_key) elif 'su' in file and 'sk' in file and ':' in file['k']: # Shared folder user_key = decrypt_key(base64_to_a32(file['sk']),self.master_key) key = decrypt_key(base64_to_a32(keys[file['h']]),user_key) if file['su'] not in users_keys : users_keys[file['su']] = {} users_keys[file['su']][file['h']] = user_key elif file['u'] and file['u'] in users_keys : # Shared file for hkey in users_keys[file['u']] : user_key = users_keys[file['u']][hkey] if hkey in keys : key = keys[hkey] key = decrypt_key(base64_to_a32(key),user_key) break if key is not None : if file['t'] == 0: k = file['k'] = (key[0] ^ key[4], key[1] ^ key[5], key[2] ^ key[6], key[3] ^ key[7]) iv = file['iv'] = key[4:6] + (0, 0) meta_mac = file['meta_mac'] = key[6:8] else: k = file['k'] = key attributes = base64urldecode(file['a']) attributes = dec_attr(attributes, k) file['a'] = attributes elif file['t'] == 2: self.root_id = file['h'] file['a'] = {'n': 'Cloud Drive'} elif file['t'] == 3: self.inbox_id = file['h'] file['a'] = {'n': 'Inbox'} elif file['t'] == 4: self.trashbin_id = file['h'] file['a'] = {'n': 'Rubbish Bin'} return file
def processfile(self, file): if file['t'] == 0 or file['t'] == 1: key = file['k'][file['k'].index(':') + 1:] key = decrypt_key(base64_to_a32(key), self.master_key) if file['t'] == 0: k = file['k'] = (key[0] ^ key[4], key[1] ^ key[5], key[2] ^ key[6], key[3] ^ key[7]) iv = file['iv'] = key[4:6] + (0, 0) meta_mac = file['meta_mac'] = key[6:8] else: k = file['k'] = key attributes = base64urldecode(file['a']) attributes = dec_attr(attributes, k) file['a'] = attributes elif file['t'] == 2: self.root_id = file['h'] file['a'] = {'n': 'Cloud Drive'} elif file['t'] == 3: self.inbox_id = file['h'] file['a'] = {'n': 'Inbox'} elif file['t'] == 4: self.trashbin_id = file['h'] file['a'] = {'n': 'Rubbish Bin'} return file
def base64_to_a32(s): return str_to_a32(base64urldecode(s))