blob: 4d21b03573dd65942ae3c47426d30dbd27b829e1 [file] [log] [blame]
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
use core::fmt;
use hex;
use optee_teec_sys as raw;
use uuid as uuid_crate;
use uuid_crate::parser::ParseError;
use uuid_crate::BytesError;
/// A Universally Unique Resource Identifier (UUID) type as defined in RFC4122.
/// The value is used to identify a trusted application.
pub struct Uuid {
raw: raw::TEEC_UUID,
}
impl Uuid {
/// Parses a Uuid from a string of hexadecimal digits with optional hyphens.
///
/// # Examples
///
/// ```
/// let uuid = Uuid::parse_str("8abcf200-2450-11e4-abe2-0002a5d5c51b").unwrap();
/// ```
pub fn parse_str(input: &str) -> Result<Uuid, ParseError> {
let uuid = uuid_crate::Uuid::parse_str(input)?;
let (time_low, time_mid, time_hi_and_version, clock_seq_and_node) = uuid.as_fields();
Ok(Self::new_raw(
time_low,
time_mid,
time_hi_and_version,
*clock_seq_and_node,
))
}
/// Creates a `Uuid` using the supplied big-endian bytes.
///
/// # Examples
///
/// ```
/// let bytes: [u8; 16] = [70, 235, 208, 238, 14, 109, 67, 201, 185, 13, 204, 195, 90, 145, 63, 62,];
/// let uuid = Uuid::from_bytes(bytes);
/// ```
pub fn from_bytes(bytes: [u8; 16]) -> Uuid {
let uuid = uuid_crate::Uuid::from_bytes(bytes);
let (time_low, time_mid, time_hi_and_version, clock_seq_and_node) = uuid.as_fields();
Self::new_raw(time_low, time_mid, time_hi_and_version, *clock_seq_and_node)
}
/// Creates a `Uuid` using a slice of supplied big-endian bytes.
///
/// # Examples
///
/// ```
/// let bytes: &[u8; 16] = &[70, 235, 208, 238, 14, 109, 67, 201, 185, 13, 204, 195, 90, 145, 63, 62,];
/// let uuid = Uuid::from_slice(bytes);
/// ```
pub fn from_slice(b: &[u8]) -> Result<Uuid, BytesError> {
let uuid = uuid_crate::Uuid::from_slice(b)?;
let (time_low, time_mid, time_hi_and_version, clock_seq_and_node) = uuid.as_fields();
Ok(Self::new_raw(
time_low,
time_mid,
time_hi_and_version,
*clock_seq_and_node,
))
}
/// Crates a raw TEE client uuid object with specified parameters.
pub fn new_raw(
time_low: u32,
time_mid: u16,
time_hi_and_version: u16,
clock_seq_and_nod: [u8; 8],
) -> Uuid {
let raw_uuid = raw::TEEC_UUID {
timeLow: time_low,
timeMid: time_mid,
timeHiAndVersion: time_hi_and_version,
clockSeqAndNode: clock_seq_and_nod,
};
Self { raw: raw_uuid }
}
/// Converts a uuid to a const raw `TEEC_UUID` pointer.
pub fn as_raw_ptr(&self) -> *const raw::TEEC_UUID {
&self.raw
}
}
impl fmt::Display for Uuid {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(
f,
"{:x}-{:x}-{:x}-{}",
self.raw.timeLow,
self.raw.timeMid,
self.raw.timeHiAndVersion,
hex::encode(self.raw.clockSeqAndNode)
)
}
}