sequenceDiagram
    participant application
    participant enc_new as EncryptedFs::new

    application -->> enc_new : data_dir,password_provider,cipher,read_only
    create participant EncryptedFs
    enc_new -->> EncryptedFs : 
    enc_new -->> application : EncryptedFs
    Note left of application : create file under root_inode <br> and open for read and/or write
    application -->> EncryptedFs : create(root_inode,file_name,file_attributes,read_flag,write_flag)
    Note left of application : extract file_inode from file_attributes
    EncryptedFs -->> application : (file_handle, file_attributes)
    Note left of application : write data buffer into file at offset
    application -->> EncryptedFs : write(file_inode,offset,data_buffer,file_handle)
    EncryptedFs -->> application : bytes_written
    Note left of application : flush file contents on storage
    application -->> EncryptedFs : flush(file_handle) 
    EncryptedFs -->> application : 
    Note left of application : close the file
    application -->> EncryptedFs : release(file_handle)
    EncryptedFs -->> application : 
    Note left of application : open the file with file_inode <br> for read and/or write
    application -->> EncryptedFs : open(file_inode,read,write)
    EncryptedFs -->> application : file_handle
    Note left of application : read from file with file_inode <br> at offset into data buffer
    application -->> EncryptedFs : read(file_inode,offset,data_buffer,file_handle)
    EncryptedFs -->> application : read_bytes
    Note left of application : close the file
    application -->> EncryptedFs : release(file_handle)
    EncryptedFs -->> application : 
    application --x application : exit

Further details about the internals of create, open, close, read and write flows can be found in flows.