Skip to content
Open
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
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,6 @@ Cargo.lock
/target/

# Editor and IDE environments
.vscode/
.vscode/
/target-wsl
/vcpkg_installed
33 changes: 18 additions & 15 deletions Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,22 +1,25 @@
[package]
name = "xmlsec"
version = "0.2.3"
authors = ["Leonhard Weber <leonhard.weber@voipir.cl>"]
edition = "2021"
readme = "README.md"
license = "MIT"
description = "Wrapper for xmlsec1 library"
homepage = "https://github.com/voipir/rust-xmlsec"
repository = "https://github.com/voipir/rust-xmlsec"
keywords = ["xml", "xmlsec", "dsig"]
name = "xmlsec"
version = "0.2.3"
authors = ["Leonhard Weber <leonhard.weber@voipir.cl>"]
edition = "2021"
readme = "README.md"
license = "MIT"
description = "Wrapper for xmlsec1 library"
homepage = "https://github.com/voipir/rust-xmlsec"
repository = "https://github.com/voipir/rust-xmlsec"
keywords = ["xml", "xmlsec", "dsig"]

build = "bindings.rs"

[dependencies]
libc = {version = "^0.2"}
libxml = {version = "^0.3"}
lazy_static = {version = "^1.4"}
libc = { version = "^0.2" }
libxml = { version = "^0.3" }
lazy_static = { version = "^1.4" }

[build-dependencies]
pkg-config = {version = "^0.3"}
bindgen = {version = "^0.65"}
pkg-config = { version = "^0.3" }
bindgen = { version = "^0.71" }

[target.'cfg(windows)'.build-dependencies]
vcpkg = { version = "0.2", git = "https://github.com/mcgoo/vcpkg-rs.git", branch = "master" }
117 changes: 63 additions & 54 deletions bindings.rs
Original file line number Diff line number Diff line change
@@ -1,85 +1,94 @@
//!
//! XmlSec Bindings Generation
//!
use bindgen::Builder as BindgenBuilder;
use bindgen::Builder as BindgenBuilder;
use bindgen::Formatter as BindgenFormatter;

use pkg_config::Config as PkgConfig;

use std::collections::HashMap;
use std::env;
use std::path::PathBuf;
use std::process::Command;


const BINDINGS: &str = "bindings.rs";

fn main() {
let dependencies = locate_and_link_dependencies();

fn main()
{
println!("cargo:rustc-link-lib=xmlsec1-openssl"); // -lxmlsec1-openssl
println!("cargo:rustc-link-lib=xmlsec1"); // -lxmlsec1
println!("cargo:rustc-link-lib=xml2"); // -lxml2
println!("cargo:rustc-link-lib=ssl"); // -lssl
println!("cargo:rustc-link-lib=crypto"); // -lcrypto

let path_out = PathBuf::from(env::var("OUT_DIR").unwrap());
let path_out = PathBuf::from(env::var("OUT_DIR").unwrap());
let path_bindings = path_out.join(BINDINGS);

if !path_bindings.exists()
{
PkgConfig::new()
.probe("xmlsec1")
.expect("Could not find xmlsec1 using pkg-config");

if !path_bindings.exists() {
let bindbuild = BindgenBuilder::default()
.header("bindings.h")
.clang_args(fetch_xmlsec_config_flags())
.clang_args(fetch_xmlsec_config_libs())
.allowlist_type("xml.*")
.allowlist_function("xml.*")
.allowlist_var("xml.*")
.clang_args(dependencies.clang_args())
.layout_tests(true)
.formatter(BindgenFormatter::default())
.generate_comments(true);

let bindings = bindbuild.generate()
.expect("Unable to generate bindings");
let bindings = bindbuild.generate().expect("Unable to generate bindings");

bindings.write_to_file(path_bindings)
bindings
.write_to_file(path_bindings)
.expect("Couldn't write bindings!");
}
}


fn fetch_xmlsec_config_flags() -> Vec<String>
{
let out = Command::new("xmlsec1-config")
.arg("--cflags")
.output()
.expect("Failed to get --cflags from xmlsec1-config. Is xmlsec1 installed?")
.stdout;

args_from_output(out)
struct LocatedDependencies {
include_paths: Vec<PathBuf>,
defines: HashMap<String, Option<String>>,
}


fn fetch_xmlsec_config_libs() -> Vec<String>
{
let out = Command::new("xmlsec1-config")
.arg("--libs")
.output()
.expect("Failed to get --libs from xmlsec1-config. Is xmlsec1 installed?")
.stdout;

args_from_output(out)
impl LocatedDependencies {
fn clang_args(&self) -> Vec<String> {
let mut result = Vec::new();
for include_path in &self.include_paths {
result.push(format!("-I{}", include_path.display()));
}
for (define, value) in &self.defines {
match value {
Some(value) => result.push(format!("-D{}={}", define, value)),
None => result.push(format!("-D{}", define)),
}
}
result
}
}

#[cfg(not(windows))]
fn locate_and_link_dependencies() -> LocatedDependencies {
let library =
pkg_config::probe_library("xmlsec1").expect("Could not find xmlsec1 using pkg-config");

fn args_from_output(args: Vec<u8>) -> Vec<String>
{
let decoded = String::from_utf8(args)
.expect("Got invalid UTF8 from xmlsec1-config");

let args = decoded.split_whitespace()
.map(|p| p.to_owned())
.collect::<Vec<String>>();
LocatedDependencies {
include_paths: library.include_paths,
defines: library.defines,
}
}

args
#[cfg(windows)]
fn locate_and_link_dependencies() -> LocatedDependencies {
let library =
vcpkg::find_package("xmlsec").expect("Failed to find xmlsec using vcpkg. Is it installed?");

println!("cargo:rustc-link-lib=crypt32");
println!("cargo:rustc-link-lib=user32");
println!("cargo:rustc-link-lib=bcrypt");

// vcpkg does not provide the defines, so we have to provide them ourselves
// -DXMLSEC_DL_LIBLTDL=1 -DXMLSEC_CRYPTO_OPENSSL=1
let mut defines = HashMap::new();
defines.insert("__XMLSEC_FUNCTION__".into(), Some("__func__".into()));
defines.insert("XMLSEC_NO_SIZE_T".into(), None);
defines.insert("XMLSEC_DL_LIBLTDL".into(), Some("1".into()));
defines.insert("XMLSEC_CRYPTO_OPENSSL".into(), Some("1".into()));
defines.insert("XMLSEC_NO_CRYPTO_DYNAMIC_LOADING".into(), Some("1".into()));
defines.insert("XMLSEC_NO_GOST".into(), Some("1".into()));
defines.insert("XMLSEC_NO_GOST2012".into(), Some("1".into()));

LocatedDependencies {
include_paths: library.include_paths,
defines,
}
}
98 changes: 47 additions & 51 deletions src/crypto/openssl.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,9 @@
//!
use crate::bindings;


/// Supported digesting and signing methods as specified by the XML standard.
#[allow(missing_docs)]
pub enum XmlSecSignatureMethod
{
pub enum XmlSecSignatureMethod {
Aes128Cbc,
Aes192Cbc,
Aes256Cbc,
Expand All @@ -26,16 +24,16 @@ pub enum XmlSecSignatureMethod
EcdsaSha256,
EcdsaSha384,
EcdsaSha512,
HmacMd5,
// HmacMd5,
HmacRipemd160,
HmacSha1,
HmacSha224,
HmacSha256,
HmacSha384,
HmacSha512,
Md5,
// Md5,
Ripemd160,
RsaMd5,
// RsaMd5,
RsaRipemd160,
RsaSha1,
RsaSha224,
Expand All @@ -51,55 +49,53 @@ pub enum XmlSecSignatureMethod
Sha512,
}


impl XmlSecSignatureMethod
{
impl XmlSecSignatureMethod {
/// Returns the resource pointer for the corresponding digesting/signing resource
pub fn to_method(&self) -> bindings::xmlSecTransformId
{
match self
{
Self::Aes128Cbc => unsafe { bindings::xmlSecOpenSSLTransformAes128CbcGetKlass() },
Self::Aes192Cbc => unsafe { bindings::xmlSecOpenSSLTransformAes192CbcGetKlass() },
Self::Aes256Cbc => unsafe { bindings::xmlSecOpenSSLTransformAes256CbcGetKlass() },
pub fn to_method(&self) -> bindings::xmlSecTransformId {
match self {
Self::Aes128Cbc => unsafe { bindings::xmlSecOpenSSLTransformAes128CbcGetKlass() },
Self::Aes192Cbc => unsafe { bindings::xmlSecOpenSSLTransformAes192CbcGetKlass() },
Self::Aes256Cbc => unsafe { bindings::xmlSecOpenSSLTransformAes256CbcGetKlass() },
// Self::Aes128Gcm => unsafe { bindings::xmlSecOpenSSLTransformAes128GcmGetKlass() },
// Self::Aes192Gcm => unsafe { bindings::xmlSecOpenSSLTransformAes192GcmGetKlass() },
// Self::Aes256Gcm => unsafe { bindings::xmlSecOpenSSLTransformAes256GcmGetKlass() },
Self::KWAes128 => unsafe { bindings::xmlSecOpenSSLTransformKWAes128GetKlass() },
Self::KWAes192 => unsafe { bindings::xmlSecOpenSSLTransformKWAes192GetKlass() },
Self::KWAes256 => unsafe { bindings::xmlSecOpenSSLTransformKWAes256GetKlass() },
Self::Des3Cbc => unsafe { bindings::xmlSecOpenSSLTransformDes3CbcGetKlass() },
Self::KWDes3 => unsafe { bindings::xmlSecOpenSSLTransformKWDes3GetKlass() },
Self::DsaSha1 => unsafe { bindings::xmlSecOpenSSLTransformDsaSha1GetKlass() },
Self::DsaSha256 => unsafe { bindings::xmlSecOpenSSLTransformDsaSha256GetKlass() },
Self::EcdsaSha1 => unsafe { bindings::xmlSecOpenSSLTransformEcdsaSha1GetKlass() },
Self::EcdsaSha224 => unsafe { bindings::xmlSecOpenSSLTransformEcdsaSha224GetKlass() },
Self::EcdsaSha256 => unsafe { bindings::xmlSecOpenSSLTransformEcdsaSha256GetKlass() },
Self::EcdsaSha384 => unsafe { bindings::xmlSecOpenSSLTransformEcdsaSha384GetKlass() },
Self::EcdsaSha512 => unsafe { bindings::xmlSecOpenSSLTransformEcdsaSha512GetKlass() },
Self::HmacMd5 => unsafe { bindings::xmlSecOpenSSLTransformHmacMd5GetKlass() },
Self::HmacRipemd160 => unsafe { bindings::xmlSecOpenSSLTransformHmacRipemd160GetKlass() },
Self::HmacSha1 => unsafe { bindings::xmlSecOpenSSLTransformHmacSha1GetKlass() },
Self::HmacSha224 => unsafe { bindings::xmlSecOpenSSLTransformHmacSha224GetKlass() },
Self::HmacSha256 => unsafe { bindings::xmlSecOpenSSLTransformHmacSha256GetKlass() },
Self::HmacSha384 => unsafe { bindings::xmlSecOpenSSLTransformHmacSha384GetKlass() },
Self::HmacSha512 => unsafe { bindings::xmlSecOpenSSLTransformHmacSha512GetKlass() },
Self::Md5 => unsafe { bindings::xmlSecOpenSSLTransformMd5GetKlass() },
Self::Ripemd160 => unsafe { bindings::xmlSecOpenSSLTransformRipemd160GetKlass() },
Self::RsaMd5 => unsafe { bindings::xmlSecOpenSSLTransformRsaMd5GetKlass() },
Self::RsaRipemd160 => unsafe { bindings::xmlSecOpenSSLTransformRsaRipemd160GetKlass() },
Self::RsaSha1 => unsafe { bindings::xmlSecOpenSSLTransformRsaSha1GetKlass() },
Self::RsaSha224 => unsafe { bindings::xmlSecOpenSSLTransformRsaSha224GetKlass() },
Self::RsaSha256 => unsafe { bindings::xmlSecOpenSSLTransformRsaSha256GetKlass() },
Self::RsaSha384 => unsafe { bindings::xmlSecOpenSSLTransformRsaSha384GetKlass() },
Self::RsaSha512 => unsafe { bindings::xmlSecOpenSSLTransformRsaSha512GetKlass() },
Self::RsaPkcs1 => unsafe { bindings::xmlSecOpenSSLTransformRsaPkcs1GetKlass() },
Self::RsaOaep => unsafe { bindings::xmlSecOpenSSLTransformRsaOaepGetKlass() },
Self::Sha1 => unsafe { bindings::xmlSecOpenSSLTransformSha1GetKlass() },
Self::Sha224 => unsafe { bindings::xmlSecOpenSSLTransformSha224GetKlass() },
Self::Sha256 => unsafe { bindings::xmlSecOpenSSLTransformSha256GetKlass() },
Self::Sha384 => unsafe { bindings::xmlSecOpenSSLTransformSha384GetKlass() },
Self::Sha512 => unsafe { bindings::xmlSecOpenSSLTransformSha512GetKlass() },
Self::KWAes128 => unsafe { bindings::xmlSecOpenSSLTransformKWAes128GetKlass() },
Self::KWAes192 => unsafe { bindings::xmlSecOpenSSLTransformKWAes192GetKlass() },
Self::KWAes256 => unsafe { bindings::xmlSecOpenSSLTransformKWAes256GetKlass() },
Self::Des3Cbc => unsafe { bindings::xmlSecOpenSSLTransformDes3CbcGetKlass() },
Self::KWDes3 => unsafe { bindings::xmlSecOpenSSLTransformKWDes3GetKlass() },
Self::DsaSha1 => unsafe { bindings::xmlSecOpenSSLTransformDsaSha1GetKlass() },
Self::DsaSha256 => unsafe { bindings::xmlSecOpenSSLTransformDsaSha256GetKlass() },
Self::EcdsaSha1 => unsafe { bindings::xmlSecOpenSSLTransformEcdsaSha1GetKlass() },
Self::EcdsaSha224 => unsafe { bindings::xmlSecOpenSSLTransformEcdsaSha224GetKlass() },
Self::EcdsaSha256 => unsafe { bindings::xmlSecOpenSSLTransformEcdsaSha256GetKlass() },
Self::EcdsaSha384 => unsafe { bindings::xmlSecOpenSSLTransformEcdsaSha384GetKlass() },
Self::EcdsaSha512 => unsafe { bindings::xmlSecOpenSSLTransformEcdsaSha512GetKlass() },
// Self::HmacMd5 => unsafe { bindings::xmlSecOpenSSLTransformHmacMd5GetKlass() },
Self::HmacRipemd160 => unsafe {
bindings::xmlSecOpenSSLTransformHmacRipemd160GetKlass()
},
Self::HmacSha1 => unsafe { bindings::xmlSecOpenSSLTransformHmacSha1GetKlass() },
Self::HmacSha224 => unsafe { bindings::xmlSecOpenSSLTransformHmacSha224GetKlass() },
Self::HmacSha256 => unsafe { bindings::xmlSecOpenSSLTransformHmacSha256GetKlass() },
Self::HmacSha384 => unsafe { bindings::xmlSecOpenSSLTransformHmacSha384GetKlass() },
Self::HmacSha512 => unsafe { bindings::xmlSecOpenSSLTransformHmacSha512GetKlass() },
// Self::Md5 => unsafe { bindings::xmlSecOpenSSLTransformMd5GetKlass() },
Self::Ripemd160 => unsafe { bindings::xmlSecOpenSSLTransformRipemd160GetKlass() },
// Self::RsaMd5 => unsafe { bindings::xmlSecOpenSSLTransformRsaMd5GetKlass() },
Self::RsaRipemd160 => unsafe { bindings::xmlSecOpenSSLTransformRsaRipemd160GetKlass() },
Self::RsaSha1 => unsafe { bindings::xmlSecOpenSSLTransformRsaSha1GetKlass() },
Self::RsaSha224 => unsafe { bindings::xmlSecOpenSSLTransformRsaSha224GetKlass() },
Self::RsaSha256 => unsafe { bindings::xmlSecOpenSSLTransformRsaSha256GetKlass() },
Self::RsaSha384 => unsafe { bindings::xmlSecOpenSSLTransformRsaSha384GetKlass() },
Self::RsaSha512 => unsafe { bindings::xmlSecOpenSSLTransformRsaSha512GetKlass() },
Self::RsaPkcs1 => unsafe { bindings::xmlSecOpenSSLTransformRsaPkcs1GetKlass() },
Self::RsaOaep => unsafe { bindings::xmlSecOpenSSLTransformRsaOaepGetKlass() },
Self::Sha1 => unsafe { bindings::xmlSecOpenSSLTransformSha1GetKlass() },
Self::Sha224 => unsafe { bindings::xmlSecOpenSSLTransformSha224GetKlass() },
Self::Sha256 => unsafe { bindings::xmlSecOpenSSLTransformSha256GetKlass() },
Self::Sha384 => unsafe { bindings::xmlSecOpenSSLTransformSha384GetKlass() },
Self::Sha512 => unsafe { bindings::xmlSecOpenSSLTransformSha512GetKlass() },
}
}
}
Loading