//! Defines the context type for a session handling hwtrust data structures.

/// The context for a session handling hwtrust data structures.
pub struct Session {
    /// Options that control the behaviour during this session.
    pub options: Options,
}

/// Options that control the behaviour of a session.
#[derive(Default)]
pub struct Options {
    /// The expected format for the configuration descriptor in the first certificate of the DICE
    /// chain. When the chain is ROM-rooted, the first certificate is generated by ROM so this
    /// option can be used for compatibility with ROMs.
    pub first_dice_chain_cert_config_format: ConfigFormat,

    /// The types that are permitted for the key_ops field of COSE_Key objects in the DICE chain.
    /// This option can be used for compatibility with the RKP HAL before v3 which diverged from
    /// the COSE spec and allowed a single int instead of always requiring an array.
    pub dice_chain_key_ops_type: KeyOpsType,

    /// The types that are permitted for the mode field of the DICE certificates. This option can
    /// be used for compatibility with the RKP HAL v3 which allowed some deviations from the Open
    /// Profile for DICE specification.
    pub dice_chain_mode_type: ModeType,

    /// Whether to allow the key_usage field of the DICE certificates to be encoded in big-endian
    /// byte order. This introduces ambiguity of the exact key usage being expressed but the keys
    /// in the DICE chain are only used for verification so it may be preferable to allow for
    /// compatibility with implementations that use the wrong endianness.
    pub dice_chain_allow_big_endian_key_usage: bool,

    /// The types that are permitted for the component version field in the configuration
    /// descriptor. The specification has changed the allowed types over time and this option
    /// can be used to select which rules to apply.
    pub dice_chain_component_version_type: ComponentVersionType,
}

/// Format of the DICE configuration descriptor.
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub enum ConfigFormat {
    /// The configuration descriptor format specified by Android.
    #[default]
    Android,
    /// Any configuration descriptor format is allowed.
    Permissive,
}

/// Type allowed for the COSE_Key object key_ops field in the DICE chain.
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub enum KeyOpsType {
    /// The key_ops field must be an array as specified in the COSE RFC.
    #[default]
    Array,
    /// The key_ops field can be either a single int or an array as specified in the COSE RFC.
    IntOrArray,
}

/// Type allowed for the DICE certificate mode field.
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub enum ModeType {
    /// The mode field must be a byte string holding a single byte as specified by the Open Profile
    /// for DICE.
    #[default]
    Bytes,
    /// The mode field can be either an int or a byte string holding a single byte.
    IntOrBytes,
}

/// Type allowed for the DICE certificate configuration descriptor's component version field.
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub enum ComponentVersionType {
    /// The component version can be either an int or a free-form string.
    #[default]
    IntOrString,
    /// The component version must be an int.
    Int,
}

impl Options {
    /// The options use by VSR 13.
    pub fn vsr13() -> Self {
        Self {
            // Context: b/262599829#comment65
            dice_chain_key_ops_type: KeyOpsType::IntOrArray,
            // Context: b/273552826
            dice_chain_component_version_type: ComponentVersionType::Int,
            ..Options::default()
        }
    }

    /// The options use by VSR 14.
    pub fn vsr14() -> Self {
        Self {
            // Context: b/261647022
            first_dice_chain_cert_config_format: ConfigFormat::Permissive,
            // Context: b/273552826
            dice_chain_mode_type: ModeType::IntOrBytes,
            dice_chain_allow_big_endian_key_usage: true,
            ..Options::default()
        }
    }
}
