use clap::Parser;
use linux_keyutils::{Key, KeyRingIdentifier, KeySerialId};
use std::error::Error;
use zeroize::Zeroizing;
#[derive(Parser, Debug)]
#[clap(author, version, about, long_about = None)]
#[command(arg_required_else_help(true))]
#[command(subcommand_required(true))]
struct Args {
#[clap(subcommand)]
subcommand: Command,
}
#[derive(clap::Subcommand, Debug, PartialEq)]
#[command(arg_required_else_help(true))]
enum Command {
Create {
key_id: i32,
uid: u32,
gid: u32,
thread_ring: i32,
process_ring: i32,
session_ring: i32,
},
}
fn main() -> Result<(), Box<dyn Error>> {
let args = Args::parse();
_ = match args.subcommand {
Command::Create {
key_id,
uid,
gid,
thread_ring: _,
process_ring: _,
session_ring,
} => {
let key = Key::from_id(KeySerialId(key_id));
key.assume_authority()?;
key.chown(Some(uid), Some(gid))?;
let reqkey = Key::from_id(KeySerialId(KeyRingIdentifier::ReqKeyAuthKey as i32));
let mut buf = Zeroizing::new([0u8; 2048]);
let len = reqkey.read(&mut buf)?;
key.instantiate(&buf[..len], KeySerialId(session_ring))?;
}
};
Ok(())
}