From ead01ea2daa068d063f9748a1c791915af76012d Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Mon, 24 Oct 2016 14:08:15 -0600 Subject: [PATCH] Add random number scheme, update userutils to use it --- Makefile | 2 ++ filesystem/etc/init.rc | 1 + filesystem/etc/passwd | 2 +- filesystem/etc/pcid.toml | 4 +-- libstd | 2 +- programs/orbutils | 2 +- programs/userutils | 2 +- schemes/randd/Cargo.toml | 3 ++ schemes/randd/src/main.rs | 59 +++++++++++++++++++++++++++++++++++++++ 9 files changed, 71 insertions(+), 6 deletions(-) create mode 100644 schemes/randd/Cargo.toml create mode 100644 schemes/randd/src/main.rs diff --git a/Makefile b/Makefile index 2b65c2f..191559f 100644 --- a/Makefile +++ b/Makefile @@ -401,6 +401,7 @@ userutils: \ filesystem/bin/getty \ filesystem/bin/id \ filesystem/bin/login \ + filesystem/bin/passwd \ filesystem/bin/su \ filesystem/bin/sudo @@ -410,6 +411,7 @@ schemes: \ filesystem/bin/example \ filesystem/bin/ipd \ filesystem/bin/orbital \ + filesystem/bin/randd \ filesystem/bin/tcpd \ filesystem/bin/udpd diff --git a/filesystem/etc/init.rc b/filesystem/etc/init.rc index 0a41f7f..6df7d63 100644 --- a/filesystem/etc/init.rc +++ b/filesystem/etc/init.rc @@ -1,3 +1,4 @@ +randd initfs:bin/pcid /etc/pcid.toml ethernetd arpd diff --git a/filesystem/etc/passwd b/filesystem/etc/passwd index af4995b..3be5252 100644 --- a/filesystem/etc/passwd +++ b/filesystem/etc/passwd @@ -1,2 +1,2 @@ -root;F3C2DB8A2B386A467FE3BA116DD2D2E3EAAE98546FCC8321FDBD4C1F6D65A2;0;0;root;file:root;file:bin/ion +root;$argon2i$m=4096,t=10,p=1$Tnc4UVV0N00$ML9LIOujd3nmAfkAwEcSTMPqakWUF0OUiLWrIy0nGLk;0;0;root;file:root;file:bin/ion user;;1000;1000;user;file:home/user;file:bin/ion diff --git a/filesystem/etc/pcid.toml b/filesystem/etc/pcid.toml index 2192fe8..72f10e7 100644 --- a/filesystem/etc/pcid.toml +++ b/filesystem/etc/pcid.toml @@ -3,11 +3,11 @@ name = "E1000 NIC" class = 2 vendor = 32902 device = 4110 -command = ["file:bin/e1000d", "$BAR0", "$IRQ"] +command = ["e1000d", "$BAR0", "$IRQ"] [[drivers]] name = "RTL8168 NIC" class = 2 vendor = 4332 device = 33128 -command = ["file:bin/rtl8168d", "$BAR2", "$IRQ"] +command = ["rtl8168d", "$BAR2", "$IRQ"] diff --git a/libstd b/libstd index 00d7f8a..4f642ee 160000 --- a/libstd +++ b/libstd @@ -1 +1 @@ -Subproject commit 00d7f8a547b83e604f1a3b6df769a6e77e7feed9 +Subproject commit 4f642eed87af22913af7bef9c71910ee1765445e diff --git a/programs/orbutils b/programs/orbutils index edc8da6..517ca6d 160000 --- a/programs/orbutils +++ b/programs/orbutils @@ -1 +1 @@ -Subproject commit edc8da6807a18bc2ae7c4482ae4a84ca9dad4f4a +Subproject commit 517ca6d125e90d6b30e45a759f54b1d1b3b346d4 diff --git a/programs/userutils b/programs/userutils index e0fe388..46631df 160000 --- a/programs/userutils +++ b/programs/userutils @@ -1 +1 @@ -Subproject commit e0fe388ccfe8873cc6e42dc99556bccc191528fb +Subproject commit 46631df4f09c39ff760b48d25249a48840ee20fa diff --git a/schemes/randd/Cargo.toml b/schemes/randd/Cargo.toml new file mode 100644 index 0000000..5c60f5c --- /dev/null +++ b/schemes/randd/Cargo.toml @@ -0,0 +1,3 @@ +[package] +name = "randd" +version = "0.1.0" diff --git a/schemes/randd/src/main.rs b/schemes/randd/src/main.rs new file mode 100644 index 0000000..bafe051 --- /dev/null +++ b/schemes/randd/src/main.rs @@ -0,0 +1,59 @@ +#![feature(asm)] + +extern crate syscall; + +use std::fs::File; +use std::io::{Read, Write}; +use std::thread; + +use syscall::{Packet, Result, Scheme}; + +//TODO: Use a CSPRNG, allow write of entropy +struct RandScheme; + +impl Scheme for RandScheme { + fn open(&self, _path: &[u8], _flags: usize, _uid: u32, _gid: u32) -> Result { + Ok(0) + } + + fn dup(&self, file: usize) -> Result { + Ok(file) + } + + fn read(&self, _file: usize, buf: &mut [u8]) -> Result { + let mut i = 0; + for chunk in buf.chunks_mut(8) { + let mut rand: u64; + unsafe { + asm!("rdrand rax" + : "={rax}"(rand) + : + : + : "intel", "volatile"); + } + for b in chunk.iter_mut() { + *b = rand as u8; + rand = rand >> 8; + i += 1; + } + } + Ok(i) + } + + fn close(&self, _file: usize) -> Result { + Ok(0) + } +} + +fn main(){ + thread::spawn(move || { + let mut socket = File::create(":rand").expect("rand: failed to create rand scheme"); + let scheme = RandScheme; + loop { + let mut packet = Packet::default(); + socket.read(&mut packet).expect("rand: failed to read events from rand scheme"); + scheme.handle(&mut packet); + socket.write(&packet).expect("rand: failed to write responses to rand scheme"); + } + }); +}