diff --git a/parsec-openssl-provider/Cargo.toml b/parsec-openssl-provider/Cargo.toml index 2a412583..07137e72 100644 --- a/parsec-openssl-provider/Cargo.toml +++ b/parsec-openssl-provider/Cargo.toml @@ -10,6 +10,8 @@ categories = ["cryptography", "hardware-support"] edition = "2021" [dependencies] +lazy_static = "1.4.0" +log = "0.4" +parsec-client = { git = "https://github.com/parallaxsecond/parsec-client-rust", tag="0.16.0" } parsec-openssl2 = { path = "../parsec-openssl2" } openssl-errors = "0.2.0" -log = "0.4" diff --git a/parsec-openssl-provider/src/lib.rs b/parsec-openssl-provider/src/lib.rs index 22c0bb96..6f79f2ef 100644 --- a/parsec-openssl-provider/src/lib.rs +++ b/parsec-openssl-provider/src/lib.rs @@ -1,6 +1,7 @@ // Copyright 2023 Contributors to the Parsec project. // SPDX-License-Identifier: Apache-2.0 use std::mem; +use std::sync::Mutex; pub use parsec_openssl2::*; pub use openssl_errors::*; @@ -11,9 +12,17 @@ use provider::*; mod catch; use catch::r#catch; -// The init function populates the dispatch table and returns a NULL pointer -// to the provider context. This needs to be changed when key management and -// crypto support is added to the provider. +use parsec_client::error::Result as ClientResult; +use parsec_client::BasicClient; + +const PROJECT_NAME: &str = env!("CARGO_PKG_NAME"); + +lazy_static::lazy_static! { + static ref PARSEC_PROVIDER_CTX: Mutex> = Mutex::new(BasicClient::new(Some(PROJECT_NAME.to_string()))); +} + +// The init function populates the dispatch table and returns a void pointer +// to the provider context (which contains the parsec basic client). pub unsafe fn parsec_provider_provider_init( _handle: *const OSSL_CORE_HANDLE, _in_: *const OSSL_DISPATCH, @@ -49,8 +58,18 @@ pub unsafe fn parsec_provider_provider_init( }); *out = DISPATCH_TABLE.as_ptr(); - *provctx = std::ptr::null_mut(); - + { + let _ = r#catch(Some(|| Error::PROVIDER_INIT), || { + if (*PARSEC_PROVIDER_CTX.lock().unwrap()).is_err() { + Err(Openssl2Error::SysReturnedNull { + inner: ErrorStack::get(), + })?; + } + Ok(OPENSSL_SUCCESS) + }); + } + let ptr: *const Mutex> = &*PARSEC_PROVIDER_CTX; + *provctx = ptr as VOID_PTR; Ok(()) } @@ -61,6 +80,7 @@ openssl_errors! { PROVIDER_GETTABLE_PARAMS("parsec_provider_gettable_params"); PROVIDER_GET_PARAMS("parsec_provider_get_params"); PROVIDER_QUERY("parsec_provider_query"); + PROVIDER_INIT("parsec_provider_init"); } reasons { diff --git a/parsec-openssl2/src/lib.rs b/parsec-openssl2/src/lib.rs index 090186d5..27f984bf 100644 --- a/parsec-openssl2/src/lib.rs +++ b/parsec-openssl2/src/lib.rs @@ -4,6 +4,7 @@ use openssl2::{openssl_returns_1, openssl_returns_nonnull}; pub use openssl_sys::*; pub use parsec_openssl_sys2::*; +pub use openssl::error::ErrorStack; mod types; pub use types::*;