6bdd276d05
Former-commit-id: fd56571888259555122d8a0f58c68838229cea2b
123 lines
3.8 KiB
C#
123 lines
3.8 KiB
C#
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
|
|
using Mono.Linker;
|
|
using Mono.Linker.Steps;
|
|
|
|
using Mono.Cecil;
|
|
using Mono.Cecil.Cil;
|
|
|
|
namespace Mono.Tuner {
|
|
|
|
public class PreserveCrypto : IStep {
|
|
|
|
AnnotationStore annotations;
|
|
|
|
public void Process (LinkContext context)
|
|
{
|
|
annotations = context.Annotations;
|
|
|
|
ProcessCorlib (context);
|
|
ProcessSystemCore (context);
|
|
}
|
|
|
|
void ProcessCorlib (LinkContext context)
|
|
{
|
|
AssemblyDefinition corlib;
|
|
if (!context.TryGetLinkedAssembly ("mscorlib", out corlib))
|
|
return;
|
|
|
|
AddPreserveInfo (corlib, "DES", "DESCryptoServiceProvider");
|
|
AddPreserveInfo (corlib, "DSA", "DSACryptoServiceProvider");
|
|
AddPreserveInfo (corlib, "RandomNumberGenerator", "RNGCryptoServiceProvider");
|
|
AddPreserveInfo (corlib, "SHA1", "SHA1CryptoServiceProvider");
|
|
AddPreserveInfo (corlib, "SHA1", "SHA1Managed");
|
|
AddPreserveInfo (corlib, "MD5", "MD5CryptoServiceProvider");
|
|
AddPreserveInfo (corlib, "RC2", "RC2CryptoServiceProvider");
|
|
AddPreserveInfo (corlib, "TripleDES", "TripleDESCryptoServiceProvider");
|
|
|
|
AddPreserveInfo (corlib, "Rijndael", "RijndaelManaged");
|
|
AddPreserveInfo (corlib, "RIPEMD160", "RIPEMD160Managed");
|
|
AddPreserveInfo (corlib, "SHA256", "SHA256Managed");
|
|
AddPreserveInfo (corlib, "SHA384", "SHA384Managed");
|
|
AddPreserveInfo (corlib, "SHA512", "SHA512Managed");
|
|
|
|
AddPreserveInfo (corlib, "HMAC", "HMACMD5");
|
|
AddPreserveInfo (corlib, "HMAC", "HMACRIPEMD160");
|
|
AddPreserveInfo (corlib, "HMAC", "HMACSHA1");
|
|
AddPreserveInfo (corlib, "HMAC", "HMACSHA256");
|
|
AddPreserveInfo (corlib, "HMAC", "HMACSHA384");
|
|
AddPreserveInfo (corlib, "HMAC", "HMACSHA512");
|
|
|
|
AddPreserveInfo (corlib, "HMACMD5", "MD5CryptoServiceProvider");
|
|
AddPreserveInfo (corlib, "HMACRIPEMD160", "RIPEMD160Managed");
|
|
AddPreserveInfo (corlib, "HMACSHA1", "SHA1CryptoServiceProvider");
|
|
AddPreserveInfo (corlib, "HMACSHA1", "SHA1Managed");
|
|
AddPreserveInfo (corlib, "HMACSHA256", "SHA256Managed");
|
|
AddPreserveInfo (corlib, "HMACSHA384", "SHA384Managed");
|
|
AddPreserveInfo (corlib, "HMACSHA512", "SHA512Managed");
|
|
|
|
TryAddPreserveInfo (corlib, "Aes", "AesManaged");
|
|
|
|
var corlibAes = GetCryptoType (corlib, "Aes");
|
|
Preserve (corlibAes, GetCryptoType (corlib, "AesManaged"));
|
|
|
|
AssemblyDefinition syscore;
|
|
if (context.TryGetLinkedAssembly ("System.Core", out syscore))
|
|
Preserve (corlibAes, GetCryptoType (syscore, "AesCryptoServiceProvider"));
|
|
}
|
|
|
|
void ProcessSystemCore (LinkContext context)
|
|
{
|
|
AssemblyDefinition syscore;
|
|
if (!context.TryGetLinkedAssembly ("System.Core", out syscore))
|
|
return;
|
|
|
|
// AddPreserveInfo (syscore, "Aes", "AesCryptoServiceProvider");
|
|
TryAddPreserveInfo (syscore, "Aes", "AesManaged");
|
|
}
|
|
|
|
bool TryAddPreserveInfo (AssemblyDefinition assembly, string name, string type)
|
|
{
|
|
var marker = GetCryptoType (assembly, name);
|
|
if (marker == null)
|
|
return false;
|
|
|
|
var implementation = GetCryptoType (assembly, type);
|
|
if (implementation == null)
|
|
return false;
|
|
|
|
Preserve (marker, implementation);
|
|
return true;
|
|
}
|
|
|
|
void AddPreserveInfo (AssemblyDefinition assembly, string name, string type)
|
|
{
|
|
var marker = GetCryptoType (assembly, name);
|
|
if (marker == null)
|
|
throw new ArgumentException (name);
|
|
|
|
var implementation = GetCryptoType (assembly, type);
|
|
if (implementation == null)
|
|
throw new ArgumentException (type);
|
|
|
|
Preserve (marker, implementation);
|
|
}
|
|
|
|
void Preserve (TypeDefinition marker, TypeDefinition implementation)
|
|
{
|
|
if (marker == null || implementation == null)
|
|
return;
|
|
foreach (var constructor in implementation.GetConstructors ())
|
|
annotations.AddPreservedMethod (marker, constructor);
|
|
}
|
|
|
|
TypeDefinition GetCryptoType (AssemblyDefinition assembly, string name)
|
|
{
|
|
return assembly.MainModule.GetType ("System.Security.Cryptography." + name);
|
|
}
|
|
}
|
|
}
|