use bitflags::bitflags;
use keyutils_raw::*;
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
pub enum SpecialKeyring {
Thread,
Process,
Session,
User,
UserSession,
Group,
}
impl SpecialKeyring {
pub fn serial(self) -> KeyringSerial {
match self {
SpecialKeyring::Thread => KEY_SPEC_THREAD_KEYRING,
SpecialKeyring::Process => KEY_SPEC_PROCESS_KEYRING,
SpecialKeyring::Session => KEY_SPEC_SESSION_KEYRING,
SpecialKeyring::User => KEY_SPEC_USER_KEYRING,
SpecialKeyring::UserSession => KEY_SPEC_USER_SESSION_KEYRING,
SpecialKeyring::Group => KEY_SPEC_GROUP_KEYRING,
}
}
}
bitflags! {
pub struct Permission: KeyPermissions {
const POSSESSOR_VIEW = KEY_POS_VIEW;
const POSSESSOR_READ = KEY_POS_READ;
const POSSESSOR_WRITE = KEY_POS_WRITE;
const POSSESSOR_SEARCH = KEY_POS_SEARCH;
const POSSESSOR_LINK = KEY_POS_LINK;
const POSSESSOR_SET_ATTRIBUTE = KEY_POS_SETATTR;
const POSSESSOR_ALL = KEY_POS_ALL;
const USER_VIEW = KEY_USR_VIEW;
const USER_READ = KEY_USR_READ;
const USER_WRITE = KEY_USR_WRITE;
const USER_SEARCH = KEY_USR_SEARCH;
const USER_LINK = KEY_USR_LINK;
const USER_SET_ATTRIBUTE = KEY_USR_SETATTR;
const USER_ALL = KEY_USR_ALL;
const GROUP_VIEW = KEY_GRP_VIEW;
const GROUP_READ = KEY_GRP_READ;
const GROUP_WRITE = KEY_GRP_WRITE;
const GROUP_SEARCH = KEY_GRP_SEARCH;
const GROUP_LINK = KEY_GRP_LINK;
const GROUP_SET_ATTRIBUTE = KEY_GRP_SETATTR;
const GROUP_ALL = KEY_GRP_ALL;
const OTHER_VIEW = KEY_OTH_VIEW;
const OTHER_READ = KEY_OTH_READ;
const OTHER_WRITE = KEY_OTH_WRITE;
const OTHER_SEARCH = KEY_OTH_SEARCH;
const OTHER_LINK = KEY_OTH_LINK;
const OTHER_SET_ATTRIBUTE = KEY_OTH_SETATTR;
const OTHER_ALL = KEY_OTH_ALL;
}
}
pub type KeyctlSupportFlags = u32;
bitflags! {
struct KeyctlSupportFlag: KeyctlSupportFlags {
const SUPPORTS_ENCRYPT = 0x01;
const SUPPORTS_DECRYPT = 0x02;
const SUPPORTS_SIGN = 0x04;
const SUPPORTS_VERIFY = 0x08;
}
}
#[test]
fn test_keyring_ids() {
assert_eq!(SpecialKeyring::Thread.serial(), KEY_SPEC_THREAD_KEYRING);
assert_eq!(SpecialKeyring::Process.serial(), KEY_SPEC_PROCESS_KEYRING);
assert_eq!(SpecialKeyring::Session.serial(), KEY_SPEC_SESSION_KEYRING);
assert_eq!(SpecialKeyring::User.serial(), KEY_SPEC_USER_KEYRING);
assert_eq!(
SpecialKeyring::UserSession.serial(),
KEY_SPEC_USER_SESSION_KEYRING
);
assert_eq!(SpecialKeyring::Group.serial(), KEY_SPEC_GROUP_KEYRING);
}
#[test]
fn test_possessor_permission_bits() {
assert_eq!(Permission::POSSESSOR_VIEW.bits, KEY_POS_VIEW);
assert_eq!(Permission::POSSESSOR_READ.bits, KEY_POS_READ);
assert_eq!(Permission::POSSESSOR_WRITE.bits, KEY_POS_WRITE);
assert_eq!(Permission::POSSESSOR_SEARCH.bits, KEY_POS_SEARCH);
assert_eq!(Permission::POSSESSOR_LINK.bits, KEY_POS_LINK);
assert_eq!(Permission::POSSESSOR_SET_ATTRIBUTE.bits, KEY_POS_SETATTR);
assert_eq!(Permission::POSSESSOR_ALL.bits, KEY_POS_ALL);
}
#[test]
fn test_user_permission_bits() {
assert_eq!(Permission::USER_VIEW.bits, KEY_USR_VIEW);
assert_eq!(Permission::USER_READ.bits, KEY_USR_READ);
assert_eq!(Permission::USER_WRITE.bits, KEY_USR_WRITE);
assert_eq!(Permission::USER_SEARCH.bits, KEY_USR_SEARCH);
assert_eq!(Permission::USER_LINK.bits, KEY_USR_LINK);
assert_eq!(Permission::USER_SET_ATTRIBUTE.bits, KEY_USR_SETATTR);
assert_eq!(Permission::USER_ALL.bits, KEY_USR_ALL);
}
#[test]
fn test_group_permission_bits() {
assert_eq!(Permission::GROUP_VIEW.bits, KEY_GRP_VIEW);
assert_eq!(Permission::GROUP_READ.bits, KEY_GRP_READ);
assert_eq!(Permission::GROUP_WRITE.bits, KEY_GRP_WRITE);
assert_eq!(Permission::GROUP_SEARCH.bits, KEY_GRP_SEARCH);
assert_eq!(Permission::GROUP_LINK.bits, KEY_GRP_LINK);
assert_eq!(Permission::GROUP_SET_ATTRIBUTE.bits, KEY_GRP_SETATTR);
assert_eq!(Permission::GROUP_ALL.bits, KEY_GRP_ALL);
}
#[test]
fn test_other_permission_bits() {
assert_eq!(Permission::OTHER_VIEW.bits, KEY_OTH_VIEW);
assert_eq!(Permission::OTHER_READ.bits, KEY_OTH_READ);
assert_eq!(Permission::OTHER_WRITE.bits, KEY_OTH_WRITE);
assert_eq!(Permission::OTHER_SEARCH.bits, KEY_OTH_SEARCH);
assert_eq!(Permission::OTHER_LINK.bits, KEY_OTH_LINK);
assert_eq!(Permission::OTHER_SET_ATTRIBUTE.bits, KEY_OTH_SETATTR);
assert_eq!(Permission::OTHER_ALL.bits, KEY_OTH_ALL);
}
#[test]
fn test_support_flags() {
assert_eq!(
KeyctlSupportFlag::SUPPORTS_ENCRYPT.bits,
KEYCTL_SUPPORTS_ENCRYPT,
);
assert_eq!(
KeyctlSupportFlag::SUPPORTS_DECRYPT.bits,
KEYCTL_SUPPORTS_DECRYPT,
);
assert_eq!(KeyctlSupportFlag::SUPPORTS_SIGN.bits, KEYCTL_SUPPORTS_SIGN);
assert_eq!(
KeyctlSupportFlag::SUPPORTS_VERIFY.bits,
KEYCTL_SUPPORTS_VERIFY,
);
}