use cosmian_cover_crypt::{
abe_policy::{AccessPolicy, Policy},
Covercrypt, MasterPublicKey, MasterSecretKey, UserSecretKey,
};
use cosmian_crypto_core::bytes_ser_de::Serializable;
use cosmian_ffi_utils::{ffi_read_bytes, ffi_read_string, ffi_unwrap, ffi_write_bytes, ErrorCode};
#[no_mangle]
pub unsafe extern "C" fn h_generate_master_keys(
msk_ptr: *mut i8,
msk_len: *mut i32,
mpk_ptr: *mut i8,
mpk_len: *mut i32,
policy_ptr: *const i8,
policy_len: i32,
) -> i32 {
let policy_bytes = ffi_read_bytes!("policy", policy_ptr, policy_len);
let policy: Policy = ffi_unwrap!(
Policy::try_from(policy_bytes),
"error deserializing policy",
ErrorCode::Serialization
);
let (msk, mpk) = ffi_unwrap!(
Covercrypt::default().generate_master_keys(&policy),
"error generating master keys",
ErrorCode::Covercrypt
);
let msk_bytes = ffi_unwrap!(
msk.serialize(),
"error serializing master secret key",
ErrorCode::Serialization
);
let mpk_bytes = ffi_unwrap!(
mpk.serialize(),
"error serializing public key",
ErrorCode::Serialization
);
ffi_write_bytes!(
"master secret key",
&msk_bytes,
msk_ptr,
msk_len,
"public key",
&mpk_bytes,
mpk_ptr,
mpk_len
);
}
#[no_mangle]
pub unsafe extern "C" fn h_generate_user_secret_key(
usk_ptr: *mut i8,
usk_len: *mut i32,
msk_ptr: *const i8,
msk_len: i32,
user_policy_ptr: *const i8,
policy_ptr: *const i8,
policy_len: i32,
) -> i32 {
let msk_bytes = ffi_read_bytes!("master secret key", msk_ptr, msk_len);
let msk = ffi_unwrap!(
MasterSecretKey::deserialize(msk_bytes),
"error deserializing master secret key",
ErrorCode::Serialization
);
let policy_bytes = ffi_read_bytes!("policy", policy_ptr, policy_len);
let policy = ffi_unwrap!(
Policy::parse_and_convert(policy_bytes),
"error deserializing policy",
ErrorCode::Serialization
);
let user_policy_string = ffi_read_string!("access policy", user_policy_ptr);
let user_policy = ffi_unwrap!(
AccessPolicy::from_boolean_expression(user_policy_string.as_str()),
"error parsing user policy",
ErrorCode::Serialization
);
let usk = ffi_unwrap!(
Covercrypt::default().generate_user_secret_key(&msk, &user_policy, &policy),
"error generating user secret key",
ErrorCode::Covercrypt
);
let usk_bytes = ffi_unwrap!(
usk.serialize(),
"error serializing user secret key",
ErrorCode::Serialization
);
ffi_write_bytes!("user secret key", &usk_bytes, usk_ptr, usk_len);
}
#[no_mangle]
pub unsafe extern "C" fn h_update_master_keys(
updated_msk_ptr: *mut i8,
updated_msk_len: *mut i32,
updated_mpk_ptr: *mut i8,
updated_mpk_len: *mut i32,
current_msk_ptr: *const i8,
current_msk_len: i32,
current_mpk_ptr: *const i8,
current_mpk_len: i32,
policy_ptr: *const i8,
policy_len: i32,
) -> i32 {
let msk_bytes = ffi_read_bytes!(
"current master secret key",
current_msk_ptr,
current_msk_len
);
let mut msk = ffi_unwrap!(
MasterSecretKey::deserialize(msk_bytes),
"error deserializing master secret key",
ErrorCode::Serialization
);
let mpk_bytes = ffi_read_bytes!("current public key", current_mpk_ptr, current_mpk_len);
let mut mpk = ffi_unwrap!(
MasterPublicKey::deserialize(mpk_bytes),
"error deserializing public key",
ErrorCode::Serialization
);
let policy_bytes = ffi_read_bytes!("policy", policy_ptr, policy_len);
let policy = ffi_unwrap!(
Policy::parse_and_convert(policy_bytes),
"error deserializing policy",
ErrorCode::Serialization
);
ffi_unwrap!(
Covercrypt::default().update_master_keys(&policy, &mut msk, &mut mpk),
"error updating master keys",
ErrorCode::Covercrypt
);
let msk_bytes = ffi_unwrap!(
msk.serialize(),
"error serializing master secret key",
ErrorCode::Serialization
);
let mpk_bytes = ffi_unwrap!(
mpk.serialize(),
"error serializing public key",
ErrorCode::Serialization
);
ffi_write_bytes!(
"updated master secret key",
&msk_bytes,
updated_msk_ptr,
updated_msk_len,
"updated public key",
&mpk_bytes,
updated_mpk_ptr,
updated_mpk_len
);
}
#[no_mangle]
pub unsafe extern "C" fn h_rekey_master_keys(
updated_msk_ptr: *mut i8,
updated_msk_len: *mut i32,
updated_mpk_ptr: *mut i8,
updated_mpk_len: *mut i32,
current_msk_ptr: *const i8,
current_msk_len: i32,
current_mpk_ptr: *const i8,
current_mpk_len: i32,
access_policy_ptr: *const i8,
policy_ptr: *const i8,
policy_len: i32,
) -> i32 {
let msk_bytes = ffi_read_bytes!(
"current master secret key",
current_msk_ptr,
current_msk_len
);
let mut msk = ffi_unwrap!(
MasterSecretKey::deserialize(msk_bytes),
"error deserializing master secret key",
ErrorCode::Serialization
);
let mpk_bytes = ffi_read_bytes!("current public key", current_mpk_ptr, current_mpk_len);
let mut mpk = ffi_unwrap!(
MasterPublicKey::deserialize(mpk_bytes),
"error deserializing public key",
ErrorCode::Serialization
);
let access_policy_string = ffi_read_string!("access policy", access_policy_ptr);
let access_policy = ffi_unwrap!(
AccessPolicy::from_boolean_expression(&access_policy_string),
"error parsing user policy",
ErrorCode::Serialization
);
let policy_bytes = ffi_read_bytes!("policy", policy_ptr, policy_len);
let policy = ffi_unwrap!(
Policy::parse_and_convert(policy_bytes),
"error deserializing policy",
ErrorCode::Serialization
);
ffi_unwrap!(
Covercrypt::default().rekey_master_keys(&access_policy, &policy, &mut msk, &mut mpk),
"error rekeying master keys",
ErrorCode::Covercrypt
);
let msk_bytes = ffi_unwrap!(
msk.serialize(),
"error serializing master secret key",
ErrorCode::Serialization
);
let mpk_bytes = ffi_unwrap!(
mpk.serialize(),
"error serializing public key",
ErrorCode::Serialization
);
ffi_write_bytes!(
"updated master secret key",
&msk_bytes,
updated_msk_ptr,
updated_msk_len,
"updated public key",
&mpk_bytes,
updated_mpk_ptr,
updated_mpk_len
);
}
#[no_mangle]
pub unsafe extern "C" fn h_prune_master_secret_key(
updated_msk_ptr: *mut i8,
updated_msk_len: *mut i32,
current_msk_ptr: *const i8,
current_msk_len: i32,
access_policy_ptr: *const i8,
policy_ptr: *const i8,
policy_len: i32,
) -> i32 {
let msk_bytes = ffi_read_bytes!(
"current master secret key",
current_msk_ptr,
current_msk_len
);
let mut msk = ffi_unwrap!(
MasterSecretKey::deserialize(msk_bytes),
"error deserializing master secret key",
ErrorCode::Serialization
);
let access_policy_string = ffi_read_string!("access policy", access_policy_ptr);
let access_policy = ffi_unwrap!(
AccessPolicy::from_boolean_expression(&access_policy_string),
"error parsing user policy",
ErrorCode::Serialization
);
let policy_bytes = ffi_read_bytes!("policy", policy_ptr, policy_len);
let policy = ffi_unwrap!(
Policy::parse_and_convert(policy_bytes),
"error deserializing policy",
ErrorCode::Serialization
);
ffi_unwrap!(
Covercrypt::default().prune_master_secret_key(&access_policy, &policy, &mut msk),
"error pruning master secret key",
ErrorCode::Covercrypt
);
let msk_bytes = ffi_unwrap!(
msk.serialize(),
"error serializing master secret key",
ErrorCode::Serialization
);
ffi_write_bytes!(
"updated master secret key",
&msk_bytes,
updated_msk_ptr,
updated_msk_len,
);
}
#[no_mangle]
pub unsafe extern "C" fn h_refresh_user_secret_key(
updated_usk_ptr: *mut i8,
updated_usk_len: *mut i32,
msk_ptr: *const i8,
msk_len: i32,
current_usk_ptr: *const i8,
current_usk_len: i32,
preserve_old_partitions_access: i32,
) -> i32 {
let msk_bytes = ffi_read_bytes!("master secret key", msk_ptr, msk_len);
let msk = ffi_unwrap!(
MasterSecretKey::deserialize(msk_bytes),
"error deserializing master secret key",
ErrorCode::Serialization
);
let usk_bytes = ffi_read_bytes!("current user secret key", current_usk_ptr, current_usk_len);
let mut usk = ffi_unwrap!(
UserSecretKey::deserialize(usk_bytes),
"error deserializing user secret key",
ErrorCode::Serialization
);
ffi_unwrap!(
Covercrypt::default().refresh_user_secret_key(
&mut usk,
&msk,
preserve_old_partitions_access != 0
),
"error refreshing user secret key",
ErrorCode::Covercrypt
);
let usk_bytes = ffi_unwrap!(
usk.serialize(),
"error serializing user secret key",
ErrorCode::Serialization
);
ffi_write_bytes!(
"updated user secret key",
&usk_bytes,
updated_usk_ptr,
updated_usk_len
);
}