def write(self, path, buf, offset, fh):
        fullpath = self._full_path(path)

        #compute the entire plaintext to be written to the file
        #currently does not support writing less than the entire file
        plaintext = buf
        try:
            f = open(fullpath, 'r')
            data = f.read()

            #prevent useless metadata files. should clean them on deletes / truncates
            if len(data) > 0:
                data = self.decrypt_with_metadata(path, data)
                plaintext = data[:offset] + buf + data[(offset + len(buf)):]
            f.close()
        except IOError:
            plaintext = buf
        
        #encrypt and write the metadata file
        filedata = encrypt(plaintext, self.encryption_key, self.signing_key)
        padlength = padding_length(len(plaintext))
        self.write_metadata_file(path, filedata, padlength)

        #write the actual file. The first 80 bytes of filedata are the 
        #hex digest + the iv. The last "padlength" bytes are block padding
        os.lseek(fh, 0, os.SEEK_SET)
        bytes_written = os.write(fh, filedata[self.metadata_header_length:(-1*padlength)])
        return min(len(buf), bytes_written)
Esempio n. 2
0
 def get_metadata(self, plain_data, enc_data):
     padlength = padding_length(len(plain_data))
     digest = enc_data[0:self.digest_size]
     iv = enc_data[self.digest_size:self.digest_size+self.iv_size]
     m_data = {
         'digest': digest,
         'iv': iv,
         'padding': enc_data[(-1 * padlength):],
         'pad_len': padlength
     }
     return m_data
Esempio n. 3
0
 def get_metadata(self, plain_data, enc_data):
     padlength = padding_length(len(plain_data))
     digest = enc_data[0:self.digest_size]
     iv = enc_data[self.digest_size:self.digest_size + self.iv_size]
     m_data = {
         'digest': digest,
         'iv': iv,
         'padding': enc_data[(-1 * padlength):],
         'pad_len': padlength
     }
     return m_data