Description
Background and Motivation
The RNGCryptoServiceProvider
class is a relic from the old Windows CAPI days of yore. The original Win32 API is no longer recommended, preferring CNG for all new work.
In .NET Core, the RNGCryptoServiceProvider
type is marked [EditorBrowsable(Never)]
, and the implementation ignores all provided constructor parameters and delegates to the underlying preferred OS implementation anyway.
There's no reason for an application targeting .NET 6.0+ to use this API. Apps should instead use RandomNumberGenerator.Create()
. For AOT and linker trimming scenarios, this could also help eliminate the app's dependency on the package which contains the RNGCryptoServiceProvider
type, reducing overall memory usage and disk footprint.
Proposed API
namespace System.Security.Cryptography
{
[EditorBrowsable(EditorBrowsableState.Never)] // existing attribute
[Obsolete("This type is obsolete. Use RandomNumberGenerator.Create() instead.")] // new attribute
public sealed class RNGCryptoServiceProvider : RandomNumberGenerator
{ /* ... */ }
}
This could be accompanied by a fixer with two behaviors:
- All calls to
RNGCryptoServiceProvider
ctors become calls to the parameterless overloadRandomNumberGenerator.Create()
. - All fields / locals / parameters of type
RNGCryptoServiceProvider
instead become typeRandomNumberGenerator
.
The obsoletion would not affect apps targeting netstandard or .NET versions prior to 6.0, as the reference assemblies would not contain these annotations. However, the fixer could apply to all target frameworks.