Struct optee_utee::object::PersistentObject
source · pub struct PersistentObject(/* private fields */);
Expand description
An object identified by an Object Identifier and including a Data Stream.
Contrast TransientObject.
Implementations§
source§impl PersistentObject
impl PersistentObject
sourcepub fn open(
storage_id: ObjectStorageConstants,
object_id: &[u8],
flags: DataFlag
) -> Result<Self>
pub fn open( storage_id: ObjectStorageConstants, object_id: &[u8], flags: DataFlag ) -> Result<Self>
Open an existing persistent object.
§Parameters
storage_id
: The storage to use which is defined in ObjectStorageConstants.object_id
: The object identifier. Note that this buffer cannot reside in shared memory.flags
: The DataFlag which determine the settings under which the object is opened.
§Example
let obj_id = [1u8;1];
match PersistentObject::open(
ObjectStorageConstants::Private,
&obj_id,
DataFlag::ACCESS_READ) {
Ok(object) =>
{
// ...
Ok(())
}
Err(e) => Err(e),
}
§Errors
ItemNotFound
: If the storage denoted by storage_id does not exist or if the object identifier cannot be found in the storage.Access_Conflict
: If an access right conflict was detected while opening the object.OutOfMemory
: If there is not enough memory to complete the operation.CorruptObject
: If the object is corrupt. The object handle SHALL behave based on thegpd.ta.doesNotCloseHandleOnCorruptObject
property.StorageNotAvailable
: If the object is stored in a storage area which is currently inaccessible.
§Panics
- If object_id.len() > MiscellaneousConstants::TeeObjectIdMaxLen
- If the Implementation detects any other error associated with this function which is not explicitly associated with a defined return code for this function.
sourcepub fn create(
storage_id: ObjectStorageConstants,
object_id: &[u8],
flags: DataFlag,
attributes: Option<ObjectHandle>,
initial_data: &[u8]
) -> Result<Self>
pub fn create( storage_id: ObjectStorageConstants, object_id: &[u8], flags: DataFlag, attributes: Option<ObjectHandle>, initial_data: &[u8] ) -> Result<Self>
Create an object with initial attributes and an initial data stream content.
§Parameters
storage_id
: The storage to use which is defined in ObjectStorageConstants.object_id
: The object identifier. Note that this buffer cannot reside in shared memory.flags
: The DataFlag which determine the settings under which the object is opened.attributes
: A handle on a PersistentObject or an initialized TransientObject from which to take the PersistentObject attributes. Can be NONE if the PersistentObject contains no attribute. For example,if it is a pure data object.
§Example
let obj_id = [1u8;1];
let mut init_data: [u8; 0] = [0; 0];
match PersistentObject::create(
ObjectStorageConstants::Private,
&obj_id,
DataFlag::ACCESS_READ | DataFlag::ACCESS_WRITE,
None,
&mut init_data) {
Ok(object) =>
{
// ...
Ok(())
}
Err(e) => Err(e),
}
§Errors
ItemNotFound
: If the storage denoted by storage_id does not exist.Access_Conflict
: If an access right conflict was detected while opening the object.OutOfMemory
: If there is not enough memory to complete the operation.StorageNoSpace
: If insufficient space is available to create the persistent object.CorruptObject
: If the storage is corrupt.StorageNotAvailable
: If the object is stored in a storage area which is currently inaccessible.
§Panics
- If object_id.len() > MiscellaneousConstants::TeeObjectIdMaxLen.
- If attributes is not NONE and is not a valid handle on an initialized object containing the type and attributes of the object to create.
- If the Implementation detects any other error associated with this function which is not explicitly associated with a defined return code for this function.
sourcepub fn close_and_delete(self) -> Result<()>
pub fn close_and_delete(self) -> Result<()>
Marks an object for deletion and closes the object.
§Example
let obj_id = [1u8;1];
match PersistentObject::open (
ObjectStorageConstants::Private,
&obj_id,
DataFlag::ACCESS_READ) {
Ok(mut object) =>
{
object.close_and_delete()?;
Ok(())
}
Err(e) => Err(e),
}
§Errors
StorageNotAvailable
: If the object is stored in a storage area which is currently inaccessible.
§Panics
- If object is not a valid opened object.
- If the Implementation detects any other error associated with this function which is not explicitly associated with a defined return code for this function.
§Breaking Changes
Now we no longer need to call core::mem::forget
after successfully calling
close_and_delete
, and code like this will now produce a compilation error.
let mut obj = PersistentObject::open (
ObjectStorageConstants::Private,
&obj_id,
DataFlag::ACCESS_READ,
)?;
obj.close_and_delete()?;
core::mem::forget(obj); // will get compilation error in this line
// ^^^ value used here after move
sourcepub fn rename(&mut self, new_object_id: &[u8]) -> Result<()>
pub fn rename(&mut self, new_object_id: &[u8]) -> Result<()>
Changes the identifier of an object. The object SHALL have been opened with the DataFlag::ACCESS_WRITE_META right, which means access to the object is exclusive.
§Example
let obj_id = [1u8;1];
let new_obj_id = [2u8;1];
match PersistentObject::open (
ObjectStorageConstants::Private,
&obj_id,
DataFlag::ACCESS_WRITE_META) {
Ok(mut object) =>
{
object.rename(&new_obj_id)?;
Ok(())
}
Err(e) => Err(e),
}
§Errors
AccessConflict
: If an object with the same identifier already exists.CorruptObject
: If the object is corrupt. The object handle SHALL behave based on thegpd.ta.doesNotCloseHandleOnCorruptObject
property.StorageNotAvailable
: If the object is stored in a storage area which is currently inaccessible.
§Panics
- If object is not a valid handle on a persistent object that has been opened with the write-meta access right.
- If new_object_id resides in shared memory.
- If new_object_id.len() > MiscellaneousConstants::TeeObjectIdMaxLen.
- If the Implementation detects any other error associated with this function which is not explicitly associated with a defined return code for this function.
sourcepub fn read(&self, buf: &mut [u8]) -> Result<u32>
pub fn read(&self, buf: &mut [u8]) -> Result<u32>
Read requested size from the data stream associate with the object into the buffer.
§Parameters
buffer
: A pre-allocated buffer for saving the object’s data stream.count
: The returned value contains the number of bytes read.
§Example
let obj_id = [1u8;1];
match PersistentObject::open (
ObjectStorageConstants::Private,
&obj_id,
DataFlag::ACCESS_READ) {
Ok(object) =>
{
let mut read_buf = [0u8;16];
object.read(&mut read_buf)?;
Ok(())
}
Err(e) => Err(e),
}
§Errors
CorruptObject
: If the object is corrupt. The object handle SHALL behave based on thegpd.ta.doesNotCloseHandleOnCorruptObject
property.StorageNotAvailable
: If the object is stored in a storage area which is currently inaccessible.
§Panics
- If object is not a valid handle on a persistent object opened with the read access right.
- If the Implementation detects any other error associated with this function which is not explicitly associated with a defined return code for this function.
sourcepub fn write(&mut self, buf: &[u8]) -> Result<()>
pub fn write(&mut self, buf: &[u8]) -> Result<()>
Write the passed in buffer data into from the data stream associate with the object.
§Parameters
buffer
: A pre-allocated buffer for saving the object’s data stream.
§Example
let obj_id = [1u8;1];
match PersistentObject::open (
ObjectStorageConstants::Private,
&obj_id,
DataFlag::ACCESS_WRITE) {
Ok(mut object) =>
{
let write_buf = [1u8;16];
object.write(& write_buf)?;
Ok(())
}
Err(e) => Err(e),
}
§Errors
StorageNoSpace
: If insufficient storage space is available.Overflow
: If the value of the data position indicator resulting from this operation would be greater than MiscellaneousConstants::TeeDataMaxPosition.CorruptObject
: If the object is corrupt. The object handle SHALL behave based on thegpd.ta.doesNotCloseHandleOnCorruptObject
property.StorageNotAvailable
: If the object is stored in a storage area which is currently inaccessible.
§Panics
- If object is not a valid handle on a persistent object opened with the write access right
- If the Implementation detects any other error associated with this function which is not explicitly associated with a defined return code for this function.
sourcepub fn truncate(&self, size: u32) -> Result<()>
pub fn truncate(&self, size: u32) -> Result<()>
Change the size of a data stream associate with the object.
§Example
let obj_id = [1u8;1];
match PersistentObject::open (
ObjectStorageConstants::Private,
&obj_id,
DataFlag::ACCESS_WRITE) {
Ok(object) =>
{
object.truncate(1u32)?;
Ok(())
}
Err(e) => Err(e),
}
§Errors
StorageNoSpace
: If insufficient storage space is available.CorruptObject
: If the object is corrupt. The object handle SHALL behave based on thegpd.ta.doesNotCloseHandleOnCorruptObject
property.StorageNotAvailable
: If the object is stored in a storage area which is currently inaccessible.
§Panics
- If object is not a valid handle on a persistent object opened with the write access right.
- If the Implementation detects any other error associated with this function which is not explicitly associated with a defined return code for this function.
sourcepub fn seek(&self, offset: i32, whence: Whence) -> Result<()>
pub fn seek(&self, offset: i32, whence: Whence) -> Result<()>
Set the data position indicator associate with the object.
§Parameters
whence
: Defined in Whence.offset
: The bytes shifted based onwhence
.
§Example
let obj_id = [1u8;1];
match PersistentObject::open(
ObjectStorageConstants::Private,
&obj_id,
DataFlag::ACCESS_WRITE) {
Ok(object) =>
{
object.seek(0i32, Whence::DataSeekSet)?;
Ok(())
}
Err(e) => Err(e),
}
§Errors
Overflow
: If data position indicator is greater than MiscellaneousConstants::TeeDataMaxPosition.CorruptObject
: If the object is corrupt. The object handle SHALL behave based on thegpd.ta.doesNotCloseHandleOnCorruptObject
property.StorageNotAvailable
: If the object is stored in a storage area which is currently inaccessible.
§Panics
- If object is not a valid handle on a persistent object.
- If the Implementation detects any other error associated with this function which is not explicitly associated with a defined return code for this function.