Skip to content

Commit 989b9d8

Browse files
feat: support pkcs#11 standard as a signer (#24)
* feat: support pkcs#11 standard as a signer * fix: clippy * docs * fix: windows build
1 parent 8b418a6 commit 989b9d8

File tree

16 files changed

+831
-3
lines changed

16 files changed

+831
-3
lines changed

crates/core/Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,3 +60,5 @@ sha2 = "0.10"
6060
p256 = { version = "0.13", features = ["ecdsa"] }
6161
tower = "0.5.2"
6262
subtle = "2.6.1"
63+
cryptoki = "0.10"
64+
secrecy = "0.8"

crates/core/src/provider/evm_provider.rs

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
use crate::gas::BLOB_GAS_PER_BLOB;
22
use crate::provider::layer_extensions::RpcLoggingLayer;
33
use crate::wallet::{
4-
AwsKmsWalletManager, CompositeWalletManager, MnemonicWalletManager, PrivateKeyWalletManager,
5-
PrivyWalletManager, TurnkeyWalletManager, WalletError, WalletManagerTrait,
4+
AwsKmsWalletManager, CompositeWalletManager, MnemonicWalletManager, Pkcs11WalletManager,
5+
PrivateKeyWalletManager, PrivyWalletManager, TurnkeyWalletManager, WalletError,
6+
WalletManagerTrait,
7+
};
8+
use crate::yaml::{
9+
AwsKmsSigningProviderConfig, Pkcs11SigningProviderConfig, TurnkeySigningProviderConfig,
610
};
7-
use crate::yaml::{AwsKmsSigningProviderConfig, TurnkeySigningProviderConfig};
811
use crate::{
912
gas::{
1013
BaseGasFeeEstimator, BlobGasEstimatorResult, BlobGasPriceResult, GasEstimatorError,
@@ -200,6 +203,15 @@ impl EvmProvider {
200203
Self::new_internal(network_setup_config, wallet_manager, gas_estimator).await
201204
}
202205

206+
pub async fn new_with_pkcs11(
207+
network_setup_config: &NetworkSetupConfig,
208+
pkcs11_config: Pkcs11SigningProviderConfig,
209+
gas_estimator: Arc<dyn BaseGasFeeEstimator + Send + Sync>,
210+
) -> Result<Self, EvmProviderNewError> {
211+
let wallet_manager = Arc::new(Pkcs11WalletManager::new(pkcs11_config)?);
212+
Self::new_internal(network_setup_config, wallet_manager, gas_estimator).await
213+
}
214+
203215
pub async fn new_with_composite(
204216
network_setup_config: &NetworkSetupConfig,
205217
primary_manager: Arc<dyn WalletManagerTrait>,

crates/core/src/provider/mod.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ pub async fn load_providers(
6666
let has_main_signing_provider = signing_key.privy.is_some()
6767
|| signing_key.aws_kms.is_some()
6868
|| signing_key.turnkey.is_some()
69+
|| signing_key.pkcs11.is_some()
6970
|| signing_key.raw.is_some();
7071

7172
// If we only have private keys and no main signing provider, use private key manager only
@@ -148,6 +149,25 @@ pub async fn load_providers(
148149
)
149150
.await?
150151
}
152+
} else if let Some(pkcs11) = &signing_key.pkcs11 {
153+
if private_key_strings.is_some() {
154+
let pkcs11_manager =
155+
std::sync::Arc::new(crate::wallet::Pkcs11WalletManager::new(pkcs11.clone())?);
156+
EvmProvider::new_with_composite(
157+
config,
158+
pkcs11_manager,
159+
private_key_strings,
160+
get_gas_estimator(&config.provider_urls, setup_config, config).await?,
161+
)
162+
.await?
163+
} else {
164+
EvmProvider::new_with_pkcs11(
165+
config,
166+
pkcs11.clone(),
167+
get_gas_estimator(&config.provider_urls, setup_config, config).await?,
168+
)
169+
.await?
170+
}
151171
} else {
152172
let mnemonic = get_mnemonic_from_signing_key(project_path, signing_key).await?;
153173

crates/core/src/startup.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,7 @@ async fn start_api(
189189
&& signing_provider.privy.is_none()
190190
&& signing_provider.aws_kms.is_none()
191191
&& signing_provider.turnkey.is_none()
192+
&& signing_provider.pkcs11.is_none()
192193
{
193194
Some(network_config.chain_id)
194195
} else {

crates/core/src/wallet/mod.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ pub use turnkey_wallet_manager::TurnkeyWalletManager;
2424
mod private_key_wallet_manager;
2525
pub use private_key_wallet_manager::PrivateKeyWalletManager;
2626

27+
mod pkcs11_wallet_manager;
28+
pub use pkcs11_wallet_manager::Pkcs11WalletManager;
29+
2730
mod composite_wallet_manager;
2831
pub use composite_wallet_manager::CompositeWalletManager;
2932

0 commit comments

Comments
 (0)