Skip to content

Commit 4576bd6

Browse files
authored
Merge pull request #340 from NordSecurity/FILE-613_retrieve_private_key_always
FILE-613: retrieve private key always
2 parents d5f4cba + 9704105 commit 4576bd6

File tree

8 files changed

+52
-48
lines changed

8 files changed

+52
-48
lines changed

changelog.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
* Add `base_dir` field to the `FilePending` event
55
* Update moose tracker to v13.1.0
66
* Adds the `transfer_intent_received` event
7+
* Added private key retrieval on demand instead of caching it
78

89
---
910
<br>

drop-transfer/examples/udrop.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,12 @@ async fn main() -> anyhow::Result<()> {
315315

316316
let auth = {
317317
let pubkey = drop_auth::PublicKey::from(PUB_KEY);
318-
auth::Context::new(drop_auth::SecretKey::from(PRIV_KEY), move |_| Some(pubkey))
318+
let privkey = move || {
319+
let privkey = drop_auth::SecretKey::from(PRIV_KEY);
320+
Some(privkey)
321+
};
322+
323+
auth::Context::new(privkey, move |_| Some(pubkey))
319324
};
320325

321326
let storage_file = matches.get_one::<String>("storage").unwrap();

drop-transfer/src/auth.rs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,17 @@ use drop_auth::{PublicKey, SecretKey};
44
use hyper::{http::HeaderValue, Response};
55

66
pub struct Context {
7-
secret: SecretKey,
7+
secret: Box<dyn Fn() -> Option<SecretKey> + Send + Sync>,
88
public: Box<dyn Fn(IpAddr) -> Option<PublicKey> + Send + Sync>,
99
}
1010

1111
impl Context {
1212
pub fn new(
13-
secret: SecretKey,
13+
secret: impl Fn() -> Option<SecretKey> + Send + Sync + 'static,
1414
public: impl Fn(IpAddr) -> Option<PublicKey> + Send + Sync + 'static,
1515
) -> Self {
1616
Self {
17-
secret,
17+
secret: Box::new(secret),
1818
public: Box::new(public),
1919
}
2020
}
@@ -28,7 +28,8 @@ impl Context {
2828
tokio::task::block_in_place(|| {
2929
let auth_req = drop_auth::http::Authorization::parse(auth_header_value)?;
3030
let pubkey = (self.public)(peer_ip)?;
31-
drop_auth::authorize(nonce, &self.secret, &pubkey, &auth_req)
31+
let secret = (self.secret)()?;
32+
drop_auth::authorize(nonce, &secret, &pubkey, &auth_req)
3233
})
3334
.is_some()
3435
}
@@ -74,9 +75,10 @@ impl Context {
7475
.context("Failed to parse 'www-authenticate' header")?;
7576

7677
let public = (self.public)(peer_ip).context("Failed to fetch peer's public key")?;
78+
let secret = (self.secret)().context("Failed to fetch private key")?;
7779

7880
let ticket =
79-
drop_auth::create_ticket_as_client(&self.secret, &public, resp, check_nonce_prefix)
81+
drop_auth::create_ticket_as_client(&secret, &public, resp, check_nonce_prefix)
8082
.context("Failed to create auth ticket")?;
8183

8284
let value = HeaderValue::from_str(&ticket.to_string())?;
@@ -96,8 +98,9 @@ impl Context {
9698
.context("Failed to parse 'www-authenticate' header")?;
9799

98100
let public = (self.public)(peer_ip).context("Failed to fetch peer's public key")?;
101+
let secret = (self.secret)().context("Failed to fetch private key")?;
99102

100-
let ticket = drop_auth::create_ticket_as_server(&self.secret, &public, resp)
103+
let ticket = drop_auth::create_ticket_as_server(&secret, &public, resp)
101104
.context("Failed to create auth ticket")?;
102105

103106
let value = HeaderValue::from_str(&ticket.to_string())?;

drop-transfer/src/ws/server/v6.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ impl<'a> handler::HandlerInit for HandlerInit<'a> {
9797
.context("Failed to receive transfer request")?;
9898

9999
// print msg as ascii
100-
debug!(self.logger, "************** msg:\n\t{msg:?}");
100+
debug!(self.logger, "msg:\n\t{msg:?}");
101101

102102
let msg = msg.to_str().ok().context("Expected JSON message")?;
103103
debug!(self.logger, "Request received:\n\t{msg}");

norddrop/src/device.rs

Lines changed: 26 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use std::{
55
};
66

77
use drop_analytics::DeveloperExceptionEventData;
8-
use drop_auth::{PublicKey, SecretKey};
8+
use drop_auth::{PublicKey, SecretKey, PUBLIC_KEY_LENGTH, SECRET_KEY_LENGTH};
99
use drop_config::{Config, DropConfig, MooseConfig};
1010
use drop_storage::types::Transfer as TransferInfo;
1111
use drop_transfer::{auth, utils::Hidden, Event, FileToSend, OutgoingTransfer, Service, Transfer};
@@ -15,7 +15,7 @@ use tokio::{
1515
task::JoinHandle,
1616
};
1717

18-
use crate::{event, TransferDescriptor};
18+
use crate::{event, KeyStore, TransferDescriptor};
1919

2020
pub type Result<T = ()> = std::result::Result<T, crate::LibdropError>;
2121

@@ -52,15 +52,11 @@ impl EventDispatcher {
5252
impl NordDropFFI {
5353
pub(super) fn new(
5454
event_cb: impl Fn(crate::Event) + Send + Sync + 'static,
55-
pubkey_cb: impl Fn(IpAddr) -> Option<PublicKey> + Send + 'static,
56-
privkey: SecretKey,
55+
key_store: Arc<dyn KeyStore>,
5756
logger: Logger,
5857
) -> Result<Self> {
5958
trace!(logger, "norddrop_new()");
6059

61-
// It's a debug print. Not visible in the production build
62-
debug!(logger, "Private key: {:02X?}", privkey.to_bytes());
63-
6460
Ok(NordDropFFI {
6561
instance: Arc::default(),
6662
logger: logger.clone(),
@@ -69,7 +65,7 @@ impl NordDropFFI {
6965
cb: Arc::new(event_cb) as _,
7066
},
7167
config: DropConfig::default(),
72-
keys: Arc::new(crate_key_context(logger, privkey, pubkey_cb)),
68+
keys: Arc::new(create_key_context(logger, key_store)),
7369
#[cfg(unix)]
7470
fdresolv: None,
7571
})
@@ -522,22 +518,33 @@ impl NordDropFFI {
522518
}
523519
}
524520

525-
fn crate_key_context(
526-
logger: slog::Logger,
527-
privkey: SecretKey,
528-
pubkey_cb: impl Fn(IpAddr) -> Option<PublicKey> + Send + 'static,
529-
) -> auth::Context {
530-
let pubkey_cb = std::sync::Mutex::new(pubkey_cb);
531-
let public = move |ip: IpAddr| {
521+
fn create_key_context(logger: slog::Logger, key_store: Arc<dyn KeyStore>) -> auth::Context {
522+
let privkey = {
523+
let key_store = key_store.clone();
524+
let logger = logger.clone();
525+
let privkey_cb = std::sync::Mutex::new(key_store);
526+
move || {
527+
let guard = privkey_cb.lock().expect("Failed to lock privkey callback");
528+
let privkey: [u8; SECRET_KEY_LENGTH] = guard.privkey().try_into().ok()?;
529+
drop(guard);
530+
531+
debug!(logger, "Retrieved private key: {:?}", privkey);
532+
Some(SecretKey::from(privkey))
533+
}
534+
};
535+
536+
let pubkey_cb = std::sync::Mutex::new(key_store);
537+
let pubkey = move |ip: IpAddr| {
532538
let guard = pubkey_cb.lock().expect("Failed to lock pubkey callback");
533-
let key = guard(ip)?;
539+
let pubkey = guard.on_pubkey(ip.to_string())?;
534540
drop(guard);
535541

536-
debug!(logger, "Public key for {ip:?}: {key:?}");
537-
Some(key)
542+
let pubkey: [u8; PUBLIC_KEY_LENGTH] = pubkey.try_into().ok()?;
543+
debug!(logger, "Retrieved public key for: {} key: {:?}", ip, pubkey);
544+
Some(PublicKey::from(pubkey))
538545
};
539546

540-
auth::Context::new(privkey, public)
547+
auth::Context::new(privkey, pubkey)
541548
}
542549

543550
fn open_database(

norddrop/src/uni.rs

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
use std::sync::Mutex;
22

3-
use drop_auth::{PublicKey, SecretKey, PUBLIC_KEY_LENGTH};
4-
53
use crate::{device::NordDropFFI, Event, TransferDescriptor, TransferInfo};
64

75
pub type Result<T> = std::result::Result<T, crate::LibdropError>;
@@ -36,20 +34,9 @@ impl NordDrop {
3634
) -> Result<Self> {
3735
let logger = super::log::create(logger);
3836

39-
let privkey = key_store.privkey();
40-
let privkey: [u8; PUBLIC_KEY_LENGTH] = privkey
41-
.try_into()
42-
.map_err(|_| crate::LibdropError::InvalidPrivkey)?;
43-
let privkey = SecretKey::from(privkey);
44-
4537
let dev = NordDropFFI::new(
4638
move |ev| event_callback.on_event(ev),
47-
move |peer_ip| {
48-
let pubkey = key_store.on_pubkey(peer_ip.to_string())?;
49-
let pubkey: [u8; PUBLIC_KEY_LENGTH] = pubkey.try_into().ok()?;
50-
Some(PublicKey::from(pubkey))
51-
},
52-
privkey,
39+
key_store.into(),
5340
logger,
5441
)?;
5542

test/drop_test/ffi.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ def __init__(self):
6868
def on_event(self, event: norddrop.Event):
6969
event = new_event(event)
7070
if DEBUG_PRINT_EVENT:
71-
tprint(bcolors.HEADER + "--- event: ", event, bcolors.ENDC, flush=True)
71+
tprint(bcolors.HEADER + "event: ", event, bcolors.ENDC, flush=True)
7272

7373
with self._lock:
7474
self._events.append(event)

test/runner.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import os
55
import re
66
import time
7+
import sys
8+
from datetime import timedelta
79
from threading import Semaphore
810
from typing import Tuple
911

@@ -132,6 +134,7 @@ def run():
132134
for s in scenarios:
133135
total_containers += len(s.runners())
134136

137+
start_time = time.time()
135138
while True:
136139
if len(already_done) == len(scenarios):
137140
break
@@ -202,8 +205,6 @@ def run():
202205
info = ContainerHolder(container, scenario.id(), TESTCASE_TIMEOUT)
203206
scenario_results[scenario.id()].append(info)
204207

205-
curr_time = time.strftime("%H:%M:%S", time.localtime())
206-
207208
done_containers = 0
208209
failed_container_count = 0
209210
for scenario in scenarios:
@@ -214,11 +215,11 @@ def run():
214215
success, reason = container.success()
215216
if not success:
216217
failed_container_count += 1
217-
218-
print(
219-
f"*** Test suite progress: {curr_time}: {done_containers}/{total_containers} containers finished, {failed_container_count} failed",
220-
flush=True,
218+
elapsed_time = str(timedelta(seconds=(round(time.time() - start_time))))
219+
sys.stdout.write(
220+
f"Testing in progress. Elapsed time: {elapsed_time}. Container exit stats: {done_containers}/{total_containers}, of those failed: {failed_container_count}\r"
221221
)
222+
sys.stdout.flush()
222223

223224
time.sleep(1)
224225

0 commit comments

Comments
 (0)