Skip to content

Commit baf43b0

Browse files
jonathanpeppersjonpryor
authored andcommitted
[Java.Interop.Tools.JavaCallableWrappers] remove all usage of MD5 (#510)
Context: dotnet/android#3844 Context: dotnet/android@88a1d6c Entirely remove support for MD5 output, so that we can reliably use Xamarin.Android on machines with FIPS enalbed. This adds `[Obsolete (..., 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.
1 parent 10ba45a commit baf43b0

File tree

7 files changed

+46
-49
lines changed

7 files changed

+46
-49
lines changed

src/Java.Interop.Tools.JavaCallableWrappers/Java.Interop.Tools.JavaCallableWrappers/Crc64.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,11 @@ public class Crc64 : HashAlgorithm
176176
ulong crc = ulong.MaxValue;
177177
ulong length = 0;
178178

179-
public override void Initialize () { }
179+
public override void Initialize ()
180+
{
181+
crc = ulong.MaxValue;
182+
length = 0;
183+
}
180184

181185
protected override void HashCore (byte [] array, int ibStart, int cbSize)
182186
{

src/Java.Interop.Tools.JavaCallableWrappers/Test/Java.Interop.Tools.JavaCallableWrappers/JavaCallableWrapperGeneratorTests.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ public void GenerateIndirectApplication (
102102
)
103103
{
104104
var actual = Generate (typeof (IndirectApplication), applicationJavaClass);
105-
var expected = @"package md5f43cdfade412ae71b21bb70a5c2841ab;
105+
var expected = @"package crc64197ae30a36756915;
106106
107107
108108
public class IndirectApplication
@@ -153,7 +153,7 @@ public void monodroidClearReferences ()
153153
public void GenerateExportedMembers ()
154154
{
155155
var actual = Generate (typeof (ExportsMembers));
156-
var expected = @"package md5f43cdfade412ae71b21bb70a5c2841ab;
156+
var expected = @"package crc64197ae30a36756915;
157157
158158
159159
public class ExportsMembers
@@ -165,7 +165,7 @@ extends java.lang.Object
165165
public static final String __md_methods;
166166
static {
167167
__md_methods =
168-
""n_GetInstance:()Lmd5f43cdfade412ae71b21bb70a5c2841ab/ExportsMembers;:__export__\n"" +
168+
""n_GetInstance:()Lcrc64197ae30a36756915/ExportsMembers;:__export__\n"" +
169169
""n_GetValue:()Ljava/lang/String;:__export__\n"" +
170170
""n_methodNamesNotMangled:()V:__export__\n"" +
171171
""n_CompletelyDifferentName:(Ljava/lang/String;I)Ljava/lang/String;:__export__\n"" +
@@ -176,17 +176,17 @@ extends java.lang.Object
176176
}
177177
178178
179-
public static md5f43cdfade412ae71b21bb70a5c2841ab.ExportsMembers STATIC_INSTANCE = GetInstance ();
179+
public static crc64197ae30a36756915.ExportsMembers STATIC_INSTANCE = GetInstance ();
180180
181181
182182
public java.lang.String VALUE = GetValue ();
183183
184-
public static md5f43cdfade412ae71b21bb70a5c2841ab.ExportsMembers GetInstance ()
184+
public static crc64197ae30a36756915.ExportsMembers GetInstance ()
185185
{
186186
return n_GetInstance ();
187187
}
188188
189-
private static native md5f43cdfade412ae71b21bb70a5c2841ab.ExportsMembers n_GetInstance ();
189+
private static native crc64197ae30a36756915.ExportsMembers n_GetInstance ();
190190
191191
public java.lang.String GetValue ()
192192
{
@@ -249,7 +249,7 @@ public void monodroidClearReferences ()
249249
public void GenerateInnerClass ()
250250
{
251251
var actual = Generate (typeof (ExampleOuterClass));
252-
var expected = @"package md5f43cdfade412ae71b21bb70a5c2841ab;
252+
var expected = @"package crc64197ae30a36756915;
253253
254254
255255
public class ExampleOuterClass

src/Java.Interop.Tools.JavaCallableWrappers/Test/Java.Interop.Tools.JavaCallableWrappers/JavaNativeTypeManagerTests.cs

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,6 @@ public void TearDown ()
2525
JavaNativeTypeManager.PackageNamingPolicy = existingValue;
2626
}
2727

28-
[Test]
29-
public void MD5 ()
30-
{
31-
JavaNativeTypeManager.PackageNamingPolicy = PackageNamingPolicy.LowercaseMD5;
32-
Assert.AreEqual ("md5acb69d261d9efeb0927dd7ff443b9a3a", JavaNativeTypeManager.GetPackageName (typeof (string)));
33-
}
34-
3528
[Test]
3629
public void Crc64 ()
3730
{

src/Java.Interop.Tools.JavaCallableWrappers/Test/Java.Interop.Tools.JavaCallableWrappers/TypeNameMapGeneratorTests.cs

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using System;
1+
using System;
22
using System.Collections.Generic;
33
using System.Diagnostics;
44
using System.IO;
@@ -50,22 +50,22 @@ public void WriteJavaToManaged ()
5050
v.WriteJavaToManaged (o);
5151
var a = ToArray (o);
5252
Save (a, "__j2m");
53-
var length = 204;
54-
var offset = 90;
53+
var length = 190;
54+
var offset = 76;
5555
var e =
5656
"version=1\u0000" +
5757
$"entry-count={types.Count - 1}\u0000" +
5858
"entry-len=" + length + "\u0000" +
5959
"value-offset=" + offset + "\u0000" +
6060
GetJ2MEntryLine (typeof (ActivityName), "activity/Name", offset, length) +
6161
GetJ2MEntryLine (typeof (ApplicationName), "application/Name", offset, length) +
62+
GetJ2MEntryLine (typeof (DefaultName), "crc64197ae30a36756915/DefaultName", offset, length) +
63+
GetJ2MEntryLine (typeof (DefaultName.A), "crc64197ae30a36756915/DefaultName_A", offset, length) +
64+
GetJ2MEntryLine (typeof (DefaultName.A.B), "crc64197ae30a36756915/DefaultName_A_B", offset, length) +
65+
GetJ2MEntryLine (typeof (DefaultName.C.D), "crc64197ae30a36756915/DefaultName_C_D", offset, length) +
66+
GetJ2MEntryLine (typeof (ExampleOuterClass), "crc64197ae30a36756915/ExampleOuterClass", offset, length) +
67+
GetJ2MEntryLine (typeof (ExampleOuterClass.ExampleInnerClass), "crc64197ae30a36756915/ExampleOuterClass$ExampleOuterClass_ExampleInnerClass", offset, length) +
6268
GetJ2MEntryLine (typeof (InstrumentationName), "instrumentation/Name", offset, length) +
63-
GetJ2MEntryLine (typeof (DefaultName), "md5f43cdfade412ae71b21bb70a5c2841ab/DefaultName", offset, length) +
64-
GetJ2MEntryLine (typeof (DefaultName.A), "md5f43cdfade412ae71b21bb70a5c2841ab/DefaultName_A", offset, length) +
65-
GetJ2MEntryLine (typeof (DefaultName.A.B), "md5f43cdfade412ae71b21bb70a5c2841ab/DefaultName_A_B", offset, length) +
66-
GetJ2MEntryLine (typeof (DefaultName.C.D), "md5f43cdfade412ae71b21bb70a5c2841ab/DefaultName_C_D", offset, length) +
67-
GetJ2MEntryLine (typeof (ExampleOuterClass), "md5f43cdfade412ae71b21bb70a5c2841ab/ExampleOuterClass", offset, length) +
68-
GetJ2MEntryLine (typeof (ExampleOuterClass.ExampleInnerClass), "md5f43cdfade412ae71b21bb70a5c2841ab/ExampleOuterClass$ExampleOuterClass_ExampleInnerClass", offset, length) +
6969
GetJ2MEntryLine (typeof (AbstractClass), "my/AbstractClass", offset, length) +
7070
GetJ2MEntryLine (typeof (ExampleActivity), "my/ExampleActivity", offset, length) +
7171
GetJ2MEntryLine (typeof (ExampleInstrumentation), "my/ExampleInstrumentation", offset, length) +
@@ -128,7 +128,7 @@ public void WriteManagedToJava ()
128128
v.WriteManagedToJava (o);
129129
var a = ToArray (o);
130130
Save (a, "__m2j");
131-
var length = 204;
131+
var length = 190;
132132
var offset = 114;
133133
var e =
134134
"version=1\u0000" +
@@ -139,14 +139,14 @@ public void WriteManagedToJava ()
139139
GetM2JEntryLine (typeof (AbstractClassInvoker), "my/AbstractClass", offset, length) +
140140
GetM2JEntryLine (typeof (ActivityName), "activity/Name", offset, length) +
141141
GetM2JEntryLine (typeof (ApplicationName), "application/Name", offset, length) +
142-
GetM2JEntryLine (typeof (DefaultName.A.B), "md5f43cdfade412ae71b21bb70a5c2841ab/DefaultName_A_B", offset, length) +
143-
GetM2JEntryLine (typeof (DefaultName.A), "md5f43cdfade412ae71b21bb70a5c2841ab/DefaultName_A", offset, length) +
144-
GetM2JEntryLine (typeof (DefaultName.C.D), "md5f43cdfade412ae71b21bb70a5c2841ab/DefaultName_C_D", offset, length) +
145-
GetM2JEntryLine (typeof (DefaultName), "md5f43cdfade412ae71b21bb70a5c2841ab/DefaultName", offset, length) +
142+
GetM2JEntryLine (typeof (DefaultName.A.B), "crc64197ae30a36756915/DefaultName_A_B", offset, length) +
143+
GetM2JEntryLine (typeof (DefaultName.A), "crc64197ae30a36756915/DefaultName_A", offset, length) +
144+
GetM2JEntryLine (typeof (DefaultName.C.D), "crc64197ae30a36756915/DefaultName_C_D", offset, length) +
145+
GetM2JEntryLine (typeof (DefaultName), "crc64197ae30a36756915/DefaultName", offset, length) +
146146
GetM2JEntryLine (typeof (ExampleActivity), "my/ExampleActivity", offset, length) +
147147
GetM2JEntryLine (typeof (ExampleInstrumentation), "my/ExampleInstrumentation", offset, length) +
148-
GetM2JEntryLine (typeof (ExampleOuterClass.ExampleInnerClass), "md5f43cdfade412ae71b21bb70a5c2841ab/ExampleOuterClass$ExampleOuterClass_ExampleInnerClass", offset, length) +
149-
GetM2JEntryLine (typeof (ExampleOuterClass), "md5f43cdfade412ae71b21bb70a5c2841ab/ExampleOuterClass", offset, length) +
148+
GetM2JEntryLine (typeof (ExampleOuterClass.ExampleInnerClass), "crc64197ae30a36756915/ExampleOuterClass$ExampleOuterClass_ExampleInnerClass", offset, length) +
149+
GetM2JEntryLine (typeof (ExampleOuterClass), "crc64197ae30a36756915/ExampleOuterClass", offset, length) +
150150
GetM2JEntryLine (typeof (InstrumentationName), "instrumentation/Name", offset, length) +
151151
GetM2JEntryLine (typeof (NonStaticOuterClass.NonStaticInnerClass), "register/NonStaticOuterClass$NonStaticInnerClass", offset, length) +
152152
GetM2JEntryLine (typeof (NonStaticOuterClass), "register/NonStaticOuterClass", offset, length) +

src/Java.Interop.Tools.TypeNameMappings/Java.Interop.Tools.TypeNameMappings/JavaNativeTypeManager.cs

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,11 @@ namespace Java.Interop.Tools.TypeNameMappings
1919
public
2020
#endif
2121
enum PackageNamingPolicy {
22-
/// <summary>
23-
/// A hashed package name, currently defaults to LowercaseMD5
24-
/// </summary>
22+
[Obsolete ("No longer supported. Use PackageNamingPolicy.LowercaseCrc64 instead.", error: true)]
2523
LowercaseHash = 0,
2624
Lowercase = 1,
2725
LowercaseWithAssemblyName = 2,
26+
[Obsolete ("No longer supported. Use PackageNamingPolicy.LowercaseCrc64 instead.", error: true)]
2827
LowercaseMD5 = LowercaseHash,
2928
LowercaseCrc64 = 3,
3029
}
@@ -43,7 +42,7 @@ class JniTypeName
4342
#endif
4443
static class JavaNativeTypeManager {
4544

46-
public static PackageNamingPolicy PackageNamingPolicy { get; set; }
45+
public static PackageNamingPolicy PackageNamingPolicy { get; set; } = PackageNamingPolicy.LowercaseCrc64;
4746

4847
public static string ApplicationJavaClass { get; set; }
4948

@@ -203,10 +202,8 @@ public static string GetPackageName (Type type)
203202
case PackageNamingPolicy.LowercaseCrc64:
204203
using (var crc = new Crc64 ())
205204
return "crc64" + ToHash (type.Namespace + ":" + assemblyName, crc);
206-
case PackageNamingPolicy.LowercaseMD5:
207205
default:
208-
using (var md5 = MD5.Create ())
209-
return "md5" + ToHash (type.Namespace + ":" + assemblyName, md5);
206+
throw new NotSupportedException ($"PackageNamingPolicy.{PackageNamingPolicy} is no longer supported.");
210207
}
211208
}
212209

@@ -528,10 +525,8 @@ public static string GetPackageName (TypeDefinition type)
528525
case PackageNamingPolicy.LowercaseCrc64:
529526
using (var crc = new Crc64 ())
530527
return "crc64" + ToHash (type.Namespace + ":" + type.GetPartialAssemblyName (), crc);
531-
case PackageNamingPolicy.LowercaseMD5:
532528
default:
533-
using (var md5 = MD5.Create ())
534-
return "md5" + ToHash (type.Namespace + ":" + type.GetPartialAssemblyName (), md5);
529+
throw new NotSupportedException ($"PackageNamingPolicy.{PackageNamingPolicy} is no longer supported.");
535530
}
536531
}
537532
#endif

tools/generator/Tests/Integration-Tests/BaseGeneratorTest.cs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
using System;
2-
using System.Linq;
1+
using System;
2+
using System.Collections.Generic;
33
using System.IO;
4+
using System.Linq;
45
using System.Reflection;
5-
using System.Security.Cryptography;
6+
using Java.Interop.Tools.JavaCallableWrappers;
67
using NUnit.Framework;
78
using Xamarin.Android.Binder;
8-
using System.Collections.Generic;
99

1010
namespace generatortests
1111
{
@@ -93,10 +93,11 @@ protected bool FileCompare (string file1, string file2)
9393
byte[] f1 = ReadAllBytesIgnoringLineEndings (file1);
9494
byte[] f2 = ReadAllBytesIgnoringLineEndings (file2);
9595

96-
var hash = MD5.Create ();
97-
var f1hash = Convert.ToBase64String (hash.ComputeHash (f1));
98-
var f2hash = Convert.ToBase64String (hash.ComputeHash (f2));
99-
result = f1hash.Equals (f2hash);
96+
using (var hash = new Crc64 ()) {
97+
var f1hash = Convert.ToBase64String (hash.ComputeHash (f1));
98+
var f2hash = Convert.ToBase64String (hash.ComputeHash (f2));
99+
result = f1hash.Equals (f2hash);
100+
}
100101
}
101102

102103
return result;

tools/generator/Tests/generator-Tests.csproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,10 @@
8686
</ItemGroup>
8787
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
8888
<ItemGroup>
89+
<ProjectReference Include="..\..\..\src\Java.Interop.Tools.JavaCallableWrappers\Java.Interop.Tools.JavaCallableWrappers.csproj">
90+
<Project>{D18FCF91-8876-48A0-A693-2DC1E7D3D80A}</Project>
91+
<Name>Java.Interop.Tools.JavaCallableWrappers</Name>
92+
</ProjectReference>
8993
<ProjectReference Include="..\generator.csproj">
9094
<Project>{D14A1B5C-2060-4930-92BE-F7190256C735}</Project>
9195
<Name>generator</Name>

0 commit comments

Comments
 (0)