Example #1
0
    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])
Example #2
0
    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])
Example #3
0
 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
Example #4
0
 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
Example #5
0
 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
Example #6
0
def base64_to_a32(s):
    return str_to_a32(base64urldecode(s))
Example #7
0
def base64_to_a32(s):
    return str_to_a32(base64urldecode(s))