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)
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
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