Compare commits
21 Commits
1a9bf85527
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| f7720356f3 | |||
| dd6fb23a9e | |||
| f243b7b95c | |||
| 7e45cd719e | |||
| 5757ed1140 | |||
| bfb77a8368 | |||
| 081cac7074 | |||
| 32d799a5e8 | |||
| 13f852bd20 | |||
| a8ab06df98 | |||
| f50bd5ea91 | |||
| d2154ade95 | |||
| 84ddd68b45 | |||
| de9ec47a6d | |||
| 5aac640ab2 | |||
| daaffce503 | |||
| 2b16e726d4 | |||
| f3fe8c5441 | |||
| 9dc2ae1bf7 | |||
| ed9a7aa94f | |||
| 2d85f9f448 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1,2 +1,3 @@
|
|||||||
/target
|
/target
|
||||||
result
|
result
|
||||||
|
.direnv
|
||||||
|
|||||||
15
default.nix
15
default.nix
@@ -1,14 +1,7 @@
|
|||||||
{ pkgs ? import <nixpkgs> { } }:
|
{ pkgs ? import <nixpkgs> { }
|
||||||
|
, agent
|
||||||
|
}:
|
||||||
with pkgs;
|
with pkgs;
|
||||||
let
|
|
||||||
agent_src = fetchgit {
|
|
||||||
url = "https://gitea.rixxc.de/rixxc/x25519_agent.git";
|
|
||||||
rev = "de022e4c6b6fa0086a9f5c4fad1340b75ccceba1";
|
|
||||||
hash = "sha256-oe8ngvtEcu6O6FWm0ImTS4DTsQx78VRs9bQx672aUbI=";
|
|
||||||
};
|
|
||||||
|
|
||||||
agent = callPackage "${agent_src}/default.nix" { };
|
|
||||||
in
|
|
||||||
rustPlatform.buildRustPackage {
|
rustPlatform.buildRustPackage {
|
||||||
name = "agent-harness";
|
name = "agent-harness";
|
||||||
src = nix-gitignore.gitignoreSource [ ] ./.;
|
src = nix-gitignore.gitignoreSource [ ] ./.;
|
||||||
@@ -17,5 +10,5 @@ rustPlatform.buildRustPackage {
|
|||||||
|
|
||||||
buildInputs = [ agent ];
|
buildInputs = [ agent ];
|
||||||
|
|
||||||
cargoSha256 = "sha256-ZgwQr1goz9yPws0P1eQwhHEv2WbcJeTCLEPYOUADOtE=";
|
cargoHash = "sha256-ZgwQr1goz9yPws0P1eQwhHEv2WbcJeTCLEPYOUADOtE=";
|
||||||
}
|
}
|
||||||
|
|||||||
57
src/main.rs
57
src/main.rs
@@ -1,16 +1,36 @@
|
|||||||
use libc::{
|
use libc::{
|
||||||
c_int, c_void, mmap, MAP_ANON, MAP_FAILED, MAP_PRIVATE, MAP_SHARED, PROT_READ, PROT_WRITE,
|
c_int, c_void, mlockall, mmap, prctl, MAP_FAILED, MAP_SHARED, MCL_FUTURE, PROT_READ,
|
||||||
|
PROT_WRITE, PR_SET_DUMPABLE, PR_SET_SPECULATION_CTRL, PR_SPEC_FORCE_DISABLE,
|
||||||
|
PR_SPEC_STORE_BYPASS,
|
||||||
};
|
};
|
||||||
|
use std::fs::File;
|
||||||
|
use std::os::fd::AsRawFd;
|
||||||
use std::{env, ptr};
|
use std::{env, ptr};
|
||||||
|
|
||||||
const SHARED_MEMORY_SIZE: usize = 1024;
|
const SHARED_MEMORY_SIZE: usize = 1024 * 1024;
|
||||||
|
|
||||||
#[link(name = "agent")]
|
#[link(name = "agent")]
|
||||||
extern "C" {
|
extern "C" {
|
||||||
fn agent_start(shared_memory: *mut u8, sync_memory: *mut u8, private_mem: *mut u8);
|
fn agent_start(shared_memory: *mut u8, sync_memory: *mut u8, private_mem_fd: u64);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
unsafe {
|
||||||
|
assert!(
|
||||||
|
prctl(
|
||||||
|
PR_SET_SPECULATION_CTRL,
|
||||||
|
PR_SPEC_STORE_BYPASS,
|
||||||
|
PR_SPEC_FORCE_DISABLE,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
) >= 0,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsafe {
|
||||||
|
assert!(prctl(PR_SET_DUMPABLE, 0) == 0);
|
||||||
|
}
|
||||||
|
|
||||||
let args: Vec<String> = env::args().collect();
|
let args: Vec<String> = env::args().collect();
|
||||||
|
|
||||||
let shared_fd: c_int = args[0]
|
let shared_fd: c_int = args[0]
|
||||||
@@ -19,7 +39,7 @@ fn main() {
|
|||||||
|
|
||||||
let sync_fd: c_int = args[1]
|
let sync_fd: c_int = args[1]
|
||||||
.parse()
|
.parse()
|
||||||
.expect("Please provide a valid file descriptor as first argument");
|
.expect("Please provide a valid file descriptor as second argument");
|
||||||
|
|
||||||
let shared_memory = unsafe {
|
let shared_memory = unsafe {
|
||||||
mmap(
|
mmap(
|
||||||
@@ -45,20 +65,23 @@ fn main() {
|
|||||||
} as *mut u8;
|
} as *mut u8;
|
||||||
assert_ne!(sync_memory, MAP_FAILED as *mut u8);
|
assert_ne!(sync_memory, MAP_FAILED as *mut u8);
|
||||||
|
|
||||||
let private_mem = unsafe {
|
let private_file = File::options()
|
||||||
mmap(
|
.read(true)
|
||||||
ptr::null_mut() as *mut c_void,
|
.write(true)
|
||||||
32 * 100,
|
.open(&args[2])
|
||||||
PROT_READ | PROT_WRITE,
|
.expect("Cannot open KEY_FILE");
|
||||||
MAP_PRIVATE | MAP_ANON,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
)
|
|
||||||
} as *mut u8;
|
|
||||||
assert_ne!(private_mem, MAP_FAILED as *mut u8);
|
|
||||||
|
|
||||||
println!("Agent: starting agent...");
|
|
||||||
unsafe {
|
unsafe {
|
||||||
agent_start(shared_memory, sync_memory, private_mem);
|
assert!(mlockall(MCL_FUTURE) == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsafe {
|
||||||
|
agent_start(
|
||||||
|
shared_memory,
|
||||||
|
sync_memory,
|
||||||
|
private_file.as_raw_fd().try_into().unwrap(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
drop(private_file); // don't drop (and close) private file before here
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user