dotnet/wpf · error · ArgumentException
SR.CryptoProviderIsNotReady
Error message
SR.CryptoProviderIsNotReady
What it means
The CryptoProvider property setter validates that the provided provider can actually do work: it must support encryption, decryption, or both. A provider with CanEncrypt == false && CanDecrypt == false is rejected with ArgumentException naming 'value' (SR.CryptoProviderIsNotReady).
Solutions
- Verify the user has encryption or decryption grants before obtaining the CryptoProvider
- Check provider.CanEncrypt / provider.CanDecrypt before assigning it to the transform
- Obtain the provider from a SecureEnvironment where the user was granted appropriate rights
- Use a different user account or publish license that includes the needed rights
Example fix
// before
transform.CryptoProvider = env.CryptoProvider; // may be unusable
// after
var provider = env.CryptoProvider;
if (!provider.CanEncrypt && !provider.CanDecrypt)
throw new InvalidOperationException("User has no encrypt/decrypt rights");
transform.CryptoProvider = provider; Defensive patterns
Strategy: validation
Validate before calling
if (provider == null || (!provider.CanEncrypt && !provider.CanDecrypt)) throw new ArgumentException("CryptoProvider cannot encrypt or decrypt", nameof(provider)); Try / catch
try { transform.CryptoProvider = provider; } catch (ArgumentException ex) when (ex.ParamName == "value") { /* request rights or re-acquire provider */ } Prevention
- Check CanEncrypt/CanDecrypt on the provider before assignment
- Ensure the user was granted rights in the publish license
- Never assign stub providers in production code paths
When it happens
Trigger: Assigning transform.CryptoProvider a CryptoProvider instance returned by an RM environment that granted no use rights (cannot encrypt or decrypt), e.g. the user lacks rights to the protected content.
Common situations: User opened a document without sufficient rights grants; RM server returned a limited grant set; testing with a stub/empty CryptoProvider that reports no capabilities.
Understand the failure class
Background: "Must be a positive integer", "Invalid value", "Unsupported": the invalid-argument-value error family, when a library rejects the value you pass — this error's family across 35 libraries.
Related errors
- SR.CallbackParameterInvalid
- SR.CannotChangeCryptoProvider
- SR.OnlyPassportOrWindowsAuthenticatedUsersAreAllowed
- ArgumentOutOfRangeException(authentication)
- ArgumentOutOfRangeException(authenticationType)
AI-assisted analysis of dotnet/wpf@81131a70a4 (2026-09-14).
Data as JSON: /api/errors/85f2e43b3d128571.
Report an issue: GitHub.
Appendix: source
Thrown at src/Microsoft.DotNet.Wpf/src/WindowsBase/MS/Internal/IO/Packaging/CompoundFile/RightsManagementEncryptionTransform.cs:498
/// </value>
internal CryptoProvider CryptoProvider
{
get
{
return _cryptoProvider;
}
set
{
if (_fixedSettings)
{
throw new InvalidOperationException(SR.CannotChangeCryptoProvider);
}
ArgumentNullException.ThrowIfNull(value);
if (!value.CanEncrypt && !value.CanDecrypt)
{
throw new ArgumentException(SR.CryptoProviderIsNotReady, nameof(value));
}
_cryptoProvider = value;
}
}
/// <value>
/// Expose the transform identifier for the use of the DataSpaceManager.
/// </value>
internal static string ClassTransformIdentifier
{
get
{
return "{C73DFACD-061F-43B0-8B64-0C620D2A8B50}";
}
}
#endregion RightsManagementEncryptionTransform PropertiesView on GitHub (pinned to 81131a70a4)