Skip to content

Commit 2c2074b

Browse files
authored
Refactor DataProtection trimming (#41650)
1 parent 1230a1a commit 2c2074b

30 files changed

+125
-91
lines changed

src/DataProtection/Abstractions/src/DataProtectionCommonExtensions.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,6 @@ public static IDataProtector GetDataProtector(this IServiceProvider services, st
183183
/// <param name="protector">The data protector to use for this operation.</param>
184184
/// <param name="plaintext">The plaintext data to protect.</param>
185185
/// <returns>The protected form of the plaintext data.</returns>
186-
[RequiresUnreferencedCode(TrimmerWarning.Message)]
187186
public static string Protect(this IDataProtector protector, string plaintext)
188187
{
189188
if (protector == null)
@@ -218,7 +217,6 @@ public static string Protect(this IDataProtector protector, string plaintext)
218217
/// <exception cref="System.Security.Cryptography.CryptographicException">
219218
/// Thrown if <paramref name="protectedData"/> is invalid or malformed.
220219
/// </exception>
221-
[RequiresUnreferencedCode(TrimmerWarning.Message)]
222220
public static string Unprotect(this IDataProtector protector, string protectedData)
223221
{
224222
if (protector == null)

src/DataProtection/Abstractions/src/IDataProtector.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ public interface IDataProtector : IDataProtectionProvider
1515
/// </summary>
1616
/// <param name="plaintext">The plaintext data to protect.</param>
1717
/// <returns>The protected form of the plaintext data.</returns>
18-
[RequiresUnreferencedCode(TrimmerWarning.Message)]
1918
byte[] Protect(byte[] plaintext);
2019

2120
/// <summary>
@@ -26,6 +25,5 @@ public interface IDataProtector : IDataProtectionProvider
2625
/// <exception cref="System.Security.Cryptography.CryptographicException">
2726
/// Thrown if the protected data is invalid or malformed.
2827
/// </exception>
29-
[RequiresUnreferencedCode(TrimmerWarning.Message)]
3028
byte[] Unprotect(byte[] protectedData);
3129
}

src/DataProtection/DataProtection/src/ActivatorExtensions.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,7 @@ internal static class ActivatorExtensions
1818
/// Creates an instance of <paramref name="implementationTypeName"/> and ensures
1919
/// that it is assignable to <typeparamref name="T"/>.
2020
/// </summary>
21-
[RequiresUnreferencedCode(TrimmerWarning.Message)]
22-
public static T CreateInstance<T>(this IActivator activator, string implementationTypeName)
21+
public static T CreateInstance<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] T>(this IActivator activator, string implementationTypeName)
2322
where T : class
2423
{
2524
if (implementationTypeName == null)

src/DataProtection/DataProtection/src/AuthenticatedEncryption/ConfigurationModel/AuthenticatedEncryptorDescriptorDeserializer.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ public sealed class AuthenticatedEncryptorDescriptorDeserializer : IAuthenticate
1717
/// <summary>
1818
/// Imports the <see cref="AuthenticatedEncryptorDescriptor"/> from serialized XML.
1919
/// </summary>
20-
[RequiresUnreferencedCode(TrimmerWarning.Message)]
2120
public IAuthenticatedEncryptorDescriptor ImportFromXml(XElement element)
2221
{
2322
if (element == null)

src/DataProtection/DataProtection/src/AuthenticatedEncryption/ConfigurationModel/CngCbcAuthenticatedEncryptorDescriptorDeserializer.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ public sealed class CngCbcAuthenticatedEncryptorDescriptorDeserializer : IAuthen
1818
/// <summary>
1919
/// Imports the <see cref="CngCbcAuthenticatedEncryptorDescriptor"/> from serialized XML.
2020
/// </summary>
21-
[RequiresUnreferencedCode(TrimmerWarning.Message)]
2221
public IAuthenticatedEncryptorDescriptor ImportFromXml(XElement element)
2322
{
2423
if (element == null)

src/DataProtection/DataProtection/src/AuthenticatedEncryption/ConfigurationModel/CngGcmAuthenticatedEncryptorDescriptorDeserializer.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ public sealed class CngGcmAuthenticatedEncryptorDescriptorDeserializer : IAuthen
1818
/// <summary>
1919
/// Imports the <see cref="CngCbcAuthenticatedEncryptorDescriptor"/> from serialized XML.
2020
/// </summary>
21-
[RequiresUnreferencedCode(TrimmerWarning.Message)]
2221
public IAuthenticatedEncryptorDescriptor ImportFromXml(XElement element)
2322
{
2423
if (element == null)

src/DataProtection/DataProtection/src/AuthenticatedEncryption/ConfigurationModel/IAuthenticatedEncryptorDescriptorDeserializer.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,5 @@ public interface IAuthenticatedEncryptorDescriptorDeserializer
1616
/// </summary>
1717
/// <param name="element">The element to deserialize.</param>
1818
/// <returns>The <see cref="IAuthenticatedEncryptorDescriptor"/> represented by <paramref name="element"/>.</returns>
19-
[RequiresUnreferencedCode(TrimmerWarning.Message)]
2019
IAuthenticatedEncryptorDescriptor ImportFromXml(XElement element);
2120
}

src/DataProtection/DataProtection/src/AuthenticatedEncryption/ConfigurationModel/ManagedAuthenticatedEncryptorDescriptorDeserializer.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ public sealed class ManagedAuthenticatedEncryptorDescriptorDeserializer : IAuthe
1717
/// <summary>
1818
/// Imports the <see cref="ManagedAuthenticatedEncryptorDescriptor"/> from serialized XML.
1919
/// </summary>
20-
[RequiresUnreferencedCode(TrimmerWarning.Message)]
2120
public IAuthenticatedEncryptorDescriptor ImportFromXml(XElement element)
2221
{
2322
if (element == null)
@@ -48,7 +47,6 @@ public IAuthenticatedEncryptorDescriptor ImportFromXml(XElement element)
4847

4948
// Any changes to this method should also be be reflected
5049
// in ManagedAuthenticatedEncryptorDescriptor.TypeToFriendlyName.
51-
[RequiresUnreferencedCode(TrimmerWarning.Message)]
5250
private static Type FriendlyNameToType(string typeName)
5351
{
5452
if (typeName == nameof(Aes))
@@ -73,7 +71,7 @@ private static Type FriendlyNameToType(string typeName)
7371
}
7472
else
7573
{
76-
return Type.GetType(typeName, throwOnError: true)!;
74+
return TypeExtensions.GetTypeWithTrimFriendlyErrorMessage(typeName);
7775
}
7876
}
7977
}

src/DataProtection/DataProtection/src/EphemeralDataProtectionProvider.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,6 @@ public EphemeralKeyRing(ILoggerFactory loggerFactory)
9595
return (keyId == default(Guid)) ? DefaultAuthenticatedEncryptor : null;
9696
}
9797

98-
[RequiresUnreferencedCode(TrimmerWarning.Message)]
9998
public IKeyRing GetCurrentKeyRing()
10099
{
101100
return this;

src/DataProtection/DataProtection/src/IPersistedDataProtector.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,5 @@ public interface IPersistedDataProtector : IDataProtector
3131
/// Implementations should throw CryptographicException if the protected data is
3232
/// invalid or malformed.
3333
/// </remarks>
34-
[RequiresUnreferencedCode(TrimmerWarning.Message)]
3534
byte[] DangerousUnprotect(byte[] protectedData, bool ignoreRevocationErrors, out bool requiresMigration, out bool wasRevoked);
3635
}

src/DataProtection/DataProtection/src/IRegistryPolicyResolver.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,5 @@ namespace Microsoft.AspNetCore.DataProtection;
1010
// even if it was not registered causing problems crossplat
1111
internal interface IRegistryPolicyResolver
1212
{
13-
[RequiresUnreferencedCode(TrimmerWarning.Message)]
1413
RegistryPolicy? ResolvePolicy();
1514
}

src/DataProtection/DataProtection/src/Internal/IActivator.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,5 @@ public interface IActivator
1616
/// Creates an instance of <paramref name="implementationTypeName"/> and ensures
1717
/// that it is assignable to <paramref name="expectedBaseType"/>.
1818
/// </summary>
19-
[RequiresUnreferencedCode(TrimmerWarning.Message)]
20-
object CreateInstance(Type expectedBaseType, string implementationTypeName);
19+
object CreateInstance([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type expectedBaseType, string implementationTypeName);
2120
}

src/DataProtection/DataProtection/src/KeyManagement/DeferredKey.cs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ namespace Microsoft.AspNetCore.DataProtection.KeyManagement;
1818
/// </summary>
1919
internal sealed class DeferredKey : KeyBase
2020
{
21-
[RequiresUnreferencedCode(TrimmerWarning.Message)]
2221
public DeferredKey(
2322
Guid keyId,
2423
DateTimeOffset creationDate,
@@ -36,7 +35,6 @@ public DeferredKey(
3635
{
3736
}
3837

39-
[RequiresUnreferencedCode(TrimmerWarning.Message)]
4038
private static Func<IAuthenticatedEncryptorDescriptor> GetLazyDescriptorDelegate(IInternalXmlKeyManager keyManager, XElement keyElement)
4139
{
4240
// The <key> element will be held around in memory for a potentially lengthy period
@@ -54,7 +52,6 @@ private static Func<IAuthenticatedEncryptorDescriptor> GetLazyDescriptorDelegate
5452
keyElement = null!;
5553
}
5654

57-
[RequiresUnreferencedCode(TrimmerWarning.Message)]
5855
IAuthenticatedEncryptorDescriptor GetLazyDescriptorDelegate()
5956
{
6057
return keyManager.DeserializeDescriptorFromKeyElement(encryptedKeyElement.ToXElement());

src/DataProtection/DataProtection/src/KeyManagement/IKeyManager.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ public interface IKeyManager
2929
/// Fetches all keys from the underlying repository.
3030
/// </summary>
3131
/// <returns>The collection of all keys.</returns>
32-
[RequiresUnreferencedCode(TrimmerWarning.Message)]
3332
IReadOnlyCollection<IKey> GetAllKeys();
3433

3534
/// <summary>

src/DataProtection/DataProtection/src/KeyManagement/Internal/ICacheableKeyRingProvider.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,5 @@ public interface ICacheableKeyRingProvider
1616
/// This API supports infrastructure and is not intended to be used
1717
/// directly from your code. This API may change or be removed in future releases.
1818
/// </summary>
19-
[RequiresUnreferencedCode(TrimmerWarning.Message)]
2019
CacheableKeyRing GetCacheableKeyRing(DateTimeOffset now);
2120
}

src/DataProtection/DataProtection/src/KeyManagement/Internal/IInternalXmlKeyManager.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ public interface IInternalXmlKeyManager
2424
/// This API supports infrastructure and is not intended to be used
2525
/// directly from your code. This API may change or be removed in future releases.
2626
/// </summary>
27-
[RequiresUnreferencedCode(TrimmerWarning.Message)]
2827
IAuthenticatedEncryptorDescriptor DeserializeDescriptorFromKeyElement(XElement keyElement);
2928

3029
/// <summary>

src/DataProtection/DataProtection/src/KeyManagement/Internal/IKeyRingProvider.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,5 @@ public interface IKeyRingProvider
1515
/// This API supports infrastructure and is not intended to be used
1616
/// directly from your code. This API may change or be removed in future releases.
1717
/// </summary>
18-
[RequiresUnreferencedCode(TrimmerWarning.Message)]
1918
IKeyRing GetCurrentKeyRing();
2019
}

src/DataProtection/DataProtection/src/KeyManagement/KeyRingBasedDataProtector.cs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,6 @@ private static string JoinPurposesForLog(IEnumerable<string> purposes)
7676
}
7777

7878
// allows decrypting payloads whose keys have been revoked
79-
[RequiresUnreferencedCode(TrimmerWarning.Message)]
8079
public byte[] DangerousUnprotect(byte[] protectedData, bool ignoreRevocationErrors, out bool requiresMigration, out bool wasRevoked)
8180
{
8281
// argument & state checking
@@ -92,7 +91,6 @@ public byte[] DangerousUnprotect(byte[] protectedData, bool ignoreRevocationErro
9291
return retVal;
9392
}
9493

95-
[RequiresUnreferencedCode(TrimmerWarning.Message)]
9694
public byte[] Protect(byte[] plaintext)
9795
{
9896
if (plaintext == null)
@@ -182,7 +180,6 @@ private static bool TryGetVersionFromMagicHeader(uint magicHeader, out int versi
182180
}
183181
}
184182

185-
[RequiresUnreferencedCode(TrimmerWarning.Message)]
186183
public byte[] Unprotect(byte[] protectedData)
187184
{
188185
if (protectedData == null)
@@ -197,7 +194,6 @@ public byte[] Unprotect(byte[] protectedData)
197194
wasRevoked: out _);
198195
}
199196

200-
[RequiresUnreferencedCode(TrimmerWarning.Message)]
201197
private byte[] UnprotectCore(byte[] protectedData, bool allowOperationsOnRevokedKeys, out UnprotectStatus status)
202198
{
203199
Debug.Assert(protectedData != null);

src/DataProtection/DataProtection/src/KeyManagement/KeyRingProvider.cs

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@ public KeyRingProvider(
5858

5959
internal bool InAutoRefreshWindow() => DateTime.UtcNow < AutoRefreshWindowEnd;
6060

61-
[RequiresUnreferencedCode(TrimmerWarning.Message)]
6261
private CacheableKeyRing CreateCacheableKeyRingCore(DateTimeOffset now, IKey? keyJustAdded)
6362
{
6463
// Refresh the list of all keys
@@ -146,19 +145,16 @@ private CacheableKeyRing CreateCacheableKeyRingCoreStep2(DateTimeOffset now, Can
146145
allKeys: allKeys);
147146
}
148147

149-
[RequiresUnreferencedCode(TrimmerWarning.Message)]
150148
public IKeyRing GetCurrentKeyRing()
151149
{
152150
return GetCurrentKeyRingCore(DateTime.UtcNow);
153151
}
154152

155-
[RequiresUnreferencedCode(TrimmerWarning.Message)]
156153
internal IKeyRing RefreshCurrentKeyRing()
157154
{
158155
return GetCurrentKeyRingCore(DateTime.UtcNow, forceRefresh: true);
159156
}
160157

161-
[RequiresUnreferencedCode(TrimmerWarning.Message)]
162158
internal IKeyRing GetCurrentKeyRingCore(DateTime utcNow, bool forceRefresh = false)
163159
{
164160
Debug.Assert(utcNow.Kind == DateTimeKind.Utc);
@@ -277,7 +273,6 @@ private static DateTimeOffset Min(DateTimeOffset a, DateTimeOffset b)
277273
return (a < b) ? a : b;
278274
}
279275

280-
[RequiresUnreferencedCode(TrimmerWarning.Message)]
281276
CacheableKeyRing ICacheableKeyRingProvider.GetCacheableKeyRing(DateTimeOffset now)
282277
{
283278
// the entry point allows one recursive call

src/DataProtection/DataProtection/src/KeyManagement/XmlKeyManager.cs

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,6 @@ private static string DateTimeOffsetToFilenameSafeString(DateTimeOffset dateTime
154154
}
155155

156156
/// <inheritdoc/>
157-
[RequiresUnreferencedCode(TrimmerWarning.Message)]
158157
public IReadOnlyCollection<IKey> GetAllKeys()
159158
{
160159
var allElements = KeyRepository.GetAllElements();
@@ -257,7 +256,6 @@ public CancellationToken GetCacheExpirationToken()
257256
return Interlocked.CompareExchange<CancellationTokenSource?>(ref _cacheExpirationTokenSource, null, null).Token;
258257
}
259258

260-
[RequiresUnreferencedCode(TrimmerWarning.Message)]
261259
private KeyBase? ProcessKeyElement(XElement keyElement)
262260
{
263261
Debug.Assert(keyElement.Name == KeyElementName);
@@ -444,7 +442,6 @@ IKey IInternalXmlKeyManager.CreateNewKey(Guid keyId, DateTimeOffset creationDate
444442
encryptorFactories: _encryptorFactories);
445443
}
446444

447-
[RequiresUnreferencedCode(TrimmerWarning.Message)]
448445
IAuthenticatedEncryptorDescriptor IInternalXmlKeyManager.DeserializeDescriptorFromKeyElement(XElement keyElement)
449446
{
450447
try
@@ -455,7 +452,8 @@ IAuthenticatedEncryptorDescriptor IInternalXmlKeyManager.DeserializeDescriptorFr
455452

456453
// Decrypt the descriptor element and pass it to the descriptor for consumption
457454
var unencryptedInputToDeserializer = descriptorElement.Elements().Single().DecryptElement(_activator);
458-
var deserializerInstance = _activator.CreateInstance<IAuthenticatedEncryptorDescriptorDeserializer>(descriptorDeserializerTypeName);
455+
456+
var deserializerInstance = CreateDeserializer(descriptorDeserializerTypeName);
459457
var descriptorInstance = deserializerInstance.ImportFromXml(unencryptedInputToDeserializer);
460458

461459
return descriptorInstance ?? CryptoUtil.Fail<IAuthenticatedEncryptorDescriptor>("ImportFromXml returned null.");
@@ -467,6 +465,34 @@ IAuthenticatedEncryptorDescriptor IInternalXmlKeyManager.DeserializeDescriptorFr
467465
}
468466
}
469467

468+
[UnconditionalSuppressMessage("Trimmer", "IL2057", Justification = "Type.GetType result is only useful with types that are referenced by DataProtection assembly.")]
469+
private IAuthenticatedEncryptorDescriptorDeserializer CreateDeserializer(string descriptorDeserializerTypeName)
470+
{
471+
var resolvedTypeName = TypeForwardingActivator.TryForwardTypeName(descriptorDeserializerTypeName, out var forwardedTypeName)
472+
? forwardedTypeName
473+
: descriptorDeserializerTypeName;
474+
var type = Type.GetType(resolvedTypeName, throwOnError: false);
475+
476+
if (type == typeof(AuthenticatedEncryptorDescriptorDeserializer))
477+
{
478+
return _activator.CreateInstance<AuthenticatedEncryptorDescriptorDeserializer>(descriptorDeserializerTypeName);
479+
}
480+
else if (type == typeof(CngCbcAuthenticatedEncryptorDescriptorDeserializer) && RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
481+
{
482+
return _activator.CreateInstance<CngCbcAuthenticatedEncryptorDescriptorDeserializer>(descriptorDeserializerTypeName);
483+
}
484+
else if (type == typeof(CngGcmAuthenticatedEncryptorDescriptorDeserializer) && RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
485+
{
486+
return _activator.CreateInstance<CngGcmAuthenticatedEncryptorDescriptorDeserializer>(descriptorDeserializerTypeName);
487+
}
488+
else if (type == typeof(ManagedAuthenticatedEncryptorDescriptorDeserializer))
489+
{
490+
return _activator.CreateInstance<ManagedAuthenticatedEncryptorDescriptorDeserializer>(descriptorDeserializerTypeName);
491+
}
492+
493+
return _activator.CreateInstance<IAuthenticatedEncryptorDescriptorDeserializer>(descriptorDeserializerTypeName);
494+
}
495+
470496
void IInternalXmlKeyManager.RevokeSingleKey(Guid keyId, DateTimeOffset revocationDate, string? reason)
471497
{
472498
// <revocation version="1">

src/DataProtection/DataProtection/src/RegistryPolicyResolver.cs

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ internal RegistryPolicyResolver(RegistryKey policyRegKey, IActivator activator)
3737
_activator = activator;
3838
}
3939

40-
[RequiresUnreferencedCode(TrimmerWarning.Message)]
4140
private static List<string> ReadKeyEscrowSinks(RegistryKey key)
4241
{
4342
var sinks = new List<string>();
@@ -52,7 +51,7 @@ private static List<string> ReadKeyEscrowSinks(RegistryKey key)
5251
var candidate = sinkFromRegistry.Trim();
5352
if (!string.IsNullOrEmpty(candidate))
5453
{
55-
typeof(IKeyEscrowSink).AssertIsAssignableFrom(Type.GetType(candidate, throwOnError: true)!);
54+
typeof(IKeyEscrowSink).AssertIsAssignableFrom(TypeExtensions.GetTypeWithTrimFriendlyErrorMessage(candidate));
5655
sinks.Add(candidate);
5756
}
5857
}
@@ -61,7 +60,6 @@ private static List<string> ReadKeyEscrowSinks(RegistryKey key)
6160
return sinks;
6261
}
6362

64-
[RequiresUnreferencedCode(TrimmerWarning.Message)]
6563
public RegistryPolicy? ResolvePolicy()
6664
{
6765
using (var registryKey = _getPolicyRegKey())
@@ -70,7 +68,6 @@ private static List<string> ReadKeyEscrowSinks(RegistryKey key)
7068
}
7169
}
7270

73-
[RequiresUnreferencedCode(TrimmerWarning.Message)]
7471
private RegistryPolicy? ResolvePolicyCore(RegistryKey? policyRegKey)
7572
{
7673
if (policyRegKey == null)
@@ -174,14 +171,13 @@ private static CngGcmAuthenticatedEncryptorConfiguration GetCngGcmAuthenticatedE
174171
return options;
175172
}
176173

177-
[RequiresUnreferencedCode(TrimmerWarning.Message)]
178174
private static ManagedAuthenticatedEncryptorConfiguration GetManagedAuthenticatedEncryptorConfiguration(RegistryKey key)
179175
{
180176
var options = new ManagedAuthenticatedEncryptorConfiguration();
181177
var valueFromRegistry = key.GetValue(nameof(ManagedAuthenticatedEncryptorConfiguration.EncryptionAlgorithmType));
182178
if (valueFromRegistry != null)
183179
{
184-
options.EncryptionAlgorithmType = Type.GetType(Convert.ToString(valueFromRegistry, CultureInfo.InvariantCulture)!, throwOnError: true)!;
180+
options.EncryptionAlgorithmType = TypeExtensions.GetTypeWithTrimFriendlyErrorMessage(Convert.ToString(valueFromRegistry, CultureInfo.InvariantCulture)!);
185181
}
186182

187183
valueFromRegistry = key.GetValue(nameof(ManagedAuthenticatedEncryptorConfiguration.EncryptionAlgorithmKeySize));
@@ -193,7 +189,7 @@ private static ManagedAuthenticatedEncryptorConfiguration GetManagedAuthenticate
193189
valueFromRegistry = key.GetValue(nameof(ManagedAuthenticatedEncryptorConfiguration.ValidationAlgorithmType));
194190
if (valueFromRegistry != null)
195191
{
196-
options.ValidationAlgorithmType = Type.GetType(Convert.ToString(valueFromRegistry, CultureInfo.InvariantCulture)!, throwOnError: true)!;
192+
options.ValidationAlgorithmType = TypeExtensions.GetTypeWithTrimFriendlyErrorMessage(Convert.ToString(valueFromRegistry, CultureInfo.InvariantCulture)!);
197193
}
198194

199195
return options;

src/DataProtection/DataProtection/src/SimpleActivator.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,12 @@ public SimpleActivator(IServiceProvider? services)
2727
_services = services;
2828
}
2929

30-
[RequiresUnreferencedCode(TrimmerWarning.Message)]
31-
public virtual object CreateInstance(Type expectedBaseType, string implementationTypeName)
30+
[UnconditionalSuppressMessage("Trimmer", "IL2072", Justification = "Unknown type names are rarely used by apps. Handle trimmed types by providing a useful error message.")]
31+
[UnconditionalSuppressMessage("Trimmer", "IL2075", Justification = "Unknown type names are rarely used by apps. Handle trimmed types by providing a useful error message.")]
32+
public virtual object CreateInstance([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type expectedBaseType, string implementationTypeName)
3233
{
3334
// Would the assignment even work?
34-
var implementationType = Type.GetType(implementationTypeName, throwOnError: true)!;
35+
var implementationType = TypeExtensions.GetTypeWithTrimFriendlyErrorMessage(implementationTypeName);
3536
expectedBaseType.AssertIsAssignableFrom(implementationType);
3637

3738
// If no IServiceProvider was specified, prefer .ctor() [if it exists]

0 commit comments

Comments
 (0)