Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 34 additions & 7 deletions wrapper/rust/wolfssl-wolfcrypt/build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,11 @@ fn generate_fips_aliases() -> Result<()> {
if non_fips_re.is_match(&binding) {
// Add any new known names defined with both a _fips suffix and not
// here. Warn if any new ones are discovered.
if base_name != "wc_AesGcmEncrypt" {
let known_both = &[
"wc_AesGcmEncrypt",
"wc_AesCcmEncrypt",
];
if !known_both.contains(&base_name) {
println!("cargo:warning=Skipping FIPS symbols alias for {}", base_name);
}
} else {
Expand Down Expand Up @@ -166,18 +170,21 @@ fn read_file(path: String) -> Result<String> {
Ok(content)
}

fn check_cfg(binding: &str, function_name: &str, cfg_name: &str) {
fn check_cfg(binding: &str, function_name: &str, cfg_name: &str) -> bool {
let pattern = format!(r"\b{}(_fips)?\b", function_name);
let re = match Regex::new(&pattern) {
Ok(r) => r,
Err(e) => {
eprintln!("Error compiling regex '{}': {}", pattern, e);
return;
std::process::exit(1);
}
};
println!("cargo::rustc-check-cfg=cfg({})", cfg_name);
if re.is_match(binding) {
println!("cargo:rustc-cfg={}", cfg_name);
true
} else {
false
}
}

Expand All @@ -199,6 +206,7 @@ fn scan_cfg() -> Result<()> {
check_cfg(&binding, "wc_AesOfbEncrypt", "aes_ofb");
check_cfg(&binding, "wc_AesXtsInit", "aes_xts");
check_cfg(&binding, "wc_AesXtsEncryptInit", "aes_xts_stream");
check_cfg(&binding, "WC_AES_BLOCK_SIZE", "aes_wc_block_size");

/* blake2 */
check_cfg(&binding, "wc_InitBlake2b", "blake2b");
Expand Down Expand Up @@ -234,10 +242,19 @@ fn scan_cfg() -> Result<()> {
check_cfg(&binding, "wc_ecc_verify_hash", "ecc_verify");
check_cfg(&binding, "wc_ecc_export_x963", "ecc_export");
check_cfg(&binding, "wc_ecc_import_x963", "ecc_import");
check_cfg(&binding, "ecc_curve_ids_ECC_X25519", "ecc_curve_25519");
check_cfg(&binding, "ecc_curve_ids_ECC_X448", "ecc_curve_448");
check_cfg(&binding, "ecc_curve_ids_ECC_SAKKE_1", "ecc_curve_sakke");
check_cfg(&binding, "ecc_curve_ids_ECC_CURVE_CUSTOM", "ecc_custom_curves");
if check_cfg(&binding, "ecc_curve_ids_ECC_CURVE_INVALID", "ecc_curve_ids") {
check_cfg(&binding, "ecc_curve_ids_ECC_SM2P256V1", "ecc_curve_sm2p256v1");
check_cfg(&binding, "ecc_curve_ids_ECC_X25519", "ecc_curve_25519");
check_cfg(&binding, "ecc_curve_ids_ECC_X448", "ecc_curve_448");
check_cfg(&binding, "ecc_curve_ids_ECC_SAKKE_1", "ecc_curve_sakke");
check_cfg(&binding, "ecc_curve_ids_ECC_CURVE_CUSTOM", "ecc_custom_curves");
} else {
check_cfg(&binding, "ecc_curve_id_ECC_SM2P256V1", "ecc_curve_sm2p256v1");
check_cfg(&binding, "ecc_curve_id_ECC_X25519", "ecc_curve_25519");
check_cfg(&binding, "ecc_curve_id_ECC_X448", "ecc_curve_448");
check_cfg(&binding, "ecc_curve_id_ECC_SAKKE_1", "ecc_curve_sakke");
check_cfg(&binding, "ecc_curve_id_ECC_CURVE_CUSTOM", "ecc_custom_curves");
}

/* ed25519 */
check_cfg(&binding, "wc_ed25519_init", "ed25519");
Expand All @@ -263,6 +280,7 @@ fn scan_cfg() -> Result<()> {

/* hmac */
check_cfg(&binding, "wc_HmacSetKey", "hmac");
check_cfg(&binding, "wc_HmacSetKey_ex", "hmac_setkey_ex");

/* kdf */
check_cfg(&binding, "wc_PBKDF2", "kdf_pbkdf2");
Expand All @@ -283,6 +301,15 @@ fn scan_cfg() -> Result<()> {
check_cfg(&binding, "wc_RsaDirect", "rsa_direct");
check_cfg(&binding, "wc_MakeRsaKey", "rsa_keygen");
check_cfg(&binding, "wc_RsaPSS_Sign", "rsa_pss");
check_cfg(&binding, "wc_RsaSetRNG", "rsa_setrng");
check_cfg(&binding, "WC_MGF1SHA512_224", "rsa_mgf1sha512_224");
check_cfg(&binding, "WC_MGF1SHA512_256", "rsa_mgf1sha512_256");
// Detect whether wc_RsaExportKey takes a const first arg (new API) or non-const (old API)
let re = Regex::new(r"pub fn wc_RsaExportKey(_fips)?\s*\(\s*\w+\s*:\s*\*\s*const").unwrap();
println!("cargo::rustc-check-cfg=cfg(rsa_const_api)");
if re.is_match(&binding) {
println!("cargo:rustc-cfg=rsa_const_api");
}

/* sha */
check_cfg(&binding, "wc_InitSha", "sha");
Expand Down
13 changes: 9 additions & 4 deletions wrapper/rust/wolfssl-wolfcrypt/src/aes.rs
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,11 @@ Encryption Standard (AES) functionality.
use crate::sys;
use std::mem::{size_of_val, MaybeUninit};

#[cfg(aes_wc_block_size)]
pub const AES_BLOCK_SIZE: usize = sys::WC_AES_BLOCK_SIZE as usize;
#[cfg(not(aes_wc_block_size))]
pub const AES_BLOCK_SIZE: usize = sys::AES_BLOCK_SIZE as usize;

/// AES Cipher Block Chaining (CBC) mode.
///
/// # Example
Expand Down Expand Up @@ -91,7 +96,7 @@ impl CBC {

fn init(&mut self, key: &[u8], iv: &[u8], dir: i32) -> Result<(), i32> {
let key_size = key.len() as u32;
if iv.len() as u32 != sys::WC_AES_BLOCK_SIZE {
if iv.len() != AES_BLOCK_SIZE {
return Err(sys::wolfCrypt_ErrorCodes_BAD_FUNC_ARG);
}
let rc = unsafe {
Expand Down Expand Up @@ -506,7 +511,7 @@ impl CFB {
/// library return code on failure.
pub fn init(&mut self, key: &[u8], iv: &[u8]) -> Result<(), i32> {
let key_size = key.len() as u32;
if iv.len() as u32 != sys::WC_AES_BLOCK_SIZE {
if iv.len() != AES_BLOCK_SIZE {
return Err(sys::wolfCrypt_ErrorCodes_BAD_FUNC_ARG);
}
let rc = unsafe {
Expand Down Expand Up @@ -812,7 +817,7 @@ impl CTR {
/// library return code on failure.
pub fn init(&mut self, key: &[u8], iv: &[u8]) -> Result<(), i32> {
let key_size = key.len() as u32;
if iv.len() as u32 != sys::WC_AES_BLOCK_SIZE {
if iv.len() != AES_BLOCK_SIZE {
return Err(sys::wolfCrypt_ErrorCodes_BAD_FUNC_ARG);
}
let rc = unsafe {
Expand Down Expand Up @@ -1769,7 +1774,7 @@ impl OFB {
/// library return code on failure.
pub fn init(&mut self, key: &[u8], iv: &[u8]) -> Result<(), i32> {
let key_size = key.len() as u32;
if iv.len() as u32 != sys::WC_AES_BLOCK_SIZE {
if iv.len() != AES_BLOCK_SIZE {
return Err(sys::wolfCrypt_ErrorCodes_BAD_FUNC_ARG);
}
let rc = unsafe {
Expand Down
48 changes: 48 additions & 0 deletions wrapper/rust/wolfssl-wolfcrypt/src/ecc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -290,6 +290,7 @@ pub struct ECC {
wc_ecc_key: sys::ecc_key,
}

#[cfg(ecc_curve_ids)]
impl ECC {
pub const CURVE_INVALID: i32 = sys::ecc_curve_ids_ECC_CURVE_INVALID;
pub const CURVE_DEF: i32 = sys::ecc_curve_ids_ECC_CURVE_DEF;
Expand Down Expand Up @@ -320,6 +321,7 @@ impl ECC {
pub const BRAINPOOLP320R1: i32 = sys::ecc_curve_ids_ECC_BRAINPOOLP320R1;
pub const BRAINPOOLP384R1: i32 = sys::ecc_curve_ids_ECC_BRAINPOOLP384R1;
pub const BRAINPOOLP512R1: i32 = sys::ecc_curve_ids_ECC_BRAINPOOLP512R1;
#[cfg(ecc_curve_sm2p256v1)]
pub const SM2P256V1: i32 = sys::ecc_curve_ids_ECC_SM2P256V1;
#[cfg(ecc_curve_25519)]
pub const X25519: i32 = sys::ecc_curve_ids_ECC_X25519;
Expand All @@ -330,7 +332,53 @@ impl ECC {
#[cfg(ecc_custom_curves)]
pub const CURVE_CUSTOM: i32 = sys::ecc_curve_ids_ECC_CURVE_CUSTOM;
pub const CURVE_MAX: i32 = sys::ecc_curve_ids_ECC_CURVE_MAX;
}

#[cfg(not(ecc_curve_ids))]
impl ECC {
pub const CURVE_INVALID: i32 = sys::ecc_curve_id_ECC_CURVE_INVALID;
pub const CURVE_DEF: i32 = sys::ecc_curve_id_ECC_CURVE_DEF;
pub const SECP192R1: i32 = sys::ecc_curve_id_ECC_SECP192R1;
pub const PRIME192V2: i32 = sys::ecc_curve_id_ECC_PRIME192V2;
pub const PRIME192V3: i32 = sys::ecc_curve_id_ECC_PRIME192V3;
pub const PRIME239V1: i32 = sys::ecc_curve_id_ECC_PRIME239V1;
pub const PRIME239V2: i32 = sys::ecc_curve_id_ECC_PRIME239V2;
pub const PRIME239V3: i32 = sys::ecc_curve_id_ECC_PRIME239V3;
pub const SECP256R1: i32 = sys::ecc_curve_id_ECC_SECP256R1;
pub const SECP112R1: i32 = sys::ecc_curve_id_ECC_SECP112R1;
pub const SECP112R2: i32 = sys::ecc_curve_id_ECC_SECP112R2;
pub const SECP128R1: i32 = sys::ecc_curve_id_ECC_SECP128R1;
pub const SECP128R2: i32 = sys::ecc_curve_id_ECC_SECP128R2;
pub const SECP160R1: i32 = sys::ecc_curve_id_ECC_SECP160R1;
pub const SECP160R2: i32 = sys::ecc_curve_id_ECC_SECP160R2;
pub const SECP224R1: i32 = sys::ecc_curve_id_ECC_SECP224R1;
pub const SECP384R1: i32 = sys::ecc_curve_id_ECC_SECP384R1;
pub const SECP521R1: i32 = sys::ecc_curve_id_ECC_SECP521R1;
pub const SECP160K1: i32 = sys::ecc_curve_id_ECC_SECP160K1;
pub const SECP192K1: i32 = sys::ecc_curve_id_ECC_SECP192K1;
pub const SECP224K1: i32 = sys::ecc_curve_id_ECC_SECP224K1;
pub const SECP256K1: i32 = sys::ecc_curve_id_ECC_SECP256K1;
pub const BRAINPOOLP160R1: i32 = sys::ecc_curve_id_ECC_BRAINPOOLP160R1;
pub const BRAINPOOLP192R1: i32 = sys::ecc_curve_id_ECC_BRAINPOOLP192R1;
pub const BRAINPOOLP224R1: i32 = sys::ecc_curve_id_ECC_BRAINPOOLP224R1;
pub const BRAINPOOLP256R1: i32 = sys::ecc_curve_id_ECC_BRAINPOOLP256R1;
pub const BRAINPOOLP320R1: i32 = sys::ecc_curve_id_ECC_BRAINPOOLP320R1;
pub const BRAINPOOLP384R1: i32 = sys::ecc_curve_id_ECC_BRAINPOOLP384R1;
pub const BRAINPOOLP512R1: i32 = sys::ecc_curve_id_ECC_BRAINPOOLP512R1;
#[cfg(ecc_curve_sm2p256v1)]
pub const SM2P256V1: i32 = sys::ecc_curve_id_ECC_SM2P256V1;
#[cfg(ecc_curve_25519)]
pub const X25519: i32 = sys::ecc_curve_id_ECC_X25519;
#[cfg(ecc_curve_448)]
pub const X448: i32 = sys::ecc_curve_id_ECC_X448;
#[cfg(ecc_curve_sakke)]
pub const SAKKE_1: i32 = sys::ecc_curve_id_ECC_SAKKE_1;
#[cfg(ecc_custom_curves)]
pub const CURVE_CUSTOM: i32 = sys::ecc_curve_id_ECC_CURVE_CUSTOM;
pub const CURVE_MAX: i32 = sys::ecc_curve_id_ECC_CURVE_MAX;
}

impl ECC {
pub const FLAG_NONE: i32 = sys::WC_ECC_FLAG_NONE as i32;
pub const FLAG_COFACTOR: i32 = sys::WC_ECC_FLAG_COFACTOR as i32;
pub const FLAG_DEC_SIGN: i32 = sys::WC_ECC_FLAG_DEC_SIGN as i32;
Expand Down
4 changes: 4 additions & 0 deletions wrapper/rust/wolfssl-wolfcrypt/src/hmac.rs
Original file line number Diff line number Diff line change
Expand Up @@ -156,10 +156,12 @@ impl HMAC {
/// # Example
///
/// ```rust
/// #![cfg(hmac_setkey_ex)]
/// use wolfssl_wolfcrypt::hmac::HMAC;
/// let key = [0x42u8; 3];
/// let mut hmac = HMAC::new_allow_short_key(HMAC::TYPE_SHA256, &key).expect("Error with new_allow_short_key()");
/// ```
#[cfg(hmac_setkey_ex)]
pub fn new_allow_short_key(typ: i32, key: &[u8]) -> Result<Self, i32> {
Self::new_allow_short_key_ex(typ, key, None, None)
}
Expand All @@ -182,10 +184,12 @@ impl HMAC {
/// # Example
///
/// ```rust
/// #![cfg(hmac_setkey_ex)]
/// use wolfssl_wolfcrypt::hmac::HMAC;
/// let key = [0x42u8; 3];
/// let mut hmac = HMAC::new_allow_short_key_ex(HMAC::TYPE_SHA256, &key, None, None).expect("Error with new_allow_short_key_ex()");
/// ```
#[cfg(hmac_setkey_ex)]
pub fn new_allow_short_key_ex(typ: i32, key: &[u8], heap: Option<*mut std::os::raw::c_void>, dev_id: Option<i32>) -> Result<Self, i32> {
let key_size = key.len() as u32;
let mut wc_hmac: MaybeUninit<sys::Hmac> = MaybeUninit::uninit();
Expand Down
30 changes: 20 additions & 10 deletions wrapper/rust/wolfssl-wolfcrypt/src/rsa.rs
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,9 @@ impl RSA {
pub const MGF1SHA256 : i32 = sys::WC_MGF1SHA256 as i32;
pub const MGF1SHA384 : i32 = sys::WC_MGF1SHA384 as i32;
pub const MGF1SHA512 : i32 = sys::WC_MGF1SHA512 as i32;
#[cfg(rsa_mgf1sha512_224)]
pub const MGF1SHA512_224 : i32 = sys::WC_MGF1SHA512_224 as i32;
#[cfg(rsa_mgf1sha512_256)]
pub const MGF1SHA512_256 : i32 = sys::WC_MGF1SHA512_256 as i32;

// Type constants used for `rsa_direct()`.
Expand Down Expand Up @@ -525,8 +527,12 @@ impl RSA {
*d_size = d.len() as u32;
*p_size = p.len() as u32;
*q_size = q.len() as u32;
#[cfg(rsa_const_api)]
let key_ptr = &self.wc_rsakey;
#[cfg(not(rsa_const_api))]
let key_ptr = &mut self.wc_rsakey;
let rc = unsafe {
sys::wc_RsaExportKey(&self.wc_rsakey,
sys::wc_RsaExportKey(key_ptr,
e.as_mut_ptr(), e_size,
n.as_mut_ptr(), n_size,
d.as_mut_ptr(), d_size,
Expand Down Expand Up @@ -575,8 +581,12 @@ impl RSA {
n: &mut [u8], n_size: &mut u32) -> Result<(), i32> {
*e_size = e.len() as u32;
*n_size = n.len() as u32;
#[cfg(rsa_const_api)]
let key = &self.wc_rsakey;
#[cfg(not(rsa_const_api))]
let key = &mut self.wc_rsakey;
let rc = unsafe {
sys::wc_RsaFlattenPublicKey(&self.wc_rsakey,
sys::wc_RsaFlattenPublicKey(key,
e.as_mut_ptr(), e_size, n.as_mut_ptr(), n_size)
};
if rc != 0 {
Expand Down Expand Up @@ -843,7 +853,7 @@ impl RSA {
/// # Example
///
/// ```rust
/// #[cfg(all(random, rsa_pss))]
/// #[cfg(all(random, rsa_pss, rsa_const_api))]
/// {
/// use std::fs;
/// use wolfssl_wolfcrypt::random::RNG;
Expand Down Expand Up @@ -873,7 +883,7 @@ impl RSA {
/// rsa.pss_verify_check(signature, &mut verify_out, msg, RSA::HASH_TYPE_SHA256, RSA::MGF1SHA256).expect("Error with pss_verify_check()");
/// }
/// ```
#[cfg(rsa_pss)]
#[cfg(all(rsa_pss, rsa_const_api))]
pub fn pss_check_padding(&mut self, din: &[u8], sig: &[u8], hash_algo: u32) -> Result<(), i32> {
let din_size = din.len() as u32;
let sig_size = sig.len() as u32;
Expand Down Expand Up @@ -909,7 +919,7 @@ impl RSA {
/// # Example
///
/// ```rust
/// #[cfg(all(random, rsa_pss))]
/// #[cfg(all(random, rsa_pss, rsa_const_api))]
/// {
/// use std::fs;
/// use wolfssl_wolfcrypt::random::RNG;
Expand Down Expand Up @@ -939,7 +949,7 @@ impl RSA {
/// rsa.pss_verify_check(signature, &mut verify_out, msg, RSA::HASH_TYPE_SHA256, RSA::MGF1SHA256).expect("Error with pss_verify_check()");
/// }
/// ```
#[cfg(rsa_pss)]
#[cfg(all(rsa_pss, rsa_const_api))]
pub fn pss_verify(&mut self, din: &[u8], dout: &mut [u8], hash_algo: u32, mgf: i32) -> Result<usize, i32> {
let din_size = din.len() as u32;
let dout_size = dout.len() as u32;
Expand Down Expand Up @@ -980,7 +990,7 @@ impl RSA {
/// # Example
///
/// ```rust
/// #[cfg(all(random, rsa_pss))]
/// #[cfg(all(random, rsa_pss, rsa_const_api))]
/// {
/// use std::fs;
/// use wolfssl_wolfcrypt::random::RNG;
Expand Down Expand Up @@ -1010,7 +1020,7 @@ impl RSA {
/// rsa.pss_verify_check(signature, &mut verify_out, msg, RSA::HASH_TYPE_SHA256, RSA::MGF1SHA256).expect("Error with pss_verify_check()");
/// }
/// ```
#[cfg(rsa_pss)]
#[cfg(all(rsa_pss, rsa_const_api))]
pub fn pss_verify_check(&mut self, din: &[u8], dout: &mut [u8], digest: &[u8], hash_algo: u32, mgf: i32) -> Result<usize, i32> {
let din_size = din.len() as u32;
let dout_size = dout.len() as u32;
Expand Down Expand Up @@ -1050,7 +1060,7 @@ impl RSA {
/// # Example
///
/// ```rust
/// #[cfg(rsa_direct)]
/// #[cfg(all(rsa_direct, rsa_const_api))]
/// {
/// use std::fs;
/// use wolfssl_wolfcrypt::random::RNG;
Expand All @@ -1073,7 +1083,7 @@ impl RSA {
/// assert_eq!(plain_out, plain);
/// }
/// ```
#[cfg(rsa_direct)]
#[cfg(all(rsa_direct, rsa_const_api))]
pub fn rsa_direct(&mut self, din: &[u8], dout: &mut [u8], typ: i32, rng: &mut RNG) -> Result<usize, i32> {
let din_size = din.len() as u32;
let mut dout_size = dout.len() as u32;
Expand Down
5 changes: 5 additions & 0 deletions wrapper/rust/wolfssl-wolfcrypt/src/sys.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,8 @@ include!(concat!(env!("OUT_DIR"), "/bindings.rs"));

/* Include generated FIPS symbol aliases. */
include!(concat!(env!("OUT_DIR"), "/fips_aliases.rs"));

#[cfg(not(rsa_setrng))]
unsafe extern "C" {
pub fn wc_RsaSetRNG(key: *mut RsaKey, rng: *mut WC_RNG) -> core::ffi::c_int;
}
7 changes: 7 additions & 0 deletions wrapper/rust/wolfssl-wolfcrypt/tests/test_hmac.rs
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,13 @@ fn test_hmac_sha256() {
];

for i in 0..keys.len() {
#[cfg(not(hmac_setkey_ex))]
if keys[i].len() < 14 {
continue;
}
#[cfg(not(hmac_setkey_ex))]
let mut hmac = HMAC::new(HMAC::TYPE_SHA256, keys[i]).expect("Error with new()");
#[cfg(hmac_setkey_ex)]
let mut hmac =
if keys[i].len() < 14 {
HMAC::new_allow_short_key(HMAC::TYPE_SHA256, keys[i]).expect("Error with new_allow_short_key()")
Expand Down