Skip to content

Commit 21d556a

Browse files
authored
Replace network id with key (#46)
* Update network key management to utilize raw public keys - Refactored the key management system to transition from using derived network IDs to raw public keys for network identification, enhancing consistency and security in encryption processes. - Updated method signatures across the `runar-ffi` and `runar-keys` modules to accept and handle public key byte arrays instead of string identifiers. - Modified the `EnvelopeEncryptedData` structure to store the network public key directly, improving clarity in data handling. - Adjusted tests and examples to reflect the new public key approach, ensuring comprehensive coverage and validation of key management workflows. - Introduced new dependencies for cryptographic operations, enhancing the overall functionality and performance of the key management system. * Refactor FFI key management tests and remove unused functions - Updated the `linux_keystore_end_to_end_mobile_node_flow` test to simplify the conversion of raw parts to a vector, enhancing code clarity. - Removed the unused `cstr_to_string` function, streamlining the codebase and improving maintainability. - Ensured that the remaining tests reflect the latest changes in key management functionalities, maintaining comprehensive coverage.
1 parent db870b7 commit 21d556a

30 files changed

+936
-403
lines changed

Cargo.lock

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

runar-cli/tests/e2e_init_test.rs

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -108,30 +108,33 @@ impl MobileSimulator {
108108
fn generate_network_data_key(&mut self) -> Result<String> {
109109
self.logger.info("📱 Mobile: Generating network data key");
110110

111-
let network_id = self
111+
let network_public_key = self
112112
.key_manager
113113
.generate_network_data_key()
114114
.context("Failed to generate network data key")?;
115+
let network_id = compact_id(&network_public_key);
115116

116117
self.logger.info(format!(
117-
"📱 Mobile: Network data key generated: {network_id}"
118+
"📱 Mobile: Network data key generated: {} bytes",
119+
network_public_key.len()
118120
));
119121
Ok(network_id)
120122
}
121123

122124
/// Create network key message for node
123125
fn create_network_key_message(
124126
&self,
125-
network_id: &str,
127+
network_public_key: &[u8],
126128
node_public_key: &[u8],
127129
) -> Result<runar_keys::mobile::NetworkKeyMessage> {
128130
self.logger.info(format!(
129-
"📱 Mobile: Creating network key message for network: {network_id}"
131+
"📱 Mobile: Creating network key message for network: {} bytes",
132+
network_public_key.len()
130133
));
131134

132135
let network_key_message = self
133136
.key_manager
134-
.create_network_key_message(network_id, node_public_key)
137+
.create_network_key_message(network_public_key, node_public_key)
135138
.context("Failed to create network key message")?;
136139

137140
Ok(network_key_message)
@@ -326,8 +329,12 @@ async fn test_e2e_cli_initialization() -> Result<()> {
326329

327330
// Generate network key for the node
328331
let network_id = mobile.generate_network_data_key()?;
332+
// Get the network public key from the mobile key manager
333+
let network_public_key = mobile
334+
.key_manager
335+
.get_network_public_key_by_id(&network_id)?;
329336
let network_key_message = mobile.create_network_key_message(
330-
&network_id,
337+
&network_public_key,
331338
&parsed_setup_token.setup_token.node_agreement_public_key,
332339
)?;
333340
println!(" ✅ Network key generated:");

runar-ffi/include/runar_ffi.h

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -168,18 +168,20 @@ int32_t rn_keys_mobile_install_network_public_key(void *keys,
168168
struct RNAPIRnError *err);
169169

170170
int32_t rn_keys_mobile_generate_network_data_key(void *keys,
171-
char **out_str,
171+
uint8_t **out_pk,
172172
size_t *out_len,
173173
struct RNAPIRnError *err);
174174

175175
int32_t rn_keys_mobile_get_network_public_key(void *keys,
176-
const char *network_id,
176+
const uint8_t *network_public_key,
177+
size_t network_public_key_len,
177178
uint8_t **out_pk,
178179
size_t *out_len,
179180
struct RNAPIRnError *err);
180181

181182
int32_t rn_keys_mobile_create_network_key_message(void *keys,
182-
const char *network_id,
183+
const uint8_t *network_public_key,
184+
size_t network_public_key_len,
183185
const uint8_t *node_agreement_pk,
184186
size_t node_agreement_pk_len,
185187
uint8_t **out_msg_cbor,
@@ -248,7 +250,8 @@ int32_t rn_keys_encrypt_for_public_key(void *keys,
248250
int32_t rn_keys_encrypt_for_network(void *keys,
249251
const uint8_t *data,
250252
size_t data_len,
251-
const char *network_id,
253+
const uint8_t *network_public_key,
254+
size_t network_public_key_len,
252255
uint8_t **out_eed_cbor,
253256
size_t *out_len,
254257
struct RNAPIRnError *err);

runar-ffi/src/lib.rs

Lines changed: 47 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1571,7 +1571,7 @@ pub unsafe extern "C" fn rn_keys_mobile_install_network_public_key(
15711571
#[no_mangle]
15721572
pub unsafe extern "C" fn rn_keys_mobile_generate_network_data_key(
15731573
keys: *mut c_void,
1574-
out_str: *mut *mut c_char,
1574+
out_pk: *mut *mut u8,
15751575
out_len: *mut usize,
15761576
err: *mut RnError,
15771577
) -> i32 {
@@ -1580,8 +1580,12 @@ pub unsafe extern "C" fn rn_keys_mobile_generate_network_data_key(
15801580
set_error(err, RN_ERROR_NULL_ARGUMENT, "keys handle is null");
15811581
return RN_ERROR_NULL_ARGUMENT;
15821582
}
1583-
if out_str.is_null() {
1584-
set_error(err, RN_ERROR_NULL_ARGUMENT, "output string pointer is null");
1583+
if out_pk.is_null() {
1584+
set_error(
1585+
err,
1586+
RN_ERROR_NULL_ARGUMENT,
1587+
"output public key pointer is null",
1588+
);
15851589
return RN_ERROR_NULL_ARGUMENT;
15861590
}
15871591
if out_len.is_null() {
@@ -1610,8 +1614,8 @@ pub unsafe extern "C" fn rn_keys_mobile_generate_network_data_key(
16101614
};
16111615

16121616
match mobile_manager.generate_network_data_key() {
1613-
Ok(network_id) => {
1614-
if !alloc_string(out_str, out_len, &network_id) {
1617+
Ok(network_public_key) => {
1618+
if !alloc_bytes(out_pk, out_len, &network_public_key) {
16151619
set_error(err, RN_ERROR_MEMORY_ALLOCATION, "alloc failed");
16161620
RN_ERROR_MEMORY_ALLOCATION
16171621
} else {
@@ -1632,7 +1636,8 @@ pub unsafe extern "C" fn rn_keys_mobile_generate_network_data_key(
16321636
#[no_mangle]
16331637
pub unsafe extern "C" fn rn_keys_mobile_get_network_public_key(
16341638
keys: *mut c_void,
1635-
network_id: *const c_char,
1639+
network_public_key: *const u8,
1640+
network_public_key_len: usize,
16361641
out_pk: *mut *mut u8,
16371642
out_len: *mut usize,
16381643
err: *mut RnError,
@@ -1642,8 +1647,12 @@ pub unsafe extern "C" fn rn_keys_mobile_get_network_public_key(
16421647
set_error(err, RN_ERROR_NULL_ARGUMENT, "keys handle is null");
16431648
return RN_ERROR_NULL_ARGUMENT;
16441649
}
1645-
if network_id.is_null() {
1646-
set_error(err, RN_ERROR_NULL_ARGUMENT, "network_id pointer is null");
1650+
if network_public_key.is_null() {
1651+
set_error(
1652+
err,
1653+
RN_ERROR_NULL_ARGUMENT,
1654+
"network_public_key pointer is null",
1655+
);
16471656
return RN_ERROR_NULL_ARGUMENT;
16481657
}
16491658
if out_pk.is_null() {
@@ -1679,15 +1688,9 @@ pub unsafe extern "C" fn rn_keys_mobile_get_network_public_key(
16791688
}
16801689
};
16811690

1682-
let nid = match std::ffi::CStr::from_ptr(network_id).to_str() {
1683-
Ok(s) => s,
1684-
Err(_) => {
1685-
set_error(err, RN_ERROR_INVALID_UTF8, "invalid utf8 network_id");
1686-
return RN_ERROR_INVALID_UTF8;
1687-
}
1688-
};
1691+
let network_pk = std::slice::from_raw_parts(network_public_key, network_public_key_len);
16891692

1690-
match mobile_manager.get_network_public_key(nid) {
1693+
match mobile_manager.get_network_public_key(network_pk) {
16911694
Ok(pk) => {
16921695
if !alloc_bytes(out_pk, out_len, &pk) {
16931696
set_error(err, RN_ERROR_MEMORY_ALLOCATION, "alloc failed");
@@ -1710,24 +1713,25 @@ pub unsafe extern "C" fn rn_keys_mobile_get_network_public_key(
17101713
#[no_mangle]
17111714
pub unsafe extern "C" fn rn_keys_mobile_create_network_key_message(
17121715
keys: *mut c_void,
1713-
network_id: *const c_char,
1716+
network_public_key: *const u8,
1717+
network_public_key_len: usize,
17141718
node_agreement_pk: *const u8,
17151719
node_agreement_pk_len: usize,
17161720
out_msg_cbor: *mut *mut u8,
17171721
out_len: *mut usize,
17181722
err: *mut RnError,
17191723
) -> i32 {
17201724
let Some(inner) = with_keys_inner(keys) else {
1721-
set_error(err, 1, "keys handle is null");
1722-
return 1;
1725+
set_error(err, RN_ERROR_INVALID_HANDLE, "keys handle is null");
1726+
return RN_ERROR_INVALID_HANDLE;
17231727
};
1724-
if network_id.is_null()
1728+
if network_public_key.is_null()
17251729
|| node_agreement_pk.is_null()
17261730
|| out_msg_cbor.is_null()
17271731
|| out_len.is_null()
17281732
{
1729-
set_error(err, 1, "null argument");
1730-
return 1;
1733+
set_error(err, RN_ERROR_NULL_ARGUMENT, "null argument");
1734+
return RN_ERROR_NULL_ARGUMENT;
17311735
}
17321736
let manager = match validate_mobile_manager(inner) {
17331737
Ok(mgr) => mgr,
@@ -1745,16 +1749,9 @@ pub unsafe extern "C" fn rn_keys_mobile_create_network_key_message(
17451749
}
17461750
};
17471751

1748-
let nid = match std::ffi::CStr::from_ptr(network_id).to_str() {
1749-
Ok(s) => s,
1750-
Err(_) => {
1751-
set_error(err, RN_ERROR_INVALID_UTF8, "invalid utf8 network_id");
1752-
return RN_ERROR_INVALID_UTF8;
1753-
}
1754-
};
1755-
1756-
let pk = std::slice::from_raw_parts(node_agreement_pk, node_agreement_pk_len);
1757-
let msg = match mobile_manager.create_network_key_message(nid, pk) {
1752+
let network_pk = std::slice::from_raw_parts(network_public_key, network_public_key_len);
1753+
let node_pk = std::slice::from_raw_parts(node_agreement_pk, node_agreement_pk_len);
1754+
let msg = match mobile_manager.create_network_key_message(network_pk, node_pk) {
17581755
Ok(m) => m,
17591756
Err(e) => {
17601757
set_error(
@@ -1768,13 +1765,17 @@ pub unsafe extern "C" fn rn_keys_mobile_create_network_key_message(
17681765
let cbor = match serde_cbor::to_vec(&msg) {
17691766
Ok(v) => v,
17701767
Err(e) => {
1771-
set_error(err, 2, &format!("encode NetworkKeyMessage failed: {e}"));
1772-
return 2;
1768+
set_error(
1769+
err,
1770+
RN_ERROR_SERIALIZATION_FAILED,
1771+
&format!("encode NetworkKeyMessage failed: {e}"),
1772+
);
1773+
return RN_ERROR_SERIALIZATION_FAILED;
17731774
}
17741775
};
17751776
if !alloc_bytes(out_msg_cbor, out_len, &cbor) {
1776-
set_error(err, 3, "alloc failed");
1777-
return 3;
1777+
set_error(err, RN_ERROR_MEMORY_ALLOCATION, "alloc failed");
1778+
return RN_ERROR_MEMORY_ALLOCATION;
17781779
}
17791780
0
17801781
}
@@ -2302,7 +2303,8 @@ pub unsafe extern "C" fn rn_keys_encrypt_for_network(
23022303
keys: *mut c_void,
23032304
data: *const u8,
23042305
data_len: usize,
2305-
network_id: *const c_char,
2306+
network_public_key: *const u8,
2307+
network_public_key_len: usize,
23062308
out_eed_cbor: *mut *mut u8,
23072309
out_len: *mut usize,
23082310
err: *mut RnError,
@@ -2316,8 +2318,12 @@ pub unsafe extern "C" fn rn_keys_encrypt_for_network(
23162318
set_error(err, RN_ERROR_NULL_ARGUMENT, "data pointer is null");
23172319
return RN_ERROR_NULL_ARGUMENT;
23182320
}
2319-
if network_id.is_null() {
2320-
set_error(err, RN_ERROR_NULL_ARGUMENT, "network_id pointer is null");
2321+
if network_public_key.is_null() {
2322+
set_error(
2323+
err,
2324+
RN_ERROR_NULL_ARGUMENT,
2325+
"network_public_key pointer is null",
2326+
);
23212327
return RN_ERROR_NULL_ARGUMENT;
23222328
}
23232329
if out_eed_cbor.is_null() {
@@ -2338,13 +2344,7 @@ pub unsafe extern "C" fn rn_keys_encrypt_for_network(
23382344
return RN_ERROR_INVALID_HANDLE;
23392345
};
23402346
let data_slice = std::slice::from_raw_parts(data, data_len);
2341-
let nid = match std::ffi::CStr::from_ptr(network_id).to_str() {
2342-
Ok(s) => s,
2343-
Err(_) => {
2344-
set_error(err, RN_ERROR_INVALID_UTF8, "invalid utf8 network id");
2345-
return RN_ERROR_INVALID_UTF8;
2346-
}
2347-
};
2347+
let network_pk = std::slice::from_raw_parts(network_public_key, network_public_key_len);
23482348
let manager = match validate_node_manager(inner) {
23492349
Ok(mgr) => mgr,
23502350
Err(e) => {
@@ -2361,7 +2361,7 @@ pub unsafe extern "C" fn rn_keys_encrypt_for_network(
23612361
}
23622362
};
23632363

2364-
let eed = match node_manager.encrypt_for_network(data_slice, nid) {
2364+
let eed = match node_manager.encrypt_for_network(data_slice, network_pk) {
23652365
Ok(v) => v,
23662366
Err(e) => {
23672367
set_error(

runar-ffi/tests/ffi_keys_state_step_test.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,13 +60,13 @@ fn linux_keystore_minimal_network_key_crash_repro() {
6060
assert_eq!(rn_keys_mobile_initialize_user_root_key(keys, &mut err), 0);
6161

6262
// 8) rn_keys_mobile_generate_network_data_key (crash repro point)
63-
let mut nid_ptr: *mut c_char = std::ptr::null_mut();
63+
let mut nid_ptr: *mut u8 = std::ptr::null_mut();
6464
let mut nid_len: usize = 0;
6565
let rc =
6666
rn_keys_mobile_generate_network_data_key(keys, &mut nid_ptr, &mut nid_len, &mut err);
6767
assert_eq!(rc, 0, "generate_network_data_key failed: {}", last_err());
6868
if !nid_ptr.is_null() {
69-
rn_string_free(nid_ptr);
69+
rn_free(nid_ptr, nid_len);
7070
}
7171

7272
rn_keys_free(keys);

runar-ffi/tests/ffi_keys_state_test.rs

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@ fn linux_keystore_end_to_end_mobile_node_flow() {
235235
rn_free(st_ptr, st_len);
236236

237237
// Create a network and install on node
238-
let mut nid_c: *mut c_char = std::ptr::null_mut();
238+
let mut nid_c: *mut u8 = std::ptr::null_mut();
239239
let mut nid_len: usize = 0;
240240
assert_eq!(
241241
rn_keys_mobile_generate_network_data_key(
@@ -248,16 +248,16 @@ fn linux_keystore_end_to_end_mobile_node_flow() {
248248
"gen network key: {}",
249249
last_err()
250250
);
251-
let nid = cstr_to_string(nid_c, nid_len);
252-
rn_string_free(nid_c);
253-
let nid_cs = CString::new(nid.clone()).unwrap();
251+
let network_public_key = std::slice::from_raw_parts(nid_c as *const u8, nid_len).to_vec();
252+
rn_free(nid_c, nid_len);
254253

255254
let mut nkm_ptr: *mut u8 = std::ptr::null_mut();
256255
let mut nkm_len: usize = 0;
257256
assert_eq!(
258257
rn_keys_mobile_create_network_key_message(
259258
mobile_keys,
260-
nid_cs.as_ptr(),
259+
network_public_key.as_ptr(),
260+
network_public_key.len(),
261261
st_val.node_agreement_public_key.as_ptr(),
262262
st_val.node_agreement_public_key.len(),
263263
&mut nkm_ptr as *mut _,
@@ -506,17 +506,6 @@ fn test_ensure_symmetric_key() {
506506
}
507507
}
508508

509-
#[cfg(all(feature = "linux-keystore", target_os = "linux"))]
510-
fn cstr_to_string(ptr: *const c_char, len: usize) -> String {
511-
if ptr.is_null() || len == 0 {
512-
return String::new();
513-
}
514-
unsafe {
515-
let bytes = std::slice::from_raw_parts(ptr as *const u8, len);
516-
String::from_utf8_lossy(bytes).to_string()
517-
}
518-
}
519-
520509
#[cfg(all(feature = "linux-keystore", target_os = "linux"))]
521510
fn last_err() -> String {
522511
unsafe {

0 commit comments

Comments
 (0)