From dabcfa2158a44546ed19fb4876dbb9a02c2b6b6b Mon Sep 17 00:00:00 2001 From: 4lDO2 <4lDO2@protonmail.com> Date: Thu, 16 Nov 2023 14:22:24 +0100 Subject: [PATCH] Migrate to libredox and redox-scheme. --- Cargo.lock | 102 +++++++++++++++++++++++++++------------------------- Cargo.toml | 9 +++-- src/main.rs | 78 ++++++++++++---------------------------- 3 files changed, 81 insertions(+), 108 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ab31016552..2ee9b3cc52 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8,6 +8,12 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "bitflags" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" + [[package]] name = "block-buffer" version = "0.7.3" @@ -37,18 +43,9 @@ checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" [[package]] name = "byteorder" -version = "1.4.3" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" - -[[package]] -name = "cc" -version = "1.0.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" -dependencies = [ - "libc", -] +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "digest" @@ -76,9 +73,31 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.147" +version = "0.2.150" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" +checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" + +[[package]] +name = "libredox" +version = "0.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8" +dependencies = [ + "bitflags 2.4.1", + "libc", + "redox_syscall", +] + +[[package]] +name = "libredox" +version = "0.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "962b650e6b934f95cec493e1464e0f5cba98dd9ba9ef2b1c42cdfdb7864cab5a" +dependencies = [ + "bitflags 2.4.1", + "libc", + "redox_syscall", +] [[package]] name = "opaque-debug" @@ -112,68 +131,53 @@ checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" name = "randd" version = "0.1.0" dependencies = [ + "libredox 0.0.3", "rand_chacha", "rand_core", "raw-cpuid", "redox-daemon", + "redox-scheme", "redox_syscall", "sha2", ] [[package]] name = "raw-cpuid" -version = "8.1.2" +version = "11.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fdf7d9dbd43f3d81d94a49c1c3df73cc2b3827995147e6cf7f89d4ec5483e73" +checksum = "9d86a7c4638d42c44551f4791a20e687dbb4c3de1f33c43dd71e355cd429def1" dependencies = [ - "bitflags", - "cc", - "rustc_version", + "bitflags 2.4.1", ] [[package]] name = "redox-daemon" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "811fd0d382a70c9e9192166ee794567b65ef34cc7309c86a49b071779ca9b5f3" +checksum = "353178b5771a301b9d2b318914ab5dfeb21dd6e65930faedde19248cfceca5a7" dependencies = [ "libc", + "libredox 0.0.1", +] + +[[package]] +name = "redox-scheme" +version = "0.1.0" +source = "git+https://gitlab.redox-os.org/redox-os/redox-scheme.git#2c4a85399defee72d25091922450126cdf6130a2" +dependencies = [ + "libredox 0.0.3", "redox_syscall", ] [[package]] name = "redox_syscall" -version = "0.3.5" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" dependencies = [ - "bitflags", + "bitflags 1.3.2", ] -[[package]] -name = "rustc_version" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" -dependencies = [ - "semver", -] - -[[package]] -name = "semver" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" -dependencies = [ - "semver-parser", -] - -[[package]] -name = "semver-parser" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" - [[package]] name = "sha2" version = "0.8.2" @@ -188,6 +192,6 @@ dependencies = [ [[package]] name = "typenum" -version = "1.16.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" diff --git a/Cargo.toml b/Cargo.toml index 306bfae7fe..8dde5e6b41 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,13 +1,16 @@ [package] name = "randd" version = "0.1.0" +edition = "2021" [dependencies] rand_chacha = "0.2" rand_core = "0.5" -redox-daemon = "0.1.1" -redox_syscall = "0.3" +redox-daemon = "0.1.2" +redox_syscall = "0.4.1" +libredox = "0.0.3" sha2 = "0.8" +redox-scheme = { git = "https://gitlab.redox-os.org/redox-os/redox-scheme.git" } [target.'cfg(target_arch = "x86_64")'.dependencies] -raw-cpuid = "8.1" +raw-cpuid = "11.0.1" diff --git a/src/main.rs b/src/main.rs index b811b61e5c..d841d2006b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,13 +1,3 @@ -extern crate syscall; - -extern crate rand_chacha; -extern crate rand_core; -#[cfg(target_arch = "x86_64")] -extern crate raw_cpuid; -extern crate sha2; - -use std::fs::File; -use std::io::{Read, Write}; use std::process; use std::arch::asm; @@ -23,10 +13,11 @@ pub const MODE_READ: u16 = 0o4; #[cfg(target_arch = "x86_64")] use raw_cpuid::CpuId; -use syscall::data::{Packet, Stat}; +use redox_scheme::{Socket, SignalBehavior, SchemeMut}; +use syscall::data::Stat; use syscall::flag::EventFlags; use syscall::{ - Error, Result, SchemeMut, EBADF, EBADFD, EEXIST, EINVAL, ENOENT, EPERM, MODE_CHR, O_CLOEXEC, + Error, Result, EBADF, EBADFD, EEXIST, EINVAL, ENOENT, EPERM, MODE_CHR, O_CLOEXEC, O_CREAT, O_EXCL, O_RDONLY, O_RDWR, O_STAT, O_WRONLY, }; @@ -109,7 +100,7 @@ impl OpenFileInfo { /// Struct to represent the rand scheme. struct RandScheme { - socket: File, + socket: Socket, prng: ChaCha20Rng, // ChaCha20 is a Cryptographically Secure PRNG // https://docs.rs/rand/0.5.0/rand/prng/chacha/struct.ChaChaRng.html @@ -124,7 +115,7 @@ struct RandScheme { impl RandScheme { /// Create new rand scheme from a message socket - fn new(socket: File) -> RandScheme { + fn new(socket: Socket) -> RandScheme { RandScheme { socket, prng: ChaCha20Rng::from_seed(create_rdrand_seed()), @@ -179,30 +170,30 @@ fn test_scheme_perms() { scheme.prng_stat.st_mode = MODE_CHR | 0o200; scheme.prng_stat.st_uid = 1; scheme.prng_stat.st_gid = 1; - assert!(scheme.open("/".as_bytes(), O_RDWR, 1, 1).is_err()); - assert!(scheme.open("/".as_bytes(), O_RDONLY, 1, 1).is_err()); + assert!(scheme.open("/", O_RDWR, 1, 1).is_err()); + assert!(scheme.open("/", O_RDONLY, 1, 1).is_err()); scheme.prng_stat.st_mode = MODE_CHR | 0o400; - let mut fd = scheme.open("".as_bytes(), O_RDONLY, 1, 1).unwrap(); + let mut fd = scheme.open("", O_RDONLY, 1, 1).unwrap(); assert!(scheme.can_perform_op_on_fd(fd, MODE_READ).is_ok()); assert!(scheme.can_perform_op_on_fd(fd, MODE_WRITE).is_err()); assert!(scheme.close(fd).is_ok()); - assert!(scheme.open("".as_bytes(), O_WRONLY, 1, 1).is_err()); - assert!(scheme.open("".as_bytes(), O_RDWR, 1, 1).is_err()); + assert!(scheme.open("", O_WRONLY, 1, 1).is_err()); + assert!(scheme.open("", O_RDWR, 1, 1).is_err()); scheme.prng_stat.st_mode = MODE_CHR | 0o600; - fd = scheme.open("".as_bytes(), O_RDWR, 1, 1).unwrap(); + fd = scheme.open("", O_RDWR, 1, 1).unwrap(); assert!(scheme.can_perform_op_on_fd(fd, MODE_READ).is_ok()); assert!(scheme.can_perform_op_on_fd(fd, MODE_WRITE).is_ok()); assert!(scheme.close(fd).is_ok()); - fd = scheme.open("".as_bytes(), O_STAT, 2, 2).unwrap(); + fd = scheme.open("", O_STAT, 2, 2).unwrap(); assert!(scheme.can_perform_op_on_fd(fd, MODE_READ).is_err()); assert!(scheme.can_perform_op_on_fd(fd, MODE_WRITE).is_err()); assert!(scheme.close(fd).is_ok()); fd = scheme - .open("".as_bytes(), O_STAT | O_CLOEXEC, 2, 2) + .open("", O_STAT | O_CLOEXEC, 2, 2) .unwrap(); assert!(scheme.can_perform_op_on_fd(fd, MODE_READ).is_err()); assert!(scheme.can_perform_op_on_fd(fd, MODE_WRITE).is_err()); @@ -210,14 +201,14 @@ fn test_scheme_perms() { // Try another user in group (no group perms) fd = scheme - .open("".as_bytes(), O_STAT | O_CLOEXEC, 2, 1) + .open("", O_STAT | O_CLOEXEC, 2, 1) .unwrap(); assert!(scheme.can_perform_op_on_fd(fd, MODE_READ).is_err()); assert!(scheme.can_perform_op_on_fd(fd, MODE_WRITE).is_err()); assert!(scheme.close(fd).is_ok()); scheme.prng_stat.st_mode = MODE_CHR | 0o660; fd = scheme - .open("".as_bytes(), O_STAT | O_CLOEXEC, 2, 1) + .open("", O_STAT | O_CLOEXEC, 2, 1) .unwrap(); assert!(scheme.can_perform_op_on_fd(fd, MODE_READ).is_ok()); assert!(scheme.can_perform_op_on_fd(fd, MODE_WRITE).is_ok()); @@ -226,7 +217,7 @@ fn test_scheme_perms() { // Check root can do anything scheme.prng_stat.st_mode = MODE_CHR | 0o000; fd = scheme - .open("".as_bytes(), O_STAT | O_CLOEXEC, 0, 0) + .open("", O_STAT | O_CLOEXEC, 0, 0) .unwrap(); assert!(scheme.can_perform_op_on_fd(fd, MODE_READ).is_ok()); assert!(scheme.can_perform_op_on_fd(fd, MODE_WRITE).is_ok()); @@ -235,7 +226,7 @@ fn test_scheme_perms() { // Check the rand:/urandom URL (Equivalent to rand:/) scheme.prng_stat.st_mode = MODE_CHR | 0o660; fd = scheme - .open("/urandom".as_bytes(), O_STAT | O_CLOEXEC, 2, 1) + .open("/urandom", O_STAT | O_CLOEXEC, 2, 1) .unwrap(); assert!(scheme.can_perform_op_on_fd(fd, MODE_READ).is_ok()); assert!(scheme.can_perform_op_on_fd(fd, MODE_WRITE).is_ok()); @@ -285,19 +276,6 @@ impl SchemeMut for RandScheme { Ok(fd.0) } - fn chmod(&mut self, path: &str, mode: u16, uid: u32, gid: u32) -> Result { - // Defer to fchmod - let fd = self.open(path, O_WRONLY, uid, gid)?; - self.fchmod(fd, mode) - } - - fn dup(&mut self, file: usize, buf: &[u8]) -> Result { - if !buf.is_empty() { - return Err(Error::new(EINVAL)); - } - - Ok(file) - } /* Resource operations */ fn read(&mut self, file: usize, buf: &mut [u8]) -> Result { // Check fd and permissions @@ -393,29 +371,17 @@ impl SchemeMut for RandScheme { } fn daemon(daemon: redox_daemon::Daemon) -> ! { - let socket = File::create(":rand").expect("randd: failed to create rand scheme"); + let socket = Socket::create("rand").expect("randd: failed to create rand scheme"); let mut scheme = RandScheme::new(socket); daemon.ready().expect("randd: failed to mark daemon as ready"); - syscall::setrens(0, 0).expect("randd: failed to enter null namespace"); + libredox::call::setrens(0, 0).expect("randd: failed to enter null namespace"); - loop { - let mut packet = Packet::default(); - match scheme.socket.read(&mut packet) { - Ok(s) => { - if s == 0 { - break; - } - scheme.handle(&mut packet); - match scheme.socket.write(&packet) { - Err(e) => println!("Error writing packet {}", e), - _ => {} - } - } - Err(e) => println!("Error reading packet {}", e), - } + while let Some(request) = scheme.socket.next_request(SignalBehavior::Restart).expect("error reading packet") { + let response = request.handle_scheme_mut(&mut scheme); + scheme.socket.write_responses(&[response], SignalBehavior::Restart).expect("error writing packet"); } process::exit(0);