Migrate to libredox and redox-scheme.
This commit is contained in:
Generated
+53
-49
@@ -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
@@ -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
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user