pub trait CryptoProvider: Send + Sync {
Show 32 methods
// Required methods
fn name(&self) -> &'static str;
fn supports(&self, capability: ProviderCapability<'_>) -> bool;
fn fill_random(&self, output: &mut [u8]) -> Result<(), ProviderError>;
fn digest(
&self,
algorithm: DigestAlgorithm,
data: &[u8],
) -> Result<Vec<u8>, ProviderError>;
fn sign(
&self,
key: &dyn SigningKey,
algorithm: SignatureAlgorithm,
data: &[u8],
) -> Result<Vec<u8>, SigningKeyError>;
fn verify(
&self,
key: &dyn VerifyingKey,
algorithm: SignatureAlgorithm,
data: &[u8],
signature: &[u8],
) -> Result<bool, DsigError>;
fn encrypt_data(
&self,
algorithm: DataEncryptionAlgorithm,
key: &[u8],
plaintext: &[u8],
) -> Result<Vec<u8>, ProviderError>;
fn decrypt_data(
&self,
algorithm: DataEncryptionAlgorithm,
key: &[u8],
ciphertext: &[u8],
) -> Result<Vec<u8>, ProviderError>;
fn wrap_key(
&self,
algorithm: KeyWrapAlgorithm,
kek: &[u8],
key: &[u8],
) -> Result<Vec<u8>, ProviderError>;
fn unwrap_key(
&self,
algorithm: KeyWrapAlgorithm,
kek: &[u8],
wrapped: &[u8],
) -> Result<Vec<u8>, ProviderError>;
fn transport_key(
&self,
key: &dyn KeyTransportKey,
parameters: &RsaOaepParameters,
plaintext: &[u8],
) -> Result<Vec<u8>, ProviderError>;
fn recover_key(
&self,
key: &dyn KeyRecoveryKey,
parameters: &RsaOaepParameters,
ciphertext: &[u8],
) -> Result<Vec<u8>, ProviderError>;
fn derive_key(
&self,
parameters: &KdfParameters<'_>,
secret: &[u8],
) -> Result<Vec<u8>, ProviderError>;
// Provided methods
fn binding(&self) -> Option<&ProviderBinding> { ... }
fn recover_content_key(
&self,
key: &dyn KeyRecoveryKey,
parameters: &RsaOaepParameters,
_content_algorithm: DataEncryptionAlgorithm,
ciphertext: &[u8],
) -> Result<RecoveredContentKey, ProviderError> { ... }
fn unwrap_content_key(
&self,
_key: &dyn KeyUnwrappingKey,
algorithm: KeyWrapAlgorithm,
_content_algorithm: DataEncryptionAlgorithm,
_wrapped: &[u8],
) -> Result<RecoveredContentKey, ProviderError> { ... }
fn decrypt_content_key(
&self,
algorithm: DataEncryptionAlgorithm,
_key: &dyn ContentDecryptionKey,
_ciphertext: &[u8],
) -> Result<Vec<u8>, ProviderError> { ... }
fn import_signing_key(
&self,
algorithm: SignatureAlgorithm,
_pkcs8: &[u8],
) -> Result<Box<dyn SigningKey>, SigningKeyError> { ... }
fn import_recovery_key(
&self,
_pkcs8: &[u8],
) -> Result<Arc<dyn KeyRecoveryKey>, ProviderError> { ... }
fn import_encapsulation_key(
&self,
algorithm: KeyEncapsulationAlgorithm,
_spki: &[u8],
) -> Result<Arc<dyn KeyEncapsulationKey>, ProviderError> { ... }
fn import_decapsulation_key(
&self,
algorithm: KeyEncapsulationAlgorithm,
_pkcs8: &[u8],
) -> Result<Arc<dyn KeyDecapsulationKey>, ProviderError> { ... }
fn encapsulate_key(
&self,
key: &dyn KeyEncapsulationKey,
) -> Result<EncapsulatedKey, ProviderError> { ... }
fn decapsulate_key(
&self,
key: &dyn KeyDecapsulationKey,
ciphertext: &[u8],
) -> Result<Zeroizing<[u8; 32]>, ProviderError> { ... }
fn sign_with_context(
&self,
key: &dyn SigningKey,
algorithm: SignatureAlgorithm,
context: &SignatureContext,
data: &[u8],
) -> Result<Vec<u8>, SigningKeyError> { ... }
fn verify_with_context(
&self,
key: &dyn VerifyingKey,
algorithm: SignatureAlgorithm,
context: &SignatureContext,
data: &[u8],
signature: &[u8],
) -> Result<bool, DsigError> { ... }
fn verify_with_key_receipt(
&self,
key: &dyn VerifyingKey,
input: SignatureVerificationInput<'_>,
_observer: &mut dyn FnMut(KeyVerificationEvent<'_>) -> Result<(), DsigError>,
) -> Result<bool, DsigError> { ... }
fn associate_verification_key(
&self,
_actual: &[u8],
_expected: WorkingKey<'_>,
_charge: &dyn Fn(u64) -> Result<(), MemoryError>,
) -> Result<KeyAssociation, DsigError> { ... }
fn verify_x509_signature(
&self,
algorithm: X509SignatureAlgorithm,
signed_data: &[u8],
signature: &[u8],
issuer_spki_der: &[u8],
) -> Result<bool, ProviderError> { ... }
fn encrypt_data_with_parameters(
&self,
algorithm: DataEncryptionAlgorithm,
key: &[u8],
plaintext: &[u8],
parameters: Option<ChaChaParametersRef<'_>>,
) -> Result<Vec<u8>, ProviderError> { ... }
fn decrypt_data_with_parameters(
&self,
algorithm: DataEncryptionAlgorithm,
key: &[u8],
ciphertext: &[u8],
parameters: Option<ChaChaParametersRef<'_>>,
) -> Result<Vec<u8>, ProviderError> { ... }
fn agree_key(
&self,
key: &dyn KeyAgreementKey,
parameters: &KeyAgreementParameters<'_>,
) -> Result<Vec<u8>, ProviderError> { ... }
fn require_capability(
&self,
capability: ProviderCapability<'_>,
) -> Result<(), ProviderError> { ... }
}Expand description
Provider operations used by the XML Security pipelines.
Required Methods§
Sourcefn supports(&self, capability: ProviderCapability<'_>) -> bool
fn supports(&self, capability: ProviderCapability<'_>) -> bool
Return whether this build can dispatch the requested capability.
ProviderCapability::Sign and ProviderCapability::Verify describe
provider dispatch only: the supplied opaque key performs the executable
algorithm-support check when the operation runs.
Sourcefn fill_random(&self, output: &mut [u8]) -> Result<(), ProviderError>
fn fill_random(&self, output: &mut [u8]) -> Result<(), ProviderError>
Fill caller-owned output with cryptographically secure random bytes.
Sourcefn digest(
&self,
algorithm: DigestAlgorithm,
data: &[u8],
) -> Result<Vec<u8>, ProviderError>
fn digest( &self, algorithm: DigestAlgorithm, data: &[u8], ) -> Result<Vec<u8>, ProviderError>
Compute a message digest.
Sourcefn sign(
&self,
key: &dyn SigningKey,
algorithm: SignatureAlgorithm,
data: &[u8],
) -> Result<Vec<u8>, SigningKeyError>
fn sign( &self, key: &dyn SigningKey, algorithm: SignatureAlgorithm, data: &[u8], ) -> Result<Vec<u8>, SigningKeyError>
Sign bytes with an opaque key handle.
Providers that delegate primitive signing to the supplied key must call
crate::xmldsig::SigningKey::sign_with_provider so randomized
primitives consume this provider’s randomness.
Sourcefn verify(
&self,
key: &dyn VerifyingKey,
algorithm: SignatureAlgorithm,
data: &[u8],
signature: &[u8],
) -> Result<bool, DsigError>
fn verify( &self, key: &dyn VerifyingKey, algorithm: SignatureAlgorithm, data: &[u8], signature: &[u8], ) -> Result<bool, DsigError>
Verify bytes with an opaque key handle.
The XMLDSig facade validates algorithm- and key-specific signature framing before this provider boundary.
Sourcefn encrypt_data(
&self,
algorithm: DataEncryptionAlgorithm,
key: &[u8],
plaintext: &[u8],
) -> Result<Vec<u8>, ProviderError>
fn encrypt_data( &self, algorithm: DataEncryptionAlgorithm, key: &[u8], plaintext: &[u8], ) -> Result<Vec<u8>, ProviderError>
Encrypt XMLEnc content bytes, including standard framing.
Sourcefn decrypt_data(
&self,
algorithm: DataEncryptionAlgorithm,
key: &[u8],
ciphertext: &[u8],
) -> Result<Vec<u8>, ProviderError>
fn decrypt_data( &self, algorithm: DataEncryptionAlgorithm, key: &[u8], ciphertext: &[u8], ) -> Result<Vec<u8>, ProviderError>
Decrypt XMLEnc content bytes, including framing validation.
Sourcefn wrap_key(
&self,
algorithm: KeyWrapAlgorithm,
kek: &[u8],
key: &[u8],
) -> Result<Vec<u8>, ProviderError>
fn wrap_key( &self, algorithm: KeyWrapAlgorithm, kek: &[u8], key: &[u8], ) -> Result<Vec<u8>, ProviderError>
Wrap a content key with RFC 3394 AES Key Wrap.
Successful output contains the complete RFC 3394 value and is exactly
eight bytes longer than key. The XMLEnc facade validates that framing
before serializing provider output.
Sourcefn unwrap_key(
&self,
algorithm: KeyWrapAlgorithm,
kek: &[u8],
wrapped: &[u8],
) -> Result<Vec<u8>, ProviderError>
fn unwrap_key( &self, algorithm: KeyWrapAlgorithm, kek: &[u8], wrapped: &[u8], ) -> Result<Vec<u8>, ProviderError>
Unwrap a content key with RFC 3394 AES Key Wrap.
Sourcefn transport_key(
&self,
key: &dyn KeyTransportKey,
parameters: &RsaOaepParameters,
plaintext: &[u8],
) -> Result<Vec<u8>, ProviderError>
fn transport_key( &self, key: &dyn KeyTransportKey, parameters: &RsaOaepParameters, plaintext: &[u8], ) -> Result<Vec<u8>, ProviderError>
Wrap key bytes using an opaque RSA public-key operation.
Sourcefn recover_key(
&self,
key: &dyn KeyRecoveryKey,
parameters: &RsaOaepParameters,
ciphertext: &[u8],
) -> Result<Vec<u8>, ProviderError>
fn recover_key( &self, key: &dyn KeyRecoveryKey, parameters: &RsaOaepParameters, ciphertext: &[u8], ) -> Result<Vec<u8>, ProviderError>
Recover key bytes using an opaque RSA private-key operation.
Sourcefn derive_key(
&self,
parameters: &KdfParameters<'_>,
secret: &[u8],
) -> Result<Vec<u8>, ProviderError>
fn derive_key( &self, parameters: &KdfParameters<'_>, secret: &[u8], ) -> Result<Vec<u8>, ProviderError>
Derive key bytes from caller-owned secret material.
Implementations that advertise ProviderCapability::Kdf must perform
the advertised derivation here. This method is required so capability
discovery cannot silently inherit a contradictory unsupported default.
Provided Methods§
Sourcefn binding(&self) -> Option<&ProviderBinding>
fn binding(&self) -> Option<&ProviderBinding>
External execution domain. Different instances of one engine are not interchangeable.
Sourcefn recover_content_key(
&self,
key: &dyn KeyRecoveryKey,
parameters: &RsaOaepParameters,
_content_algorithm: DataEncryptionAlgorithm,
ciphertext: &[u8],
) -> Result<RecoveredContentKey, ProviderError>
fn recover_content_key( &self, key: &dyn KeyRecoveryKey, parameters: &RsaOaepParameters, _content_algorithm: DataEncryptionAlgorithm, ciphertext: &[u8], ) -> Result<RecoveredContentKey, ProviderError>
Recover a candidate without requiring its symmetric value to leave the provider.
Sourcefn unwrap_content_key(
&self,
_key: &dyn KeyUnwrappingKey,
algorithm: KeyWrapAlgorithm,
_content_algorithm: DataEncryptionAlgorithm,
_wrapped: &[u8],
) -> Result<RecoveredContentKey, ProviderError>
fn unwrap_content_key( &self, _key: &dyn KeyUnwrappingKey, algorithm: KeyWrapAlgorithm, _content_algorithm: DataEncryptionAlgorithm, _wrapped: &[u8], ) -> Result<RecoveredContentKey, ProviderError>
Unwrap into an opaque content key. Providers must opt in explicitly.
Sourcefn decrypt_content_key(
&self,
algorithm: DataEncryptionAlgorithm,
_key: &dyn ContentDecryptionKey,
_ciphertext: &[u8],
) -> Result<Vec<u8>, ProviderError>
fn decrypt_content_key( &self, algorithm: DataEncryptionAlgorithm, _key: &dyn ContentDecryptionKey, _ciphertext: &[u8], ) -> Result<Vec<u8>, ProviderError>
Decrypt with an opaque key; capability remains distinct from policy permission.
Sourcefn import_signing_key(
&self,
algorithm: SignatureAlgorithm,
_pkcs8: &[u8],
) -> Result<Box<dyn SigningKey>, SigningKeyError>
fn import_signing_key( &self, algorithm: SignatureAlgorithm, _pkcs8: &[u8], ) -> Result<Box<dyn SigningKey>, SigningKeyError>
Import original PKCS#8 input into this engine without exporting another provider’s private handle. Policy and input budgets are enforced by the caller.
Sourcefn import_recovery_key(
&self,
_pkcs8: &[u8],
) -> Result<Arc<dyn KeyRecoveryKey>, ProviderError>
fn import_recovery_key( &self, _pkcs8: &[u8], ) -> Result<Arc<dyn KeyRecoveryKey>, ProviderError>
Import original PKCS#8 input into a provider-owned RSA recovery handle.
Sourcefn import_encapsulation_key(
&self,
algorithm: KeyEncapsulationAlgorithm,
_spki: &[u8],
) -> Result<Arc<dyn KeyEncapsulationKey>, ProviderError>
fn import_encapsulation_key( &self, algorithm: KeyEncapsulationAlgorithm, _spki: &[u8], ) -> Result<Arc<dyn KeyEncapsulationKey>, ProviderError>
Import a recipient SPKI into the selected engine. The caller reserves import work and grants permission; unavailable engines never fall back.
Sourcefn import_decapsulation_key(
&self,
algorithm: KeyEncapsulationAlgorithm,
_pkcs8: &[u8],
) -> Result<Arc<dyn KeyDecapsulationKey>, ProviderError>
fn import_decapsulation_key( &self, algorithm: KeyEncapsulationAlgorithm, _pkcs8: &[u8], ) -> Result<Arc<dyn KeyDecapsulationKey>, ProviderError>
Import a recipient PKCS#8 into this engine without exporting another provider’s private handle. The encoded parameter set must match the request.
Sourcefn encapsulate_key(
&self,
key: &dyn KeyEncapsulationKey,
) -> Result<EncapsulatedKey, ProviderError>
fn encapsulate_key( &self, key: &dyn KeyEncapsulationKey, ) -> Result<EncapsulatedKey, ProviderError>
Encapsulate through this engine; unsupported engines never delegate to RustCrypto.
Sourcefn decapsulate_key(
&self,
key: &dyn KeyDecapsulationKey,
ciphertext: &[u8],
) -> Result<Zeroizing<[u8; 32]>, ProviderError>
fn decapsulate_key( &self, key: &dyn KeyDecapsulationKey, ciphertext: &[u8], ) -> Result<Zeroizing<[u8; 32]>, ProviderError>
Decapsulate without revealing implicit-rejection validity.
Sourcefn sign_with_context(
&self,
key: &dyn SigningKey,
algorithm: SignatureAlgorithm,
context: &SignatureContext,
data: &[u8],
) -> Result<Vec<u8>, SigningKeyError>
fn sign_with_context( &self, key: &dyn SigningKey, algorithm: SignatureAlgorithm, context: &SignatureContext, data: &[u8], ) -> Result<Vec<u8>, SigningKeyError>
Sign with explicit domain separation; unsupported contexts must not be discarded.
Sourcefn verify_with_context(
&self,
key: &dyn VerifyingKey,
algorithm: SignatureAlgorithm,
context: &SignatureContext,
data: &[u8],
signature: &[u8],
) -> Result<bool, DsigError>
fn verify_with_context( &self, key: &dyn VerifyingKey, algorithm: SignatureAlgorithm, context: &SignatureContext, data: &[u8], signature: &[u8], ) -> Result<bool, DsigError>
Verify with explicit domain separation; unsupported contexts fail closed.
Sourcefn verify_with_key_receipt(
&self,
key: &dyn VerifyingKey,
input: SignatureVerificationInput<'_>,
_observer: &mut dyn FnMut(KeyVerificationEvent<'_>) -> Result<(), DsigError>,
) -> Result<bool, DsigError>
fn verify_with_key_receipt( &self, key: &dyn VerifyingKey, input: SignatureVerificationInput<'_>, _observer: &mut dyn FnMut(KeyVerificationEvent<'_>) -> Result<(), DsigError>, ) -> Result<bool, DsigError>
Verify once while reporting the actual successful leaf. Providers that cannot identify it retain ordinary verification and report no receipt.
Sourcefn associate_verification_key(
&self,
_actual: &[u8],
_expected: WorkingKey<'_>,
_charge: &dyn Fn(u64) -> Result<(), MemoryError>,
) -> Result<KeyAssociation, DsigError>
fn associate_verification_key( &self, _actual: &[u8], _expected: WorkingKey<'_>, _charge: &dyn Fn(u64) -> Result<(), MemoryError>, ) -> Result<KeyAssociation, DsigError>
Compare the successful public receipt with original effective PKIX key state. Unknown semantics are Unproven, never a second provider fallback.
Sourcefn verify_x509_signature(
&self,
algorithm: X509SignatureAlgorithm,
signed_data: &[u8],
signature: &[u8],
issuer_spki_der: &[u8],
) -> Result<bool, ProviderError>
fn verify_x509_signature( &self, algorithm: X509SignatureAlgorithm, signed_data: &[u8], signature: &[u8], issuer_spki_der: &[u8], ) -> Result<bool, ProviderError>
Verify an X.509 certificate or CRL signature under its issuer SPKI.
Sourcefn encrypt_data_with_parameters(
&self,
algorithm: DataEncryptionAlgorithm,
key: &[u8],
plaintext: &[u8],
parameters: Option<ChaChaParametersRef<'_>>,
) -> Result<Vec<u8>, ProviderError>
fn encrypt_data_with_parameters( &self, algorithm: DataEncryptionAlgorithm, key: &[u8], plaintext: &[u8], parameters: Option<ChaChaParametersRef<'_>>, ) -> Result<Vec<u8>, ProviderError>
Encrypt while preserving XML-carried cipher parameters. Providers must implement the profile explicitly, never discard it or fall back.
Sourcefn decrypt_data_with_parameters(
&self,
algorithm: DataEncryptionAlgorithm,
key: &[u8],
ciphertext: &[u8],
parameters: Option<ChaChaParametersRef<'_>>,
) -> Result<Vec<u8>, ProviderError>
fn decrypt_data_with_parameters( &self, algorithm: DataEncryptionAlgorithm, key: &[u8], ciphertext: &[u8], parameters: Option<ChaChaParametersRef<'_>>, ) -> Result<Vec<u8>, ProviderError>
Decrypt with the same explicit parameter contract as encryption.
Sourcefn agree_key(
&self,
key: &dyn KeyAgreementKey,
parameters: &KeyAgreementParameters<'_>,
) -> Result<Vec<u8>, ProviderError>
fn agree_key( &self, key: &dyn KeyAgreementKey, parameters: &KeyAgreementParameters<'_>, ) -> Result<Vec<u8>, ProviderError>
Perform key agreement with an opaque provider-owned private key.
Sourcefn require_capability(
&self,
capability: ProviderCapability<'_>,
) -> Result<(), ProviderError>
fn require_capability( &self, capability: ProviderCapability<'_>, ) -> Result<(), ProviderError>
Reject an unavailable exact capability without falling back.
Dyn Compatibility§
This trait is dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety".