Skip to content

Commit 8be6312

Browse files
committed
Add jwt- and signature-based headers
[WIP]
1 parent 9aad4b5 commit 8be6312

3 files changed

Lines changed: 83 additions & 2 deletions

File tree

Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,9 @@ clightningrpc = { version = "0.3.0-beta.8", default-features = false }
104104
lnd_grpc_rust = { version = "2.10.0", default-features = false }
105105
tokio = { version = "1.37", features = ["fs"] }
106106

107+
[target.'cfg(vss_test)'.dev-dependencies]
108+
jsonwebtoken = "10.3.0"
109+
107110
[build-dependencies]
108111
uniffi = { version = "0.28.3", features = ["build"], optional = true }
109112

src/io/test_utils.rs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@ use std::future::Future;
1010
use std::panic::RefUnwindSafe;
1111
use std::path::PathBuf;
1212
use std::sync::Mutex;
13+
use std::time::SystemTime;
1314

15+
use jsonwebtoken::{encode, Algorithm, EncodingKey, Header};
1416
use lightning::events::ClosureReason;
1517
use lightning::ln::functional_test_utils::{
1618
check_added_monitors, check_closed_event, connect_block, create_announced_chan_between_nodes,
@@ -24,6 +26,7 @@ use lightning::util::test_utils;
2426
use lightning::{check_closed_broadcast, io};
2527
use rand::distr::Alphanumeric;
2628
use rand::{rng, Rng};
29+
use serde::{Deserialize, Serialize};
2730

2831
type TestMonitorUpdatePersister<'a, K> = MonitorUpdatingPersister<
2932
&'a K,
@@ -350,3 +353,23 @@ pub(crate) fn do_test_store<K: KVStoreSync + Sync>(store_0: &K, store_1: &K) {
350353
// Make sure everything is persisted as expected after close.
351354
check_persisted_data!(persister_0_max_pending_updates * 2 * EXPECTED_UPDATES_PER_PAYMENT + 1);
352355
}
356+
357+
#[derive(Serialize, Deserialize)]
358+
struct Claims {
359+
sub: String,
360+
iat: i64,
361+
nbf: i64,
362+
exp: i64,
363+
}
364+
365+
pub fn generate_test_jwt(private_pem: &str, user_id: &str) -> String {
366+
let now = SystemTime::now().duration_since(SystemTime::UNIX_EPOCH).unwrap().as_secs() as i64;
367+
368+
let claims =
369+
Claims { sub: user_id.to_owned(), iat: now, nbf: now, exp: now + (86400 * 365 * 10) };
370+
371+
let encoding_key =
372+
EncodingKey::from_rsa_pem(private_pem.as_bytes()).expect("Failed to create EncodingKey");
373+
374+
encode(&Header::new(Algorithm::RS256), &claims, &encoding_key).unwrap()
375+
}

src/io/vss_store.rs

Lines changed: 57 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -971,14 +971,69 @@ mod tests {
971971
use super::*;
972972
use crate::io::test_utils::do_read_write_remove_list_persist;
973973

974+
const VSS_PRIVATE_PEM: &str = r#"
975+
-----BEGIN PRIVATE KEY-----
976+
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCuIYJJ1dzNmuct
977+
fzj+W4EeJXic/A6gkHJOS7MHqAqOqMg49aZfOj6y4kmhU3/fal5OccJ4299ohSnJ
978+
rMKwWoL5YHYD1Y742Ez/trpjETTV6CwjhLovCVtWbZrjivUnYb1fEeGoQ8p+COOK
979+
yMM3s/iQVlhzqo86kZ9fcaGFizrykcRimSDOuN3V/AWcB3fcKufLS76z6ysNTwiK
980+
X/wnBUEtofALIV1i9rcyFpumRGi/9lo80eVcC1TErxA3C5IEwJQ18XCatM2Hf2xi
981+
4D35JDK80/0MY3u7TJgYrFpaThuKd3lnSSPx51enJUEaNgXuUNvTdKkFEn1ASRi5
982+
LNbNLKhXAgMBAAECggEATokCcDaqjXjNxzFYDTBL/cK8sWDlX/mF9FYj+tIJYOoy
983+
063HSa/FU3zH5KD6TVN2ET8xjLzt+AAHJtRqQouwArVExNnuz8EOiU5qpf++qrM6
984+
JRLZvhkkPsjUUMf9ZbOpa1VvRyq8CzgLGC8QDPF4q/ClmBVW3/2JucxQIyD2hywE
985+
MDc8on3nEvCzMGSxUm2EIQn30iF8W2WZyNLk4RK+UUOUHGsFUN0PRfsHFQCAar0V
986+
ZnSxlJgDKETXGjkX8G+H+EyPd+oFH3QtZFTzxk6ghLEZV1vetqMI9WEFnMLKfmFW
987+
tBGYuGcq+72G5mlJqlnix69A93SJziymlS/QWgKrQQKBgQDki5E++NoUyslKMZca
988+
yYWokqxs6T0y15Cig7lDuRfcfDNDjbf9AkRpUZ0O9VESWhCiRG0NKUbHVlAlAb1h
989+
EbWPc2QCs+Tzt2uqeavohbVb9NMsEFSKgx8oUuIisAgUo9Xui+80A+7s54PoeqnT
990+
ULE7KYCbs5oMJjGwpuiolYFYpwKBgQDDDIsEyxdloE6MxpwRshYKzOWR0ADeKuIf
991+
kwEpF1ap5Ng0PdAvIfQS/aRpeb/Tx8Uv2+YMTwX2RyvgbMBFjJa3TEqagFcS4Chu
992+
tabLuyjMq9LlUQdsh4xqfGFF3vaT9coDpbzNvHcmLkK6gnrbnG6mG06xFybqBQ8I
993+
k8dPpnN40QKBgQDUBqc5RKUNpRQZQOhucYcOXQSaBchA4rvMCWhW6+C3LIJiqZeH
994+
ohLVomGS/wO3gtbrs494JlMDm4++xV5sL4HBE8w0tbAyanf4L+jMTz9xkDBZMM09
995+
s2e0gTBJ/gWBIH3YUPoZx4xhPGejxijHYpUJzfcCfBzuKIDw4ef2fr0BAQKBgEcB
996+
X/KExKW4cCALhXFjtWaFJOWqJUa7scnwyDFfT6tVpeeOwSUHZUUslRfYvJ6qUPyV
997+
PvAoLHF1g2GV9YDcJ1nfKiGIqyox9EYpVuk/3yBzRLk6gEtgJRv236qB+p3uknY1
998+
dcAn5fA+Uwh2y6b7EcTimAkb9oym/swOkDZM0CihAoGBAJ9W91zU9H5rMBwiWMKP
999+
ppReTRxxN8oJNk0Cirxr58YHQNXtGWkno316/SPJZzML29c8+QAoJ8uatwzaZzt9
1000+
S6Cq2bYEyO7LPqs3SLRrK802QGvV7Y4P2rX4pjYOMM9qddOnT+qkVyyqVguazfDJ
1001+
xrhmGsrdBu3nBkwwpCBps6KZ
1002+
-----END PRIVATE KEY-----
1003+
"#;
1004+
1005+
fn get_header_provider() -> Arc<dyn VssHeaderProvider> {
1006+
#[cfg(noop_auth_test)]
1007+
{
1008+
return Arc::new(FixedHeaders::new(HashMap::new()));
1009+
}
1010+
#[cfg(jwt_auth_test)]
1011+
{
1012+
use crate::io::test_utils::generate_test_jwt;
1013+
1014+
let token = generate_test_jwt(VSS_PRIVATE_PEM, "test");
1015+
let mut headers = HashMap::new();
1016+
headers.insert("Authorization".to_string(), format!("Bearer {}", token));
1017+
return Arc::new(FixedHeaders::new(headers));
1018+
}
1019+
1020+
#[cfg(sig_auth_test)]
1021+
{
1022+
todo!()
1023+
}
1024+
1025+
#[cfg(not(any(noop_auth_test, jwt_auth_test, sig_auth_test)))]
1026+
Arc::new(FixedHeaders::new(HashMap::new()))
1027+
}
1028+
9741029
#[test]
9751030
fn vss_read_write_remove_list_persist() {
9761031
let vss_base_url = std::env::var("TEST_VSS_BASE_URL").unwrap();
9771032
let mut rng = rng();
9781033
let rand_store_id: String = (0..7).map(|_| rng.sample(Alphanumeric) as char).collect();
9791034
let mut vss_seed = [0u8; 32];
9801035
rng.fill_bytes(&mut vss_seed);
981-
let header_provider = Arc::new(FixedHeaders::new(HashMap::new()));
1036+
let header_provider = get_header_provider();
9821037
let vss_store =
9831038
VssStore::new(vss_base_url, rand_store_id, vss_seed, header_provider).unwrap();
9841039
do_read_write_remove_list_persist(&vss_store);
@@ -991,7 +1046,7 @@ mod tests {
9911046
let rand_store_id: String = (0..7).map(|_| rng.sample(Alphanumeric) as char).collect();
9921047
let mut vss_seed = [0u8; 32];
9931048
rng.fill_bytes(&mut vss_seed);
994-
let header_provider = Arc::new(FixedHeaders::new(HashMap::new()));
1049+
let header_provider = get_header_provider();
9951050
let vss_store =
9961051
VssStore::new(vss_base_url, rand_store_id, vss_seed, header_provider).unwrap();
9971052

0 commit comments

Comments
 (0)