Migrate to libredox and redox-scheme.

This commit is contained in:
4lDO2
2023-11-16 14:22:24 +01:00
parent bdbcb0a0e8
commit dabcfa2158
3 changed files with 81 additions and 108 deletions
Generated
+53 -49
View File
@@ -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"
+6 -3
View File
@@ -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"
+22 -56
View File
@@ -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<usize> {
// 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<usize> {
if !buf.is_empty() {
return Err(Error::new(EINVAL));
}
Ok(file)
}
/* Resource operations */
fn read(&mut self, file: usize, buf: &mut [u8]) -> Result<usize> {
// 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);