mauth-core 0.6.0

Generate and verify Medidata MAuth protocol signatures
Documentation
const RSA_PRIVATE_KEY_HEADER: &str = "-----BEGIN RSA PRIVATE KEY-----";
const RSA_PRIVATE_KEY_FOOTER: &str = "-----END RSA PRIVATE KEY-----";

pub fn normalize_rsa_private_key(key: impl Into<String>) -> String {
    let key = key.into();

    match key.contains('\n') {
        true => key,
        false => {
            let body = key
                .trim()
                .trim_start_matches(RSA_PRIVATE_KEY_HEADER)
                .trim_end_matches(RSA_PRIVATE_KEY_FOOTER)
                .trim();

            let body = match body.contains(' ') {
                true => body.replace(' ', "\n"),
                false => body
                    .chars()
                    .collect::<Vec<char>>()
                    .chunks(64)
                    .map(|chunk| chunk.iter().collect::<String>())
                    .collect::<Vec<String>>()
                    .join("\n"),
            };
            format!(
                "{}\n{}\n{}",
                RSA_PRIVATE_KEY_HEADER, body, RSA_PRIVATE_KEY_FOOTER
            )
        }
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn normalize_rsa_private_key_test() {
        let rsa_private_key = "-----BEGIN RSA PRIVATE KEY-----\nMIIBOgIBAAJBAKj34GkxFhD90vcNLYLInFEX6Ppy1tPf9Cnzj4p4WGeKLs1Pt8Qu\n/5OiPgoTdSy7bcF9IGpSE8ZgGKzgYQVZeN97YE00\n-----END RSA PRIVATE KEY-----";
        let rsa_private_key_with_space = rsa_private_key.replace('\n', " ");
        let rsa_private_key_without_newline = rsa_private_key.replace('\n', "");

        assert_eq!(normalize_rsa_private_key(rsa_private_key), rsa_private_key);
        assert_eq!(
            normalize_rsa_private_key(rsa_private_key_with_space),
            rsa_private_key
        );
        assert_eq!(
            normalize_rsa_private_key(rsa_private_key_without_newline),
            rsa_private_key
        );
    }
}