From 73d407f99049214e0355961c5576b0dcf19fca0c Mon Sep 17 00:00:00 2001 From: Jonathan Peppers Date: Fri, 25 Oct 2019 11:30:43 -0400 Subject: [PATCH] [Java.Interop.Tools.JavaCallableWrappers] remove all usage of MD5 Fixes: https://github.com/xamarin/xamarin-android/issues/3844 This adds `[Obsolete]` (with `error:true`) to: * `PackageNamingPolicy.LowercaseHash` * `PackageNamingPolicy.LowercaseMD5` If these values are encountered at runtime a `NotSupportedException` will be thrown. Most of the remaining changes were updates to tests. Upstream in xamarin/xamarin-android, we will likely need to emit a new build error with an error code. Other changes: * I removed a place `BaseGeneratorTest.cs` was using `MD5.Create()`. * This exposed a place we need to reset the initial state of `Crc64` when an instance is reused for hashing. --- .../Crc64.cs | 6 +++- .../JavaCallableWrapperGeneratorTests.cs | 14 ++++---- .../JavaNativeTypeManagerTests.cs | 7 ---- .../TypeNameMapGeneratorTests.cs | 32 +++++++++---------- .../JavaNativeTypeManager.cs | 15 +++------ .../Integration-Tests/BaseGeneratorTest.cs | 17 +++++----- tools/generator/Tests/generator-Tests.csproj | 4 +++ 7 files changed, 46 insertions(+), 49 deletions(-) diff --git a/src/Java.Interop.Tools.JavaCallableWrappers/Java.Interop.Tools.JavaCallableWrappers/Crc64.cs b/src/Java.Interop.Tools.JavaCallableWrappers/Java.Interop.Tools.JavaCallableWrappers/Crc64.cs index 2b7078d95..803583152 100644 --- a/src/Java.Interop.Tools.JavaCallableWrappers/Java.Interop.Tools.JavaCallableWrappers/Crc64.cs +++ b/src/Java.Interop.Tools.JavaCallableWrappers/Java.Interop.Tools.JavaCallableWrappers/Crc64.cs @@ -176,7 +176,11 @@ public class Crc64 : HashAlgorithm ulong crc = ulong.MaxValue; ulong length = 0; - public override void Initialize () { } + public override void Initialize () + { + crc = ulong.MaxValue; + length = 0; + } protected override void HashCore (byte [] array, int ibStart, int cbSize) { diff --git a/src/Java.Interop.Tools.JavaCallableWrappers/Test/Java.Interop.Tools.JavaCallableWrappers/JavaCallableWrapperGeneratorTests.cs b/src/Java.Interop.Tools.JavaCallableWrappers/Test/Java.Interop.Tools.JavaCallableWrappers/JavaCallableWrapperGeneratorTests.cs index 6a1a5ab34..2bc2bd2ed 100644 --- a/src/Java.Interop.Tools.JavaCallableWrappers/Test/Java.Interop.Tools.JavaCallableWrappers/JavaCallableWrapperGeneratorTests.cs +++ b/src/Java.Interop.Tools.JavaCallableWrappers/Test/Java.Interop.Tools.JavaCallableWrappers/JavaCallableWrapperGeneratorTests.cs @@ -102,7 +102,7 @@ public void GenerateIndirectApplication ( ) { var actual = Generate (typeof (IndirectApplication), applicationJavaClass); - var expected = @"package md5f43cdfade412ae71b21bb70a5c2841ab; + var expected = @"package crc64197ae30a36756915; public class IndirectApplication @@ -153,7 +153,7 @@ public void monodroidClearReferences () public void GenerateExportedMembers () { var actual = Generate (typeof (ExportsMembers)); - var expected = @"package md5f43cdfade412ae71b21bb70a5c2841ab; + var expected = @"package crc64197ae30a36756915; public class ExportsMembers @@ -165,7 +165,7 @@ extends java.lang.Object public static final String __md_methods; static { __md_methods = - ""n_GetInstance:()Lmd5f43cdfade412ae71b21bb70a5c2841ab/ExportsMembers;:__export__\n"" + + ""n_GetInstance:()Lcrc64197ae30a36756915/ExportsMembers;:__export__\n"" + ""n_GetValue:()Ljava/lang/String;:__export__\n"" + ""n_methodNamesNotMangled:()V:__export__\n"" + ""n_CompletelyDifferentName:(Ljava/lang/String;I)Ljava/lang/String;:__export__\n"" + @@ -176,17 +176,17 @@ extends java.lang.Object } - public static md5f43cdfade412ae71b21bb70a5c2841ab.ExportsMembers STATIC_INSTANCE = GetInstance (); + public static crc64197ae30a36756915.ExportsMembers STATIC_INSTANCE = GetInstance (); public java.lang.String VALUE = GetValue (); - public static md5f43cdfade412ae71b21bb70a5c2841ab.ExportsMembers GetInstance () + public static crc64197ae30a36756915.ExportsMembers GetInstance () { return n_GetInstance (); } - private static native md5f43cdfade412ae71b21bb70a5c2841ab.ExportsMembers n_GetInstance (); + private static native crc64197ae30a36756915.ExportsMembers n_GetInstance (); public java.lang.String GetValue () { @@ -249,7 +249,7 @@ public void monodroidClearReferences () public void GenerateInnerClass () { var actual = Generate (typeof (ExampleOuterClass)); - var expected = @"package md5f43cdfade412ae71b21bb70a5c2841ab; + var expected = @"package crc64197ae30a36756915; public class ExampleOuterClass diff --git a/src/Java.Interop.Tools.JavaCallableWrappers/Test/Java.Interop.Tools.JavaCallableWrappers/JavaNativeTypeManagerTests.cs b/src/Java.Interop.Tools.JavaCallableWrappers/Test/Java.Interop.Tools.JavaCallableWrappers/JavaNativeTypeManagerTests.cs index ba3df1c08..aca492e74 100644 --- a/src/Java.Interop.Tools.JavaCallableWrappers/Test/Java.Interop.Tools.JavaCallableWrappers/JavaNativeTypeManagerTests.cs +++ b/src/Java.Interop.Tools.JavaCallableWrappers/Test/Java.Interop.Tools.JavaCallableWrappers/JavaNativeTypeManagerTests.cs @@ -25,13 +25,6 @@ public void TearDown () JavaNativeTypeManager.PackageNamingPolicy = existingValue; } - [Test] - public void MD5 () - { - JavaNativeTypeManager.PackageNamingPolicy = PackageNamingPolicy.LowercaseMD5; - Assert.AreEqual ("md5acb69d261d9efeb0927dd7ff443b9a3a", JavaNativeTypeManager.GetPackageName (typeof (string))); - } - [Test] public void Crc64 () { diff --git a/src/Java.Interop.Tools.JavaCallableWrappers/Test/Java.Interop.Tools.JavaCallableWrappers/TypeNameMapGeneratorTests.cs b/src/Java.Interop.Tools.JavaCallableWrappers/Test/Java.Interop.Tools.JavaCallableWrappers/TypeNameMapGeneratorTests.cs index 99ec63fb0..9440583cd 100644 --- a/src/Java.Interop.Tools.JavaCallableWrappers/Test/Java.Interop.Tools.JavaCallableWrappers/TypeNameMapGeneratorTests.cs +++ b/src/Java.Interop.Tools.JavaCallableWrappers/Test/Java.Interop.Tools.JavaCallableWrappers/TypeNameMapGeneratorTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; @@ -50,8 +50,8 @@ public void WriteJavaToManaged () v.WriteJavaToManaged (o); var a = ToArray (o); Save (a, "__j2m"); - var length = 204; - var offset = 90; + var length = 190; + var offset = 76; var e = "version=1\u0000" + $"entry-count={types.Count - 1}\u0000" + @@ -59,13 +59,13 @@ public void WriteJavaToManaged () "value-offset=" + offset + "\u0000" + GetJ2MEntryLine (typeof (ActivityName), "activity/Name", offset, length) + GetJ2MEntryLine (typeof (ApplicationName), "application/Name", offset, length) + + GetJ2MEntryLine (typeof (DefaultName), "crc64197ae30a36756915/DefaultName", offset, length) + + GetJ2MEntryLine (typeof (DefaultName.A), "crc64197ae30a36756915/DefaultName_A", offset, length) + + GetJ2MEntryLine (typeof (DefaultName.A.B), "crc64197ae30a36756915/DefaultName_A_B", offset, length) + + GetJ2MEntryLine (typeof (DefaultName.C.D), "crc64197ae30a36756915/DefaultName_C_D", offset, length) + + GetJ2MEntryLine (typeof (ExampleOuterClass), "crc64197ae30a36756915/ExampleOuterClass", offset, length) + + GetJ2MEntryLine (typeof (ExampleOuterClass.ExampleInnerClass), "crc64197ae30a36756915/ExampleOuterClass$ExampleOuterClass_ExampleInnerClass", offset, length) + GetJ2MEntryLine (typeof (InstrumentationName), "instrumentation/Name", offset, length) + - GetJ2MEntryLine (typeof (DefaultName), "md5f43cdfade412ae71b21bb70a5c2841ab/DefaultName", offset, length) + - GetJ2MEntryLine (typeof (DefaultName.A), "md5f43cdfade412ae71b21bb70a5c2841ab/DefaultName_A", offset, length) + - GetJ2MEntryLine (typeof (DefaultName.A.B), "md5f43cdfade412ae71b21bb70a5c2841ab/DefaultName_A_B", offset, length) + - GetJ2MEntryLine (typeof (DefaultName.C.D), "md5f43cdfade412ae71b21bb70a5c2841ab/DefaultName_C_D", offset, length) + - GetJ2MEntryLine (typeof (ExampleOuterClass), "md5f43cdfade412ae71b21bb70a5c2841ab/ExampleOuterClass", offset, length) + - GetJ2MEntryLine (typeof (ExampleOuterClass.ExampleInnerClass), "md5f43cdfade412ae71b21bb70a5c2841ab/ExampleOuterClass$ExampleOuterClass_ExampleInnerClass", offset, length) + GetJ2MEntryLine (typeof (AbstractClass), "my/AbstractClass", offset, length) + GetJ2MEntryLine (typeof (ExampleActivity), "my/ExampleActivity", offset, length) + GetJ2MEntryLine (typeof (ExampleInstrumentation), "my/ExampleInstrumentation", offset, length) + @@ -128,7 +128,7 @@ public void WriteManagedToJava () v.WriteManagedToJava (o); var a = ToArray (o); Save (a, "__m2j"); - var length = 204; + var length = 190; var offset = 114; var e = "version=1\u0000" + @@ -139,14 +139,14 @@ public void WriteManagedToJava () GetM2JEntryLine (typeof (AbstractClassInvoker), "my/AbstractClass", offset, length) + GetM2JEntryLine (typeof (ActivityName), "activity/Name", offset, length) + GetM2JEntryLine (typeof (ApplicationName), "application/Name", offset, length) + - GetM2JEntryLine (typeof (DefaultName.A.B), "md5f43cdfade412ae71b21bb70a5c2841ab/DefaultName_A_B", offset, length) + - GetM2JEntryLine (typeof (DefaultName.A), "md5f43cdfade412ae71b21bb70a5c2841ab/DefaultName_A", offset, length) + - GetM2JEntryLine (typeof (DefaultName.C.D), "md5f43cdfade412ae71b21bb70a5c2841ab/DefaultName_C_D", offset, length) + - GetM2JEntryLine (typeof (DefaultName), "md5f43cdfade412ae71b21bb70a5c2841ab/DefaultName", offset, length) + + GetM2JEntryLine (typeof (DefaultName.A.B), "crc64197ae30a36756915/DefaultName_A_B", offset, length) + + GetM2JEntryLine (typeof (DefaultName.A), "crc64197ae30a36756915/DefaultName_A", offset, length) + + GetM2JEntryLine (typeof (DefaultName.C.D), "crc64197ae30a36756915/DefaultName_C_D", offset, length) + + GetM2JEntryLine (typeof (DefaultName), "crc64197ae30a36756915/DefaultName", offset, length) + GetM2JEntryLine (typeof (ExampleActivity), "my/ExampleActivity", offset, length) + GetM2JEntryLine (typeof (ExampleInstrumentation), "my/ExampleInstrumentation", offset, length) + - GetM2JEntryLine (typeof (ExampleOuterClass.ExampleInnerClass), "md5f43cdfade412ae71b21bb70a5c2841ab/ExampleOuterClass$ExampleOuterClass_ExampleInnerClass", offset, length) + - GetM2JEntryLine (typeof (ExampleOuterClass), "md5f43cdfade412ae71b21bb70a5c2841ab/ExampleOuterClass", offset, length) + + GetM2JEntryLine (typeof (ExampleOuterClass.ExampleInnerClass), "crc64197ae30a36756915/ExampleOuterClass$ExampleOuterClass_ExampleInnerClass", offset, length) + + GetM2JEntryLine (typeof (ExampleOuterClass), "crc64197ae30a36756915/ExampleOuterClass", offset, length) + GetM2JEntryLine (typeof (InstrumentationName), "instrumentation/Name", offset, length) + GetM2JEntryLine (typeof (NonStaticOuterClass.NonStaticInnerClass), "register/NonStaticOuterClass$NonStaticInnerClass", offset, length) + GetM2JEntryLine (typeof (NonStaticOuterClass), "register/NonStaticOuterClass", offset, length) + diff --git a/src/Java.Interop.Tools.TypeNameMappings/Java.Interop.Tools.TypeNameMappings/JavaNativeTypeManager.cs b/src/Java.Interop.Tools.TypeNameMappings/Java.Interop.Tools.TypeNameMappings/JavaNativeTypeManager.cs index 758c08a85..41ea7cd22 100644 --- a/src/Java.Interop.Tools.TypeNameMappings/Java.Interop.Tools.TypeNameMappings/JavaNativeTypeManager.cs +++ b/src/Java.Interop.Tools.TypeNameMappings/Java.Interop.Tools.TypeNameMappings/JavaNativeTypeManager.cs @@ -19,12 +19,11 @@ namespace Java.Interop.Tools.TypeNameMappings public #endif enum PackageNamingPolicy { - /// - /// A hashed package name, currently defaults to LowercaseMD5 - /// + [Obsolete ("No longer supported. Use PackageNamingPolicy.LowercaseCrc64 instead.", error: true)] LowercaseHash = 0, Lowercase = 1, LowercaseWithAssemblyName = 2, + [Obsolete ("No longer supported. Use PackageNamingPolicy.LowercaseCrc64 instead.", error: true)] LowercaseMD5 = LowercaseHash, LowercaseCrc64 = 3, } @@ -43,7 +42,7 @@ class JniTypeName #endif static class JavaNativeTypeManager { - public static PackageNamingPolicy PackageNamingPolicy { get; set; } + public static PackageNamingPolicy PackageNamingPolicy { get; set; } = PackageNamingPolicy.LowercaseCrc64; public static string ApplicationJavaClass { get; set; } @@ -203,10 +202,8 @@ public static string GetPackageName (Type type) case PackageNamingPolicy.LowercaseCrc64: using (var crc = new Crc64 ()) return "crc64" + ToHash (type.Namespace + ":" + assemblyName, crc); - case PackageNamingPolicy.LowercaseMD5: default: - using (var md5 = MD5.Create ()) - return "md5" + ToHash (type.Namespace + ":" + assemblyName, md5); + throw new NotSupportedException ($"PackageNamingPolicy.{PackageNamingPolicy} is no longer supported."); } } @@ -528,10 +525,8 @@ public static string GetPackageName (TypeDefinition type) case PackageNamingPolicy.LowercaseCrc64: using (var crc = new Crc64 ()) return "crc64" + ToHash (type.Namespace + ":" + type.GetPartialAssemblyName (), crc); - case PackageNamingPolicy.LowercaseMD5: default: - using (var md5 = MD5.Create ()) - return "md5" + ToHash (type.Namespace + ":" + type.GetPartialAssemblyName (), md5); + throw new NotSupportedException ($"PackageNamingPolicy.{PackageNamingPolicy} is no longer supported."); } } #endif diff --git a/tools/generator/Tests/Integration-Tests/BaseGeneratorTest.cs b/tools/generator/Tests/Integration-Tests/BaseGeneratorTest.cs index 28a5dcb56..db7294331 100644 --- a/tools/generator/Tests/Integration-Tests/BaseGeneratorTest.cs +++ b/tools/generator/Tests/Integration-Tests/BaseGeneratorTest.cs @@ -1,11 +1,11 @@ -using System; -using System.Linq; +using System; +using System.Collections.Generic; using System.IO; +using System.Linq; using System.Reflection; -using System.Security.Cryptography; +using Java.Interop.Tools.JavaCallableWrappers; using NUnit.Framework; using Xamarin.Android.Binder; -using System.Collections.Generic; namespace generatortests { @@ -93,10 +93,11 @@ protected bool FileCompare (string file1, string file2) byte[] f1 = ReadAllBytesIgnoringLineEndings (file1); byte[] f2 = ReadAllBytesIgnoringLineEndings (file2); - var hash = MD5.Create (); - var f1hash = Convert.ToBase64String (hash.ComputeHash (f1)); - var f2hash = Convert.ToBase64String (hash.ComputeHash (f2)); - result = f1hash.Equals (f2hash); + using (var hash = new Crc64 ()) { + var f1hash = Convert.ToBase64String (hash.ComputeHash (f1)); + var f2hash = Convert.ToBase64String (hash.ComputeHash (f2)); + result = f1hash.Equals (f2hash); + } } return result; diff --git a/tools/generator/Tests/generator-Tests.csproj b/tools/generator/Tests/generator-Tests.csproj index 68a150222..58d073b8e 100644 --- a/tools/generator/Tests/generator-Tests.csproj +++ b/tools/generator/Tests/generator-Tests.csproj @@ -86,6 +86,10 @@ + + {D18FCF91-8876-48A0-A693-2DC1E7D3D80A} + Java.Interop.Tools.JavaCallableWrappers + {D14A1B5C-2060-4930-92BE-F7190256C735} generator